aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenry Orosco <henry.orosco@intel.com>2016-11-09 22:30:28 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-05 16:09:35 -0500
commit85a87c90ee90217da1b05a77bbb47ebe31a2f124 (patch)
treebae620dd58d1f85d924cd4c64cca04e0d3188453
parente7f9774af591d346990f1d6dfca0ee9caeb52756 (diff)
i40iw: Query device accounts for internal rsrc
Some resources are consumed internally and not available to the user. After hw is initialized, figure out how many resources are consumed and subtract those numbers from the initial max device capability in i40iw_query_device(). Signed-off-by: Henry Orosco <henry.orosco@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw.h4
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_hw.c2
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_main.c15
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_user.h3
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c8
5 files changed, 26 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h
index 4a0c12bd9caa..dac9a6bcc631 100644
--- a/drivers/infiniband/hw/i40iw/i40iw.h
+++ b/drivers/infiniband/hw/i40iw/i40iw.h
@@ -303,6 +303,10 @@ struct i40iw_device {
303 u32 mr_stagmask; 303 u32 mr_stagmask;
304 u32 mpa_version; 304 u32 mpa_version;
305 bool dcb; 305 bool dcb;
306 u32 used_pds;
307 u32 used_cqs;
308 u32 used_mrs;
309 u32 used_qps;
306}; 310};
307 311
308struct i40iw_ib_device { 312struct i40iw_ib_device {
diff --git a/drivers/infiniband/hw/i40iw/i40iw_hw.c b/drivers/infiniband/hw/i40iw/i40iw_hw.c
index b94727ffc862..5e2c16c725e3 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_hw.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_hw.c
@@ -62,7 +62,7 @@ u32 i40iw_initialize_hw_resources(struct i40iw_device *iwdev)
62 max_mr = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_MR].cnt; 62 max_mr = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_MR].cnt;
63 arp_table_size = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_ARP].cnt; 63 arp_table_size = iwdev->sc_dev.hmc_info->hmc_obj[I40IW_HMC_IW_ARP].cnt;
64 iwdev->max_cqe = 0xFFFFF; 64 iwdev->max_cqe = 0xFFFFF;
65 num_pds = max_qp * 4; 65 num_pds = I40IW_MAX_PDS;
66 resources_size = sizeof(struct i40iw_arp_entry) * arp_table_size; 66 resources_size = sizeof(struct i40iw_arp_entry) * arp_table_size;
67 resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_qp); 67 resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_qp);
68 resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_mr); 68 resources_size += sizeof(unsigned long) * BITS_TO_LONGS(max_mr);
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index db9fd31b5c72..9d3b9ee20ba7 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -1558,6 +1558,20 @@ exit:
1558} 1558}
1559 1559
1560/** 1560/**
1561 * i40iw_get_used_rsrc - determine resources used internally
1562 * @iwdev: iwarp device
1563 *
1564 * Called after internal allocations
1565 */
1566static void i40iw_get_used_rsrc(struct i40iw_device *iwdev)
1567{
1568 iwdev->used_pds = find_next_zero_bit(iwdev->allocated_pds, iwdev->max_pd, 0);
1569 iwdev->used_qps = find_next_zero_bit(iwdev->allocated_qps, iwdev->max_qp, 0);
1570 iwdev->used_cqs = find_next_zero_bit(iwdev->allocated_cqs, iwdev->max_cq, 0);
1571 iwdev->used_mrs = find_next_zero_bit(iwdev->allocated_mrs, iwdev->max_mr, 0);
1572}
1573
1574/**
1561 * i40iw_open - client interface operation open for iwarp/uda device 1575 * i40iw_open - client interface operation open for iwarp/uda device
1562 * @ldev: lan device information 1576 * @ldev: lan device information
1563 * @client: iwarp client information, provided during registration 1577 * @client: iwarp client information, provided during registration
@@ -1629,6 +1643,7 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)
1629 status = i40iw_initialize_hw_resources(iwdev); 1643 status = i40iw_initialize_hw_resources(iwdev);
1630 if (status) 1644 if (status)
1631 break; 1645 break;
1646 i40iw_get_used_rsrc(iwdev);
1632 dev->ccq_ops->ccq_arm(dev->ccq); 1647 dev->ccq_ops->ccq_arm(dev->ccq);
1633 status = i40iw_hmc_init_pble(&iwdev->sc_dev, iwdev->pble_rsrc); 1648 status = i40iw_hmc_init_pble(&iwdev->sc_dev, iwdev->pble_rsrc);
1634 if (status) 1649 if (status)
diff --git a/drivers/infiniband/hw/i40iw/i40iw_user.h b/drivers/infiniband/hw/i40iw/i40iw_user.h
index e65c2baa7db2..66263fced68f 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_user.h
+++ b/drivers/infiniband/hw/i40iw/i40iw_user.h
@@ -76,7 +76,8 @@ enum i40iw_device_capabilities_const {
76 I40IW_MAX_ORD_SIZE = 127, 76 I40IW_MAX_ORD_SIZE = 127,
77 I40IW_MAX_WQ_ENTRIES = 2048, 77 I40IW_MAX_WQ_ENTRIES = 2048,
78 I40IW_Q2_BUFFER_SIZE = (248 + 100), 78 I40IW_Q2_BUFFER_SIZE = (248 + 100),
79 I40IW_QP_CTX_SIZE = 248 79 I40IW_QP_CTX_SIZE = 248,
80 I40IW_MAX_PDS = 32768
80}; 81};
81 82
82#define i40iw_handle void * 83#define i40iw_handle void *
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index 6b516d6156dc..d20ee118f366 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -67,13 +67,13 @@ static int i40iw_query_device(struct ib_device *ibdev,
67 props->vendor_part_id = iwdev->ldev->pcidev->device; 67 props->vendor_part_id = iwdev->ldev->pcidev->device;
68 props->hw_ver = (u32)iwdev->sc_dev.hw_rev; 68 props->hw_ver = (u32)iwdev->sc_dev.hw_rev;
69 props->max_mr_size = I40IW_MAX_OUTBOUND_MESSAGE_SIZE; 69 props->max_mr_size = I40IW_MAX_OUTBOUND_MESSAGE_SIZE;
70 props->max_qp = iwdev->max_qp; 70 props->max_qp = iwdev->max_qp - iwdev->used_qps;
71 props->max_qp_wr = (I40IW_MAX_WQ_ENTRIES >> 2) - 1; 71 props->max_qp_wr = (I40IW_MAX_WQ_ENTRIES >> 2) - 1;
72 props->max_sge = I40IW_MAX_WQ_FRAGMENT_COUNT; 72 props->max_sge = I40IW_MAX_WQ_FRAGMENT_COUNT;
73 props->max_cq = iwdev->max_cq; 73 props->max_cq = iwdev->max_cq - iwdev->used_cqs;
74 props->max_cqe = iwdev->max_cqe; 74 props->max_cqe = iwdev->max_cqe;
75 props->max_mr = iwdev->max_mr; 75 props->max_mr = iwdev->max_mr - iwdev->used_mrs;
76 props->max_pd = iwdev->max_pd; 76 props->max_pd = iwdev->max_pd - iwdev->used_pds;
77 props->max_sge_rd = I40IW_MAX_SGE_RD; 77 props->max_sge_rd = I40IW_MAX_SGE_RD;
78 props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE; 78 props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE;
79 props->max_qp_init_rd_atom = props->max_qp_rd_atom; 79 props->max_qp_init_rd_atom = props->max_qp_rd_atom;