[PATCH v5 6/8] iommu/arm-smmu-v3: Get associated RMR info and install

Robin Murphy robin.murphy at arm.com
Mon Jun 14 03:15:13 PDT 2021


On 2021-05-24 12:02, Shameer Kolothum wrote:
> Check if there is any RMR info associated with the devices behind
> the SMMUv3 and if any, install bypass STEs for them. This is to
> keep any ongoing traffic associated with these devices alive
> when we enable/reset SMMUv3 during probe().
> 
> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi at huawei.com>
> ---
>   drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 36 +++++++++++++++++++++
>   1 file changed, 36 insertions(+)
> 
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> index f9195b740f48..be1563e06732 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> @@ -3574,6 +3574,39 @@ static void __iomem *arm_smmu_ioremap(struct device *dev, resource_size_t start,
>   	return devm_ioremap_resource(dev, &res);
>   }
>   
> +static void arm_smmu_rmr_install_bypass_ste(struct arm_smmu_device *smmu)
> +{
> +	struct list_head rmr_list;
> +	struct iommu_resv_region *e;
> +	int ret;
> +
> +	INIT_LIST_HEAD(&rmr_list);
> +	if (iommu_dma_get_rmrs(dev_fwnode(smmu->dev), &rmr_list))
> +		return;
> +
> +	/*
> +	 * Since, we don't have a mechanism to differentiate the RMR
> +	 * SIDs that has an ongoing live stream, install bypass STEs
> +	 * for all the reported ones.
> +	 */

I don't really follow that comment. The point of being reserved is that 
we don't know how and why the device is using them, and we have little 
need to care - we are simply required to preserve an effective unity 
mapping at all times. I don't see any value in trying to second-guess 
things beyond that, as this appears to suggest.

Robin.

> +	list_for_each_entry(e, &rmr_list, list) {
> +		__le64 *step;
> +		u32 sid = e->fw_data.rmr.sid;
> +
> +		ret = arm_smmu_init_sid_strtab(smmu, sid);
> +		if (ret) {
> +			dev_err(smmu->dev, "RMR bypass(0x%x) failed\n",
> +				sid);
> +			continue;
> +		}
> +
> +		step = arm_smmu_get_step_for_sid(smmu, sid);
> +		arm_smmu_write_strtab_ent(NULL, sid, step, true);
> +	}
> +
> +	iommu_dma_put_rmrs(dev_fwnode(smmu->dev), &rmr_list);
> +}
> +
>   static int arm_smmu_device_probe(struct platform_device *pdev)
>   {
>   	int irq, ret;
> @@ -3657,6 +3690,9 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
>   	/* Record our private device structure */
>   	platform_set_drvdata(pdev, smmu);
>   
> +	/* Check for RMRs and install bypass STEs if any */
> +	arm_smmu_rmr_install_bypass_ste(smmu);
> +
>   	/* Reset the device */
>   	ret = arm_smmu_device_reset(smmu, bypass);
>   	if (ret)
> 



More information about the linux-arm-kernel mailing list