Message ID | 148897097336.16106.17118406255063350893.sendpatchset@little-apple (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Hi Magnus, On Wed, Mar 8, 2017 at 12:02 PM, Magnus Damm <magnus.damm@gmail.com> wrote: > From: Magnus Damm <damm+renesas@opensource.se> > > 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@opensource.se> > --- 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? > + { /* 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? > + 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; Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Hi Geert, On Wed, Mar 8, 2017 at 10:58 PM, Geert Uytterhoeven <geert@linux-m68k.org> wrote: > Hi Magnus, > > On Wed, Mar 8, 2017 at 12:02 PM, Magnus Damm <magnus.damm@gmail.com> wrote: >> From: Magnus Damm <damm+renesas@opensource.se> >> >> 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@opensource.se> > >> --- 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
--- 0018/drivers/iommu/ipmmu-vmsa.c +++ work/drivers/iommu/ipmmu-vmsa.c 2017-03-08 19:11:53.600607110 +0900 @@ -23,6 +23,7 @@ #include <linux/platform_device.h> #include <linux/sizes.h> #include <linux/slab.h> +#include <linux/sys_soc.h> #if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA) #include <asm/dma-iommu.h> @@ -770,6 +771,10 @@ static int ipmmu_init_platform_device(st int num_utlbs; int ret = -ENODEV; + /* Initialize once - xlate() will call multiple times */ + if (to_archdata(dev)) + return 0; + /* Find the master corresponding to the device. */ num_utlbs = of_count_phandle_with_args(dev->of_node, "iommus", @@ -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", }, + { /* 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"); + 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; + return ipmmu_init_platform_device(dev); } @@ -1095,11 +1123,22 @@ static const struct ipmmu_features ipmmu .twobit_imttbcr_sl0 = false, }; +static const struct ipmmu_features ipmmu_features_r8a7795 = { + .use_ns_alias_offset = false, + .has_cache_leaf_nodes = true, + .has_eight_ctx = true, + .setup_imbuscr = false, + .twobit_imttbcr_sl0 = true, +}; + static const struct of_device_id ipmmu_of_ids[] = { { .compatible = "renesas,ipmmu-vmsa", .data = &ipmmu_features_default, }, { + .compatible = "renesas,ipmmu-r8a7795", + .data = &ipmmu_features_r8a7795, + }, { /* Terminator */ }, }; @@ -1288,6 +1327,8 @@ static int __init ipmmu_vmsa_iommu_of_se IOMMU_OF_DECLARE(ipmmu_vmsa_iommu_of, "renesas,ipmmu-vmsa", ipmmu_vmsa_iommu_of_setup); +IOMMU_OF_DECLARE(ipmmu_r8a7795_iommu_of, "renesas,ipmmu-r8a7795", + ipmmu_vmsa_iommu_of_setup); #endif MODULE_DESCRIPTION("IOMMU API for Renesas VMSA-compatible IPMMU");