Re: [PATCH v3 09/09] iommu/ipmmu-vmsa: Hook up r8a7795 DT matching code
From: Magnus Damm
Date: Wed Mar 08 2017 - 23:21:26 EST
Hi Geert,
On Wed, Mar 8, 2017 at 10:58 PM, Geert Uytterhoeven
<geert@xxxxxxxxxxxxxx> wrote:
> Hi Magnus,
>
> On Wed, Mar 8, 2017 at 12:02 PM, Magnus Damm <magnus.damm@xxxxxxxxx> wrote:
>> From: Magnus Damm <damm+renesas@xxxxxxxxxxxxx>
>>
>> Tie in r8a7795 features and update the IOMMU_OF_DECLARE
>> compat string to include the updated compat string.
>>
>> TODO:
>> - Consider making use of iommu_fwspec_add_ids() for uTLB handling
>> Needed to coexist with non-OF R-Car Gen2 somehow...
>> - Break out stuff useful for R-Car Gen2 from this series
>> Fix up the Gen2 IPMMU support code
>> and/or
>> Fold more stuff into the multi-arch series
>> - Add support for sysfs and iommu_device_link()/unlink()
>>
>> Signed-off-by: Magnus Damm <damm+renesas@xxxxxxxxxxxxx>
>
>> --- 0018/drivers/iommu/ipmmu-vmsa.c
>> +++ work/drivers/iommu/ipmmu-vmsa.c 2017-03-08 19:11:53.600607110 +0900
>
>> @@ -1043,6 +1048,17 @@ static struct iommu_group *ipmmu_find_gr
>> return group;
>> }
>>
>> +static bool ipmmu_slave_whitelist(struct device *dev)
>> +{
>> + /* By default, do not allow use of IPMMU */
>> + return false;
>> +}
>> +
>> +static const struct soc_device_attribute soc_r8a7795[] = {
>> + { .soc_id = "r8a7795", },
>
> If/when the whitelist is/becomes device/revision specific, you probably want
> to store a pointer to the *_slave_whitelist() function in the .data member?
Yeah, for sure. It is a bit early to tell exactly how the code will
look like at this point, but I think it will become more clear in the
future. Just want to send out a new version of r8a7796 IPMMU support
and some r8a7795 DT integration to get a coherent working set of patch
series out of the door first.
>> + { /* sentinel */ }
>> +};
>> +
>> static int ipmmu_of_xlate_dma(struct device *dev,
>> struct of_phandle_args *spec)
>> {
>> @@ -1053,6 +1069,18 @@ static int ipmmu_of_xlate_dma(struct dev
>> if (!of_device_is_available(spec->np))
>> return -ENODEV;
>>
>> + /* Failing in ->attach_device() results in a hang, so make
>> + * sure the root device is installed before going there
>> + */
>> + if (!__ipmmu_find_root()) {
>> + dev_info(dev, "Unable to locate IPMMU root device\n");
>
> dev_err?
Good idea. Will fix.
>> + return -ENODEV;
>> + }
>> +
>> + /* For R-Car Gen3 use a white list to opt-in slave devices */
>> + if (soc_device_match(soc_r8a7795) && !ipmmu_slave_whitelist(dev))
>> + return -ENODEV;
This will have to be updated for r8a7796 somehow as well.
Thanks for your help!
Cheers,
/ magnus