Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * ARC Cache Management
0004  *
0005  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
0006  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
0007  */
0008 
0009 #include <linux/module.h>
0010 #include <linux/mm.h>
0011 #include <linux/sched.h>
0012 #include <linux/cache.h>
0013 #include <linux/mmu_context.h>
0014 #include <linux/syscalls.h>
0015 #include <linux/uaccess.h>
0016 #include <linux/pagemap.h>
0017 #include <asm/cacheflush.h>
0018 #include <asm/cachectl.h>
0019 #include <asm/setup.h>
0020 
0021 #ifdef CONFIG_ISA_ARCV2
0022 #define USE_RGN_FLSH    1
0023 #endif
0024 
0025 static int l2_line_sz;
0026 static int ioc_exists;
0027 int slc_enable = 1, ioc_enable = 1;
0028 unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
0029 unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
0030 
0031 void (*_cache_line_loop_ic_fn)(phys_addr_t paddr, unsigned long vaddr,
0032                    unsigned long sz, const int op, const int full_page);
0033 
0034 void (*__dma_cache_wback_inv)(phys_addr_t start, unsigned long sz);
0035 void (*__dma_cache_inv)(phys_addr_t start, unsigned long sz);
0036 void (*__dma_cache_wback)(phys_addr_t start, unsigned long sz);
0037 
0038 char *arc_cache_mumbojumbo(int c, char *buf, int len)
0039 {
0040     int n = 0;
0041     struct cpuinfo_arc_cache *p;
0042 
0043 #define PR_CACHE(p, cfg, str)                       \
0044     if (!(p)->line_len)                     \
0045         n += scnprintf(buf + n, len - n, str"\t\t: N/A\n"); \
0046     else                                \
0047         n += scnprintf(buf + n, len - n,            \
0048             str"\t\t: %uK, %dway/set, %uB Line, %s%s%s\n",  \
0049             (p)->sz_k, (p)->assoc, (p)->line_len,       \
0050             (p)->vipt ? "VIPT" : "PIPT",            \
0051             (p)->alias ? " aliasing" : "",          \
0052             IS_USED_CFG(cfg));
0053 
0054     PR_CACHE(&cpuinfo_arc700[c].icache, CONFIG_ARC_HAS_ICACHE, "I-Cache");
0055     PR_CACHE(&cpuinfo_arc700[c].dcache, CONFIG_ARC_HAS_DCACHE, "D-Cache");
0056 
0057     p = &cpuinfo_arc700[c].slc;
0058     if (p->line_len)
0059         n += scnprintf(buf + n, len - n,
0060                    "SLC\t\t: %uK, %uB Line%s\n",
0061                    p->sz_k, p->line_len, IS_USED_RUN(slc_enable));
0062 
0063     n += scnprintf(buf + n, len - n, "Peripherals\t: %#lx%s%s\n",
0064                perip_base,
0065                IS_AVAIL3(ioc_exists, ioc_enable, ", IO-Coherency (per-device) "));
0066 
0067     return buf;
0068 }
0069 
0070 /*
0071  * Read the Cache Build Confuration Registers, Decode them and save into
0072  * the cpuinfo structure for later use.
0073  * No Validation done here, simply read/convert the BCRs
0074  */
0075 static void read_decode_cache_bcr_arcv2(int cpu)
0076 {
0077     struct cpuinfo_arc_cache *p_slc = &cpuinfo_arc700[cpu].slc;
0078     struct bcr_generic sbcr;
0079 
0080     struct bcr_slc_cfg {
0081 #ifdef CONFIG_CPU_BIG_ENDIAN
0082         unsigned int pad:24, way:2, lsz:2, sz:4;
0083 #else
0084         unsigned int sz:4, lsz:2, way:2, pad:24;
0085 #endif
0086     } slc_cfg;
0087 
0088     struct bcr_clust_cfg {
0089 #ifdef CONFIG_CPU_BIG_ENDIAN
0090         unsigned int pad:7, c:1, num_entries:8, num_cores:8, ver:8;
0091 #else
0092         unsigned int ver:8, num_cores:8, num_entries:8, c:1, pad:7;
0093 #endif
0094     } cbcr;
0095 
0096     struct bcr_volatile {
0097 #ifdef CONFIG_CPU_BIG_ENDIAN
0098         unsigned int start:4, limit:4, pad:22, order:1, disable:1;
0099 #else
0100         unsigned int disable:1, order:1, pad:22, limit:4, start:4;
0101 #endif
0102     } vol;
0103 
0104 
0105     READ_BCR(ARC_REG_SLC_BCR, sbcr);
0106     if (sbcr.ver) {
0107         READ_BCR(ARC_REG_SLC_CFG, slc_cfg);
0108         p_slc->sz_k = 128 << slc_cfg.sz;
0109         l2_line_sz = p_slc->line_len = (slc_cfg.lsz == 0) ? 128 : 64;
0110     }
0111 
0112     READ_BCR(ARC_REG_CLUSTER_BCR, cbcr);
0113     if (cbcr.c) {
0114         ioc_exists = 1;
0115 
0116         /*
0117          * As for today we don't support both IOC and ZONE_HIGHMEM enabled
0118          * simultaneously. This happens because as of today IOC aperture covers
0119          * only ZONE_NORMAL (low mem) and any dma transactions outside this
0120          * region won't be HW coherent.
0121          * If we want to use both IOC and ZONE_HIGHMEM we can use
0122          * bounce_buffer to handle dma transactions to HIGHMEM.
0123          * Also it is possible to modify dma_direct cache ops or increase IOC
0124          * aperture size if we are planning to use HIGHMEM without PAE.
0125          */
0126         if (IS_ENABLED(CONFIG_HIGHMEM) || is_pae40_enabled())
0127             ioc_enable = 0;
0128     } else {
0129         ioc_enable = 0;
0130     }
0131 
0132     /* HS 2.0 didn't have AUX_VOL */
0133     if (cpuinfo_arc700[cpu].core.family > 0x51) {
0134         READ_BCR(AUX_VOL, vol);
0135         perip_base = vol.start << 28;
0136         /* HS 3.0 has limit and strict-ordering fields */
0137         if (cpuinfo_arc700[cpu].core.family > 0x52)
0138             perip_end = (vol.limit << 28) - 1;
0139     }
0140 }
0141 
0142 void read_decode_cache_bcr(void)
0143 {
0144     struct cpuinfo_arc_cache *p_ic, *p_dc;
0145     unsigned int cpu = smp_processor_id();
0146     struct bcr_cache {
0147 #ifdef CONFIG_CPU_BIG_ENDIAN
0148         unsigned int pad:12, line_len:4, sz:4, config:4, ver:8;
0149 #else
0150         unsigned int ver:8, config:4, sz:4, line_len:4, pad:12;
0151 #endif
0152     } ibcr, dbcr;
0153 
0154     p_ic = &cpuinfo_arc700[cpu].icache;
0155     READ_BCR(ARC_REG_IC_BCR, ibcr);
0156 
0157     if (!ibcr.ver)
0158         goto dc_chk;
0159 
0160     if (ibcr.ver <= 3) {
0161         BUG_ON(ibcr.config != 3);
0162         p_ic->assoc = 2;        /* Fixed to 2w set assoc */
0163     } else if (ibcr.ver >= 4) {
0164         p_ic->assoc = 1 << ibcr.config; /* 1,2,4,8 */
0165     }
0166 
0167     p_ic->line_len = 8 << ibcr.line_len;
0168     p_ic->sz_k = 1 << (ibcr.sz - 1);
0169     p_ic->vipt = 1;
0170     p_ic->alias = p_ic->sz_k/p_ic->assoc/TO_KB(PAGE_SIZE) > 1;
0171 
0172 dc_chk:
0173     p_dc = &cpuinfo_arc700[cpu].dcache;
0174     READ_BCR(ARC_REG_DC_BCR, dbcr);
0175 
0176     if (!dbcr.ver)
0177         goto slc_chk;
0178 
0179     if (dbcr.ver <= 3) {
0180         BUG_ON(dbcr.config != 2);
0181         p_dc->assoc = 4;        /* Fixed to 4w set assoc */
0182         p_dc->vipt = 1;
0183         p_dc->alias = p_dc->sz_k/p_dc->assoc/TO_KB(PAGE_SIZE) > 1;
0184     } else if (dbcr.ver >= 4) {
0185         p_dc->assoc = 1 << dbcr.config; /* 1,2,4,8 */
0186         p_dc->vipt = 0;
0187         p_dc->alias = 0;        /* PIPT so can't VIPT alias */
0188     }
0189 
0190     p_dc->line_len = 16 << dbcr.line_len;
0191     p_dc->sz_k = 1 << (dbcr.sz - 1);
0192 
0193 slc_chk:
0194     if (is_isa_arcv2())
0195                 read_decode_cache_bcr_arcv2(cpu);
0196 }
0197 
0198 /*
0199  * Line Operation on {I,D}-Cache
0200  */
0201 
0202 #define OP_INV      0x1
0203 #define OP_FLUSH    0x2
0204 #define OP_FLUSH_N_INV  0x3
0205 #define OP_INV_IC   0x4
0206 
0207 /*
0208  * Cache Flush programming model
0209  *
0210  * ARC700 MMUv3 I$ and D$ are both VIPT and can potentially alias.
0211  * Programming model requires both paddr and vaddr irrespecive of aliasing
0212  * considerations:
0213  *  - vaddr in {I,D}C_IV?L
0214  *  - paddr in {I,D}C_PTAG
0215  *
0216  * In HS38x (MMUv4), D$ is PIPT, I$ is VIPT and can still alias.
0217  * Programming model is different for aliasing vs. non-aliasing I$
0218  *  - D$ / Non-aliasing I$: only paddr in {I,D}C_IV?L
0219  *  - Aliasing I$: same as ARC700 above (so MMUv3 routine used for MMUv4 I$)
0220  *
0221  *  - If PAE40 is enabled, independent of aliasing considerations, the higher
0222  *    bits needs to be written into PTAG_HI
0223  */
0224 
0225 static inline
0226 void __cache_line_loop_v3(phys_addr_t paddr, unsigned long vaddr,
0227               unsigned long sz, const int op, const int full_page)
0228 {
0229     unsigned int aux_cmd, aux_tag;
0230     int num_lines;
0231 
0232     if (op == OP_INV_IC) {
0233         aux_cmd = ARC_REG_IC_IVIL;
0234         aux_tag = ARC_REG_IC_PTAG;
0235     } else {
0236         aux_cmd = op & OP_INV ? ARC_REG_DC_IVDL : ARC_REG_DC_FLDL;
0237         aux_tag = ARC_REG_DC_PTAG;
0238     }
0239 
0240     /* Ensure we properly floor/ceil the non-line aligned/sized requests
0241      * and have @paddr - aligned to cache line and integral @num_lines.
0242      * This however can be avoided for page sized since:
0243      *  -@paddr will be cache-line aligned already (being page aligned)
0244      *  -@sz will be integral multiple of line size (being page sized).
0245      */
0246     if (!full_page) {
0247         sz += paddr & ~CACHE_LINE_MASK;
0248         paddr &= CACHE_LINE_MASK;
0249         vaddr &= CACHE_LINE_MASK;
0250     }
0251     num_lines = DIV_ROUND_UP(sz, L1_CACHE_BYTES);
0252 
0253     /*
0254      * MMUv3, cache ops require paddr in PTAG reg
0255      * if V-P const for loop, PTAG can be written once outside loop
0256      */
0257     if (full_page)
0258         write_aux_reg(aux_tag, paddr);
0259 
0260     /*
0261      * This is technically for MMU v4, using the MMU v3 programming model
0262      * Special work for HS38 aliasing I-cache configuration with PAE40
0263      *   - upper 8 bits of paddr need to be written into PTAG_HI
0264      *   - (and needs to be written before the lower 32 bits)
0265      * Note that PTAG_HI is hoisted outside the line loop
0266      */
0267     if (is_pae40_enabled() && op == OP_INV_IC)
0268         write_aux_reg(ARC_REG_IC_PTAG_HI, (u64)paddr >> 32);
0269 
0270     while (num_lines-- > 0) {
0271         if (!full_page) {
0272             write_aux_reg(aux_tag, paddr);
0273             paddr += L1_CACHE_BYTES;
0274         }
0275 
0276         write_aux_reg(aux_cmd, vaddr);
0277         vaddr += L1_CACHE_BYTES;
0278     }
0279 }
0280 
0281 #ifndef USE_RGN_FLSH
0282 
0283 /*
0284  */
0285 static inline
0286 void __cache_line_loop_v4(phys_addr_t paddr, unsigned long vaddr,
0287               unsigned long sz, const int op, const int full_page)
0288 {
0289     unsigned int aux_cmd;
0290     int num_lines;
0291 
0292     if (op == OP_INV_IC) {
0293         aux_cmd = ARC_REG_IC_IVIL;
0294     } else {
0295         /* d$ cmd: INV (discard or wback-n-discard) OR FLUSH (wback) */
0296         aux_cmd = op & OP_INV ? ARC_REG_DC_IVDL : ARC_REG_DC_FLDL;
0297     }
0298 
0299     /* Ensure we properly floor/ceil the non-line aligned/sized requests
0300      * and have @paddr - aligned to cache line and integral @num_lines.
0301      * This however can be avoided for page sized since:
0302      *  -@paddr will be cache-line aligned already (being page aligned)
0303      *  -@sz will be integral multiple of line size (being page sized).
0304      */
0305     if (!full_page) {
0306         sz += paddr & ~CACHE_LINE_MASK;
0307         paddr &= CACHE_LINE_MASK;
0308     }
0309 
0310     num_lines = DIV_ROUND_UP(sz, L1_CACHE_BYTES);
0311 
0312     /*
0313      * For HS38 PAE40 configuration
0314      *   - upper 8 bits of paddr need to be written into PTAG_HI
0315      *   - (and needs to be written before the lower 32 bits)
0316      */
0317     if (is_pae40_enabled()) {
0318         if (op == OP_INV_IC)
0319             /*
0320              * Non aliasing I-cache in HS38,
0321              * aliasing I-cache handled in __cache_line_loop_v3()
0322              */
0323             write_aux_reg(ARC_REG_IC_PTAG_HI, (u64)paddr >> 32);
0324         else
0325             write_aux_reg(ARC_REG_DC_PTAG_HI, (u64)paddr >> 32);
0326     }
0327 
0328     while (num_lines-- > 0) {
0329         write_aux_reg(aux_cmd, paddr);
0330         paddr += L1_CACHE_BYTES;
0331     }
0332 }
0333 
0334 #else
0335 
0336 /*
0337  * optimized flush operation which takes a region as opposed to iterating per line
0338  */
0339 static inline
0340 void __cache_line_loop_v4(phys_addr_t paddr, unsigned long vaddr,
0341               unsigned long sz, const int op, const int full_page)
0342 {
0343     unsigned int s, e;
0344 
0345     /* Only for Non aliasing I-cache in HS38 */
0346     if (op == OP_INV_IC) {
0347         s = ARC_REG_IC_IVIR;
0348         e = ARC_REG_IC_ENDR;
0349     } else {
0350         s = ARC_REG_DC_STARTR;
0351         e = ARC_REG_DC_ENDR;
0352     }
0353 
0354     if (!full_page) {
0355         /* for any leading gap between @paddr and start of cache line */
0356         sz += paddr & ~CACHE_LINE_MASK;
0357         paddr &= CACHE_LINE_MASK;
0358 
0359         /*
0360          *  account for any trailing gap to end of cache line
0361          *  this is equivalent to DIV_ROUND_UP() in line ops above
0362          */
0363         sz += L1_CACHE_BYTES - 1;
0364     }
0365 
0366     if (is_pae40_enabled()) {
0367         /* TBD: check if crossing 4TB boundary */
0368         if (op == OP_INV_IC)
0369             write_aux_reg(ARC_REG_IC_PTAG_HI, (u64)paddr >> 32);
0370         else
0371             write_aux_reg(ARC_REG_DC_PTAG_HI, (u64)paddr >> 32);
0372     }
0373 
0374     /* ENDR needs to be set ahead of START */
0375     write_aux_reg(e, paddr + sz);   /* ENDR is exclusive */
0376     write_aux_reg(s, paddr);
0377 
0378     /* caller waits on DC_CTRL.FS */
0379 }
0380 
0381 #endif
0382 
0383 #ifdef CONFIG_ARC_MMU_V3
0384 #define __cache_line_loop   __cache_line_loop_v3
0385 #else
0386 #define __cache_line_loop   __cache_line_loop_v4
0387 #endif
0388 
0389 #ifdef CONFIG_ARC_HAS_DCACHE
0390 
0391 /***************************************************************
0392  * Machine specific helpers for Entire D-Cache or Per Line ops
0393  */
0394 
0395 #ifndef USE_RGN_FLSH
0396 /*
0397  * this version avoids extra read/write of DC_CTRL for flush or invalid ops
0398  * in the non region flush regime (such as for ARCompact)
0399  */
0400 static inline void __before_dc_op(const int op)
0401 {
0402     if (op == OP_FLUSH_N_INV) {
0403         /* Dcache provides 2 cmd: FLUSH or INV
0404          * INV in turn has sub-modes: DISCARD or FLUSH-BEFORE
0405          * flush-n-inv is achieved by INV cmd but with IM=1
0406          * So toggle INV sub-mode depending on op request and default
0407          */
0408         const unsigned int ctl = ARC_REG_DC_CTRL;
0409         write_aux_reg(ctl, read_aux_reg(ctl) | DC_CTRL_INV_MODE_FLUSH);
0410     }
0411 }
0412 
0413 #else
0414 
0415 static inline void __before_dc_op(const int op)
0416 {
0417     const unsigned int ctl = ARC_REG_DC_CTRL;
0418     unsigned int val = read_aux_reg(ctl);
0419 
0420     if (op == OP_FLUSH_N_INV) {
0421         val |= DC_CTRL_INV_MODE_FLUSH;
0422     }
0423 
0424     if (op != OP_INV_IC) {
0425         /*
0426          * Flush / Invalidate is provided by DC_CTRL.RNG_OP 0 or 1
0427          * combined Flush-n-invalidate uses DC_CTRL.IM = 1 set above
0428          */
0429         val &= ~DC_CTRL_RGN_OP_MSK;
0430         if (op & OP_INV)
0431             val |= DC_CTRL_RGN_OP_INV;
0432     }
0433     write_aux_reg(ctl, val);
0434 }
0435 
0436 #endif
0437 
0438 
0439 static inline void __after_dc_op(const int op)
0440 {
0441     if (op & OP_FLUSH) {
0442         const unsigned int ctl = ARC_REG_DC_CTRL;
0443         unsigned int reg;
0444 
0445         /* flush / flush-n-inv both wait */
0446         while ((reg = read_aux_reg(ctl)) & DC_CTRL_FLUSH_STATUS)
0447             ;
0448 
0449         /* Switch back to default Invalidate mode */
0450         if (op == OP_FLUSH_N_INV)
0451             write_aux_reg(ctl, reg & ~DC_CTRL_INV_MODE_FLUSH);
0452     }
0453 }
0454 
0455 /*
0456  * Operation on Entire D-Cache
0457  * @op = {OP_INV, OP_FLUSH, OP_FLUSH_N_INV}
0458  * Note that constant propagation ensures all the checks are gone
0459  * in generated code
0460  */
0461 static inline void __dc_entire_op(const int op)
0462 {
0463     int aux;
0464 
0465     __before_dc_op(op);
0466 
0467     if (op & OP_INV)    /* Inv or flush-n-inv use same cmd reg */
0468         aux = ARC_REG_DC_IVDC;
0469     else
0470         aux = ARC_REG_DC_FLSH;
0471 
0472     write_aux_reg(aux, 0x1);
0473 
0474     __after_dc_op(op);
0475 }
0476 
0477 static inline void __dc_disable(void)
0478 {
0479     const int r = ARC_REG_DC_CTRL;
0480 
0481     __dc_entire_op(OP_FLUSH_N_INV);
0482     write_aux_reg(r, read_aux_reg(r) | DC_CTRL_DIS);
0483 }
0484 
0485 static void __dc_enable(void)
0486 {
0487     const int r = ARC_REG_DC_CTRL;
0488 
0489     write_aux_reg(r, read_aux_reg(r) & ~DC_CTRL_DIS);
0490 }
0491 
0492 /* For kernel mappings cache operation: index is same as paddr */
0493 #define __dc_line_op_k(p, sz, op)   __dc_line_op(p, p, sz, op)
0494 
0495 /*
0496  * D-Cache Line ops: Per Line INV (discard or wback+discard) or FLUSH (wback)
0497  */
0498 static inline void __dc_line_op(phys_addr_t paddr, unsigned long vaddr,
0499                 unsigned long sz, const int op)
0500 {
0501     const int full_page = __builtin_constant_p(sz) && sz == PAGE_SIZE;
0502     unsigned long flags;
0503 
0504     local_irq_save(flags);
0505 
0506     __before_dc_op(op);
0507 
0508     __cache_line_loop(paddr, vaddr, sz, op, full_page);
0509 
0510     __after_dc_op(op);
0511 
0512     local_irq_restore(flags);
0513 }
0514 
0515 #else
0516 
0517 #define __dc_entire_op(op)
0518 #define __dc_disable()
0519 #define __dc_enable()
0520 #define __dc_line_op(paddr, vaddr, sz, op)
0521 #define __dc_line_op_k(paddr, sz, op)
0522 
0523 #endif /* CONFIG_ARC_HAS_DCACHE */
0524 
0525 #ifdef CONFIG_ARC_HAS_ICACHE
0526 
0527 static inline void __ic_entire_inv(void)
0528 {
0529     write_aux_reg(ARC_REG_IC_IVIC, 1);
0530     read_aux_reg(ARC_REG_IC_CTRL);  /* blocks */
0531 }
0532 
0533 static inline void
0534 __ic_line_inv_vaddr_local(phys_addr_t paddr, unsigned long vaddr,
0535               unsigned long sz)
0536 {
0537     const int full_page = __builtin_constant_p(sz) && sz == PAGE_SIZE;
0538     unsigned long flags;
0539 
0540     local_irq_save(flags);
0541     (*_cache_line_loop_ic_fn)(paddr, vaddr, sz, OP_INV_IC, full_page);
0542     local_irq_restore(flags);
0543 }
0544 
0545 #ifndef CONFIG_SMP
0546 
0547 #define __ic_line_inv_vaddr(p, v, s)    __ic_line_inv_vaddr_local(p, v, s)
0548 
0549 #else
0550 
0551 struct ic_inv_args {
0552     phys_addr_t paddr, vaddr;
0553     int sz;
0554 };
0555 
0556 static void __ic_line_inv_vaddr_helper(void *info)
0557 {
0558         struct ic_inv_args *ic_inv = info;
0559 
0560         __ic_line_inv_vaddr_local(ic_inv->paddr, ic_inv->vaddr, ic_inv->sz);
0561 }
0562 
0563 static void __ic_line_inv_vaddr(phys_addr_t paddr, unsigned long vaddr,
0564                 unsigned long sz)
0565 {
0566     struct ic_inv_args ic_inv = {
0567         .paddr = paddr,
0568         .vaddr = vaddr,
0569         .sz    = sz
0570     };
0571 
0572     on_each_cpu(__ic_line_inv_vaddr_helper, &ic_inv, 1);
0573 }
0574 
0575 #endif  /* CONFIG_SMP */
0576 
0577 #else   /* !CONFIG_ARC_HAS_ICACHE */
0578 
0579 #define __ic_entire_inv()
0580 #define __ic_line_inv_vaddr(pstart, vstart, sz)
0581 
0582 #endif /* CONFIG_ARC_HAS_ICACHE */
0583 
0584 noinline void slc_op_rgn(phys_addr_t paddr, unsigned long sz, const int op)
0585 {
0586 #ifdef CONFIG_ISA_ARCV2
0587     /*
0588      * SLC is shared between all cores and concurrent aux operations from
0589      * multiple cores need to be serialized using a spinlock
0590      * A concurrent operation can be silently ignored and/or the old/new
0591      * operation can remain incomplete forever (lockup in SLC_CTRL_BUSY loop
0592      * below)
0593      */
0594     static DEFINE_SPINLOCK(lock);
0595     unsigned long flags;
0596     unsigned int ctrl;
0597     phys_addr_t end;
0598 
0599     spin_lock_irqsave(&lock, flags);
0600 
0601     /*
0602      * The Region Flush operation is specified by CTRL.RGN_OP[11..9]
0603      *  - b'000 (default) is Flush,
0604      *  - b'001 is Invalidate if CTRL.IM == 0
0605      *  - b'001 is Flush-n-Invalidate if CTRL.IM == 1
0606      */
0607     ctrl = read_aux_reg(ARC_REG_SLC_CTRL);
0608 
0609     /* Don't rely on default value of IM bit */
0610     if (!(op & OP_FLUSH))       /* i.e. OP_INV */
0611         ctrl &= ~SLC_CTRL_IM;   /* clear IM: Disable flush before Inv */
0612     else
0613         ctrl |= SLC_CTRL_IM;
0614 
0615     if (op & OP_INV)
0616         ctrl |= SLC_CTRL_RGN_OP_INV;    /* Inv or flush-n-inv */
0617     else
0618         ctrl &= ~SLC_CTRL_RGN_OP_INV;
0619 
0620     write_aux_reg(ARC_REG_SLC_CTRL, ctrl);
0621 
0622     /*
0623      * Lower bits are ignored, no need to clip
0624      * END needs to be setup before START (latter triggers the operation)
0625      * END can't be same as START, so add (l2_line_sz - 1) to sz
0626      */
0627     end = paddr + sz + l2_line_sz - 1;
0628     if (is_pae40_enabled())
0629         write_aux_reg(ARC_REG_SLC_RGN_END1, upper_32_bits(end));
0630 
0631     write_aux_reg(ARC_REG_SLC_RGN_END, lower_32_bits(end));
0632 
0633     if (is_pae40_enabled())
0634         write_aux_reg(ARC_REG_SLC_RGN_START1, upper_32_bits(paddr));
0635 
0636     write_aux_reg(ARC_REG_SLC_RGN_START, lower_32_bits(paddr));
0637 
0638     /* Make sure "busy" bit reports correct stataus, see STAR 9001165532 */
0639     read_aux_reg(ARC_REG_SLC_CTRL);
0640 
0641     while (read_aux_reg(ARC_REG_SLC_CTRL) & SLC_CTRL_BUSY);
0642 
0643     spin_unlock_irqrestore(&lock, flags);
0644 #endif
0645 }
0646 
0647 noinline void slc_op_line(phys_addr_t paddr, unsigned long sz, const int op)
0648 {
0649 #ifdef CONFIG_ISA_ARCV2
0650     /*
0651      * SLC is shared between all cores and concurrent aux operations from
0652      * multiple cores need to be serialized using a spinlock
0653      * A concurrent operation can be silently ignored and/or the old/new
0654      * operation can remain incomplete forever (lockup in SLC_CTRL_BUSY loop
0655      * below)
0656      */
0657     static DEFINE_SPINLOCK(lock);
0658 
0659     const unsigned long SLC_LINE_MASK = ~(l2_line_sz - 1);
0660     unsigned int ctrl, cmd;
0661     unsigned long flags;
0662     int num_lines;
0663 
0664     spin_lock_irqsave(&lock, flags);
0665 
0666     ctrl = read_aux_reg(ARC_REG_SLC_CTRL);
0667 
0668     /* Don't rely on default value of IM bit */
0669     if (!(op & OP_FLUSH))       /* i.e. OP_INV */
0670         ctrl &= ~SLC_CTRL_IM;   /* clear IM: Disable flush before Inv */
0671     else
0672         ctrl |= SLC_CTRL_IM;
0673 
0674     write_aux_reg(ARC_REG_SLC_CTRL, ctrl);
0675 
0676     cmd = op & OP_INV ? ARC_AUX_SLC_IVDL : ARC_AUX_SLC_FLDL;
0677 
0678     sz += paddr & ~SLC_LINE_MASK;
0679     paddr &= SLC_LINE_MASK;
0680 
0681     num_lines = DIV_ROUND_UP(sz, l2_line_sz);
0682 
0683     while (num_lines-- > 0) {
0684         write_aux_reg(cmd, paddr);
0685         paddr += l2_line_sz;
0686     }
0687 
0688     /* Make sure "busy" bit reports correct stataus, see STAR 9001165532 */
0689     read_aux_reg(ARC_REG_SLC_CTRL);
0690 
0691     while (read_aux_reg(ARC_REG_SLC_CTRL) & SLC_CTRL_BUSY);
0692 
0693     spin_unlock_irqrestore(&lock, flags);
0694 #endif
0695 }
0696 
0697 #define slc_op(paddr, sz, op)   slc_op_rgn(paddr, sz, op)
0698 
0699 noinline static void slc_entire_op(const int op)
0700 {
0701     unsigned int ctrl, r = ARC_REG_SLC_CTRL;
0702 
0703     ctrl = read_aux_reg(r);
0704 
0705     if (!(op & OP_FLUSH))       /* i.e. OP_INV */
0706         ctrl &= ~SLC_CTRL_IM;   /* clear IM: Disable flush before Inv */
0707     else
0708         ctrl |= SLC_CTRL_IM;
0709 
0710     write_aux_reg(r, ctrl);
0711 
0712     if (op & OP_INV)    /* Inv or flush-n-inv use same cmd reg */
0713         write_aux_reg(ARC_REG_SLC_INVALIDATE, 0x1);
0714     else
0715         write_aux_reg(ARC_REG_SLC_FLUSH, 0x1);
0716 
0717     /* Make sure "busy" bit reports correct stataus, see STAR 9001165532 */
0718     read_aux_reg(r);
0719 
0720     /* Important to wait for flush to complete */
0721     while (read_aux_reg(r) & SLC_CTRL_BUSY);
0722 }
0723 
0724 static inline void arc_slc_disable(void)
0725 {
0726     const int r = ARC_REG_SLC_CTRL;
0727 
0728     slc_entire_op(OP_FLUSH_N_INV);
0729     write_aux_reg(r, read_aux_reg(r) | SLC_CTRL_DIS);
0730 }
0731 
0732 static inline void arc_slc_enable(void)
0733 {
0734     const int r = ARC_REG_SLC_CTRL;
0735 
0736     write_aux_reg(r, read_aux_reg(r) & ~SLC_CTRL_DIS);
0737 }
0738 
0739 /***********************************************************
0740  * Exported APIs
0741  */
0742 
0743 /*
0744  * Handle cache congruency of kernel and userspace mappings of page when kernel
0745  * writes-to/reads-from
0746  *
0747  * The idea is to defer flushing of kernel mapping after a WRITE, possible if:
0748  *  -dcache is NOT aliasing, hence any U/K-mappings of page are congruent
0749  *  -U-mapping doesn't exist yet for page (finalised in update_mmu_cache)
0750  *  -In SMP, if hardware caches are coherent
0751  *
0752  * There's a corollary case, where kernel READs from a userspace mapped page.
0753  * If the U-mapping is not congruent to to K-mapping, former needs flushing.
0754  */
0755 void flush_dcache_page(struct page *page)
0756 {
0757     struct address_space *mapping;
0758 
0759     if (!cache_is_vipt_aliasing()) {
0760         clear_bit(PG_dc_clean, &page->flags);
0761         return;
0762     }
0763 
0764     /* don't handle anon pages here */
0765     mapping = page_mapping_file(page);
0766     if (!mapping)
0767         return;
0768 
0769     /*
0770      * pagecache page, file not yet mapped to userspace
0771      * Make a note that K-mapping is dirty
0772      */
0773     if (!mapping_mapped(mapping)) {
0774         clear_bit(PG_dc_clean, &page->flags);
0775     } else if (page_mapcount(page)) {
0776 
0777         /* kernel reading from page with U-mapping */
0778         phys_addr_t paddr = (unsigned long)page_address(page);
0779         unsigned long vaddr = page->index << PAGE_SHIFT;
0780 
0781         if (addr_not_cache_congruent(paddr, vaddr))
0782             __flush_dcache_page(paddr, vaddr);
0783     }
0784 }
0785 EXPORT_SYMBOL(flush_dcache_page);
0786 
0787 /*
0788  * DMA ops for systems with L1 cache only
0789  * Make memory coherent with L1 cache by flushing/invalidating L1 lines
0790  */
0791 static void __dma_cache_wback_inv_l1(phys_addr_t start, unsigned long sz)
0792 {
0793     __dc_line_op_k(start, sz, OP_FLUSH_N_INV);
0794 }
0795 
0796 static void __dma_cache_inv_l1(phys_addr_t start, unsigned long sz)
0797 {
0798     __dc_line_op_k(start, sz, OP_INV);
0799 }
0800 
0801 static void __dma_cache_wback_l1(phys_addr_t start, unsigned long sz)
0802 {
0803     __dc_line_op_k(start, sz, OP_FLUSH);
0804 }
0805 
0806 /*
0807  * DMA ops for systems with both L1 and L2 caches, but without IOC
0808  * Both L1 and L2 lines need to be explicitly flushed/invalidated
0809  */
0810 static void __dma_cache_wback_inv_slc(phys_addr_t start, unsigned long sz)
0811 {
0812     __dc_line_op_k(start, sz, OP_FLUSH_N_INV);
0813     slc_op(start, sz, OP_FLUSH_N_INV);
0814 }
0815 
0816 static void __dma_cache_inv_slc(phys_addr_t start, unsigned long sz)
0817 {
0818     __dc_line_op_k(start, sz, OP_INV);
0819     slc_op(start, sz, OP_INV);
0820 }
0821 
0822 static void __dma_cache_wback_slc(phys_addr_t start, unsigned long sz)
0823 {
0824     __dc_line_op_k(start, sz, OP_FLUSH);
0825     slc_op(start, sz, OP_FLUSH);
0826 }
0827 
0828 /*
0829  * Exported DMA API
0830  */
0831 void dma_cache_wback_inv(phys_addr_t start, unsigned long sz)
0832 {
0833     __dma_cache_wback_inv(start, sz);
0834 }
0835 EXPORT_SYMBOL(dma_cache_wback_inv);
0836 
0837 void dma_cache_inv(phys_addr_t start, unsigned long sz)
0838 {
0839     __dma_cache_inv(start, sz);
0840 }
0841 EXPORT_SYMBOL(dma_cache_inv);
0842 
0843 void dma_cache_wback(phys_addr_t start, unsigned long sz)
0844 {
0845     __dma_cache_wback(start, sz);
0846 }
0847 EXPORT_SYMBOL(dma_cache_wback);
0848 
0849 /*
0850  * This is API for making I/D Caches consistent when modifying
0851  * kernel code (loadable modules, kprobes, kgdb...)
0852  * This is called on insmod, with kernel virtual address for CODE of
0853  * the module. ARC cache maintenance ops require PHY address thus we
0854  * need to convert vmalloc addr to PHY addr
0855  */
0856 void flush_icache_range(unsigned long kstart, unsigned long kend)
0857 {
0858     unsigned int tot_sz;
0859 
0860     WARN(kstart < TASK_SIZE, "%s() can't handle user vaddr", __func__);
0861 
0862     /* Shortcut for bigger flush ranges.
0863      * Here we don't care if this was kernel virtual or phy addr
0864      */
0865     tot_sz = kend - kstart;
0866     if (tot_sz > PAGE_SIZE) {
0867         flush_cache_all();
0868         return;
0869     }
0870 
0871     /* Case: Kernel Phy addr (0x8000_0000 onwards) */
0872     if (likely(kstart > PAGE_OFFSET)) {
0873         /*
0874          * The 2nd arg despite being paddr will be used to index icache
0875          * This is OK since no alternate virtual mappings will exist
0876          * given the callers for this case: kprobe/kgdb in built-in
0877          * kernel code only.
0878          */
0879         __sync_icache_dcache(kstart, kstart, kend - kstart);
0880         return;
0881     }
0882 
0883     /*
0884      * Case: Kernel Vaddr (0x7000_0000 to 0x7fff_ffff)
0885      * (1) ARC Cache Maintenance ops only take Phy addr, hence special
0886      *     handling of kernel vaddr.
0887      *
0888      * (2) Despite @tot_sz being < PAGE_SIZE (bigger cases handled already),
0889      *     it still needs to handle  a 2 page scenario, where the range
0890      *     straddles across 2 virtual pages and hence need for loop
0891      */
0892     while (tot_sz > 0) {
0893         unsigned int off, sz;
0894         unsigned long phy, pfn;
0895 
0896         off = kstart % PAGE_SIZE;
0897         pfn = vmalloc_to_pfn((void *)kstart);
0898         phy = (pfn << PAGE_SHIFT) + off;
0899         sz = min_t(unsigned int, tot_sz, PAGE_SIZE - off);
0900         __sync_icache_dcache(phy, kstart, sz);
0901         kstart += sz;
0902         tot_sz -= sz;
0903     }
0904 }
0905 EXPORT_SYMBOL(flush_icache_range);
0906 
0907 /*
0908  * General purpose helper to make I and D cache lines consistent.
0909  * @paddr is phy addr of region
0910  * @vaddr is typically user vaddr (breakpoint) or kernel vaddr (vmalloc)
0911  *    However in one instance, when called by kprobe (for a breakpt in
0912  *    builtin kernel code) @vaddr will be paddr only, meaning CDU operation will
0913  *    use a paddr to index the cache (despite VIPT). This is fine since since a
0914  *    builtin kernel page will not have any virtual mappings.
0915  *    kprobe on loadable module will be kernel vaddr.
0916  */
0917 void __sync_icache_dcache(phys_addr_t paddr, unsigned long vaddr, int len)
0918 {
0919     __dc_line_op(paddr, vaddr, len, OP_FLUSH_N_INV);
0920     __ic_line_inv_vaddr(paddr, vaddr, len);
0921 }
0922 
0923 /* wrapper to compile time eliminate alignment checks in flush loop */
0924 void __inv_icache_page(phys_addr_t paddr, unsigned long vaddr)
0925 {
0926     __ic_line_inv_vaddr(paddr, vaddr, PAGE_SIZE);
0927 }
0928 
0929 /*
0930  * wrapper to clearout kernel or userspace mappings of a page
0931  * For kernel mappings @vaddr == @paddr
0932  */
0933 void __flush_dcache_page(phys_addr_t paddr, unsigned long vaddr)
0934 {
0935     __dc_line_op(paddr, vaddr & PAGE_MASK, PAGE_SIZE, OP_FLUSH_N_INV);
0936 }
0937 
0938 noinline void flush_cache_all(void)
0939 {
0940     unsigned long flags;
0941 
0942     local_irq_save(flags);
0943 
0944     __ic_entire_inv();
0945     __dc_entire_op(OP_FLUSH_N_INV);
0946 
0947     local_irq_restore(flags);
0948 
0949 }
0950 
0951 #ifdef CONFIG_ARC_CACHE_VIPT_ALIASING
0952 
0953 void flush_cache_mm(struct mm_struct *mm)
0954 {
0955     flush_cache_all();
0956 }
0957 
0958 void flush_cache_page(struct vm_area_struct *vma, unsigned long u_vaddr,
0959               unsigned long pfn)
0960 {
0961     phys_addr_t paddr = pfn << PAGE_SHIFT;
0962 
0963     u_vaddr &= PAGE_MASK;
0964 
0965     __flush_dcache_page(paddr, u_vaddr);
0966 
0967     if (vma->vm_flags & VM_EXEC)
0968         __inv_icache_page(paddr, u_vaddr);
0969 }
0970 
0971 void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
0972                unsigned long end)
0973 {
0974     flush_cache_all();
0975 }
0976 
0977 void flush_anon_page(struct vm_area_struct *vma, struct page *page,
0978              unsigned long u_vaddr)
0979 {
0980     /* TBD: do we really need to clear the kernel mapping */
0981     __flush_dcache_page((phys_addr_t)page_address(page), u_vaddr);
0982     __flush_dcache_page((phys_addr_t)page_address(page),
0983                 (phys_addr_t)page_address(page));
0984 
0985 }
0986 
0987 #endif
0988 
0989 void copy_user_highpage(struct page *to, struct page *from,
0990     unsigned long u_vaddr, struct vm_area_struct *vma)
0991 {
0992     void *kfrom = kmap_atomic(from);
0993     void *kto = kmap_atomic(to);
0994     int clean_src_k_mappings = 0;
0995 
0996     /*
0997      * If SRC page was already mapped in userspace AND it's U-mapping is
0998      * not congruent with K-mapping, sync former to physical page so that
0999      * K-mapping in memcpy below, sees the right data
1000      *
1001      * Note that while @u_vaddr refers to DST page's userspace vaddr, it is
1002      * equally valid for SRC page as well
1003      *
1004      * For !VIPT cache, all of this gets compiled out as
1005      * addr_not_cache_congruent() is 0
1006      */
1007     if (page_mapcount(from) && addr_not_cache_congruent(kfrom, u_vaddr)) {
1008         __flush_dcache_page((unsigned long)kfrom, u_vaddr);
1009         clean_src_k_mappings = 1;
1010     }
1011 
1012     copy_page(kto, kfrom);
1013 
1014     /*
1015      * Mark DST page K-mapping as dirty for a later finalization by
1016      * update_mmu_cache(). Although the finalization could have been done
1017      * here as well (given that both vaddr/paddr are available).
1018      * But update_mmu_cache() already has code to do that for other
1019      * non copied user pages (e.g. read faults which wire in pagecache page
1020      * directly).
1021      */
1022     clear_bit(PG_dc_clean, &to->flags);
1023 
1024     /*
1025      * if SRC was already usermapped and non-congruent to kernel mapping
1026      * sync the kernel mapping back to physical page
1027      */
1028     if (clean_src_k_mappings) {
1029         __flush_dcache_page((unsigned long)kfrom, (unsigned long)kfrom);
1030         set_bit(PG_dc_clean, &from->flags);
1031     } else {
1032         clear_bit(PG_dc_clean, &from->flags);
1033     }
1034 
1035     kunmap_atomic(kto);
1036     kunmap_atomic(kfrom);
1037 }
1038 
1039 void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)
1040 {
1041     clear_page(to);
1042     clear_bit(PG_dc_clean, &page->flags);
1043 }
1044 EXPORT_SYMBOL(clear_user_page);
1045 
1046 /**********************************************************************
1047  * Explicit Cache flush request from user space via syscall
1048  * Needed for JITs which generate code on the fly
1049  */
1050 SYSCALL_DEFINE3(cacheflush, uint32_t, start, uint32_t, sz, uint32_t, flags)
1051 {
1052     /* TBD: optimize this */
1053     flush_cache_all();
1054     return 0;
1055 }
1056 
1057 /*
1058  * IO-Coherency (IOC) setup rules:
1059  *
1060  * 1. Needs to be at system level, so only once by Master core
1061  *    Non-Masters need not be accessing caches at that time
1062  *    - They are either HALT_ON_RESET and kick started much later or
1063  *    - if run on reset, need to ensure that arc_platform_smp_wait_to_boot()
1064  *      doesn't perturb caches or coherency unit
1065  *
1066  * 2. caches (L1 and SLC) need to be purged (flush+inv) before setting up IOC,
1067  *    otherwise any straggler data might behave strangely post IOC enabling
1068  *
1069  * 3. All Caches need to be disabled when setting up IOC to elide any in-flight
1070  *    Coherency transactions
1071  */
1072 noinline void __init arc_ioc_setup(void)
1073 {
1074     unsigned int ioc_base, mem_sz;
1075 
1076     /*
1077      * If IOC was already enabled (due to bootloader) it technically needs to
1078      * be reconfigured with aperture base,size corresponding to Linux memory map
1079      * which will certainly be different than uboot's. But disabling and
1080      * reenabling IOC when DMA might be potentially active is tricky business.
1081      * To avoid random memory issues later, just panic here and ask user to
1082      * upgrade bootloader to one which doesn't enable IOC
1083      */
1084     if (read_aux_reg(ARC_REG_IO_COH_ENABLE) & ARC_IO_COH_ENABLE_BIT)
1085         panic("IOC already enabled, please upgrade bootloader!\n");
1086 
1087     if (!ioc_enable)
1088         return;
1089 
1090     /* Flush + invalidate + disable L1 dcache */
1091     __dc_disable();
1092 
1093     /* Flush + invalidate SLC */
1094     if (read_aux_reg(ARC_REG_SLC_BCR))
1095         slc_entire_op(OP_FLUSH_N_INV);
1096 
1097     /*
1098      * currently IOC Aperture covers entire DDR
1099      * TBD: fix for PGU + 1GB of low mem
1100      * TBD: fix for PAE
1101      */
1102     mem_sz = arc_get_mem_sz();
1103 
1104     if (!is_power_of_2(mem_sz) || mem_sz < 4096)
1105         panic("IOC Aperture size must be power of 2 larger than 4KB");
1106 
1107     /*
1108      * IOC Aperture size decoded as 2 ^ (SIZE + 2) KB,
1109      * so setting 0x11 implies 512MB, 0x12 implies 1GB...
1110      */
1111     write_aux_reg(ARC_REG_IO_COH_AP0_SIZE, order_base_2(mem_sz >> 10) - 2);
1112 
1113     /* for now assume kernel base is start of IOC aperture */
1114     ioc_base = CONFIG_LINUX_RAM_BASE;
1115 
1116     if (ioc_base % mem_sz != 0)
1117         panic("IOC Aperture start must be aligned to the size of the aperture");
1118 
1119     write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12);
1120     write_aux_reg(ARC_REG_IO_COH_PARTIAL, ARC_IO_COH_PARTIAL_BIT);
1121     write_aux_reg(ARC_REG_IO_COH_ENABLE, ARC_IO_COH_ENABLE_BIT);
1122 
1123     /* Re-enable L1 dcache */
1124     __dc_enable();
1125 }
1126 
1127 /*
1128  * Cache related boot time checks/setups only needed on master CPU:
1129  *  - Geometry checks (kernel build and hardware agree: e.g. L1_CACHE_BYTES)
1130  *    Assume SMP only, so all cores will have same cache config. A check on
1131  *    one core suffices for all
1132  *  - IOC setup / dma callbacks only need to be done once
1133  */
1134 void __init arc_cache_init_master(void)
1135 {
1136     unsigned int __maybe_unused cpu = smp_processor_id();
1137 
1138     if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) {
1139         struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache;
1140 
1141         if (!ic->line_len)
1142             panic("cache support enabled but non-existent cache\n");
1143 
1144         if (ic->line_len != L1_CACHE_BYTES)
1145             panic("ICache line [%d] != kernel Config [%d]",
1146                   ic->line_len, L1_CACHE_BYTES);
1147 
1148         /*
1149          * In MMU v4 (HS38x) the aliasing icache config uses IVIL/PTAG
1150          * pair to provide vaddr/paddr respectively, just as in MMU v3
1151          */
1152         if (is_isa_arcv2() && ic->alias)
1153             _cache_line_loop_ic_fn = __cache_line_loop_v3;
1154         else
1155             _cache_line_loop_ic_fn = __cache_line_loop;
1156     }
1157 
1158     if (IS_ENABLED(CONFIG_ARC_HAS_DCACHE)) {
1159         struct cpuinfo_arc_cache *dc = &cpuinfo_arc700[cpu].dcache;
1160 
1161         if (!dc->line_len)
1162             panic("cache support enabled but non-existent cache\n");
1163 
1164         if (dc->line_len != L1_CACHE_BYTES)
1165             panic("DCache line [%d] != kernel Config [%d]",
1166                   dc->line_len, L1_CACHE_BYTES);
1167 
1168         /* check for D-Cache aliasing on ARCompact: ARCv2 has PIPT */
1169         if (is_isa_arcompact()) {
1170             int handled = IS_ENABLED(CONFIG_ARC_CACHE_VIPT_ALIASING);
1171             int num_colors = dc->sz_k/dc->assoc/TO_KB(PAGE_SIZE);
1172 
1173             if (dc->alias) {
1174                 if (!handled)
1175                     panic("Enable CONFIG_ARC_CACHE_VIPT_ALIASING\n");
1176                 if (CACHE_COLORS_NUM != num_colors)
1177                     panic("CACHE_COLORS_NUM not optimized for config\n");
1178             } else if (!dc->alias && handled) {
1179                 panic("Disable CONFIG_ARC_CACHE_VIPT_ALIASING\n");
1180             }
1181         }
1182     }
1183 
1184     /*
1185      * Check that SMP_CACHE_BYTES (and hence ARCH_DMA_MINALIGN) is larger
1186      * or equal to any cache line length.
1187      */
1188     BUILD_BUG_ON_MSG(L1_CACHE_BYTES > SMP_CACHE_BYTES,
1189              "SMP_CACHE_BYTES must be >= any cache line length");
1190     if (is_isa_arcv2() && (l2_line_sz > SMP_CACHE_BYTES))
1191         panic("L2 Cache line [%d] > kernel Config [%d]\n",
1192               l2_line_sz, SMP_CACHE_BYTES);
1193 
1194     /* Note that SLC disable not formally supported till HS 3.0 */
1195     if (is_isa_arcv2() && l2_line_sz && !slc_enable)
1196         arc_slc_disable();
1197 
1198     if (is_isa_arcv2() && ioc_exists)
1199         arc_ioc_setup();
1200 
1201     if (is_isa_arcv2() && l2_line_sz && slc_enable) {
1202         __dma_cache_wback_inv = __dma_cache_wback_inv_slc;
1203         __dma_cache_inv = __dma_cache_inv_slc;
1204         __dma_cache_wback = __dma_cache_wback_slc;
1205     } else {
1206         __dma_cache_wback_inv = __dma_cache_wback_inv_l1;
1207         __dma_cache_inv = __dma_cache_inv_l1;
1208         __dma_cache_wback = __dma_cache_wback_l1;
1209     }
1210     /*
1211      * In case of IOC (say IOC+SLC case), pointers above could still be set
1212      * but end up not being relevant as the first function in chain is not
1213      * called at all for devices using coherent DMA.
1214      *     arch_sync_dma_for_cpu() -> dma_cache_*() -> __dma_cache_*()
1215      */
1216 }
1217 
1218 void __ref arc_cache_init(void)
1219 {
1220     unsigned int __maybe_unused cpu = smp_processor_id();
1221     char str[256];
1222 
1223     pr_info("%s", arc_cache_mumbojumbo(0, str, sizeof(str)));
1224 
1225     if (!cpu)
1226         arc_cache_init_master();
1227 
1228     /*
1229      * In PAE regime, TLB and cache maintenance ops take wider addresses
1230      * And even if PAE is not enabled in kernel, the upper 32-bits still need
1231      * to be zeroed to keep the ops sane.
1232      * As an optimization for more common !PAE enabled case, zero them out
1233      * once at init, rather than checking/setting to 0 for every runtime op
1234      */
1235     if (is_isa_arcv2() && pae40_exist_but_not_enab()) {
1236 
1237         if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE))
1238             write_aux_reg(ARC_REG_IC_PTAG_HI, 0);
1239 
1240         if (IS_ENABLED(CONFIG_ARC_HAS_DCACHE))
1241             write_aux_reg(ARC_REG_DC_PTAG_HI, 0);
1242 
1243         if (l2_line_sz) {
1244             write_aux_reg(ARC_REG_SLC_RGN_END1, 0);
1245             write_aux_reg(ARC_REG_SLC_RGN_START1, 0);
1246         }
1247     }
1248 }