From patchwork Wed Jul 26 19:59:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 108794 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp1205395qge; Wed, 26 Jul 2017 13:00:22 -0700 (PDT) X-Received: by 10.36.116.146 with SMTP id o140mr2207459itc.107.1501099222560; Wed, 26 Jul 2017 13:00:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501099222; cv=none; d=google.com; s=arc-20160816; b=0Cl+ii73+2Ay6XdOZaNuIvWAIRYwtiB0TzEtiATCGpRJIPXC8ke+VelPN77RYiutie cpcg4oxzet16zIfTYEexRSNAQfAIXAXYzQ19JTwNT4Ovqe72smAXZGj9A2/xA2Gule4I VcRiKq1XifzyC8E38X1SWp8DlQb1h/4hcWgBNYmgMXbOC867ShhXe12B5RZ5R+1oNf3T 8iBsUJkQlZnn55aID75kknFo1Hi8HCp9Ki0JEQ9H0DFyrniXF2r/BUz4I6C6CUVFUw1/ NmFKFsUjXRjIsOiUzpxA4fwxTeym+b2DimJCJo3DdaztBBxvIF7L6GLFVJYYCyK7jcHD rEWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=IH5TfJBaC/FVYkUPdaIqAwR3fdWM3RSmGY56fclv8+I=; b=wlFJNFjH1COBNAZK4d7T9S71rcbIr7rNkvRIENBNMxemo2H1yMnTUN0h7qbjuFUHJ5 aEBXCYzzsP1i7FFEIq8LGFDerxnN9LpJErdxYWOgjhyRd/HeOodtaeHTeByV0yth1SH2 tyNCP8jzYfHzUzcUkMD38PBfnqe01dD5eOSCtIatCZbOmNEOoyr/5PWGDk2COZ1l4pyc 3dfSPcmwIawzpzVVTobSLYD/sEJZBon/anMp+D3Yd62ii/cqIdiSm0x2KgVCfjyYl0di d9WkwuoSkVUvCxDKzdOWF7Zy25GAwhzpy/Flx6tnqBxo25OvyyCslxDVPFIfOQAHuBQf /FVA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c90si12828708itd.167.2017.07.26.13.00.22; Wed, 26 Jul 2017 13:00:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751562AbdGZUAU (ORCPT + 26 others); Wed, 26 Jul 2017 16:00:20 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:62825 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751034AbdGZUAS (ORCPT ); Wed, 26 Jul 2017 16:00:18 -0400 Received: from wuerfel.lan ([5.56.224.194]) by mrelayeu.kundenserver.de (mreue003 [212.227.15.129]) with ESMTPA (Nemesis) id 0MGV7M-1dNCwb47kG-00DF1g; Wed, 26 Jul 2017 22:00:10 +0200 From: Arnd Bergmann To: Rob Clark , David Airlie , Jordan Crouse Cc: Arnd Bergmann , Stanimir Varbanov , Bjorn Andersson , Sushmita Susheelendra , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] drm/msm: gpu: don't abuse dma_alloc for non-DMA allocations Date: Wed, 26 Jul 2017 21:59:21 +0200 Message-Id: <20170726200007.2432476-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:ogR0kYdg0XsE1WcagJwLmbXPLJZCPw/TeFqKb+vUspMYe6v5YTD YKOL0KhCOSRGiZvkVC3Vpj3KD9A6RBVk6UNmzafQpKKQltNfYZa84ZA6wNV3JBcWsT6DSs8 0jAccASl7tZY7BRg+U6Mrd2IbEwt/5/egw7Sr72ut1hZbLCkjoHqIWwtSuaQYMPgSC3IIa3 vdWanEf1XLVpfv1W9dJCQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:ErhdX2iuJUE=:w+SczjIFtAsCLDrP6j5E8z pqUvAZIUtQd1WhvPAALpW7ttDegVy33nUoaOR+FgJSvD7ZSAJeav/O6ZgpPQlE5ZvgjCgk1EU CRXUmY0dCj+HodHfMKNq7nK75kFQb8xZVmMQiZCzqZqc5TX51qjQZ7NOwZK847NGo0xmYjujG FOcvBNZ0mhI6XOmethbUfYVD7Az1nGBkPeUHAEHBv0ZLhlXncaHc0If0VD/d6zTVF2rP/fhWM XcXfYLTKVCWoLeHqTaRrqWP2mki+IXKWB6NG7Y08hbu5KhCtWGQ76NAXLJ0LBZ60Xtygrcp3v vg1hi5lrfdZtySn5O20jTFbXWUG0SZRtE1GWqfL4RDy5FWM2pcIWrGZGGx+zzoTW/bGeYooYj DY7BzI6HofTWA5d/IQJvbnUTDLrqAkWlF8dZOK2/DxTwMbD9xAGY3W1HMss6ko0VgSlfkmY1D CYfAJf58NTVTQQa6CKdNfM4YQijqXrybqQGuDsDIjxymn5G/+JJ+LylsaFyhqMDXv7x5kLeeS F2XHFxiyhu1/hQhfu2ePcvl2YJEBHw3yO2DDEBrvnHDeFSZWycJ5wyOuXFu1D54thZfz820ix QmO85XgnIiAzLpPCMjT7aVZJZzCwkgeF4yKoxc9gv9WStwSylTKpqaKX41QTIJmteYLfC2hHc 69d2/XcA0ikelnkSAcfhmogYmrG+ni9CXkT4GkbaUjBaSAFP/esm4GUTNTVqW8vKCsz3QZ4C0 v0n9/B5+HWevjfl5luuM3Bgc1ax7CDBrmI1wuA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In zap_shader_load_mdt(), we pass a pointer to a phys_addr_t into dmam_alloc_coherent, which the compiler warns about: drivers/gpu/drm/msm/adreno/a5xx_gpu.c: In function 'zap_shader_load_mdt': drivers/gpu/drm/msm/adreno/a5xx_gpu.c:54:50: error: passing argument 3 of 'dmam_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types] The returned DMA address is later passed on to a function that takes a phys_addr_t, so it's clearly wrong to use the DMA mapping interface here: the memory may be uncached, or the address may be completely wrong if there is an IOMMU connected to the device. What the code actually wants to do is to get the physical address from the reserved-mem node. It goes through the dma-mapping interfaces for obscure reasons, and this apparently only works by chance, relying on specific bugs in the error handling of the arm64 dma-mapping implementation. The same problem existed in the "venus" media driver, which was now fixed by Stanimir Varbanov after long discussions. In order to make some progress here, I have now ported his approach over to the adreno driver. The patch is currently untested, and should get a good review, but it is now much simpler than the original, and it should be obvious what goes wrong if I made a mistake in the port. See also: a6e2d36bf6b7 ("media: venus: don't abuse dma_alloc for non-DMA allocations") Cc: Stanimir Varbanov Fixes: 7c65817e6d38 ("drm/msm: gpu: Enable zap shader for A5XX") Acked-and-Tested-by: Jordan Crouse Signed-off-by: Arnd Bergmann --- I think we want this to be applied for 4.13, as the upstream code that was added in the merge window is seriously broken without it. Resending this separately now, please apply this and "[PATCH 1/2] drm/msm: gpu: call qcom_mdt interfaces only for ARCH_QCOM". v3: fix typo and wrong comment found by Jordan v2: rewrite based on Stanimir's venus patch --- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 72 +++++++++++------------------------ drivers/gpu/drm/msm/adreno/a5xx_gpu.h | 2 - 2 files changed, 23 insertions(+), 51 deletions(-) -- 2.9.0 Acked-by: Bjorn Andersson diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c index 1d54c76a7778..e1138f6c823b 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include "msm_gem.h" #include "msm_mmu.h" @@ -29,6 +29,8 @@ static void a5xx_dump(struct msm_gpu *gpu); static int zap_shader_load_mdt(struct device *dev, const char *fwname) { const struct firmware *fw; + struct device_node *np; + struct resource r; phys_addr_t mem_phys; ssize_t mem_size; void *mem_region = NULL; @@ -37,6 +39,21 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname) if (!IS_ENABLED(CONFIG_ARCH_QCOM)) return -EINVAL; + np = of_get_child_by_name(dev->of_node, "zap-shader"); + if (!np) + return -ENODEV; + + np = of_parse_phandle(np, "memory-region", 0); + if (!np) + return -EINVAL; + + ret = of_address_to_resource(np, 0, &r); + if (ret) + return ret; + + mem_phys = r.start; + mem_size = resource_size(&r); + /* Request the MDT file for the firmware */ ret = request_firmware(&fw, fwname, dev); if (ret) { @@ -52,7 +69,7 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname) } /* Allocate memory for the firmware image */ - mem_region = dmam_alloc_coherent(dev, mem_size, &mem_phys, GFP_KERNEL); + mem_region = memremap(mem_phys, mem_size, MEMREMAP_WC); if (!mem_region) { ret = -ENOMEM; goto out; @@ -70,6 +87,9 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname) DRM_DEV_ERROR(dev, "Unable to authorize the image\n"); out: + if (mem_region) + memunmap(mem_region); + release_firmware(fw); return ret; @@ -372,45 +392,6 @@ static int a5xx_zap_shader_resume(struct msm_gpu *gpu) return ret; } -/* Set up a child device to "own" the zap shader */ -static int a5xx_zap_shader_dev_init(struct device *parent, struct device *dev) -{ - struct device_node *node; - int ret; - - if (dev->parent) - return 0; - - /* Find the sub-node for the zap shader */ - node = of_get_child_by_name(parent->of_node, "zap-shader"); - if (!node) { - DRM_DEV_ERROR(parent, "zap-shader not found in device tree\n"); - return -ENODEV; - } - - dev->parent = parent; - dev->of_node = node; - dev_set_name(dev, "adreno_zap_shader"); - - ret = device_register(dev); - if (ret) { - DRM_DEV_ERROR(parent, "Couldn't register zap shader device\n"); - goto out; - } - - ret = of_reserved_mem_device_init(dev); - if (ret) { - DRM_DEV_ERROR(parent, "Unable to set up the reserved memory\n"); - device_unregister(dev); - } - -out: - if (ret) - dev->parent = NULL; - - return ret; -} - static int a5xx_zap_shader_init(struct msm_gpu *gpu) { static bool loaded; @@ -439,11 +420,7 @@ static int a5xx_zap_shader_init(struct msm_gpu *gpu) return -ENODEV; } - ret = a5xx_zap_shader_dev_init(&pdev->dev, &a5xx_gpu->zap_dev); - - if (!ret) - ret = zap_shader_load_mdt(&a5xx_gpu->zap_dev, - adreno_gpu->info->zapfw); + ret = zap_shader_load_mdt(&pdev->dev, adreno_gpu->info->zapfw); loaded = !ret; @@ -686,9 +663,6 @@ static void a5xx_destroy(struct msm_gpu *gpu) DBG("%s", gpu->name); - if (a5xx_gpu->zap_dev.parent) - device_unregister(&a5xx_gpu->zap_dev); - if (a5xx_gpu->pm4_bo) { if (a5xx_gpu->pm4_iova) msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace); diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.h b/drivers/gpu/drm/msm/adreno/a5xx_gpu.h index 6638bc85645d..6b20f28c75a0 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.h @@ -36,8 +36,6 @@ struct a5xx_gpu { uint32_t gpmu_dwords; uint32_t lm_leakage; - - struct device zap_dev; }; #define to_a5xx_gpu(x) container_of(x, struct a5xx_gpu, base)