]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/dpdk/drivers/net/pfe/pfe_hif.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / drivers / net / pfe / pfe_hif.h
diff --git a/ceph/src/spdk/dpdk/drivers/net/pfe/pfe_hif.h b/ceph/src/spdk/dpdk/drivers/net/pfe/pfe_hif.h
new file mode 100644 (file)
index 0000000..6aaf904
--- /dev/null
@@ -0,0 +1,156 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018-2019 NXP
+ */
+
+#ifndef _PFE_HIF_H_
+#define _PFE_HIF_H_
+
+#define HIF_CLIENT_QUEUES_MAX  16
+#define HIF_RX_PKT_MIN_SIZE RTE_CACHE_LINE_SIZE
+/*
+ * HIF_TX_DESC_NT value should be always greter than 4,
+ * Otherwise HIF_TX_POLL_MARK will become zero.
+ */
+#define HIF_RX_DESC_NT         64
+#define HIF_TX_DESC_NT         2048
+
+#define HIF_FIRST_BUFFER       BIT(0)
+#define HIF_LAST_BUFFER                BIT(1)
+#define HIF_DONT_DMA_MAP       BIT(2)
+#define HIF_DATA_VALID         BIT(3)
+#define HIF_TSO                        BIT(4)
+
+enum {
+       PFE_CL_GEM0 = 0,
+       PFE_CL_GEM1,
+       HIF_CLIENTS_MAX
+};
+
+/*structure to store client queue info */
+struct hif_rx_queue {
+       struct rx_queue_desc *base;
+       u32     size;
+       u32     write_idx;
+};
+
+struct hif_tx_queue {
+       struct tx_queue_desc *base;
+       u32     size;
+       u32     ack_idx;
+};
+
+/*Structure to store the client info */
+struct hif_client {
+       unsigned int    rx_qn;
+       struct hif_rx_queue     rx_q[HIF_CLIENT_QUEUES_MAX];
+       unsigned int    tx_qn;
+       struct hif_tx_queue     tx_q[HIF_CLIENT_QUEUES_MAX];
+};
+
+/*HIF hardware buffer descriptor */
+struct hif_desc {
+       u32 ctrl;
+       u32 status;
+       u32 data;
+       u32 next;
+};
+
+struct __hif_desc {
+       u32 ctrl;
+       u32 status;
+       u32 data;
+};
+
+struct hif_desc_sw {
+       dma_addr_t data;
+       u16 len;
+       u8 client_id;
+       u8 q_no;
+       u16 flags;
+};
+
+struct hif_hdr {
+       u8 client_id;
+       u8 q_num;
+       u16 client_ctrl;
+       u16 client_ctrl1;
+};
+
+struct __hif_hdr {
+       union {
+               struct hif_hdr hdr;
+               u32 word[2];
+       };
+};
+
+struct hif_ipsec_hdr {
+       u16     sa_handle[2];
+} __packed;
+
+struct pfe_parse {
+       unsigned int packet_type;
+       uint16_t hash;
+       uint16_t parse_incomplete;
+       unsigned long long ol_flags;
+};
+
+/*  HIF_CTRL_TX... defines */
+#define HIF_CTRL_TX_CHECKSUM           BIT(2)
+
+/*  HIF_CTRL_RX... defines */
+#define HIF_CTRL_RX_OFFSET_OFST         (24)
+#define HIF_CTRL_RX_CHECKSUMMED                BIT(2)
+#define HIF_CTRL_RX_CONTINUED          BIT(1)
+
+struct pfe_hif {
+       /* To store registered clients in hif layer */
+       struct hif_client client[HIF_CLIENTS_MAX];
+       struct hif_shm *shm;
+
+       void    *descr_baseaddr_v;
+       unsigned long   descr_baseaddr_p;
+
+       struct hif_desc *rx_base;
+       u32     rx_ring_size;
+       u32     rxtoclean_index;
+       void    *rx_buf_addr[HIF_RX_DESC_NT];
+       void    *rx_buf_vaddr[HIF_RX_DESC_NT];
+       int     rx_buf_len[HIF_RX_DESC_NT];
+       unsigned int qno;
+       unsigned int client_id;
+       unsigned int client_ctrl;
+       unsigned int started;
+       unsigned int setuped;
+
+       struct hif_desc *tx_base;
+       u32     tx_ring_size;
+       u32     txtosend;
+       u32     txtoclean;
+       u32     txavail;
+       u32     txtoflush;
+       struct hif_desc_sw tx_sw_queue[HIF_TX_DESC_NT];
+       int32_t epoll_fd; /**< File descriptor created for interrupt polling */
+
+/* tx_lock synchronizes hif packet tx as well as pfe_hif structure access */
+       rte_spinlock_t tx_lock;
+/* lock synchronizes hif rx queue processing */
+       rte_spinlock_t lock;
+       struct rte_device *dev;
+};
+
+void hif_xmit_pkt(struct pfe_hif *hif, unsigned int client_id, unsigned int
+                       q_no, void *data, u32 len, unsigned int flags);
+void hif_process_client_req(struct pfe_hif *hif, int req, int data1, int
+                               data2);
+int pfe_hif_init(struct pfe *pfe);
+void pfe_hif_exit(struct pfe *pfe);
+void pfe_hif_rx_idle(struct pfe_hif *hif);
+int pfe_hif_rx_process(struct pfe *pfe, int budget);
+int pfe_hif_init_buffers(struct pfe_hif *hif);
+void pfe_tx_do_cleanup(struct pfe *pfe);
+
+#define __memcpy8(dst, src)            memcpy(dst, src, 8)
+#define __memcpy12(dst, src)           memcpy(dst, src, 12)
+#define __memcpy(dst, src, len)                memcpy(dst, src, len)
+
+#endif /* _PFE_HIF_H_ */