[PATCH v1] gpu: host1x: Detach Host1x from IOMMU DMA domain on arm32

kbuild test robot lkp at intel.com
Mon Aug 20 17:35:39 UTC 2018


Hi Dmitry,

I love your patch! Yet something to improve:

[auto build test ERROR on tegra-drm/drm/tegra/for-next]
[also build test ERROR on v4.18 next-20180820]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Dmitry-Osipenko/gpu-host1x-Detach-Host1x-from-IOMMU-DMA-domain-on-arm32/20180820-225630
base:   git://anongit.freedesktop.org/tegra/linux.git drm/tegra/for-next
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.2.0 make.cross ARCH=arm 

All error/warnings (new ones prefixed by >>):

   drivers/gpu/host1x/dev.c: In function 'host1x_probe':
>> drivers/gpu/host1x/dev.c:241:16: error: invalid type argument of '->' (have 'struct device')
      if (pdev->dev->archdata.mapping) {
                   ^~
   In file included from include/linux/device.h:28:0,
                    from include/linux/dma-mapping.h:7,
                    from drivers/gpu/host1x/dev.c:20:
>> arch/arm/include/asm/device.h:35:41: error: invalid type argument of '->' (have 'struct device')
    #define to_dma_iommu_mapping(dev) ((dev)->archdata.mapping)
                                            ^
>> drivers/gpu/host1x/dev.c:243:6: note: in expansion of macro 'to_dma_iommu_mapping'
         to_dma_iommu_mapping(pdev->dev);
         ^~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/host1x/dev.c:244:28: error: incompatible type for argument 1 of 'arm_iommu_detach_device'
       arm_iommu_detach_device(pdev->dev);
                               ^~~~
   In file included from drivers/gpu/host1x/dev.c:33:0:
   arch/arm/include/asm/dma-iommu.h:36:6: note: expected 'struct device *' but argument is of type 'struct device'
    void arm_iommu_detach_device(struct device *dev);
         ^~~~~~~~~~~~~~~~~~~~~~~
--
   drivers/gpu//host1x/dev.c: In function 'host1x_probe':
   drivers/gpu//host1x/dev.c:241:16: error: invalid type argument of '->' (have 'struct device')
      if (pdev->dev->archdata.mapping) {
                   ^~
   In file included from include/linux/device.h:28:0,
                    from include/linux/dma-mapping.h:7,
                    from drivers/gpu//host1x/dev.c:20:
>> arch/arm/include/asm/device.h:35:41: error: invalid type argument of '->' (have 'struct device')
    #define to_dma_iommu_mapping(dev) ((dev)->archdata.mapping)
                                            ^
   drivers/gpu//host1x/dev.c:243:6: note: in expansion of macro 'to_dma_iommu_mapping'
         to_dma_iommu_mapping(pdev->dev);
         ^~~~~~~~~~~~~~~~~~~~
   drivers/gpu//host1x/dev.c:244:28: error: incompatible type for argument 1 of 'arm_iommu_detach_device'
       arm_iommu_detach_device(pdev->dev);
                               ^~~~
   In file included from drivers/gpu//host1x/dev.c:33:0:
   arch/arm/include/asm/dma-iommu.h:36:6: note: expected 'struct device *' but argument is of type 'struct device'
    void arm_iommu_detach_device(struct device *dev);
         ^~~~~~~~~~~~~~~~~~~~~~~

vim +241 drivers/gpu/host1x/dev.c

   143	
   144	static int host1x_probe(struct platform_device *pdev)
   145	{
   146		struct host1x *host;
   147		struct resource *regs, *hv_regs = NULL;
   148		int syncpt_irq;
   149		int err;
   150	
   151		host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
   152		if (!host)
   153			return -ENOMEM;
   154	
   155		host->info = of_device_get_match_data(&pdev->dev);
   156	
   157		if (host->info->has_hypervisor) {
   158			regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vm");
   159			if (!regs) {
   160				dev_err(&pdev->dev, "failed to get vm registers\n");
   161				return -ENXIO;
   162			}
   163	
   164			hv_regs = platform_get_resource_byname(pdev, IORESOURCE_MEM,
   165							       "hypervisor");
   166			if (!hv_regs) {
   167				dev_err(&pdev->dev,
   168					"failed to get hypervisor registers\n");
   169				return -ENXIO;
   170			}
   171		} else {
   172			regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   173			if (!regs) {
   174				dev_err(&pdev->dev, "failed to get registers\n");
   175				return -ENXIO;
   176			}
   177		}
   178	
   179		syncpt_irq = platform_get_irq(pdev, 0);
   180		if (syncpt_irq < 0) {
   181			dev_err(&pdev->dev, "failed to get IRQ: %d\n", syncpt_irq);
   182			return syncpt_irq;
   183		}
   184	
   185		mutex_init(&host->devices_lock);
   186		INIT_LIST_HEAD(&host->devices);
   187		INIT_LIST_HEAD(&host->list);
   188		host->dev = &pdev->dev;
   189	
   190		/* set common host1x device data */
   191		platform_set_drvdata(pdev, host);
   192	
   193		host->regs = devm_ioremap_resource(&pdev->dev, regs);
   194		if (IS_ERR(host->regs))
   195			return PTR_ERR(host->regs);
   196	
   197		if (host->info->has_hypervisor) {
   198			host->hv_regs = devm_ioremap_resource(&pdev->dev, hv_regs);
   199			if (IS_ERR(host->hv_regs))
   200				return PTR_ERR(host->hv_regs);
   201		}
   202	
   203		dma_set_mask_and_coherent(host->dev, host->info->dma_mask);
   204	
   205		if (host->info->init) {
   206			err = host->info->init(host);
   207			if (err)
   208				return err;
   209		}
   210	
   211		host->clk = devm_clk_get(&pdev->dev, NULL);
   212		if (IS_ERR(host->clk)) {
   213			dev_err(&pdev->dev, "failed to get clock\n");
   214			err = PTR_ERR(host->clk);
   215			return err;
   216		}
   217	
   218		host->rst = devm_reset_control_get(&pdev->dev, "host1x");
   219		if (IS_ERR(host->rst)) {
   220			err = PTR_ERR(host->rst);
   221			dev_err(&pdev->dev, "failed to get reset: %d\n", err);
   222			return err;
   223		}
   224	
   225		host->group = iommu_group_get(&pdev->dev);
   226		if (host->group) {
   227			struct iommu_domain_geometry *geometry;
   228			unsigned long order;
   229	
   230			err = iova_cache_get();
   231			if (err < 0)
   232				goto put_group;
   233	
   234			host->domain = iommu_domain_alloc(&platform_bus_type);
   235			if (!host->domain) {
   236				err = -ENOMEM;
   237				goto put_cache;
   238			}
   239	
   240	#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
 > 241			if (pdev->dev->archdata.mapping) {
   242				struct dma_iommu_mapping *mapping =
 > 243						to_dma_iommu_mapping(pdev->dev);
 > 244				arm_iommu_detach_device(pdev->dev);
   245				arm_iommu_release_mapping(mapping);
   246			}
   247	#endif
   248			err = iommu_attach_group(host->domain, host->group);
   249			if (err) {
   250				if (err == -ENODEV) {
   251					iommu_domain_free(host->domain);
   252					host->domain = NULL;
   253					iova_cache_put();
   254					iommu_group_put(host->group);
   255					host->group = NULL;
   256					goto skip_iommu;
   257				}
   258	
   259				goto fail_free_domain;
   260			}
   261	
   262			geometry = &host->domain->geometry;
   263	
   264			order = __ffs(host->domain->pgsize_bitmap);
   265			init_iova_domain(&host->iova, 1UL << order,
   266					 geometry->aperture_start >> order);
   267			host->iova_end = geometry->aperture_end;
   268		}
   269	
   270	skip_iommu:
   271		err = host1x_channel_list_init(&host->channel_list,
   272					       host->info->nb_channels);
   273		if (err) {
   274			dev_err(&pdev->dev, "failed to initialize channel list\n");
   275			goto fail_detach_device;
   276		}
   277	
   278		err = clk_prepare_enable(host->clk);
   279		if (err < 0) {
   280			dev_err(&pdev->dev, "failed to enable clock\n");
   281			goto fail_free_channels;
   282		}
   283	
   284		err = reset_control_deassert(host->rst);
   285		if (err < 0) {
   286			dev_err(&pdev->dev, "failed to deassert reset: %d\n", err);
   287			goto fail_unprepare_disable;
   288		}
   289	
   290		err = host1x_syncpt_init(host);
   291		if (err) {
   292			dev_err(&pdev->dev, "failed to initialize syncpts\n");
   293			goto fail_reset_assert;
   294		}
   295	
   296		err = host1x_intr_init(host, syncpt_irq);
   297		if (err) {
   298			dev_err(&pdev->dev, "failed to initialize interrupts\n");
   299			goto fail_deinit_syncpt;
   300		}
   301	
   302		host1x_debug_init(host);
   303	
   304		err = host1x_register(host);
   305		if (err < 0)
   306			goto fail_deinit_intr;
   307	
   308		return 0;
   309	
   310	fail_deinit_intr:
   311		host1x_intr_deinit(host);
   312	fail_deinit_syncpt:
   313		host1x_syncpt_deinit(host);
   314	fail_reset_assert:
   315		reset_control_assert(host->rst);
   316	fail_unprepare_disable:
   317		clk_disable_unprepare(host->clk);
   318	fail_free_channels:
   319		host1x_channel_list_free(&host->channel_list);
   320	fail_detach_device:
   321		if (host->group && host->domain) {
   322			put_iova_domain(&host->iova);
   323			iommu_detach_group(host->domain, host->group);
   324		}
   325	fail_free_domain:
   326		if (host->domain)
   327			iommu_domain_free(host->domain);
   328	put_cache:
   329		if (host->group)
   330			iova_cache_put();
   331	put_group:
   332		iommu_group_put(host->group);
   333	
   334		return err;
   335	}
   336	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 65073 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20180821/d8ffd476/attachment-0001.gz>


More information about the dri-devel mailing list