xref: /openbsd-src/sys/dev/pci/drm/i915/selftests/igt_mmap.c (revision 5ca02815211fc20fa71222bf4e6148b043e505b3)
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