1 /* $NetBSD: cache.c,v 1.69 2022/03/13 17:50:55 andvar Exp $ */ 2 3 /* 4 * Copyright 2001, 2002 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe and Simon Burge for Wasabi Systems, Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed for the NetBSD Project by 20 * Wasabi Systems, Inc. 21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 * or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 /* 39 * Copyright 2000, 2001 40 * Broadcom Corporation. All rights reserved. 41 * 42 * This software is furnished under license and may be used and copied only 43 * in accordance with the following terms and conditions. Subject to these 44 * conditions, you may download, copy, install, use, modify and distribute 45 * modified or unmodified copies of this software in source and/or binary 46 * form. No title or ownership is transferred hereby. 47 * 48 * 1) Any source code used, modified or distributed must reproduce and 49 * retain this copyright notice and list of conditions as they appear in 50 * the source file. 51 * 52 * 2) No right is granted to use any trade name, trademark, or logo of 53 * Broadcom Corporation. The "Broadcom Corporation" name may not be 54 * used to endorse or promote products derived from this software 55 * without the prior written permission of Broadcom Corporation. 56 * 57 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED 58 * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF 59 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR 60 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE 61 * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE 62 * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 63 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 64 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 65 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 66 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 67 * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 68 */ 69 70 #include <sys/cdefs.h> 71 __KERNEL_RCSID(0, "$NetBSD: cache.c,v 1.69 2022/03/13 17:50:55 andvar Exp $"); 72 73 #include "opt_cputype.h" 74 #include "opt_mips_cache.h" 75 76 #include <sys/param.h> 77 78 #include <uvm/uvm_extern.h> 79 80 #include <mips/cache.h> 81 #include <mips/locore.h> 82 83 #ifdef MIPS1 84 #include <mips/cache_r3k.h> 85 #endif 86 87 #ifdef MIPS3_PLUS 88 #include <mips/cache_r4k.h> 89 #include <mips/cache_r5k.h> 90 #ifdef ENABLE_MIPS4_CACHE_R10K 91 #include <mips/cache_r10k.h> 92 #endif 93 #ifdef MIPS3_LOONGSON2 94 #include <mips/cache_ls2.h> 95 #endif 96 #endif 97 98 #if (MIPS32 + MIPS32R2 + MIPS64 + MIPS64R2) > 0 99 #include <mips/mipsNN.h> /* MIPS32/MIPS64 registers */ 100 #include <mips/cache_mipsNN.h> 101 #ifdef MIPS64_OCTEON 102 #include <mips/cache_octeon.h> 103 #endif 104 #endif 105 106 #ifdef MIPS1 107 #ifdef ENABLE_MIPS_TX3900 108 #include <mips/cache_tx39.h> 109 void tx3900_get_cache_config(void); 110 void tx3920_get_cache_config(void); 111 void tx39_cache_config_write_through(void); 112 #endif /* ENABLE_MIPS_TX3900 */ 113 #endif /* MIPS1 */ 114 115 #if defined(MIPS3) || defined(MIPS4) 116 void mips3_get_cache_config(int); 117 #ifdef ENABLE_MIPS4_CACHE_R10K 118 void mips4_get_cache_config(int); 119 #endif /* ENABLE_MIPS4_CACHE_R10K */ 120 #endif /* MIPS3 || MIPS4 */ 121 122 #if defined(MIPS1) || defined(MIPS3) || defined(MIPS4) 123 static void mips_config_cache_prehistoric(void); 124 static void mips_config_cache_emips(void); 125 #endif 126 #if (MIPS32 + MIPS32R2 + MIPS64 + MIPS64R2) > 0 127 static void mips_config_cache_modern(uint32_t); 128 #endif 129 130 #if (MIPS1 + MIPS3 + MIPS4 + MIPS32 + MIPS64 + MIPS32R2 + MIPS64R2) > 0 131 /* no-cache definition */ 132 static void no_cache_op(void); 133 static void no_cache_op_range(register_t va, vsize_t size); 134 static void no_cache_op_range_index(vaddr_t va, vsize_t size); 135 136 /* no-cache implementation */ 137 static void no_cache_op(void) {} 138 static void no_cache_op_range(register_t va, vsize_t size) {} 139 static void no_cache_op_range_index(vaddr_t va, vsize_t size) {} 140 #endif 141 142 struct mips_cache_info mips_cache_info; 143 struct mips_cache_ops mips_cache_ops = { 144 .mco_intern_icache_sync_range_index = no_cache_op_range_index, 145 .mco_intern_icache_sync_range = no_cache_op_range, 146 .mco_intern_pdcache_sync_all= no_cache_op, 147 .mco_intern_pdcache_sync_range_index = no_cache_op_range_index, 148 .mco_intern_pdcache_sync_range = no_cache_op_range, 149 .mco_intern_pdcache_wbinv_range_index = no_cache_op_range_index, 150 .mco_intern_sdcache_sync_all= no_cache_op, 151 .mco_intern_sdcache_sync_range_index = no_cache_op_range_index, 152 .mco_intern_sdcache_sync_range = no_cache_op_range, 153 .mco_intern_sdcache_wbinv_range_index = no_cache_op_range_index, 154 }; 155 156 /* 157 * mips_dcache_compute_align: 158 * 159 * Compute the D-cache alignment values. 160 */ 161 void 162 mips_dcache_compute_align(void) 163 { 164 struct mips_cache_info * const mci = &mips_cache_info; 165 u_int align; 166 167 align = mci->mci_pdcache_line_size; 168 169 if (mci->mci_sdcache_line_size > align) 170 align = mci->mci_sdcache_line_size; 171 172 if (mci->mci_tcache_line_size > align) 173 align = mci->mci_tcache_line_size; 174 175 mci->mci_dcache_align = align; 176 mci->mci_dcache_align_mask = align - 1; 177 } 178 179 /* 180 * mips_config_cache: 181 * 182 * Configure the cache for the system. 183 * 184 * XXX DOES NOT HANDLE SPLIT SECONDARY CACHES. 185 */ 186 void 187 mips_config_cache(void) 188 { 189 #ifdef DIAGNOSTIC 190 struct mips_cache_info * const mci = &mips_cache_info; 191 struct mips_cache_ops * const mco = &mips_cache_ops; 192 #endif 193 const mips_prid_t cpu_id = mips_options.mips_cpu_id; 194 195 #if defined(MIPS1) || defined(MIPS3) || defined(MIPS4) 196 if (MIPS_PRID_CID(cpu_id) == MIPS_PRID_CID_PREHISTORIC) 197 mips_config_cache_prehistoric(); 198 else if (MIPS_PRID_CID(cpu_id) == MIPS_PRID_CID_MICROSOFT) 199 mips_config_cache_emips(); 200 #endif 201 #if (MIPS32 + MIPS32R2 + MIPS64 + MIPS64R2) > 0 202 if (MIPS_PRID_CID(cpu_id) != MIPS_PRID_CID_PREHISTORIC) 203 mips_config_cache_modern(cpu_id); 204 #endif 205 206 #ifdef DIAGNOSTIC 207 /* Check that all cache ops are set up. */ 208 if (mci->mci_picache_size || 1) { /* XXX- must have primary Icache */ 209 if (!mco->mco_icache_sync_all) 210 panic("no icache_sync_all cache op"); 211 if (!mco->mco_icache_sync_range) 212 panic("no icache_sync_range cache op"); 213 if (!mco->mco_icache_sync_range_index) 214 panic("no icache_sync_range_index cache op"); 215 } 216 if (mci->mci_pdcache_size || 1) { /* XXX- must have primary Dcache */ 217 if (!mco->mco_pdcache_wbinv_all) 218 panic("no pdcache_wbinv_all"); 219 if (!mco->mco_pdcache_wbinv_range) 220 panic("no pdcache_wbinv_range"); 221 if (!mco->mco_pdcache_wbinv_range_index) 222 panic("no pdcache_wbinv_range_index"); 223 if (!mco->mco_pdcache_inv_range) 224 panic("no pdcache_inv_range"); 225 if (!mco->mco_pdcache_wb_range) 226 panic("no pdcache_wb_range"); 227 } 228 if (mci->mci_sdcache_size) { 229 if (!mco->mco_sdcache_wbinv_all) 230 panic("no sdcache_wbinv_all"); 231 if (!mco->mco_sdcache_wbinv_range) 232 panic("no sdcache_wbinv_range"); 233 if (!mco->mco_sdcache_wbinv_range_index) 234 panic("no sdcache_wbinv_range_index"); 235 if (!mco->mco_sdcache_inv_range) 236 panic("no sdcache_inv_range"); 237 if (!mco->mco_sdcache_wb_range) 238 panic("no sdcache_wb_range"); 239 } 240 #endif /* DIAGNOSTIC */ 241 } 242 243 #if defined(MIPS1) || defined(MIPS3) || defined(MIPS4) 244 /* 245 * XXX DOES NOT HANDLE SPLIT SECONDARY CACHES. 246 */ 247 void 248 mips_config_cache_prehistoric(void) 249 { 250 struct mips_cache_info * const mci = &mips_cache_info; 251 struct mips_cache_ops * const mco = &mips_cache_ops; 252 const mips_prid_t cpu_id = mips_options.mips_cpu_id; 253 #if defined(MIPS3) || defined(MIPS4) 254 int csizebase = MIPS3_CONFIG_C_DEFBASE; 255 #endif 256 257 KASSERT(PAGE_SIZE != 0); 258 259 /* 260 * Configure primary caches. 261 */ 262 switch (MIPS_PRID_IMPL(cpu_id)) { 263 #ifdef MIPS1 264 case MIPS_R2000: 265 case MIPS_R3000: 266 mci->mci_picache_size = r3k_picache_size(); 267 mci->mci_pdcache_size = r3k_pdcache_size(); 268 269 mci->mci_picache_line_size = 4; 270 mci->mci_pdcache_line_size = 4; 271 272 mci->mci_picache_ways = 1; 273 mci->mci_pdcache_ways = 1; 274 275 mci->mci_pdcache_write_through = true; 276 277 mco->mco_icache_sync_all = 278 r3k_icache_sync_all; 279 mco->mco_icache_sync_range = 280 r3k_icache_sync_range; 281 mco->mco_icache_sync_range_index = 282 (void (*)(vaddr_t, vsize_t)) mco->mco_icache_sync_range; 283 284 mco->mco_pdcache_wbinv_all = 285 r3k_pdcache_wbinv_all; 286 mco->mco_pdcache_wbinv_range = 287 r3k_pdcache_inv_range; 288 mco->mco_pdcache_wbinv_range_index = 289 (void (*)(vaddr_t, vsize_t)) mco->mco_pdcache_wbinv_range; 290 mco->mco_pdcache_inv_range = 291 r3k_pdcache_inv_range; 292 mco->mco_pdcache_wb_range = 293 r3k_pdcache_wb_range; 294 295 uvmexp.ncolors = atop(mci->mci_pdcache_size); 296 break; 297 298 #ifdef ENABLE_MIPS_TX3900 299 case MIPS_TX3900: 300 switch (MIPS_PRID_REV_MAJ(cpu_id)) { 301 case 1: /* TX3912 */ 302 mci->mci_picache_ways = 1; 303 mci->mci_picache_line_size = 16; 304 mci->mci_pdcache_line_size = 4; 305 306 tx3900_get_cache_config(); 307 308 mci->mci_pdcache_write_through = true; 309 310 mco->mco_icache_sync_all = 311 tx3900_icache_sync_all_16; 312 mco->mco_icache_sync_range = 313 tx3900_icache_sync_range_16; 314 mco->mco_icache_sync_range_index = 315 (void (*)(vaddr_t, vsize_t)) 316 tx3900_icache_sync_range_16; 317 318 mco->mco_pdcache_wbinv_all = 319 tx3900_pdcache_wbinv_all_4; 320 mco->mco_pdcache_wbinv_range = 321 tx3900_pdcache_inv_range_4; 322 mco->mco_pdcache_wbinv_range_index = 323 (void (*)(vaddr_t, vsize_t)) 324 tx3900_pdcache_inv_range_4; 325 mco->mco_pdcache_inv_range = 326 tx3900_pdcache_inv_range_4; 327 mco->mco_pdcache_wb_range = 328 tx3900_pdcache_wb_range_4; 329 break; 330 331 case 3: /* TX3922 */ 332 mci->mci_picache_ways = 2; 333 mci->mci_picache_line_size = 16; 334 mci->mci_pdcache_line_size = 16; 335 336 tx3920_get_cache_config(); 337 338 mco->mco_icache_sync_all = 339 mci->mci_pdcache_write_through ? 340 tx3900_icache_sync_all_16 : 341 tx3920_icache_sync_all_16wb; 342 mco->mco_icache_sync_range = 343 mci->mci_pdcache_write_through ? 344 tx3920_icache_sync_range_16wt : 345 tx3920_icache_sync_range_16wb; 346 mco->mco_icache_sync_range_index = 347 (void (*)(vaddr_t, vsize_t)) 348 mco->mco_icache_sync_range; 349 350 mco->mco_pdcache_wbinv_all = 351 mci->mci_pdcache_write_through ? 352 tx3920_pdcache_wbinv_all_16wt : 353 tx3920_pdcache_wbinv_all_16wb; 354 mco->mco_pdcache_wbinv_range = 355 mci->mci_pdcache_write_through ? 356 tx3920_pdcache_inv_range_16 : 357 tx3920_pdcache_wbinv_range_16wb; 358 mco->mco_pdcache_wbinv_range_index = 359 (void (*)(vaddr_t, vsize_t)) 360 mco->mco_pdcache_wbinv_range; 361 mco->mco_pdcache_inv_range = 362 tx3920_pdcache_inv_range_16; 363 mco->mco_pdcache_wb_range = 364 mci->mci_pdcache_write_through ? 365 tx3920_pdcache_wb_range_16wt : 366 tx3920_pdcache_wb_range_16wb; 367 break; 368 369 default: 370 panic("mips_config_cache: unsupported TX3900"); 371 } 372 373 mci->mci_pdcache_ways = 2; 374 tx3900_get_cache_config(); 375 /* change to write-through mode */ 376 tx39_cache_config_write_through(); 377 378 uvmexp.ncolors = 379 atop(mci->mci_pdcache_size) / mci->mci_pdcache_ways; 380 break; 381 #endif /* ENABLE_MIPS_TX3900 */ 382 #endif /* MIPS1 */ 383 384 #if defined(MIPS3) || defined(MIPS4) 385 case MIPS_R4100: 386 if ((mips3_cp0_config_read() & MIPS3_CONFIG_CS) != 0) 387 csizebase = MIPS3_CONFIG_C_4100BASE; 388 389 /* 390 * R4100 (NEC VR series) revision number means: 391 * 392 * MIPS_PRID_REV_MAJ MIPS_PRID_REV_MIN 393 * VR4102 4 ? 394 * VR4111 5 ? 395 * VR4181 5 ? 396 * VR4121 6 ? 397 * VR4122 7 0 or 1 398 * VR4181A 7 3 < 399 * VR4131 8 ? 400 */ 401 /* Vr4131 has R4600 style 2-way set-associative cache */ 402 if (MIPS_PRID_REV_MAJ(cpu_id) == 8) 403 goto primary_cache_is_2way; 404 /* FALLTHROUGH */ 405 406 case MIPS_R4000: 407 case MIPS_R4300: 408 mci->mci_picache_ways = 1; 409 mci->mci_pdcache_ways = 1; 410 mci->mci_sdcache_ways = 1; 411 412 mips3_get_cache_config(csizebase); 413 414 /* no VCE support if there is no L2 cache */ 415 if (mci->mci_picache_size > PAGE_SIZE) 416 mci->mci_icache_virtual_alias = true; 417 if (mci->mci_pdcache_size > PAGE_SIZE) 418 mci->mci_cache_virtual_alias = true; 419 420 mco->mco_icache_sync_all = r4k_icache_sync_all_generic; 421 switch (mci->mci_picache_line_size) { 422 case 16: 423 mco->mco_icache_sync_range = 424 cache_r4k_icache_hit_inv_16; 425 mco->mco_icache_sync_range_index = 426 cache_r4k_icache_index_inv_16; 427 break; 428 429 case 32: 430 mco->mco_icache_sync_range = 431 cache_r4k_icache_hit_inv_32; 432 mco->mco_icache_sync_range_index = 433 cache_r4k_icache_index_inv_32; 434 break; 435 436 default: 437 panic("r4k picache line size %d", 438 mci->mci_picache_line_size); 439 } 440 441 mco->mco_pdcache_wbinv_all = r4k_pdcache_wbinv_all_generic; 442 switch (mci->mci_pdcache_line_size) { 443 case 16: 444 mco->mco_pdcache_wbinv_range = 445 cache_r4k_pdcache_hit_wb_inv_16; 446 mco->mco_pdcache_wbinv_range_index = 447 cache_r4k_pdcache_index_wb_inv_16; 448 mco->mco_pdcache_inv_range = 449 cache_r4k_pdcache_hit_inv_16; 450 mco->mco_pdcache_wb_range = 451 cache_r4k_pdcache_hit_wb_16; 452 break; 453 454 case 32: 455 mco->mco_pdcache_wbinv_range = 456 cache_r4k_pdcache_hit_wb_inv_32; 457 mco->mco_pdcache_wbinv_range_index = 458 cache_r4k_pdcache_index_wb_inv_32; 459 mco->mco_pdcache_inv_range = 460 cache_r4k_pdcache_hit_inv_32; 461 mco->mco_pdcache_wb_range = 462 cache_r4k_pdcache_hit_wb_32; 463 break; 464 465 default: 466 panic("r4k pdcache line size %d", 467 mci->mci_pdcache_line_size); 468 } 469 break; 470 471 case MIPS_R4600: 472 #ifdef ENABLE_MIPS_R4700 473 case MIPS_R4700: 474 #endif 475 #ifndef ENABLE_MIPS_R3NKK 476 case MIPS_R5000: 477 #endif 478 case MIPS_RM5200: 479 primary_cache_is_2way: 480 mci->mci_picache_ways = 2; 481 mci->mci_pdcache_ways = 2; 482 483 mips3_get_cache_config(csizebase); 484 485 if (mci->mci_picache_size / mci->mci_picache_ways > PAGE_SIZE) 486 mci->mci_icache_virtual_alias = true; 487 if (mci->mci_pdcache_size / mci->mci_pdcache_ways > PAGE_SIZE) 488 mci->mci_cache_virtual_alias = true; 489 490 mco->mco_icache_sync_all = r5k_picache_sync_all; 491 mco->mco_icache_sync_range = r5k_picache_sync_range; 492 mco->mco_icache_sync_range_index = r5k_picache_sync_range_index; 493 494 switch (mci->mci_picache_line_size) { 495 case 32: 496 /* used internally by mipsNN_picache_sync_range */ 497 mco->mco_intern_icache_sync_range = 498 cache_r4k_icache_hit_inv_32; 499 500 /* used internally by mipsNN_picache_sync_range_index */ 501 mco->mco_intern_icache_sync_range_index = 502 cache_r4k_icache_index_inv_32; 503 break; 504 505 default: 506 panic("r5k picache line size %u", 507 mci->mci_picache_line_size); 508 } 509 510 mco->mco_pdcache_wbinv_all = r5k_pdcache_wbinv_all; 511 mco->mco_pdcache_wbinv_range_index = 512 r5k_pdcache_wbinv_range_index; 513 514 switch (mci->mci_pdcache_line_size) { 515 case 16: 516 mco->mco_pdcache_wbinv_range = 517 cache_r4k_pdcache_hit_wb_inv_16; 518 mco->mco_pdcache_inv_range = 519 cache_r4k_pdcache_hit_inv_16; 520 mco->mco_pdcache_wb_range = 521 cache_r4k_pdcache_hit_wb_16; 522 523 /* used internally by r5k_pdcache_wbinv_range_index */ 524 mco->mco_intern_pdcache_wbinv_range_index = 525 cache_r4k_pdcache_index_wb_inv_16; 526 break; 527 528 case 32: 529 mco->mco_pdcache_wbinv_range = 530 cache_r4k_pdcache_hit_wb_inv_32; 531 mco->mco_pdcache_inv_range = 532 cache_r4k_pdcache_hit_inv_32; 533 mco->mco_pdcache_wb_range = 534 cache_r4k_pdcache_hit_wb_32; 535 536 /* used internally by r5k_pdcache_wbinv_range_index */ 537 mco->mco_intern_pdcache_wbinv_range_index = 538 cache_r4k_pdcache_index_wb_inv_32; 539 break; 540 541 default: 542 panic("r5k pdcache line size %d", 543 mci->mci_pdcache_line_size); 544 } 545 546 mco->mco_intern_pdcache_sync_all = mco->mco_pdcache_wbinv_all; 547 mco->mco_intern_pdcache_sync_range_index = 548 mco->mco_intern_pdcache_wbinv_range_index; 549 mco->mco_intern_pdcache_sync_range = mco->mco_pdcache_wb_range; 550 551 /* 552 * Deal with R4600 chip bugs. 553 */ 554 if (MIPS_PRID_IMPL(cpu_id) == MIPS_R4600 && 555 MIPS_PRID_REV_MAJ(cpu_id) == 1) { 556 KASSERT(mci->mci_pdcache_line_size == 32); 557 mco->mco_pdcache_wbinv_range = 558 r4600v1_pdcache_wbinv_range_32; 559 mco->mco_pdcache_inv_range = 560 r4600v1_pdcache_inv_range_32; 561 mco->mco_pdcache_wb_range = 562 r4600v1_pdcache_wb_range_32; 563 } else if (MIPS_PRID_IMPL(cpu_id) == MIPS_R4600 && 564 MIPS_PRID_REV_MAJ(cpu_id) == 2) { 565 KASSERT(mci->mci_pdcache_line_size == 32); 566 mco->mco_pdcache_wbinv_range = 567 r4600v2_pdcache_wbinv_range_32; 568 mco->mco_pdcache_inv_range = 569 r4600v2_pdcache_inv_range_32; 570 mco->mco_pdcache_wb_range = 571 r4600v2_pdcache_wb_range_32; 572 } 573 574 /* 575 * Deal with VR4131 chip bugs. 576 */ 577 if (MIPS_PRID_IMPL(cpu_id) == MIPS_R4100 && 578 MIPS_PRID_REV_MAJ(cpu_id) == 8) { 579 KASSERT(mci->mci_pdcache_line_size == 16); 580 mco->mco_pdcache_wbinv_range = 581 vr4131v1_pdcache_wbinv_range_16; 582 } 583 break; 584 #ifdef ENABLE_MIPS4_CACHE_R10K 585 case MIPS_R10000: 586 case MIPS_R12000: 587 case MIPS_R14000: 588 mci->mci_picache_ways = 2; 589 mci->mci_pdcache_ways = 2; 590 mci->mci_sdcache_ways = 2; 591 592 mips4_get_cache_config(csizebase); 593 594 /* VCE is handled by hardware */ 595 596 mco->mco_icache_sync_all = 597 r10k_icache_sync_all; 598 mco->mco_icache_sync_range = 599 r10k_icache_sync_range; 600 mco->mco_icache_sync_range_index = 601 r10k_icache_sync_range_index; 602 mco->mco_pdcache_wbinv_all = 603 r10k_pdcache_wbinv_all; 604 mco->mco_pdcache_wbinv_range = 605 r10k_pdcache_wbinv_range; 606 mco->mco_pdcache_wbinv_range_index = 607 r10k_pdcache_wbinv_range_index; 608 mco->mco_pdcache_inv_range = 609 r10k_pdcache_inv_range; 610 mco->mco_pdcache_wb_range = 611 r10k_pdcache_wb_range; 612 break; 613 #endif /* ENABLE_MIPS4_CACHE_R10K */ 614 #ifdef MIPS3_LOONGSON2 615 case MIPS_LOONGSON2: 616 mci->mci_picache_ways = 4; 617 mci->mci_pdcache_ways = 4; 618 619 mips3_get_cache_config(csizebase); 620 621 mci->mci_sdcache_line_size = 32; /* don't trust config reg */ 622 623 if (mci->mci_picache_size / mci->mci_picache_ways > PAGE_SIZE) 624 mci->mci_icache_virtual_alias = true; 625 if (mci->mci_pdcache_size / mci->mci_pdcache_ways > PAGE_SIZE) 626 mci->mci_cache_virtual_alias = true; 627 628 mco->mco_icache_sync_all = 629 ls2_icache_sync_all; 630 mco->mco_icache_sync_range = 631 ls2_icache_sync_range; 632 mco->mco_icache_sync_range_index = 633 ls2_icache_sync_range_index; 634 635 mco->mco_pdcache_wbinv_all = 636 ls2_pdcache_wbinv_all; 637 mco->mco_pdcache_wbinv_range = 638 ls2_pdcache_wbinv_range; 639 mco->mco_pdcache_wbinv_range_index = 640 ls2_pdcache_wbinv_range_index; 641 mco->mco_pdcache_inv_range = 642 ls2_pdcache_inv_range; 643 mco->mco_pdcache_wb_range = 644 ls2_pdcache_wb_range; 645 646 /* 647 * For current version chips, [the] operating system is 648 * obliged to eliminate the potential for virtual aliasing. 649 */ 650 uvmexp.ncolors = mci->mci_pdcache_ways; 651 break; 652 #endif 653 #endif /* MIPS3 || MIPS4 */ 654 default: 655 panic("can't handle primary cache on impl 0x%x", 656 MIPS_PRID_IMPL(cpu_id)); 657 } 658 659 /* 660 * Compute the "way mask" for each cache. 661 */ 662 if (mci->mci_picache_size) { 663 KASSERT(mci->mci_picache_ways != 0); 664 mci->mci_picache_way_size = 665 mci->mci_picache_size / mci->mci_picache_ways; 666 mci->mci_picache_way_mask = mci->mci_picache_way_size - 1; 667 #if (MIPS2 + MIPS3 + MIPS4) > 0 668 if (mci->mci_icache_virtual_alias) 669 mci->mci_icache_alias_mask = 670 mci->mci_picache_way_mask & -PAGE_SIZE; 671 #endif 672 } 673 if (mci->mci_pdcache_size) { 674 KASSERT(mci->mci_pdcache_ways != 0); 675 mci->mci_pdcache_way_size = 676 mci->mci_pdcache_size / mci->mci_pdcache_ways; 677 mci->mci_pdcache_way_mask = mci->mci_pdcache_way_size - 1; 678 #if (MIPS2 + MIPS3 + MIPS4) > 0 679 if (mci->mci_cache_virtual_alias) 680 mci->mci_cache_alias_mask = 681 mci->mci_pdcache_way_mask & -PAGE_SIZE; 682 #endif 683 } 684 685 #if (MIPS2 + MIPS3 + MIPS4) > 0 686 if (mci->mci_cache_virtual_alias) { 687 mci->mci_cache_prefer_mask = mci->mci_pdcache_way_mask; 688 689 uvmexp.ncolors = (mci->mci_cache_prefer_mask >> PAGE_SHIFT) + 1; 690 } 691 #endif 692 693 mips_dcache_compute_align(); 694 695 if (mci->mci_sdcache_line_size == 0) 696 return; 697 698 /* 699 * Configure the secondary cache. 700 */ 701 switch (MIPS_PRID_IMPL(cpu_id)) { 702 #if defined(MIPS3) || defined(MIPS4) 703 case MIPS_R4000: 704 /* 705 * R4000/R4400 detects virtual alias by VCE as if 706 * its primary cache size were 32KB, because it always 707 * compares 3 bits of vaddr[14:12] which causes 708 * primary cache miss and PIdx[2:0] in the secondary 709 * cache tag regardless of its primary cache size. 710 * i.e. VCE could happen even if there is no actual 711 * virtual alias on its 8KB or 16KB primary cache 712 * which has only 1 or 2 bit valid PIdx in 4KB page. 713 * Actual primary cache size is ignored wrt VCE 714 * and virtual aliases are resolved by the VCE handler, 715 * but it's still worth to avoid unnecessary VCE by 716 * setting alias mask and prefer mask to 32K, though 717 * some other possible aliases (maybe caused by KSEG0 718 * accesses which can't be managed by PMAP_PREFER(9)) 719 * will still be resolved by the VCED/VCEI handler. 720 */ 721 mci->mci_cache_alias_mask = 722 (MIPS3_MAX_PCACHE_SIZE - 1) & ~PAGE_MASK; /* va[14:12] */ 723 mci->mci_cache_prefer_mask = MIPS3_MAX_PCACHE_SIZE - 1; 724 725 mci->mci_icache_virtual_alias = false; 726 mci->mci_cache_virtual_alias = false; 727 /* FALLTHROUGH */ 728 case MIPS_R4600: 729 #ifdef ENABLE_MIPS_R4700 730 case MIPS_R4700: 731 #endif 732 switch (mci->mci_sdcache_ways) { 733 case 1: 734 mco->mco_sdcache_wbinv_all = 735 r4k_sdcache_wbinv_all_generic; 736 switch (mci->mci_sdcache_line_size) { 737 case 16: 738 mco->mco_sdcache_wbinv_range = 739 cache_r4k_sdcache_hit_wb_inv_16; 740 mco->mco_sdcache_wbinv_range_index = 741 cache_r4k_sdcache_index_wb_inv_16; 742 mco->mco_sdcache_inv_range = 743 cache_r4k_sdcache_hit_inv_16; 744 mco->mco_sdcache_wb_range = 745 cache_r4k_sdcache_hit_wb_16; 746 break; 747 748 case 32: 749 mco->mco_sdcache_wbinv_range = 750 cache_r4k_sdcache_hit_wb_inv_32; 751 mco->mco_sdcache_wbinv_range_index = 752 cache_r4k_sdcache_index_wb_inv_32; 753 mco->mco_sdcache_inv_range = 754 cache_r4k_sdcache_hit_inv_32; 755 mco->mco_sdcache_wb_range = 756 cache_r4k_sdcache_hit_wb_32; 757 break; 758 759 case 64: 760 mco->mco_sdcache_wbinv_range = 761 cache_r4k_sdcache_hit_wb_inv_64; 762 mco->mco_sdcache_wbinv_range_index = 763 cache_r4k_sdcache_index_wb_inv_64; 764 mco->mco_sdcache_inv_range = 765 cache_r4k_sdcache_hit_inv_64; 766 mco->mco_sdcache_wb_range = 767 cache_r4k_sdcache_hit_wb_64; 768 break; 769 770 case 128: 771 mco->mco_sdcache_wbinv_range = 772 cache_r4k_sdcache_hit_wb_inv_128; 773 mco->mco_sdcache_wbinv_range_index = 774 cache_r4k_sdcache_index_wb_inv_128; 775 mco->mco_sdcache_inv_range = 776 cache_r4k_sdcache_hit_inv_128; 777 mco->mco_sdcache_wb_range = 778 cache_r4k_sdcache_hit_wb_128; 779 break; 780 781 default: 782 panic("r4k sdcache %d way line size %d", 783 mci->mci_sdcache_ways, 784 mci->mci_sdcache_line_size); 785 } 786 break; 787 788 default: 789 panic("r4k sdcache %d way line size %d", 790 mci->mci_sdcache_ways, mci->mci_sdcache_line_size); 791 } 792 break; 793 #ifndef ENABLE_MIPS_R3NKK 794 case MIPS_R5000: 795 #endif 796 case MIPS_RM5200: 797 mci->mci_sdcache_write_through = true; 798 mco->mco_sdcache_wbinv_all = 799 r5k_sdcache_wbinv_all; 800 mco->mco_sdcache_wbinv_range = 801 r5k_sdcache_wbinv_range; 802 mco->mco_sdcache_wbinv_range_index = 803 r5k_sdcache_wbinv_range_index; 804 mco->mco_sdcache_inv_range = 805 r5k_sdcache_wbinv_range; 806 mco->mco_sdcache_wb_range = no_cache_op_range; 807 break; 808 #ifdef ENABLE_MIPS4_CACHE_R10K 809 case MIPS_R10000: 810 case MIPS_R12000: 811 case MIPS_R14000: 812 mco->mco_sdcache_wbinv_all = 813 r10k_sdcache_wbinv_all; 814 mco->mco_sdcache_wbinv_range = 815 r10k_sdcache_wbinv_range; 816 mco->mco_sdcache_wbinv_range_index = 817 r10k_sdcache_wbinv_range_index; 818 mco->mco_sdcache_inv_range = 819 r10k_sdcache_inv_range; 820 mco->mco_sdcache_wb_range = 821 r10k_sdcache_wb_range; 822 break; 823 #endif /* ENABLE_MIPS4_CACHE_R10K */ 824 #ifdef MIPS3_LOONGSON2 825 case MIPS_LOONGSON2: 826 mci->mci_sdcache_ways = 4; 827 mci->mci_sdcache_size = 512*1024; 828 mci->mci_scache_unified = 1; 829 830 mco->mco_sdcache_wbinv_all = 831 ls2_sdcache_wbinv_all; 832 mco->mco_sdcache_wbinv_range = 833 ls2_sdcache_wbinv_range; 834 mco->mco_sdcache_wbinv_range_index = 835 ls2_sdcache_wbinv_range_index; 836 mco->mco_sdcache_inv_range = 837 ls2_sdcache_inv_range; 838 mco->mco_sdcache_wb_range = 839 ls2_sdcache_wb_range; 840 841 /* 842 * The secondary cache is physically indexed and tagged 843 */ 844 break; 845 #endif 846 #endif /* MIPS3 || MIPS4 */ 847 848 default: 849 panic("can't handle secondary cache on impl 0x%x", 850 MIPS_PRID_IMPL(cpu_id)); 851 } 852 853 /* 854 * Compute the "way mask" for each secondary cache. 855 */ 856 if (mci->mci_sdcache_size) { 857 KASSERT(mci->mci_sdcache_ways != 0); 858 mci->mci_sdcache_way_size = 859 mci->mci_sdcache_size / mci->mci_sdcache_ways; 860 mci->mci_sdcache_way_mask = mci->mci_sdcache_way_size - 1; 861 } 862 863 mips_dcache_compute_align(); 864 } 865 866 #if defined(MIPS1) || defined(MIPS3) || defined(MIPS4) 867 void 868 mips_config_cache_emips(void) 869 { 870 struct mips_cache_info * const mci = &mips_cache_info; 871 struct mips_cache_ops * const mco = &mips_cache_ops; 872 const mips_prid_t cpu_id = mips_options.mips_cpu_id; 873 KASSERT(PAGE_SIZE != 0); 874 875 /* 876 * Configure primary caches. 877 */ 878 switch (MIPS_PRID_IMPL(cpu_id)) { 879 case MIPS_eMIPS: 880 mci->mci_picache_size = 0; 881 mci->mci_pdcache_size = 0; 882 883 mci->mci_picache_line_size = 4; 884 mci->mci_pdcache_line_size = 4; 885 886 mci->mci_picache_ways = 1; 887 mci->mci_pdcache_ways = 1; 888 889 mci->mci_pdcache_write_through = true; 890 891 mco->mco_icache_sync_all = no_cache_op; 892 mco->mco_icache_sync_range = no_cache_op_range; 893 mco->mco_icache_sync_range_index = no_cache_op_range_index; 894 895 mco->mco_pdcache_wbinv_all = no_cache_op; 896 mco->mco_pdcache_wbinv_range = no_cache_op_range; 897 mco->mco_pdcache_wbinv_range_index = no_cache_op_range_index; 898 mco->mco_pdcache_inv_range = no_cache_op_range; 899 mco->mco_pdcache_wb_range = no_cache_op_range; 900 901 uvmexp.ncolors = 1; 902 break; 903 904 default: 905 panic("%s: unsupported eMIPS", __func__); 906 } 907 } 908 #endif 909 910 #ifdef MIPS1 911 #ifdef ENABLE_MIPS_TX3900 912 /* 913 * tx3900_get_cache_config: 914 * 915 * Fetch cache size information for the TX3900. 916 */ 917 void 918 tx3900_get_cache_config(void) 919 { 920 struct mips_cache_info * const mci = &mips_cache_info; 921 uint32_t config; 922 923 config = tx3900_cp0_config_read(); 924 925 mci->mci_picache_size = R3900_C_SIZE_MIN << 926 ((config & R3900_CONFIG_ICS_MASK) >> R3900_CONFIG_ICS_SHIFT); 927 928 mci->mci_pdcache_size = R3900_C_SIZE_MIN << 929 ((config & R3900_CONFIG_DCS_MASK) >> R3900_CONFIG_DCS_SHIFT); 930 } 931 932 /* 933 * tx3920_get_cache_config: 934 * 935 * Fetch cache size information for the TX3920. 936 */ 937 void 938 tx3920_get_cache_config(void) 939 { 940 struct mips_cache_info * const mci = &mips_cache_info; 941 942 /* Size is the same as TX3900. */ 943 tx3900_get_cache_config(); 944 945 /* Now determine write-through/write-back mode. */ 946 if ((tx3900_cp0_config_read() & R3900_CONFIG_WBON) == 0) 947 mci->mci_pdcache_write_through = true; 948 } 949 950 /* 951 * tx39_cache_config_write_through: 952 * 953 * TX3922 write-through D-cache mode. 954 * for TX3912, no meaning. (no write-back mode) 955 */ 956 void 957 tx39_cache_config_write_through(void) 958 { 959 u_int32_t r; 960 961 mips_dcache_wbinv_all(); 962 963 __asm volatile("mfc0 %0, $3" : "=r"(r)); 964 r &= 0xffffdfff; 965 __asm volatile("mtc0 %0, $3" : : "r"(r)); 966 } 967 968 #endif /* ENABLE_MIPS_TX3900 */ 969 #endif /* MIPS1 */ 970 971 #if defined(MIPS3) || defined(MIPS4) 972 /* 973 * mips3_get_cache_config: 974 * 975 * Fetch the cache config information for a MIPS-3 or MIPS-4 976 * processor (virtually-indexed cache). 977 * 978 * NOTE: Fetching the size of the secondary cache is something 979 * that platform specific code has to do. We'd appreciate it 980 * if they initialized the size before now. 981 * 982 * ALSO NOTE: The number of ways in the cache must already be 983 * initialized. 984 */ 985 void 986 mips3_get_cache_config(int csizebase) 987 { 988 struct mips_cache_info * const mci = &mips_cache_info; 989 const mips_prid_t cpu_id = mips_options.mips_cpu_id; 990 bool has_sdcache_enable = false; 991 uint32_t config = mips3_cp0_config_read(); 992 993 mci->mci_picache_size = MIPS3_CONFIG_CACHE_SIZE(config, 994 MIPS3_CONFIG_IC_MASK, csizebase, MIPS3_CONFIG_IC_SHIFT); 995 mci->mci_picache_line_size = MIPS3_CONFIG_CACHE_L1_LSIZE(config, 996 MIPS3_CONFIG_IB); 997 998 mci->mci_pdcache_size = MIPS3_CONFIG_CACHE_SIZE(config, 999 MIPS3_CONFIG_DC_MASK, csizebase, MIPS3_CONFIG_DC_SHIFT); 1000 mci->mci_pdcache_line_size = MIPS3_CONFIG_CACHE_L1_LSIZE(config, 1001 MIPS3_CONFIG_DB); 1002 1003 switch(MIPS_PRID_IMPL(cpu_id)) { 1004 #ifndef ENABLE_MIPS_R3NKK 1005 case MIPS_R5000: 1006 #endif 1007 case MIPS_RM5200: 1008 has_sdcache_enable = true; 1009 break; 1010 } 1011 1012 /* 1013 * If CPU has a software-enabled L2 cache, check both if it's 1014 * present and if it's enabled before making assumptions the 1015 * L2 is usable. If the L2 is disabled, we treat it the same 1016 * as if there were no L2 cache. 1017 */ 1018 if ((config & MIPS3_CONFIG_SC) == 0) { 1019 if (has_sdcache_enable == 0 || 1020 (has_sdcache_enable && (config & MIPS3_CONFIG_SE))) { 1021 mci->mci_sdcache_line_size = 1022 MIPS3_CONFIG_CACHE_L2_LSIZE(config); 1023 if ((config & MIPS3_CONFIG_SS) == 0) 1024 mci->mci_scache_unified = true; 1025 } else { 1026 #ifdef CACHE_DEBUG 1027 printf("External cache detected, but is disabled -- " 1028 "WILL NOT ENABLE!\n"); 1029 #endif /* CACHE_DEBUG */ 1030 } 1031 } 1032 } 1033 1034 #ifdef ENABLE_MIPS4_CACHE_R10K 1035 void 1036 mips4_get_cache_config(int csizebase) 1037 { 1038 struct mips_cache_info * const mci = &mips_cache_info; 1039 uint32_t config = mips3_cp0_config_read(); 1040 1041 mci->mci_picache_size = MIPS4_CONFIG_CACHE_SIZE(config, 1042 MIPS4_CONFIG_IC_MASK, csizebase, MIPS4_CONFIG_IC_SHIFT); 1043 mci->mci_picache_line_size = 64; /* 64 Byte */ 1044 1045 mci->mci_pdcache_size = MIPS4_CONFIG_CACHE_SIZE(config, 1046 MIPS4_CONFIG_DC_MASK, csizebase, MIPS4_CONFIG_DC_SHIFT); 1047 mci->mci_pdcache_line_size = 32; /* 32 Byte */ 1048 1049 mci->mci_cache_alias_mask = 1050 ((mci->mci_pdcache_size / mci->mci_pdcache_ways) - 1) & ~PAGE_MASK; 1051 mci->mci_cache_prefer_mask = 1052 uimax(mci->mci_pdcache_size, mci->mci_picache_size) - 1; 1053 } 1054 #endif /* ENABLE_MIPS4_CACHE_R10K */ 1055 #endif /* MIPS3 || MIPS4 */ 1056 #endif /* MIPS1 || MIPS3 || MIPS4 */ 1057 1058 #if (MIPS32 + MIPS32R2 + MIPS64 + MIPS64R2) > 0 1059 1060 static void 1061 mips_config_cache_modern(uint32_t cpu_id) 1062 { 1063 struct mips_cache_info * const mci = &mips_cache_info; 1064 struct mips_cache_ops * const mco = &mips_cache_ops; 1065 struct mips_options * const opts = &mips_options; 1066 /* MIPS32/MIPS64, use coprocessor 0 config registers */ 1067 uint32_t cfg, cfg1; 1068 1069 cfg = mips3_cp0_config_read(); 1070 cfg1 = mipsNN_cp0_config1_read(); 1071 1072 #ifdef MIPS_DISABLE_L1_CACHE 1073 cfg1 &= ~MIPSNN_CFG1_IL_MASK; 1074 cfg1 &= ~MIPSNN_CFG1_DL_MASK; 1075 mipsNN_cp0_config1_write(cfg1); 1076 #endif 1077 1078 /* figure out Dcache params. */ 1079 switch (MIPSNN_GET(CFG1_DL, cfg1)) { 1080 case MIPSNN_CFG1_DL_NONE: 1081 mci->mci_pdcache_line_size = mci->mci_pdcache_way_size = 1082 mci->mci_pdcache_ways = 0; 1083 #ifdef MIPS64_OCTEON 1084 if (MIPS_PRID_CID(cpu_id) == MIPS_PRID_CID_CAVIUM) { 1085 /* 1086 * Set the cache line size here, remaining Octeon 1087 * cache configuration will be done below. 1088 */ 1089 mci->mci_pdcache_line_size = OCTEON_CACHELINE_SIZE; 1090 } 1091 #endif /* MIPS64_OCTEON */ 1092 break; 1093 case MIPSNN_CFG1_DL_RSVD: 1094 panic("reserved MIPS32/64 Dcache line size"); 1095 break; 1096 default: 1097 if (MIPSNN_GET(CFG1_DS, cfg1) == MIPSNN_CFG1_DS_RSVD) 1098 panic("reserved MIPS32/64 Dcache sets per way"); 1099 mci->mci_pdcache_line_size = MIPSNN_CFG1_DL(cfg1); 1100 mci->mci_pdcache_way_size = 1101 mci->mci_pdcache_line_size * MIPSNN_CFG1_DS(cfg1); 1102 mci->mci_pdcache_ways = MIPSNN_CFG1_DA(cfg1) + 1; 1103 1104 /* 1105 * Compute the total size and "way mask" for the 1106 * primary Dcache. 1107 */ 1108 mci->mci_pdcache_size = 1109 mci->mci_pdcache_way_size * mci->mci_pdcache_ways; 1110 mci->mci_pdcache_way_mask = mci->mci_pdcache_way_size - 1; 1111 uvmexp.ncolors = atop(mci->mci_pdcache_way_size); 1112 break; 1113 } 1114 1115 /* figure out Icache params. */ 1116 switch (MIPSNN_GET(CFG1_IL, cfg1)) { 1117 case MIPSNN_CFG1_IL_NONE: 1118 mci->mci_picache_line_size = mci->mci_picache_way_size = 1119 mci->mci_picache_ways = 0; 1120 break; 1121 case MIPSNN_CFG1_IL_RSVD: 1122 panic("reserved MIPS32/64 Icache line size"); 1123 break; 1124 default: 1125 if (MIPSNN_GET(CFG1_IS, cfg1) == MIPSNN_CFG1_IS_RSVD) 1126 panic("reserved MIPS32/64 Icache sets per way"); 1127 mci->mci_picache_line_size = MIPSNN_CFG1_IL(cfg1); 1128 mci->mci_picache_way_size = 1129 mci->mci_picache_line_size * MIPSNN_CFG1_IS(cfg1); 1130 mci->mci_picache_ways = MIPSNN_CFG1_IA(cfg1) + 1; 1131 1132 /* 1133 * Is this Icache virtually indexed and virtually tagged? 1134 */ 1135 mci->mci_picache_vivt = (cfg & MIPSNN_CFG_VI) != 0; 1136 1137 /* 1138 * Compute the total size and "way mask" for the 1139 * primary Icache. 1140 */ 1141 mci->mci_picache_size = 1142 mci->mci_picache_way_size * mci->mci_picache_ways; 1143 mci->mci_picache_way_mask = mci->mci_picache_way_size - 1; 1144 break; 1145 } 1146 1147 mco->mco_icache_sync_all = mipsNN_picache_sync_all; 1148 mco->mco_icache_sync_range = mipsNN_picache_sync_range; 1149 mco->mco_icache_sync_range_index = mipsNN_picache_sync_range_index; 1150 1151 switch (mci->mci_picache_line_size) { 1152 #ifdef MIPS_DISABLE_L1_CACHE 1153 case 0: 1154 mco->mco_icache_sync_all = no_cache_op; 1155 mco->mco_icache_sync_range = no_cache_op_range; 1156 mco->mco_icache_sync_range_index = no_cache_op_range_index; 1157 break; 1158 #endif 1159 case 16: 1160 /* used internally by mipsNN_picache_sync_range */ 1161 mco->mco_intern_icache_sync_range = 1162 cache_r4k_icache_hit_inv_16; 1163 1164 /* used internally by mipsNN_picache_sync_range_index */ 1165 mco->mco_intern_icache_sync_range_index = 1166 cache_r4k_icache_index_inv_16; 1167 break; 1168 case 32: 1169 /* used internally by mipsNN_picache_sync_range */ 1170 mco->mco_intern_icache_sync_range = 1171 cache_r4k_icache_hit_inv_32; 1172 1173 /* used internally by mipsNN_picache_sync_range_index */ 1174 mco->mco_intern_icache_sync_range_index = 1175 cache_r4k_icache_index_inv_32; 1176 break; 1177 case 64: 1178 /* used internally by mipsNN_picache_sync_range */ 1179 mco->mco_intern_icache_sync_range = 1180 cache_r4k_icache_hit_inv_64; 1181 1182 /* used internally by mipsNN_picache_sync_range_index */ 1183 mco->mco_intern_icache_sync_range_index = 1184 cache_r4k_icache_index_inv_64; 1185 break; 1186 case 128: 1187 /* used internally by mipsNN_picache_sync_range */ 1188 mco->mco_intern_icache_sync_range = 1189 cache_r4k_icache_hit_inv_128; 1190 1191 /* used internally by mipsNN_picache_sync_range_index */ 1192 mco->mco_intern_icache_sync_range_index = 1193 cache_r4k_icache_index_inv_128; 1194 break; 1195 default: 1196 panic("no Icache ops for %dB lines", 1197 mci->mci_picache_line_size); 1198 } 1199 1200 mco->mco_pdcache_wbinv_all = mipsNN_pdcache_wbinv_all; 1201 mco->mco_pdcache_wbinv_range_index = mipsNN_pdcache_wbinv_range_index; 1202 1203 switch (mci->mci_pdcache_line_size) { 1204 #ifdef MIPS_DISABLE_L1_CACHE 1205 case 0: 1206 mco->mco_pdcache_wbinv_all = no_cache_op; 1207 mco->mco_pdcache_wbinv_range = no_cache_op_range; 1208 mco->mco_pdcache_wbinv_range_index = no_cache_op_index; 1209 mco->mco_pdcache_inv_range = no_cache_op_range; 1210 mco->mco_pdcache_wb_range = no_cache_op_range; 1211 break; 1212 #endif 1213 case 16: 1214 mco->mco_pdcache_wbinv_range = 1215 cache_r4k_pdcache_hit_wb_inv_16; 1216 mco->mco_pdcache_inv_range = 1217 cache_r4k_pdcache_hit_inv_16; 1218 mco->mco_pdcache_wb_range = 1219 cache_r4k_pdcache_hit_wb_16; 1220 1221 /* used internally by mipsNN_pdcache_wbinv_range_index */ 1222 mco->mco_intern_pdcache_wbinv_range_index = 1223 cache_r4k_pdcache_index_wb_inv_16; 1224 break; 1225 case 32: 1226 mco->mco_pdcache_wbinv_range = 1227 cache_r4k_pdcache_hit_wb_inv_32; 1228 mco->mco_pdcache_inv_range = 1229 cache_r4k_pdcache_hit_inv_32; 1230 mco->mco_pdcache_wb_range = 1231 cache_r4k_pdcache_hit_wb_32; 1232 1233 /* used internally by mipsNN_pdcache_wbinv_range_index */ 1234 mco->mco_intern_pdcache_wbinv_range_index = 1235 cache_r4k_pdcache_index_wb_inv_32; 1236 break; 1237 case 64: 1238 mco->mco_pdcache_wbinv_range = 1239 cache_r4k_pdcache_hit_wb_inv_64; 1240 mco->mco_pdcache_inv_range = 1241 cache_r4k_pdcache_hit_inv_64; 1242 mco->mco_pdcache_wb_range = 1243 cache_r4k_pdcache_hit_wb_64; 1244 1245 /* used internally by mipsNN_pdcache_wbinv_range_index */ 1246 mco->mco_intern_pdcache_wbinv_range_index = 1247 cache_r4k_pdcache_index_wb_inv_64; 1248 case 128: 1249 mco->mco_pdcache_wbinv_range = 1250 cache_r4k_pdcache_hit_wb_inv_128; 1251 mco->mco_pdcache_inv_range = 1252 cache_r4k_pdcache_hit_inv_128; 1253 mco->mco_pdcache_wb_range = 1254 cache_r4k_pdcache_hit_wb_128; 1255 1256 /* used internally by mipsNN_pdcache_wbinv_range_index */ 1257 mco->mco_intern_pdcache_wbinv_range_index = 1258 cache_r4k_pdcache_index_wb_inv_128; 1259 break; 1260 default: 1261 panic("no Dcache ops for %dB lines", 1262 mci->mci_pdcache_line_size); 1263 } 1264 1265 mco->mco_intern_pdcache_sync_all = mco->mco_pdcache_wbinv_all; 1266 mco->mco_intern_pdcache_sync_range_index = 1267 mco->mco_intern_pdcache_wbinv_range_index; 1268 mco->mco_intern_pdcache_sync_range = mco->mco_pdcache_wb_range; 1269 1270 if (MIPSNN_CFG1_M & cfg1) { 1271 uint32_t cfg2 = mipsNN_cp0_config2_read(); 1272 1273 switch (MIPSNN_GET(CFG2_SL, cfg2)) { 1274 case MIPSNN_CFG2_SL_NONE: 1275 break; 1276 default: 1277 mci->mci_scache_unified = true; 1278 1279 mci->mci_sdcache_line_size = MIPSNN_CFG2_SL(cfg2); 1280 mci->mci_sdcache_way_size = 1281 mci->mci_sdcache_line_size * MIPSNN_CFG2_SS(cfg2); 1282 mci->mci_sdcache_ways = MIPSNN_CFG2_SA(cfg2) + 1; 1283 1284 /* 1285 * Compute the total size and "way mask" for the 1286 * secondary Dcache. 1287 */ 1288 mci->mci_sdcache_size = 1289 mci->mci_sdcache_way_size * mci->mci_sdcache_ways; 1290 mci->mci_sdcache_way_mask = 1291 mci->mci_sdcache_way_size - 1; 1292 1293 /* 1294 * cache is unified so copy data info to inst info. 1295 */ 1296 mci->mci_sicache_line_size = mci->mci_sdcache_line_size; 1297 mci->mci_sicache_way_size = mci->mci_sdcache_way_size; 1298 mci->mci_sicache_ways = mci->mci_sdcache_ways; 1299 mci->mci_sicache_size = mci->mci_sdcache_size; 1300 mci->mci_sicache_way_mask = mci->mci_sdcache_way_mask; 1301 1302 break; 1303 } 1304 1305 /* 1306 * Note we don't set up any sd cache ops because we expect that 1307 * the coherence checks below will overwrite them with no ops. 1308 */ 1309 1310 switch (MIPSNN_GET(CFG2_TL, cfg2)) { 1311 case MIPSNN_CFG2_TL_NONE: 1312 break; 1313 default: 1314 mci->mci_tcache_line_size = MIPSNN_CFG2_TL(cfg2); 1315 mci->mci_tcache_way_size = 1316 mci->mci_tcache_line_size * MIPSNN_CFG2_TS(cfg2); 1317 mci->mci_tcache_ways = MIPSNN_CFG2_TA(cfg2) + 1; 1318 1319 /* 1320 * Compute the total size and "way mask" for the 1321 * secondary Dcache. 1322 */ 1323 mci->mci_tcache_size = 1324 mci->mci_tcache_way_size * mci->mci_tcache_ways; 1325 mci->mci_tcache_way_mask = 1326 mci->mci_tcache_way_size - 1; 1327 break; 1328 } 1329 } 1330 1331 /* 1332 * calculate the alias masks and from them set to virtual alias flags. 1333 */ 1334 mci->mci_cache_alias_mask = mci->mci_pdcache_way_mask & -PAGE_SIZE; 1335 mci->mci_cache_virtual_alias = (mci->mci_cache_alias_mask != 0); 1336 1337 mci->mci_icache_alias_mask = mci->mci_picache_way_mask & -PAGE_SIZE; 1338 mci->mci_icache_virtual_alias = (mci->mci_icache_alias_mask != 0); 1339 1340 /* 1341 * Core specific overrides 1342 */ 1343 switch (MIPS_PRID_CID(cpu_id)) { 1344 case MIPS_PRID_CID_MTI: 1345 /* 1346 * All MTI cores share a (mostly) common config7 definition. 1347 * Use it to determine if the caches have virtual aliases. 1348 * If the core doesn't have a config7 register, its caches 1349 * are too small or have too many ways to have aliases. 1350 */ 1351 if (opts->mips_cpu->cpu_cp0flags & MIPS_CP0FL_CONFIG7) { 1352 const uint32_t cfg7 = mipsNN_cp0_config7_read(); 1353 if (cfg7 & MIPSNN_MTI_CFG7_AR) { 1354 /* [Data] Alias Removal Present */ 1355 mci->mci_cache_virtual_alias = false; 1356 } 1357 if (cfg7 & MIPSNN_MTI_CFG7_IAR) { 1358 /* Instruction Alias Removal Present */ 1359 mci->mci_icache_virtual_alias = false; 1360 } 1361 #if 0 1362 } else { 1363 KASSERT(mci->mci_pdcache_way_size <= PAGE_SIZE); 1364 KASSERT(mci->mci_picache_way_size <= PAGE_SIZE); 1365 #endif 1366 } 1367 break; 1368 case MIPS_PRID_CID_RMI: 1369 /* 1370 * RMI (NetLogic/Broadcom) don't support WB (op 6) 1371 * so we have to make do with WBINV (op 5). This is 1372 * merely for correctness since because the caches are 1373 * coherent, these routines will become noops in a bit. 1374 */ 1375 mco->mco_pdcache_wb_range = mco->mco_pdcache_wbinv_range; 1376 mco->mco_intern_pdcache_sync_range = 1377 mco->mco_pdcache_wbinv_range; 1378 if (MIPSNN_GET(CFG_AR, cfg) == MIPSNN_CFG_AR_REV2) { 1379 mci->mci_pdcache_write_through = true; 1380 mci->mci_sdcache_write_through = false; 1381 KASSERT(PAGE_SIZE >= mci->mci_picache_way_size 1382 || MIPS_ICACHE_VIRTUAL_ALIAS); 1383 } else { 1384 KASSERT(MIPS_CACHE_VIRTUAL_ALIAS == 0); 1385 KASSERT(MIPS_ICACHE_VIRTUAL_ALIAS == 0); 1386 } 1387 break; 1388 #ifdef MIPS64_OCTEON 1389 case MIPS_PRID_CID_CAVIUM: 1390 /* 1391 * Cavium Octeon cores have cache configurations that aren't 1392 * describable using the standard MIPS configN definitions. 1393 */ 1394 switch (MIPS_PRID_IMPL(cpu_id)) { 1395 case MIPS_CN38XX: 1396 case MIPS_CN31XX: 1397 case MIPS_CN30XX: 1398 case MIPS_CN50XX: 1399 case MIPS_CN52XX: 1400 case MIPS_CN58XX: 1401 case MIPS_CN56XX: 1402 /* OCTEON and OCTEON Plus */ 1403 1404 /* Dcache on cnMIPS core doesn't follow spec */ 1405 mci->mci_pdcache_line_size = OCTEON_CACHELINE_SIZE; 1406 mci->mci_pdcache_ways = OCTEON_I_DCACHE_WAYS; 1407 mci->mci_pdcache_way_size = 1408 OCTEON_I_DCACHE_SETS * OCTEON_CACHELINE_SIZE; 1409 mci->mci_pdcache_write_through = true; 1410 1411 /* Icache on cnMIPS core does follows MIPS spec */ 1412 1413 break; 1414 1415 /* XXX cnMIPS II cores not yet tested */ 1416 case MIPS_CN61XX: 1417 case MIPS_CN63XX: 1418 case MIPS_CN66XX: 1419 case MIPS_CN68XX: 1420 case MIPS_CNF71XX: 1421 /* OCTEON II */ 1422 1423 mci->mci_pdcache_line_size = OCTEON_CACHELINE_SIZE; 1424 mci->mci_pdcache_ways = OCTEON_II_DCACHE_WAYS; 1425 mci->mci_pdcache_way_size = 1426 OCTEON_II_DCACHE_SETS * OCTEON_CACHELINE_SIZE; 1427 mci->mci_pdcache_write_through = true; 1428 1429 mci->mci_picache_line_size = OCTEON_CACHELINE_SIZE; 1430 mci->mci_picache_ways = OCTEON_II_ICACHE_WAYS; 1431 mci->mci_picache_way_size = 1432 OCTEON_II_ICACHE_SETS * OCTEON_CACHELINE_SIZE; 1433 break; 1434 1435 case MIPS_CN70XX: 1436 case MIPS_CN73XX: 1437 case MIPS_CNF75XX: 1438 case MIPS_CN78XX: 1439 /* OCTEON III */ 1440 1441 mci->mci_pdcache_line_size = OCTEON_CACHELINE_SIZE; 1442 mci->mci_pdcache_ways = OCTEON_III_DCACHE_WAYS; 1443 mci->mci_pdcache_way_size = 1444 OCTEON_CACHELINE_SIZE * OCTEON_III_DCACHE_SETS; 1445 mci->mci_pdcache_write_through = true; 1446 1447 mci->mci_picache_line_size = OCTEON_CACHELINE_SIZE; 1448 mci->mci_picache_ways = OCTEON_III_ICACHE_WAYS; 1449 mci->mci_picache_way_size = 1450 OCTEON_CACHELINE_SIZE * OCTEON_III_ICACHE_SETS; 1451 break; 1452 1453 default: 1454 panic("Unknown Octeon Cavium core impl %#x", 1455 MIPS_PRID_IMPL(cpu_id)); 1456 } 1457 1458 /* recalculate dcache params */ 1459 mci->mci_pdcache_size = 1460 mci->mci_pdcache_way_size * mci->mci_pdcache_ways; 1461 mci->mci_pdcache_way_mask = mci->mci_pdcache_way_size - 1; 1462 uvmexp.ncolors = 1463 atop(mci->mci_pdcache_size) / mci->mci_pdcache_ways; 1464 1465 /* recalculate icache params */ 1466 mci->mci_picache_size = 1467 mci->mci_picache_way_size * mci->mci_picache_ways; 1468 mci->mci_picache_way_mask = mci->mci_picache_way_size - 1; 1469 1470 /* recalculate the alias masks */ 1471 mci->mci_cache_alias_mask = 1472 mci->mci_pdcache_way_mask & -PAGE_SIZE; 1473 mci->mci_cache_virtual_alias = 1474 (mci->mci_cache_alias_mask != 0); 1475 1476 mci->mci_icache_alias_mask = 1477 mci->mci_picache_way_mask & -PAGE_SIZE; 1478 mci->mci_icache_virtual_alias = 1479 (mci->mci_icache_alias_mask != 0); 1480 1481 /* use Octeon-specific cache ops */ 1482 mco->mco_icache_sync_all = octeon_icache_sync_all; 1483 mco->mco_icache_sync_range = octeon_icache_sync_range; 1484 mco->mco_icache_sync_range_index = 1485 octeon_icache_sync_range_index; 1486 1487 mco->mco_pdcache_wbinv_all = octeon_pdcache_inv_all; 1488 mco->mco_pdcache_wbinv_range = octeon_pdcache_inv_range; 1489 mco->mco_pdcache_wbinv_range_index = 1490 octeon_pdcache_inv_range_index; 1491 mco->mco_pdcache_inv_range = octeon_pdcache_inv_range; 1492 mco->mco_pdcache_wb_range = no_cache_op_range; 1493 #endif /* MIPS64_OCTEON */ 1494 } 1495 1496 #define CACHE_DEBUG 1497 #ifdef CACHE_DEBUG 1498 printf("MIPS32/64 params: cpu arch: %d\n", opts->mips_cpu_arch); 1499 printf("MIPS32/64 params: TLB entries: %d\n", opts->mips_num_tlb_entries); 1500 if (mci->mci_picache_line_size == 0) { 1501 printf("MIPS32/64 params: no Icache\n"); 1502 } else { 1503 printf("MIPS32/64 params: %s: line=%d, total=%d, " 1504 "ways=%d, sets=%d, colors=%d\n", "Icache", 1505 mci->mci_picache_line_size, 1506 mci->mci_picache_way_size * mci->mci_picache_ways, 1507 mci->mci_picache_ways, 1508 mci->mci_picache_way_size / mci->mci_picache_line_size, 1509 mci->mci_picache_way_size >> PAGE_SHIFT); 1510 } 1511 if (mci->mci_pdcache_line_size == 0) { 1512 printf("MIPS32/64 params: no Dcache\n"); 1513 } else { 1514 printf("MIPS32/64 params: %s: line=%d, total=%d, " 1515 "ways=%d, sets=%d, colors=%d\n", "Dcache", 1516 mci->mci_pdcache_line_size, 1517 mci->mci_pdcache_way_size * mci->mci_pdcache_ways, 1518 mci->mci_pdcache_ways, 1519 mci->mci_pdcache_way_size / mci->mci_pdcache_line_size, 1520 mci->mci_pdcache_way_size >> PAGE_SHIFT); 1521 } 1522 if (mci->mci_sdcache_line_size != 0) { 1523 printf("MIPS32/64 params: %s: line=%d, total=%d, " 1524 "ways=%d, sets=%d, colors=%d\n", "SDcache", 1525 mci->mci_sdcache_line_size, 1526 mci->mci_sdcache_way_size * mci->mci_sdcache_ways, 1527 mci->mci_sdcache_ways, 1528 mci->mci_sdcache_way_size / mci->mci_sdcache_line_size, 1529 mci->mci_sdcache_way_size >> PAGE_SHIFT); 1530 } 1531 #endif /* CACHE_DEBUG */ 1532 1533 mipsNN_cache_init(cfg, cfg1); 1534 1535 if (opts->mips_cpu_flags & 1536 (CPU_MIPS_D_CACHE_COHERENT | CPU_MIPS_I_D_CACHE_COHERENT)) { 1537 #ifdef CACHE_DEBUG 1538 printf(" Dcache is coherent\n"); 1539 #endif 1540 mco->mco_pdcache_wbinv_all = no_cache_op; 1541 mco->mco_pdcache_wbinv_range = no_cache_op_range; 1542 mco->mco_pdcache_wbinv_range_index = no_cache_op_range_index; 1543 mco->mco_pdcache_inv_range = no_cache_op_range; 1544 mco->mco_pdcache_wb_range = no_cache_op_range; 1545 mco->mco_sdcache_wbinv_all = no_cache_op; 1546 mco->mco_sdcache_wbinv_range = no_cache_op_range; 1547 mco->mco_sdcache_wbinv_range_index = no_cache_op_range_index; 1548 mco->mco_sdcache_inv_range = no_cache_op_range; 1549 mco->mco_sdcache_wb_range = no_cache_op_range; 1550 } 1551 if (opts->mips_cpu_flags & CPU_MIPS_I_D_CACHE_COHERENT) { 1552 #ifdef CACHE_DEBUG 1553 printf(" Icache is coherent against Dcache\n"); 1554 #endif 1555 mco->mco_intern_pdcache_sync_all = no_cache_op; 1556 mco->mco_intern_pdcache_sync_range_index = 1557 no_cache_op_range_index; 1558 mco->mco_intern_pdcache_sync_range = no_cache_op_range; 1559 } 1560 1561 mips_dcache_compute_align(); 1562 } 1563 #endif /* MIPS32 + MIPS32R2 + MIPS64 + MIPS64R2 > 0 */ 1564