1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright 2019 NXP */ 3 4 #ifndef __FSL_DPDMAI_H 5 #define __FSL_DPDMAI_H 6 7 /* DPDMAI Version */ 8 #define DPDMAI_VER_MAJOR 2 9 #define DPDMAI_VER_MINOR 2 10 11 #define DPDMAI_CMD_BASE_VERSION 0 12 #define DPDMAI_CMD_ID_OFFSET 4 13 14 #define DPDMAI_CMDID_FORMAT(x) (((x) << DPDMAI_CMD_ID_OFFSET) | \ 15 DPDMAI_CMD_BASE_VERSION) 16 17 /* Command IDs */ 18 #define DPDMAI_CMDID_CLOSE DPDMAI_CMDID_FORMAT(0x800) 19 #define DPDMAI_CMDID_OPEN DPDMAI_CMDID_FORMAT(0x80E) 20 #define DPDMAI_CMDID_CREATE DPDMAI_CMDID_FORMAT(0x90E) 21 22 #define DPDMAI_CMDID_ENABLE DPDMAI_CMDID_FORMAT(0x002) 23 #define DPDMAI_CMDID_DISABLE DPDMAI_CMDID_FORMAT(0x003) 24 #define DPDMAI_CMDID_GET_ATTR DPDMAI_CMDID_FORMAT(0x004) 25 #define DPDMAI_CMDID_RESET DPDMAI_CMDID_FORMAT(0x005) 26 #define DPDMAI_CMDID_IS_ENABLED DPDMAI_CMDID_FORMAT(0x006) 27 28 #define DPDMAI_CMDID_SET_IRQ DPDMAI_CMDID_FORMAT(0x010) 29 #define DPDMAI_CMDID_GET_IRQ DPDMAI_CMDID_FORMAT(0x011) 30 #define DPDMAI_CMDID_SET_IRQ_ENABLE DPDMAI_CMDID_FORMAT(0x012) 31 #define DPDMAI_CMDID_GET_IRQ_ENABLE DPDMAI_CMDID_FORMAT(0x013) 32 #define DPDMAI_CMDID_SET_IRQ_MASK DPDMAI_CMDID_FORMAT(0x014) 33 #define DPDMAI_CMDID_GET_IRQ_MASK DPDMAI_CMDID_FORMAT(0x015) 34 #define DPDMAI_CMDID_GET_IRQ_STATUS DPDMAI_CMDID_FORMAT(0x016) 35 #define DPDMAI_CMDID_CLEAR_IRQ_STATUS DPDMAI_CMDID_FORMAT(0x017) 36 37 #define DPDMAI_CMDID_SET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A0) 38 #define DPDMAI_CMDID_GET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A1) 39 #define DPDMAI_CMDID_GET_TX_QUEUE DPDMAI_CMDID_FORMAT(0x1A2) 40 41 #define MC_CMD_HDR_TOKEN_O 32 /* Token field offset */ 42 #define MC_CMD_HDR_TOKEN_S 16 /* Token field size */ 43 44 #define MAKE_UMASK64(_width) \ 45 ((u64)((_width) < 64 ? ((u64)1 << (_width)) - 1 : (u64)-1)) 46 47 /* Data Path DMA Interface API 48 * Contains initialization APIs and runtime control APIs for DPDMAI 49 */ 50 51 /** 52 * Maximum number of Tx/Rx priorities per DPDMAI object 53 */ 54 #define DPDMAI_PRIO_NUM 2 55 56 /* DPDMAI queue modification options */ 57 58 /** 59 * Select to modify the user's context associated with the queue 60 */ 61 #define DPDMAI_QUEUE_OPT_USER_CTX 0x1 62 63 /** 64 * Select to modify the queue's destination 65 */ 66 #define DPDMAI_QUEUE_OPT_DEST 0x2 67 68 /** 69 * struct dpdmai_cfg - Structure representing DPDMAI configuration 70 * @priorities: Priorities for the DMA hardware processing; valid priorities are 71 * configured with values 1-8; the entry following last valid entry 72 * should be configured with 0 73 */ 74 struct dpdmai_cfg { 75 u8 priorities[DPDMAI_PRIO_NUM]; 76 }; 77 78 /** 79 * struct dpdmai_attr - Structure representing DPDMAI attributes 80 * @id: DPDMAI object ID 81 * @version: DPDMAI version 82 * @num_of_priorities: number of priorities 83 */ 84 struct dpdmai_attr { 85 int id; 86 /** 87 * struct version - DPDMAI version 88 * @major: DPDMAI major version 89 * @minor: DPDMAI minor version 90 */ 91 struct { 92 u16 major; 93 u16 minor; 94 } version; 95 u8 num_of_priorities; 96 }; 97 98 /** 99 * enum dpdmai_dest - DPDMAI destination types 100 * @DPDMAI_DEST_NONE: Unassigned destination; The queue is set in parked mode 101 * and does not generate FQDAN notifications; user is expected to dequeue 102 * from the queue based on polling or other user-defined method 103 * @DPDMAI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN 104 * notifications to the specified DPIO; user is expected to dequeue 105 * from the queue only after notification is received 106 * @DPDMAI_DEST_DPCON: The queue is set in schedule mode and does not generate 107 * FQDAN notifications, but is connected to the specified DPCON object; 108 * user is expected to dequeue from the DPCON channel 109 */ 110 enum dpdmai_dest { 111 DPDMAI_DEST_NONE = 0, 112 DPDMAI_DEST_DPIO = 1, 113 DPDMAI_DEST_DPCON = 2 114 }; 115 116 /** 117 * struct dpdmai_dest_cfg - Structure representing DPDMAI destination parameters 118 * @dest_type: Destination type 119 * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type 120 * @priority: Priority selection within the DPIO or DPCON channel; valid values 121 * are 0-1 or 0-7, depending on the number of priorities in that 122 * channel; not relevant for 'DPDMAI_DEST_NONE' option 123 */ 124 struct dpdmai_dest_cfg { 125 enum dpdmai_dest dest_type; 126 int dest_id; 127 u8 priority; 128 }; 129 130 /** 131 * struct dpdmai_rx_queue_cfg - DPDMAI RX queue configuration 132 * @options: Flags representing the suggested modifications to the queue; 133 * Use any combination of 'DPDMAI_QUEUE_OPT_<X>' flags 134 * @user_ctx: User context value provided in the frame descriptor of each 135 * dequeued frame; 136 * valid only if 'DPDMAI_QUEUE_OPT_USER_CTX' is contained in 'options' 137 * @dest_cfg: Queue destination parameters; 138 * valid only if 'DPDMAI_QUEUE_OPT_DEST' is contained in 'options' 139 */ 140 struct dpdmai_rx_queue_cfg { 141 struct dpdmai_dest_cfg dest_cfg; 142 u32 options; 143 u64 user_ctx; 144 145 }; 146 147 /** 148 * struct dpdmai_rx_queue_attr - Structure representing attributes of Rx queues 149 * @user_ctx: User context value provided in the frame descriptor of each 150 * dequeued frame 151 * @dest_cfg: Queue destination configuration 152 * @fqid: Virtual FQID value to be used for dequeue operations 153 */ 154 struct dpdmai_rx_queue_attr { 155 struct dpdmai_dest_cfg dest_cfg; 156 u64 user_ctx; 157 u32 fqid; 158 }; 159 160 int dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags, 161 int dpdmai_id, u16 *token); 162 int dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 163 int dpdmai_create(struct fsl_mc_io *mc_io, u32 cmd_flags, 164 const struct dpdmai_cfg *cfg, u16 *token); 165 int dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 166 int dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 167 int dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token); 168 int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, 169 u16 token, struct dpdmai_attr *attr); 170 int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 171 u8 priority, const struct dpdmai_rx_queue_cfg *cfg); 172 int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, 173 u8 priority, struct dpdmai_rx_queue_attr *attr); 174 int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, 175 u16 token, u8 priority, u32 *fqid); 176 177 #endif /* __FSL_DPDMAI_H */ 178