diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1856-drm-amd-amdgpu-Partial-revert-of-iova-debugfs.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1856-drm-amd-amdgpu-Partial-revert-of-iova-debugfs.patch | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1856-drm-amd-amdgpu-Partial-revert-of-iova-debugfs.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1856-drm-amd-amdgpu-Partial-revert-of-iova-debugfs.patch new file mode 100644 index 00000000..bfc85224 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1856-drm-amd-amdgpu-Partial-revert-of-iova-debugfs.patch @@ -0,0 +1,139 @@ +From 9198f2b72d033651e999372ff4806127c84ef23b Mon Sep 17 00:00:00 2001 +From: Tom St Denis <tom.stdenis@amd.com> +Date: Tue, 19 Sep 2017 11:29:04 -0400 +Subject: [PATCH 1856/4131] drm/amd/amdgpu: Partial revert of iova debugfs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We discovered that on some devices even with iommu enabled +you can access all of system memory through the iommu translation. + +Therefore, we revert the read method to the translation only service +and drop the write method completely. + +Signed-off-by: Tom St Denis <tom.stdenis@amd.com> +Reviewed-by: Christan König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 90 +++++---------------------------- + 1 file changed, 13 insertions(+), 77 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +index c1a4ff9..7239121 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +@@ -2079,98 +2079,34 @@ static ssize_t amdgpu_iova_to_phys_read(struct file *f, char __user *buf, + size_t size, loff_t *pos) + { + struct amdgpu_device *adev = file_inode(f)->i_private; +- ssize_t result, n; + int r; + uint64_t phys; +- void *ptr; + struct iommu_domain *dom; + +- dom = iommu_get_domain_for_dev(adev->dev); +- if (!dom) +- return -EFAULT; +- +- result = 0; +- while (size) { +- // get physical address and map +- phys = iommu_iova_to_phys(dom, *pos); +- +- // copy upto one page +- if (size > PAGE_SIZE) +- n = PAGE_SIZE; +- else +- n = size; +- +- // to end of the page +- if (((*pos & (PAGE_SIZE - 1)) + n) >= PAGE_SIZE) +- n = PAGE_SIZE - (*pos & (PAGE_SIZE - 1)); +- +- ptr = kmap(pfn_to_page(PFN_DOWN(phys))); +- if (!ptr) +- return -EFAULT; +- +- r = copy_to_user(buf, ptr, n); +- kunmap(pfn_to_page(PFN_DOWN(phys))); +- if (r) +- return -EFAULT; +- +- *pos += n; +- size -= n; +- result += n; +- } +- +- return result; +-} ++ // always return 8 bytes ++ if (size != 8) ++ return -EINVAL; + +-static ssize_t amdgpu_iova_to_phys_write(struct file *f, const char __user *buf, +- size_t size, loff_t *pos) +-{ +- struct amdgpu_device *adev = file_inode(f)->i_private; +- ssize_t result, n; +- int r; +- uint64_t phys; +- void *ptr; +- struct iommu_domain *dom; ++ // only accept page addresses ++ if (*pos & 0xFFF) ++ return -EINVAL; + + dom = iommu_get_domain_for_dev(adev->dev); +- if (!dom) +- return -EFAULT; +- +- result = 0; +- while (size) { +- // get physical address and map ++ if (dom) + phys = iommu_iova_to_phys(dom, *pos); ++ else ++ phys = *pos; + +- // copy upto one page +- if (size > PAGE_SIZE) +- n = PAGE_SIZE; +- else +- n = size; +- +- // to end of the page +- if (((*pos & (PAGE_SIZE - 1)) + n) >= PAGE_SIZE) +- n = PAGE_SIZE - (*pos & (PAGE_SIZE - 1)); +- +- ptr = kmap(pfn_to_page(PFN_DOWN(phys))); +- if (!ptr) +- return -EFAULT; +- +- r = copy_from_user(ptr, buf, n); +- kunmap(pfn_to_page(PFN_DOWN(phys))); +- if (r) +- return -EFAULT; +- +- *pos += n; +- size -= n; +- result += n; +- } ++ r = copy_to_user(buf, &phys, 8); ++ if (r) ++ return -EFAULT; + +- return result; ++ return 8; + } + + static const struct file_operations amdgpu_ttm_iova_fops = { + .owner = THIS_MODULE, + .read = amdgpu_iova_to_phys_read, +- .write = amdgpu_iova_to_phys_write, + .llseek = default_llseek + }; + +-- +2.7.4 + |