1 | /* |
2 | * SPDX-License-Identifier: MIT |
3 | * |
4 | * Copyright © 2019 Intel Corporation |
5 | */ |
6 | |
7 | #include <drm/drm_file.h> |
8 | |
9 | #include "i915_drv.h" |
10 | #include "igt_mmap.h" |
11 | |
12 | unsigned long igt_mmap_offset(struct drm_i915_private *i915, |
13 | u64 offset, |
14 | unsigned long size, |
15 | unsigned long prot, |
16 | unsigned long flags) |
17 | { |
18 | struct drm_vma_offset_node *node; |
19 | struct file *file; |
20 | unsigned long addr; |
21 | int err; |
22 | |
23 | /* no need to refcount, we own this object */ |
24 | drm_vma_offset_lock_lookup(mgr: i915->drm.vma_offset_manager); |
25 | node = drm_vma_offset_exact_lookup_locked(mgr: i915->drm.vma_offset_manager, |
26 | start: offset / PAGE_SIZE, pages: size / PAGE_SIZE); |
27 | drm_vma_offset_unlock_lookup(mgr: i915->drm.vma_offset_manager); |
28 | |
29 | if (GEM_WARN_ON(!node)) { |
30 | pr_info("Failed to lookup %llx\n" , offset); |
31 | return -ENOENT; |
32 | } |
33 | |
34 | /* Pretend to open("/dev/dri/card0") */ |
35 | file = mock_drm_getfile(minor: i915->drm.primary, O_RDWR); |
36 | if (IS_ERR(ptr: file)) |
37 | return PTR_ERR(ptr: file); |
38 | |
39 | err = drm_vma_node_allow(node, tag: file->private_data); |
40 | if (err) { |
41 | addr = err; |
42 | goto out_file; |
43 | } |
44 | |
45 | addr = vm_mmap(file, 0, drm_vma_node_size(node) << PAGE_SHIFT, |
46 | prot, flags, drm_vma_node_offset_addr(node)); |
47 | |
48 | drm_vma_node_revoke(node, tag: file->private_data); |
49 | out_file: |
50 | fput(file); |
51 | return addr; |
52 | } |
53 | |