ionic: add hw timestamp structs to interface
The interface for hardware timestamping includes a new FW request, device identity fields, Tx and Rx queue feature bits, a new Rx filter type, the beginnings of Rx packet classifications, and hardware timestamp registers. If the IONIC_ETH_HW_TIMESTAMP bit is shown in the ionic_lif_config features bit string, then we have support for the hw clock registers. If the IONIC_RXQ_F_HWSTAMP and IONIC_TXQ_F_HWSTAMP features are shown in the ionic_q_identity features, then the queues can support HW timestamps on packets. Signed-off-by: Allen Hubbe <allenbh@pensando.io> Signed-off-by: Shannon Nelson <snelson@pensando.io> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0ec9f6669a
commit
3da258439e
@ -59,6 +59,7 @@ static_assert(sizeof(struct ionic_dev_getattr_cmd) == 64);
|
||||
static_assert(sizeof(struct ionic_dev_getattr_comp) == 16);
|
||||
static_assert(sizeof(struct ionic_dev_setattr_cmd) == 64);
|
||||
static_assert(sizeof(struct ionic_dev_setattr_comp) == 16);
|
||||
static_assert(sizeof(struct ionic_lif_setphc_cmd) == 64);
|
||||
|
||||
/* Port commands */
|
||||
static_assert(sizeof(struct ionic_port_identify_cmd) == 64);
|
||||
|
@ -34,6 +34,7 @@ enum ionic_cmd_opcode {
|
||||
IONIC_CMD_LIF_RESET = 22,
|
||||
IONIC_CMD_LIF_GETATTR = 23,
|
||||
IONIC_CMD_LIF_SETATTR = 24,
|
||||
IONIC_CMD_LIF_SETPHC = 25,
|
||||
|
||||
IONIC_CMD_RX_MODE_SET = 30,
|
||||
IONIC_CMD_RX_FILTER_ADD = 31,
|
||||
@ -269,6 +270,9 @@ union ionic_drv_identity {
|
||||
* value in usecs to device units using:
|
||||
* device units = usecs * mult / div
|
||||
* @eq_count: Number of shared event queues
|
||||
* @hwstamp_mask: Bitmask for subtraction of hardware tick values.
|
||||
* @hwstamp_mult: Hardware tick to nanosecond multiplier.
|
||||
* @hwstamp_shift: Hardware tick to nanosecond divisor (power of two).
|
||||
*/
|
||||
union ionic_dev_identity {
|
||||
struct {
|
||||
@ -283,6 +287,9 @@ union ionic_dev_identity {
|
||||
__le32 intr_coal_mult;
|
||||
__le32 intr_coal_div;
|
||||
__le32 eq_count;
|
||||
__le64 hwstamp_mask;
|
||||
__le32 hwstamp_mult;
|
||||
__le32 hwstamp_shift;
|
||||
};
|
||||
__le32 words[478];
|
||||
};
|
||||
@ -374,6 +381,39 @@ enum ionic_q_feature {
|
||||
IONIC_Q_F_4X_SG_DESC = BIT_ULL(9),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ionic_rxq_feature - RXQ-specific Features
|
||||
*
|
||||
* Per-queue-type features use bits 16 and higher.
|
||||
*
|
||||
* @IONIC_RXQ_F_HWSTAMP: Queue supports Hardware Timestamping
|
||||
*/
|
||||
enum ionic_rxq_feature {
|
||||
IONIC_RXQ_F_HWSTAMP = BIT_ULL(16),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ionic_txq_feature - TXQ-specific Features
|
||||
*
|
||||
* Per-queue-type features use bits 16 and higher.
|
||||
*
|
||||
* @IONIC_TXQ_F_HWSTAMP: Queue supports Hardware Timestamping
|
||||
*/
|
||||
enum ionic_txq_feature {
|
||||
IONIC_TXQ_F_HWSTAMP = BIT(16),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ionic_hwstamp_bits - Hardware timestamp decoding bits
|
||||
* @IONIC_HWSTAMP_INVALID: Invalid hardware timestamp value
|
||||
* @IONIC_HWSTAMP_CQ_NEGOFFSET: Timestamp field negative offset
|
||||
* from the base cq descriptor.
|
||||
*/
|
||||
enum ionic_hwstamp_bits {
|
||||
IONIC_HWSTAMP_INVALID = ~0ull,
|
||||
IONIC_HWSTAMP_CQ_NEGOFFSET = 8,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
|
||||
* @qtype: Hardware Queue Type
|
||||
@ -434,6 +474,8 @@ union ionic_lif_config {
|
||||
* @max_mcast_filters: Number of perfect multicast addresses supported
|
||||
* @min_frame_size: Minimum size of frames to be sent
|
||||
* @max_frame_size: Maximum size of frames to be sent
|
||||
* @hwstamp_tx_modes: Bitmask of BIT_ULL(enum ionic_txstamp_mode)
|
||||
* @hwstamp_rx_filters: Bitmask of enum ionic_pkt_class
|
||||
* @config: LIF config struct with features, mtu, mac, q counts
|
||||
*
|
||||
* @rdma: RDMA identify structure
|
||||
@ -467,7 +509,10 @@ union ionic_lif_identity {
|
||||
__le16 rss_ind_tbl_sz;
|
||||
__le32 min_frame_size;
|
||||
__le32 max_frame_size;
|
||||
u8 rsvd2[106];
|
||||
u8 rsvd2[2];
|
||||
__le64 hwstamp_tx_modes;
|
||||
__le64 hwstamp_rx_filters;
|
||||
u8 rsvd3[88];
|
||||
union ionic_lif_config config;
|
||||
} __packed eth;
|
||||
|
||||
@ -1046,7 +1091,64 @@ enum ionic_eth_hw_features {
|
||||
IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16),
|
||||
IONIC_ETH_HW_RX_CSUM_GENEVE = BIT(17),
|
||||
IONIC_ETH_HW_TX_CSUM_GENEVE = BIT(18),
|
||||
IONIC_ETH_HW_TSO_GENEVE = BIT(19)
|
||||
IONIC_ETH_HW_TSO_GENEVE = BIT(19),
|
||||
IONIC_ETH_HW_TIMESTAMP = BIT(20),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ionic_pkt_class - Packet classification mask.
|
||||
*
|
||||
* Used with rx steering filter, packets indicated by the mask can be steered
|
||||
* toward a specific receive queue.
|
||||
*
|
||||
* @IONIC_PKT_CLS_NTP_ALL: All NTP packets.
|
||||
* @IONIC_PKT_CLS_PTP1_SYNC: PTPv1 sync
|
||||
* @IONIC_PKT_CLS_PTP1_DREQ: PTPv1 delay-request
|
||||
* @IONIC_PKT_CLS_PTP1_ALL: PTPv1 all packets
|
||||
* @IONIC_PKT_CLS_PTP2_L4_SYNC: PTPv2-UDP sync
|
||||
* @IONIC_PKT_CLS_PTP2_L4_DREQ: PTPv2-UDP delay-request
|
||||
* @IONIC_PKT_CLS_PTP2_L4_ALL: PTPv2-UDP all packets
|
||||
* @IONIC_PKT_CLS_PTP2_L2_SYNC: PTPv2-ETH sync
|
||||
* @IONIC_PKT_CLS_PTP2_L2_DREQ: PTPv2-ETH delay-request
|
||||
* @IONIC_PKT_CLS_PTP2_L2_ALL: PTPv2-ETH all packets
|
||||
* @IONIC_PKT_CLS_PTP2_SYNC: PTPv2 sync
|
||||
* @IONIC_PKT_CLS_PTP2_DREQ: PTPv2 delay-request
|
||||
* @IONIC_PKT_CLS_PTP2_ALL: PTPv2 all packets
|
||||
* @IONIC_PKT_CLS_PTP_SYNC: PTP sync
|
||||
* @IONIC_PKT_CLS_PTP_DREQ: PTP delay-request
|
||||
* @IONIC_PKT_CLS_PTP_ALL: PTP all packets
|
||||
*/
|
||||
enum ionic_pkt_class {
|
||||
IONIC_PKT_CLS_NTP_ALL = BIT(0),
|
||||
|
||||
IONIC_PKT_CLS_PTP1_SYNC = BIT(1),
|
||||
IONIC_PKT_CLS_PTP1_DREQ = BIT(2),
|
||||
IONIC_PKT_CLS_PTP1_ALL = BIT(3) |
|
||||
IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP1_DREQ,
|
||||
|
||||
IONIC_PKT_CLS_PTP2_L4_SYNC = BIT(4),
|
||||
IONIC_PKT_CLS_PTP2_L4_DREQ = BIT(5),
|
||||
IONIC_PKT_CLS_PTP2_L4_ALL = BIT(6) |
|
||||
IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L4_DREQ,
|
||||
|
||||
IONIC_PKT_CLS_PTP2_L2_SYNC = BIT(7),
|
||||
IONIC_PKT_CLS_PTP2_L2_DREQ = BIT(8),
|
||||
IONIC_PKT_CLS_PTP2_L2_ALL = BIT(9) |
|
||||
IONIC_PKT_CLS_PTP2_L2_SYNC | IONIC_PKT_CLS_PTP2_L2_DREQ,
|
||||
|
||||
IONIC_PKT_CLS_PTP2_SYNC =
|
||||
IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L2_SYNC,
|
||||
IONIC_PKT_CLS_PTP2_DREQ =
|
||||
IONIC_PKT_CLS_PTP2_L4_DREQ | IONIC_PKT_CLS_PTP2_L2_DREQ,
|
||||
IONIC_PKT_CLS_PTP2_ALL =
|
||||
IONIC_PKT_CLS_PTP2_L4_ALL | IONIC_PKT_CLS_PTP2_L2_ALL,
|
||||
|
||||
IONIC_PKT_CLS_PTP_SYNC =
|
||||
IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP2_SYNC,
|
||||
IONIC_PKT_CLS_PTP_DREQ =
|
||||
IONIC_PKT_CLS_PTP1_DREQ | IONIC_PKT_CLS_PTP2_DREQ,
|
||||
IONIC_PKT_CLS_PTP_ALL =
|
||||
IONIC_PKT_CLS_PTP1_ALL | IONIC_PKT_CLS_PTP2_ALL,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1355,6 +1457,20 @@ enum ionic_stats_ctl_cmd {
|
||||
IONIC_STATS_CTL_RESET = 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ionic_txstamp_mode - List of TX Timestamping Modes
|
||||
* @IONIC_TXSTAMP_OFF: Disable TX hardware timetamping.
|
||||
* @IONIC_TXSTAMP_ON: Enable local TX hardware timetamping.
|
||||
* @IONIC_TXSTAMP_ONESTEP_SYNC: Modify TX PTP Sync packets.
|
||||
* @IONIC_TXSTAMP_ONESTEP_P2P: Modify TX PTP Sync and PDelayResp.
|
||||
*/
|
||||
enum ionic_txstamp_mode {
|
||||
IONIC_TXSTAMP_OFF = 0,
|
||||
IONIC_TXSTAMP_ON = 1,
|
||||
IONIC_TXSTAMP_ONESTEP_SYNC = 2,
|
||||
IONIC_TXSTAMP_ONESTEP_P2P = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ionic_port_attr - List of device attributes
|
||||
* @IONIC_PORT_ATTR_STATE: Port state attribute
|
||||
@ -1597,6 +1713,7 @@ enum ionic_rss_hash_types {
|
||||
* @IONIC_LIF_ATTR_FEATURES: LIF features attribute
|
||||
* @IONIC_LIF_ATTR_RSS: LIF RSS attribute
|
||||
* @IONIC_LIF_ATTR_STATS_CTRL: LIF statistics control attribute
|
||||
* @IONIC_LIF_ATTR_TXSTAMP: LIF TX timestamping mode
|
||||
*/
|
||||
enum ionic_lif_attr {
|
||||
IONIC_LIF_ATTR_STATE = 0,
|
||||
@ -1606,6 +1723,7 @@ enum ionic_lif_attr {
|
||||
IONIC_LIF_ATTR_FEATURES = 4,
|
||||
IONIC_LIF_ATTR_RSS = 5,
|
||||
IONIC_LIF_ATTR_STATS_CTRL = 6,
|
||||
IONIC_LIF_ATTR_TXSTAMP = 7,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1623,6 +1741,7 @@ enum ionic_lif_attr {
|
||||
* @key: The hash secret key
|
||||
* @addr: Address for the indirection table shared memory
|
||||
* @stats_ctl: stats control commands (enum ionic_stats_ctl_cmd)
|
||||
* @txstamp: TX Timestamping Mode (enum ionic_txstamp_mode)
|
||||
*/
|
||||
struct ionic_lif_setattr_cmd {
|
||||
u8 opcode;
|
||||
@ -1641,6 +1760,7 @@ struct ionic_lif_setattr_cmd {
|
||||
__le64 addr;
|
||||
} rss;
|
||||
u8 stats_ctl;
|
||||
__le16 txstamp_mode;
|
||||
u8 rsvd[60];
|
||||
} __packed;
|
||||
};
|
||||
@ -1685,6 +1805,7 @@ struct ionic_lif_getattr_cmd {
|
||||
* @mtu: Mtu
|
||||
* @mac: Station mac
|
||||
* @features: Features (enum ionic_eth_hw_features)
|
||||
* @txstamp: TX Timestamping Mode (enum ionic_txstamp_mode)
|
||||
* @color: Color bit
|
||||
*/
|
||||
struct ionic_lif_getattr_comp {
|
||||
@ -1696,11 +1817,35 @@ struct ionic_lif_getattr_comp {
|
||||
__le32 mtu;
|
||||
u8 mac[6];
|
||||
__le64 features;
|
||||
__le16 txstamp_mode;
|
||||
u8 rsvd2[11];
|
||||
} __packed;
|
||||
u8 color;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ionic_lif_setphc_cmd - Set LIF PTP Hardware Clock
|
||||
* @opcode: Opcode
|
||||
* @lif_index: LIF index
|
||||
* @tick: Hardware stamp tick of an instant in time.
|
||||
* @nsec: Nanosecond stamp of the same instant.
|
||||
* @frac: Fractional nanoseconds at the same instant.
|
||||
* @mult: Cycle to nanosecond multiplier.
|
||||
* @shift: Cycle to nanosecond divisor (power of two).
|
||||
*/
|
||||
struct ionic_lif_setphc_cmd {
|
||||
u8 opcode;
|
||||
u8 rsvd1;
|
||||
__le16 lif_index;
|
||||
u8 rsvd2[4];
|
||||
__le64 tick;
|
||||
__le64 nsec;
|
||||
__le64 frac;
|
||||
__le32 mult;
|
||||
__le32 shift;
|
||||
u8 rsvd3[24];
|
||||
};
|
||||
|
||||
enum ionic_rx_mode {
|
||||
IONIC_RX_MODE_F_UNICAST = BIT(0),
|
||||
IONIC_RX_MODE_F_MULTICAST = BIT(1),
|
||||
@ -1733,9 +1878,10 @@ struct ionic_rx_mode_set_cmd {
|
||||
typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
|
||||
|
||||
enum ionic_rx_filter_match_type {
|
||||
IONIC_RX_FILTER_MATCH_VLAN = 0,
|
||||
IONIC_RX_FILTER_MATCH_MAC,
|
||||
IONIC_RX_FILTER_MATCH_MAC_VLAN,
|
||||
IONIC_RX_FILTER_MATCH_VLAN = 0x0,
|
||||
IONIC_RX_FILTER_MATCH_MAC = 0x1,
|
||||
IONIC_RX_FILTER_MATCH_MAC_VLAN = 0x2,
|
||||
IONIC_RX_FILTER_STEER_PKTCLASS = 0x10,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1752,6 +1898,7 @@ enum ionic_rx_filter_match_type {
|
||||
* @mac_vlan: MACVLAN filter
|
||||
* @vlan: VLAN ID
|
||||
* @addr: MAC address (network-byte order)
|
||||
* @pkt_class: Packet classification filter
|
||||
*/
|
||||
struct ionic_rx_filter_add_cmd {
|
||||
u8 opcode;
|
||||
@ -1770,8 +1917,9 @@ struct ionic_rx_filter_add_cmd {
|
||||
__le16 vlan;
|
||||
u8 addr[6];
|
||||
} mac_vlan;
|
||||
__le64 pkt_class;
|
||||
u8 rsvd[54];
|
||||
};
|
||||
} __packed;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -2771,6 +2919,16 @@ union ionic_dev_cmd_comp {
|
||||
struct ionic_fw_control_comp fw_control;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ionic_hwstamp_regs - Hardware current timestamp registers
|
||||
* @tick_low: Low 32 bits of hardware timestamp
|
||||
* @tick_high: High 32 bits of hardware timestamp
|
||||
*/
|
||||
struct ionic_hwstamp_regs {
|
||||
u32 tick_low;
|
||||
u32 tick_high;
|
||||
};
|
||||
|
||||
/**
|
||||
* union ionic_dev_info_regs - Device info register format (read-only)
|
||||
* @signature: Signature value of 0x44455649 ('DEVI')
|
||||
@ -2781,6 +2939,7 @@ union ionic_dev_cmd_comp {
|
||||
* @fw_heartbeat: Firmware heartbeat counter
|
||||
* @serial_num: Serial number
|
||||
* @fw_version: Firmware version
|
||||
* @hwstamp_regs: Hardware current timestamp registers
|
||||
*/
|
||||
union ionic_dev_info_regs {
|
||||
#define IONIC_DEVINFO_FWVERS_BUFLEN 32
|
||||
@ -2795,6 +2954,8 @@ union ionic_dev_info_regs {
|
||||
u32 fw_heartbeat;
|
||||
char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
|
||||
char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
|
||||
u8 rsvd_pad1024[948];
|
||||
struct ionic_hwstamp_regs hwstamp;
|
||||
};
|
||||
u32 words[512];
|
||||
};
|
||||
@ -2842,6 +3003,7 @@ union ionic_adminq_cmd {
|
||||
struct ionic_q_control_cmd q_control;
|
||||
struct ionic_lif_setattr_cmd lif_setattr;
|
||||
struct ionic_lif_getattr_cmd lif_getattr;
|
||||
struct ionic_lif_setphc_cmd lif_setphc;
|
||||
struct ionic_rx_mode_set_cmd rx_mode_set;
|
||||
struct ionic_rx_filter_add_cmd rx_filter_add;
|
||||
struct ionic_rx_filter_del_cmd rx_filter_del;
|
||||
@ -2858,6 +3020,7 @@ union ionic_adminq_comp {
|
||||
struct ionic_q_init_comp q_init;
|
||||
struct ionic_lif_setattr_comp lif_setattr;
|
||||
struct ionic_lif_getattr_comp lif_getattr;
|
||||
struct ionic_admin_comp lif_setphc;
|
||||
struct ionic_rx_filter_add_comp rx_filter_add;
|
||||
struct ionic_fw_control_comp fw_control;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user