aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-11-06 22:42:09 -0500
committerPaul Mackerras <paulus@samba.org>2005-11-06 22:42:09 -0500
commitc6135234550ed89a6fd0e8cb229633967e41d649 (patch)
tree22cef33e314839c4fb30d6fc888c0caa2a0f6602 /arch/ppc64/kernel
parent76032de898f34db55b5048349db56557828a1390 (diff)
parent0b154bb7d0cce80e9c0bcf11d4f9e71b59409d26 (diff)
Merge ../linux-2.6
Diffstat (limited to 'arch/ppc64/kernel')
-rw-r--r--arch/ppc64/kernel/asm-offsets.c3
-rw-r--r--arch/ppc64/kernel/head.S300
-rw-r--r--arch/ppc64/kernel/pacaData.c2
-rw-r--r--arch/ppc64/kernel/prom.c94
4 files changed, 260 insertions, 139 deletions
diff --git a/arch/ppc64/kernel/asm-offsets.c b/arch/ppc64/kernel/asm-offsets.c
index 504dee836d29..bce9065da6cb 100644
--- a/arch/ppc64/kernel/asm-offsets.c
+++ b/arch/ppc64/kernel/asm-offsets.c
@@ -93,6 +93,9 @@ int main(void)
93 DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache)); 93 DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache));
94 DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr)); 94 DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr));
95 DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); 95 DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id));
96#ifdef CONFIG_PPC_64K_PAGES
97 DEFINE(PACAPGDIR, offsetof(struct paca_struct, pgdir));
98#endif
96#ifdef CONFIG_HUGETLB_PAGE 99#ifdef CONFIG_HUGETLB_PAGE
97 DEFINE(PACALOWHTLBAREAS, offsetof(struct paca_struct, context.low_htlb_areas)); 100 DEFINE(PACALOWHTLBAREAS, offsetof(struct paca_struct, context.low_htlb_areas));
98 DEFINE(PACAHIGHHTLBAREAS, offsetof(struct paca_struct, context.high_htlb_areas)); 101 DEFINE(PACAHIGHHTLBAREAS, offsetof(struct paca_struct, context.high_htlb_areas));
diff --git a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S
index db1cf397be2d..9e8050ea1225 100644
--- a/arch/ppc64/kernel/head.S
+++ b/arch/ppc64/kernel/head.S
@@ -195,11 +195,11 @@ exception_marker:
195#define EX_R12 24 195#define EX_R12 24
196#define EX_R13 32 196#define EX_R13 32
197#define EX_SRR0 40 197#define EX_SRR0 40
198#define EX_R3 40 /* SLB miss saves R3, but not SRR0 */
199#define EX_DAR 48 198#define EX_DAR 48
200#define EX_LR 48 /* SLB miss saves LR, but not DAR */
201#define EX_DSISR 56 199#define EX_DSISR 56
202#define EX_CCR 60 200#define EX_CCR 60
201#define EX_R3 64
202#define EX_LR 72
203 203
204#define EXCEPTION_PROLOG_PSERIES(area, label) \ 204#define EXCEPTION_PROLOG_PSERIES(area, label) \
205 mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ 205 mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
@@ -419,17 +419,22 @@ data_access_slb_pSeries:
419 mtspr SPRN_SPRG1,r13 419 mtspr SPRN_SPRG1,r13
420 RUNLATCH_ON(r13) 420 RUNLATCH_ON(r13)
421 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ 421 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */
422 std r3,PACA_EXSLB+EX_R3(r13)
423 mfspr r3,SPRN_DAR
422 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ 424 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
425 mfcr r9
426#ifdef __DISABLED__
427 /* Keep that around for when we re-implement dynamic VSIDs */
428 cmpdi r3,0
429 bge slb_miss_user_pseries
430#endif /* __DISABLED__ */
423 std r10,PACA_EXSLB+EX_R10(r13) 431 std r10,PACA_EXSLB+EX_R10(r13)
424 std r11,PACA_EXSLB+EX_R11(r13) 432 std r11,PACA_EXSLB+EX_R11(r13)
425 std r12,PACA_EXSLB+EX_R12(r13) 433 std r12,PACA_EXSLB+EX_R12(r13)
426 std r3,PACA_EXSLB+EX_R3(r13) 434 mfspr r10,SPRN_SPRG1
427 mfspr r9,SPRN_SPRG1 435 std r10,PACA_EXSLB+EX_R13(r13)
428 std r9,PACA_EXSLB+EX_R13(r13)
429 mfcr r9
430 mfspr r12,SPRN_SRR1 /* and SRR1 */ 436 mfspr r12,SPRN_SRR1 /* and SRR1 */
431 mfspr r3,SPRN_DAR 437 b .slb_miss_realmode /* Rel. branch works in real mode */
432 b .do_slb_miss /* Rel. branch works in real mode */
433 438
434 STD_EXCEPTION_PSERIES(0x400, instruction_access) 439 STD_EXCEPTION_PSERIES(0x400, instruction_access)
435 440
@@ -440,17 +445,22 @@ instruction_access_slb_pSeries:
440 mtspr SPRN_SPRG1,r13 445 mtspr SPRN_SPRG1,r13
441 RUNLATCH_ON(r13) 446 RUNLATCH_ON(r13)
442 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ 447 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */
448 std r3,PACA_EXSLB+EX_R3(r13)
449 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
443 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ 450 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
451 mfcr r9
452#ifdef __DISABLED__
453 /* Keep that around for when we re-implement dynamic VSIDs */
454 cmpdi r3,0
455 bge slb_miss_user_pseries
456#endif /* __DISABLED__ */
444 std r10,PACA_EXSLB+EX_R10(r13) 457 std r10,PACA_EXSLB+EX_R10(r13)
445 std r11,PACA_EXSLB+EX_R11(r13) 458 std r11,PACA_EXSLB+EX_R11(r13)
446 std r12,PACA_EXSLB+EX_R12(r13) 459 std r12,PACA_EXSLB+EX_R12(r13)
447 std r3,PACA_EXSLB+EX_R3(r13) 460 mfspr r10,SPRN_SPRG1
448 mfspr r9,SPRN_SPRG1 461 std r10,PACA_EXSLB+EX_R13(r13)
449 std r9,PACA_EXSLB+EX_R13(r13)
450 mfcr r9
451 mfspr r12,SPRN_SRR1 /* and SRR1 */ 462 mfspr r12,SPRN_SRR1 /* and SRR1 */
452 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 463 b .slb_miss_realmode /* Rel. branch works in real mode */
453 b .do_slb_miss /* Rel. branch works in real mode */
454 464
455 STD_EXCEPTION_PSERIES(0x500, hardware_interrupt) 465 STD_EXCEPTION_PSERIES(0x500, hardware_interrupt)
456 STD_EXCEPTION_PSERIES(0x600, alignment) 466 STD_EXCEPTION_PSERIES(0x600, alignment)
@@ -509,6 +519,38 @@ _GLOBAL(do_stab_bolted_pSeries)
509 EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted) 519 EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted)
510 520
511/* 521/*
522 * We have some room here we use that to put
523 * the peries slb miss user trampoline code so it's reasonably
524 * away from slb_miss_user_common to avoid problems with rfid
525 *
526 * This is used for when the SLB miss handler has to go virtual,
527 * which doesn't happen for now anymore but will once we re-implement
528 * dynamic VSIDs for shared page tables
529 */
530#ifdef __DISABLED__
531slb_miss_user_pseries:
532 std r10,PACA_EXGEN+EX_R10(r13)
533 std r11,PACA_EXGEN+EX_R11(r13)
534 std r12,PACA_EXGEN+EX_R12(r13)
535 mfspr r10,SPRG1
536 ld r11,PACA_EXSLB+EX_R9(r13)
537 ld r12,PACA_EXSLB+EX_R3(r13)
538 std r10,PACA_EXGEN+EX_R13(r13)
539 std r11,PACA_EXGEN+EX_R9(r13)
540 std r12,PACA_EXGEN+EX_R3(r13)
541 clrrdi r12,r13,32
542 mfmsr r10
543 mfspr r11,SRR0 /* save SRR0 */
544 ori r12,r12,slb_miss_user_common@l /* virt addr of handler */
545 ori r10,r10,MSR_IR|MSR_DR|MSR_RI
546 mtspr SRR0,r12
547 mfspr r12,SRR1 /* and SRR1 */
548 mtspr SRR1,r10
549 rfid
550 b . /* prevent spec. execution */
551#endif /* __DISABLED__ */
552
553/*
512 * Vectors for the FWNMI option. Share common code. 554 * Vectors for the FWNMI option. Share common code.
513 */ 555 */
514 .globl system_reset_fwnmi 556 .globl system_reset_fwnmi
@@ -559,22 +601,59 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
559 .globl data_access_slb_iSeries 601 .globl data_access_slb_iSeries
560data_access_slb_iSeries: 602data_access_slb_iSeries:
561 mtspr SPRN_SPRG1,r13 /* save r13 */ 603 mtspr SPRN_SPRG1,r13 /* save r13 */
562 EXCEPTION_PROLOG_ISERIES_1(PACA_EXSLB) 604 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */
563 std r3,PACA_EXSLB+EX_R3(r13) 605 std r3,PACA_EXSLB+EX_R3(r13)
564 ld r12,PACALPPACA+LPPACASRR1(r13)
565 mfspr r3,SPRN_DAR 606 mfspr r3,SPRN_DAR
566 b .do_slb_miss 607 std r9,PACA_EXSLB+EX_R9(r13)
608 mfcr r9
609#ifdef __DISABLED__
610 cmpdi r3,0
611 bge slb_miss_user_iseries
612#endif
613 std r10,PACA_EXSLB+EX_R10(r13)
614 std r11,PACA_EXSLB+EX_R11(r13)
615 std r12,PACA_EXSLB+EX_R12(r13)
616 mfspr r10,SPRN_SPRG1
617 std r10,PACA_EXSLB+EX_R13(r13)
618 ld r12,PACALPPACA+LPPACASRR1(r13);
619 b .slb_miss_realmode
567 620
568 STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN) 621 STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN)
569 622
570 .globl instruction_access_slb_iSeries 623 .globl instruction_access_slb_iSeries
571instruction_access_slb_iSeries: 624instruction_access_slb_iSeries:
572 mtspr SPRN_SPRG1,r13 /* save r13 */ 625 mtspr SPRN_SPRG1,r13 /* save r13 */
573 EXCEPTION_PROLOG_ISERIES_1(PACA_EXSLB) 626 mfspr r13,SPRN_SPRG3 /* get paca address into r13 */
574 std r3,PACA_EXSLB+EX_R3(r13) 627 std r3,PACA_EXSLB+EX_R3(r13)
575 ld r12,PACALPPACA+LPPACASRR1(r13) 628 ld r3,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */
576 ld r3,PACALPPACA+LPPACASRR0(r13) 629 std r9,PACA_EXSLB+EX_R9(r13)
577 b .do_slb_miss 630 mfcr r9
631#ifdef __DISABLED__
632 cmpdi r3,0
633 bge .slb_miss_user_iseries
634#endif
635 std r10,PACA_EXSLB+EX_R10(r13)
636 std r11,PACA_EXSLB+EX_R11(r13)
637 std r12,PACA_EXSLB+EX_R12(r13)
638 mfspr r10,SPRN_SPRG1
639 std r10,PACA_EXSLB+EX_R13(r13)
640 ld r12,PACALPPACA+LPPACASRR1(r13);
641 b .slb_miss_realmode
642
643#ifdef __DISABLED__
644slb_miss_user_iseries:
645 std r10,PACA_EXGEN+EX_R10(r13)
646 std r11,PACA_EXGEN+EX_R11(r13)
647 std r12,PACA_EXGEN+EX_R12(r13)
648 mfspr r10,SPRG1
649 ld r11,PACA_EXSLB+EX_R9(r13)
650 ld r12,PACA_EXSLB+EX_R3(r13)
651 std r10,PACA_EXGEN+EX_R13(r13)
652 std r11,PACA_EXGEN+EX_R9(r13)
653 std r12,PACA_EXGEN+EX_R3(r13)
654 EXCEPTION_PROLOG_ISERIES_2
655 b slb_miss_user_common
656#endif
578 657
579 MASKABLE_EXCEPTION_ISERIES(0x500, hardware_interrupt) 658 MASKABLE_EXCEPTION_ISERIES(0x500, hardware_interrupt)
580 STD_EXCEPTION_ISERIES(0x600, alignment, PACA_EXGEN) 659 STD_EXCEPTION_ISERIES(0x600, alignment, PACA_EXGEN)
@@ -809,6 +888,126 @@ instruction_access_common:
809 li r5,0x400 888 li r5,0x400
810 b .do_hash_page /* Try to handle as hpte fault */ 889 b .do_hash_page /* Try to handle as hpte fault */
811 890
891/*
892 * Here is the common SLB miss user that is used when going to virtual
893 * mode for SLB misses, that is currently not used
894 */
895#ifdef __DISABLED__
896 .align 7
897 .globl slb_miss_user_common
898slb_miss_user_common:
899 mflr r10
900 std r3,PACA_EXGEN+EX_DAR(r13)
901 stw r9,PACA_EXGEN+EX_CCR(r13)
902 std r10,PACA_EXGEN+EX_LR(r13)
903 std r11,PACA_EXGEN+EX_SRR0(r13)
904 bl .slb_allocate_user
905
906 ld r10,PACA_EXGEN+EX_LR(r13)
907 ld r3,PACA_EXGEN+EX_R3(r13)
908 lwz r9,PACA_EXGEN+EX_CCR(r13)
909 ld r11,PACA_EXGEN+EX_SRR0(r13)
910 mtlr r10
911 beq- slb_miss_fault
912
913 andi. r10,r12,MSR_RI /* check for unrecoverable exception */
914 beq- unrecov_user_slb
915 mfmsr r10
916
917.machine push
918.machine "power4"
919 mtcrf 0x80,r9
920.machine pop
921
922 clrrdi r10,r10,2 /* clear RI before setting SRR0/1 */
923 mtmsrd r10,1
924
925 mtspr SRR0,r11
926 mtspr SRR1,r12
927
928 ld r9,PACA_EXGEN+EX_R9(r13)
929 ld r10,PACA_EXGEN+EX_R10(r13)
930 ld r11,PACA_EXGEN+EX_R11(r13)
931 ld r12,PACA_EXGEN+EX_R12(r13)
932 ld r13,PACA_EXGEN+EX_R13(r13)
933 rfid
934 b .
935
936slb_miss_fault:
937 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
938 ld r4,PACA_EXGEN+EX_DAR(r13)
939 li r5,0
940 std r4,_DAR(r1)
941 std r5,_DSISR(r1)
942 b .handle_page_fault
943
944unrecov_user_slb:
945 EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
946 DISABLE_INTS
947 bl .save_nvgprs
9481: addi r3,r1,STACK_FRAME_OVERHEAD
949 bl .unrecoverable_exception
950 b 1b
951
952#endif /* __DISABLED__ */
953
954
955/*
956 * r13 points to the PACA, r9 contains the saved CR,
957 * r12 contain the saved SRR1, SRR0 is still ready for return
958 * r3 has the faulting address
959 * r9 - r13 are saved in paca->exslb.
960 * r3 is saved in paca->slb_r3
961 * We assume we aren't going to take any exceptions during this procedure.
962 */
963_GLOBAL(slb_miss_realmode)
964 mflr r10
965
966 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
967 std r10,PACA_EXSLB+EX_LR(r13) /* save LR */
968
969 bl .slb_allocate_realmode
970
971 /* All done -- return from exception. */
972
973 ld r10,PACA_EXSLB+EX_LR(r13)
974 ld r3,PACA_EXSLB+EX_R3(r13)
975 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
976#ifdef CONFIG_PPC_ISERIES
977 ld r11,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */
978#endif /* CONFIG_PPC_ISERIES */
979
980 mtlr r10
981
982 andi. r10,r12,MSR_RI /* check for unrecoverable exception */
983 beq- unrecov_slb
984
985.machine push
986.machine "power4"
987 mtcrf 0x80,r9
988 mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
989.machine pop
990
991#ifdef CONFIG_PPC_ISERIES
992 mtspr SPRN_SRR0,r11
993 mtspr SPRN_SRR1,r12
994#endif /* CONFIG_PPC_ISERIES */
995 ld r9,PACA_EXSLB+EX_R9(r13)
996 ld r10,PACA_EXSLB+EX_R10(r13)
997 ld r11,PACA_EXSLB+EX_R11(r13)
998 ld r12,PACA_EXSLB+EX_R12(r13)
999 ld r13,PACA_EXSLB+EX_R13(r13)
1000 rfid
1001 b . /* prevent speculative execution */
1002
1003unrecov_slb:
1004 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
1005 DISABLE_INTS
1006 bl .save_nvgprs
10071: addi r3,r1,STACK_FRAME_OVERHEAD
1008 bl .unrecoverable_exception
1009 b 1b
1010
812 .align 7 1011 .align 7
813 .globl hardware_interrupt_common 1012 .globl hardware_interrupt_common
814 .globl hardware_interrupt_entry 1013 .globl hardware_interrupt_entry
@@ -1139,62 +1338,6 @@ _GLOBAL(do_stab_bolted)
1139 b . /* prevent speculative execution */ 1338 b . /* prevent speculative execution */
1140 1339
1141/* 1340/*
1142 * r13 points to the PACA, r9 contains the saved CR,
1143 * r11 and r12 contain the saved SRR0 and SRR1.
1144 * r3 has the faulting address
1145 * r9 - r13 are saved in paca->exslb.
1146 * r3 is saved in paca->slb_r3
1147 * We assume we aren't going to take any exceptions during this procedure.
1148 */
1149_GLOBAL(do_slb_miss)
1150 mflr r10
1151
1152 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
1153 std r10,PACA_EXSLB+EX_LR(r13) /* save LR */
1154
1155 bl .slb_allocate /* handle it */
1156
1157 /* All done -- return from exception. */
1158
1159 ld r10,PACA_EXSLB+EX_LR(r13)
1160 ld r3,PACA_EXSLB+EX_R3(r13)
1161 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
1162#ifdef CONFIG_PPC_ISERIES
1163 ld r11,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */
1164#endif /* CONFIG_PPC_ISERIES */
1165
1166 mtlr r10
1167
1168 andi. r10,r12,MSR_RI /* check for unrecoverable exception */
1169 beq- unrecov_slb
1170
1171.machine push
1172.machine "power4"
1173 mtcrf 0x80,r9
1174 mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
1175.machine pop
1176
1177#ifdef CONFIG_PPC_ISERIES
1178 mtspr SPRN_SRR0,r11
1179 mtspr SPRN_SRR1,r12
1180#endif /* CONFIG_PPC_ISERIES */
1181 ld r9,PACA_EXSLB+EX_R9(r13)
1182 ld r10,PACA_EXSLB+EX_R10(r13)
1183 ld r11,PACA_EXSLB+EX_R11(r13)
1184 ld r12,PACA_EXSLB+EX_R12(r13)
1185 ld r13,PACA_EXSLB+EX_R13(r13)
1186 rfid
1187 b . /* prevent speculative execution */
1188
1189unrecov_slb:
1190 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
1191 DISABLE_INTS
1192 bl .save_nvgprs
11931: addi r3,r1,STACK_FRAME_OVERHEAD
1194 bl .unrecoverable_exception
1195 b 1b
1196
1197/*
1198 * Space for CPU0's segment table. 1341 * Space for CPU0's segment table.
1199 * 1342 *
1200 * On iSeries, the hypervisor must fill in at least one entry before 1343 * On iSeries, the hypervisor must fill in at least one entry before
@@ -1569,7 +1712,10 @@ _GLOBAL(__secondary_start)
1569#endif 1712#endif
1570 /* Initialize the first segment table (or SLB) entry */ 1713 /* Initialize the first segment table (or SLB) entry */
1571 ld r3,PACASTABVIRT(r13) /* get addr of segment table */ 1714 ld r3,PACASTABVIRT(r13) /* get addr of segment table */
1715BEGIN_FTR_SECTION
1572 bl .stab_initialize 1716 bl .stab_initialize
1717END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
1718 bl .slb_initialize
1573 1719
1574 /* Initialize the kernel stack. Just a repeat for iSeries. */ 1720 /* Initialize the kernel stack. Just a repeat for iSeries. */
1575 LOADADDR(r3,current_set) 1721 LOADADDR(r3,current_set)
diff --git a/arch/ppc64/kernel/pacaData.c b/arch/ppc64/kernel/pacaData.c
index 5e27e5a6a35d..3133c72b28ec 100644
--- a/arch/ppc64/kernel/pacaData.c
+++ b/arch/ppc64/kernel/pacaData.c
@@ -23,7 +23,7 @@
23static union { 23static union {
24 struct systemcfg data; 24 struct systemcfg data;
25 u8 page[PAGE_SIZE]; 25 u8 page[PAGE_SIZE];
26} systemcfg_store __page_aligned; 26} systemcfg_store __attribute__((__section__(".data.page.aligned")));
27struct systemcfg *systemcfg = &systemcfg_store.data; 27struct systemcfg *systemcfg = &systemcfg_store.data;
28EXPORT_SYMBOL(systemcfg); 28EXPORT_SYMBOL(systemcfg);
29 29
diff --git a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
index a4cb97a25819..0e8961dea3bc 100644
--- a/arch/ppc64/kernel/prom.c
+++ b/arch/ppc64/kernel/prom.c
@@ -634,10 +634,10 @@ static inline char *find_flat_dt_string(u32 offset)
634 * used to extract the memory informations at boot before we can 634 * used to extract the memory informations at boot before we can
635 * unflatten the tree 635 * unflatten the tree
636 */ 636 */
637static int __init scan_flat_dt(int (*it)(unsigned long node, 637int __init of_scan_flat_dt(int (*it)(unsigned long node,
638 const char *uname, int depth, 638 const char *uname, int depth,
639 void *data), 639 void *data),
640 void *data) 640 void *data)
641{ 641{
642 unsigned long p = ((unsigned long)initial_boot_params) + 642 unsigned long p = ((unsigned long)initial_boot_params) +
643 initial_boot_params->off_dt_struct; 643 initial_boot_params->off_dt_struct;
@@ -694,8 +694,8 @@ static int __init scan_flat_dt(int (*it)(unsigned long node,
694 * This function can be used within scan_flattened_dt callback to get 694 * This function can be used within scan_flattened_dt callback to get
695 * access to properties 695 * access to properties
696 */ 696 */
697static void* __init get_flat_dt_prop(unsigned long node, const char *name, 697void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
698 unsigned long *size) 698 unsigned long *size)
699{ 699{
700 unsigned long p = node; 700 unsigned long p = node;
701 701
@@ -995,7 +995,7 @@ void __init unflatten_device_tree(void)
995static int __init early_init_dt_scan_cpus(unsigned long node, 995static int __init early_init_dt_scan_cpus(unsigned long node,
996 const char *uname, int depth, void *data) 996 const char *uname, int depth, void *data)
997{ 997{
998 char *type = get_flat_dt_prop(node, "device_type", NULL); 998 char *type = of_get_flat_dt_prop(node, "device_type", NULL);
999 u32 *prop; 999 u32 *prop;
1000 unsigned long size; 1000 unsigned long size;
1001 1001
@@ -1003,17 +1003,6 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
1003 if (type == NULL || strcmp(type, "cpu") != 0) 1003 if (type == NULL || strcmp(type, "cpu") != 0)
1004 return 0; 1004 return 0;
1005 1005
1006 /* On LPAR, look for the first ibm,pft-size property for the hash table size
1007 */
1008 if (systemcfg->platform == PLATFORM_PSERIES_LPAR && ppc64_pft_size == 0) {
1009 u32 *pft_size;
1010 pft_size = (u32 *)get_flat_dt_prop(node, "ibm,pft-size", NULL);
1011 if (pft_size != NULL) {
1012 /* pft_size[0] is the NUMA CEC cookie */
1013 ppc64_pft_size = pft_size[1];
1014 }
1015 }
1016
1017 if (initial_boot_params && initial_boot_params->version >= 2) { 1006 if (initial_boot_params && initial_boot_params->version >= 2) {
1018 /* version 2 of the kexec param format adds the phys cpuid 1007 /* version 2 of the kexec param format adds the phys cpuid
1019 * of booted proc. 1008 * of booted proc.
@@ -1022,8 +1011,9 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
1022 boot_cpuid = 0; 1011 boot_cpuid = 0;
1023 } else { 1012 } else {
1024 /* Check if it's the boot-cpu, set it's hw index in paca now */ 1013 /* Check if it's the boot-cpu, set it's hw index in paca now */
1025 if (get_flat_dt_prop(node, "linux,boot-cpu", NULL) != NULL) { 1014 if (of_get_flat_dt_prop(node, "linux,boot-cpu", NULL)
1026 u32 *prop = get_flat_dt_prop(node, "reg", NULL); 1015 != NULL) {
1016 u32 *prop = of_get_flat_dt_prop(node, "reg", NULL);
1027 set_hard_smp_processor_id(0, prop == NULL ? 0 : *prop); 1017 set_hard_smp_processor_id(0, prop == NULL ? 0 : *prop);
1028 boot_cpuid_phys = get_hard_smp_processor_id(0); 1018 boot_cpuid_phys = get_hard_smp_processor_id(0);
1029 } 1019 }
@@ -1031,14 +1021,14 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
1031 1021
1032#ifdef CONFIG_ALTIVEC 1022#ifdef CONFIG_ALTIVEC
1033 /* Check if we have a VMX and eventually update CPU features */ 1023 /* Check if we have a VMX and eventually update CPU features */
1034 prop = (u32 *)get_flat_dt_prop(node, "ibm,vmx", NULL); 1024 prop = (u32 *)of_get_flat_dt_prop(node, "ibm,vmx", NULL);
1035 if (prop && (*prop) > 0) { 1025 if (prop && (*prop) > 0) {
1036 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC; 1026 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC;
1037 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC; 1027 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC;
1038 } 1028 }
1039 1029
1040 /* Same goes for Apple's "altivec" property */ 1030 /* Same goes for Apple's "altivec" property */
1041 prop = (u32 *)get_flat_dt_prop(node, "altivec", NULL); 1031 prop = (u32 *)of_get_flat_dt_prop(node, "altivec", NULL);
1042 if (prop) { 1032 if (prop) {
1043 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC; 1033 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC;
1044 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC; 1034 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC;
@@ -1050,7 +1040,7 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
1050 * this by looking at the size of the ibm,ppc-interrupt-server#s 1040 * this by looking at the size of the ibm,ppc-interrupt-server#s
1051 * property 1041 * property
1052 */ 1042 */
1053 prop = (u32 *)get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", 1043 prop = (u32 *)of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s",
1054 &size); 1044 &size);
1055 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT; 1045 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
1056 if (prop && ((size / sizeof(u32)) > 1)) 1046 if (prop && ((size / sizeof(u32)) > 1))
@@ -1071,26 +1061,26 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
1071 return 0; 1061 return 0;
1072 1062
1073 /* get platform type */ 1063 /* get platform type */
1074 prop = (u32 *)get_flat_dt_prop(node, "linux,platform", NULL); 1064 prop = (u32 *)of_get_flat_dt_prop(node, "linux,platform", NULL);
1075 if (prop == NULL) 1065 if (prop == NULL)
1076 return 0; 1066 return 0;
1077 systemcfg->platform = *prop; 1067 systemcfg->platform = *prop;
1078 1068
1079 /* check if iommu is forced on or off */ 1069 /* check if iommu is forced on or off */
1080 if (get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) 1070 if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
1081 iommu_is_off = 1; 1071 iommu_is_off = 1;
1082 if (get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL) 1072 if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL)
1083 iommu_force_on = 1; 1073 iommu_force_on = 1;
1084 1074
1085 prop64 = (u64*)get_flat_dt_prop(node, "linux,memory-limit", NULL); 1075 prop64 = (u64*)of_get_flat_dt_prop(node, "linux,memory-limit", NULL);
1086 if (prop64) 1076 if (prop64)
1087 memory_limit = *prop64; 1077 memory_limit = *prop64;
1088 1078
1089 prop64 = (u64*)get_flat_dt_prop(node, "linux,tce-alloc-start", NULL); 1079 prop64 = (u64*)of_get_flat_dt_prop(node, "linux,tce-alloc-start",NULL);
1090 if (prop64) 1080 if (prop64)
1091 tce_alloc_start = *prop64; 1081 tce_alloc_start = *prop64;
1092 1082
1093 prop64 = (u64*)get_flat_dt_prop(node, "linux,tce-alloc-end", NULL); 1083 prop64 = (u64*)of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL);
1094 if (prop64) 1084 if (prop64)
1095 tce_alloc_end = *prop64; 1085 tce_alloc_end = *prop64;
1096 1086
@@ -1101,9 +1091,12 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
1101 { 1091 {
1102 u64 *basep, *entryp; 1092 u64 *basep, *entryp;
1103 1093
1104 basep = (u64*)get_flat_dt_prop(node, "linux,rtas-base", NULL); 1094 basep = (u64*)of_get_flat_dt_prop(node,
1105 entryp = (u64*)get_flat_dt_prop(node, "linux,rtas-entry", NULL); 1095 "linux,rtas-base", NULL);
1106 prop = (u32*)get_flat_dt_prop(node, "linux,rtas-size", NULL); 1096 entryp = (u64*)of_get_flat_dt_prop(node,
1097 "linux,rtas-entry", NULL);
1098 prop = (u32*)of_get_flat_dt_prop(node,
1099 "linux,rtas-size", NULL);
1107 if (basep && entryp && prop) { 1100 if (basep && entryp && prop) {
1108 rtas.base = *basep; 1101 rtas.base = *basep;
1109 rtas.entry = *entryp; 1102 rtas.entry = *entryp;
@@ -1124,11 +1117,11 @@ static int __init early_init_dt_scan_root(unsigned long node,
1124 if (depth != 0) 1117 if (depth != 0)
1125 return 0; 1118 return 0;
1126 1119
1127 prop = (u32 *)get_flat_dt_prop(node, "#size-cells", NULL); 1120 prop = (u32 *)of_get_flat_dt_prop(node, "#size-cells", NULL);
1128 dt_root_size_cells = (prop == NULL) ? 1 : *prop; 1121 dt_root_size_cells = (prop == NULL) ? 1 : *prop;
1129 DBG("dt_root_size_cells = %x\n", dt_root_size_cells); 1122 DBG("dt_root_size_cells = %x\n", dt_root_size_cells);
1130 1123
1131 prop = (u32 *)get_flat_dt_prop(node, "#address-cells", NULL); 1124 prop = (u32 *)of_get_flat_dt_prop(node, "#address-cells", NULL);
1132 dt_root_addr_cells = (prop == NULL) ? 2 : *prop; 1125 dt_root_addr_cells = (prop == NULL) ? 2 : *prop;
1133 DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells); 1126 DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells);
1134 1127
@@ -1160,7 +1153,7 @@ static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp)
1160static int __init early_init_dt_scan_memory(unsigned long node, 1153static int __init early_init_dt_scan_memory(unsigned long node,
1161 const char *uname, int depth, void *data) 1154 const char *uname, int depth, void *data)
1162{ 1155{
1163 char *type = get_flat_dt_prop(node, "device_type", NULL); 1156 char *type = of_get_flat_dt_prop(node, "device_type", NULL);
1164 cell_t *reg, *endp; 1157 cell_t *reg, *endp;
1165 unsigned long l; 1158 unsigned long l;
1166 1159
@@ -1168,7 +1161,7 @@ static int __init early_init_dt_scan_memory(unsigned long node,
1168 if (type == NULL || strcmp(type, "memory") != 0) 1161 if (type == NULL || strcmp(type, "memory") != 0)
1169 return 0; 1162 return 0;
1170 1163
1171 reg = (cell_t *)get_flat_dt_prop(node, "reg", &l); 1164 reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l);
1172 if (reg == NULL) 1165 if (reg == NULL)
1173 return 0; 1166 return 0;
1174 1167
@@ -1224,19 +1217,16 @@ void __init early_init_devtree(void *params)
1224 /* Setup flat device-tree pointer */ 1217 /* Setup flat device-tree pointer */
1225 initial_boot_params = params; 1218 initial_boot_params = params;
1226 1219
1227 /* By default, hash size is not set */
1228 ppc64_pft_size = 0;
1229
1230 /* Retreive various informations from the /chosen node of the 1220 /* Retreive various informations from the /chosen node of the
1231 * device-tree, including the platform type, initrd location and 1221 * device-tree, including the platform type, initrd location and
1232 * size, TCE reserve, and more ... 1222 * size, TCE reserve, and more ...
1233 */ 1223 */
1234 scan_flat_dt(early_init_dt_scan_chosen, NULL); 1224 of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
1235 1225
1236 /* Scan memory nodes and rebuild LMBs */ 1226 /* Scan memory nodes and rebuild LMBs */
1237 lmb_init(); 1227 lmb_init();
1238 scan_flat_dt(early_init_dt_scan_root, NULL); 1228 of_scan_flat_dt(early_init_dt_scan_root, NULL);
1239 scan_flat_dt(early_init_dt_scan_memory, NULL); 1229 of_scan_flat_dt(early_init_dt_scan_memory, NULL);
1240 lmb_enforce_memory_limit(memory_limit); 1230 lmb_enforce_memory_limit(memory_limit);
1241 lmb_analyze(); 1231 lmb_analyze();
1242 systemcfg->physicalMemorySize = lmb_phys_mem_size(); 1232 systemcfg->physicalMemorySize = lmb_phys_mem_size();
@@ -1252,26 +1242,8 @@ void __init early_init_devtree(void *params)
1252 /* Retreive hash table size from flattened tree plus other 1242 /* Retreive hash table size from flattened tree plus other
1253 * CPU related informations (altivec support, boot CPU ID, ...) 1243 * CPU related informations (altivec support, boot CPU ID, ...)
1254 */ 1244 */
1255 scan_flat_dt(early_init_dt_scan_cpus, NULL); 1245 of_scan_flat_dt(early_init_dt_scan_cpus, NULL);
1256
1257 /* If hash size wasn't obtained above, we calculate it now based on
1258 * the total RAM size
1259 */
1260 if (ppc64_pft_size == 0) {
1261 unsigned long rnd_mem_size, pteg_count;
1262
1263 /* round mem_size up to next power of 2 */
1264 rnd_mem_size = 1UL << __ilog2(systemcfg->physicalMemorySize);
1265 if (rnd_mem_size < systemcfg->physicalMemorySize)
1266 rnd_mem_size <<= 1;
1267
1268 /* # pages / 2 */
1269 pteg_count = max(rnd_mem_size >> (12 + 1), 1UL << 11);
1270
1271 ppc64_pft_size = __ilog2(pteg_count << 7);
1272 }
1273 1246
1274 DBG("Hash pftSize: %x\n", (int)ppc64_pft_size);
1275 DBG(" <- early_init_devtree()\n"); 1247 DBG(" <- early_init_devtree()\n");
1276} 1248}
1277 1249