Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * SPDX-License-Identifier: MIT
0003  *
0004  * Copyright © 2019 Intel Corporation
0005  */
0006 
0007 #include <drm/drm_file.h>
0008 
0009 #include "i915_drv.h"
0010 #include "igt_mmap.h"
0011 
0012 unsigned long igt_mmap_offset(struct drm_i915_private *i915,
0013                   u64 offset,
0014                   unsigned long size,
0015                   unsigned long prot,
0016                   unsigned long flags)
0017 {
0018     struct drm_vma_offset_node *node;
0019     struct file *file;
0020     unsigned long addr;
0021     int err;
0022 
0023     /* no need to refcount, we own this object */
0024     drm_vma_offset_lock_lookup(i915->drm.vma_offset_manager);
0025     node = drm_vma_offset_exact_lookup_locked(i915->drm.vma_offset_manager,
0026                           offset / PAGE_SIZE, size / PAGE_SIZE);
0027     drm_vma_offset_unlock_lookup(i915->drm.vma_offset_manager);
0028 
0029     if (GEM_WARN_ON(!node)) {
0030         pr_info("Failed to lookup %llx\n", offset);
0031         return -ENOENT;
0032     }
0033 
0034     /* Pretend to open("/dev/dri/card0") */
0035     file = mock_drm_getfile(i915->drm.primary, O_RDWR);
0036     if (IS_ERR(file))
0037         return PTR_ERR(file);
0038 
0039     err = drm_vma_node_allow(node, file->private_data);
0040     if (err) {
0041         addr = err;
0042         goto out_file;
0043     }
0044 
0045     addr = vm_mmap(file, 0, drm_vma_node_size(node) << PAGE_SHIFT,
0046                prot, flags, drm_vma_node_offset_addr(node));
0047 
0048     drm_vma_node_revoke(node, file->private_data);
0049 out_file:
0050     fput(file);
0051     return addr;
0052 }