diff options
Diffstat (limited to 'arch/mips/loongson/common/env.c')
-rw-r--r-- | arch/mips/loongson/common/env.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/arch/mips/loongson/common/env.c b/arch/mips/loongson/common/env.c index 0c543eae49bf..f15228550a22 100644 --- a/arch/mips/loongson/common/env.c +++ b/arch/mips/loongson/common/env.c | |||
@@ -27,6 +27,12 @@ EXPORT_SYMBOL(cpu_clock_freq); | |||
27 | struct efi_memory_map_loongson *loongson_memmap; | 27 | struct efi_memory_map_loongson *loongson_memmap; |
28 | struct loongson_system_configuration loongson_sysconf; | 28 | struct loongson_system_configuration loongson_sysconf; |
29 | 29 | ||
30 | u64 loongson_chipcfg[MAX_PACKAGES] = {0xffffffffbfc00180}; | ||
31 | u64 loongson_freqctrl[MAX_PACKAGES]; | ||
32 | |||
33 | unsigned long long smp_group[4]; | ||
34 | int cpuhotplug_workaround = 0; | ||
35 | |||
30 | #define parse_even_earlier(res, option, p) \ | 36 | #define parse_even_earlier(res, option, p) \ |
31 | do { \ | 37 | do { \ |
32 | unsigned int tmp __maybe_unused; \ | 38 | unsigned int tmp __maybe_unused; \ |
@@ -77,9 +83,47 @@ void __init prom_init_env(void) | |||
77 | 83 | ||
78 | cpu_clock_freq = ecpu->cpu_clock_freq; | 84 | cpu_clock_freq = ecpu->cpu_clock_freq; |
79 | loongson_sysconf.cputype = ecpu->cputype; | 85 | loongson_sysconf.cputype = ecpu->cputype; |
86 | if (ecpu->cputype == Loongson_3A) { | ||
87 | loongson_sysconf.cores_per_node = 4; | ||
88 | loongson_sysconf.cores_per_package = 4; | ||
89 | smp_group[0] = 0x900000003ff01000; | ||
90 | smp_group[1] = 0x900010003ff01000; | ||
91 | smp_group[2] = 0x900020003ff01000; | ||
92 | smp_group[3] = 0x900030003ff01000; | ||
93 | loongson_chipcfg[0] = 0x900000001fe00180; | ||
94 | loongson_chipcfg[1] = 0x900010001fe00180; | ||
95 | loongson_chipcfg[2] = 0x900020001fe00180; | ||
96 | loongson_chipcfg[3] = 0x900030001fe00180; | ||
97 | loongson_sysconf.ht_control_base = 0x90000EFDFB000000; | ||
98 | } else if (ecpu->cputype == Loongson_3B) { | ||
99 | loongson_sysconf.cores_per_node = 4; /* One chip has 2 nodes */ | ||
100 | loongson_sysconf.cores_per_package = 8; | ||
101 | smp_group[0] = 0x900000003ff01000; | ||
102 | smp_group[1] = 0x900010003ff05000; | ||
103 | smp_group[2] = 0x900020003ff09000; | ||
104 | smp_group[3] = 0x900030003ff0d000; | ||
105 | loongson_chipcfg[0] = 0x900000001fe00180; | ||
106 | loongson_chipcfg[1] = 0x900020001fe00180; | ||
107 | loongson_chipcfg[2] = 0x900040001fe00180; | ||
108 | loongson_chipcfg[3] = 0x900060001fe00180; | ||
109 | loongson_freqctrl[0] = 0x900000001fe001d0; | ||
110 | loongson_freqctrl[1] = 0x900020001fe001d0; | ||
111 | loongson_freqctrl[2] = 0x900040001fe001d0; | ||
112 | loongson_freqctrl[3] = 0x900060001fe001d0; | ||
113 | loongson_sysconf.ht_control_base = 0x90001EFDFB000000; | ||
114 | cpuhotplug_workaround = 1; | ||
115 | } else { | ||
116 | loongson_sysconf.cores_per_node = 1; | ||
117 | loongson_sysconf.cores_per_package = 1; | ||
118 | loongson_chipcfg[0] = 0x900000001fe00180; | ||
119 | } | ||
120 | |||
80 | loongson_sysconf.nr_cpus = ecpu->nr_cpus; | 121 | loongson_sysconf.nr_cpus = ecpu->nr_cpus; |
81 | if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0) | 122 | if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0) |
82 | loongson_sysconf.nr_cpus = NR_CPUS; | 123 | loongson_sysconf.nr_cpus = NR_CPUS; |
124 | loongson_sysconf.nr_nodes = (loongson_sysconf.nr_cpus + | ||
125 | loongson_sysconf.cores_per_node - 1) / | ||
126 | loongson_sysconf.cores_per_node; | ||
83 | 127 | ||
84 | loongson_sysconf.pci_mem_start_addr = eirq_source->pci_mem_start_addr; | 128 | loongson_sysconf.pci_mem_start_addr = eirq_source->pci_mem_start_addr; |
85 | loongson_sysconf.pci_mem_end_addr = eirq_source->pci_mem_end_addr; | 129 | loongson_sysconf.pci_mem_end_addr = eirq_source->pci_mem_end_addr; |
@@ -93,7 +137,6 @@ void __init prom_init_env(void) | |||
93 | loongson_sysconf.poweroff_addr = boot_p->reset_system.Shutdown; | 137 | loongson_sysconf.poweroff_addr = boot_p->reset_system.Shutdown; |
94 | loongson_sysconf.suspend_addr = boot_p->reset_system.DoSuspend; | 138 | loongson_sysconf.suspend_addr = boot_p->reset_system.DoSuspend; |
95 | 139 | ||
96 | loongson_sysconf.ht_control_base = 0x90000EFDFB000000; | ||
97 | loongson_sysconf.vgabios_addr = boot_p->efi.smbios.vga_bios; | 140 | loongson_sysconf.vgabios_addr = boot_p->efi.smbios.vga_bios; |
98 | pr_debug("Shutdown Addr: %llx, Restart Addr: %llx, VBIOS Addr: %llx\n", | 141 | pr_debug("Shutdown Addr: %llx, Restart Addr: %llx, VBIOS Addr: %llx\n", |
99 | loongson_sysconf.poweroff_addr, loongson_sysconf.restart_addr, | 142 | loongson_sysconf.poweroff_addr, loongson_sysconf.restart_addr, |
@@ -111,6 +154,10 @@ void __init prom_init_env(void) | |||
111 | case PRID_REV_LOONGSON3A: | 154 | case PRID_REV_LOONGSON3A: |
112 | cpu_clock_freq = 900000000; | 155 | cpu_clock_freq = 900000000; |
113 | break; | 156 | break; |
157 | case PRID_REV_LOONGSON3B_R1: | ||
158 | case PRID_REV_LOONGSON3B_R2: | ||
159 | cpu_clock_freq = 1000000000; | ||
160 | break; | ||
114 | default: | 161 | default: |
115 | cpu_clock_freq = 100000000; | 162 | cpu_clock_freq = 100000000; |
116 | break; | 163 | break; |