#ifndef _ICE_H #define _ICE_H /** @file * * Intel 100 Gigabit Ethernet network card driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include "intelxl.h" /** BAR size */ #define ICE_BAR_SIZE 0x800000 /****************************************************************************** * * Transmit and receive datapaths * ****************************************************************************** */ /** Transmit queue context */ struct ice_context_tx { /** Base address */ uint64_t base_port; /** PF number and queue type */ uint16_t pf_type; /** Source VSI */ uint16_t vsi; /** Reserved */ uint8_t reserved_c[5]; /** Queue length */ uint16_t len; /** Flags */ uint16_t flags; /** Reserved */ uint8_t reserved_d[3]; } __attribute__ (( packed )); /** Transmit scheduler configuration */ struct ice_schedule_tx { /** Node type */ uint8_t type; /** Valid sections */ uint8_t sections; /** Generic information */ uint8_t generic; /** Flags */ uint8_t flags; /** Committed bandwidth profile ID */ uint16_t commit_id; /** Committeed bandwidth weight */ uint16_t commit_weight; /** Excess bandwidth profile ID */ uint16_t excess_id; /** Excess bandwidth weight */ uint16_t excess_weight; /** Shared rate limit profile ID */ uint16_t shared; /** Reserved */ uint16_t reserved; } __attribute__ (( packed )); /** Global Receive Queue Control Register */ #define ICE_QRX_CTRL 0x120000 /** Receive Queue Context Registers */ #define ICE_QRX_CONTEXT(x) ( 0x280000 + ( 0x2000 * (x) ) ) /** Receive Queue Tail Register */ #define ICE_QRX_TAIL 0x290000 /** Transmit Comm Scheduler Queue Doorbell Register */ #define ICE_QTX_COMM_DBELL 0x2c0000 /** Transmit Comm Scheduler Queue Context Data Registers */ #define ICE_GLCOMM_QTX_CNTX_DATA(x) ( 0x2d2d40 + ( 0x4 * (x) ) ) /** Transmit Comm Scheduler Queue Context Control Register */ #define ICE_GLCOMM_QTX_CNTX_CTL 0x2d2dc8 #define ICE_GLCOMM_QTX_CNTX_CTL_CMD(x) ( (x) << 16 ) /**< Command */ #define ICE_GLCOMM_QTX_CNTX_CTL_CMD_READ \ ICE_GLCOMM_QTX_CNTX_CTL_CMD ( 0 ) /**< Read context */ #define ICE_GLCOMM_QTX_CNTX_CTL_EXEC 0x00080000UL /**< Execute */ /** Transmit Comm Scheduler Queue Context Status Register */ #define ICE_GLCOMM_QTX_CNTX_STAT 0x2d2dcc #define ICE_GLCOMM_QTX_CNTX_BUSY 0x00000001UL /**< In progress */ /** Queue Context Flex Extension Register */ #define ICE_QRX_FLXP_CNTXT 0x480000 #define ICE_QRX_FLXP_CNTXT_RXDID_IDX(x) ( (x) << 0 ) /**< RX profile */ #define ICE_QRX_FLXP_CNTXT_RXDID_IDX_LEGACY_32 \ ICE_QRX_FLXP_CNTXT_RXDID_IDX ( 1 ) /**< 32-byte legacy */ #define ICE_QRX_FLXP_CNTXT_RXDID_PRIO(x) ( (x) << 8 ) /**< Priority */ #define ICE_QRX_FLXP_CNTXT_RXDID_PRIO_MAX \ ICE_QRX_FLXP_CNTXT_RXDID_PRIO ( 7 ) /**< Maximum priority */ /****************************************************************************** * * Admin queue * ****************************************************************************** */ /** Admin queue version number */ struct ice_admin_version { /** Branch identifier */ uint8_t branch; /** Major version number */ uint8_t major; /** Minor version number */ uint8_t minor; /** Patch level */ uint8_t patch; } __attribute__ (( packed )); /** Admin queue Get Version command parameters */ struct ice_admin_version_params { /** ROM version */ uint32_t rom; /** Firmware build ID */ uint32_t build; /** Firmware version */ struct ice_admin_version firmware; /** API version */ struct ice_admin_version api; } __attribute__ (( packed )); /** Admin queue Manage MAC Address Read command parameters */ struct ice_admin_mac_read_params { /** Valid addresses */ uint8_t valid; /** Reserved */ uint8_t reserved_a[3]; /** Number of addresses in response */ uint8_t count; /** Reserved */ uint8_t reserved_b[11]; } __attribute__ (( packed )); /** MAC Address description */ struct ice_admin_mac_read_address { /** Port number */ uint8_t port; /** Address type */ uint8_t type; /** MAC address */ uint8_t mac[ETH_ALEN]; } __attribute__ (( packed )); /** LAN MAC address type */ #define ICE_ADMIN_MAC_READ_TYPE_LAN 0 /** Admin queue Manage MAC Address Read data buffer */ struct ice_admin_mac_read_buffer { /** MAC addresses */ struct ice_admin_mac_read_address mac[4]; } __attribute__ (( packed )); /** Admin queue Manage MAC Address Write command parameters */ struct ice_admin_mac_write_params { /** Reserved */ uint8_t reserved_a[1]; /** Write type */ uint8_t type; /** MAC address */ uint8_t mac[ETH_ALEN]; /** Reserved */ uint8_t reserved_b[8]; } __attribute__ (( packed )); /** Admin queue Get Switch Configuration command parameters */ struct ice_admin_switch_params { /** Reserved */ uint8_t reserved_a[2]; /** Starting switching element identifier */ uint16_t next; /** Reserved */ uint8_t reserved[4]; /** Data buffer address */ uint64_t address; } __attribute__ (( packed )); /** Switching element configuration */ struct ice_admin_switch_config { /** Switching element ID and flags */ uint16_t seid; /** Uplink switching element ID */ uint16_t uplink; /** PF/VF number */ uint16_t func; } __attribute__ (( packed )); /** Switching element ID type mask */ #define ICE_ADMIN_SWITCH_TYPE_MASK 0xc000 /** Virtual Station Interface element type */ #define ICE_ADMIN_SWITCH_TYPE_VSI 0x8000 /** Admin queue Get Switch Configuration data buffer */ struct ice_admin_switch_buffer { /** Switch configuration */ struct ice_admin_switch_config cfg[1]; }; /** Admin queue Add Switch Rules command */ #define ICE_ADMIN_ADD_RULES 0x02a0 /** Admin queue Add Switch Rules command parameters */ struct ice_admin_rules_params { /** Number of rules */ uint16_t count; /** Reserved */ uint8_t reserved[6]; } __attribute__ (( packed )); /** Admin queue Add Switch Rules data buffer */ struct ice_admin_rules_buffer { /** Type */ uint16_t type; /** Return status */ uint16_t status; /** Receipt ID */ uint16_t recipe; /** Source port */ uint16_t port; /** Action */ uint32_t action; /** Lookup table index */ uint16_t index; /** Header length */ uint16_t len; /** Header data */ union { /** Ethernet header */ struct ethhdr eth; /** Raw data */ uint8_t raw[16]; } __attribute__ (( packed )) hdr; } __attribute__ (( packed )); /** Switch rule promiscuous recipe ID */ #define ICE_ADMIN_RULES_RECIPE_PROMISC 0x0003 /** Switch rule action valid */ #define ICE_ADMIN_RULES_ACTION_VALID 0x00020000UL /** Switch rule VSI number */ #define ICE_ADMIN_RULES_ACTION_VSI(x) ( (x) << 4 ) /** Admin queue Query Default Scheduling Tree Topology command */ #define ICE_ADMIN_SCHEDULE 0x0400 /** Admin queue Query Default Scheduling Tree Topology command parameters */ struct ice_admin_schedule_params { /** Reserved */ uint8_t reserved_a; /** Total branches */ uint8_t branches; /** Reserved */ uint8_t reserved_b[6]; } __attribute__ (( packed )); /** Transmit scheduler configuration generic section is valid */ #define ICE_SCHEDULE_GENERIC 0x01 /** Transmit scheduler configuration committed bandwidth section is valid */ #define ICE_SCHEDULE_COMMIT 0x02 /** Transmit scheduler configuration excess bandwidth section is valid */ #define ICE_SCHEDULE_EXCESS 0x04 /** Transmit scheduler configuration default weight */ #define ICE_SCHEDULE_WEIGHT 0x0004 /** Admin queue Query Default Scheduling Tree Topology node */ struct ice_admin_schedule_node { /** Parent TEID */ uint32_t parent; /** Node TEID */ uint32_t teid; /** Scheduler configuration */ struct ice_schedule_tx config; } __attribute__ (( packed )); /** Admin queue Query Default Scheduling Tree Topology branch */ struct ice_admin_schedule_branch { /** Reserved */ uint8_t reserved_a[4]; /** Number of nodes */ uint16_t count; /** Reserved */ uint8_t reserved_b[2]; /** Nodes */ struct ice_admin_schedule_node node[0]; } __attribute__ (( packed )); /** Admin queue Query Default Scheduling Tree Topology data buffer */ union ice_admin_schedule_buffer { /** Branches */ struct ice_admin_schedule_branch branch[0]; /** Padding */ uint8_t pad[INTELXL_ADMIN_BUFFER_SIZE]; } __attribute__ (( packed )); /** Admin queue Restart Autonegotiation command parameters */ struct ice_admin_autoneg_params { /** Reserved */ uint8_t reserved_a[2]; /** Flags */ uint8_t flags; /** Reserved */ uint8_t reserved_b[13]; } __attribute__ (( packed )); /** Admin queue Get Link Status command parameters */ struct ice_admin_link_params { /** Logical port number */ uint8_t port; /** Reserved */ uint8_t reserved_a; /** Link status notification */ uint8_t notify; /** Reserved */ uint8_t reserved_b[13]; } __attribute__ (( packed )); /** Admin queue Get Link Status data buffer */ struct ice_admin_link_buffer { /** Topology conflicts */ uint8_t conflict; /** Configuration errors */ uint8_t error; /** Link status */ uint8_t status; /** Reserved */ uint8_t reserved_a[7]; /** Link speed */ uint16_t speed; /** Reserved */ uint8_t reserved_b[20]; } __attribute__ (( packed )); /** Admin queue Add Transmit Queues command */ #define ICE_ADMIN_ADD_TXQ 0x0c30 /** Admin queue Add Transmit Queues command parameters */ struct ice_admin_add_txq_params { /** Number of queue groups */ uint8_t count; /** Reserved */ uint8_t reserved[7]; } __attribute__ (( packed )); /** Admin queue Add Transmit Queues data buffer */ struct ice_admin_add_txq_buffer { /** Parent TEID */ uint32_t parent; /** Number of queues */ uint8_t count; /** Reserved */ uint8_t reserved_a[3]; /** Transmit queue ID */ uint16_t id; /** Reserved */ uint8_t reserved_b[2]; /** Queue TEID */ uint32_t teid; /** Transmit queue context */ struct ice_context_tx ctx; /** Scheduler configuration */ struct ice_schedule_tx sched; } __attribute__ (( packed )); /** Transmit queue base address and port number */ #define ICE_TXQ_BASE_PORT( addr, port ) \ ( ( (addr) >> 7 ) | ( ( ( uint64_t ) (port) ) << 57 ) ) /** Transmit queue PF number */ #define ICE_TXQ_PF_TYPE( pf ) ( ( (pf) << 1 ) | ( 0x2 << 14 ) ) /** Transmit queue length */ #define ICE_TXQ_LEN( count ) ( (count) >> 1 ) /** Transmit queue uses TSO */ #define ICE_TXQ_FL_TSO 0x0001 /** Transmit queue uses legacy mode*/ #define ICE_TXQ_FL_LEGACY 0x1000 /** Admin queue Disable Transmit Queues command */ #define ICE_ADMIN_DISABLE_TXQ 0x0c31 /** Admin queue Disable Transmit Queues command parameters */ struct ice_admin_disable_txq_params { /** Flags */ uint8_t flags; /** Number of queue groups */ uint8_t count; /** Reserved */ uint8_t reserved_a; /** Timeout */ uint8_t timeout; /** Reserved */ uint8_t reserved_b[4]; } __attribute__ (( packed )); /** Disable queue and flush pipe */ #define ICE_TXQ_FL_FLUSH 0x08 /** Disable queue timeout */ #define ICE_TXQ_TIMEOUT 0xc8 /** Admin queue Disable Transmit Queues data buffer */ struct ice_admin_disable_txq_buffer { /** Parent TEID */ uint32_t parent; /** Number of queues */ uint8_t count; /** Reserved */ uint8_t reserved; /** Transmit queue ID */ uint16_t id; } __attribute__ (( packed )); /** Admin queue command parameters */ union ice_admin_params { /** Additional data buffer command parameters */ struct intelxl_admin_buffer_params buffer; /** Get Version command parameters */ struct ice_admin_version_params version; /** Manage MAC Address Read command parameters */ struct ice_admin_mac_read_params mac_read; /** Manage MAC Address Write command parameters */ struct ice_admin_mac_write_params mac_write; /** Get Switch Configuration command parameters */ struct ice_admin_switch_params sw; /** Add Switch Rules command parameters */ struct ice_admin_rules_params rules; /** Query Default Scheduling Tree Topology command parameters */ struct ice_admin_schedule_params sched; /** Restart Autonegotiation command parameters */ struct ice_admin_autoneg_params autoneg; /** Get Link Status command parameters */ struct ice_admin_link_params link; /** Add Transmit Queue command parameters */ struct ice_admin_add_txq_params add_txq; /** Disable Transmit Queue command parameters */ struct ice_admin_disable_txq_params disable_txq; } __attribute__ (( packed )); /** Admin queue data buffer */ union ice_admin_buffer { /** Original 40 Gigabit Ethernet data buffer */ union intelxl_admin_buffer xl; /** Manage MAC Address Read data buffer */ struct ice_admin_mac_read_buffer mac_read; /** Get Switch Configuration data buffer */ struct ice_admin_switch_buffer sw; /** Add Switch Rules data buffer */ struct ice_admin_rules_buffer rules; /** Query Default Scheduling Tree Topology data buffer */ union ice_admin_schedule_buffer sched; /** Get Link Status data buffer */ struct ice_admin_link_buffer link; /** Add Transmit Queue data buffer */ struct ice_admin_add_txq_buffer add_txq; /** Disable Transmit Queue data buffer */ struct ice_admin_disable_txq_buffer disable_txq; } __attribute__ (( packed )); /** Admin queue descriptor */ struct ice_admin_descriptor { /** Transparent union */ union { /** Original 40 Gigabit Ethernet descriptor */ struct intelxl_admin_descriptor xl; /** Transparent struct */ struct { /** Flags */ uint16_t flags; /** Opcode */ uint16_t opcode; /** Data length */ uint16_t len; /** Return value */ uint16_t ret; /** Opaque cookie */ uint32_t cookie; /** Reserved */ uint8_t reserved[4]; /** Parameters */ union ice_admin_params params; } __attribute__ (( packed )); } __attribute__ (( packed )); } __attribute__ (( packed )); /** * Get next admin command queue descriptor * * @v intelxl Intel device * @ret cmd Command descriptor */ struct ice_admin_descriptor * ice_admin_command_descriptor ( struct intelxl_nic *intelxl ) { struct intelxl_admin_descriptor *xlcmd = intelxl_admin_command_descriptor ( intelxl ); return container_of ( xlcmd, struct ice_admin_descriptor, xl ); } /** * Get next admin command queue data buffer * * @v intelxl Intel device * @ret buf Data buffer */ static inline __attribute__ (( always_inline )) union ice_admin_buffer * ice_admin_command_buffer ( struct intelxl_nic *intelxl ) { union intelxl_admin_buffer *xlbuf = intelxl_admin_command_buffer ( intelxl ); return container_of ( xlbuf, union ice_admin_buffer, xl ); } /****************************************************************************** * * Top level * ****************************************************************************** */ /** Function Requester ID Information Register */ #define ICE_PFFUNC_RID 0x09e880 #define ICE_PFFUNC_RID_FUNC_NUM(x) \ ( ( (x) >> 0 ) & 0x7 ) /**< Function number */ /** PF LAN Port Number Register */ #define ICE_PFGEN_PORTNUM 0x1d2400 #define ICE_PFGEN_PORTNUM_PORT_NUM(x) \ ( ( (x) >> 0 ) & 0x7 ) /**< Port number */ /** Transmit Queue Interrupt Cause Control Register */ #define ICE_QINT_TQCTL 0x140000 #define ICE_QINT_TQCTL_ITR_INDX(x) ( (x) << 11 ) /**< Throttling */ #define ICE_QINT_TQCTL_ITR_INDX_NONE \ ICE_QINT_TQCTL_ITR_INDX ( 0x3 ) /**< No throttling */ #define ICE_QINT_TQCTL_CAUSE_ENA 0x40000000UL /**< Enable */ /** Receive Queue Interrupt Cause Control Register */ #define ICE_QINT_RQCTL 0x150000 #define ICE_QINT_RQCTL_ITR_INDX(x) ( (x) << 11 ) /**< Throttling */ #define ICE_QINT_RQCTL_ITR_INDX_NONE \ ICE_QINT_RQCTL_ITR_INDX ( 0x3 ) /**< No throttling */ #define ICE_QINT_RQCTL_CAUSE_ENA 0x40000000UL /**< Enable */ /** Global Interrupt Dynamic Control Register */ #define ICE_GLINT_DYN_CTL 0x160000 #endif /* _ICE_H */