Re: [PATCH V3] MIPS: Loongson: Improve LEFI firmware interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Ralf,

Please update this patch which has already merged, the V2 may cause
some build errors.

Huacai

On Sun, Nov 16, 2014 at 10:08 AM, Huacai Chen <chenhc@xxxxxxxxxx> wrote:
> Machtypes of Loongson-3 machines become more and more, but there are
> only small differences among different machtypes. Keeping a large table
> of machtypes is very ugly and hard to extend. We found that the major
> machtype differences are UARTs information (number of UARTs, UART IRQs,
> UART clocks, etc.), platform devices (EC, temperature sensors, fan
> controllers, etc.) and some workarounds (because of some CPU bugs or
> mainboard bugs).
>
> In this patch we improve the UEFI-like (LEFI) interface to make all
> Loongson-3 machines use a same machtype "generic-loongson-machine".
>
> V3: export loongson_sysconf to avoid some build failures.
>
> Signed-off-by: Huacai Chen <chenhc@xxxxxxxxxx>
> ---
>  arch/mips/include/asm/bootinfo.h                   |    5 +--
>  arch/mips/include/asm/mach-loongson/boot_param.h   |   44 +++++++++++++++-
>  arch/mips/include/asm/mach-loongson/loongson.h     |    2 +-
>  .../include/asm/mach-loongson/loongson_hwmon.h     |   55 ++++++++++++++++++++
>  arch/mips/include/asm/mach-loongson/machine.h      |    2 +-
>  arch/mips/include/asm/mach-loongson/workarounds.h  |    7 +++
>  arch/mips/loongson/common/early_printk.c           |    2 +-
>  arch/mips/loongson/common/env.c                    |   26 +++++++++-
>  arch/mips/loongson/common/machtype.c               |    5 +--
>  arch/mips/loongson/common/serial.c                 |   48 ++++++++++++++---
>  arch/mips/loongson/common/uart_base.c              |   30 +++++------
>  arch/mips/loongson/loongson-3/Makefile             |    2 +-
>  arch/mips/loongson/loongson-3/platform.c           |   43 +++++++++++++++
>  arch/mips/loongson/loongson-3/smp.c                |    5 +-
>  14 files changed, 234 insertions(+), 42 deletions(-)
>  create mode 100644 arch/mips/include/asm/mach-loongson/loongson_hwmon.h
>  create mode 100644 arch/mips/include/asm/mach-loongson/workarounds.h
>  create mode 100644 arch/mips/loongson/loongson-3/platform.c
>
> diff --git a/arch/mips/include/asm/bootinfo.h b/arch/mips/include/asm/bootinfo.h
> index 1f7ca8b..8b2eaa1 100644
> --- a/arch/mips/include/asm/bootinfo.h
> +++ b/arch/mips/include/asm/bootinfo.h
> @@ -70,10 +70,7 @@ enum loongson_machine_type {
>         MACH_DEXXON_GDIUM2F10,
>         MACH_LEMOTE_NAS,
>         MACH_LEMOTE_LL2F,
> -       MACH_LEMOTE_A1004,
> -       MACH_LEMOTE_A1101,
> -       MACH_LEMOTE_A1201,
> -       MACH_LEMOTE_A1205,
> +       MACH_LOONGSON_GENERIC,
>         MACH_LOONGSON_END
>  };
>
> diff --git a/arch/mips/include/asm/mach-loongson/boot_param.h b/arch/mips/include/asm/mach-loongson/boot_param.h
> index 11ebf4c..fa80292 100644
> --- a/arch/mips/include/asm/mach-loongson/boot_param.h
> +++ b/arch/mips/include/asm/mach-loongson/boot_param.h
> @@ -10,7 +10,8 @@
>  #define VIDEO_ROM              7
>  #define ADAPTER_ROM            8
>  #define ACPI_TABLE             9
> -#define MAX_MEMORY_TYPE                10
> +#define SMBIOS_TABLE           10
> +#define MAX_MEMORY_TYPE                11
>
>  #define LOONGSON3_BOOT_MEM_MAP_MAX 128
>  struct efi_memory_map_loongson {
> @@ -48,10 +49,43 @@ struct efi_cpuinfo_loongson {
>         u32 nr_cpus;
>  } __packed;
>
> +#define MAX_UARTS 64
> +struct uart_device {
> +       u32 iotype; /* see include/linux/serial_core.h */
> +       u32 uartclk;
> +       u32 int_offset;
> +       u64 uart_base;
> +} __packed;
> +
> +#define MAX_SENSORS 64
> +#define SENSOR_TEMPER  0x00000001
> +#define SENSOR_VOLTAGE 0x00000002
> +#define SENSOR_FAN     0x00000004
> +struct sensor_device {
> +       char name[32];  /* a formal name */
> +       char label[64]; /* a flexible description */
> +       u32 type;       /* SENSOR_* */
> +       u32 id;         /* instance id of a sensor-class */
> +       u32 fan_policy; /* see loongson_hwmon.h */
> +       u32 fan_percent;/* only for constant speed policy */
> +       u64 base_addr;  /* base address of device registers */
> +} __packed;
> +
>  struct system_loongson {
>         u16 vers;     /* version of system_loongson */
>         u32 ccnuma_smp; /* 0: no numa; 1: has numa */
>         u32 sing_double_channel; /* 1:single; 2:double */
> +       u32 nr_uarts;
> +       struct uart_device uarts[MAX_UARTS];
> +       u32 nr_sensors;
> +       struct sensor_device sensors[MAX_SENSORS];
> +       char has_ec;
> +       char ec_name[32];
> +       u64 ec_base_addr;
> +       char has_tcm;
> +       char tcm_name[32];
> +       u64 tcm_base_addr;
> +       u64 workarounds; /* see workarounds.h */
>  } __packed;
>
>  struct irq_source_routing_table {
> @@ -162,9 +196,15 @@ struct loongson_system_configuration {
>         u64 suspend_addr;
>         u64 vgabios_addr;
>         u32 dma_mask_bits;
> +       char ecname[32];
> +       u32 nr_uarts;
> +       struct uart_device uarts[MAX_UARTS];
> +       u32 nr_sensors;
> +       struct sensor_device sensors[MAX_SENSORS];
> +       u64 workarounds;
>  };
>
>  extern struct efi_memory_map_loongson *loongson_memmap;
>  extern struct loongson_system_configuration loongson_sysconf;
> -extern int cpuhotplug_workaround;
> +
>  #endif
> diff --git a/arch/mips/include/asm/mach-loongson/loongson.h b/arch/mips/include/asm/mach-loongson/loongson.h
> index 92bf76c..5459ac0 100644
> --- a/arch/mips/include/asm/mach-loongson/loongson.h
> +++ b/arch/mips/include/asm/mach-loongson/loongson.h
> @@ -35,7 +35,7 @@ extern void __init prom_init_cmdline(void);
>  extern void __init prom_init_machtype(void);
>  extern void __init prom_init_env(void);
>  #ifdef CONFIG_LOONGSON_UART_BASE
> -extern unsigned long _loongson_uart_base, loongson_uart_base;
> +extern unsigned long _loongson_uart_base[], loongson_uart_base[];
>  extern void prom_init_loongson_uart_base(void);
>  #endif
>
> diff --git a/arch/mips/include/asm/mach-loongson/loongson_hwmon.h b/arch/mips/include/asm/mach-loongson/loongson_hwmon.h
> new file mode 100644
> index 0000000..4431fc5
> --- /dev/null
> +++ b/arch/mips/include/asm/mach-loongson/loongson_hwmon.h
> @@ -0,0 +1,55 @@
> +#ifndef __LOONGSON_HWMON_H_
> +#define __LOONGSON_HWMON_H_
> +
> +#include <linux/types.h>
> +
> +#define MIN_TEMP       0
> +#define MAX_TEMP       255
> +#define NOT_VALID_TEMP 999
> +
> +typedef int (*get_temp_fun)(int);
> +extern int loongson3_cpu_temp(int);
> +
> +/* 0:Max speed, 1:Manual, 2:Auto */
> +enum fan_control_mode {
> +       FAN_FULL_MODE = 0,
> +       FAN_MANUAL_MODE = 1,
> +       FAN_AUTO_MODE = 2,
> +       FAN_MODE_END
> +};
> +
> +struct temp_range {
> +       u8 low;
> +       u8 high;
> +       u8 level;
> +};
> +
> +#define CONSTANT_SPEED_POLICY  0  /* at constent speed */
> +#define STEP_SPEED_POLICY      1  /* use up/down arrays to describe policy */
> +#define KERNEL_HELPER_POLICY   2  /* kernel as a helper to fan control */
> +
> +#define MAX_STEP_NUM   16
> +#define MAX_FAN_LEVEL  255
> +
> +/* loongson_fan_policy works when fan work at FAN_AUTO_MODE */
> +struct loongson_fan_policy {
> +       u8      type;
> +
> +       /* percent only used when type is CONSTANT_SPEED_POLICY */
> +       u8      percent;
> +
> +       /* period between two check. (Unit: S) */
> +       u8      adjust_period;
> +
> +       /* fan adjust usually depend on a temprature input */
> +       get_temp_fun    depend_temp;
> +
> +       /* up_step/down_step used when type is STEP_SPEED_POLICY */
> +       u8      up_step_num;
> +       u8      down_step_num;
> +       struct temp_range up_step[MAX_STEP_NUM];
> +       struct temp_range down_step[MAX_STEP_NUM];
> +       struct delayed_work work;
> +};
> +
> +#endif /* __LOONGSON_HWMON_H_*/
> diff --git a/arch/mips/include/asm/mach-loongson/machine.h b/arch/mips/include/asm/mach-loongson/machine.h
> index 228e3784..cb2b602 100644
> --- a/arch/mips/include/asm/mach-loongson/machine.h
> +++ b/arch/mips/include/asm/mach-loongson/machine.h
> @@ -26,7 +26,7 @@
>
>  #ifdef CONFIG_LOONGSON_MACH3X
>
> -#define LOONGSON_MACHTYPE MACH_LEMOTE_A1101
> +#define LOONGSON_MACHTYPE MACH_LOONGSON_GENERIC
>
>  #endif /* CONFIG_LOONGSON_MACH3X */
>
> diff --git a/arch/mips/include/asm/mach-loongson/workarounds.h b/arch/mips/include/asm/mach-loongson/workarounds.h
> new file mode 100644
> index 0000000..e180c14
> --- /dev/null
> +++ b/arch/mips/include/asm/mach-loongson/workarounds.h
> @@ -0,0 +1,7 @@
> +#ifndef __ASM_MACH_LOONGSON_WORKAROUNDS_H_
> +#define __ASM_MACH_LOONGSON_WORKAROUNDS_H_
> +
> +#define WORKAROUND_CPUFREQ     0x00000001
> +#define WORKAROUND_CPUHOTPLUG  0x00000002
> +
> +#endif
> diff --git a/arch/mips/loongson/common/early_printk.c b/arch/mips/loongson/common/early_printk.c
> index ced461b..6ca632e 100644
> --- a/arch/mips/loongson/common/early_printk.c
> +++ b/arch/mips/loongson/common/early_printk.c
> @@ -30,7 +30,7 @@ void prom_putchar(char c)
>         int timeout;
>         unsigned char *uart_base;
>
> -       uart_base = (unsigned char *)_loongson_uart_base;
> +       uart_base = (unsigned char *)_loongson_uart_base[0];
>         timeout = 1024;
>
>         while (((serial_in(uart_base, UART_LSR) & UART_LSR_THRE) == 0) &&
> diff --git a/arch/mips/loongson/common/env.c b/arch/mips/loongson/common/env.c
> index d8be539..045ea3d 100644
> --- a/arch/mips/loongson/common/env.c
> +++ b/arch/mips/loongson/common/env.c
> @@ -21,17 +21,18 @@
>  #include <asm/bootinfo.h>
>  #include <loongson.h>
>  #include <boot_param.h>
> +#include <workarounds.h>
>
>  u32 cpu_clock_freq;
>  EXPORT_SYMBOL(cpu_clock_freq);
>  struct efi_memory_map_loongson *loongson_memmap;
>  struct loongson_system_configuration loongson_sysconf;
> +EXPORT_SYMBOL(loongson_sysconf);
>
>  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 = (&current_cpu_data)->processor_id;
> diff --git a/arch/mips/loongson/common/machtype.c b/arch/mips/loongson/common/machtype.c
> index 1a47979..26629ab 100644
> --- a/arch/mips/loongson/common/machtype.c
> +++ b/arch/mips/loongson/common/machtype.c
> @@ -27,10 +27,7 @@ static const char *system_types[] = {
>         [MACH_DEXXON_GDIUM2F10]         "dexxon-gdium-2f",
>         [MACH_LEMOTE_NAS]               "lemote-nas-2f",
>         [MACH_LEMOTE_LL2F]              "lemote-lynloong-2f",
> -       [MACH_LEMOTE_A1004]             "lemote-3a-notebook-a1004",
> -       [MACH_LEMOTE_A1101]             "lemote-3a-itx-a1101",
> -       [MACH_LEMOTE_A1201]             "lemote-2gq-notebook-a1201",
> -       [MACH_LEMOTE_A1205]             "lemote-2gq-aio-a1205",
> +       [MACH_LOONGSON_GENERIC]         "generic-loongson-machine",
>         [MACH_LOONGSON_END]             NULL,
>  };
>
> diff --git a/arch/mips/loongson/common/serial.c b/arch/mips/loongson/common/serial.c
> index bd2b709..d2f4817 100644
> --- a/arch/mips/loongson/common/serial.c
> +++ b/arch/mips/loongson/common/serial.c
> @@ -38,7 +38,7 @@
>         .regshift       = 0,                                    \
>  }
>
> -static struct plat_serial8250_port uart8250_data[][2] = {
> +static struct plat_serial8250_port uart8250_data[][MAX_UARTS + 1] = {
>         [MACH_LOONGSON_UNKNOWN]         {},
>         [MACH_LEMOTE_FL2E]              {PORT(4, 1843200), {} },
>         [MACH_LEMOTE_FL2F]              {PORT(3, 1843200), {} },
> @@ -47,10 +47,7 @@ static struct plat_serial8250_port uart8250_data[][2] = {
>         [MACH_DEXXON_GDIUM2F10]         {PORT_M(3, 3686400), {} },
>         [MACH_LEMOTE_NAS]               {PORT_M(3, 3686400), {} },
>         [MACH_LEMOTE_LL2F]              {PORT(3, 1843200), {} },
> -       [MACH_LEMOTE_A1004]             {PORT_M(2, 33177600), {} },
> -       [MACH_LEMOTE_A1101]             {PORT_M(2, 25000000), {} },
> -       [MACH_LEMOTE_A1201]             {PORT_M(2, 25000000), {} },
> -       [MACH_LEMOTE_A1205]             {PORT_M(2, 25000000), {} },
> +       [MACH_LOONGSON_GENERIC]         {PORT_M(2, 25000000), {} },
>         [MACH_LOONGSON_END]             {},
>  };
>
> @@ -61,17 +58,52 @@ static struct platform_device uart8250_device = {
>
>  static int __init serial_init(void)
>  {
> +       int i;
>         unsigned char iotype;
>
>         iotype = uart8250_data[mips_machtype][0].iotype;
>
> -       if (UPIO_MEM == iotype)
> +       if (UPIO_MEM == iotype) {
> +               uart8250_data[mips_machtype][0].mapbase =
> +                       loongson_uart_base[0];
>                 uart8250_data[mips_machtype][0].membase =
> -                       (void __iomem *)_loongson_uart_base;
> +                       (void __iomem *)_loongson_uart_base[0];
> +       }
>         else if (UPIO_PORT == iotype)
>                 uart8250_data[mips_machtype][0].iobase =
> -                   loongson_uart_base - LOONGSON_PCIIO_BASE;
> +                       loongson_uart_base[0] - LOONGSON_PCIIO_BASE;
>
> +       if (loongson_sysconf.uarts[0].uartclk)
> +               uart8250_data[mips_machtype][0].uartclk =
> +                       loongson_sysconf.uarts[0].uartclk;
> +
> +       for (i = 1; i < loongson_sysconf.nr_uarts; i++) {
> +               iotype = loongson_sysconf.uarts[i].iotype;
> +               uart8250_data[mips_machtype][i].iotype = iotype;
> +               loongson_uart_base[i] = loongson_sysconf.uarts[i].uart_base;
> +
> +               if (UPIO_MEM == iotype) {
> +                       uart8250_data[mips_machtype][i].irq =
> +                               MIPS_CPU_IRQ_BASE + loongson_sysconf.uarts[i].int_offset;
> +                       uart8250_data[mips_machtype][i].mapbase =
> +                               loongson_uart_base[i];
> +                       uart8250_data[mips_machtype][i].membase =
> +                               ioremap_nocache(loongson_uart_base[i], 8);
> +               } else if (UPIO_PORT == iotype) {
> +                       uart8250_data[mips_machtype][i].irq =
> +                               loongson_sysconf.uarts[i].int_offset;
> +                       uart8250_data[mips_machtype][i].iobase =
> +                               loongson_uart_base[i] - LOONGSON_PCIIO_BASE;
> +               }
> +
> +               uart8250_data[mips_machtype][i].uartclk =
> +                       loongson_sysconf.uarts[i].uartclk;
> +               uart8250_data[mips_machtype][i].flags =
> +                       UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
> +       }
> +
> +       memset(&uart8250_data[mips_machtype][loongson_sysconf.nr_uarts],
> +                       0, sizeof(struct plat_serial8250_port));
>         uart8250_device.dev.platform_data = uart8250_data[mips_machtype];
>
>         return platform_device_register(&uart8250_device);
> diff --git a/arch/mips/loongson/common/uart_base.c b/arch/mips/loongson/common/uart_base.c
> index 1e1eeea..9de559d 100644
> --- a/arch/mips/loongson/common/uart_base.c
> +++ b/arch/mips/loongson/common/uart_base.c
> @@ -13,22 +13,27 @@
>
>  #include <loongson.h>
>
> -/* ioremapped */
> -unsigned long _loongson_uart_base;
> -EXPORT_SYMBOL(_loongson_uart_base);
>  /* raw */
> -unsigned long loongson_uart_base;
> +unsigned long loongson_uart_base[MAX_UARTS] = {};
> +/* ioremapped */
> +unsigned long _loongson_uart_base[MAX_UARTS] = {};
> +
>  EXPORT_SYMBOL(loongson_uart_base);
> +EXPORT_SYMBOL(_loongson_uart_base);
>
>  void prom_init_loongson_uart_base(void)
>  {
>         switch (mips_machtype) {
> +       case MACH_LOONGSON_GENERIC:
> +               /* The CPU provided serial port (CPU) */
> +               loongson_uart_base[0] = LOONGSON_REG_BASE + 0x1e0;
> +               break;
>         case MACH_LEMOTE_FL2E:
> -               loongson_uart_base = LOONGSON_PCIIO_BASE + 0x3f8;
> +               loongson_uart_base[0] = LOONGSON_PCIIO_BASE + 0x3f8;
>                 break;
>         case MACH_LEMOTE_FL2F:
>         case MACH_LEMOTE_LL2F:
> -               loongson_uart_base = LOONGSON_PCIIO_BASE + 0x2f8;
> +               loongson_uart_base[0] = LOONGSON_PCIIO_BASE + 0x2f8;
>                 break;
>         case MACH_LEMOTE_ML2F7:
>         case MACH_LEMOTE_YL2F89:
> @@ -36,17 +41,10 @@ void prom_init_loongson_uart_base(void)
>         case MACH_LEMOTE_NAS:
>         default:
>                 /* The CPU provided serial port (LPC) */
> -               loongson_uart_base = LOONGSON_LIO1_BASE + 0x3f8;
> -               break;
> -       case MACH_LEMOTE_A1004:
> -       case MACH_LEMOTE_A1101:
> -       case MACH_LEMOTE_A1201:
> -       case MACH_LEMOTE_A1205:
> -               /* The CPU provided serial port (CPU) */
> -               loongson_uart_base = LOONGSON_REG_BASE + 0x1e0;
> +               loongson_uart_base[0] = LOONGSON_LIO1_BASE + 0x3f8;
>                 break;
>         }
>
> -       _loongson_uart_base =
> -               (unsigned long)ioremap_nocache(loongson_uart_base, 8);
> +       _loongson_uart_base[0] =
> +               (unsigned long)ioremap_nocache(loongson_uart_base[0], 8);
>  }
> diff --git a/arch/mips/loongson/loongson-3/Makefile b/arch/mips/loongson/loongson-3/Makefile
> index b4df775..69809a3 100644
> --- a/arch/mips/loongson/loongson-3/Makefile
> +++ b/arch/mips/loongson/loongson-3/Makefile
> @@ -1,7 +1,7 @@
>  #
>  # Makefile for Loongson-3 family machines
>  #
> -obj-y                  += irq.o cop2-ex.o
> +obj-y                  += irq.o cop2-ex.o platform.o
>
>  obj-$(CONFIG_SMP)      += smp.o
>
> diff --git a/arch/mips/loongson/loongson-3/platform.c b/arch/mips/loongson/loongson-3/platform.c
> new file mode 100644
> index 0000000..25a97cc
> --- /dev/null
> +++ b/arch/mips/loongson/loongson-3/platform.c
> @@ -0,0 +1,43 @@
> +/*
> + * Copyright (C) 2009 Lemote Inc.
> + * Author: Wu Zhangjin, wuzhangjin@xxxxxxxxx
> + *         Xiang Yu, xiangy@xxxxxxxxxx
> + *         Chen Huacai, chenhc@xxxxxxxxxx
> + *
> + * This program is free software; you can redistribute  it and/or modify it
> + * under  the terms of  the GNU General  Public License as published by the
> + * Free Software Foundation;  either version 2 of the  License, or (at your
> + * option) any later version.
> + */
> +
> +#include <linux/err.h>
> +#include <linux/slab.h>
> +#include <linux/platform_device.h>
> +#include <asm/bootinfo.h>
> +#include <boot_param.h>
> +#include <loongson_hwmon.h>
> +#include <workarounds.h>
> +
> +static int __init loongson3_platform_init(void)
> +{
> +       int i;
> +       struct platform_device *pdev;
> +
> +       if (loongson_sysconf.ecname[0] != '\0')
> +               platform_device_register_simple(loongson_sysconf.ecname, -1, NULL, 0);
> +
> +       for (i = 0; i < loongson_sysconf.nr_sensors; i++) {
> +               if (loongson_sysconf.sensors[i].type > SENSOR_FAN)
> +                       continue;
> +
> +               pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
> +               pdev->name = loongson_sysconf.sensors[i].name;
> +               pdev->id = loongson_sysconf.sensors[i].id;
> +               pdev->dev.platform_data = &loongson_sysconf.sensors[i];
> +               platform_device_register(pdev);
> +       }
> +
> +       return 0;
> +}
> +
> +arch_initcall(loongson3_platform_init);
> diff --git a/arch/mips/loongson/loongson-3/smp.c b/arch/mips/loongson/loongson-3/smp.c
> index 94ed8a5..e2eb688 100644
> --- a/arch/mips/loongson/loongson-3/smp.c
> +++ b/arch/mips/loongson/loongson-3/smp.c
> @@ -25,6 +25,7 @@
>  #include <asm/tlbflush.h>
>  #include <asm/cacheflush.h>
>  #include <loongson.h>
> +#include <workarounds.h>
>
>  #include "smp.h"
>
> @@ -587,7 +588,7 @@ void loongson3_disable_clock(int cpu)
>         if (loongson_sysconf.cputype == Loongson_3A) {
>                 LOONGSON_CHIPCFG(package_id) &= ~(1 << (12 + core_id));
>         } else if (loongson_sysconf.cputype == Loongson_3B) {
> -               if (!cpuhotplug_workaround)
> +               if (!(loongson_sysconf.workarounds & WORKAROUND_CPUHOTPLUG))
>                         LOONGSON_FREQCTRL(package_id) &= ~(1 << (core_id * 4 + 3));
>         }
>  }
> @@ -600,7 +601,7 @@ void loongson3_enable_clock(int cpu)
>         if (loongson_sysconf.cputype == Loongson_3A) {
>                 LOONGSON_CHIPCFG(package_id) |= 1 << (12 + core_id);
>         } else if (loongson_sysconf.cputype == Loongson_3B) {
> -               if (!cpuhotplug_workaround)
> +               if (!(loongson_sysconf.workarounds & WORKAROUND_CPUHOTPLUG))
>                         LOONGSON_FREQCTRL(package_id) |= 1 << (core_id * 4 + 3);
>         }
>  }
> --
> 1.7.7.3
>





[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux