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_RX_H_
9 #define _OCTEP_RX_H_
10 
11 /* struct octep_oq_desc_hw - Octeon Hardware OQ descriptor format.
12  *
13  * The descriptor ring is made of descriptors which have 2 64-bit values:
14  *
15  *   @buffer_ptr: DMA address of the skb->data
16  *   @info_ptr:  DMA address of host memory, used to update pkt count by hw.
17  *               This is currently unused to save pci writes.
18  */
19 struct octep_oq_desc_hw {
20 	dma_addr_t buffer_ptr;
21 	u64 info_ptr;
22 };
23 
24 #define OCTEP_OQ_DESC_SIZE    (sizeof(struct octep_oq_desc_hw))
25 
26 #define OCTEP_CSUM_L4_VERIFIED 0x1
27 #define OCTEP_CSUM_IP_VERIFIED 0x2
28 #define OCTEP_CSUM_VERIFIED (OCTEP_CSUM_L4_VERIFIED | OCTEP_CSUM_IP_VERIFIED)
29 
30 /* Extended Response Header in packet data received from Hardware.
31  * Includes metadata like checksum status.
32  * this is valid only if hardware/firmware published support for this.
33  * This is at offset 0 of packet data (skb->data).
34  */
35 struct octep_oq_resp_hw_ext {
36 	/* Reserved. */
37 	u64 reserved:62;
38 
39 	/* checksum verified. */
40 	u64 csum_verified:2;
41 };
42 
43 #define  OCTEP_OQ_RESP_HW_EXT_SIZE   (sizeof(struct octep_oq_resp_hw_ext))
44 
45 /* Length of Rx packet DMA'ed by Octeon to Host.
46  * this is in bigendian; so need to be converted to cpu endian.
47  * Octeon writes this at the beginning of Rx buffer (skb->data).
48  */
49 struct octep_oq_resp_hw {
50 	/* The Length of the packet. */
51 	__be64 length;
52 };
53 
54 #define OCTEP_OQ_RESP_HW_SIZE   (sizeof(struct octep_oq_resp_hw))
55 
56 /* Pointer to data buffer.
57  * Driver keeps a pointer to the data buffer that it made available to
58  * the Octeon device. Since the descriptor ring keeps physical (bus)
59  * addresses, this field is required for the driver to keep track of
60  * the virtual address pointers. The fields are operated by
61  * OS-dependent routines.
62  */
63 struct octep_rx_buffer {
64 	struct page *page;
65 
66 	/* length from rx hardware descriptor after converting to cpu endian */
67 	u64 len;
68 };
69 
70 #define OCTEP_OQ_RECVBUF_SIZE    (sizeof(struct octep_rx_buffer))
71 
72 /* Output Queue statistics. Each output queue has four stats fields. */
73 struct octep_oq_stats {
74 	/* Number of packets received from the Device. */
75 	u64 packets;
76 
77 	/* Number of bytes received from the Device. */
78 	u64 bytes;
79 
80 	/* Number of times failed to allocate buffers. */
81 	u64 alloc_failures;
82 };
83 
84 #define OCTEP_OQ_STATS_SIZE   (sizeof(struct octep_oq_stats))
85 
86 /* Hardware interface Rx statistics */
87 struct octep_iface_rx_stats {
88 	/* Received packets */
89 	u64 pkts;
90 
91 	/* Octets of received packets */
92 	u64 octets;
93 
94 	/* Received PAUSE and Control packets */
95 	u64 pause_pkts;
96 
97 	/* Received PAUSE and Control octets */
98 	u64 pause_octets;
99 
100 	/* Filtered DMAC0 packets */
101 	u64 dmac0_pkts;
102 
103 	/* Filtered DMAC0 octets */
104 	u64 dmac0_octets;
105 
106 	/* Packets dropped due to RX FIFO full */
107 	u64 dropped_pkts_fifo_full;
108 
109 	/* Octets dropped due to RX FIFO full */
110 	u64 dropped_octets_fifo_full;
111 
112 	/* Error packets */
113 	u64 err_pkts;
114 
115 	/* Filtered DMAC1 packets */
116 	u64 dmac1_pkts;
117 
118 	/* Filtered DMAC1 octets */
119 	u64 dmac1_octets;
120 
121 	/* NCSI-bound packets dropped */
122 	u64 ncsi_dropped_pkts;
123 
124 	/* NCSI-bound octets dropped */
125 	u64 ncsi_dropped_octets;
126 
127 	/* Multicast packets received. */
128 	u64 mcast_pkts;
129 
130 	/* Broadcast packets received. */
131 	u64 bcast_pkts;
132 
133 };
134 
135 /* The Descriptor Ring Output Queue structure.
136  * This structure has all the information required to implement a
137  * Octeon OQ.
138  */
139 struct octep_oq {
140 	u32 q_no;
141 
142 	struct octep_device *octep_dev;
143 	struct net_device *netdev;
144 	struct device *dev;
145 
146 	struct napi_struct *napi;
147 
148 	/* The receive buffer list. This list has the virtual addresses
149 	 * of the buffers.
150 	 */
151 	struct octep_rx_buffer *buff_info;
152 
153 	/* Pointer to the mapped packet credit register.
154 	 * Host writes number of info/buffer ptrs available to this register
155 	 */
156 	u8 __iomem *pkts_credit_reg;
157 
158 	/* Pointer to the mapped packet sent register.
159 	 * Octeon writes the number of packets DMA'ed to host memory
160 	 * in this register.
161 	 */
162 	u8 __iomem *pkts_sent_reg;
163 
164 	/* Statistics for this OQ. */
165 	struct octep_oq_stats stats;
166 
167 	/* Packets pending to be processed */
168 	u32 pkts_pending;
169 	u32 last_pkt_count;
170 
171 	/* Index in the ring where the driver should read the next packet */
172 	u32 host_read_idx;
173 
174 	/* Number of  descriptors in this ring. */
175 	u32 max_count;
176 	u32 ring_size_mask;
177 
178 	/* The number of descriptors pending refill. */
179 	u32 refill_count;
180 
181 	/* Index in the ring where the driver will refill the
182 	 * descriptor's buffer
183 	 */
184 	u32 host_refill_idx;
185 	u32 refill_threshold;
186 
187 	/* The size of each buffer pointed by the buffer pointer. */
188 	u32 buffer_size;
189 	u32 max_single_buffer_size;
190 
191 	/* The 8B aligned descriptor ring starts at this address. */
192 	struct octep_oq_desc_hw *desc_ring;
193 
194 	/* DMA mapped address of the OQ descriptor ring. */
195 	dma_addr_t desc_ring_dma;
196 };
197 
198 #define OCTEP_OQ_SIZE   (sizeof(struct octep_oq))
199 #endif	/* _OCTEP_RX_H_ */
200