ee2cf75e1b
For ovs offload scenario, when fw processes the virtio header, there is no need to offset; and for standard card scenarios, fw does not care about the vhd_type parameter, so in order to be compatible with these two scenarios, use 0 offset instead. Signed-off-by: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
270 lines
6.9 KiB
C
270 lines
6.9 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2017 Huawei Technologies Co., Ltd
|
|
*/
|
|
|
|
#ifndef _HINIC_PMD_NICIO_H_
|
|
#define _HINIC_PMD_NICIO_H_
|
|
|
|
#define RX_BUF_LEN_16K 16384
|
|
#define RX_BUF_LEN_1_5K 1536
|
|
|
|
/* vhd type */
|
|
#define HINIC_VHD_TYPE_0B 2
|
|
#define HINIC_VHD_TYPE_10B 1
|
|
#define HINIC_VHD_TYPE_12B 0
|
|
|
|
#define HINIC_Q_CTXT_MAX 42
|
|
|
|
/* performance: ci addr RTE_CACHE_SIZE(64B) alignment */
|
|
#define HINIC_CI_Q_ADDR_SIZE 64
|
|
|
|
#define CI_TABLE_SIZE(num_qps, pg_sz) \
|
|
(ALIGN((num_qps) * HINIC_CI_Q_ADDR_SIZE, pg_sz))
|
|
|
|
#define HINIC_CI_VADDR(base_addr, q_id) \
|
|
((u8 *)(base_addr) + (q_id) * HINIC_CI_Q_ADDR_SIZE)
|
|
|
|
#define HINIC_CI_PADDR(base_paddr, q_id) \
|
|
((base_paddr) + (q_id) * HINIC_CI_Q_ADDR_SIZE)
|
|
|
|
#define Q_CTXT_SIZE 48
|
|
#define TSO_LRO_CTXT_SIZE 240
|
|
|
|
#define SQ_CTXT_OFFSET(max_sqs, max_rqs, q_id) \
|
|
(((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE + \
|
|
(q_id) * Q_CTXT_SIZE)
|
|
|
|
#define RQ_CTXT_OFFSET(max_sqs, max_rqs, q_id) \
|
|
(((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE + \
|
|
(max_sqs) * Q_CTXT_SIZE + (q_id) * Q_CTXT_SIZE)
|
|
|
|
#define SQ_CTXT_SIZE(num_sqs) \
|
|
((u16)(sizeof(struct hinic_qp_ctxt_header) + \
|
|
(num_sqs) * sizeof(struct hinic_sq_ctxt)))
|
|
|
|
#define RQ_CTXT_SIZE(num_rqs) \
|
|
((u16)(sizeof(struct hinic_qp_ctxt_header) + \
|
|
(num_rqs) * sizeof(struct hinic_rq_ctxt)))
|
|
|
|
#define SQ_CTXT_CEQ_ATTR_CEQ_ID_SHIFT 8
|
|
#define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_SHIFT 13
|
|
#define SQ_CTXT_CEQ_ATTR_EN_SHIFT 23
|
|
#define SQ_CTXT_CEQ_ATTR_ARM_SHIFT 31
|
|
|
|
#define SQ_CTXT_CEQ_ATTR_CEQ_ID_MASK 0x1FU
|
|
#define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_MASK 0x3FFU
|
|
#define SQ_CTXT_CEQ_ATTR_EN_MASK 0x1U
|
|
#define SQ_CTXT_CEQ_ATTR_ARM_MASK 0x1U
|
|
|
|
#define SQ_CTXT_CEQ_ATTR_SET(val, member) \
|
|
(((val) & SQ_CTXT_CEQ_ATTR_##member##_MASK) << \
|
|
SQ_CTXT_CEQ_ATTR_##member##_SHIFT)
|
|
|
|
#define SQ_CTXT_CI_IDX_SHIFT 11
|
|
#define SQ_CTXT_CI_OWNER_SHIFT 23
|
|
|
|
#define SQ_CTXT_CI_IDX_MASK 0xFFFU
|
|
#define SQ_CTXT_CI_OWNER_MASK 0x1U
|
|
|
|
#define SQ_CTXT_CI_SET(val, member) \
|
|
(((val) & SQ_CTXT_CI_##member##_MASK) << SQ_CTXT_CI_##member##_SHIFT)
|
|
|
|
#define SQ_CTXT_WQ_PAGE_HI_PFN_SHIFT 0
|
|
#define SQ_CTXT_WQ_PAGE_PI_SHIFT 20
|
|
|
|
#define SQ_CTXT_WQ_PAGE_HI_PFN_MASK 0xFFFFFU
|
|
#define SQ_CTXT_WQ_PAGE_PI_MASK 0xFFFU
|
|
|
|
#define SQ_CTXT_WQ_PAGE_SET(val, member) \
|
|
(((val) & SQ_CTXT_WQ_PAGE_##member##_MASK) << \
|
|
SQ_CTXT_WQ_PAGE_##member##_SHIFT)
|
|
|
|
#define SQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT 0
|
|
#define SQ_CTXT_PREF_CACHE_MAX_SHIFT 14
|
|
#define SQ_CTXT_PREF_CACHE_MIN_SHIFT 25
|
|
|
|
#define SQ_CTXT_PREF_CACHE_THRESHOLD_MASK 0x3FFFU
|
|
#define SQ_CTXT_PREF_CACHE_MAX_MASK 0x7FFU
|
|
#define SQ_CTXT_PREF_CACHE_MIN_MASK 0x7FU
|
|
|
|
#define SQ_CTXT_PREF_WQ_PFN_HI_SHIFT 0
|
|
#define SQ_CTXT_PREF_CI_SHIFT 20
|
|
|
|
#define SQ_CTXT_PREF_WQ_PFN_HI_MASK 0xFFFFFU
|
|
#define SQ_CTXT_PREF_CI_MASK 0xFFFU
|
|
|
|
#define SQ_CTXT_PREF_SET(val, member) \
|
|
(((val) & SQ_CTXT_PREF_##member##_MASK) << \
|
|
SQ_CTXT_PREF_##member##_SHIFT)
|
|
|
|
#define SQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT 0
|
|
|
|
#define SQ_CTXT_WQ_BLOCK_PFN_HI_MASK 0x7FFFFFU
|
|
|
|
#define SQ_CTXT_WQ_BLOCK_SET(val, member) \
|
|
(((val) & SQ_CTXT_WQ_BLOCK_##member##_MASK) << \
|
|
SQ_CTXT_WQ_BLOCK_##member##_SHIFT)
|
|
|
|
#define RQ_CTXT_CEQ_ATTR_EN_SHIFT 0
|
|
#define RQ_CTXT_CEQ_ATTR_OWNER_SHIFT 1
|
|
|
|
#define RQ_CTXT_CEQ_ATTR_EN_MASK 0x1U
|
|
#define RQ_CTXT_CEQ_ATTR_OWNER_MASK 0x1U
|
|
|
|
#define RQ_CTXT_CEQ_ATTR_SET(val, member) \
|
|
(((val) & RQ_CTXT_CEQ_ATTR_##member##_MASK) << \
|
|
RQ_CTXT_CEQ_ATTR_##member##_SHIFT)
|
|
|
|
#define RQ_CTXT_PI_IDX_SHIFT 0
|
|
#define RQ_CTXT_PI_INTR_SHIFT 22
|
|
#define RQ_CTXT_PI_CEQ_ARM_SHIFT 31
|
|
|
|
#define RQ_CTXT_PI_IDX_MASK 0xFFFU
|
|
#define RQ_CTXT_PI_INTR_MASK 0x3FFU
|
|
#define RQ_CTXT_PI_CEQ_ARM_MASK 0x1U
|
|
|
|
#define RQ_CTXT_PI_SET(val, member) \
|
|
(((val) & RQ_CTXT_PI_##member##_MASK) << RQ_CTXT_PI_##member##_SHIFT)
|
|
|
|
#define RQ_CTXT_WQ_PAGE_HI_PFN_SHIFT 0
|
|
#define RQ_CTXT_WQ_PAGE_CI_SHIFT 20
|
|
|
|
#define RQ_CTXT_WQ_PAGE_HI_PFN_MASK 0xFFFFFU
|
|
#define RQ_CTXT_WQ_PAGE_CI_MASK 0xFFFU
|
|
|
|
#define RQ_CTXT_WQ_PAGE_SET(val, member) \
|
|
(((val) & RQ_CTXT_WQ_PAGE_##member##_MASK) << \
|
|
RQ_CTXT_WQ_PAGE_##member##_SHIFT)
|
|
|
|
#define RQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT 0
|
|
#define RQ_CTXT_PREF_CACHE_MAX_SHIFT 14
|
|
#define RQ_CTXT_PREF_CACHE_MIN_SHIFT 25
|
|
|
|
#define RQ_CTXT_PREF_CACHE_THRESHOLD_MASK 0x3FFFU
|
|
#define RQ_CTXT_PREF_CACHE_MAX_MASK 0x7FFU
|
|
#define RQ_CTXT_PREF_CACHE_MIN_MASK 0x7FU
|
|
|
|
#define RQ_CTXT_PREF_WQ_PFN_HI_SHIFT 0
|
|
#define RQ_CTXT_PREF_CI_SHIFT 20
|
|
|
|
#define RQ_CTXT_PREF_WQ_PFN_HI_MASK 0xFFFFFU
|
|
#define RQ_CTXT_PREF_CI_MASK 0xFFFU
|
|
|
|
#define RQ_CTXT_PREF_SET(val, member) \
|
|
(((val) & RQ_CTXT_PREF_##member##_MASK) << \
|
|
RQ_CTXT_PREF_##member##_SHIFT)
|
|
|
|
#define RQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT 0
|
|
|
|
#define RQ_CTXT_WQ_BLOCK_PFN_HI_MASK 0x7FFFFFU
|
|
|
|
#define RQ_CTXT_WQ_BLOCK_SET(val, member) \
|
|
(((val) & RQ_CTXT_WQ_BLOCK_##member##_MASK) << \
|
|
RQ_CTXT_WQ_BLOCK_##member##_SHIFT)
|
|
|
|
#define SIZE_16BYTES(size) (ALIGN((size), 16) >> 4)
|
|
|
|
enum hinic_qp_ctxt_type {
|
|
HINIC_QP_CTXT_TYPE_SQ,
|
|
HINIC_QP_CTXT_TYPE_RQ,
|
|
};
|
|
|
|
struct hinic_sq {
|
|
struct hinic_wq *wq;
|
|
volatile u16 *cons_idx_addr;
|
|
void __iomem *db_addr;
|
|
|
|
u16 q_id;
|
|
u16 owner;
|
|
u16 sq_depth;
|
|
};
|
|
|
|
struct hinic_rq {
|
|
struct hinic_wq *wq;
|
|
volatile u16 *pi_virt_addr;
|
|
dma_addr_t pi_dma_addr;
|
|
|
|
u16 irq_id;
|
|
u16 msix_entry_idx;
|
|
u16 q_id;
|
|
u16 rq_depth;
|
|
};
|
|
|
|
struct hinic_qp {
|
|
struct hinic_sq sq;
|
|
struct hinic_rq rq;
|
|
};
|
|
|
|
struct hinic_event {
|
|
void (*tx_ack)(void *handle, u16 q_id);
|
|
/* status: 0 - link down; 1 - link up */
|
|
void (*link_change)(void *handle, int status);
|
|
};
|
|
|
|
struct hinic_nic_io {
|
|
struct hinic_hwdev *hwdev;
|
|
|
|
u16 global_qpn;
|
|
|
|
struct hinic_wq *sq_wq;
|
|
struct hinic_wq *rq_wq;
|
|
|
|
u16 max_qps;
|
|
u16 num_qps;
|
|
|
|
u16 num_sqs;
|
|
u16 num_rqs;
|
|
|
|
u16 sq_depth;
|
|
u16 rq_depth;
|
|
|
|
u16 rq_buf_size;
|
|
u16 vhd_mode;
|
|
|
|
struct hinic_qp *qps;
|
|
/* sq ci mem base addr of the function */
|
|
void *ci_vaddr_base;
|
|
dma_addr_t ci_dma_base;
|
|
|
|
struct hinic_event event;
|
|
void *event_handle;
|
|
};
|
|
|
|
struct hinic_sq_db {
|
|
u32 db_info;
|
|
};
|
|
|
|
int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev);
|
|
|
|
void hinic_free_qp_ctxts(struct hinic_hwdev *hwdev);
|
|
|
|
int hinic_rx_tx_flush(struct hinic_hwdev *hwdev);
|
|
|
|
int hinic_get_sq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id);
|
|
|
|
u16 hinic_get_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id);
|
|
|
|
void hinic_update_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id,
|
|
int wqebb_cnt);
|
|
|
|
void hinic_return_sq_wqe(struct hinic_hwdev *hwdev, u16 q_id,
|
|
int num_wqebbs, u16 owner);
|
|
|
|
int hinic_get_rq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id);
|
|
|
|
void *hinic_get_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, u16 *pi);
|
|
|
|
void hinic_return_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, int num_wqebbs);
|
|
|
|
u16 hinic_get_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id);
|
|
|
|
void hinic_update_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id, int wqe_cnt);
|
|
|
|
int hinic_init_nicio(struct hinic_hwdev *hwdev);
|
|
|
|
void hinic_deinit_nicio(struct hinic_hwdev *hwdev);
|
|
|
|
int hinic_convert_rx_buf_size(u32 rx_buf_sz, u32 *match_sz);
|
|
|
|
#endif /* _HINIC_PMD_NICIO_H_ */
|