diff options
Diffstat (limited to 'include/linux/irqchip/riscv-aplic.h')
| -rw-r--r-- | include/linux/irqchip/riscv-aplic.h | 145 | 
1 files changed, 145 insertions, 0 deletions
diff --git a/include/linux/irqchip/riscv-aplic.h b/include/linux/irqchip/riscv-aplic.h new file mode 100644 index 000000000000..ec8f7df50583 --- /dev/null +++ b/include/linux/irqchip/riscv-aplic.h @@ -0,0 +1,145 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2021 Western Digital Corporation or its affiliates. + * Copyright (C) 2022 Ventana Micro Systems Inc. + */ +#ifndef __LINUX_IRQCHIP_RISCV_APLIC_H +#define __LINUX_IRQCHIP_RISCV_APLIC_H + +#include <linux/bitops.h> + +#define APLIC_MAX_IDC			BIT(14) +#define APLIC_MAX_SOURCE		1024 + +#define APLIC_DOMAINCFG			0x0000 +#define APLIC_DOMAINCFG_RDONLY		0x80000000 +#define APLIC_DOMAINCFG_IE		BIT(8) +#define APLIC_DOMAINCFG_DM		BIT(2) +#define APLIC_DOMAINCFG_BE		BIT(0) + +#define APLIC_SOURCECFG_BASE		0x0004 +#define APLIC_SOURCECFG_D		BIT(10) +#define APLIC_SOURCECFG_CHILDIDX_MASK	0x000003ff +#define APLIC_SOURCECFG_SM_MASK	0x00000007 +#define APLIC_SOURCECFG_SM_INACTIVE	0x0 +#define APLIC_SOURCECFG_SM_DETACH	0x1 +#define APLIC_SOURCECFG_SM_EDGE_RISE	0x4 +#define APLIC_SOURCECFG_SM_EDGE_FALL	0x5 +#define APLIC_SOURCECFG_SM_LEVEL_HIGH	0x6 +#define APLIC_SOURCECFG_SM_LEVEL_LOW	0x7 + +#define APLIC_MMSICFGADDR		0x1bc0 +#define APLIC_MMSICFGADDRH		0x1bc4 +#define APLIC_SMSICFGADDR		0x1bc8 +#define APLIC_SMSICFGADDRH		0x1bcc + +#ifdef CONFIG_RISCV_M_MODE +#define APLIC_xMSICFGADDR		APLIC_MMSICFGADDR +#define APLIC_xMSICFGADDRH		APLIC_MMSICFGADDRH +#else +#define APLIC_xMSICFGADDR		APLIC_SMSICFGADDR +#define APLIC_xMSICFGADDRH		APLIC_SMSICFGADDRH +#endif + +#define APLIC_xMSICFGADDRH_L		BIT(31) +#define APLIC_xMSICFGADDRH_HHXS_MASK	0x1f +#define APLIC_xMSICFGADDRH_HHXS_SHIFT	24 +#define APLIC_xMSICFGADDRH_HHXS		(APLIC_xMSICFGADDRH_HHXS_MASK << \ +					 APLIC_xMSICFGADDRH_HHXS_SHIFT) +#define APLIC_xMSICFGADDRH_LHXS_MASK	0x7 +#define APLIC_xMSICFGADDRH_LHXS_SHIFT	20 +#define APLIC_xMSICFGADDRH_LHXS		(APLIC_xMSICFGADDRH_LHXS_MASK << \ +					 APLIC_xMSICFGADDRH_LHXS_SHIFT) +#define APLIC_xMSICFGADDRH_HHXW_MASK	0x7 +#define APLIC_xMSICFGADDRH_HHXW_SHIFT	16 +#define APLIC_xMSICFGADDRH_HHXW		(APLIC_xMSICFGADDRH_HHXW_MASK << \ +					 APLIC_xMSICFGADDRH_HHXW_SHIFT) +#define APLIC_xMSICFGADDRH_LHXW_MASK	0xf +#define APLIC_xMSICFGADDRH_LHXW_SHIFT	12 +#define APLIC_xMSICFGADDRH_LHXW		(APLIC_xMSICFGADDRH_LHXW_MASK << \ +					 APLIC_xMSICFGADDRH_LHXW_SHIFT) +#define APLIC_xMSICFGADDRH_BAPPN_MASK	0xfff +#define APLIC_xMSICFGADDRH_BAPPN_SHIFT	0 +#define APLIC_xMSICFGADDRH_BAPPN	(APLIC_xMSICFGADDRH_BAPPN_MASK << \ +					 APLIC_xMSICFGADDRH_BAPPN_SHIFT) + +#define APLIC_xMSICFGADDR_PPN_SHIFT	12 + +#define APLIC_xMSICFGADDR_PPN_HART(__lhxs) \ +	(BIT(__lhxs) - 1) + +#define APLIC_xMSICFGADDR_PPN_LHX_MASK(__lhxw) \ +	(BIT(__lhxw) - 1) +#define APLIC_xMSICFGADDR_PPN_LHX_SHIFT(__lhxs) \ +	((__lhxs)) +#define APLIC_xMSICFGADDR_PPN_LHX(__lhxw, __lhxs) \ +	(APLIC_xMSICFGADDR_PPN_LHX_MASK(__lhxw) << \ +	 APLIC_xMSICFGADDR_PPN_LHX_SHIFT(__lhxs)) + +#define APLIC_xMSICFGADDR_PPN_HHX_MASK(__hhxw) \ +	(BIT(__hhxw) - 1) +#define APLIC_xMSICFGADDR_PPN_HHX_SHIFT(__hhxs) \ +	((__hhxs) + APLIC_xMSICFGADDR_PPN_SHIFT) +#define APLIC_xMSICFGADDR_PPN_HHX(__hhxw, __hhxs) \ +	(APLIC_xMSICFGADDR_PPN_HHX_MASK(__hhxw) << \ +	 APLIC_xMSICFGADDR_PPN_HHX_SHIFT(__hhxs)) + +#define APLIC_IRQBITS_PER_REG		32 + +#define APLIC_SETIP_BASE		0x1c00 +#define APLIC_SETIPNUM			0x1cdc + +#define APLIC_CLRIP_BASE		0x1d00 +#define APLIC_CLRIPNUM			0x1ddc + +#define APLIC_SETIE_BASE		0x1e00 +#define APLIC_SETIENUM			0x1edc + +#define APLIC_CLRIE_BASE		0x1f00 +#define APLIC_CLRIENUM			0x1fdc + +#define APLIC_SETIPNUM_LE		0x2000 +#define APLIC_SETIPNUM_BE		0x2004 + +#define APLIC_GENMSI			0x3000 + +#define APLIC_TARGET_BASE		0x3004 +#define APLIC_TARGET_HART_IDX_SHIFT	18 +#define APLIC_TARGET_HART_IDX_MASK	0x3fff +#define APLIC_TARGET_HART_IDX		(APLIC_TARGET_HART_IDX_MASK << \ +					 APLIC_TARGET_HART_IDX_SHIFT) +#define APLIC_TARGET_GUEST_IDX_SHIFT	12 +#define APLIC_TARGET_GUEST_IDX_MASK	0x3f +#define APLIC_TARGET_GUEST_IDX		(APLIC_TARGET_GUEST_IDX_MASK << \ +					 APLIC_TARGET_GUEST_IDX_SHIFT) +#define APLIC_TARGET_IPRIO_SHIFT	0 +#define APLIC_TARGET_IPRIO_MASK		0xff +#define APLIC_TARGET_IPRIO		(APLIC_TARGET_IPRIO_MASK << \ +					 APLIC_TARGET_IPRIO_SHIFT) +#define APLIC_TARGET_EIID_SHIFT		0 +#define APLIC_TARGET_EIID_MASK		0x7ff +#define APLIC_TARGET_EIID		(APLIC_TARGET_EIID_MASK << \ +					 APLIC_TARGET_EIID_SHIFT) + +#define APLIC_IDC_BASE			0x4000 +#define APLIC_IDC_SIZE			32 + +#define APLIC_IDC_IDELIVERY		0x00 + +#define APLIC_IDC_IFORCE		0x04 + +#define APLIC_IDC_ITHRESHOLD		0x08 + +#define APLIC_IDC_TOPI			0x18 +#define APLIC_IDC_TOPI_ID_SHIFT		16 +#define APLIC_IDC_TOPI_ID_MASK		0x3ff +#define APLIC_IDC_TOPI_ID		(APLIC_IDC_TOPI_ID_MASK << \ +					 APLIC_IDC_TOPI_ID_SHIFT) +#define APLIC_IDC_TOPI_PRIO_SHIFT	0 +#define APLIC_IDC_TOPI_PRIO_MASK	0xff +#define APLIC_IDC_TOPI_PRIO		(APLIC_IDC_TOPI_PRIO_MASK << \ +					 APLIC_IDC_TOPI_PRIO_SHIFT) + +#define APLIC_IDC_CLAIMI		0x1c + +#endif  |