aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuacai Chen <chenhc@lemote.com>2014-06-25 23:41:27 -0400
committerRalf Baechle <ralf@linux-mips.org>2014-07-30 15:46:00 -0400
commit140e39c1e3d29f50e161f55cca60f60b80408c2a (patch)
treecf4fc2a0a1896dd80667ead4382012c308ba73ca
parentbda4584cd943d7bb6cf677a8d694700c1984cf3e (diff)
MIPS: Loongson: Modify ChipConfig register definition
This patch is prepared for Multi-chip interconnection. Since each chip has a ChipConfig register, LOONGSON_CHIPCFG should be an array. Signed-off-by: Huacai Chen <chenhc@lemote.com> Cc: John Crispin <john@phrozen.org> Cc: Steven J. Hill <Steven.Hill@imgtec.com> Cc: Aurelien Jarno <aurelien@aurel32.net> Cc: linux-mips@linux-mips.org Cc: Fuxin Zhang <zhangfx@lemote.com> Cc: Zhangjin Wu <wuzhangjin@gmail.com> Patchwork: https://patchwork.linux-mips.org/patch/7185/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/include/asm/mach-loongson/loongson.h7
-rw-r--r--arch/mips/loongson/common/env.c11
-rw-r--r--arch/mips/loongson/common/pm.c8
-rw-r--r--arch/mips/loongson/lemote-2f/clock.c4
-rw-r--r--arch/mips/loongson/lemote-2f/reset.c2
-rw-r--r--arch/mips/loongson/loongson-3/smp.c4
-rw-r--r--drivers/cpufreq/loongson2_cpufreq.c6
7 files changed, 28 insertions, 14 deletions
diff --git a/arch/mips/include/asm/mach-loongson/loongson.h b/arch/mips/include/asm/mach-loongson/loongson.h
index f3fd1eb8e3dd..a1c76caa7436 100644
--- a/arch/mips/include/asm/mach-loongson/loongson.h
+++ b/arch/mips/include/asm/mach-loongson/loongson.h
@@ -249,8 +249,11 @@ static inline void do_perfcnt_IRQ(void)
249#define LOONGSON_PXARB_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x68) 249#define LOONGSON_PXARB_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x68)
250#define LOONGSON_PXARB_STATUS LOONGSON_REG(LOONGSON_REGBASE + 0x6c) 250#define LOONGSON_PXARB_STATUS LOONGSON_REG(LOONGSON_REGBASE + 0x6c)
251 251
252/* Chip Config */ 252#define MAX_PACKAGES 4
253#define LOONGSON_CHIPCFG0 LOONGSON_REG(LOONGSON_REGBASE + 0x80) 253
254/* Chip Config registor of each physical cpu package, PRid >= Loongson-2F */
255extern u64 loongson_chipcfg[MAX_PACKAGES];
256#define LOONGSON_CHIPCFG(id) (*(volatile u32 *)(loongson_chipcfg[id]))
254 257
255/* pcimap */ 258/* pcimap */
256 259
diff --git a/arch/mips/loongson/common/env.c b/arch/mips/loongson/common/env.c
index 0c543eae49bf..dc592412f764 100644
--- a/arch/mips/loongson/common/env.c
+++ b/arch/mips/loongson/common/env.c
@@ -27,6 +27,8 @@ EXPORT_SYMBOL(cpu_clock_freq);
27struct efi_memory_map_loongson *loongson_memmap; 27struct efi_memory_map_loongson *loongson_memmap;
28struct loongson_system_configuration loongson_sysconf; 28struct loongson_system_configuration loongson_sysconf;
29 29
30u64 loongson_chipcfg[MAX_PACKAGES] = {0xffffffffbfc00180};
31
30#define parse_even_earlier(res, option, p) \ 32#define parse_even_earlier(res, option, p) \
31do { \ 33do { \
32 unsigned int tmp __maybe_unused; \ 34 unsigned int tmp __maybe_unused; \
@@ -77,6 +79,15 @@ void __init prom_init_env(void)
77 79
78 cpu_clock_freq = ecpu->cpu_clock_freq; 80 cpu_clock_freq = ecpu->cpu_clock_freq;
79 loongson_sysconf.cputype = ecpu->cputype; 81 loongson_sysconf.cputype = ecpu->cputype;
82 if (ecpu->cputype == Loongson_3A) {
83 loongson_chipcfg[0] = 0x900000001fe00180;
84 loongson_chipcfg[1] = 0x900010001fe00180;
85 loongson_chipcfg[2] = 0x900020001fe00180;
86 loongson_chipcfg[3] = 0x900030001fe00180;
87 } else {
88 loongson_chipcfg[0] = 0x900000001fe00180;
89 }
90
80 loongson_sysconf.nr_cpus = ecpu->nr_cpus; 91 loongson_sysconf.nr_cpus = ecpu->nr_cpus;
81 if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0) 92 if (ecpu->nr_cpus > NR_CPUS || ecpu->nr_cpus == 0)
82 loongson_sysconf.nr_cpus = NR_CPUS; 93 loongson_sysconf.nr_cpus = NR_CPUS;
diff --git a/arch/mips/loongson/common/pm.c b/arch/mips/loongson/common/pm.c
index f55e07aee071..a6b67ccfc811 100644
--- a/arch/mips/loongson/common/pm.c
+++ b/arch/mips/loongson/common/pm.c
@@ -79,7 +79,7 @@ int __weak wakeup_loongson(void)
79static void wait_for_wakeup_events(void) 79static void wait_for_wakeup_events(void)
80{ 80{
81 while (!wakeup_loongson()) 81 while (!wakeup_loongson())
82 LOONGSON_CHIPCFG0 &= ~0x7; 82 LOONGSON_CHIPCFG(0) &= ~0x7;
83} 83}
84 84
85/* 85/*
@@ -102,15 +102,15 @@ static void loongson_suspend_enter(void)
102 102
103 stop_perf_counters(); 103 stop_perf_counters();
104 104
105 cached_cpu_freq = LOONGSON_CHIPCFG0; 105 cached_cpu_freq = LOONGSON_CHIPCFG(0);
106 106
107 /* Put CPU into wait mode */ 107 /* Put CPU into wait mode */
108 LOONGSON_CHIPCFG0 &= ~0x7; 108 LOONGSON_CHIPCFG(0) &= ~0x7;
109 109
110 /* wait for the given events to wakeup cpu from wait mode */ 110 /* wait for the given events to wakeup cpu from wait mode */
111 wait_for_wakeup_events(); 111 wait_for_wakeup_events();
112 112
113 LOONGSON_CHIPCFG0 = cached_cpu_freq; 113 LOONGSON_CHIPCFG(0) = cached_cpu_freq;
114 mmiowb(); 114 mmiowb();
115} 115}
116 116
diff --git a/arch/mips/loongson/lemote-2f/clock.c b/arch/mips/loongson/lemote-2f/clock.c
index 1eed38e28b1e..a217061beee3 100644
--- a/arch/mips/loongson/lemote-2f/clock.c
+++ b/arch/mips/loongson/lemote-2f/clock.c
@@ -114,9 +114,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
114 114
115 clk->rate = rate; 115 clk->rate = rate;
116 116
117 regval = LOONGSON_CHIPCFG0; 117 regval = LOONGSON_CHIPCFG(0);
118 regval = (regval & ~0x7) | (pos->driver_data - 1); 118 regval = (regval & ~0x7) | (pos->driver_data - 1);
119 LOONGSON_CHIPCFG0 = regval; 119 LOONGSON_CHIPCFG(0) = regval;
120 120
121 return ret; 121 return ret;
122} 122}
diff --git a/arch/mips/loongson/lemote-2f/reset.c b/arch/mips/loongson/lemote-2f/reset.c
index 90962a3a1731..79ac694fe744 100644
--- a/arch/mips/loongson/lemote-2f/reset.c
+++ b/arch/mips/loongson/lemote-2f/reset.c
@@ -28,7 +28,7 @@ static void reset_cpu(void)
28 * reset cpu to full speed, this is needed when enabling cpu frequency 28 * reset cpu to full speed, this is needed when enabling cpu frequency
29 * scalling 29 * scalling
30 */ 30 */
31 LOONGSON_CHIPCFG0 |= 0x7; 31 LOONGSON_CHIPCFG(0) |= 0x7;
32} 32}
33 33
34/* reset support for fuloong2f */ 34/* reset support for fuloong2f */
diff --git a/arch/mips/loongson/loongson-3/smp.c b/arch/mips/loongson/loongson-3/smp.c
index 1e8894020ea5..3c320e709e91 100644
--- a/arch/mips/loongson/loongson-3/smp.c
+++ b/arch/mips/loongson/loongson-3/smp.c
@@ -399,12 +399,12 @@ static int loongson3_cpu_callback(struct notifier_block *nfb,
399 case CPU_POST_DEAD: 399 case CPU_POST_DEAD:
400 case CPU_POST_DEAD_FROZEN: 400 case CPU_POST_DEAD_FROZEN:
401 pr_info("Disable clock for CPU#%d\n", cpu); 401 pr_info("Disable clock for CPU#%d\n", cpu);
402 LOONGSON_CHIPCFG0 &= ~(1 << (12 + cpu)); 402 LOONGSON_CHIPCFG(0) &= ~(1 << (12 + cpu));
403 break; 403 break;
404 case CPU_UP_PREPARE: 404 case CPU_UP_PREPARE:
405 case CPU_UP_PREPARE_FROZEN: 405 case CPU_UP_PREPARE_FROZEN:
406 pr_info("Enable clock for CPU#%d\n", cpu); 406 pr_info("Enable clock for CPU#%d\n", cpu);
407 LOONGSON_CHIPCFG0 |= 1 << (12 + cpu); 407 LOONGSON_CHIPCFG(0) |= 1 << (12 + cpu);
408 break; 408 break;
409 } 409 }
410 410
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c
index d4add8621944..9fa177206032 100644
--- a/drivers/cpufreq/loongson2_cpufreq.c
+++ b/drivers/cpufreq/loongson2_cpufreq.c
@@ -148,9 +148,9 @@ static void loongson2_cpu_wait(void)
148 u32 cpu_freq; 148 u32 cpu_freq;
149 149
150 spin_lock_irqsave(&loongson2_wait_lock, flags); 150 spin_lock_irqsave(&loongson2_wait_lock, flags);
151 cpu_freq = LOONGSON_CHIPCFG0; 151 cpu_freq = LOONGSON_CHIPCFG(0);
152 LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */ 152 LOONGSON_CHIPCFG(0) &= ~0x7; /* Put CPU into wait mode */
153 LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */ 153 LOONGSON_CHIPCFG(0) = cpu_freq; /* Restore CPU state */
154 spin_unlock_irqrestore(&loongson2_wait_lock, flags); 154 spin_unlock_irqrestore(&loongson2_wait_lock, flags);
155 local_irq_enable(); 155 local_irq_enable();
156} 156}