diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0770-drm-amdgpu-implement-direct-gma-ioctl-interface.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/0770-drm-amdgpu-implement-direct-gma-ioctl-interface.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0770-drm-amdgpu-implement-direct-gma-ioctl-interface.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0770-drm-amdgpu-implement-direct-gma-ioctl-interface.patch new file mode 100644 index 00000000..ca4868a4 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0770-drm-amdgpu-implement-direct-gma-ioctl-interface.patch @@ -0,0 +1,135 @@ +From a9f9049fe4f5a4abb45ea66b5e499d0fa561d5ad Mon Sep 17 00:00:00 2001 +From: Flora Cui <Flora.Cui@amd.com> +Date: Thu, 11 Aug 2016 14:41:08 +0800 +Subject: [PATCH 0770/4131] drm/amdgpu: implement direct gma ioctl interface + +Change-Id: Ibe3d5eca19e84b21dda183010ebd229434cd2f6c +Signed-off-by: Flora Cui <Flora.Cui@amd.com> +Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> + + Conflicts: + include/uapi/drm/amdgpu_drm.h +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 75 +++++++++++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 +- + 3 files changed, 80 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index b7db1d1..31738e5 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -1317,6 +1317,9 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, + int amdgpu_freesync_ioctl(struct drm_device *dev, void *data, + struct drm_file *filp); + ++int amdgpu_gem_dgma_ioctl(struct drm_device *dev, void *data, ++ struct drm_file *filp); ++ + /* VRAM scratch page for HDP bug, default vram page */ + struct amdgpu_vram_scratch { + struct amdgpu_bo *robj; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index cd3642c..38db03f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -326,6 +326,81 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, + return r; + } + ++int amdgpu_gem_dgma_ioctl(struct drm_device *dev, void *data, ++ struct drm_file *filp) ++{ ++ struct amdgpu_device *adev = dev->dev_private; ++ struct drm_amdgpu_gem_dgma *args = data; ++ struct drm_gem_object *gobj; ++ struct amdgpu_bo *abo; ++ dma_addr_t *dma_addr; ++ uint32_t handle, flags, offset; ++ int i, r = 0; ++ ++ switch (args->op) { ++ case AMDGPU_GEM_DGMA_IMPORT: ++ /* create a gem object to contain this object in */ ++ r = amdgpu_gem_object_create(adev, args->size, 0, ++ AMDGPU_GEM_DOMAIN_DGMA_IMPORT, 0, ++ 0, &gobj); ++ if (r) ++ return r; ++ ++ abo = gem_to_amdgpu_bo(gobj); ++ r = amdgpu_bo_reserve(abo, true); ++ if (unlikely(r)) ++ goto release_object; ++ ++ dma_addr = kmalloc_array(abo->tbo.num_pages, sizeof(dma_addr_t), GFP_KERNEL); ++ if (unlikely(dma_addr == NULL)) { ++ amdgpu_bo_unreserve(abo); ++ goto release_object; ++ } ++ for (i = 0; i < abo->tbo.num_pages; i++) ++ dma_addr[i] = args->addr + i * PAGE_SIZE; ++ ++ flags = AMDGPU_PTE_VALID | AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE; ++ if (adev->asic_type >= CHIP_TONGA) ++ flags |= AMDGPU_PTE_EXECUTABLE; ++ ++ offset = amdgpu_bo_gpu_offset(abo); ++ offset -= adev->mman.bdev.man[TTM_PL_TT].gpu_offset; ++ r = amdgpu_gart_bind(adev, offset, abo->tbo.num_pages, ++ NULL, dma_addr, flags); ++ kfree(dma_addr); ++ amdgpu_bo_unreserve(abo); ++ if (unlikely(r)) ++ goto release_object; ++ ++ abo->tbo.mem.bus.base = args->addr; ++ abo->tbo.mem.bus.offset = 0; ++ ++ r = drm_gem_handle_create(filp, gobj, &handle); ++ args->handle = handle; ++ break; ++ case AMDGPU_GEM_DGMA_QUERY_PHYS_ADDR: ++ gobj = kcl_drm_gem_object_lookup(dev, filp, args->handle); ++ if (gobj == NULL) ++ return -ENOENT; ++ ++ abo = gem_to_amdgpu_bo(gobj); ++ if (abo->tbo.mem.mem_type != AMDGPU_PL_DGMA) { ++ r = -EINVAL; ++ goto release_object; ++ } ++ args->addr = amdgpu_bo_gpu_offset(abo); ++ args->addr -= adev->mc.vram_start; ++ args->addr += adev->mc.aper_base; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++release_object: ++ drm_gem_object_unreference_unlocked(gobj); ++ return r; ++} ++ + int amdgpu_mode_dumb_mmap(struct drm_file *filp, + struct drm_device *dev, + uint32_t handle, uint64_t *offset_p) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +index 81cfc34..34c2d1b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +@@ -1054,7 +1054,8 @@ const struct drm_ioctl_desc amdgpu_ioctls_kms[] = { + DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW), +- DRM_IOCTL_DEF_DRV(AMDGPU_FREESYNC, amdgpu_freesync_ioctl, DRM_MASTER) ++ DRM_IOCTL_DEF_DRV(AMDGPU_FREESYNC, amdgpu_freesync_ioctl, DRM_MASTER), ++ DRM_IOCTL_DEF_DRV(AMDGPU_GEM_DGMA, amdgpu_gem_dgma_ioctl, DRM_AUTH|DRM_RENDER_ALLOW) + }; + const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms); + +-- +2.7.4 + |