xref: /aosp_15_r20/external/mesa3d/src/panfrost/lib/kmod/pan_kmod_backend.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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