aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevesh Sharma <devesh.sharma@emulex.com>2014-02-04 01:26:56 -0500
committerRoland Dreier <roland@purestorage.com>2014-04-03 11:29:40 -0400
commit21c3391a9adfaddd00481a1d03bf30fc1304e292 (patch)
tree05b9a15f8944b21d79cc32b9879dd272c8ae51e8
parent2df84fa87f4d00299031b1335748c54176edfe87 (diff)
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: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma.h13
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c6
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_main.c2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h17
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c6
5 files changed, 35 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h
index 1b51e67a26d7..24fe248fb35a 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma.h
@@ -197,6 +197,7 @@ struct ocrdma_dev {
197 int id; 197 int id;
198 struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG]; 198 struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG];
199 u16 pvid; 199 u16 pvid;
200 u32 asic_id;
200}; 201};
201 202
202struct ocrdma_cq { 203struct ocrdma_cq {
@@ -443,4 +444,16 @@ static inline int ocrdma_get_eq_table_index(struct ocrdma_dev *dev,
443 return -EINVAL; 444 return -EINVAL;
444} 445}
445 446
447static inline u8 ocrdma_get_asic_type(struct ocrdma_dev *dev)
448{
449 if (dev->nic_info.dev_family == 0xF && !dev->asic_id) {
450 pci_read_config_dword(
451 dev->nic_info.pdev,
452 OCRDMA_SLI_ASIC_ID_OFFSET, &dev->asic_id);
453 }
454
455 return (dev->asic_id & OCRDMA_SLI_ASIC_GEN_NUM_MASK) >>
456 OCRDMA_SLI_ASIC_GEN_NUM_SHIFT;
457}
458
446#endif 459#endif
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index e3c75e01feb9..ec310d258553 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -1037,7 +1037,7 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,
1037 attr->max_inline_data = 1037 attr->max_inline_data =
1038 attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + 1038 attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) +
1039 sizeof(struct ocrdma_sge)); 1039 sizeof(struct ocrdma_sge));
1040 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 1040 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
1041 attr->ird = 1; 1041 attr->ird = 1;
1042 attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; 1042 attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE;
1043 attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; 1043 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 __func__, dev->id, dev->attr.max_cqe, entries); 1379 __func__, dev->id, dev->attr.max_cqe, entries);
1380 return -EINVAL; 1380 return -EINVAL;
1381 } 1381 }
1382 if (dpp_cq && (dev->nic_info.dev_family != OCRDMA_GEN2_FAMILY)) 1382 if (dpp_cq && (ocrdma_get_asic_type(dev) != OCRDMA_ASIC_GEN_SKH_R))
1383 return -EINVAL; 1383 return -EINVAL;
1384 1384
1385 if (dpp_cq) { 1385 if (dpp_cq) {
@@ -1439,7 +1439,7 @@ int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq,
1439 } 1439 }
1440 /* shared eq between all the consumer cqs. */ 1440 /* shared eq between all the consumer cqs. */
1441 cmd->cmd.eqn = cq->eqn; 1441 cmd->cmd.eqn = cq->eqn;
1442 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 1442 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
1443 if (dpp_cq) 1443 if (dpp_cq)
1444 cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP << 1444 cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP <<
1445 OCRDMA_CREATE_CQ_TYPE_SHIFT; 1445 OCRDMA_CREATE_CQ_TYPE_SHIFT;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c
index 1a8a945efa60..b9e147816703 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c
@@ -286,7 +286,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)
286 286
287 dev->ibdev.process_mad = ocrdma_process_mad; 287 dev->ibdev.process_mad = ocrdma_process_mad;
288 288
289 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 289 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
290 dev->ibdev.uverbs_cmd_mask |= 290 dev->ibdev.uverbs_cmd_mask |=
291 OCRDMA_UVERBS(CREATE_SRQ) | 291 OCRDMA_UVERBS(CREATE_SRQ) |
292 OCRDMA_UVERBS(MODIFY_SRQ) | 292 OCRDMA_UVERBS(MODIFY_SRQ) |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
index e71685a7ffae..de4ebfc4e0e2 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
@@ -30,8 +30,16 @@
30 30
31#define Bit(_b) (1 << (_b)) 31#define Bit(_b) (1 << (_b))
32 32
33#define OCRDMA_GEN1_FAMILY 0xB 33enum {
34#define OCRDMA_GEN2_FAMILY 0x0F 34 OCRDMA_ASIC_GEN_SKH_R = 0x04,
35 OCRDMA_ASIC_GEN_LANCER = 0x0B
36};
37
38enum {
39 OCRDMA_ASIC_REV_A0 = 0x00,
40 OCRDMA_ASIC_REV_B0 = 0x10,
41 OCRDMA_ASIC_REV_C0 = 0x20
42};
35 43
36#define OCRDMA_SUBSYS_ROCE 10 44#define OCRDMA_SUBSYS_ROCE 10
37enum { 45enum {
@@ -141,6 +149,11 @@ enum {
141#define OCRDMA_MIN_Q_PAGE_SIZE (4096) 149#define OCRDMA_MIN_Q_PAGE_SIZE (4096)
142#define OCRDMA_MAX_Q_PAGES (8) 150#define OCRDMA_MAX_Q_PAGES (8)
143 151
152#define OCRDMA_SLI_ASIC_ID_OFFSET 0x9C
153#define OCRDMA_SLI_ASIC_REV_MASK 0x000000FF
154#define OCRDMA_SLI_ASIC_GEN_NUM_MASK 0x0000FF00
155#define OCRDMA_SLI_ASIC_GEN_NUM_SHIFT 0x08
156
144/* 157/*
145# 0: 4K Bytes 158# 0: 4K Bytes
146# 1: 8K Bytes 159# 1: 8K Bytes
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index be75d2b1ea9f..c5b40583f1ae 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -267,7 +267,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,
267 267
268 if (udata && uctx) { 268 if (udata && uctx) {
269 pd->dpp_enabled = 269 pd->dpp_enabled =
270 dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY; 270 ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
271 pd->num_dpp_qp = 271 pd->num_dpp_qp =
272 pd->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0; 272 pd->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0;
273 } 273 }
@@ -1161,7 +1161,7 @@ err:
1161static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp, 1161static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp,
1162 struct ocrdma_pd *pd) 1162 struct ocrdma_pd *pd)
1163{ 1163{
1164 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 1164 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
1165 qp->sq_db = dev->nic_info.db + 1165 qp->sq_db = dev->nic_info.db +
1166 (pd->id * dev->nic_info.db_page_size) + 1166 (pd->id * dev->nic_info.db_page_size) +
1167 OCRDMA_DB_GEN2_SQ_OFFSET; 1167 OCRDMA_DB_GEN2_SQ_OFFSET;
@@ -1688,7 +1688,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq,
1688 (srq->pd->id * dev->nic_info.db_page_size); 1688 (srq->pd->id * dev->nic_info.db_page_size);
1689 uresp.db_page_size = dev->nic_info.db_page_size; 1689 uresp.db_page_size = dev->nic_info.db_page_size;
1690 uresp.num_rqe_allocated = srq->rq.max_cnt; 1690 uresp.num_rqe_allocated = srq->rq.max_cnt;
1691 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 1691 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {
1692 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET; 1692 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;
1693 uresp.db_shift = 24; 1693 uresp.db_shift = 24;
1694 } else { 1694 } else {