cnss2: Only send host IOVA range to firmware when SMMU enabled

Only when SMMU S1 enabled, CNSS driver will send IOVA range in
HOST_CAP message, and let firmware to configure ATU.

Change-Id: Idd19063da975c0105d91e0e31575d0b0d1edd8e2
Signed-off-by: Lin Bai <lbai@codeaurora.org>
This commit is contained in:
Lin Bai 2020-11-24 11:27:02 +08:00 • committed by Gerrit - the friendly Code Review server
commit d00e6c6b34
5 changed files with 27 additions and 1 deletions

View file

@ -588,3 +588,18 @@ int cnss_bus_get_msi_assignment(struct cnss_plat_data *plat_priv,
return -EINVAL;
}
}
bool cnss_bus_is_smmu_s1_enabled(struct cnss_plat_data *plat_priv)
{
if (!plat_priv)
return false;
switch (plat_priv->bus_type) {
case CNSS_BUS_PCI:
return cnss_pci_is_smmu_s1_enabled(plat_priv->bus_priv);
default:
cnss_pr_err("Unsupported bus type: %d\n",
plat_priv->bus_type);
return false;
}
}

View file

@ -69,4 +69,5 @@ int cnss_bus_get_msi_assignment(struct cnss_plat_data *plat_priv,
int *num_vectors,
u32 *user_base_data,
u32 *base_vector);
bool cnss_bus_is_smmu_s1_enabled(struct cnss_plat_data *plat_priv);
#endif /* _CNSS_BUS_H */

View file

@ -4099,6 +4099,14 @@ int cnss_pci_get_iova_ipa(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size)
return 0;
}
bool cnss_pci_is_smmu_s1_enabled(struct cnss_pci_data *pci_priv)
{
if (pci_priv)
return pci_priv->smmu_s1_enable;
return false;
}
struct iommu_domain *cnss_smmu_get_domain(struct device *dev)
{
struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev));

View file

@ -253,4 +253,5 @@ int cnss_pci_get_user_msi_assignment(struct cnss_pci_data *pci_priv,
int *num_vectors,
u32 *user_base_data,
u32 *base_vector);
bool cnss_pci_is_smmu_s1_enabled(struct cnss_pci_data *pci_priv);
#endif /* _CNSS_PCI_H */

View file

@ -226,7 +226,8 @@ static int cnss_wlfw_host_cap_send_sync(struct cnss_plat_data *plat_priv)
req->cal_done = plat_priv->cal_done;
cnss_pr_dbg("Calibration done is %d\n", plat_priv->cal_done);
if (!cnss_bus_get_iova(plat_priv, &iova_start, &iova_size) &&
if (cnss_bus_is_smmu_s1_enabled(plat_priv) &&
!cnss_bus_get_iova(plat_priv, &iova_start, &iova_size) &&
!cnss_bus_get_iova_ipa(plat_priv, &iova_ipa_start,
&iova_ipa_size)) {
req->ddr_range_valid = 1;