root/drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_rx.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Marvell Octeon EP (EndPoint) VF Ethernet Driver
 *
 * Copyright (C) 2020 Marvell.
 *
 */

#ifndef _OCTEP_VF_RX_H_
#define _OCTEP_VF_RX_H_

/* struct octep_vf_oq_desc_hw - Octeon Hardware OQ descriptor format.
 *
 * The descriptor ring is made of descriptors which have 2 64-bit values:
 *
 *   @buffer_ptr: DMA address of the skb->data
 *   @info_ptr:  DMA address of host memory, used to update pkt count by hw.
 *               This is currently unused to save pci writes.
 */
struct octep_vf_oq_desc_hw {
        dma_addr_t buffer_ptr;
        u64 info_ptr;
};

static_assert(sizeof(struct octep_vf_oq_desc_hw) == 16);

#define OCTEP_VF_OQ_DESC_SIZE    (sizeof(struct octep_vf_oq_desc_hw))

/* Rx offload flags */
#define OCTEP_VF_RX_OFFLOAD_VLAN_STRIP          BIT(0)
#define OCTEP_VF_RX_OFFLOAD_IPV4_CKSUM          BIT(1)
#define OCTEP_VF_RX_OFFLOAD_UDP_CKSUM           BIT(2)
#define OCTEP_VF_RX_OFFLOAD_TCP_CKSUM           BIT(3)

#define OCTEP_VF_RX_OFFLOAD_CKSUM               (OCTEP_VF_RX_OFFLOAD_IPV4_CKSUM | \
                                                 OCTEP_VF_RX_OFFLOAD_UDP_CKSUM | \
                                                 OCTEP_VF_RX_OFFLOAD_TCP_CKSUM)

#define OCTEP_VF_RX_IP_CSUM(flags)              ((flags) & \
                                                 (OCTEP_VF_RX_OFFLOAD_IPV4_CKSUM | \
                                                  OCTEP_VF_RX_OFFLOAD_TCP_CKSUM | \
                                                  OCTEP_VF_RX_OFFLOAD_UDP_CKSUM))

/* bit 0 is vlan strip */
#define OCTEP_VF_RX_CSUM_IP_VERIFIED            BIT(1)
#define OCTEP_VF_RX_CSUM_L4_VERIFIED            BIT(2)

#define OCTEP_VF_RX_CSUM_VERIFIED(flags)        ((flags) & \
                                                 (OCTEP_VF_RX_CSUM_L4_VERIFIED | \
                                                  OCTEP_VF_RX_CSUM_IP_VERIFIED))

/* Extended Response Header in packet data received from Hardware.
 * Includes metadata like checksum status.
 * this is valid only if hardware/firmware published support for this.
 * This is at offset 0 of packet data (skb->data).
 */
struct octep_vf_oq_resp_hw_ext {
        /* Reserved. */
        u64 rsvd:48;

        /* rx offload flags */
        u16 rx_ol_flags;
};

static_assert(sizeof(struct octep_vf_oq_resp_hw_ext) == 8);

#define  OCTEP_VF_OQ_RESP_HW_EXT_SIZE   (sizeof(struct octep_vf_oq_resp_hw_ext))

/* Length of Rx packet DMA'ed by Octeon to Host.
 * this is in bigendian; so need to be converted to cpu endian.
 * Octeon writes this at the beginning of Rx buffer (skb->data).
 */
struct octep_vf_oq_resp_hw {
        /* The Length of the packet. */
        __be64 length;
};

static_assert(sizeof(struct octep_vf_oq_resp_hw) == 8);

#define OCTEP_VF_OQ_RESP_HW_SIZE   (sizeof(struct octep_vf_oq_resp_hw))

/* Pointer to data buffer.
 * Driver keeps a pointer to the data buffer that it made available to
 * the Octeon device. Since the descriptor ring keeps physical (bus)
 * addresses, this field is required for the driver to keep track of
 * the virtual address pointers. The fields are operated by
 * OS-dependent routines.
 */
struct octep_vf_rx_buffer {
        struct page *page;

        /* length from rx hardware descriptor after converting to cpu endian */
        u64 len;
};

#define OCTEP_VF_OQ_RECVBUF_SIZE    (sizeof(struct octep_vf_rx_buffer))

/* Output Queue statistics. Each output queue has four stats fields. */
struct octep_vf_oq_stats {
        /* Number of packets received from the Device. */
        u64 packets;

        /* Number of bytes received from the Device. */
        u64 bytes;

        /* Number of times failed to allocate buffers. */
        u64 alloc_failures;
};

#define OCTEP_VF_OQ_STATS_SIZE   (sizeof(struct octep_vf_oq_stats))

/* Hardware interface Rx statistics */
struct octep_vf_iface_rx_stats {
        /* Received packets */
        u64 pkts;

        /* Octets of received packets */
        u64 octets;

        /* Received PAUSE and Control packets */
        u64 pause_pkts;

        /* Received PAUSE and Control octets */
        u64 pause_octets;

        /* Filtered DMAC0 packets */
        u64 dmac0_pkts;

        /* Filtered DMAC0 octets */
        u64 dmac0_octets;

        /* Packets dropped due to RX FIFO full */
        u64 dropped_pkts_fifo_full;

        /* Octets dropped due to RX FIFO full */
        u64 dropped_octets_fifo_full;

        /* Error packets */
        u64 err_pkts;

        /* Filtered DMAC1 packets */
        u64 dmac1_pkts;

        /* Filtered DMAC1 octets */
        u64 dmac1_octets;

        /* NCSI-bound packets dropped */
        u64 ncsi_dropped_pkts;

        /* NCSI-bound octets dropped */
        u64 ncsi_dropped_octets;

        /* Multicast packets received. */
        u64 mcast_pkts;

        /* Broadcast packets received. */
        u64 bcast_pkts;

};

/* The Descriptor Ring Output Queue structure.
 * This structure has all the information required to implement a
 * Octeon OQ.
 */
struct octep_vf_oq {
        u32 q_no;

        struct octep_vf_device *octep_vf_dev;
        struct net_device *netdev;
        struct device *dev;

        struct napi_struct *napi;

        /* The receive buffer list. This list has the virtual addresses
         * of the buffers.
         */
        struct octep_vf_rx_buffer *buff_info;

        /* Pointer to the mapped packet credit register.
         * Host writes number of info/buffer ptrs available to this register
         */
        u8 __iomem *pkts_credit_reg;

        /* Pointer to the mapped packet sent register.
         * Octeon writes the number of packets DMA'ed to host memory
         * in this register.
         */
        u8 __iomem *pkts_sent_reg;

        /* Statistics for this OQ. */
        struct octep_vf_oq_stats *stats;

        /* Packets pending to be processed */
        u32 pkts_pending;
        u32 last_pkt_count;

        /* Index in the ring where the driver should read the next packet */
        u32 host_read_idx;

        /* Number of  descriptors in this ring. */
        u32 max_count;
        u32 ring_size_mask;

        /* The number of descriptors pending refill. */
        u32 refill_count;

        /* Index in the ring where the driver will refill the
         * descriptor's buffer
         */
        u32 host_refill_idx;
        u32 refill_threshold;

        /* The size of each buffer pointed by the buffer pointer. */
        u32 buffer_size;
        u32 max_single_buffer_size;

        /* The 8B aligned descriptor ring starts at this address. */
        struct octep_vf_oq_desc_hw *desc_ring;

        /* DMA mapped address of the OQ descriptor ring. */
        dma_addr_t desc_ring_dma;
};

#define OCTEP_VF_OQ_SIZE   (sizeof(struct octep_vf_oq))
#endif  /* _OCTEP_VF_RX_H_ */