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