|
@@ -21,6 +21,7 @@
|
|
|
#include <asm/bootinfo.h>
|
|
|
#include <loongson.h>
|
|
|
#include <boot_param.h>
|
|
|
+#include <workarounds.h>
|
|
|
|
|
|
u32 cpu_clock_freq;
|
|
|
EXPORT_SYMBOL(cpu_clock_freq);
|
|
@@ -31,7 +32,6 @@ u64 loongson_chipcfg[MAX_PACKAGES] = {0xffffffffbfc00180};
|
|
|
u64 loongson_freqctrl[MAX_PACKAGES];
|
|
|
|
|
|
unsigned long long smp_group[4];
|
|
|
-int cpuhotplug_workaround = 0;
|
|
|
|
|
|
#define parse_even_earlier(res, option, p) \
|
|
|
do { \
|
|
@@ -67,6 +67,7 @@ void __init prom_init_env(void)
|
|
|
#else
|
|
|
struct boot_params *boot_p;
|
|
|
struct loongson_params *loongson_p;
|
|
|
+ struct system_loongson *esys;
|
|
|
struct efi_cpuinfo_loongson *ecpu;
|
|
|
struct irq_source_routing_table *eirq_source;
|
|
|
|
|
@@ -74,6 +75,8 @@ void __init prom_init_env(void)
|
|
|
boot_p = (struct boot_params *)fw_arg2;
|
|
|
loongson_p = &(boot_p->efi.smbios.lp);
|
|
|
|
|
|
+ esys = (struct system_loongson *)
|
|
|
+ ((u64)loongson_p + loongson_p->system_offset);
|
|
|
ecpu = (struct efi_cpuinfo_loongson *)
|
|
|
((u64)loongson_p + loongson_p->cpu_offset);
|
|
|
eirq_source = (struct irq_source_routing_table *)
|
|
@@ -95,6 +98,7 @@ void __init prom_init_env(void)
|
|
|
loongson_chipcfg[2] = 0x900020001fe00180;
|
|
|
loongson_chipcfg[3] = 0x900030001fe00180;
|
|
|
loongson_sysconf.ht_control_base = 0x90000EFDFB000000;
|
|
|
+ loongson_sysconf.workarounds = WORKAROUND_CPUFREQ;
|
|
|
} else if (ecpu->cputype == Loongson_3B) {
|
|
|
loongson_sysconf.cores_per_node = 4; /* One chip has 2 nodes */
|
|
|
loongson_sysconf.cores_per_package = 8;
|
|
@@ -111,7 +115,7 @@ void __init prom_init_env(void)
|
|
|
loongson_freqctrl[2] = 0x900040001fe001d0;
|
|
|
loongson_freqctrl[3] = 0x900060001fe001d0;
|
|
|
loongson_sysconf.ht_control_base = 0x90001EFDFB000000;
|
|
|
- cpuhotplug_workaround = 1;
|
|
|
+ loongson_sysconf.workarounds = WORKAROUND_CPUHOTPLUG;
|
|
|
} else {
|
|
|
loongson_sysconf.cores_per_node = 1;
|
|
|
loongson_sysconf.cores_per_package = 1;
|
|
@@ -143,6 +147,24 @@ void __init prom_init_env(void)
|
|
|
pr_debug("Shutdown Addr: %llx, Restart Addr: %llx, VBIOS Addr: %llx\n",
|
|
|
loongson_sysconf.poweroff_addr, loongson_sysconf.restart_addr,
|
|
|
loongson_sysconf.vgabios_addr);
|
|
|
+
|
|
|
+ memset(loongson_sysconf.ecname, 0, 32);
|
|
|
+ if (esys->has_ec)
|
|
|
+ memcpy(loongson_sysconf.ecname, esys->ec_name, 32);
|
|
|
+ loongson_sysconf.workarounds |= esys->workarounds;
|
|
|
+
|
|
|
+ loongson_sysconf.nr_uarts = esys->nr_uarts;
|
|
|
+ if (esys->nr_uarts < 1 || esys->nr_uarts > MAX_UARTS)
|
|
|
+ loongson_sysconf.nr_uarts = 1;
|
|
|
+ memcpy(loongson_sysconf.uarts, esys->uarts,
|
|
|
+ sizeof(struct uart_device) * loongson_sysconf.nr_uarts);
|
|
|
+
|
|
|
+ loongson_sysconf.nr_sensors = esys->nr_sensors;
|
|
|
+ if (loongson_sysconf.nr_sensors > MAX_SENSORS)
|
|
|
+ loongson_sysconf.nr_sensors = 0;
|
|
|
+ if (loongson_sysconf.nr_sensors)
|
|
|
+ memcpy(loongson_sysconf.sensors, esys->sensors,
|
|
|
+ sizeof(struct sensor_device) * loongson_sysconf.nr_sensors);
|
|
|
#endif
|
|
|
if (cpu_clock_freq == 0) {
|
|
|
processor_id = (¤t_cpu_data)->processor_id;
|