From: Senthilkumar <[email protected]> qcom_pcie_probe() does not set priv->ops, so the of_match table's per-SoC config_sid() callback is not invoked by qcom_pcie_init_port(). As a result, the RC's BDF-to-SID table remains unprogrammed and every endpoint's DMA is tagged with SID 0 instead of the SID from its own iommu-map entry, causing intermittent DMA failures on SMMU configs that fault unmatched streams (USFCFG=1).
Set priv->ops from the of_match .data via dev_get_driver_data(), as the qcom_pcie_ids[] table already intends. Signed-off-by: Senthilkumar <[email protected]> Signed-off-by: Sumit Singh Dhami <[email protected]> --- drivers/pci/pcie_dw_qcom.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/pci/pcie_dw_qcom.c b/drivers/pci/pcie_dw_qcom.c index ce6b4d97d1d..dd69d8b99da 100644 --- a/drivers/pci/pcie_dw_qcom.c +++ b/drivers/pci/pcie_dw_qcom.c @@ -489,6 +489,9 @@ static int qcom_pcie_probe(struct udevice *dev) priv->dw.first_busno = dev_seq(dev); priv->dw.dev = dev; + /* Wire up the per-SoC ops so qcom_pcie_init_port() can call config_sid() */ + priv->ops = (struct qcom_pcie_ops *)dev_get_driver_data(dev); + ret = qcom_pcie_parse_dt(dev); if (ret) return ret; base-commit: 3973f3c4d24df75ca90d7c0a9f03e5e5c9b48f32 -- Best regards Sumit Singh Dhami
