0001
0002
0003
0004
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
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
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 }