qed: Set the doorbell address correctly

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>
This commit is contained in:
Michal Kalderon 2019-05-26 15:22:25 +03:00 коммит произвёл David S. Miller
Родитель 443473d2f3
Коммит 8366d52001
2 изменённых файлов: 19 добавлений и 12 удалений

Просмотреть файл

@ -4426,6 +4426,7 @@ static void qed_nvm_info_free(struct qed_hwfn *p_hwfn)
static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
void __iomem *p_regview, void __iomem *p_regview,
void __iomem *p_doorbells, void __iomem *p_doorbells,
u64 db_phys_addr,
enum qed_pci_personality personality) enum qed_pci_personality personality)
{ {
struct qed_dev *cdev = p_hwfn->cdev; struct qed_dev *cdev = p_hwfn->cdev;
@ -4434,6 +4435,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
/* Split PCI bars evenly between hwfns */ /* Split PCI bars evenly between hwfns */
p_hwfn->regview = p_regview; p_hwfn->regview = p_regview;
p_hwfn->doorbells = p_doorbells; p_hwfn->doorbells = p_doorbells;
p_hwfn->db_phys_addr = db_phys_addr;
if (IS_VF(p_hwfn->cdev)) if (IS_VF(p_hwfn->cdev))
return qed_vf_hw_prepare(p_hwfn); return qed_vf_hw_prepare(p_hwfn);
@ -4529,7 +4531,9 @@ int qed_hw_prepare(struct qed_dev *cdev,
/* Initialize the first hwfn - will learn number of hwfns */ /* Initialize the first hwfn - will learn number of hwfns */
rc = qed_hw_prepare_single(p_hwfn, rc = qed_hw_prepare_single(p_hwfn,
cdev->regview, cdev->regview,
cdev->doorbells, personality); cdev->doorbells,
cdev->db_phys_addr,
personality);
if (rc) if (rc)
return rc; return rc;
@ -4538,22 +4542,25 @@ int qed_hw_prepare(struct qed_dev *cdev,
/* Initialize the rest of the hwfns */ /* Initialize the rest of the hwfns */
if (cdev->num_hwfns > 1) { if (cdev->num_hwfns > 1) {
void __iomem *p_regview, *p_doorbell; void __iomem *p_regview, *p_doorbell;
u8 __iomem *addr; u64 db_phys_addr;
u32 offset;
/* adjust bar offset for second engine */ /* adjust bar offset for second engine */
addr = cdev->regview + offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, BAR_ID_0) / 2;
BAR_ID_0) / 2; p_regview = cdev->regview + offset;
p_regview = addr;
addr = cdev->doorbells + offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, BAR_ID_1) / 2;
BAR_ID_1) / 2;
p_doorbell = addr; p_doorbell = cdev->doorbells + offset;
db_phys_addr = cdev->db_phys_addr + offset;
/* prepare second hw function */ /* prepare second hw function */
rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview, 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 /* in case of error, need to free the previously
* initiliazed hwfn 0. * initiliazed hwfn 0.

Просмотреть файл

@ -803,7 +803,7 @@ static int qed_rdma_add_user(void *rdma_cxt,
dpi_start_offset + dpi_start_offset +
((out_params->dpi) * p_hwfn->dpi_size)); ((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 + dpi_start_offset +
((out_params->dpi) * p_hwfn->dpi_size); ((out_params->dpi) * p_hwfn->dpi_size);