|  | /* | 
|  | * Copyright 2020 Broadcom | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef DMA_IPROC_PAX | 
|  | #define DMA_IPROC_PAX | 
|  |  | 
|  | /* Broadcom PAX-DMA RM register defines */ | 
|  | #define PAX_DMA_REG_ADDR(_base, _offs)	((_base) + (_offs)) | 
|  | #define PAX_DMA_RING_ADDR_OFFSET(_ring)		(0x10000 * (_ring)) | 
|  |  | 
|  | /* Per-Ring register offsets */ | 
|  | #define RING_VER			0x000 | 
|  | #define RING_BD_START_ADDR		0x004 | 
|  | #define RING_BD_READ_PTR		0x008 | 
|  | #define RING_BD_WRITE_PTR		0x00c | 
|  | #define RING_BD_READ_PTR_DDR_LS		0x010 | 
|  | #define RING_BD_READ_PTR_DDR_MS		0x014 | 
|  | #define RING_CMPL_START_ADDR		0x018 | 
|  | #define RING_CMPL_WRITE_PTR		0x01c | 
|  | #define RING_NUM_REQ_RECV_LS		0x020 | 
|  | #define RING_NUM_REQ_RECV_MS		0x024 | 
|  | #define RING_NUM_REQ_TRANS_LS		0x028 | 
|  | #define RING_NUM_REQ_TRANS_MS		0x02c | 
|  | #define RING_NUM_REQ_OUTSTAND		0x030 | 
|  | #define RING_CONTROL			0x034 | 
|  | #define RING_FLUSH_DONE			0x038 | 
|  | #define RING_MSI_ADDR_LS		0x03c | 
|  | #define RING_MSI_ADDR_MS		0x040 | 
|  | #define RING_CMPL_WR_PTR_DDR_CONTROL	0x048 | 
|  | #define RING_BD_READ_PTR_DDR_CONTROL	0x04c | 
|  | #define RING_WRITE_SEQ_NUM		0x050 | 
|  | #define RING_READ_SEQ_NUM		0x054 | 
|  | #define RING_BD_MEM_WRITE_ADDRESS	0x058 | 
|  | #define RING_AXI_BEAT_CNT		0x05c | 
|  | #define RING_AXI_BURST_CNT		0x060 | 
|  | #define RING_MSI_DATA_VALUE		0x064 | 
|  | #define RING_PACKET_ALIGNMENT_STATUS0	0x068 | 
|  | #define RING_PACKET_ALIGNMENT_STATUS1	0x06c | 
|  | #define RING_PACKET_ALIGNMENT_STATUS2	0x070 | 
|  | #define RING_DOORBELL_BD_WRITE_COUNT	0x074 | 
|  |  | 
|  | /* RING Manager Common Registers */ | 
|  | #define RM_COMM_CTRL_REG(_ring)		(0x100 * (_ring)) | 
|  | #define RM_MSI_DEVID_REG(_ring)		(0x100 * (_ring) + 0x4) | 
|  |  | 
|  | #define RM_AE0_AE_CONTROL				0x2000 | 
|  | #define RM_AE0_NUMBER_OF_PACKETS_RECEIVED_LS_BITS	0x2004 | 
|  | #define RM_AE0_NUMBER_OF_PACKETS_RECEIVED_MS_BITS	0x2008 | 
|  | #define RM_AE0_NUMBER_OF_PACKETS_TRANSMITTED_LS_BITS	0x200c | 
|  | #define RM_AE0_NUMBER_OF_PACKETS_TRANSMITTED_MS_BITS	0x2010 | 
|  | #define RM_AE0_OUTSTANDING_PACKET			0x2014 | 
|  | #define RM_AE0_AE_FLUSH_STATUS				0x2018 | 
|  | #define RM_AE0_AE_FIFO_WRITE_POINTER			0x201c | 
|  | #define RM_AE0_AE_FIFO_READ_POINTER			0x2020 | 
|  | #define RM_AE1_AE_CONTROL				0x2100 | 
|  | #define RM_AE1_NUMBER_OF_PACKETS_RECEIVED_LS_BITS	0x2104 | 
|  | #define RM_AE1_NUMBER_OF_PACKETS_RECEIVED_MS_BITS	0x2108 | 
|  | #define RM_AE1_NUMBER_OF_PACKETS_TRANSMITTED_LS_BITS	0x210c | 
|  | #define RM_AE1_NUMBER_OF_PACKETS_TRANSMITTED_MS_BITS	0x2110 | 
|  | #define RM_AE1_OUTSTANDING_PACKET			0x2114 | 
|  | #define RM_AE1_AE_FLUSH_STATUS				0x2118 | 
|  | #define RM_AE1_AE_FIFO_WRITE_POINTER			0x211c | 
|  | #define RM_AE1_AE_FIFO_READ_POINTER			0x2120 | 
|  |  | 
|  | #define RM_COMM_RING_SECURITY_SETTING			0x3000 | 
|  | #define RM_COMM_CONTROL					0x3008 | 
|  | #define RM_COMM_TIMER_CONTROL_0				0x300c | 
|  | #define RM_COMM_TIMER_CONTROL_1				0x3010 | 
|  | #define RM_COMM_BD_THRESHOLD				0x3014 | 
|  | #define RM_COMM_BURST_LENGTH				0x3018 | 
|  | #define RM_COMM_FIFO_FULL_THRESHOLD			0x301c | 
|  | #define RM_COMM_MASK_SEQUENCE_MAX_COUNT			0x3020 | 
|  | #define RM_COMM_AE_TIMEOUT				0x3024 | 
|  | #define RM_COMM_RING_OR_AE_STATUS_LOG_ENABLE		0x3028 | 
|  | #define RM_COMM_RING_FLUSH_TIMEOUT			0x302c | 
|  | #define RM_COMM_MEMORY_CONFIGURATION			0x3030 | 
|  | #define RM_COMM_AXI_CONTROL				0x3034 | 
|  | #define RM_COMM_GENERAL_MSI_DEVICE_ID			0x3038 | 
|  | #define RM_COMM_GENERAL_MSI_ADDRESS_LS			0x303c | 
|  | #define RM_COMM_GENERAL_MSI_ADDRESS_MS			0x3040 | 
|  | #define RM_COMM_CONFIG_INTERRUPT_STATUS_MASK		0x3044 | 
|  | #define RM_COMM_CONFIG_INTERRUPT_STATUS_CLEAR		0x3048 | 
|  | #define RM_COMM_TOGGLE_INTERRUPT_STATUS_MASK		0x304c | 
|  | #define RM_COMM_TOGGLE_INTERRUPT_STATUS_CLEAR		0x3050 | 
|  | #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS_MASK	0x3054 | 
|  | #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS_CLEAR	0x3058 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS_MASK	0x305c | 
|  | #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS_CLEAR	0x3060 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_MASK	0x3064 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_CLEAR	0x3068 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_MASK	0x306c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_CLEAR	0x3070 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_MASK	0x3074 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_CLEAR	0x3078 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_MASK	0x307c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_CLEAR	0x3080 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_MASK	0x3084 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_CLEAR	0x3088 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_MASK	0x308c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_CLEAR	0x3090 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_MASK	0x3094 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_CLEAR	0x3098 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_MASK	0x309c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_CLEAR	0x30a0 | 
|  | #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS_MASK	0x30a4 | 
|  | #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS_CLEAR	0x30a8 | 
|  | #define RM_COMM_REORDER_INTERRUPT_STATUS_MASK		0x30ac | 
|  | #define RM_COMM_REORDER_INTERRUPT_STATUS_CLEAR		0x30b0 | 
|  | #define RM_COMM_DME_INTERRUPT_STATUS_MASK		0x30b4 | 
|  | #define RM_COMM_DME_INTERRUPT_STATUS_CLEAR		0x30b8 | 
|  | #define RM_COMM_REORDER_FIFO_PROG_THRESHOLD		0x30bc | 
|  | #define RM_COMM_GROUP_PKT_EXTENSION_SUPPORT		0x30c0 | 
|  | #define RM_COMM_GENERAL_MSI_DATA_VALUE			0x30c4 | 
|  | #define RM_COMM_AXI_READ_BURST_THRESHOLD		0x30c8 | 
|  | #define RM_COMM_GROUP_RING_COUNT			0x30cc | 
|  | #define RM_COMM_MSI_DISABLE				0x30d8 | 
|  | #define RM_COMM_RESERVE					0x30fc | 
|  | #define RM_COMM_RING_FLUSH_STATUS			0x3100 | 
|  | #define RM_COMM_RING_SEQUENCE_NUMBER_OVERFLOW		0x3104 | 
|  | #define RM_COMM_AE_SEQUENCE_NUMBER_OVERFLOW		0x3108 | 
|  | #define RM_COMM_MAX_SEQUENCE_NUMBER_FOR_ANY_RING	0x310c | 
|  | #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_MONITOR_RING	0x3110 | 
|  | #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_ANY_AE		0x3114 | 
|  | #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_MONITOR_AE	0x3118 | 
|  | #define RM_COMM_MIN_MAX_LATENCY_MONITOR_RING_TOGGLE	0x311c | 
|  | #define RM_COMM_MIN_MAX_LATENCY_MONITOR_RING_ADDRESSGEN 0x3120 | 
|  | #define RM_COMM_RING_ACTIVITY				0x3124 | 
|  | #define RM_COMM_AE_ACTIVITY				0x3128 | 
|  | #define RM_COMM_MAIN_HW_INIT_DONE			0x312c | 
|  | #define RM_COMM_MEMORY_POWER_STATUS			0x3130 | 
|  | #define RM_COMM_CONFIG_STATUS_0				0x3134 | 
|  | #define RM_COMM_CONFIG_STATUS_1				0x3138 | 
|  | #define RM_COMM_TOGGLE_STATUS_0				0x313c | 
|  | #define RM_COMM_TOGGLE_STATUS_1				0x3140 | 
|  | #define RM_COMM_DDR_ADDR_GEN_STATUS_0			0x3144 | 
|  | #define RM_COMM_DDR_ADDR_GEN_STATUS_1			0x3148 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_0		0x314c | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_1		0x3150 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_2		0x3154 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_3		0x3158 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_0_STATUS_0		0x315c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_0_STATUS_1		0x3160 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_1_STATUS_0		0x3164 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_1_STATUS_1		0x3168 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_2_STATUS_0		0x316c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_2_STATUS_1		0x3170 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_3_STATUS_0		0x3174 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_3_STATUS_1		0x3178 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_4_STATUS_0		0x317c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_4_STATUS_1		0x3180 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_5_STATUS_0		0x3184 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_5_STATUS_1		0x3188 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_6_STATUS_0		0x318c | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_6_STATUS_1		0x3190 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_7_STATUS_0		0x3194 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_7_STATUS_1		0x3198 | 
|  | #define RM_COMM_AE_INTERFACE_TOP_STATUS_0		0x319c | 
|  | #define RM_COMM_AE_INTERFACE_TOP_STATUS_1		0x31a0 | 
|  | #define RM_COMM_REORDER_STATUS_0			0x31a4 | 
|  | #define RM_COMM_REORDER_STATUS_1			0x31a8 | 
|  | #define RM_COMM_REORDER_STATUS_2			0x31ac | 
|  | #define RM_COMM_REORDER_STATUS_3			0x31b0 | 
|  | #define RM_COMM_REORDER_STATUS_4			0x31b4 | 
|  | #define RM_COMM_REORDER_STATUS_5			0x31b8 | 
|  | #define RM_COMM_CONFIG_INTERRUPT_STATUS			0x31bc | 
|  | #define RM_COMM_TOGGLE_INTERRUPT_STATUS			0x31c0 | 
|  | #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS		0x31c4 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS	0x31c8 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_STATUS	0x31cc | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_STATUS	0x31d0 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_STATUS	0x31d4 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_STATUS	0x31d8 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_STATUS	0x31dc | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_STATUS	0x31e0 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_STATUS	0x31e4 | 
|  | #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_STATUS	0x31e8 | 
|  | #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS	0x31ec | 
|  | #define RM_COMM_REORDER_INTERRUPT_STATUS		0x31f0 | 
|  | #define RM_COMM_DME_INTERRUPT_STATUS			0x31f4 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_4		0x31f8 | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_5		0x31fc | 
|  | #define RM_COMM_PACKET_ALIGNMENT_STATUS_6		0x3200 | 
|  | #define RM_COMM_MSI_INTR_INTERRUPT_STATUS		0x3204 | 
|  | #define RM_COMM_BD_FETCH_MODE_CONTROL			0x3360 | 
|  |  | 
|  | #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_SHIFT	16 | 
|  | #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_SHIFT_VAL	32 | 
|  | #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_MASK	0x1FF | 
|  |  | 
|  | #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_SHIFT	25 | 
|  | #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_VAL	40 | 
|  | #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_MASK	0x7F | 
|  | #define RM_COMM_BD_FIFO_FULL_THRESHOLD_VAL			224 | 
|  | #define RM_COMM_BD_FIFO_FULL_THRESHOLD_SHIFT			16 | 
|  | #define RM_COMM_BD_FIFO_FULL_THRESHOLD_MASK			0x1FF | 
|  |  | 
|  | /* PAX_DMA_RM_COMM_RM_BURST_LENGTH */ | 
|  | #define RM_COMM_BD_FETCH_CACHE_ALIGNED_DISABLED	BIT(28) | 
|  | #define RM_COMM_VALUE_FOR_DDR_ADDR_GEN_SHIFT	16 | 
|  | #define RM_COMM_VALUE_FOR_TOGGLE_SHIFT		0 | 
|  | #define RM_COMM_VALUE_FOR_DDR_ADDR_GEN_VAL	32 | 
|  | #define RM_COMM_VALUE_FOR_TOGGLE_VAL		32 | 
|  |  | 
|  | #define RM_COMM_DISABLE_GRP_BD_FIFO_FLOW_CONTROL_FOR_PKT_ALIGNMENT	BIT(1) | 
|  | #define RM_COMM_DISABLE_PKT_ALIGNMENT_BD_FIFO_FLOW_CONTROL		BIT(0) | 
|  |  | 
|  | /* RM version */ | 
|  | #define RING_VER_MAGIC				0x76303031 | 
|  |  | 
|  | /* Register RING_CONTROL fields */ | 
|  | #define RING_CONTROL_MASK_DISABLE_CONTROL	6 | 
|  | #define RING_CONTROL_FLUSH			BIT(5) | 
|  | #define RING_CONTROL_ACTIVE			BIT(4) | 
|  |  | 
|  | /* Register RING_FLUSH_DONE fields */ | 
|  | #define RING_FLUSH_DONE_MASK			0x1 | 
|  |  | 
|  | #define RING_MASK_SEQ_MAX_COUNT_MASK		0x3ff | 
|  |  | 
|  | /* RM_COMM_MAIN_HW_INIT_DONE DONE fields */ | 
|  | #define RM_COMM_MAIN_HW_INIT_DONE_MASK		0x1 | 
|  |  | 
|  | /* Register RING_CMPL_WR_PTR_DDR_CONTROL fields */ | 
|  | #define RING_BD_READ_PTR_DDR_TIMER_VAL_SHIFT	16 | 
|  | #define RING_BD_READ_PTR_DDR_TIMER_VAL_MASK	0xffff | 
|  | #define RING_BD_READ_PTR_DDR_ENABLE_SHIFT	15 | 
|  | #define RING_BD_READ_PTR_DDR_ENABLE_MASK	0x1 | 
|  |  | 
|  | /* Register RING_BD_READ_PTR_DDR_CONTROL fields */ | 
|  | #define RING_BD_CMPL_WR_PTR_DDR_TIMER_VAL_SHIFT	16 | 
|  | #define RING_BD_CMPL_WR_PTR_DDR_TIMER_VAL_MASK	0xffff | 
|  | #define RING_BD_CMPL_WR_PTR_DDR_ENABLE_SHIFT	15 | 
|  | #define RING_BD_CMPL_WR_PTR_DDR_ENABLE_MASK	0x1 | 
|  |  | 
|  | /* | 
|  | * AE_TIMEOUT is  (2^AE_TIMEOUT_BITS) - (2 * NumOfAEs * 2^FIFO_DEPTH_BITS) | 
|  | * AE_TIMEOUT_BITS=32, NumOfAEs=2, FIFO_DEPTH_BITS=5 | 
|  | * timeout val =  2^32 - 2*2*2^5 | 
|  | */ | 
|  | #define RM_COMM_AE_TIMEOUT_VAL			0xffffff80 | 
|  |  | 
|  | /* RM timer control fields for 4 rings */ | 
|  | #define RM_COMM_TIMER_CONTROL_FAST		0xaf | 
|  | #define RM_COMM_TIMER_CONTROL_FAST_SHIFT	16 | 
|  | #define RM_COMM_TIMER_CONTROL_MEDIUM		0x15e | 
|  | #define RM_COMM_TIMER_CONTROL0_VAL		\ | 
|  | ((RM_COMM_TIMER_CONTROL_FAST << RM_COMM_TIMER_CONTROL_FAST_SHIFT) | \ | 
|  | (RM_COMM_TIMER_CONTROL_MEDIUM)) | 
|  | #define RM_COMM_TIMER_CONTROL_SLOW		0x2bc | 
|  | #define RM_COMM_TIMER_CONTROL_SLOW_SHIFT	16 | 
|  | #define RM_COMM_TIMER_CONTROL_IDLE		0x578 | 
|  | #define RM_COMM_TIMER_CONTROL1_VAL		\ | 
|  | ((RM_COMM_TIMER_CONTROL_SLOW << RM_COMM_TIMER_CONTROL_SLOW_SHIFT) | \ | 
|  | (RM_COMM_TIMER_CONTROL_IDLE)) | 
|  | #define RM_COMM_RM_BURST_LENGTH			0x80008 | 
|  |  | 
|  | /* Register RM_COMM_AXI_CONTROL fields */ | 
|  | #define RM_COMM_AXI_CONTROL_RD_CH_EN_SHIFT	24 | 
|  | #define RM_COMM_AXI_CONTROL_RD_CH_EN		\ | 
|  | BIT(RM_COMM_AXI_CONTROL_RD_CH_EN_SHIFT) | 
|  | #define RM_COMM_AXI_CONTROL_WR_CH_EN_SHIFT	28 | 
|  | #define RM_COMM_AXI_CONTROL_WR_CH_EN		\ | 
|  | BIT(RM_COMM_AXI_CONTROL_WR_CH_EN_SHIFT) | 
|  |  | 
|  | /* Register Per-ring RING_COMMON_CONTROL fields */ | 
|  | #define RING_COMM_CTRL_AE_GROUP_SHIFT	0 | 
|  | #define RING_COMM_CTRL_AE_GROUP_MASK	(0x7 << RING_COMM_CTRL_AE_GROUP_SHIFT) | 
|  |  | 
|  | /* Register AE0_AE_CONTROL/AE1_AE_CONTROL fields */ | 
|  | #define RM_AE_CONTROL_ACTIVE	BIT(4) | 
|  | #define RM_AE_CTRL_AE_GROUP_SHIFT	0 | 
|  | #define RM_AE_CTRL_AE_GROUP_MASK	(0x7 << RM_AE_CTRL_AE_GROUP_SHIFT) | 
|  |  | 
|  | /* Register RING_CMPL_WR_PTR_DDR_CONTROL fields */ | 
|  | #define RING_DDR_CONTROL_COUNT_SHIFT	0 | 
|  | #define RING_DDR_CONTROL_COUNT_MASK	0x3ff | 
|  | #define RING_DDR_CONTROL_COUNT(x)	(((x) & RING_DDR_CONTROL_COUNT_MASK) \ | 
|  | << RING_DDR_CONTROL_COUNT_SHIFT) | 
|  | #define RING_DDR_CONTROL_COUNT_VAL	0x1U | 
|  | #define RING_DDR_CONTROL_ENABLE_SHIFT	15 | 
|  | #define RING_DDR_CONTROL_ENABLE		BIT(RING_DDR_CONTROL_ENABLE_SHIFT) | 
|  | #define RING_DDR_CONTROL_TIMER_SHIFT	16 | 
|  | #define RING_DDR_CONTROL_TIMER_MASK	0xffff | 
|  | #define RING_DDR_CONTROL_TIMER(x)	(((x) & RING_DDR_CONTROL_TIMER_MASK) \ | 
|  | << RING_DDR_CONTROL_TIMER_SHIFT) | 
|  |  | 
|  | /* | 
|  | * Set no timeout value for completion write path as it would generate | 
|  | * multiple interrupts during large transfers. And if timeout value is | 
|  | * set, completion write pointers has to be checked on each interrupt | 
|  | * to ensure that transfer is actually done. | 
|  | */ | 
|  | #define RING_DDR_CONTROL_TIMER_VAL	(0xFFFF) | 
|  |  | 
|  | /* completion DME status code */ | 
|  | #define PAX_DMA_STATUS_AXI_RRESP_ERR		BIT(0) | 
|  | #define PAX_DMA_STATUS_AXI_BRESP_ERR		BIT(1) | 
|  | #define PAX_DMA_STATUS_PCIE_CA_ERR		BIT(2) | 
|  | #define PAX_DMA_STATUS_PCIE_UR_ERR		BIT(3) | 
|  | #define PAX_DMA_STATUS_PCIE_CMPL_TOUT_ERR	BIT(4) | 
|  | #define PAX_DMA_STATUS_PCIE_RX_POISON		BIT(5) | 
|  | #define PAX_DMA_STATUS_ERROR_MASK	(		\ | 
|  | PAX_DMA_STATUS_AXI_RRESP_ERR | \ | 
|  | PAX_DMA_STATUS_AXI_BRESP_ERR | \ | 
|  | PAX_DMA_STATUS_PCIE_CA_ERR | \ | 
|  | PAX_DMA_STATUS_PCIE_UR_ERR | \ | 
|  | PAX_DMA_STATUS_PCIE_CMPL_TOUT_ERR | \ | 
|  | PAX_DMA_STATUS_PCIE_RX_POISON \ | 
|  | ) | 
|  | /* completion RM status code */ | 
|  | #define RM_COMPLETION_SUCCESS		0x0 | 
|  | #define RM_COMPLETION_AE_TIMEOUT	0x3FF | 
|  |  | 
|  | #define RM_COMM_MSI_CONFIG_INTERRUPT_ACCESS_ERR_MASK	BIT(9) | 
|  | #define RM_COMM_MSI_CONFIG_INTERRUPT_BRESP_ERR_MASK	BIT(8) | 
|  | #define RM_COMM_MSI_DISABLE_MASK			BIT(0) | 
|  |  | 
|  | /* Buffer Descriptor definitions */ | 
|  | #define PAX_DMA_TYPE_RM_HEADER		0x1 | 
|  | #define PAX_DMA_TYPE_NEXT_PTR		0x5 | 
|  |  | 
|  | /* one desc ring size( is 4K, 4K aligned */ | 
|  | #define PAX_DMA_RM_DESC_RING_SIZE	4096 | 
|  | #define PAX_DMA_RING_BD_ALIGN_ORDER	12 | 
|  | /* completion ring size(bytes) is 8K, 8K aligned */ | 
|  | #define PAX_DMA_RM_CMPL_RING_SIZE	8192 | 
|  | #define PAX_DMA_RING_CMPL_ALIGN_ORDER	13 | 
|  |  | 
|  | #define PAX_DMA_RING_BD_ALIGN_CHECK(addr) \ | 
|  | (!((addr) & ((0x1 << RING_BD_ALIGN_ORDER) - 1))) | 
|  | #define RING_CMPL_ALIGN_CHECK(addr) \ | 
|  | (!((addr) & ((0x1 << RING_CMPL_ALIGN_ORDER) - 1))) | 
|  |  | 
|  | /* RM descriptor width: 8 bytes */ | 
|  | #define PAX_DMA_RM_DESC_BDWIDTH		8 | 
|  | /* completion msg desc takes 1 BD */ | 
|  | #define PAX_DMA_CMPL_DESC_SIZE		PAX_DMA_RM_DESC_BDWIDTH | 
|  | /* Next table desc takes 1 BD */ | 
|  | #define PAX_DMA_NEXT_TBL_DESC_SIZE	PAX_DMA_RM_DESC_BDWIDTH | 
|  | /* Header desc takes 1 BD */ | 
|  | #define PAX_DMA_HEADER_DESC_SIZE	PAX_DMA_RM_DESC_BDWIDTH | 
|  | /* Total BDs in ring: 4K/8bytes = 512 BDs */ | 
|  | #define PAX_DMA_RM_RING_BD_COUNT	(PAX_DMA_RM_DESC_RING_SIZE / \ | 
|  | PAX_DMA_RM_DESC_BDWIDTH) | 
|  |  | 
|  | /* Initial RM header is first BD in ring */ | 
|  | #define PAX_DMA_HEADER_INDEX		0 | 
|  | #define PAX_DMA_HEADER_ADDR(_ring)	(void *)((uintptr_t)(_ring) + \ | 
|  | PAX_DMA_HEADER_INDEX * PAX_DMA_RM_DESC_BDWIDTH) | 
|  |  | 
|  | /* NEXT TABLE desc offset is last BD in ring */ | 
|  | #define PAX_DMA_NEXT_TBL_INDEX		(PAX_DMA_RM_RING_BD_COUNT - 1) | 
|  | #define PAX_DMA_NEXT_TBL_ADDR(_ring)	(void *)((uintptr_t)(_ring) + \ | 
|  | PAX_DMA_NEXT_TBL_INDEX * PAX_DMA_RM_DESC_BDWIDTH) | 
|  |  | 
|  | /* DMA transfers supported from 4 bytes thru 16M, size aligned to 4 bytes */ | 
|  | #define PAX_DMA_MIN_SIZE	4 | 
|  | #define PAX_DMA_MAX_SIZE	(16 * 1024 * 1024) | 
|  |  | 
|  | /* Host and Card address need 4-byte alignment */ | 
|  | #define PAX_DMA_ADDR_ALIGN 4 | 
|  |  | 
|  | #define RM_RING_REG(_pd, _r, _write_ptr) \ | 
|  | ((_pd)->ring[_r].ring_base + (_write_ptr)) | 
|  | #define RM_COMM_REG(_pd, _write_ptr) ((_pd)->rm_comm_base + (_write_ptr)) | 
|  | #define PAX_DMA_REG(_pd, _write_ptr) ((_pd)->dma_base + (_write_ptr)) | 
|  |  | 
|  | #define PAX_DMA_MAX_CMPL_COUNT		1024 | 
|  | #define PAX_DMA_LAST_CMPL_IDX		(PAX_DMA_MAX_CMPL_COUNT - 1) | 
|  |  | 
|  | #define PAX_DMA_RING_ALIGN		BIT(PAX_DMA_RING_CMPL_ALIGN_ORDER) | 
|  | /* num of completions received, circular buffer */ | 
|  | #define PAX_DMA_GET_CMPL_COUNT(wptr, rptr) (((wptr) >= (rptr)) ? \ | 
|  | ((wptr) - (rptr)) : (PAX_DMA_MAX_CMPL_COUNT - (rptr) + (wptr))) | 
|  |  | 
|  | /* location of current cmpl pkt, take care of pointer wrap-around */ | 
|  | #define PAX_DMA_CURR_CMPL_IDX(wptr)	\ | 
|  | (((wptr) == 0) ? PAX_DMA_LAST_CMPL_IDX : (wptr) - 1) | 
|  |  | 
|  | /* Timeout (milliseconds) for completion alert in interrupt mode */ | 
|  | #define PAX_DMA_TIMEOUT			10000 | 
|  |  | 
|  | /* TODO: add macro to enable data memory barrier, to ensure writes to memory */ | 
|  | #define dma_mb() | 
|  |  | 
|  | /* Max polling cycles for completion wait, >= 1 second */ | 
|  | #define PAX_DMA_MAX_POLL_WAIT		1000000 | 
|  | /* Max polling cycles for posted write sync >= 1 second */ | 
|  | #define PAX_DMA_MAX_SYNC_WAIT		1000000 | 
|  |  | 
|  | enum ring_idx { | 
|  | PAX_DMA_RING0 = 0, | 
|  | PAX_DMA_RING1, | 
|  | PAX_DMA_RING2, | 
|  | PAX_DMA_RING3, | 
|  | PAX_DMA_RINGS_MAX | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * DMA direction | 
|  | */ | 
|  | enum pax_dma_dir { | 
|  | CARD_TO_HOST = 0x1, | 
|  | HOST_TO_CARD = 0x2 | 
|  | }; | 
|  |  | 
|  | /* Completion packet */ | 
|  | struct cmpl_pkt { | 
|  | uint64_t opq : 16; /*pkt_id 15:0*/ | 
|  | uint64_t res : 16; /*reserved 16:31*/ | 
|  | uint64_t dma_status : 16; /*PAX DMA status 32:47*/ | 
|  | uint64_t ae_num : 6; /*RM status[47:53] processing AE number */ | 
|  | uint64_t rm_status : 10; /*RM status[54:63] completion/timeout status*/ | 
|  | } __attribute__ ((__packed__)); | 
|  |  | 
|  | /* Driver internal structures */ | 
|  |  | 
|  | struct dma_iproc_pax_addr64 { | 
|  | uint32_t addr_lo; | 
|  | uint32_t addr_hi; | 
|  | } __attribute__((__packed__)); | 
|  |  | 
|  | /* DMA payload for RM internal API */ | 
|  | struct dma_iproc_pax_payload { | 
|  | uint64_t pci_addr; | 
|  | uint64_t axi_addr; | 
|  | uint32_t xfer_sz; | 
|  | enum pax_dma_dir direction; | 
|  | }; | 
|  |  | 
|  | /* magic to sync completion of posted writes to host */ | 
|  | struct dma_iproc_pax_write_sync_data { | 
|  | /* sglist count, max 254 */ | 
|  | uint32_t total_pkts:9; | 
|  | /* ring-id 0-3 */ | 
|  | uint32_t ring:2; | 
|  | /* opaque-id 0-31 */ | 
|  | uint32_t opaque:5; | 
|  | /* magic pattern */ | 
|  | uint32_t signature:16; | 
|  | }; | 
|  |  | 
|  | /* BD ring status */ | 
|  | struct dma_iproc_pax_ring_status { | 
|  | /* current desc write_ptret, write pointer */ | 
|  | void *write_ptr; | 
|  | /* current valid toggle  */ | 
|  | uint32_t toggle; | 
|  | /* completion queue read offset */ | 
|  | uint32_t cmpl_rd_offs; | 
|  | /* opaque value for current payload */ | 
|  | uint32_t opq; | 
|  | /* posted write sync data */ | 
|  | struct dma_iproc_pax_write_sync_data sync_data; | 
|  | }; | 
|  |  | 
|  | struct dma_iproc_pax_ring_data { | 
|  | /* ring index */ | 
|  | uint32_t idx; | 
|  | /* Per-Ring register base */ | 
|  | uint32_t ring_base; | 
|  | /* Allocated mem for BD and CMPL */ | 
|  | void *ring_mem; | 
|  | /* Buffer descriptors, 4K aligned */ | 
|  | void *bd; | 
|  | /* Completion descriptors, 8K aligned */ | 
|  | void *cmpl; | 
|  | /* payload struct for internal API */ | 
|  | struct dma_iproc_pax_payload *payload; | 
|  | /* ring current status */ | 
|  | struct dma_iproc_pax_ring_status curr; | 
|  | /* assigned packet id upto 32 values */ | 
|  | uint32_t pkt_id; | 
|  | /* per-ring lock */ | 
|  | struct k_mutex lock; | 
|  | /* alert for the ring */ | 
|  | struct k_sem alert; | 
|  | /* posted write sync src location */ | 
|  | struct dma_iproc_pax_write_sync_data *sync_loc; | 
|  | /* posted write sync pci dst address */ | 
|  | struct dma_iproc_pax_addr64 sync_pci; | 
|  | /* ring status */ | 
|  | int ring_active; | 
|  | /* dma callback and argument */ | 
|  | dma_callback_t dma_callback; | 
|  | void *callback_arg; | 
|  | uint32_t descs_inflight; | 
|  | uint32_t non_hdr_bd_count; | 
|  | uint32_t total_pkt_count; | 
|  | uintptr_t current_hdr; | 
|  | }; | 
|  |  | 
|  | struct dma_iproc_pax_data { | 
|  | /* PAXB0 PAX DMA registers */ | 
|  | uint32_t dma_base; | 
|  | /* Ring manager common registers */ | 
|  | uint32_t rm_comm_base; | 
|  | /* Num of rings to use in s/w */ | 
|  | int used_rings; | 
|  | /* DMA lock */ | 
|  | struct k_mutex dma_lock; | 
|  | /* Per-Ring data */ | 
|  | struct dma_iproc_pax_ring_data ring[PAX_DMA_RINGS_MAX]; | 
|  | }; | 
|  |  | 
|  | /* PAX DMA config */ | 
|  | struct dma_iproc_pax_cfg { | 
|  | /* PAXB0 PAX DMA registers */ | 
|  | uint32_t dma_base; | 
|  | /* Per-Ring register base addr */ | 
|  | uint32_t rm_base; | 
|  | /* Ring manager common registers */ | 
|  | uint32_t rm_comm_base; | 
|  | /* Num of rings to be used */ | 
|  | int use_rings; | 
|  | void *bd_memory_base; | 
|  | uint32_t scr_addr_loc; | 
|  | const struct device *pcie_dev; | 
|  | }; | 
|  |  | 
|  | #endif |