diff options
author | Devesh Sharma <devesh.sharma@broadcom.com> | 2017-06-29 15:28:16 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-07-20 11:20:50 -0400 |
commit | 254cd2590d408f2c0375fbf73ef8250d47529e7b (patch) | |
tree | 48f0a0954f92d87fd841f71f122dd486537d0c1f | |
parent | 536f092805cecc5c2c0ba7f051a7552619bd4491 (diff) |
RDMA/bnxt_re: Enable atomics only if host bios supports
Driver shall check if the host system bios has enabled
Atomic operations capability in PCI Device Control 2
register of the pci-device. Expose the ATOMIC_HCA
flag only if the Atomic operations capability is set.
Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/hw/bnxt_re/ib_verbs.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/bnxt_re/qplib_sp.c | 14 | ||||
-rw-r--r-- | drivers/infiniband/hw/bnxt_re/qplib_sp.h | 3 |
3 files changed, 21 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c index 4d3cdca03c02..7b17030d2696 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c | |||
@@ -173,8 +173,10 @@ int bnxt_re_query_device(struct ib_device *ibdev, | |||
173 | ib_attr->max_pd = dev_attr->max_pd; | 173 | ib_attr->max_pd = dev_attr->max_pd; |
174 | ib_attr->max_qp_rd_atom = dev_attr->max_qp_rd_atom; | 174 | ib_attr->max_qp_rd_atom = dev_attr->max_qp_rd_atom; |
175 | ib_attr->max_qp_init_rd_atom = dev_attr->max_qp_init_rd_atom; | 175 | ib_attr->max_qp_init_rd_atom = dev_attr->max_qp_init_rd_atom; |
176 | ib_attr->atomic_cap = IB_ATOMIC_HCA; | 176 | if (dev_attr->is_atomic) { |
177 | ib_attr->masked_atomic_cap = IB_ATOMIC_HCA; | 177 | ib_attr->atomic_cap = IB_ATOMIC_HCA; |
178 | ib_attr->masked_atomic_cap = IB_ATOMIC_HCA; | ||
179 | } | ||
178 | 180 | ||
179 | ib_attr->max_ee_rd_atom = 0; | 181 | ib_attr->max_ee_rd_atom = 0; |
180 | ib_attr->max_res_rd_atom = 0; | 182 | ib_attr->max_res_rd_atom = 0; |
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c index 5827573875d4..ef91ab786dd4 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c | |||
@@ -51,6 +51,19 @@ const struct bnxt_qplib_gid bnxt_qplib_gid_zero = {{ 0, 0, 0, 0, 0, 0, 0, 0, | |||
51 | 0, 0, 0, 0, 0, 0, 0, 0 } }; | 51 | 0, 0, 0, 0, 0, 0, 0, 0 } }; |
52 | 52 | ||
53 | /* Device */ | 53 | /* Device */ |
54 | |||
55 | static bool bnxt_qplib_is_atomic_cap(struct bnxt_qplib_rcfw *rcfw) | ||
56 | { | ||
57 | int rc; | ||
58 | u16 pcie_ctl2; | ||
59 | |||
60 | rc = pcie_capability_read_word(rcfw->pdev, PCI_EXP_DEVCTL2, | ||
61 | &pcie_ctl2); | ||
62 | if (rc) | ||
63 | return false; | ||
64 | return !!(pcie_ctl2 & PCI_EXP_DEVCTL2_ATOMIC_REQ); | ||
65 | } | ||
66 | |||
54 | int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, | 67 | int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, |
55 | struct bnxt_qplib_dev_attr *attr) | 68 | struct bnxt_qplib_dev_attr *attr) |
56 | { | 69 | { |
@@ -131,6 +144,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, | |||
131 | attr->tqm_alloc_reqs[i * 4 + 3] = *(++tqm_alloc); | 144 | attr->tqm_alloc_reqs[i * 4 + 3] = *(++tqm_alloc); |
132 | } | 145 | } |
133 | 146 | ||
147 | attr->is_atomic = bnxt_qplib_is_atomic_cap(rcfw); | ||
134 | bail: | 148 | bail: |
135 | bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); | 149 | bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); |
136 | return rc; | 150 | return rc; |
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h index a543f959098b..2ce7e2a32cf0 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h | |||
@@ -42,6 +42,8 @@ | |||
42 | 42 | ||
43 | #define BNXT_QPLIB_RESERVED_QP_WRS 128 | 43 | #define BNXT_QPLIB_RESERVED_QP_WRS 128 |
44 | 44 | ||
45 | #define PCI_EXP_DEVCTL2_ATOMIC_REQ 0x0040 | ||
46 | |||
45 | struct bnxt_qplib_dev_attr { | 47 | struct bnxt_qplib_dev_attr { |
46 | char fw_ver[32]; | 48 | char fw_ver[32]; |
47 | u16 max_sgid; | 49 | u16 max_sgid; |
@@ -70,6 +72,7 @@ struct bnxt_qplib_dev_attr { | |||
70 | u32 max_inline_data; | 72 | u32 max_inline_data; |
71 | u32 l2_db_size; | 73 | u32 l2_db_size; |
72 | u8 tqm_alloc_reqs[MAX_TQM_ALLOC_REQ]; | 74 | u8 tqm_alloc_reqs[MAX_TQM_ALLOC_REQ]; |
75 | bool is_atomic; | ||
73 | }; | 76 | }; |
74 | 77 | ||
75 | struct bnxt_qplib_pd { | 78 | struct bnxt_qplib_pd { |