Loading drivers/net/wireless/cnss2/pci.c +26 −0 Original line number Diff line number Diff line Loading @@ -1407,6 +1407,27 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) goto release_mapping; } if (pci_priv->iommu_geometry) { struct iommu_domain_geometry geometry = {0}; /* Need revisit if iova and ipa not continuous */ CNSS_ASSERT(pci_priv->smmu_iova_start + pci_priv->smmu_iova_len == pci_priv->smmu_iova_ipa_start); geometry.aperture_start = pci_priv->smmu_iova_start; geometry.aperture_end = pci_priv->smmu_iova_start + pci_priv->smmu_iova_len + pci_priv->smmu_iova_ipa_len; ret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_GEOMETRY, &geometry); /* Not fatal failure, fall-thru */ if (ret) cnss_pr_err("Failed to set GEOMETRY, err = %d\n", ret); } ret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_CB_STALL_DISABLE, &cb_stall_disable); Loading Loading @@ -3328,6 +3349,11 @@ static int cnss_pci_get_smmu_cfg(struct cnss_plat_data *plat_priv) "converged dt" : "single dt"), &pci_priv->smmu_iova_ipa_start, pci_priv->smmu_iova_ipa_len); pci_priv->iommu_geometry = of_property_read_bool(dev_node, "qcom,iommu-geometry"); cnss_pr_dbg("DOMAIN_ATTR_GEOMETRY: %d\n", pci_priv->iommu_geometry); return 0; out: Loading drivers/net/wireless/cnss2/pci.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -86,6 +86,7 @@ struct cnss_pci_data { struct timer_list dev_rddm_timer; bool disable_pc; struct cnss_pci_debug_reg *debug_reg; u32 iommu_geometry; }; static inline void cnss_set_pci_priv(struct pci_dev *pci_dev, void *data) Loading Loading
drivers/net/wireless/cnss2/pci.c +26 −0 Original line number Diff line number Diff line Loading @@ -1407,6 +1407,27 @@ static int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv) goto release_mapping; } if (pci_priv->iommu_geometry) { struct iommu_domain_geometry geometry = {0}; /* Need revisit if iova and ipa not continuous */ CNSS_ASSERT(pci_priv->smmu_iova_start + pci_priv->smmu_iova_len == pci_priv->smmu_iova_ipa_start); geometry.aperture_start = pci_priv->smmu_iova_start; geometry.aperture_end = pci_priv->smmu_iova_start + pci_priv->smmu_iova_len + pci_priv->smmu_iova_ipa_len; ret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_GEOMETRY, &geometry); /* Not fatal failure, fall-thru */ if (ret) cnss_pr_err("Failed to set GEOMETRY, err = %d\n", ret); } ret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_CB_STALL_DISABLE, &cb_stall_disable); Loading Loading @@ -3328,6 +3349,11 @@ static int cnss_pci_get_smmu_cfg(struct cnss_plat_data *plat_priv) "converged dt" : "single dt"), &pci_priv->smmu_iova_ipa_start, pci_priv->smmu_iova_ipa_len); pci_priv->iommu_geometry = of_property_read_bool(dev_node, "qcom,iommu-geometry"); cnss_pr_dbg("DOMAIN_ATTR_GEOMETRY: %d\n", pci_priv->iommu_geometry); return 0; out: Loading
drivers/net/wireless/cnss2/pci.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -86,6 +86,7 @@ struct cnss_pci_data { struct timer_list dev_rddm_timer; bool disable_pc; struct cnss_pci_debug_reg *debug_reg; u32 iommu_geometry; }; static inline void cnss_set_pci_priv(struct pci_dev *pci_dev, void *data) Loading