Commit 21c3391a authored by Devesh Sharma's avatar Devesh Sharma Committed by Roland Dreier
Browse files

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: default avatarDevesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 2df84fa8
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ struct ocrdma_dev {
	int id;
	struct ocrdma_mr *stag_arr[OCRDMA_MAX_STAG];
	u16 pvid;
	u32 asic_id;
};

struct ocrdma_cq {
@@ -443,4 +444,16 @@ static inline int ocrdma_get_eq_table_index(struct ocrdma_dev *dev,
	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
+3 −3
Original line number Diff line number Diff line
@@ -1037,7 +1037,7 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,
	attr->max_inline_data =
	    attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) +
			      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_page_size = OCRDMA_MIN_Q_PAGE_SIZE;
		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,
		       __func__, dev->id, dev->attr.max_cqe, entries);
		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;

	if (dpp_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. */
	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)
			cmd->cmd.pgsz_pgcnt |= OCRDMA_CREATE_CQ_DPP <<
				OCRDMA_CREATE_CQ_TYPE_SHIFT;
+1 −1
Original line number Diff line number Diff line
@@ -286,7 +286,7 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)

	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 |=
		     OCRDMA_UVERBS(CREATE_SRQ) |
		     OCRDMA_UVERBS(MODIFY_SRQ) |
+15 −2
Original line number Diff line number Diff line
@@ -30,8 +30,16 @@

#define Bit(_b) (1 << (_b))

#define OCRDMA_GEN1_FAMILY	0xB
#define OCRDMA_GEN2_FAMILY	0x0F
enum {
	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
enum {
@@ -141,6 +149,11 @@ enum {
#define OCRDMA_MIN_Q_PAGE_SIZE (4096)
#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
# 1: 8K Bytes
+3 −3
Original line number Diff line number Diff line
@@ -267,7 +267,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,

	if (udata && uctx) {
		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->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0;
	}
@@ -1161,7 +1161,7 @@ err:
static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp,
			     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 +
			(pd->id * dev->nic_info.db_page_size) +
			OCRDMA_DB_GEN2_SQ_OFFSET;
@@ -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);
	uresp.db_page_size = dev->nic_info.db_page_size;
	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_shift = 24;
	} else {