diff options
Diffstat (limited to 'arch/mips/include/asm/netlogic')
| -rw-r--r-- | arch/mips/include/asm/netlogic/common.h | 51 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/interrupt.h | 2 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/mips-extns.h | 142 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/xlp-hal/pic.h | 44 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/xlp-hal/sys.h | 1 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/xlr/fmn.h | 363 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/xlr/pic.h | 2 | ||||
| -rw-r--r-- | arch/mips/include/asm/netlogic/xlr/xlr.h | 6 | 
8 files changed, 560 insertions, 51 deletions
diff --git a/arch/mips/include/asm/netlogic/common.h b/arch/mips/include/asm/netlogic/common.h index fdd2f44c7b5..42bfd5f1eee 100644 --- a/arch/mips/include/asm/netlogic/common.h +++ b/arch/mips/include/asm/netlogic/common.h @@ -45,15 +45,19 @@  #define	BOOT_NMI_HANDLER	8  #ifndef __ASSEMBLY__ +#include <linux/cpumask.h> +#include <linux/spinlock.h> +#include <asm/irq.h> +#include <asm/mach-netlogic/multi-node.h> +  struct irq_desc; -extern struct plat_smp_ops nlm_smp_ops; -extern char nlm_reset_entry[], nlm_reset_entry_end[];  void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc);  void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc); -void nlm_smp_irq_init(void); +void nlm_smp_irq_init(int hwcpuid);  void nlm_boot_secondary_cpus(void); -int nlm_wakeup_secondary_cpus(u32 wakeup_mask); +int nlm_wakeup_secondary_cpus(void);  void nlm_rmiboot_preboot(void); +void nlm_percpu_init(int hwcpuid);  static inline void  nlm_set_nmi_handler(void *handler) @@ -68,9 +72,42 @@ nlm_set_nmi_handler(void *handler)   * Misc.   */  unsigned int nlm_get_cpu_frequency(void); +void nlm_node_init(int node); +extern struct plat_smp_ops nlm_smp_ops; +extern char nlm_reset_entry[], nlm_reset_entry_end[]; + +extern unsigned int nlm_threads_per_core; +extern cpumask_t nlm_cpumask; + +struct nlm_soc_info { +	unsigned long coremask;	/* cores enabled on the soc */ +	unsigned long ebase; +	uint64_t irqmask; +	uint64_t sysbase;	/* only for XLP */ +	uint64_t picbase; +	spinlock_t piclock; +}; + +#define	nlm_get_node(i)		(&nlm_nodes[i]) +#ifdef CONFIG_CPU_XLR +#define	nlm_current_node()	(&nlm_nodes[0]) +#else +#define nlm_current_node()	(&nlm_nodes[nlm_nodeid()]) +#endif + +struct irq_data; +uint64_t nlm_pci_irqmask(int node); +void nlm_set_pic_extra_ack(int node, int irq,  void (*xack)(struct irq_data *)); + +/* + * The NR_IRQs is divided between nodes, each of them has a separate irq space + */ +static inline int nlm_irq_to_xirq(int node, int irq) +{ +	return node * NR_IRQS / NLM_NR_NODES + irq; +} -extern unsigned long nlm_common_ebase; -extern int nlm_threads_per_core; -extern uint32_t nlm_cpumask, nlm_coremask; +extern struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; +extern int nlm_cpu_ready[];  #endif  #endif /* _NETLOGIC_COMMON_H_ */ diff --git a/arch/mips/include/asm/netlogic/interrupt.h b/arch/mips/include/asm/netlogic/interrupt.h index a85aadb6cfd..ed5993d9b7b 100644 --- a/arch/mips/include/asm/netlogic/interrupt.h +++ b/arch/mips/include/asm/netlogic/interrupt.h @@ -39,7 +39,7 @@  #define IRQ_IPI_SMP_FUNCTION	3  #define IRQ_IPI_SMP_RESCHEDULE	4 -#define IRQ_MSGRING		6 +#define IRQ_FMN			5  #define IRQ_TIMER		7  #endif diff --git a/arch/mips/include/asm/netlogic/mips-extns.h b/arch/mips/include/asm/netlogic/mips-extns.h index 8c53d0ba4bf..32ba6d95d47 100644 --- a/arch/mips/include/asm/netlogic/mips-extns.h +++ b/arch/mips/include/asm/netlogic/mips-extns.h @@ -73,4 +73,146 @@ static inline int hard_smp_processor_id(void)  	return __read_32bit_c0_register($15, 1) & 0x3ff;  } +static inline int nlm_nodeid(void) +{ +	return (__read_32bit_c0_register($15, 1) >> 5) & 0x3; +} + +static inline unsigned int nlm_core_id(void) +{ +	return (read_c0_ebase() & 0x1c) >> 2; +} + +static inline unsigned int nlm_thread_id(void) +{ +	return read_c0_ebase() & 0x3; +} + +#define __read_64bit_c2_split(source, sel)				\ +({									\ +	unsigned long long __val;					\ +	unsigned long __flags;						\ +									\ +	local_irq_save(__flags);					\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc2\t%M0, " #source "\n\t"			\ +			"dsll\t%L0, %M0, 32\n\t"			\ +			"dsra\t%M0, %M0, 32\n\t"			\ +			"dsra\t%L0, %L0, 32\n\t"			\ +			".set\tmips0\n\t"				\ +			: "=r" (__val));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc2\t%M0, " #source ", " #sel "\n\t"		\ +			"dsll\t%L0, %M0, 32\n\t"			\ +			"dsra\t%M0, %M0, 32\n\t"			\ +			"dsra\t%L0, %L0, 32\n\t"			\ +			".set\tmips0\n\t"				\ +			: "=r" (__val));				\ +	local_irq_restore(__flags);					\ +									\ +	__val;								\ +}) + +#define __write_64bit_c2_split(source, sel, val)			\ +do {									\ +	unsigned long __flags;						\ +									\ +	local_irq_save(__flags);					\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dsll\t%L0, %L0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			"dsll\t%M0, %M0, 32\n\t"			\ +			"or\t%L0, %L0, %M0\n\t"				\ +			"dmtc2\t%L0, " #source "\n\t"			\ +			".set\tmips0\n\t"				\ +			: : "r" (val));					\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dsll\t%L0, %L0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			"dsll\t%M0, %M0, 32\n\t"			\ +			"or\t%L0, %L0, %M0\n\t"				\ +			"dmtc2\t%L0, " #source ", " #sel "\n\t"		\ +			".set\tmips0\n\t"				\ +			: : "r" (val));					\ +	local_irq_restore(__flags);					\ +} while (0) + +#define __read_32bit_c2_register(source, sel)				\ +({ uint32_t __res;							\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips32\n\t"				\ +			"mfc2\t%0, " #source "\n\t"			\ +			".set\tmips0\n\t"				\ +			: "=r" (__res));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips32\n\t"				\ +			"mfc2\t%0, " #source ", " #sel "\n\t"		\ +			".set\tmips0\n\t"				\ +			: "=r" (__res));				\ +	__res;								\ +}) + +#define __read_64bit_c2_register(source, sel)				\ +({ unsigned long long __res;						\ +	if (sizeof(unsigned long) == 4)					\ +		__res = __read_64bit_c2_split(source, sel);		\ +	else if (sel == 0)						\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc2\t%0, " #source "\n\t"			\ +			".set\tmips0\n\t"				\ +			: "=r" (__res));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc2\t%0, " #source ", " #sel "\n\t"		\ +			".set\tmips0\n\t"				\ +			: "=r" (__res));				\ +	__res;								\ +}) + +#define __write_64bit_c2_register(register, sel, value)			\ +do {									\ +	if (sizeof(unsigned long) == 4)					\ +		__write_64bit_c2_split(register, sel, value);		\ +	else if (sel == 0)						\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmtc2\t%z0, " #register "\n\t"			\ +			".set\tmips0\n\t"				\ +			: : "Jr" (value));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmtc2\t%z0, " #register ", " #sel "\n\t"	\ +			".set\tmips0\n\t"				\ +			: : "Jr" (value));				\ +} while (0) + +#define __write_32bit_c2_register(reg, sel, value)			\ +({									\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips32\n\t"				\ +			"mtc2\t%z0, " #reg "\n\t"			\ +			".set\tmips0\n\t"				\ +			: : "Jr" (value));				\ +	else								\ +		__asm__ __volatile__(                                   \ +			".set\tmips32\n\t"				\ +			"mtc2\t%z0, " #reg ", " #sel "\n\t"		\ +			".set\tmips0\n\t"				\ +			: : "Jr" (value));				\ +}) +  #endif /*_ASM_NLM_MIPS_EXTS_H */ diff --git a/arch/mips/include/asm/netlogic/xlp-hal/pic.h b/arch/mips/include/asm/netlogic/xlp-hal/pic.h index ad8b80233a6..b2e53a5383a 100644 --- a/arch/mips/include/asm/netlogic/xlp-hal/pic.h +++ b/arch/mips/include/asm/netlogic/xlp-hal/pic.h @@ -273,36 +273,16 @@ nlm_pic_read_irt(uint64_t base, int irt_index)  	return nlm_read_pic_reg(base, PIC_IRT(irt_index));  } -static inline uint64_t -nlm_pic_read_control(uint64_t base) -{ -	return nlm_read_pic_reg(base, PIC_CTRL); -} - -static inline void -nlm_pic_write_control(uint64_t base, uint64_t control) -{ -	nlm_write_pic_reg(base, PIC_CTRL, control); -} - -static inline void -nlm_pic_update_control(uint64_t base, uint64_t control) -{ -	uint64_t val; - -	val = nlm_read_pic_reg(base, PIC_CTRL); -	nlm_write_pic_reg(base, PIC_CTRL, control | val); -} -  static inline void  nlm_set_irt_to_cpu(uint64_t base, int irt, int cpu)  {  	uint64_t val;  	val = nlm_read_pic_reg(base, PIC_IRT(irt)); -	val |= cpu & 0xf; -	if (cpu > 15) -		val |= 1 << 16; +	/* clear cpuset and mask */ +	val &= ~((0x7ull << 16) | 0xffff); +	/* set DB, cpuset and cpumask */ +	val |= (1 << 19) | ((cpu >> 4) << 16) | (1 << (cpu & 0xf));  	nlm_write_pic_reg(base, PIC_IRT(irt), val);  } @@ -369,7 +349,7 @@ nlm_pic_enable_irt(uint64_t base, int irt)  static inline void  nlm_pic_disable_irt(uint64_t base, int irt)  { -	uint32_t reg; +	uint64_t reg;  	reg = nlm_read_pic_reg(base, PIC_IRT(irt));  	nlm_write_pic_reg(base, PIC_IRT(irt), reg & ~((uint64_t)1 << 31)); @@ -379,15 +359,9 @@ static inline void  nlm_pic_send_ipi(uint64_t base, int hwt, int irq, int nmi)  {  	uint64_t ipi; -	int	node, ncpu; - -	node = hwt / 32; -	ncpu = hwt & 0x1f; -	ipi = ((uint64_t)nmi << 31) | (irq << 20) | (node << 17) | -		(1 << (ncpu & 0xf)); -	if (ncpu > 15) -		ipi |= 0x10000; /* Setting bit 16 to select cpus 16-31 */ +	ipi = (nmi << 31) | (irq << 20); +	ipi |= ((hwt >> 4) << 16) | (1 << (hwt & 0xf)); /* cpuset and mask */  	nlm_write_pic_reg(base, PIC_IPI_CTL, ipi);  } @@ -404,12 +378,10 @@ nlm_pic_ack(uint64_t base, int irt_num)  static inline void  nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt)  { -	nlm_pic_write_irt_direct(base, irt, 0, 0, 0, irq, 0); +	nlm_pic_write_irt_direct(base, irt, 0, 0, 0, irq, hwt);  } -extern uint64_t nlm_pic_base;  int nlm_irq_to_irt(int irq); -int nlm_irt_to_irq(int irt);  #endif /* __ASSEMBLY__ */  #endif /* _NLM_HAL_PIC_H */ diff --git a/arch/mips/include/asm/netlogic/xlp-hal/sys.h b/arch/mips/include/asm/netlogic/xlp-hal/sys.h index 21432f7d89b..258e8cc00e9 100644 --- a/arch/mips/include/asm/netlogic/xlp-hal/sys.h +++ b/arch/mips/include/asm/netlogic/xlp-hal/sys.h @@ -124,6 +124,5 @@  #define	nlm_get_sys_pcibase(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node))  #define	nlm_get_sys_regbase(node) (nlm_get_sys_pcibase(node) + XLP_IO_PCI_HDRSZ) -extern uint64_t nlm_sys_base;  #endif  #endif diff --git a/arch/mips/include/asm/netlogic/xlr/fmn.h b/arch/mips/include/asm/netlogic/xlr/fmn.h new file mode 100644 index 00000000000..68d5167c86b --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlr/fmn.h @@ -0,0 +1,363 @@ +/* + * Copyright (c) 2003-2012 Broadcom Corporation + * All Rights Reserved + * + * This software is available to you under a choice of one of two + * licenses.  You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the Broadcom + * license below: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in + *    the documentation and/or other materials provided with the + *    distribution. + * + * THIS SOFTWARE IS PROVIDED BY BROADCOM ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _NLM_FMN_H_ +#define _NLM_FMN_H_ + +#include <asm/netlogic/mips-extns.h> /* for COP2 access */ + +/* Station IDs */ +#define	FMN_STNID_CPU0			0x00 +#define	FMN_STNID_CPU1			0x08 +#define	FMN_STNID_CPU2			0x10 +#define	FMN_STNID_CPU3			0x18 +#define	FMN_STNID_CPU4			0x20 +#define	FMN_STNID_CPU5			0x28 +#define	FMN_STNID_CPU6			0x30 +#define	FMN_STNID_CPU7			0x38 + +#define	FMN_STNID_XGS0_TX		64 +#define	FMN_STNID_XMAC0_00_TX		64 +#define	FMN_STNID_XMAC0_01_TX		65 +#define	FMN_STNID_XMAC0_02_TX		66 +#define	FMN_STNID_XMAC0_03_TX		67 +#define	FMN_STNID_XMAC0_04_TX		68 +#define	FMN_STNID_XMAC0_05_TX		69 +#define	FMN_STNID_XMAC0_06_TX		70 +#define	FMN_STNID_XMAC0_07_TX		71 +#define	FMN_STNID_XMAC0_08_TX		72 +#define	FMN_STNID_XMAC0_09_TX		73 +#define	FMN_STNID_XMAC0_10_TX		74 +#define	FMN_STNID_XMAC0_11_TX		75 +#define	FMN_STNID_XMAC0_12_TX		76 +#define	FMN_STNID_XMAC0_13_TX		77 +#define	FMN_STNID_XMAC0_14_TX		78 +#define	FMN_STNID_XMAC0_15_TX		79 + +#define	FMN_STNID_XGS1_TX		80 +#define	FMN_STNID_XMAC1_00_TX		80 +#define	FMN_STNID_XMAC1_01_TX		81 +#define	FMN_STNID_XMAC1_02_TX		82 +#define	FMN_STNID_XMAC1_03_TX		83 +#define	FMN_STNID_XMAC1_04_TX		84 +#define	FMN_STNID_XMAC1_05_TX		85 +#define	FMN_STNID_XMAC1_06_TX		86 +#define	FMN_STNID_XMAC1_07_TX		87 +#define	FMN_STNID_XMAC1_08_TX		88 +#define	FMN_STNID_XMAC1_09_TX		89 +#define	FMN_STNID_XMAC1_10_TX		90 +#define	FMN_STNID_XMAC1_11_TX		91 +#define	FMN_STNID_XMAC1_12_TX		92 +#define	FMN_STNID_XMAC1_13_TX		93 +#define	FMN_STNID_XMAC1_14_TX		94 +#define	FMN_STNID_XMAC1_15_TX		95 + +#define	FMN_STNID_GMAC			96 +#define	FMN_STNID_GMACJFR_0		96 +#define	FMN_STNID_GMACRFR_0		97 +#define	FMN_STNID_GMACTX0		98 +#define	FMN_STNID_GMACTX1		99 +#define	FMN_STNID_GMACTX2		100 +#define	FMN_STNID_GMACTX3		101 +#define	FMN_STNID_GMACJFR_1		102 +#define	FMN_STNID_GMACRFR_1		103 + +#define	FMN_STNID_DMA			104 +#define	FMN_STNID_DMA_0			104 +#define	FMN_STNID_DMA_1			105 +#define	FMN_STNID_DMA_2			106 +#define	FMN_STNID_DMA_3			107 + +#define	FMN_STNID_XGS0FR		112 +#define	FMN_STNID_XMAC0JFR		112 +#define	FMN_STNID_XMAC0RFR		113 + +#define	FMN_STNID_XGS1FR		114 +#define	FMN_STNID_XMAC1JFR		114 +#define	FMN_STNID_XMAC1RFR		115 +#define	FMN_STNID_SEC			120 +#define	FMN_STNID_SEC0			120 +#define	FMN_STNID_SEC1			121 +#define	FMN_STNID_SEC2			122 +#define	FMN_STNID_SEC3			123 +#define	FMN_STNID_PK0			124 +#define	FMN_STNID_SEC_RSA		124 +#define	FMN_STNID_SEC_RSVD0		125 +#define	FMN_STNID_SEC_RSVD1		126 +#define	FMN_STNID_SEC_RSVD2		127 + +#define	FMN_STNID_GMAC1			80 +#define	FMN_STNID_GMAC1_FR_0		81 +#define	FMN_STNID_GMAC1_TX0		82 +#define	FMN_STNID_GMAC1_TX1		83 +#define	FMN_STNID_GMAC1_TX2		84 +#define	FMN_STNID_GMAC1_TX3		85 +#define	FMN_STNID_GMAC1_FR_1		87 +#define	FMN_STNID_GMAC0			96 +#define	FMN_STNID_GMAC0_FR_0		97 +#define	FMN_STNID_GMAC0_TX0		98 +#define	FMN_STNID_GMAC0_TX1		99 +#define	FMN_STNID_GMAC0_TX2		100 +#define	FMN_STNID_GMAC0_TX3		101 +#define	FMN_STNID_GMAC0_FR_1		103 +#define	FMN_STNID_CMP_0			108 +#define	FMN_STNID_CMP_1			109 +#define	FMN_STNID_CMP_2			110 +#define	FMN_STNID_CMP_3			111 +#define	FMN_STNID_PCIE_0		116 +#define	FMN_STNID_PCIE_1		117 +#define	FMN_STNID_PCIE_2		118 +#define	FMN_STNID_PCIE_3		119 +#define	FMN_STNID_XLS_PK0		121 + +#define nlm_read_c2_cc0(s)		__read_32bit_c2_register($16, s) +#define nlm_read_c2_cc1(s)		__read_32bit_c2_register($17, s) +#define nlm_read_c2_cc2(s)		__read_32bit_c2_register($18, s) +#define nlm_read_c2_cc3(s)		__read_32bit_c2_register($19, s) +#define nlm_read_c2_cc4(s)		__read_32bit_c2_register($20, s) +#define nlm_read_c2_cc5(s)		__read_32bit_c2_register($21, s) +#define nlm_read_c2_cc6(s)		__read_32bit_c2_register($22, s) +#define nlm_read_c2_cc7(s)		__read_32bit_c2_register($23, s) +#define nlm_read_c2_cc8(s)		__read_32bit_c2_register($24, s) +#define nlm_read_c2_cc9(s)		__read_32bit_c2_register($25, s) +#define nlm_read_c2_cc10(s)		__read_32bit_c2_register($26, s) +#define nlm_read_c2_cc11(s)		__read_32bit_c2_register($27, s) +#define nlm_read_c2_cc12(s)		__read_32bit_c2_register($28, s) +#define nlm_read_c2_cc13(s)		__read_32bit_c2_register($29, s) +#define nlm_read_c2_cc14(s)		__read_32bit_c2_register($30, s) +#define nlm_read_c2_cc15(s)		__read_32bit_c2_register($31, s) + +#define nlm_write_c2_cc0(s, v)		__write_32bit_c2_register($16, s, v) +#define nlm_write_c2_cc1(s, v)		__write_32bit_c2_register($17, s, v) +#define nlm_write_c2_cc2(s, v)		__write_32bit_c2_register($18, s, v) +#define nlm_write_c2_cc3(s, v)		__write_32bit_c2_register($19, s, v) +#define nlm_write_c2_cc4(s, v)		__write_32bit_c2_register($20, s, v) +#define nlm_write_c2_cc5(s, v)		__write_32bit_c2_register($21, s, v) +#define nlm_write_c2_cc6(s, v)		__write_32bit_c2_register($22, s, v) +#define nlm_write_c2_cc7(s, v)		__write_32bit_c2_register($23, s, v) +#define nlm_write_c2_cc8(s, v)		__write_32bit_c2_register($24, s, v) +#define nlm_write_c2_cc9(s, v)		__write_32bit_c2_register($25, s, v) +#define nlm_write_c2_cc10(s, v)		__write_32bit_c2_register($26, s, v) +#define nlm_write_c2_cc11(s, v)		__write_32bit_c2_register($27, s, v) +#define nlm_write_c2_cc12(s, v)		__write_32bit_c2_register($28, s, v) +#define nlm_write_c2_cc13(s, v)		__write_32bit_c2_register($29, s, v) +#define nlm_write_c2_cc14(s, v)		__write_32bit_c2_register($30, s, v) +#define nlm_write_c2_cc15(s, v)		__write_32bit_c2_register($31, s, v) + +#define	nlm_read_c2_status(sel)		__read_32bit_c2_register($2, 0) +#define	nlm_read_c2_config()		__read_32bit_c2_register($3, 0) +#define	nlm_write_c2_config(v)		__write_32bit_c2_register($3, 0, v) +#define	nlm_read_c2_bucksize(b)		__read_32bit_c2_register($4, b) +#define	nlm_write_c2_bucksize(b, v)	__write_32bit_c2_register($4, b, v) + +#define	nlm_read_c2_rx_msg0()		__read_64bit_c2_register($1, 0) +#define	nlm_read_c2_rx_msg1()		__read_64bit_c2_register($1, 1) +#define	nlm_read_c2_rx_msg2()		__read_64bit_c2_register($1, 2) +#define	nlm_read_c2_rx_msg3()		__read_64bit_c2_register($1, 3) + +#define	nlm_write_c2_tx_msg0(v)		__write_64bit_c2_register($0, 0, v) +#define	nlm_write_c2_tx_msg1(v)		__write_64bit_c2_register($0, 1, v) +#define	nlm_write_c2_tx_msg2(v)		__write_64bit_c2_register($0, 2, v) +#define	nlm_write_c2_tx_msg3(v)		__write_64bit_c2_register($0, 3, v) + +#define	FMN_STN_RX_QSIZE		256 +#define	FMN_NSTATIONS			128 +#define	FMN_CORE_NBUCKETS		8 + +static inline void nlm_msgsnd(unsigned int stid) +{ +	__asm__ volatile ( +	    ".set	push\n" +	    ".set	noreorder\n" +	    ".set	noat\n" +	    "move	$1, %0\n" +	    "c2		0x10001\n"	/* msgsnd $1 */ +	    ".set	pop\n" +	    : : "r" (stid) : "$1" +	); +} + +static inline void nlm_msgld(unsigned int pri) +{ +	__asm__ volatile ( +	    ".set	push\n" +	    ".set	noreorder\n" +	    ".set	noat\n" +	    "move	$1, %0\n" +	    "c2		0x10002\n"    /* msgld $1 */ +	    ".set	pop\n" +	    : : "r" (pri) : "$1" +	); +} + +static inline void nlm_msgwait(unsigned int mask) +{ +	__asm__ volatile ( +	    ".set	push\n" +	    ".set	noreorder\n" +	    ".set	noat\n" +	    "move	$8, %0\n" +	    "c2		0x10003\n"    /* msgwait $1 */ +	    ".set	pop\n" +	    : : "r" (mask) : "$1" +	); +} + +/* + * Disable interrupts and enable COP2 access + */ +static inline uint32_t nlm_cop2_enable(void) +{ +	uint32_t sr = read_c0_status(); + +	write_c0_status((sr & ~ST0_IE) | ST0_CU2); +	return sr; +} + +static inline void nlm_cop2_restore(uint32_t sr) +{ +	write_c0_status(sr); +} + +static inline void nlm_fmn_setup_intr(int irq, unsigned int tmask) +{ +	uint32_t config; + +	config = (1 << 24)	/* interrupt water mark - 1 msg */ +		| (irq << 16)	/* irq */ +		| (tmask << 8)	/* thread mask */ +		| 0x2;		/* enable watermark intr, disable empty intr */ +	nlm_write_c2_config(config); +} + +struct nlm_fmn_msg { +	uint64_t msg0; +	uint64_t msg1; +	uint64_t msg2; +	uint64_t msg3; +}; + +static inline int nlm_fmn_send(unsigned int size, unsigned int code, +		unsigned int stid, struct nlm_fmn_msg *msg) +{ +	unsigned int dest; +	uint32_t status; +	int i; + +	/* +	 * Make sure that all the writes pending at the cpu are flushed. +	 * Any writes pending on CPU will not be see by devices. L1/L2 +	 * caches are coherent with IO, so no cache flush needed. +	 */ +	__asm __volatile("sync"); + +	/* Load TX message buffers */ +	nlm_write_c2_tx_msg0(msg->msg0); +	nlm_write_c2_tx_msg1(msg->msg1); +	nlm_write_c2_tx_msg2(msg->msg2); +	nlm_write_c2_tx_msg3(msg->msg3); +	dest = ((size - 1) << 16) | (code << 8) | stid; + +	/* +	 * Retry a few times on credit fail, this should be a +	 * transient condition, unless there is a configuration +	 * failure, or the receiver is stuck. +	 */ +	for (i = 0; i < 8; i++) { +		nlm_msgsnd(dest); +		status = nlm_read_c2_status(0); +		if ((status & 0x2) == 1) +			pr_info("Send pending fail!\n"); +		if ((status & 0x4) == 0) +			return 0; +	} + +	/* If there is a credit failure, return error */ +	return status & 0x06; +} + +static inline int nlm_fmn_receive(int bucket, int *size, int *code, int *stid, +		struct nlm_fmn_msg *msg) +{ +	uint32_t status, tmp; + +	nlm_msgld(bucket); + +	/* wait for load pending to clear */ +	do { +		status = nlm_read_c2_status(1); +	} while ((status & 0x08) != 0); + +	/* receive error bits */ +	tmp = status & 0x30; +	if (tmp != 0) +		return tmp; + +	*size = ((status & 0xc0) >> 6) + 1; +	*code = (status & 0xff00) >> 8; +	*stid = (status & 0x7f0000) >> 16; +	msg->msg0 = nlm_read_c2_rx_msg0(); +	msg->msg1 = nlm_read_c2_rx_msg1(); +	msg->msg2 = nlm_read_c2_rx_msg2(); +	msg->msg3 = nlm_read_c2_rx_msg3(); + +	return 0; +} + +struct xlr_fmn_info { +	int num_buckets; +	int start_stn_id; +	int end_stn_id; +	int credit_config[128]; +}; + +struct xlr_board_fmn_config { +	int bucket_size[128];		/* size of buckets for all stations */ +	struct xlr_fmn_info cpu[8]; +	struct xlr_fmn_info gmac[2]; +	struct xlr_fmn_info dma; +	struct xlr_fmn_info cmp; +	struct xlr_fmn_info sae; +	struct xlr_fmn_info xgmac[2]; +}; + +extern int nlm_register_fmn_handler(int start, int end, +	void (*fn)(int, int, int, int, struct nlm_fmn_msg *, void *), +	void *arg); +extern void xlr_percpu_fmn_init(void); +extern void nlm_setup_fmn_irq(void); +extern void xlr_board_info_setup(void); + +extern struct xlr_board_fmn_config xlr_board_fmn_config; +#endif diff --git a/arch/mips/include/asm/netlogic/xlr/pic.h b/arch/mips/include/asm/netlogic/xlr/pic.h index 868013e62f3..9a691b1f91b 100644 --- a/arch/mips/include/asm/netlogic/xlr/pic.h +++ b/arch/mips/include/asm/netlogic/xlr/pic.h @@ -258,7 +258,5 @@ nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt)  	nlm_write_reg(base, PIC_IRT_1(irt),  		(1 << 30) | (1 << 6) | irq);  } - -extern uint64_t nlm_pic_base;  #endif  #endif /* _ASM_NLM_XLR_PIC_H */ diff --git a/arch/mips/include/asm/netlogic/xlr/xlr.h b/arch/mips/include/asm/netlogic/xlr/xlr.h index ff4a17b0bf7..c1667e0c272 100644 --- a/arch/mips/include/asm/netlogic/xlr/xlr.h +++ b/arch/mips/include/asm/netlogic/xlr/xlr.h @@ -51,10 +51,8 @@ static inline unsigned int nlm_chip_is_xls_b(void)  	return ((prid & 0xf000) == 0x4000);  } -/* - *  XLR chip types - */ - /* The XLS product line has chip versions 0x[48c]? */ +/*  XLR chip types */ +/* The XLS product line has chip versions 0x[48c]? */  static inline unsigned int nlm_chip_is_xls(void)  {  	uint32_t prid = read_c0_prid();  |