]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/oa: Use drm_gem_mmap_obj for OA buffer mmap
authorAshutosh Dixit <ashutosh.dixit@intel.com>
Mon, 27 Apr 2026 22:11:32 +0000 (15:11 -0700)
committerAshutosh Dixit <ashutosh.dixit@intel.com>
Wed, 29 Apr 2026 19:24:00 +0000 (12:24 -0700)
OA buffer mmap can currently only mmap OA buffer in system memory. CRI
MERTOA buffer can be located in device memory. Switch OA buffer mmap to
using drm_gem_mmap_obj, which can handle mmap's of both system and device
memory buffers.

Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Link: https://patch.msgid.link/20260427221133.2500532-3-ashutosh.dixit@intel.com
drivers/gpu/drm/xe/xe_oa.c

index 6ded3c2fce34ea3274c94bb2e06215d6003425f4..83797c9479f7c5364fb98e999152722a863b845b 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/poll.h>
 
 #include <drm/drm_drv.h>
+#include <drm/drm_gem.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_syncobj.h>
 #include <uapi/drm/xe_drm.h>
@@ -902,9 +903,6 @@ static int xe_oa_alloc_oa_buffer(struct xe_oa_stream *stream, size_t size)
 
        stream->oa_buffer.bo = bo;
 
-       /* mmap implementation requires OA buffer to be in system memory */
-       xe_assert(stream->oa->xe, bo->vmap.is_iomem == 0);
-
        stream->oa_buffer.bounce = kmalloc(stream->oa_buffer.format->size, GFP_KERNEL);
        if (!stream->oa_buffer.bounce) {
                xe_bo_unpin_map_no_vm(stream->oa_buffer.bo);
@@ -1692,8 +1690,6 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct xe_oa_stream *stream = file->private_data;
        struct xe_bo *bo = stream->oa_buffer.bo;
-       unsigned long start = vma->vm_start;
-       int i, ret;
 
        if (xe_observation_paranoid && !perfmon_capable()) {
                drm_dbg(&stream->oa->xe->drm, "Insufficient privilege to map OA buffer\n");
@@ -1701,7 +1697,7 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
        }
 
        /* Can mmap the entire OA buffer or nothing (no partial OA buffer mmaps) */
-       if (vma->vm_end - vma->vm_start != xe_bo_size(stream->oa_buffer.bo)) {
+       if (vma->vm_end - vma->vm_start != xe_bo_size(bo)) {
                drm_dbg(&stream->oa->xe->drm, "Wrong mmap size, must be OA buffer size\n");
                return -EINVAL;
        }
@@ -1717,17 +1713,7 @@ static int xe_oa_mmap(struct file *file, struct vm_area_struct *vma)
        vm_flags_mod(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP | VM_DONTCOPY,
                     VM_MAYWRITE | VM_MAYEXEC);
 
-       xe_assert(stream->oa->xe, bo->ttm.ttm->num_pages == vma_pages(vma));
-       for (i = 0; i < bo->ttm.ttm->num_pages; i++) {
-               ret = remap_pfn_range(vma, start, page_to_pfn(bo->ttm.ttm->pages[i]),
-                                     PAGE_SIZE, vma->vm_page_prot);
-               if (ret)
-                       break;
-
-               start += PAGE_SIZE;
-       }
-
-       return ret;
+       return drm_gem_mmap_obj(&bo->ttm.base, xe_bo_size(bo), vma);
 }
 
 static const struct file_operations xe_oa_fops = {