1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 * 3 * Copyright 2013-2016 Freescale Semiconductor Inc. 4 * Copyright 2018-2023 NXP 5 * 6 */ 7 #ifndef _FSL_DPDMUX_CMD_H 8 #define _FSL_DPDMUX_CMD_H 9 10 /* DPDMUX Version */ 11 #define DPDMUX_VER_MAJOR 6 12 #define DPDMUX_VER_MINOR 10 13 14 #define DPDMUX_CMD_BASE_VERSION 1 15 #define DPDMUX_CMD_VERSION_2 2 16 #define DPDMUX_CMD_VERSION_3 3 17 #define DPDMUX_CMD_VERSION_4 4 18 #define DPDMUX_CMD_ID_OFFSET 4 19 20 #define DPDMUX_CMD(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\ 21 DPDMUX_CMD_BASE_VERSION) 22 #define DPDMUX_CMD_V2(id) (((id) << DPDMUX_CMD_ID_OFFSET) | \ 23 DPDMUX_CMD_VERSION_2) 24 #define DPDMUX_CMD_V3(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\ 25 DPDMUX_CMD_VERSION_3) 26 #define DPDMUX_CMD_V4(id) (((id) << DPDMUX_CMD_ID_OFFSET) |\ 27 DPDMUX_CMD_VERSION_4) 28 29 /* Command IDs */ 30 #define DPDMUX_CMDID_CLOSE DPDMUX_CMD(0x800) 31 #define DPDMUX_CMDID_OPEN DPDMUX_CMD(0x806) 32 #define DPDMUX_CMDID_CREATE DPDMUX_CMD_V4(0x906) 33 #define DPDMUX_CMDID_DESTROY DPDMUX_CMD(0x986) 34 #define DPDMUX_CMDID_GET_API_VERSION DPDMUX_CMD(0xa06) 35 36 #define DPDMUX_CMDID_ENABLE DPDMUX_CMD(0x002) 37 #define DPDMUX_CMDID_DISABLE DPDMUX_CMD(0x003) 38 #define DPDMUX_CMDID_GET_ATTR DPDMUX_CMD_V3(0x004) 39 #define DPDMUX_CMDID_RESET DPDMUX_CMD(0x005) 40 #define DPDMUX_CMDID_IS_ENABLED DPDMUX_CMD(0x006) 41 #define DPDMUX_CMDID_SET_MAX_FRAME_LENGTH DPDMUX_CMD(0x0a1) 42 #define DPDMUX_CMDID_GET_MAX_FRAME_LENGTH DPDMUX_CMD(0x0a2) 43 44 #define DPDMUX_CMDID_UL_RESET_COUNTERS DPDMUX_CMD(0x0a3) 45 46 #define DPDMUX_CMDID_IF_SET_ACCEPTED_FRAMES DPDMUX_CMD(0x0a7) 47 #define DPDMUX_CMDID_IF_GET_ATTR DPDMUX_CMD(0x0a8) 48 #define DPDMUX_CMDID_IF_ENABLE DPDMUX_CMD(0x0a9) 49 #define DPDMUX_CMDID_IF_DISABLE DPDMUX_CMD(0x0aa) 50 51 #define DPDMUX_CMDID_IF_ADD_L2_RULE DPDMUX_CMD(0x0b0) 52 #define DPDMUX_CMDID_IF_REMOVE_L2_RULE DPDMUX_CMD(0x0b1) 53 #define DPDMUX_CMDID_IF_GET_COUNTER DPDMUX_CMD(0x0b2) 54 #define DPDMUX_CMDID_IF_SET_LINK_CFG DPDMUX_CMD_V2(0x0b3) 55 #define DPDMUX_CMDID_IF_GET_LINK_STATE DPDMUX_CMD_V2(0x0b4) 56 57 #define DPDMUX_CMDID_SET_CUSTOM_KEY DPDMUX_CMD(0x0b5) 58 #define DPDMUX_CMDID_ADD_CUSTOM_CLS_ENTRY DPDMUX_CMD_V2(0x0b6) 59 #define DPDMUX_CMDID_REMOVE_CUSTOM_CLS_ENTRY DPDMUX_CMD(0x0b7) 60 61 #define DPDMUX_CMDID_IF_SET_DEFAULT DPDMUX_CMD(0x0b8) 62 #define DPDMUX_CMDID_IF_GET_DEFAULT DPDMUX_CMD(0x0b9) 63 64 #define DPDMUX_CMDID_SET_RESETABLE DPDMUX_CMD(0x0ba) 65 #define DPDMUX_CMDID_GET_RESETABLE DPDMUX_CMD(0x0bb) 66 67 #define DPDMUX_CMDID_IF_SET_TAILDROP DPDMUX_CMD(0x0bc) 68 #define DPDMUX_CMDID_IF_GET_TAILDROP DPDMUX_CMD(0x0bd) 69 70 #define DPDMUX_CMDID_DUMP_TABLE DPDMUX_CMD(0x0be) 71 72 #define DPDMUX_CMDID_SET_ERRORS_BEHAVIOR DPDMUX_CMD(0x0bf) 73 74 #define DPDMUX_CMDID_SET_SP_PROFILE DPDMUX_CMD(0x0c0) 75 #define DPDMUX_CMDID_SP_ENABLE DPDMUX_CMD(0x0c1) 76 77 #define DPDMUX_MASK(field) \ 78 GENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \ 79 DPDMUX_##field##_SHIFT) 80 #define dpdmux_set_field(var, field, val) \ 81 ((var) |= (((val) << DPDMUX_##field##_SHIFT) & DPDMUX_MASK(field))) 82 #define dpdmux_get_field(var, field) \ 83 (((var) & DPDMUX_MASK(field)) >> DPDMUX_##field##_SHIFT) 84 85 #pragma pack(push, 1) 86 struct dpdmux_cmd_open { 87 uint32_t dpdmux_id; 88 }; 89 90 struct dpdmux_cmd_create { 91 uint8_t method; 92 uint8_t manip; 93 uint16_t num_ifs; 94 uint16_t default_if; 95 uint16_t pad; 96 97 uint16_t adv_max_dmat_entries; 98 uint16_t adv_max_mc_groups; 99 uint16_t adv_max_vlan_ids; 100 uint16_t mem_size; 101 102 uint64_t options; 103 }; 104 105 struct dpdmux_cmd_destroy { 106 uint32_t dpdmux_id; 107 }; 108 109 #define DPDMUX_ENABLE_SHIFT 0 110 #define DPDMUX_ENABLE_SIZE 1 111 #define DPDMUX_IS_DEFAULT_SHIFT 1 112 #define DPDMUX_IS_DEFAULT_SIZE 1 113 114 struct dpdmux_rsp_is_enabled { 115 uint8_t en; 116 }; 117 118 struct dpdmux_rsp_get_attr { 119 uint8_t method; 120 uint8_t manip; 121 uint16_t num_ifs; 122 uint16_t mem_size; 123 uint16_t default_if; 124 125 uint64_t pad1; 126 127 uint32_t id; 128 uint32_t pad2; 129 130 uint64_t options; 131 uint16_t max_dmat_entries; 132 uint16_t max_mc_groups; 133 uint16_t max_vlan_ids; 134 }; 135 136 struct dpdmux_cmd_set_max_frame_length { 137 uint16_t max_frame_length; 138 }; 139 140 struct dpdmux_cmd_get_max_frame_len { 141 uint16_t if_id; 142 }; 143 144 struct dpdmux_rsp_get_max_frame_len { 145 uint16_t max_len; 146 }; 147 148 #define DPDMUX_ACCEPTED_FRAMES_TYPE_SHIFT 0 149 #define DPDMUX_ACCEPTED_FRAMES_TYPE_SIZE 4 150 #define DPDMUX_UNACCEPTED_FRAMES_ACTION_SHIFT 4 151 #define DPDMUX_UNACCEPTED_FRAMES_ACTION_SIZE 4 152 153 struct dpdmux_cmd_if_set_accepted_frames { 154 uint16_t if_id; 155 uint8_t frames_options; 156 }; 157 158 struct dpdmux_cmd_if { 159 uint16_t if_id; 160 }; 161 162 struct dpdmux_rsp_if_get_attr { 163 uint8_t pad[3]; 164 uint8_t enabled; 165 uint8_t pad1[3]; 166 uint8_t accepted_frames_type; 167 uint32_t rate; 168 }; 169 170 struct dpdmux_cmd_if_l2_rule { 171 uint16_t if_id; 172 uint8_t mac_addr5; 173 uint8_t mac_addr4; 174 uint8_t mac_addr3; 175 uint8_t mac_addr2; 176 uint8_t mac_addr1; 177 uint8_t mac_addr0; 178 179 uint32_t pad; 180 uint16_t vlan_id; 181 }; 182 183 struct dpdmux_cmd_if_get_counter { 184 uint16_t if_id; 185 uint8_t counter_type; 186 }; 187 188 struct dpdmux_rsp_if_get_counter { 189 uint64_t pad; 190 uint64_t counter; 191 }; 192 193 struct dpdmux_cmd_if_set_link_cfg { 194 uint16_t if_id; 195 uint16_t pad[3]; 196 197 uint32_t rate; 198 uint32_t pad1; 199 200 uint64_t options; 201 uint64_t advertising; 202 }; 203 204 struct dpdmux_cmd_if_get_link_state { 205 uint16_t if_id; 206 }; 207 208 #define DPDMUX_UP_SHIFT 0 209 #define DPDMUX_UP_SIZE 1 210 #define DPDMUX_STATE_VALID_SHIFT 1 211 #define DPDMUX_STATE_VALID_SIZE 1 212 struct dpdmux_rsp_if_get_link_state { 213 uint32_t pad; 214 uint8_t up; 215 uint8_t pad1[3]; 216 217 uint32_t rate; 218 uint32_t pad2; 219 220 uint64_t options; 221 uint64_t supported; 222 uint64_t advertising; 223 }; 224 225 struct dpdmux_rsp_get_api_version { 226 uint16_t major; 227 uint16_t minor; 228 }; 229 230 struct dpdmux_set_custom_key { 231 uint64_t pad[6]; 232 uint64_t key_cfg_iova; 233 }; 234 235 struct dpdmux_cmd_add_custom_cls_entry { 236 uint8_t pad[3]; 237 uint8_t key_size; 238 uint16_t entry_index; 239 uint16_t dest_if; 240 uint64_t key_iova; 241 uint64_t mask_iova; 242 }; 243 244 struct dpdmux_cmd_remove_custom_cls_entry { 245 uint8_t pad[3]; 246 uint8_t key_size; 247 uint32_t pad1; 248 uint64_t key_iova; 249 uint64_t mask_iova; 250 }; 251 252 #define DPDMUX_SKIP_RESET_FLAGS_SHIFT 0 253 #define DPDMUX_SKIP_RESET_FLAGS_SIZE 4 254 255 struct dpdmux_cmd_set_skip_reset_flags { 256 uint8_t skip_reset_flags; 257 }; 258 259 struct dpdmux_rsp_get_skip_reset_flags { 260 uint8_t skip_reset_flags; 261 }; 262 263 struct dpdmux_cmd_set_taildrop { 264 uint32_t pad1; 265 uint16_t if_id; 266 uint16_t pad2; 267 uint16_t oal_en; 268 uint8_t units; 269 uint8_t pad3; 270 uint32_t threshold; 271 }; 272 273 struct dpdmux_cmd_get_taildrop { 274 uint32_t pad1; 275 uint16_t if_id; 276 }; 277 278 struct dpdmux_rsp_get_taildrop { 279 uint16_t pad1; 280 uint16_t pad2; 281 uint16_t if_id; 282 uint16_t pad3; 283 uint16_t oal_en; 284 uint8_t units; 285 uint8_t pad4; 286 uint32_t threshold; 287 }; 288 289 struct dpdmux_cmd_dump_table { 290 uint16_t table_type; 291 uint16_t table_index; 292 uint32_t pad0; 293 uint64_t iova_addr; 294 uint32_t iova_size; 295 }; 296 297 struct dpdmux_rsp_dump_table { 298 uint16_t num_entries; 299 }; 300 301 struct dpdmux_dump_table_header { 302 uint16_t table_type; 303 uint16_t table_num_entries; 304 uint16_t table_max_entries; 305 uint8_t default_action; 306 uint8_t match_type; 307 uint8_t reserved[24]; 308 }; 309 310 struct dpdmux_dump_table_entry { 311 uint8_t key[DPDMUX_MAX_KEY_SIZE]; 312 uint8_t mask[DPDMUX_MAX_KEY_SIZE]; 313 uint8_t key_action; 314 uint16_t result[3]; 315 uint8_t reserved[21]; 316 }; 317 318 #define DPDMUX_ERROR_ACTION_SHIFT 0 319 #define DPDMUX_ERROR_ACTION_SIZE 4 320 321 struct dpdmux_cmd_set_errors_behavior { 322 uint32_t errors; 323 uint16_t flags; 324 uint16_t if_id; 325 }; 326 327 #define MAX_SP_PROFILE_ID_SIZE 8 328 329 struct dpdmux_cmd_set_sp_profile { 330 uint8_t sp_profile[MAX_SP_PROFILE_ID_SIZE]; 331 uint8_t type; 332 }; 333 334 struct dpdmux_cmd_sp_enable { 335 uint16_t if_id; 336 uint8_t type; 337 uint8_t en; 338 }; 339 340 #pragma pack(pop) 341 #endif /* _FSL_DPDMUX_CMD_H */ 342