Messages in this thread | | | Date | Thu, 16 Apr 2020 21:53:58 +0530 | From | Sai Prakash Ranjan <> | Subject | Re: [PATCH 2/2] iommu/arm-smmu: Allow client devices to select direct mapping |
| |
Hi Robin,
On 2020-04-16 19:28, Robin Murphy wrote: > On 2020-01-22 11:48 am, Sai Prakash Ranjan wrote: >> From: Jordan Crouse <jcrouse@codeaurora.org> >> >> Some client devices want to directly map the IOMMU themselves instead >> of using the DMA domain. Allow those devices to opt in to direct >> mapping by way of a list of compatible strings. >> >> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> >> Co-developed-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org> >> Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org> >> --- >> drivers/iommu/arm-smmu-qcom.c | 39 >> +++++++++++++++++++++++++++++++++++ >> drivers/iommu/arm-smmu.c | 3 +++ >> drivers/iommu/arm-smmu.h | 5 +++++ >> 3 files changed, 47 insertions(+) >> >> diff --git a/drivers/iommu/arm-smmu-qcom.c >> b/drivers/iommu/arm-smmu-qcom.c >> index 64a4ab270ab7..ff746acd1c81 100644 >> --- a/drivers/iommu/arm-smmu-qcom.c >> +++ b/drivers/iommu/arm-smmu-qcom.c >> @@ -3,6 +3,7 @@ >> * Copyright (c) 2019, The Linux Foundation. All rights reserved. >> */ >> +#include <linux/of_device.h> >> #include <linux/qcom_scm.h> >> #include "arm-smmu.h" >> @@ -11,6 +12,43 @@ struct qcom_smmu { >> struct arm_smmu_device smmu; >> }; >> +static const struct arm_smmu_client_match_data qcom_adreno = { >> + .direct_mapping = true, >> +}; >> + >> +static const struct arm_smmu_client_match_data qcom_mdss = { >> + .direct_mapping = true, >> +}; > > Might it make sense to group these by the desired SMMU behaviour > rather than (apparently) what kind of device the client happens to be, > which seems like a completely arbitrary distinction from the SMMU > driver's PoV? >
Sorry, I did not get the "grouping by the desired SMMU behaviour" thing. Could you please give some more details?
>> + >> +static const struct of_device_id qcom_smmu_client_of_match[] = { >> + { .compatible = "qcom,adreno", .data = &qcom_adreno }, >> + { .compatible = "qcom,mdp4", .data = &qcom_mdss }, >> + { .compatible = "qcom,mdss", .data = &qcom_mdss }, >> + { .compatible = "qcom,sc7180-mdss", .data = &qcom_mdss }, >> + { .compatible = "qcom,sdm845-mdss", .data = &qcom_mdss }, >> + {}, >> +}; >> + >> +static const struct arm_smmu_client_match_data * >> +qcom_smmu_client_data(struct device *dev) >> +{ >> + const struct of_device_id *match = >> + of_match_device(qcom_smmu_client_of_match, dev); >> + >> + return match ? match->data : NULL; > > of_device_get_match_data() is your friend. >
Ok will use it.
>> +} >> + >> +static int qcom_smmu_request_domain(struct device *dev) >> +{ >> + const struct arm_smmu_client_match_data *client; >> + >> + client = qcom_smmu_client_data(dev); >> + if (client) >> + iommu_request_dm_for_dev(dev); >> + >> + return 0; >> +} >> + >> static int qcom_sdm845_smmu500_reset(struct arm_smmu_device *smmu) >> { >> int ret; >> @@ -41,6 +79,7 @@ static int qcom_smmu500_reset(struct arm_smmu_device >> *smmu) >> } >> static const struct arm_smmu_impl qcom_smmu_impl = { >> + .req_domain = qcom_smmu_request_domain, >> .reset = qcom_smmu500_reset, >> }; >> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c >> index 16c4b87af42b..67dd9326247a 100644 >> --- a/drivers/iommu/arm-smmu.c >> +++ b/drivers/iommu/arm-smmu.c >> @@ -1448,6 +1448,9 @@ static int arm_smmu_add_device(struct device >> *dev) >> device_link_add(dev, smmu->dev, >> DL_FLAG_PM_RUNTIME | DL_FLAG_AUTOREMOVE_SUPPLIER); >> + if (smmu->impl && smmu->impl->req_domain) >> + return smmu->impl->req_domain(dev); >> + > > There are about 5 different patchsets flying around at the moment that > all touch default domain allocation, so this is a fast-moving target, > but I think where the dust should settle is with arm_smmu_ops > forwarding .def_domain_type (or whatever it ends up as) calls to > arm_smmu_impl as appropriate. >
I'll wait till the dust settles down and then post the next version.
>> return 0; >> out_cfg_free: >> diff --git a/drivers/iommu/arm-smmu.h b/drivers/iommu/arm-smmu.h >> index 8d1cd54d82a6..059dc9c39f64 100644 >> --- a/drivers/iommu/arm-smmu.h >> +++ b/drivers/iommu/arm-smmu.h >> @@ -244,6 +244,10 @@ enum arm_smmu_arch_version { >> ARM_SMMU_V2, >> }; >> +struct arm_smmu_client_match_data { >> + bool direct_mapping; >> +}; > > Does this need to be public? I don't see the other users... >
Will move this out.
Thanks, Sai
-- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
| |