diff options
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r-- | arch/sparc64/mm/init.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 5db50524f20d..4e2f71e0abc8 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -133,6 +133,12 @@ extern unsigned int sparc_ramdisk_size; | |||
133 | 133 | ||
134 | struct page *mem_map_zero __read_mostly; | 134 | struct page *mem_map_zero __read_mostly; |
135 | 135 | ||
136 | unsigned int sparc64_highest_unlocked_tlb_ent __read_mostly; | ||
137 | |||
138 | unsigned long sparc64_kern_pri_context __read_mostly; | ||
139 | unsigned long sparc64_kern_pri_nuc_bits __read_mostly; | ||
140 | unsigned long sparc64_kern_sec_context __read_mostly; | ||
141 | |||
136 | int bigkernel = 0; | 142 | int bigkernel = 0; |
137 | 143 | ||
138 | /* XXX Tune this... */ | 144 | /* XXX Tune this... */ |
@@ -582,13 +588,21 @@ static void __init remap_kernel(void) | |||
582 | prom_dtlb_load(tlb_ent, tte_data, tte_vaddr); | 588 | prom_dtlb_load(tlb_ent, tte_data, tte_vaddr); |
583 | prom_itlb_load(tlb_ent, tte_data, tte_vaddr); | 589 | prom_itlb_load(tlb_ent, tte_data, tte_vaddr); |
584 | if (bigkernel) { | 590 | if (bigkernel) { |
585 | prom_dtlb_load(tlb_ent - 1, | 591 | tlb_ent -= 1; |
592 | prom_dtlb_load(tlb_ent, | ||
586 | tte_data + 0x400000, | 593 | tte_data + 0x400000, |
587 | tte_vaddr + 0x400000); | 594 | tte_vaddr + 0x400000); |
588 | prom_itlb_load(tlb_ent - 1, | 595 | prom_itlb_load(tlb_ent, |
589 | tte_data + 0x400000, | 596 | tte_data + 0x400000, |
590 | tte_vaddr + 0x400000); | 597 | tte_vaddr + 0x400000); |
591 | } | 598 | } |
599 | sparc64_highest_unlocked_tlb_ent = tlb_ent - 1; | ||
600 | if (tlb_type == cheetah_plus) { | ||
601 | sparc64_kern_pri_context = (CTX_CHEETAH_PLUS_CTX0 | | ||
602 | CTX_CHEETAH_PLUS_NUC); | ||
603 | sparc64_kern_pri_nuc_bits = CTX_CHEETAH_PLUS_NUC; | ||
604 | sparc64_kern_sec_context = CTX_CHEETAH_PLUS_CTX0; | ||
605 | } | ||
592 | } | 606 | } |
593 | 607 | ||
594 | static void __init inherit_prom_mappings(void) | 608 | static void __init inherit_prom_mappings(void) |
@@ -788,8 +802,8 @@ void inherit_locked_prom_mappings(int save_p) | |||
788 | } | 802 | } |
789 | } | 803 | } |
790 | if (tlb_type == spitfire) { | 804 | if (tlb_type == spitfire) { |
791 | int high = SPITFIRE_HIGHEST_LOCKED_TLBENT - bigkernel; | 805 | int high = sparc64_highest_unlocked_tlb_ent; |
792 | for (i = 0; i < high; i++) { | 806 | for (i = 0; i <= high; i++) { |
793 | unsigned long data; | 807 | unsigned long data; |
794 | 808 | ||
795 | /* Spitfire Errata #32 workaround */ | 809 | /* Spitfire Errata #32 workaround */ |
@@ -877,9 +891,9 @@ void inherit_locked_prom_mappings(int save_p) | |||
877 | } | 891 | } |
878 | } | 892 | } |
879 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { | 893 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { |
880 | int high = CHEETAH_HIGHEST_LOCKED_TLBENT - bigkernel; | 894 | int high = sparc64_highest_unlocked_tlb_ent; |
881 | 895 | ||
882 | for (i = 0; i < high; i++) { | 896 | for (i = 0; i <= high; i++) { |
883 | unsigned long data; | 897 | unsigned long data; |
884 | 898 | ||
885 | data = cheetah_get_ldtlb_data(i); | 899 | data = cheetah_get_ldtlb_data(i); |