| 116 | static int sdcache_way_mask; |
| 117 | |
| 118 | void |
| 119 | mipsNN_cache_init(struct mips_cpuinfo * cpuinfo) |
| 120 | { |
| 121 | int flush_multiple_lines_per_way; |
| 122 | |
| 123 | flush_multiple_lines_per_way = cpuinfo->l1.ic_nsets * cpuinfo->l1.ic_linesize * cpuinfo->l1.ic_linesize > PAGE_SIZE; |
| 124 | if (cpuinfo->icache_virtual) { |
| 125 | /* |
| 126 | * With a virtual Icache we don't need to flush |
| 127 | * multiples of the page size with index ops; we just |
| 128 | * need to flush one pages' worth. |
| 129 | */ |
| 130 | flush_multiple_lines_per_way = 0; |
| 131 | } |
| 132 | |
| 133 | if (flush_multiple_lines_per_way) { |
| 134 | picache_stride = PAGE_SIZE; |
| 135 | picache_loopcount = (cpuinfo->l1.ic_nsets * cpuinfo->l1.ic_linesize / PAGE_SIZE) * |
| 136 | cpuinfo->l1.ic_nways; |
| 137 | } else { |
| 138 | picache_stride = cpuinfo->l1.ic_nsets * cpuinfo->l1.ic_linesize; |
| 139 | picache_loopcount = cpuinfo->l1.ic_nways; |
| 140 | } |
| 141 | |
| 142 | if (cpuinfo->l1.dc_nsets * cpuinfo->l1.dc_linesize < PAGE_SIZE) { |
| 143 | pdcache_stride = cpuinfo->l1.dc_nsets * cpuinfo->l1.dc_linesize; |
| 144 | pdcache_loopcount = cpuinfo->l1.dc_nways; |
| 145 | } else { |
| 146 | pdcache_stride = PAGE_SIZE; |
| 147 | pdcache_loopcount = (cpuinfo->l1.dc_nsets * cpuinfo->l1.dc_linesize / PAGE_SIZE) * |
| 148 | cpuinfo->l1.dc_nways; |
| 149 | } |
| 150 | |
| 151 | mips_picache_linesize = cpuinfo->l1.ic_linesize; |
| 152 | mips_pdcache_linesize = cpuinfo->l1.dc_linesize; |
| 153 | |
| 154 | picache_size = cpuinfo->l1.ic_size; |
| 155 | picache_way_mask = cpuinfo->l1.ic_nways - 1; |
| 156 | pdcache_size = cpuinfo->l1.dc_size; |
| 157 | pdcache_way_mask = cpuinfo->l1.dc_nways - 1; |
| 158 | |
| 159 | sdcache_stride = cpuinfo->l2.dc_nsets * cpuinfo->l2.dc_linesize; |
| 160 | sdcache_loopcount = cpuinfo->l2.dc_nways; |
| 161 | sdcache_size = cpuinfo->l2.dc_size; |
| 162 | sdcache_way_mask = cpuinfo->l2.dc_nways - 1; |
| 163 | |
| 164 | mips_sdcache_linesize = cpuinfo->l2.dc_linesize; |
| 165 | mips_dcache_max_linesize = MAX(mips_pdcache_linesize, |
| 166 | mips_sdcache_linesize); |
| 167 | |
| 168 | #define CACHE_DEBUG |
| 169 | #ifdef CACHE_DEBUG |
| 170 | printf("Cache info:\n"); |
| 171 | if (cpuinfo->icache_virtual) |
| 172 | printf(" icache is virtual\n"); |
| 173 | printf(" picache_stride = %d\n", picache_stride); |
| 174 | printf(" picache_loopcount = %d\n", picache_loopcount); |
| 175 | printf(" pdcache_stride = %d\n", pdcache_stride); |
no test coverage detected