diff options
author | Devesh Sharma <devesh.sharma@emulex.com> | 2014-02-04 01:26:56 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-04-03 11:29:40 -0400 |
commit | 21c3391a9adfaddd00481a1d03bf30fc1304e292 (patch) | |
tree | 05b9a15f8944b21d79cc32b9879dd272c8ae51e8 | |
parent | 2df84fa87f4d00299031b1335748c54176edfe87 (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.h | 13 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_main.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 17 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 6 |
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 | ||
202 | struct ocrdma_cq { | 203 | struct 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 | ||
447 | static 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 | 33 | enum { |
34 | #define OCRDMA_GEN2_FAMILY 0x0F | 34 | OCRDMA_ASIC_GEN_SKH_R = 0x04, |
35 | OCRDMA_ASIC_GEN_LANCER = 0x0B | ||
36 | }; | ||
37 | |||
38 | enum { | ||
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 |
37 | enum { | 45 | enum { |
@@ -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: | |||
1161 | static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp, | 1161 | static 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 { |