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:
		
					parent
					
						
							
								5513c760db
							
						
					
				
			
			
				commit
				
					
						d150cef4e8
					
				
			
		
					 4 changed files with 65 additions and 26 deletions
				
			
		|  | @ -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); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jayachandran C
				Jayachandran C