1 /*
2 * Copyright © 2023 Collabora, Ltd.
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7 #pragma once
8
9 #include "util/log.h"
10
11 #include "pan_kmod.h"
12
13 static inline void
pan_kmod_dev_init(struct pan_kmod_dev * dev,int fd,uint32_t flags,drmVersionPtr version,const struct pan_kmod_ops * ops,const struct pan_kmod_allocator * allocator)14 pan_kmod_dev_init(struct pan_kmod_dev *dev, int fd, uint32_t flags,
15 drmVersionPtr version, const struct pan_kmod_ops *ops,
16 const struct pan_kmod_allocator *allocator)
17 {
18 simple_mtx_init(&dev->handle_to_bo.lock, mtx_plain);
19 util_sparse_array_init(&dev->handle_to_bo.array,
20 sizeof(struct pan_kmod_bo *), 512);
21 dev->driver.version.major = version->version_major;
22 dev->driver.version.minor = version->version_minor;
23 dev->fd = fd;
24 dev->flags = flags;
25 dev->ops = ops;
26 dev->allocator = allocator;
27 }
28
29 static inline void
pan_kmod_dev_cleanup(struct pan_kmod_dev * dev)30 pan_kmod_dev_cleanup(struct pan_kmod_dev *dev)
31 {
32 if (dev->flags & PAN_KMOD_DEV_FLAG_OWNS_FD)
33 close(dev->fd);
34
35 util_sparse_array_finish(&dev->handle_to_bo.array);
36 simple_mtx_destroy(&dev->handle_to_bo.lock);
37 }
38
39 static inline void *
pan_kmod_alloc(const struct pan_kmod_allocator * allocator,size_t size)40 pan_kmod_alloc(const struct pan_kmod_allocator *allocator, size_t size)
41 {
42 return allocator->zalloc(allocator, size, false);
43 }
44
45 static inline void *
pan_kmod_alloc_transient(const struct pan_kmod_allocator * allocator,size_t size)46 pan_kmod_alloc_transient(const struct pan_kmod_allocator *allocator,
47 size_t size)
48 {
49 return allocator->zalloc(allocator, size, true);
50 }
51
52 static inline void
pan_kmod_free(const struct pan_kmod_allocator * allocator,void * data)53 pan_kmod_free(const struct pan_kmod_allocator *allocator, void *data)
54 {
55 return allocator->free(allocator, data);
56 }
57
58 static inline void *
pan_kmod_dev_alloc(struct pan_kmod_dev * dev,size_t size)59 pan_kmod_dev_alloc(struct pan_kmod_dev *dev, size_t size)
60 {
61 return pan_kmod_alloc(dev->allocator, size);
62 }
63
64 static inline void *
pan_kmod_dev_alloc_transient(struct pan_kmod_dev * dev,size_t size)65 pan_kmod_dev_alloc_transient(struct pan_kmod_dev *dev, size_t size)
66 {
67 return pan_kmod_alloc_transient(dev->allocator, size);
68 }
69
70 static inline void
pan_kmod_dev_free(const struct pan_kmod_dev * dev,void * data)71 pan_kmod_dev_free(const struct pan_kmod_dev *dev, void *data)
72 {
73 return pan_kmod_free(dev->allocator, data);
74 }
75
76 static inline void
pan_kmod_bo_init(struct pan_kmod_bo * bo,struct pan_kmod_dev * dev,struct pan_kmod_vm * exclusive_vm,size_t size,uint32_t flags,uint32_t handle)77 pan_kmod_bo_init(struct pan_kmod_bo *bo, struct pan_kmod_dev *dev,
78 struct pan_kmod_vm *exclusive_vm, size_t size, uint32_t flags,
79 uint32_t handle)
80 {
81 bo->dev = dev;
82 bo->exclusive_vm = exclusive_vm;
83 bo->size = size;
84 bo->flags = flags;
85 bo->handle = handle;
86 p_atomic_set(&bo->refcnt, 1);
87 }
88
89 static inline void
pan_kmod_vm_init(struct pan_kmod_vm * vm,struct pan_kmod_dev * dev,uint32_t handle,uint32_t flags)90 pan_kmod_vm_init(struct pan_kmod_vm *vm, struct pan_kmod_dev *dev,
91 uint32_t handle, uint32_t flags)
92 {
93 vm->dev = dev;
94 vm->handle = handle;
95 vm->flags = flags;
96 }
97
98 static inline int
pan_kmod_vm_op_check(struct pan_kmod_vm * vm,enum pan_kmod_vm_op_mode mode,struct pan_kmod_vm_op * op)99 pan_kmod_vm_op_check(struct pan_kmod_vm *vm, enum pan_kmod_vm_op_mode mode,
100 struct pan_kmod_vm_op *op)
101 {
102 /* We should only have sync operations on an async VM bind request. */
103 if (mode != PAN_KMOD_VM_OP_MODE_ASYNC && op->syncs.count) {
104 mesa_loge("only PAN_KMOD_VM_OP_MODE_ASYNC can be passed sync operations");
105 return -1;
106 }
107
108 /* Make sure the PAN_KMOD_VM_FLAG_AUTO_VA and VA passed to the op match. */
109 if (op->type == PAN_KMOD_VM_OP_TYPE_MAP &&
110 !!(vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA) !=
111 (op->va.start == PAN_KMOD_VM_MAP_AUTO_VA)) {
112 mesa_loge("op->va.start and vm->flags don't match");
113 return -1;
114 }
115
116 return 0;
117 }
118