qed: Set the doorbell address correctly
[ Upstream commit 8366d520019f366fabd6c7a13032bdcd837e18d4 ] In 100g mode the doorbell bar is united for both engines. Set the correct offset in the hwfn so that the doorbell returned for RoCE is in the affined hwfn. Signed-off-by: Ariel Elior <ariel.elior@marvell.com> Signed-off-by: Denis Bolotin <denis.bolotin@marvell.com> Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e703ea55e7
commit
d11b937a51
@ -2947,6 +2947,7 @@ static int qed_get_dev_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||
static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
|
||||
void __iomem *p_regview,
|
||||
void __iomem *p_doorbells,
|
||||
u64 db_phys_addr,
|
||||
enum qed_pci_personality personality)
|
||||
{
|
||||
int rc = 0;
|
||||
@ -2954,6 +2955,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
|
||||
/* Split PCI bars evenly between hwfns */
|
||||
p_hwfn->regview = p_regview;
|
||||
p_hwfn->doorbells = p_doorbells;
|
||||
p_hwfn->db_phys_addr = db_phys_addr;
|
||||
|
||||
if (IS_VF(p_hwfn->cdev))
|
||||
return qed_vf_hw_prepare(p_hwfn);
|
||||
@ -3036,7 +3038,9 @@ int qed_hw_prepare(struct qed_dev *cdev,
|
||||
/* Initialize the first hwfn - will learn number of hwfns */
|
||||
rc = qed_hw_prepare_single(p_hwfn,
|
||||
cdev->regview,
|
||||
cdev->doorbells, personality);
|
||||
cdev->doorbells,
|
||||
cdev->db_phys_addr,
|
||||
personality);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@ -3045,22 +3049,25 @@ int qed_hw_prepare(struct qed_dev *cdev,
|
||||
/* Initialize the rest of the hwfns */
|
||||
if (cdev->num_hwfns > 1) {
|
||||
void __iomem *p_regview, *p_doorbell;
|
||||
u8 __iomem *addr;
|
||||
u64 db_phys_addr;
|
||||
u32 offset;
|
||||
|
||||
/* adjust bar offset for second engine */
|
||||
addr = cdev->regview +
|
||||
qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
|
||||
BAR_ID_0) / 2;
|
||||
p_regview = addr;
|
||||
offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
|
||||
BAR_ID_0) / 2;
|
||||
p_regview = cdev->regview + offset;
|
||||
|
||||
addr = cdev->doorbells +
|
||||
qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
|
||||
BAR_ID_1) / 2;
|
||||
p_doorbell = addr;
|
||||
offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
|
||||
BAR_ID_1) / 2;
|
||||
|
||||
p_doorbell = cdev->doorbells + offset;
|
||||
|
||||
db_phys_addr = cdev->db_phys_addr + offset;
|
||||
|
||||
/* prepare second hw function */
|
||||
rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview,
|
||||
p_doorbell, personality);
|
||||
p_doorbell, db_phys_addr,
|
||||
personality);
|
||||
|
||||
/* in case of error, need to free the previously
|
||||
* initiliazed hwfn 0.
|
||||
|
@ -753,7 +753,7 @@ static int qed_rdma_add_user(void *rdma_cxt,
|
||||
dpi_start_offset +
|
||||
((out_params->dpi) * p_hwfn->dpi_size));
|
||||
|
||||
out_params->dpi_phys_addr = p_hwfn->cdev->db_phys_addr +
|
||||
out_params->dpi_phys_addr = p_hwfn->db_phys_addr +
|
||||
dpi_start_offset +
|
||||
((out_params->dpi) * p_hwfn->dpi_size);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user