MIPS: Netlogic: XLP9XX PIC updates

Functions for the XLP9XX interrupt table entry format and other PIC
register changes.

Signed-off-by: Jayachandran C <jchandra@broadcom.com>
Signed-off-by: John Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/6279/
This commit is contained in:
Jayachandran C 2013-12-21 16:52:22 +05:30 committed by Ralf Baechle
parent 5513c760db
commit d150cef4e8
4 changed files with 65 additions and 26 deletions

View file

@ -150,12 +150,19 @@
#define PIC_IRT0 0x74 #define PIC_IRT0 0x74
#define PIC_IRT(i) (PIC_IRT0 + ((i) * 2)) #define PIC_IRT(i) (PIC_IRT0 + ((i) * 2))
#define TIMER_CYCLES_MAXVAL 0xffffffffffffffffULL #define PIC_9XX_PENDING_0 0x6
#define PIC_9XX_PENDING_1 0x8
#define PIC_9XX_PENDING_2 0xa
#define PIC_9XX_PENDING_3 0xc
#define PIC_9XX_IRT0 0x1c0
#define PIC_9XX_IRT(i) (PIC_9XX_IRT0 + ((i) * 2))
/* /*
* IRT Map * IRT Map
*/ */
#define PIC_NUM_IRTS 160 #define PIC_NUM_IRTS 160
#define PIC_9XX_NUM_IRTS 256
#define PIC_IRT_WD_0_INDEX 0 #define PIC_IRT_WD_0_INDEX 0
#define PIC_IRT_WD_1_INDEX 1 #define PIC_IRT_WD_1_INDEX 1
@ -205,30 +212,26 @@
#define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r) #define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r)
#define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v) #define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v)
#define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) #define nlm_get_pic_pcibase(node) nlm_pcicfg_base(cpu_is_xlp9xx() ? \
XLP9XX_IO_PIC_OFFSET(node) : XLP_IO_PIC_OFFSET(node))
#define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ) #define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ)
/* We use PIC on node 0 as a timer */ /* We use PIC on node 0 as a timer */
#define pic_timer_freq() nlm_get_pic_frequency(0) #define pic_timer_freq() nlm_get_pic_frequency(0)
/* IRT and h/w interrupt routines */ /* IRT and h/w interrupt routines */
static inline int
nlm_pic_read_irt(uint64_t base, int irt_index)
{
return nlm_read_pic_reg(base, PIC_IRT(irt_index));
}
static inline void static inline void
nlm_set_irt_to_cpu(uint64_t base, int irt, int cpu) nlm_9xx_pic_write_irt(uint64_t base, int irt_num, int en, int nmi,
int sch, int vec, int dt, int db, int cpu)
{ {
uint64_t val; uint64_t val;
val = nlm_read_pic_reg(base, PIC_IRT(irt)); val = (((uint64_t)en & 0x1) << 22) | ((nmi & 0x1) << 23) |
/* clear cpuset and mask */ ((0 /*mc*/) << 20) | ((vec & 0x3f) << 24) |
val &= ~((0x7ull << 16) | 0xffff); ((dt & 0x1) << 21) | (0 /*ptr*/ << 16) |
/* set DB, cpuset and cpumask */ (cpu & 0x3ff);
val |= (1 << 19) | ((cpu >> 4) << 16) | (1 << (cpu & 0xf));
nlm_write_pic_reg(base, PIC_IRT(irt), val); nlm_write_pic_reg(base, PIC_9XX_IRT(irt_num), val);
} }
static inline void static inline void
@ -249,9 +252,13 @@ static inline void
nlm_pic_write_irt_direct(uint64_t base, int irt_num, int en, int nmi, nlm_pic_write_irt_direct(uint64_t base, int irt_num, int en, int nmi,
int sch, int vec, int cpu) int sch, int vec, int cpu)
{ {
nlm_pic_write_irt(base, irt_num, en, nmi, sch, vec, 1, if (cpu_is_xlp9xx())
(cpu >> 4), /* thread group */ nlm_9xx_pic_write_irt(base, irt_num, en, nmi, sch, vec,
1 << (cpu & 0xf)); /* thread mask */ 1, 0, cpu);
else
nlm_pic_write_irt(base, irt_num, en, nmi, sch, vec, 1,
(cpu >> 4), /* thread group */
1 << (cpu & 0xf)); /* thread mask */
} }
static inline uint64_t static inline uint64_t
@ -293,8 +300,13 @@ nlm_pic_enable_irt(uint64_t base, int irt)
{ {
uint64_t reg; uint64_t reg;
reg = nlm_read_pic_reg(base, PIC_IRT(irt)); if (cpu_is_xlp9xx()) {
nlm_write_pic_reg(base, PIC_IRT(irt), reg | (1u << 31)); reg = nlm_read_pic_reg(base, PIC_9XX_IRT(irt));
nlm_write_pic_reg(base, PIC_9XX_IRT(irt), reg | (1 << 22));
} else {
reg = nlm_read_pic_reg(base, PIC_IRT(irt));
nlm_write_pic_reg(base, PIC_IRT(irt), reg | (1u << 31));
}
} }
static inline void static inline void
@ -302,8 +314,15 @@ nlm_pic_disable_irt(uint64_t base, int irt)
{ {
uint64_t reg; uint64_t reg;
reg = nlm_read_pic_reg(base, PIC_IRT(irt)); if (cpu_is_xlp9xx()) {
nlm_write_pic_reg(base, PIC_IRT(irt), reg & ~((uint64_t)1 << 31)); reg = nlm_read_pic_reg(base, PIC_9XX_IRT(irt));
reg &= ~((uint64_t)1 << 22);
nlm_write_pic_reg(base, PIC_9XX_IRT(irt), reg);
} else {
reg = nlm_read_pic_reg(base, PIC_IRT(irt));
reg &= ~((uint64_t)1 << 31);
nlm_write_pic_reg(base, PIC_IRT(irt), reg);
}
} }
static inline void static inline void
@ -311,8 +330,13 @@ nlm_pic_send_ipi(uint64_t base, int hwt, int irq, int nmi)
{ {
uint64_t ipi; uint64_t ipi;
ipi = ((uint64_t)nmi << 31) | (irq << 20); if (cpu_is_xlp9xx())
ipi |= ((hwt >> 4) << 16) | (1 << (hwt & 0xf)); /* cpuset and mask */ ipi = (nmi << 23) | (irq << 24) |
(0/*mcm*/ << 20) | (0/*ptr*/ << 16) | hwt;
else
ipi = ((uint64_t)nmi << 31) | (irq << 20) |
((hwt >> 4) << 16) | (1 << (hwt & 0xf));
nlm_write_pic_reg(base, PIC_IPI_CTL, ipi); nlm_write_pic_reg(base, PIC_IPI_CTL, ipi);
} }

View file

@ -69,6 +69,17 @@ int nlm_irq_to_irt(int irq)
uint64_t pcibase; uint64_t pcibase;
int devoff, irt; int devoff, irt;
/* bypass for 9xx */
if (cpu_is_xlp9xx()) {
switch (irq) {
case PIC_UART_0_IRQ:
return 133;
case PIC_UART_1_IRQ:
return 134;
}
return -1;
}
devoff = 0; devoff = 0;
switch (irq) { switch (irq) {
case PIC_UART_0_IRQ: case PIC_UART_0_IRQ:
@ -277,6 +288,10 @@ static unsigned int nlm_2xx_get_pic_frequency(int node)
unsigned int nlm_get_pic_frequency(int node) unsigned int nlm_get_pic_frequency(int node)
{ {
/* TODO Has to calculate freq as like 2xx */
if (cpu_is_xlp9xx())
return 250000000;
if (cpu_is_xlpii()) if (cpu_is_xlpii())
return nlm_2xx_get_pic_frequency(node); return nlm_2xx_get_pic_frequency(node);
else else

View file

@ -47,8 +47,8 @@
#include <asm/netlogic/mips-extns.h> #include <asm/netlogic/mips-extns.h>
#include <asm/netlogic/xlp-hal/iomap.h> #include <asm/netlogic/xlp-hal/iomap.h>
#include <asm/netlogic/xlp-hal/pic.h>
#include <asm/netlogic/xlp-hal/xlp.h> #include <asm/netlogic/xlp-hal/xlp.h>
#include <asm/netlogic/xlp-hal/pic.h>
#include <asm/netlogic/xlp-hal/sys.h> #include <asm/netlogic/xlp-hal/sys.h>
static int xlp_wakeup_core(uint64_t sysbase, int node, int core) static int xlp_wakeup_core(uint64_t sysbase, int node, int core)

View file

@ -50,8 +50,8 @@
#include <asm/netlogic/mips-extns.h> #include <asm/netlogic/mips-extns.h>
#include <asm/netlogic/xlp-hal/iomap.h> #include <asm/netlogic/xlp-hal/iomap.h>
#include <asm/netlogic/xlp-hal/pic.h>
#include <asm/netlogic/xlp-hal/xlp.h> #include <asm/netlogic/xlp-hal/xlp.h>
#include <asm/netlogic/xlp-hal/pic.h>
#include <asm/netlogic/xlp-hal/pcibus.h> #include <asm/netlogic/xlp-hal/pcibus.h>
#include <asm/netlogic/xlp-hal/bridge.h> #include <asm/netlogic/xlp-hal/bridge.h>