| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright 2014-2016 Freescale Semiconductor Inc. | |
| * Copyright 2017-2021 NXP | |
| * | |
| */ | |
| #ifndef __FSL_DPSW_CMD_H | |
| #define __FSL_DPSW_CMD_H | |
| #include "dpsw.h" | |
| /* DPSW Version */ | |
| #define DPSW_VER_MAJOR 8 | |
| #define DPSW_VER_MINOR 13 | |
| #define DPSW_CMD_BASE_VERSION 1 | |
| #define DPSW_CMD_VERSION_2 2 | |
| #define DPSW_CMD_ID_OFFSET 4 | |
| #define DPSW_CMD_ID(id) (((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_BASE_VERSION) | |
| #define DPSW_CMD_V2(id) (((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_VERSION_2) | |
| /* Command IDs */ | |
| #define DPSW_CMDID_CLOSE DPSW_CMD_ID(0x800) | |
| #define DPSW_CMDID_OPEN DPSW_CMD_ID(0x802) | |
| #define DPSW_CMDID_GET_API_VERSION DPSW_CMD_ID(0xa02) | |
| #define DPSW_CMDID_ENABLE DPSW_CMD_ID(0x002) | |
| #define DPSW_CMDID_DISABLE DPSW_CMD_ID(0x003) | |
| #define DPSW_CMDID_GET_ATTR DPSW_CMD_V2(0x004) | |
| #define DPSW_CMDID_RESET DPSW_CMD_ID(0x005) | |
| #define DPSW_CMDID_SET_IRQ_ENABLE DPSW_CMD_ID(0x012) | |
| #define DPSW_CMDID_SET_IRQ_MASK DPSW_CMD_ID(0x014) | |
| #define DPSW_CMDID_GET_IRQ_STATUS DPSW_CMD_ID(0x016) | |
| #define DPSW_CMDID_CLEAR_IRQ_STATUS DPSW_CMD_ID(0x017) | |
| #define DPSW_CMDID_SET_REFLECTION_IF DPSW_CMD_ID(0x022) | |
| #define DPSW_CMDID_IF_SET_TCI DPSW_CMD_ID(0x030) | |
| #define DPSW_CMDID_IF_SET_STP DPSW_CMD_ID(0x031) | |
| #define DPSW_CMDID_IF_GET_COUNTER DPSW_CMD_V2(0x034) | |
| #define DPSW_CMDID_IF_ADD_REFLECTION DPSW_CMD_ID(0x037) | |
| #define DPSW_CMDID_IF_REMOVE_REFLECTION DPSW_CMD_ID(0x038) | |
| #define DPSW_CMDID_IF_ENABLE DPSW_CMD_ID(0x03D) | |
| #define DPSW_CMDID_IF_DISABLE DPSW_CMD_ID(0x03E) | |
| #define DPSW_CMDID_IF_GET_ATTR DPSW_CMD_ID(0x042) | |
| #define DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH DPSW_CMD_ID(0x044) | |
| #define DPSW_CMDID_IF_GET_LINK_STATE DPSW_CMD_ID(0x046) | |
| #define DPSW_CMDID_IF_GET_TCI DPSW_CMD_ID(0x04A) | |
| #define DPSW_CMDID_IF_SET_LINK_CFG DPSW_CMD_ID(0x04C) | |
| #define DPSW_CMDID_VLAN_ADD DPSW_CMD_ID(0x060) | |
| #define DPSW_CMDID_VLAN_ADD_IF DPSW_CMD_V2(0x061) | |
| #define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED DPSW_CMD_ID(0x062) | |
| #define DPSW_CMDID_VLAN_REMOVE_IF DPSW_CMD_ID(0x064) | |
| #define DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED DPSW_CMD_ID(0x065) | |
| #define DPSW_CMDID_VLAN_REMOVE_IF_FLOODING DPSW_CMD_ID(0x066) | |
| #define DPSW_CMDID_VLAN_REMOVE DPSW_CMD_ID(0x067) | |
| #define DPSW_CMDID_FDB_ADD DPSW_CMD_ID(0x082) | |
| #define DPSW_CMDID_FDB_REMOVE DPSW_CMD_ID(0x083) | |
| #define DPSW_CMDID_FDB_ADD_UNICAST DPSW_CMD_ID(0x084) | |
| #define DPSW_CMDID_FDB_REMOVE_UNICAST DPSW_CMD_ID(0x085) | |
| #define DPSW_CMDID_FDB_ADD_MULTICAST DPSW_CMD_ID(0x086) | |
| #define DPSW_CMDID_FDB_REMOVE_MULTICAST DPSW_CMD_ID(0x087) | |
| #define DPSW_CMDID_FDB_DUMP DPSW_CMD_ID(0x08A) | |
| #define DPSW_CMDID_ACL_ADD DPSW_CMD_ID(0x090) | |
| #define DPSW_CMDID_ACL_REMOVE DPSW_CMD_ID(0x091) | |
| #define DPSW_CMDID_ACL_ADD_ENTRY DPSW_CMD_ID(0x092) | |
| #define DPSW_CMDID_ACL_REMOVE_ENTRY DPSW_CMD_ID(0x093) | |
| #define DPSW_CMDID_ACL_ADD_IF DPSW_CMD_ID(0x094) | |
| #define DPSW_CMDID_ACL_REMOVE_IF DPSW_CMD_ID(0x095) | |
| #define DPSW_CMDID_IF_GET_PORT_MAC_ADDR DPSW_CMD_ID(0x0A7) | |
| #define DPSW_CMDID_CTRL_IF_GET_ATTR DPSW_CMD_ID(0x0A0) | |
| #define DPSW_CMDID_CTRL_IF_SET_POOLS DPSW_CMD_ID(0x0A1) | |
| #define DPSW_CMDID_CTRL_IF_ENABLE DPSW_CMD_ID(0x0A2) | |
| #define DPSW_CMDID_CTRL_IF_DISABLE DPSW_CMD_ID(0x0A3) | |
| #define DPSW_CMDID_SET_LAG DPSW_CMD_V2(0x0A4) | |
| #define DPSW_CMDID_CTRL_IF_SET_QUEUE DPSW_CMD_ID(0x0A6) | |
| #define DPSW_CMDID_SET_EGRESS_FLOOD DPSW_CMD_ID(0x0AC) | |
| #define DPSW_CMDID_IF_SET_LEARNING_MODE DPSW_CMD_ID(0x0AD) | |
| #define DPSW_CMDID_IF_SET_LAG_STATE DPSW_CMD_ID(0x0B0) | |
| /* Macros for accessing command fields smaller than 1byte */ | |
| #define DPSW_MASK(field) \ | |
| GENMASK(DPSW_##field##_SHIFT + DPSW_##field##_SIZE - 1, \ | |
| DPSW_##field##_SHIFT) | |
| #define dpsw_set_field(var, field, val) \ | |
| ((var) |= (((val) << DPSW_##field##_SHIFT) & DPSW_MASK(field))) | |
| #define dpsw_get_field(var, field) \ | |
| (((var) & DPSW_MASK(field)) >> DPSW_##field##_SHIFT) | |
| #define dpsw_get_bit(var, bit) \ | |
| (((var) >> (bit)) & GENMASK(0, 0)) | |
| #pragma pack(push, 1) | |
| struct dpsw_cmd_open { | |
| __le32 dpsw_id; | |
| }; | |
| #define DPSW_COMPONENT_TYPE_SHIFT 0 | |
| #define DPSW_COMPONENT_TYPE_SIZE 4 | |
| struct dpsw_cmd_create { | |
| /* cmd word 0 */ | |
| __le16 num_ifs; | |
| u8 max_fdbs; | |
| u8 max_meters_per_if; | |
| /* from LSB: only the first 4 bits */ | |
| u8 component_type; | |
| u8 pad[3]; | |
| /* cmd word 1 */ | |
| __le16 max_vlans; | |
| __le16 max_fdb_entries; | |
| __le16 fdb_aging_time; | |
| __le16 max_fdb_mc_groups; | |
| /* cmd word 2 */ | |
| __le64 options; | |
| }; | |
| struct dpsw_cmd_destroy { | |
| __le32 dpsw_id; | |
| }; | |
| #define DPSW_ENABLE_SHIFT 0 | |
| #define DPSW_ENABLE_SIZE 1 | |
| struct dpsw_rsp_is_enabled { | |
| /* from LSB: enable:1 */ | |
| u8 enabled; | |
| }; | |
| struct dpsw_cmd_set_irq_enable { | |
| u8 enable_state; | |
| u8 pad[3]; | |
| u8 irq_index; | |
| }; | |
| struct dpsw_cmd_get_irq_enable { | |
| __le32 pad; | |
| u8 irq_index; | |
| }; | |
| struct dpsw_rsp_get_irq_enable { | |
| u8 enable_state; | |
| }; | |
| struct dpsw_cmd_set_irq_mask { | |
| __le32 mask; | |
| u8 irq_index; | |
| }; | |
| struct dpsw_cmd_get_irq_mask { | |
| __le32 pad; | |
| u8 irq_index; | |
| }; | |
| struct dpsw_rsp_get_irq_mask { | |
| __le32 mask; | |
| }; | |
| struct dpsw_cmd_get_irq_status { | |
| __le32 status; | |
| u8 irq_index; | |
| }; | |
| struct dpsw_rsp_get_irq_status { | |
| __le32 status; | |
| }; | |
| struct dpsw_cmd_clear_irq_status { | |
| __le32 status; | |
| u8 irq_index; | |
| }; | |
| #define DPSW_COMPONENT_TYPE_SHIFT 0 | |
| #define DPSW_COMPONENT_TYPE_SIZE 4 | |
| #define DPSW_FLOODING_CFG_SHIFT 0 | |
| #define DPSW_FLOODING_CFG_SIZE 4 | |
| #define DPSW_BROADCAST_CFG_SHIFT 4 | |
| #define DPSW_BROADCAST_CFG_SIZE 4 | |
| struct dpsw_rsp_get_attr { | |
| /* cmd word 0 */ | |
| __le16 num_ifs; | |
| u8 max_fdbs; | |
| u8 num_fdbs; | |
| __le16 max_vlans; | |
| __le16 num_vlans; | |
| /* cmd word 1 */ | |
| __le16 max_fdb_entries; | |
| __le16 fdb_aging_time; | |
| __le32 dpsw_id; | |
| /* cmd word 2 */ | |
| __le16 mem_size; | |
| __le16 max_fdb_mc_groups; | |
| u8 max_meters_per_if; | |
| /* from LSB only the first 4 bits */ | |
| u8 component_type; | |
| /* [0:3] - flooding configuration | |
| * [4:7] - broadcast configuration | |
| */ | |
| u8 repl_cfg; | |
| u8 pad; | |
| /* cmd word 3 */ | |
| __le64 options; | |
| }; | |
| #define DPSW_VLAN_ID_SHIFT 0 | |
| #define DPSW_VLAN_ID_SIZE 12 | |
| #define DPSW_DEI_SHIFT 12 | |
| #define DPSW_DEI_SIZE 1 | |
| #define DPSW_PCP_SHIFT 13 | |
| #define DPSW_PCP_SIZE 3 | |
| struct dpsw_cmd_if_set_tci { | |
| __le16 if_id; | |
| /* from LSB: VLAN_ID:12 DEI:1 PCP:3 */ | |
| __le16 conf; | |
| }; | |
| struct dpsw_cmd_if_get_tci { | |
| __le16 if_id; | |
| }; | |
| struct dpsw_rsp_if_get_tci { | |
| __le16 pad; | |
| __le16 vlan_id; | |
| u8 dei; | |
| u8 pcp; | |
| }; | |
| #define DPSW_STATE_SHIFT 0 | |
| #define DPSW_STATE_SIZE 4 | |
| struct dpsw_cmd_if_set_stp { | |
| __le16 if_id; | |
| __le16 vlan_id; | |
| /* only the first LSB 4 bits */ | |
| u8 state; | |
| }; | |
| #define DPSW_COUNTER_TYPE_SHIFT 0 | |
| #define DPSW_COUNTER_TYPE_SIZE 5 | |
| struct dpsw_cmd_if_get_counter { | |
| __le16 if_id; | |
| /* from LSB: type:5 */ | |
| u8 type; | |
| }; | |
| struct dpsw_rsp_if_get_counter { | |
| __le64 pad; | |
| __le64 counter; | |
| }; | |
| struct dpsw_cmd_if { | |
| __le16 if_id; | |
| }; | |
| #define DPSW_ADMIT_UNTAGGED_SHIFT 0 | |
| #define DPSW_ADMIT_UNTAGGED_SIZE 4 | |
| #define DPSW_ENABLED_SHIFT 5 | |
| #define DPSW_ENABLED_SIZE 1 | |
| #define DPSW_ACCEPT_ALL_VLAN_SHIFT 6 | |
| #define DPSW_ACCEPT_ALL_VLAN_SIZE 1 | |
| struct dpsw_rsp_if_get_attr { | |
| /* cmd word 0 */ | |
| /* from LSB: admit_untagged:4 enabled:1 accept_all_vlan:1 */ | |
| u8 conf; | |
| u8 pad1; | |
| u8 num_tcs; | |
| u8 pad2; | |
| __le16 qdid; | |
| /* cmd word 1 */ | |
| __le32 options; | |
| __le32 pad3; | |
| /* cmd word 2 */ | |
| __le32 rate; | |
| }; | |
| struct dpsw_cmd_if_set_max_frame_length { | |
| __le16 if_id; | |
| __le16 frame_length; | |
| }; | |
| struct dpsw_cmd_if_set_link_cfg { | |
| /* cmd word 0 */ | |
| __le16 if_id; | |
| u8 pad[6]; | |
| /* cmd word 1 */ | |
| __le32 rate; | |
| __le32 pad1; | |
| /* cmd word 2 */ | |
| __le64 options; | |
| }; | |
| struct dpsw_cmd_if_get_link_state { | |
| __le16 if_id; | |
| }; | |
| #define DPSW_UP_SHIFT 0 | |
| #define DPSW_UP_SIZE 1 | |
| struct dpsw_rsp_if_get_link_state { | |
| /* cmd word 0 */ | |
| __le32 pad0; | |
| u8 up; | |
| u8 pad1[3]; | |
| /* cmd word 1 */ | |
| __le32 rate; | |
| __le32 pad2; | |
| /* cmd word 2 */ | |
| __le64 options; | |
| }; | |
| struct dpsw_vlan_add { | |
| __le16 fdb_id; | |
| __le16 vlan_id; | |
| }; | |
| struct dpsw_cmd_vlan_add_if { | |
| /* cmd word 0 */ | |
| __le16 options; | |
| __le16 vlan_id; | |
| __le16 fdb_id; | |
| __le16 pad0; | |
| /* cmd word 1-4 */ | |
| __le64 if_id; | |
| }; | |
| struct dpsw_cmd_vlan_manage_if { | |
| /* cmd word 0 */ | |
| __le16 pad0; | |
| __le16 vlan_id; | |
| __le32 pad1; | |
| /* cmd word 1-4 */ | |
| __le64 if_id; | |
| }; | |
| struct dpsw_cmd_vlan_remove { | |
| __le16 pad; | |
| __le16 vlan_id; | |
| }; | |
| struct dpsw_cmd_fdb_add { | |
| __le32 pad; | |
| __le16 fdb_ageing_time; | |
| __le16 num_fdb_entries; | |
| }; | |
| struct dpsw_rsp_fdb_add { | |
| __le16 fdb_id; | |
| }; | |
| struct dpsw_cmd_fdb_remove { | |
| __le16 fdb_id; | |
| }; | |
| #define DPSW_ENTRY_TYPE_SHIFT 0 | |
| #define DPSW_ENTRY_TYPE_SIZE 4 | |
| struct dpsw_cmd_fdb_unicast_op { | |
| /* cmd word 0 */ | |
| __le16 fdb_id; | |
| u8 mac_addr[6]; | |
| /* cmd word 1 */ | |
| __le16 if_egress; | |
| /* only the first 4 bits from LSB */ | |
| u8 type; | |
| }; | |
| struct dpsw_cmd_fdb_multicast_op { | |
| /* cmd word 0 */ | |
| __le16 fdb_id; | |
| __le16 num_ifs; | |
| /* only the first 4 bits from LSB */ | |
| u8 type; | |
| u8 pad[3]; | |
| /* cmd word 1 */ | |
| u8 mac_addr[6]; | |
| __le16 pad2; | |
| /* cmd word 2-5 */ | |
| __le64 if_id; | |
| }; | |
| struct dpsw_cmd_fdb_dump { | |
| __le16 fdb_id; | |
| __le16 pad0; | |
| __le32 pad1; | |
| __le64 iova_addr; | |
| __le32 iova_size; | |
| }; | |
| struct dpsw_rsp_fdb_dump { | |
| __le16 num_entries; | |
| }; | |
| struct dpsw_rsp_ctrl_if_get_attr { | |
| __le64 pad; | |
| __le32 rx_fqid; | |
| __le32 rx_err_fqid; | |
| __le32 tx_err_conf_fqid; | |
| }; | |
| #define DPSW_BACKUP_POOL(val, order) (((val) & 0x1) << (order)) | |
| struct dpsw_cmd_ctrl_if_set_pools { | |
| u8 num_dpbp; | |
| u8 backup_pool_mask; | |
| __le16 pad; | |
| __le32 dpbp_id[DPSW_MAX_DPBP]; | |
| __le16 buffer_size[DPSW_MAX_DPBP]; | |
| }; | |
| #define DPSW_DEST_TYPE_SHIFT 0 | |
| #define DPSW_DEST_TYPE_SIZE 4 | |
| struct dpsw_cmd_ctrl_if_set_queue { | |
| __le32 dest_id; | |
| u8 dest_priority; | |
| u8 pad; | |
| /* from LSB: dest_type:4 */ | |
| u8 dest_type; | |
| u8 qtype; | |
| __le64 user_ctx; | |
| __le32 options; | |
| }; | |
| struct dpsw_rsp_get_api_version { | |
| __le16 version_major; | |
| __le16 version_minor; | |
| }; | |
| struct dpsw_rsp_if_get_mac_addr { | |
| __le16 pad; | |
| u8 mac_addr[6]; | |
| }; | |
| struct dpsw_cmd_set_egress_flood { | |
| __le16 fdb_id; | |
| u8 flood_type; | |
| u8 pad[5]; | |
| __le64 if_id; | |
| }; | |
| #define DPSW_LEARNING_MODE_SHIFT 0 | |
| #define DPSW_LEARNING_MODE_SIZE 4 | |
| struct dpsw_cmd_if_set_learning_mode { | |
| __le16 if_id; | |
| /* only the first 4 bits from LSB */ | |
| u8 mode; | |
| }; | |
| struct dpsw_cmd_acl_add { | |
| __le16 pad; | |
| __le16 max_entries; | |
| }; | |
| struct dpsw_rsp_acl_add { | |
| __le16 acl_id; | |
| }; | |
| struct dpsw_cmd_acl_remove { | |
| __le16 acl_id; | |
| }; | |
| struct dpsw_cmd_acl_if { | |
| __le16 acl_id; | |
| __le16 num_ifs; | |
| __le32 pad; | |
| __le64 if_id; | |
| }; | |
| struct dpsw_prep_acl_entry { | |
| u8 match_l2_dest_mac[6]; | |
| __le16 match_l2_tpid; | |
| u8 match_l2_source_mac[6]; | |
| __le16 match_l2_vlan_id; | |
| __le32 match_l3_dest_ip; | |
| __le32 match_l3_source_ip; | |
| __le16 match_l4_dest_port; | |
| __le16 match_l4_source_port; | |
| __le16 match_l2_ether_type; | |
| u8 match_l2_pcp_dei; | |
| u8 match_l3_dscp; | |
| u8 mask_l2_dest_mac[6]; | |
| __le16 mask_l2_tpid; | |
| u8 mask_l2_source_mac[6]; | |
| __le16 mask_l2_vlan_id; | |
| __le32 mask_l3_dest_ip; | |
| __le32 mask_l3_source_ip; | |
| __le16 mask_l4_dest_port; | |
| __le16 mask_l4_source_port; | |
| __le16 mask_l2_ether_type; | |
| u8 mask_l2_pcp_dei; | |
| u8 mask_l3_dscp; | |
| u8 match_l3_protocol; | |
| u8 mask_l3_protocol; | |
| }; | |
| #define DPSW_RESULT_ACTION_SHIFT 0 | |
| #define DPSW_RESULT_ACTION_SIZE 4 | |
| struct dpsw_cmd_acl_entry { | |
| __le16 acl_id; | |
| __le16 result_if_id; | |
| __le32 precedence; | |
| /* from LSB only the first 4 bits */ | |
| u8 result_action; | |
| u8 pad[7]; | |
| __le64 pad2[4]; | |
| __le64 key_iova; | |
| }; | |
| struct dpsw_cmd_set_reflection_if { | |
| __le16 if_id; | |
| }; | |
| #define DPSW_FILTER_SHIFT 0 | |
| #define DPSW_FILTER_SIZE 2 | |
| struct dpsw_cmd_if_reflection { | |
| __le16 if_id; | |
| __le16 vlan_id; | |
| /* only 2 bits from the LSB */ | |
| u8 filter; | |
| }; | |
| struct dpsw_cmd_lag { | |
| u8 group_id; | |
| u8 num_ifs; | |
| u8 pad[6]; | |
| u8 if_id[DPSW_MAX_LAG_IFS]; | |
| u8 phase; | |
| }; | |
| struct dpsw_cmd_if_set_lag_state { | |
| __le16 if_id; | |
| u8 tx_enabled; | |
| }; | |
| #pragma pack(pop) | |
| #endif /* __FSL_DPSW_CMD_H */ |