Commit 3da25843 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

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: default avatarAllen Hubbe <allenbh@pensando.io>
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0ec9f666
...@@ -59,6 +59,7 @@ static_assert(sizeof(struct ionic_dev_getattr_cmd) == 64); ...@@ -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_getattr_comp) == 16);
static_assert(sizeof(struct ionic_dev_setattr_cmd) == 64); static_assert(sizeof(struct ionic_dev_setattr_cmd) == 64);
static_assert(sizeof(struct ionic_dev_setattr_comp) == 16); static_assert(sizeof(struct ionic_dev_setattr_comp) == 16);
static_assert(sizeof(struct ionic_lif_setphc_cmd) == 64);
/* Port commands */ /* Port commands */
static_assert(sizeof(struct ionic_port_identify_cmd) == 64); static_assert(sizeof(struct ionic_port_identify_cmd) == 64);
......
...@@ -34,6 +34,7 @@ enum ionic_cmd_opcode { ...@@ -34,6 +34,7 @@ enum ionic_cmd_opcode {
IONIC_CMD_LIF_RESET = 22, IONIC_CMD_LIF_RESET = 22,
IONIC_CMD_LIF_GETATTR = 23, IONIC_CMD_LIF_GETATTR = 23,
IONIC_CMD_LIF_SETATTR = 24, IONIC_CMD_LIF_SETATTR = 24,
IONIC_CMD_LIF_SETPHC = 25,
IONIC_CMD_RX_MODE_SET = 30, IONIC_CMD_RX_MODE_SET = 30,
IONIC_CMD_RX_FILTER_ADD = 31, IONIC_CMD_RX_FILTER_ADD = 31,
...@@ -269,6 +270,9 @@ union ionic_drv_identity { ...@@ -269,6 +270,9 @@ union ionic_drv_identity {
* value in usecs to device units using: * value in usecs to device units using:
* device units = usecs * mult / div * device units = usecs * mult / div
* @eq_count: Number of shared event queues * @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 { union ionic_dev_identity {
struct { struct {
...@@ -283,6 +287,9 @@ union ionic_dev_identity { ...@@ -283,6 +287,9 @@ union ionic_dev_identity {
__le32 intr_coal_mult; __le32 intr_coal_mult;
__le32 intr_coal_div; __le32 intr_coal_div;
__le32 eq_count; __le32 eq_count;
__le64 hwstamp_mask;
__le32 hwstamp_mult;
__le32 hwstamp_shift;
}; };
__le32 words[478]; __le32 words[478];
}; };
...@@ -374,6 +381,39 @@ enum ionic_q_feature { ...@@ -374,6 +381,39 @@ enum ionic_q_feature {
IONIC_Q_F_4X_SG_DESC = BIT_ULL(9), 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 * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
* @qtype: Hardware Queue Type * @qtype: Hardware Queue Type
...@@ -434,6 +474,8 @@ union ionic_lif_config { ...@@ -434,6 +474,8 @@ union ionic_lif_config {
* @max_mcast_filters: Number of perfect multicast addresses supported * @max_mcast_filters: Number of perfect multicast addresses supported
* @min_frame_size: Minimum size of frames to be sent * @min_frame_size: Minimum size of frames to be sent
* @max_frame_size: Maximum 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 * @config: LIF config struct with features, mtu, mac, q counts
* *
* @rdma: RDMA identify structure * @rdma: RDMA identify structure
...@@ -467,7 +509,10 @@ union ionic_lif_identity { ...@@ -467,7 +509,10 @@ union ionic_lif_identity {
__le16 rss_ind_tbl_sz; __le16 rss_ind_tbl_sz;
__le32 min_frame_size; __le32 min_frame_size;
__le32 max_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; union ionic_lif_config config;
} __packed eth; } __packed eth;
...@@ -1046,7 +1091,64 @@ enum ionic_eth_hw_features { ...@@ -1046,7 +1091,64 @@ enum ionic_eth_hw_features {
IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16), IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16),
IONIC_ETH_HW_RX_CSUM_GENEVE = BIT(17), IONIC_ETH_HW_RX_CSUM_GENEVE = BIT(17),
IONIC_ETH_HW_TX_CSUM_GENEVE = BIT(18), 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 { ...@@ -1355,6 +1457,20 @@ enum ionic_stats_ctl_cmd {
IONIC_STATS_CTL_RESET = 0, 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 * enum ionic_port_attr - List of device attributes
* @IONIC_PORT_ATTR_STATE: Port state attribute * @IONIC_PORT_ATTR_STATE: Port state attribute
...@@ -1597,6 +1713,7 @@ enum ionic_rss_hash_types { ...@@ -1597,6 +1713,7 @@ enum ionic_rss_hash_types {
* @IONIC_LIF_ATTR_FEATURES: LIF features attribute * @IONIC_LIF_ATTR_FEATURES: LIF features attribute
* @IONIC_LIF_ATTR_RSS: LIF RSS attribute * @IONIC_LIF_ATTR_RSS: LIF RSS attribute
* @IONIC_LIF_ATTR_STATS_CTRL: LIF statistics control attribute * @IONIC_LIF_ATTR_STATS_CTRL: LIF statistics control attribute
* @IONIC_LIF_ATTR_TXSTAMP: LIF TX timestamping mode
*/ */
enum ionic_lif_attr { enum ionic_lif_attr {
IONIC_LIF_ATTR_STATE = 0, IONIC_LIF_ATTR_STATE = 0,
...@@ -1606,6 +1723,7 @@ enum ionic_lif_attr { ...@@ -1606,6 +1723,7 @@ enum ionic_lif_attr {
IONIC_LIF_ATTR_FEATURES = 4, IONIC_LIF_ATTR_FEATURES = 4,
IONIC_LIF_ATTR_RSS = 5, IONIC_LIF_ATTR_RSS = 5,
IONIC_LIF_ATTR_STATS_CTRL = 6, IONIC_LIF_ATTR_STATS_CTRL = 6,
IONIC_LIF_ATTR_TXSTAMP = 7,
}; };
/** /**
...@@ -1623,6 +1741,7 @@ enum ionic_lif_attr { ...@@ -1623,6 +1741,7 @@ enum ionic_lif_attr {
* @key: The hash secret key * @key: The hash secret key
* @addr: Address for the indirection table shared memory * @addr: Address for the indirection table shared memory
* @stats_ctl: stats control commands (enum ionic_stats_ctl_cmd) * @stats_ctl: stats control commands (enum ionic_stats_ctl_cmd)
* @txstamp: TX Timestamping Mode (enum ionic_txstamp_mode)
*/ */
struct ionic_lif_setattr_cmd { struct ionic_lif_setattr_cmd {
u8 opcode; u8 opcode;
...@@ -1641,6 +1760,7 @@ struct ionic_lif_setattr_cmd { ...@@ -1641,6 +1760,7 @@ struct ionic_lif_setattr_cmd {
__le64 addr; __le64 addr;
} rss; } rss;
u8 stats_ctl; u8 stats_ctl;
__le16 txstamp_mode;
u8 rsvd[60]; u8 rsvd[60];
} __packed; } __packed;
}; };
...@@ -1685,6 +1805,7 @@ struct ionic_lif_getattr_cmd { ...@@ -1685,6 +1805,7 @@ struct ionic_lif_getattr_cmd {
* @mtu: Mtu * @mtu: Mtu
* @mac: Station mac * @mac: Station mac
* @features: Features (enum ionic_eth_hw_features) * @features: Features (enum ionic_eth_hw_features)
* @txstamp: TX Timestamping Mode (enum ionic_txstamp_mode)
* @color: Color bit * @color: Color bit
*/ */
struct ionic_lif_getattr_comp { struct ionic_lif_getattr_comp {
...@@ -1696,11 +1817,35 @@ struct ionic_lif_getattr_comp { ...@@ -1696,11 +1817,35 @@ struct ionic_lif_getattr_comp {
__le32 mtu; __le32 mtu;
u8 mac[6]; u8 mac[6];
__le64 features; __le64 features;
__le16 txstamp_mode;
u8 rsvd2[11]; u8 rsvd2[11];
} __packed; } __packed;
u8 color; 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 { enum ionic_rx_mode {
IONIC_RX_MODE_F_UNICAST = BIT(0), IONIC_RX_MODE_F_UNICAST = BIT(0),
IONIC_RX_MODE_F_MULTICAST = BIT(1), IONIC_RX_MODE_F_MULTICAST = BIT(1),
...@@ -1733,9 +1878,10 @@ struct ionic_rx_mode_set_cmd { ...@@ -1733,9 +1878,10 @@ struct ionic_rx_mode_set_cmd {
typedef struct ionic_admin_comp ionic_rx_mode_set_comp; typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
enum ionic_rx_filter_match_type { enum ionic_rx_filter_match_type {
IONIC_RX_FILTER_MATCH_VLAN = 0, IONIC_RX_FILTER_MATCH_VLAN = 0x0,
IONIC_RX_FILTER_MATCH_MAC, IONIC_RX_FILTER_MATCH_MAC = 0x1,
IONIC_RX_FILTER_MATCH_MAC_VLAN, IONIC_RX_FILTER_MATCH_MAC_VLAN = 0x2,
IONIC_RX_FILTER_STEER_PKTCLASS = 0x10,
}; };
/** /**
...@@ -1752,6 +1898,7 @@ enum ionic_rx_filter_match_type { ...@@ -1752,6 +1898,7 @@ enum ionic_rx_filter_match_type {
* @mac_vlan: MACVLAN filter * @mac_vlan: MACVLAN filter
* @vlan: VLAN ID * @vlan: VLAN ID
* @addr: MAC address (network-byte order) * @addr: MAC address (network-byte order)
* @pkt_class: Packet classification filter
*/ */
struct ionic_rx_filter_add_cmd { struct ionic_rx_filter_add_cmd {
u8 opcode; u8 opcode;
...@@ -1770,8 +1917,9 @@ struct ionic_rx_filter_add_cmd { ...@@ -1770,8 +1917,9 @@ struct ionic_rx_filter_add_cmd {
__le16 vlan; __le16 vlan;
u8 addr[6]; u8 addr[6];
} mac_vlan; } mac_vlan;
__le64 pkt_class;
u8 rsvd[54]; u8 rsvd[54];
}; } __packed;
}; };
/** /**
...@@ -2771,6 +2919,16 @@ union ionic_dev_cmd_comp { ...@@ -2771,6 +2919,16 @@ union ionic_dev_cmd_comp {
struct ionic_fw_control_comp fw_control; 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) * union ionic_dev_info_regs - Device info register format (read-only)
* @signature: Signature value of 0x44455649 ('DEVI') * @signature: Signature value of 0x44455649 ('DEVI')
...@@ -2781,6 +2939,7 @@ union ionic_dev_cmd_comp { ...@@ -2781,6 +2939,7 @@ union ionic_dev_cmd_comp {
* @fw_heartbeat: Firmware heartbeat counter * @fw_heartbeat: Firmware heartbeat counter
* @serial_num: Serial number * @serial_num: Serial number
* @fw_version: Firmware version * @fw_version: Firmware version
* @hwstamp_regs: Hardware current timestamp registers
*/ */
union ionic_dev_info_regs { union ionic_dev_info_regs {
#define IONIC_DEVINFO_FWVERS_BUFLEN 32 #define IONIC_DEVINFO_FWVERS_BUFLEN 32
...@@ -2795,6 +2954,8 @@ union ionic_dev_info_regs { ...@@ -2795,6 +2954,8 @@ union ionic_dev_info_regs {
u32 fw_heartbeat; u32 fw_heartbeat;
char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN]; char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN]; char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
u8 rsvd_pad1024[948];
struct ionic_hwstamp_regs hwstamp;
}; };
u32 words[512]; u32 words[512];
}; };
...@@ -2842,6 +3003,7 @@ union ionic_adminq_cmd { ...@@ -2842,6 +3003,7 @@ union ionic_adminq_cmd {
struct ionic_q_control_cmd q_control; struct ionic_q_control_cmd q_control;
struct ionic_lif_setattr_cmd lif_setattr; struct ionic_lif_setattr_cmd lif_setattr;
struct ionic_lif_getattr_cmd lif_getattr; 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_mode_set_cmd rx_mode_set;
struct ionic_rx_filter_add_cmd rx_filter_add; struct ionic_rx_filter_add_cmd rx_filter_add;
struct ionic_rx_filter_del_cmd rx_filter_del; struct ionic_rx_filter_del_cmd rx_filter_del;
...@@ -2858,6 +3020,7 @@ union ionic_adminq_comp { ...@@ -2858,6 +3020,7 @@ union ionic_adminq_comp {
struct ionic_q_init_comp q_init; struct ionic_q_init_comp q_init;
struct ionic_lif_setattr_comp lif_setattr; struct ionic_lif_setattr_comp lif_setattr;
struct ionic_lif_getattr_comp lif_getattr; struct ionic_lif_getattr_comp lif_getattr;
struct ionic_admin_comp lif_setphc;
struct ionic_rx_filter_add_comp rx_filter_add; struct ionic_rx_filter_add_comp rx_filter_add;
struct ionic_fw_control_comp fw_control; struct ionic_fw_control_comp fw_control;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment