提交 21c3391a 编写于 作者: D Devesh Sharma 提交者: Roland Dreier

RDMA/ocrdma: Read ASIC_ID register to select asic_gen

ocrdma driver selects execution path based on sli_family and asic
generation number.  This introduces code to read the asic gen number
from pci register instead of obtaining it from the Emulex NIC driver.
Signed-off-by: NDevesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: NSelvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: NRoland Dreier <roland@purestorage.com>
上级 2df84fa8
...@@ -197,6 +197,7 @@ struct ocrdma_dev { ...@@ -197,6 +197,7 @@ struct ocrdma_dev {
int id; int id;
struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG]; struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG];
u16 pvid; u16 pvid;
u32 asic_id;
}; };
struct ocrdma_cq { struct ocrdma_cq {
...@@ -443,4 +444,16 @@ static inline int ocrdma_get_eq_table_index(struct ocrdma_dev *dev, ...@@ -443,4 +444,16 @@ static inline int ocrdma_get_eq_table_index(struct ocrdma_dev *dev,
return -EINVAL; return -EINVAL;
} }
static inline u8 ocrdma_get_asic_type(struct ocrdma_dev *dev)
{
if (dev->nic_info.dev_family == 0xF && !dev->asic_id) {
pci_read_config_dword(
dev->nic_info.pdev,
OCRDMA_SLI_ASIC_ID_OFFSET, &dev->asic_id);
}
return (dev->asic_id & OCRDMA_SLI_ASIC_GEN_NUM_MASK) >>
OCRDMA_SLI_ASIC_GEN_NUM_SHIFT;
}
#endif #endif
...@@ -1037,7 +1037,7 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, ...@@ -1037,7 +1037,7 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,
attr->max_inline_data = attr->max_inline_data =
attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) +
sizeof(struct ocrdma_sge)); sizeof(struct ocrdma_sge));
if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
attr->ird = 1; attr->ird = 1;
attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE;
attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES;
...@@ -1379,7 +1379,7 @@ int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq, ...@@ -1379,7 +1379,7 @@ int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq,
__func__, dev->id, dev->attr.max_cqe, entries); __func__, dev->id, dev->attr.max_cqe, entries);
return -EINVAL; return -EINVAL;
} }
if (dpp_cq && (dev->nic_info.dev_family != OCRDMA_GEN2_FAMILY)) if (dpp_cq && (ocrdma_get_asic_type(dev) != OCRDMA_ASIC_GEN_SKH_R))
return -EINVAL; return -EINVAL;
if (dpp_cq) { if (dpp_cq) {
...@@ -1439,7 +1439,7 @@ int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq, ...@@ -1439,7 +1439,7 @@ int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq,
} }
/* shared eq between all the consumer cqs. */ /* shared eq between all the consumer cqs. */
cmd->cmd.eqn = cq->eqn; cmd->cmd.eqn = cq->eqn;
if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
if (dpp_cq) if (dpp_cq)
cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP << cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP <<
OCRDMA_CREATE_CQ_TYPE_SHIFT; OCRDMA_CREATE_CQ_TYPE_SHIFT;
......
...@@ -286,7 +286,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev) ...@@ -286,7 +286,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)
dev->ibdev.process_mad = ocrdma_process_mad; dev->ibdev.process_mad = ocrdma_process_mad;
if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
dev->ibdev.uverbs_cmd_mask |= dev->ibdev.uverbs_cmd_mask |=
OCRDMA_UVERBS(CREATE_SRQ) | OCRDMA_UVERBS(CREATE_SRQ) |
OCRDMA_UVERBS(MODIFY_SRQ) | OCRDMA_UVERBS(MODIFY_SRQ) |
......
...@@ -30,8 +30,16 @@ ...@@ -30,8 +30,16 @@
#define Bit(_b) (1 << (_b)) #define Bit(_b) (1 << (_b))
#define OCRDMA_GEN1_FAMILY 0xB enum {
#define OCRDMA_GEN2_FAMILY 0x0F OCRDMA_ASIC_GEN_SKH_R = 0x04,
OCRDMA_ASIC_GEN_LANCER = 0x0B
};
enum {
OCRDMA_ASIC_REV_A0 = 0x00,
OCRDMA_ASIC_REV_B0 = 0x10,
OCRDMA_ASIC_REV_C0 = 0x20
};
#define OCRDMA_SUBSYS_ROCE 10 #define OCRDMA_SUBSYS_ROCE 10
enum { enum {
...@@ -141,6 +149,11 @@ enum { ...@@ -141,6 +149,11 @@ enum {
#define OCRDMA_MIN_Q_PAGE_SIZE (4096) #define OCRDMA_MIN_Q_PAGE_SIZE (4096)
#define OCRDMA_MAX_Q_PAGES (8) #define OCRDMA_MAX_Q_PAGES (8)
#define OCRDMA_SLI_ASIC_ID_OFFSET 0x9C
#define OCRDMA_SLI_ASIC_REV_MASK 0x000000FF
#define OCRDMA_SLI_ASIC_GEN_NUM_MASK 0x0000FF00
#define OCRDMA_SLI_ASIC_GEN_NUM_SHIFT 0x08
/* /*
# 0: 4K Bytes # 0: 4K Bytes
# 1: 8K Bytes # 1: 8K Bytes
......
...@@ -267,7 +267,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev, ...@@ -267,7 +267,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,
if (udata && uctx) { if (udata && uctx) {
pd->dpp_enabled = pd->dpp_enabled =
dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY; ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
pd->num_dpp_qp = pd->num_dpp_qp =
pd->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0; pd->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0;
} }
...@@ -1161,7 +1161,7 @@ static int ocrdma_copy_qp_uresp(struct ocrdma_qp *qp, ...@@ -1161,7 +1161,7 @@ static int ocrdma_copy_qp_uresp(struct ocrdma_qp *qp,
static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp, static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp,
struct ocrdma_pd *pd) struct ocrdma_pd *pd)
{ {
if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
qp->sq_db = dev->nic_info.db + qp->sq_db = dev->nic_info.db +
(pd->id * dev->nic_info.db_page_size) + (pd->id * dev->nic_info.db_page_size) +
OCRDMA_DB_GEN2_SQ_OFFSET; OCRDMA_DB_GEN2_SQ_OFFSET;
...@@ -1688,7 +1688,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq, ...@@ -1688,7 +1688,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq,
(srq->pd->id * dev->nic_info.db_page_size); (srq->pd->id * dev->nic_info.db_page_size);
uresp.db_page_size = dev->nic_info.db_page_size; uresp.db_page_size = dev->nic_info.db_page_size;
uresp.num_rqe_allocated = srq->rq.max_cnt; uresp.num_rqe_allocated = srq->rq.max_cnt;
if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET; uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;
uresp.db_shift = 24; uresp.db_shift = 24;
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册