diff options
-rw-r--r-- | arch/mips/include/asm/netlogic/xlp-hal/pic.h | 12 | ||||
-rw-r--r-- | arch/mips/include/asm/netlogic/xlr/pic.h | 48 | ||||
-rw-r--r-- | arch/mips/netlogic/common/irq.c | 2 | ||||
-rw-r--r-- | arch/mips/netlogic/common/time.c | 52 | ||||
-rw-r--r-- | arch/mips/netlogic/xlr/platform.c | 2 | ||||
-rw-r--r-- | arch/mips/netlogic/xlr/setup.c | 2 |
6 files changed, 110 insertions, 8 deletions
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/pic.h b/arch/mips/include/asm/netlogic/xlp-hal/pic.h index b2e53a5383ab..ea6768c3e9f8 100644 --- a/arch/mips/include/asm/netlogic/xlp-hal/pic.h +++ b/arch/mips/include/asm/netlogic/xlp-hal/pic.h | |||
@@ -261,6 +261,8 @@ | |||
261 | #define PIC_LOCAL_SCHEDULING 1 | 261 | #define PIC_LOCAL_SCHEDULING 1 |
262 | #define PIC_GLOBAL_SCHEDULING 0 | 262 | #define PIC_GLOBAL_SCHEDULING 0 |
263 | 263 | ||
264 | #define PIC_CLK_HZ 133333333 | ||
265 | |||
264 | #define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r) | 266 | #define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r) |
265 | #define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v) | 267 | #define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v) |
266 | #define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) | 268 | #define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) |
@@ -315,6 +317,12 @@ nlm_pic_read_timer(uint64_t base, int timer) | |||
315 | return nlm_read_pic_reg(base, PIC_TIMER_COUNT(timer)); | 317 | return nlm_read_pic_reg(base, PIC_TIMER_COUNT(timer)); |
316 | } | 318 | } |
317 | 319 | ||
320 | static inline uint32_t | ||
321 | nlm_pic_read_timer32(uint64_t base, int timer) | ||
322 | { | ||
323 | return (uint32_t)nlm_read_pic_reg(base, PIC_TIMER_COUNT(timer)); | ||
324 | } | ||
325 | |||
318 | static inline void | 326 | static inline void |
319 | nlm_pic_write_timer(uint64_t base, int timer, uint64_t value) | 327 | nlm_pic_write_timer(uint64_t base, int timer, uint64_t value) |
320 | { | 328 | { |
@@ -376,9 +384,9 @@ nlm_pic_ack(uint64_t base, int irt_num) | |||
376 | } | 384 | } |
377 | 385 | ||
378 | static inline void | 386 | static inline void |
379 | nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt) | 387 | nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt, int en) |
380 | { | 388 | { |
381 | nlm_pic_write_irt_direct(base, irt, 0, 0, 0, irq, hwt); | 389 | nlm_pic_write_irt_direct(base, irt, en, 0, 0, irq, hwt); |
382 | } | 390 | } |
383 | 391 | ||
384 | int nlm_irq_to_irt(int irq); | 392 | int nlm_irq_to_irt(int irq); |
diff --git a/arch/mips/include/asm/netlogic/xlr/pic.h b/arch/mips/include/asm/netlogic/xlr/pic.h index 9a691b1f91ba..effa3377ded5 100644 --- a/arch/mips/include/asm/netlogic/xlr/pic.h +++ b/arch/mips/include/asm/netlogic/xlr/pic.h | |||
@@ -35,10 +35,11 @@ | |||
35 | #ifndef _ASM_NLM_XLR_PIC_H | 35 | #ifndef _ASM_NLM_XLR_PIC_H |
36 | #define _ASM_NLM_XLR_PIC_H | 36 | #define _ASM_NLM_XLR_PIC_H |
37 | 37 | ||
38 | #define PIC_CLKS_PER_SEC 66666666ULL | 38 | #define PIC_CLK_HZ 66666666 |
39 | /* PIC hardware interrupt numbers */ | 39 | /* PIC hardware interrupt numbers */ |
40 | #define PIC_IRT_WD_INDEX 0 | 40 | #define PIC_IRT_WD_INDEX 0 |
41 | #define PIC_IRT_TIMER_0_INDEX 1 | 41 | #define PIC_IRT_TIMER_0_INDEX 1 |
42 | #define PIC_IRT_TIMER_INDEX(i) ((i) + PIC_IRT_TIMER_0_INDEX) | ||
42 | #define PIC_IRT_TIMER_1_INDEX 2 | 43 | #define PIC_IRT_TIMER_1_INDEX 2 |
43 | #define PIC_IRT_TIMER_2_INDEX 3 | 44 | #define PIC_IRT_TIMER_2_INDEX 3 |
44 | #define PIC_IRT_TIMER_3_INDEX 4 | 45 | #define PIC_IRT_TIMER_3_INDEX 4 |
@@ -99,6 +100,7 @@ | |||
99 | 100 | ||
100 | /* PIC Registers */ | 101 | /* PIC Registers */ |
101 | #define PIC_CTRL 0x00 | 102 | #define PIC_CTRL 0x00 |
103 | #define PIC_CTRL_STE 8 /* timer enable start bit */ | ||
102 | #define PIC_IPI 0x04 | 104 | #define PIC_IPI 0x04 |
103 | #define PIC_INT_ACK 0x06 | 105 | #define PIC_INT_ACK 0x06 |
104 | 106 | ||
@@ -251,12 +253,52 @@ nlm_pic_ack(uint64_t base, int irt) | |||
251 | } | 253 | } |
252 | 254 | ||
253 | static inline void | 255 | static inline void |
254 | nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt) | 256 | nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt, int en) |
255 | { | 257 | { |
256 | nlm_write_reg(base, PIC_IRT_0(irt), (1u << hwt)); | 258 | nlm_write_reg(base, PIC_IRT_0(irt), (1u << hwt)); |
257 | /* local scheduling, invalid, level by default */ | 259 | /* local scheduling, invalid, level by default */ |
258 | nlm_write_reg(base, PIC_IRT_1(irt), | 260 | nlm_write_reg(base, PIC_IRT_1(irt), |
259 | (1 << 30) | (1 << 6) | irq); | 261 | (en << 30) | (1 << 6) | irq); |
262 | } | ||
263 | |||
264 | static inline uint64_t | ||
265 | nlm_pic_read_timer(uint64_t base, int timer) | ||
266 | { | ||
267 | uint32_t up1, up2, low; | ||
268 | |||
269 | up1 = nlm_read_reg(base, PIC_TIMER_COUNT_1(timer)); | ||
270 | low = nlm_read_reg(base, PIC_TIMER_COUNT_0(timer)); | ||
271 | up2 = nlm_read_reg(base, PIC_TIMER_COUNT_1(timer)); | ||
272 | |||
273 | if (up1 != up2) /* wrapped, get the new low */ | ||
274 | low = nlm_read_reg(base, PIC_TIMER_COUNT_0(timer)); | ||
275 | return ((uint64_t)up2 << 32) | low; | ||
276 | |||
277 | } | ||
278 | |||
279 | static inline uint32_t | ||
280 | nlm_pic_read_timer32(uint64_t base, int timer) | ||
281 | { | ||
282 | return nlm_read_reg(base, PIC_TIMER_COUNT_0(timer)); | ||
283 | } | ||
284 | |||
285 | static inline void | ||
286 | nlm_pic_set_timer(uint64_t base, int timer, uint64_t value, int irq, int cpu) | ||
287 | { | ||
288 | uint32_t up, low; | ||
289 | uint64_t pic_ctrl = nlm_read_reg(base, PIC_CTRL); | ||
290 | int en; | ||
291 | |||
292 | en = (irq > 0); | ||
293 | up = value >> 32; | ||
294 | low = value & 0xFFFFFFFF; | ||
295 | nlm_write_reg(base, PIC_TIMER_MAXVAL_0(timer), low); | ||
296 | nlm_write_reg(base, PIC_TIMER_MAXVAL_1(timer), up); | ||
297 | nlm_pic_init_irt(base, PIC_IRT_TIMER_INDEX(timer), irq, cpu, 0); | ||
298 | |||
299 | /* enable the timer */ | ||
300 | pic_ctrl |= (1 << (PIC_CTRL_STE + timer)); | ||
301 | nlm_write_reg(base, PIC_CTRL, pic_ctrl); | ||
260 | } | 302 | } |
261 | #endif | 303 | #endif |
262 | #endif /* _ASM_NLM_XLR_PIC_H */ | 304 | #endif /* _ASM_NLM_XLR_PIC_H */ |
diff --git a/arch/mips/netlogic/common/irq.c b/arch/mips/netlogic/common/irq.c index d42cd1a2a124..642f1e4c2717 100644 --- a/arch/mips/netlogic/common/irq.c +++ b/arch/mips/netlogic/common/irq.c | |||
@@ -217,7 +217,7 @@ static void nlm_init_node_irqs(int node) | |||
217 | nlm_setup_pic_irq(node, i, i, irt); | 217 | nlm_setup_pic_irq(node, i, i, irt); |
218 | /* set interrupts to first cpu in node */ | 218 | /* set interrupts to first cpu in node */ |
219 | nlm_pic_init_irt(nodep->picbase, irt, i, | 219 | nlm_pic_init_irt(nodep->picbase, irt, i, |
220 | node * NLM_CPUS_PER_NODE); | 220 | node * NLM_CPUS_PER_NODE, 0); |
221 | irqmask |= (1ull << i); | 221 | irqmask |= (1ull << i); |
222 | } | 222 | } |
223 | nodep->irqmask = irqmask; | 223 | nodep->irqmask = irqmask; |
diff --git a/arch/mips/netlogic/common/time.c b/arch/mips/netlogic/common/time.c index bd3e498157ff..20f89bc0507f 100644 --- a/arch/mips/netlogic/common/time.c +++ b/arch/mips/netlogic/common/time.c | |||
@@ -35,16 +35,68 @@ | |||
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | 36 | ||
37 | #include <asm/time.h> | 37 | #include <asm/time.h> |
38 | #include <asm/cpu-features.h> | ||
39 | |||
38 | #include <asm/netlogic/interrupt.h> | 40 | #include <asm/netlogic/interrupt.h> |
39 | #include <asm/netlogic/common.h> | 41 | #include <asm/netlogic/common.h> |
42 | #include <asm/netlogic/haldefs.h> | ||
43 | #include <asm/netlogic/common.h> | ||
44 | |||
45 | #if defined(CONFIG_CPU_XLP) | ||
46 | #include <asm/netlogic/xlp-hal/iomap.h> | ||
47 | #include <asm/netlogic/xlp-hal/xlp.h> | ||
48 | #include <asm/netlogic/xlp-hal/pic.h> | ||
49 | #elif defined(CONFIG_CPU_XLR) | ||
50 | #include <asm/netlogic/xlr/iomap.h> | ||
51 | #include <asm/netlogic/xlr/pic.h> | ||
52 | #include <asm/netlogic/xlr/xlr.h> | ||
53 | #else | ||
54 | #error "Unknown CPU" | ||
55 | #endif | ||
40 | 56 | ||
41 | unsigned int __cpuinit get_c0_compare_int(void) | 57 | unsigned int __cpuinit get_c0_compare_int(void) |
42 | { | 58 | { |
43 | return IRQ_TIMER; | 59 | return IRQ_TIMER; |
44 | } | 60 | } |
45 | 61 | ||
62 | static cycle_t nlm_get_pic_timer(struct clocksource *cs) | ||
63 | { | ||
64 | uint64_t picbase = nlm_get_node(0)->picbase; | ||
65 | |||
66 | return ~nlm_pic_read_timer(picbase, PIC_CLOCK_TIMER); | ||
67 | } | ||
68 | |||
69 | static cycle_t nlm_get_pic_timer32(struct clocksource *cs) | ||
70 | { | ||
71 | uint64_t picbase = nlm_get_node(0)->picbase; | ||
72 | |||
73 | return ~nlm_pic_read_timer32(picbase, PIC_CLOCK_TIMER); | ||
74 | } | ||
75 | |||
76 | static struct clocksource csrc_pic = { | ||
77 | .name = "PIC", | ||
78 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
79 | }; | ||
80 | |||
81 | static void nlm_init_pic_timer(void) | ||
82 | { | ||
83 | uint64_t picbase = nlm_get_node(0)->picbase; | ||
84 | |||
85 | nlm_pic_set_timer(picbase, PIC_CLOCK_TIMER, ~0ULL, 0, 0); | ||
86 | if (current_cpu_data.cputype == CPU_XLR) { | ||
87 | csrc_pic.mask = CLOCKSOURCE_MASK(32); | ||
88 | csrc_pic.read = nlm_get_pic_timer32; | ||
89 | } else { | ||
90 | csrc_pic.mask = CLOCKSOURCE_MASK(64); | ||
91 | csrc_pic.read = nlm_get_pic_timer; | ||
92 | } | ||
93 | csrc_pic.rating = 1000; | ||
94 | clocksource_register_hz(&csrc_pic, PIC_CLK_HZ); | ||
95 | } | ||
96 | |||
46 | void __init plat_time_init(void) | 97 | void __init plat_time_init(void) |
47 | { | 98 | { |
99 | nlm_init_pic_timer(); | ||
48 | mips_hpt_frequency = nlm_get_cpu_frequency(); | 100 | mips_hpt_frequency = nlm_get_cpu_frequency(); |
49 | pr_info("MIPS counter frequency [%ld]\n", | 101 | pr_info("MIPS counter frequency [%ld]\n", |
50 | (unsigned long)mips_hpt_frequency); | 102 | (unsigned long)mips_hpt_frequency); |
diff --git a/arch/mips/netlogic/xlr/platform.c b/arch/mips/netlogic/xlr/platform.c index 507230eeb768..ce838f951356 100644 --- a/arch/mips/netlogic/xlr/platform.c +++ b/arch/mips/netlogic/xlr/platform.c | |||
@@ -64,7 +64,7 @@ void nlm_xlr_uart_out(struct uart_port *p, int offset, int value) | |||
64 | .iotype = UPIO_MEM32, \ | 64 | .iotype = UPIO_MEM32, \ |
65 | .flags = (UPF_SKIP_TEST | \ | 65 | .flags = (UPF_SKIP_TEST | \ |
66 | UPF_FIXED_TYPE | UPF_BOOT_AUTOCONF),\ | 66 | UPF_FIXED_TYPE | UPF_BOOT_AUTOCONF),\ |
67 | .uartclk = PIC_CLKS_PER_SEC, \ | 67 | .uartclk = PIC_CLK_HZ, \ |
68 | .type = PORT_16550A, \ | 68 | .type = PORT_16550A, \ |
69 | .serial_in = nlm_xlr_uart_in, \ | 69 | .serial_in = nlm_xlr_uart_in, \ |
70 | .serial_out = nlm_xlr_uart_out, \ | 70 | .serial_out = nlm_xlr_uart_out, \ |
diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index c5ce6992ac4c..54b301c809e1 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c | |||
@@ -70,7 +70,7 @@ static void __init nlm_early_serial_setup(void) | |||
70 | s.iotype = UPIO_MEM32; | 70 | s.iotype = UPIO_MEM32; |
71 | s.regshift = 2; | 71 | s.regshift = 2; |
72 | s.irq = PIC_UART_0_IRQ; | 72 | s.irq = PIC_UART_0_IRQ; |
73 | s.uartclk = PIC_CLKS_PER_SEC; | 73 | s.uartclk = PIC_CLK_HZ; |
74 | s.serial_in = nlm_xlr_uart_in; | 74 | s.serial_in = nlm_xlr_uart_in; |
75 | s.serial_out = nlm_xlr_uart_out; | 75 | s.serial_out = nlm_xlr_uart_out; |
76 | s.mapbase = uart_base; | 76 | s.mapbase = uart_base; |