cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

octep_tx.h (6699B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/* Marvell Octeon EP (EndPoint) Ethernet Driver
      3 *
      4 * Copyright (C) 2020 Marvell.
      5 *
      6 */
      7
      8#ifndef _OCTEP_TX_H_
      9#define _OCTEP_TX_H_
     10
     11#define IQ_SEND_OK          0
     12#define IQ_SEND_STOP        1
     13#define IQ_SEND_FAILED     -1
     14
     15#define TX_BUFTYPE_NONE          0
     16#define TX_BUFTYPE_NET           1
     17#define TX_BUFTYPE_NET_SG        2
     18#define NUM_TX_BUFTYPES          3
     19
     20/* Hardware format for Scatter/Gather list */
     21struct octep_tx_sglist_desc {
     22	u16 len[4];
     23	dma_addr_t dma_ptr[4];
     24};
     25
     26/* Each Scatter/Gather entry sent to hardwar hold four pointers.
     27 * So, number of entries required is (MAX_SKB_FRAGS + 1)/4, where '+1'
     28 * is for main skb which also goes as a gather buffer to Octeon hardware.
     29 * To allocate sufficient SGLIST entries for a packet with max fragments,
     30 * align by adding 3 before calcuating max SGLIST entries per packet.
     31 */
     32#define OCTEP_SGLIST_ENTRIES_PER_PKT ((MAX_SKB_FRAGS + 1 + 3) / 4)
     33#define OCTEP_SGLIST_SIZE_PER_PKT \
     34	(OCTEP_SGLIST_ENTRIES_PER_PKT * sizeof(struct octep_tx_sglist_desc))
     35
     36struct octep_tx_buffer {
     37	struct sk_buff *skb;
     38	dma_addr_t dma;
     39	struct octep_tx_sglist_desc *sglist;
     40	dma_addr_t sglist_dma;
     41	u8 gather;
     42};
     43
     44#define OCTEP_IQ_TXBUFF_INFO_SIZE (sizeof(struct octep_tx_buffer))
     45
     46/* Hardware interface Tx statistics */
     47struct octep_iface_tx_stats {
     48	/* Packets dropped due to excessive collisions */
     49	u64 xscol;
     50
     51	/* Packets dropped due to excessive deferral */
     52	u64 xsdef;
     53
     54	/* Packets sent that experienced multiple collisions before successful
     55	 * transmission
     56	 */
     57	u64 mcol;
     58
     59	/* Packets sent that experienced a single collision before successful
     60	 * transmission
     61	 */
     62	u64 scol;
     63
     64	/* Total octets sent on the interface */
     65	u64 octs;
     66
     67	/* Total frames sent on the interface */
     68	u64 pkts;
     69
     70	/* Packets sent with an octet count < 64 */
     71	u64 hist_lt64;
     72
     73	/* Packets sent with an octet count == 64 */
     74	u64 hist_eq64;
     75
     76	/* Packets sent with an octet count of 65–127 */
     77	u64 hist_65to127;
     78
     79	/* Packets sent with an octet count of 128–255 */
     80	u64 hist_128to255;
     81
     82	/* Packets sent with an octet count of 256–511 */
     83	u64 hist_256to511;
     84
     85	/* Packets sent with an octet count of 512–1023 */
     86	u64 hist_512to1023;
     87
     88	/* Packets sent with an octet count of 1024-1518 */
     89	u64 hist_1024to1518;
     90
     91	/* Packets sent with an octet count of > 1518 */
     92	u64 hist_gt1518;
     93
     94	/* Packets sent to a broadcast DMAC */
     95	u64 bcst;
     96
     97	/* Packets sent to the multicast DMAC */
     98	u64 mcst;
     99
    100	/* Packets sent that experienced a transmit underflow and were
    101	 * truncated
    102	 */
    103	u64 undflw;
    104
    105	/* Control/PAUSE packets sent */
    106	u64 ctl;
    107};
    108
    109/* Input Queue statistics. Each input queue has four stats fields. */
    110struct octep_iq_stats {
    111	/* Instructions posted to this queue. */
    112	u64 instr_posted;
    113
    114	/* Instructions copied by hardware for processing. */
    115	u64 instr_completed;
    116
    117	/* Instructions that could not be processed. */
    118	u64 instr_dropped;
    119
    120	/* Bytes sent through this queue. */
    121	u64 bytes_sent;
    122
    123	/* Gather entries sent through this queue. */
    124	u64 sgentry_sent;
    125
    126	/* Number of transmit failures due to TX_BUSY */
    127	u64 tx_busy;
    128
    129	/* Number of times the queue is restarted */
    130	u64 restart_cnt;
    131};
    132
    133/* The instruction (input) queue.
    134 * The input queue is used to post raw (instruction) mode data or packet
    135 * data to Octeon device from the host. Each input queue (up to 4) for
    136 * a Octeon device has one such structure to represent it.
    137 */
    138struct octep_iq {
    139	u32 q_no;
    140
    141	struct octep_device *octep_dev;
    142	struct net_device *netdev;
    143	struct device *dev;
    144	struct netdev_queue *netdev_q;
    145
    146	/* Index in input ring where driver should write the next packet */
    147	u16 host_write_index;
    148
    149	/* Index in input ring where Octeon is expected to read next packet */
    150	u16 octep_read_index;
    151
    152	/* This index aids in finding the window in the queue where Octeon
    153	 * has read the commands.
    154	 */
    155	u16 flush_index;
    156
    157	/* Statistics for this input queue. */
    158	struct octep_iq_stats stats;
    159
    160	/* This field keeps track of the instructions pending in this queue. */
    161	atomic_t instr_pending;
    162
    163	/* Pointer to the Virtual Base addr of the input ring. */
    164	struct octep_tx_desc_hw *desc_ring;
    165
    166	/* DMA mapped base address of the input descriptor ring. */
    167	dma_addr_t desc_ring_dma;
    168
    169	/* Info of Tx buffers pending completion. */
    170	struct octep_tx_buffer *buff_info;
    171
    172	/* Base pointer to Scatter/Gather lists for all ring descriptors. */
    173	struct octep_tx_sglist_desc *sglist;
    174
    175	/* DMA mapped addr of Scatter Gather Lists */
    176	dma_addr_t sglist_dma;
    177
    178	/* Octeon doorbell register for the ring. */
    179	u8 __iomem *doorbell_reg;
    180
    181	/* Octeon instruction count register for this ring. */
    182	u8 __iomem *inst_cnt_reg;
    183
    184	/* interrupt level register for this ring */
    185	u8 __iomem *intr_lvl_reg;
    186
    187	/* Maximum no. of instructions in this queue. */
    188	u32 max_count;
    189	u32 ring_size_mask;
    190
    191	u32 pkt_in_done;
    192	u32 pkts_processed;
    193
    194	u32 status;
    195
    196	/* Number of instructions pending to be posted to Octeon. */
    197	u32 fill_cnt;
    198
    199	/* The max. number of instructions that can be held pending by the
    200	 * driver before ringing doorbell.
    201	 */
    202	u32 fill_threshold;
    203};
    204
    205/* Hardware Tx Instruction Header */
    206struct octep_instr_hdr {
    207	/* Data Len */
    208	u64 tlen:16;
    209
    210	/* Reserved */
    211	u64 rsvd:20;
    212
    213	/* PKIND for SDP */
    214	u64 pkind:6;
    215
    216	/* Front Data size */
    217	u64 fsz:6;
    218
    219	/* No. of entries in gather list */
    220	u64 gsz:14;
    221
    222	/* Gather indicator 1=gather*/
    223	u64 gather:1;
    224
    225	/* Reserved3 */
    226	u64 reserved3:1;
    227};
    228
    229/* Hardware Tx completion response header */
    230struct octep_instr_resp_hdr {
    231	/* Request ID  */
    232	u64 rid:16;
    233
    234	/* PCIe port to use for response */
    235	u64 pcie_port:3;
    236
    237	/* Scatter indicator  1=scatter */
    238	u64 scatter:1;
    239
    240	/* Size of Expected result OR no. of entries in scatter list */
    241	u64 rlenssz:14;
    242
    243	/* Desired destination port for result */
    244	u64 dport:6;
    245
    246	/* Opcode Specific parameters */
    247	u64 param:8;
    248
    249	/* Opcode for the return packet  */
    250	u64 opcode:16;
    251};
    252
    253/* 64-byte Tx instruction format.
    254 * Format of instruction for a 64-byte mode input queue.
    255 *
    256 * only first 16-bytes (dptr and ih) are mandatory; rest are optional
    257 * and filled by the driver based on firmware/hardware capabilities.
    258 * These optional headers together called Front Data and its size is
    259 * described by ih->fsz.
    260 */
    261struct octep_tx_desc_hw {
    262	/* Pointer where the input data is available. */
    263	u64 dptr;
    264
    265	/* Instruction Header. */
    266	union {
    267		struct octep_instr_hdr ih;
    268		u64 ih64;
    269	};
    270
    271	/* Pointer where the response for a RAW mode packet will be written
    272	 * by Octeon.
    273	 */
    274	u64 rptr;
    275
    276	/* Input Instruction Response Header. */
    277	struct octep_instr_resp_hdr irh;
    278
    279	/* Additional headers available in a 64-byte instruction. */
    280	u64 exhdr[4];
    281};
    282
    283#define OCTEP_IQ_DESC_SIZE (sizeof(struct octep_tx_desc_hw))
    284#endif /* _OCTEP_TX_H_ */