@@ -412,14 +412,18 @@ void __init initialize_cache_info(void)
412
412
* d-cache and i-cache sizes... -Peter
413
413
*/
414
414
if (num_cpus == 1 ) {
415
- const __be32 * sizep , * lsizep , * bsizep ;
416
- u32 size , lsize , bsize ;
415
+ const __be32 * sizep , * lsizep , * bsizep , * setsp ;
416
+ u32 size , lsize , bsize , sets ;
417
417
418
418
size = 0 ;
419
+ sets = -1u ;
419
420
lsize = bsize = cur_cpu_spec -> dcache_bsize ;
420
421
sizep = of_get_property (np , "d-cache-size" , NULL );
421
422
if (sizep != NULL )
422
423
size = be32_to_cpu (* sizep );
424
+ setsp = of_get_property (np , "d-cache-sets" , NULL );
425
+ if (setsp != NULL )
426
+ sets = be32_to_cpu (* setsp );
423
427
bsizep = of_get_property (np , "d-cache-block-size" ,
424
428
NULL );
425
429
lsizep = of_get_property (np , "d-cache-line-size" ,
@@ -435,17 +439,32 @@ void __init initialize_cache_info(void)
435
439
"sizep: %p, bsizep: %p, lsizep: %p\n" ,
436
440
sizep , bsizep , lsizep );
437
441
442
+ /*
443
+ * OF is weird .. it represents fully associative caches
444
+ * as "1 way" which doesn't make much sense and doesn't
445
+ * leave room for direct mapped. We'll assume that 0
446
+ * in OF means direct mapped for that reason.
447
+ */
448
+ if (sets == 1 )
449
+ sets = 0 ;
450
+ else if (sets == 0 )
451
+ sets = 1 ;
438
452
ppc64_caches .dsize = size ;
453
+ ppc64_caches .dsets = sets ;
439
454
ppc64_caches .dline_size = lsize ;
440
455
ppc64_caches .dblock_size = bsize ;
441
456
ppc64_caches .log_dblock_size = __ilog2 (bsize );
442
457
ppc64_caches .dblocks_per_page = PAGE_SIZE / bsize ;
443
458
444
459
size = 0 ;
460
+ sets = -1u ;
445
461
lsize = bsize = cur_cpu_spec -> icache_bsize ;
446
462
sizep = of_get_property (np , "i-cache-size" , NULL );
447
463
if (sizep != NULL )
448
464
size = be32_to_cpu (* sizep );
465
+ setsp = of_get_property (np , "i-cache-sets" , NULL );
466
+ if (setsp != NULL )
467
+ sets = be32_to_cpu (* setsp );
449
468
bsizep = of_get_property (np , "i-cache-block-size" ,
450
469
NULL );
451
470
lsizep = of_get_property (np , "i-cache-line-size" ,
@@ -461,7 +480,12 @@ void __init initialize_cache_info(void)
461
480
"sizep: %p, bsizep: %p, lsizep: %p\n" ,
462
481
sizep , bsizep , lsizep );
463
482
483
+ if (sets == 1 )
484
+ sets = 0 ;
485
+ else if (sets == 0 )
486
+ sets = 1 ;
464
487
ppc64_caches .isize = size ;
488
+ ppc64_caches .isets = sets ;
465
489
ppc64_caches .iline_size = lsize ;
466
490
ppc64_caches .iblock_size = bsize ;
467
491
ppc64_caches .log_iblock_size = __ilog2 (bsize );
0 commit comments