1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * based in part on tu driver which is:
5*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat.
6*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen
7*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker *
9*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
10*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
11*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
12*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
14*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
17*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
18*61046927SAndroid Build Coastguard Worker * Software.
19*61046927SAndroid Build Coastguard Worker *
20*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26*61046927SAndroid Build Coastguard Worker * SOFTWARE.
27*61046927SAndroid Build Coastguard Worker */
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #ifndef PVR_BO_H
30*61046927SAndroid Build Coastguard Worker #define PVR_BO_H
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #include <stddef.h>
33*61046927SAndroid Build Coastguard Worker #include <stdint.h>
34*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include "pvr_types.h"
37*61046927SAndroid Build Coastguard Worker #include "pvr_winsys.h"
38*61046927SAndroid Build Coastguard Worker #include "util/list.h"
39*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
40*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker struct pvr_device;
43*61046927SAndroid Build Coastguard Worker struct pvr_dump_ctx;
44*61046927SAndroid Build Coastguard Worker struct pvr_winsys_bo;
45*61046927SAndroid Build Coastguard Worker struct pvr_winsys_vma;
46*61046927SAndroid Build Coastguard Worker struct pvr_winsys_heap;
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker struct pvr_bo {
49*61046927SAndroid Build Coastguard Worker /* Since multiple components (csb, caching logic, etc.) can make use of
50*61046927SAndroid Build Coastguard Worker * linking buffers in a list, we add 'link' in pvr_bo to avoid an extra
51*61046927SAndroid Build Coastguard Worker * level of structure inheritance. It's the responsibility of the buffer
52*61046927SAndroid Build Coastguard Worker * user to manage the list and remove the buffer from the list before
53*61046927SAndroid Build Coastguard Worker * freeing it.
54*61046927SAndroid Build Coastguard Worker */
55*61046927SAndroid Build Coastguard Worker struct list_head link;
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker struct pvr_winsys_bo *bo;
58*61046927SAndroid Build Coastguard Worker struct pvr_winsys_vma *vma;
59*61046927SAndroid Build Coastguard Worker uint32_t ref_count;
60*61046927SAndroid Build Coastguard Worker };
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker struct pvr_suballocator {
63*61046927SAndroid Build Coastguard Worker /* Pointer to the pvr_device this allocator is associated with */
64*61046927SAndroid Build Coastguard Worker struct pvr_device *device;
65*61046927SAndroid Build Coastguard Worker /* Pointer to one heap type (e.g. general, pds or usc) */
66*61046927SAndroid Build Coastguard Worker struct pvr_winsys_heap *heap;
67*61046927SAndroid Build Coastguard Worker /* Minimum size of the pvr_bo shared across multiple sub-allocations */
68*61046927SAndroid Build Coastguard Worker uint32_t default_size;
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker /* Mutex to protect access to all of the members below this point */
71*61046927SAndroid Build Coastguard Worker simple_mtx_t mtx;
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker /* Current buffer object where sub-allocations are made from */
74*61046927SAndroid Build Coastguard Worker struct pvr_bo *bo;
75*61046927SAndroid Build Coastguard Worker /* Previous buffer that can be used when a new buffer object is needed */
76*61046927SAndroid Build Coastguard Worker struct pvr_bo *bo_cached;
77*61046927SAndroid Build Coastguard Worker /* Track from where to start the next sub-allocation */
78*61046927SAndroid Build Coastguard Worker uint32_t next_offset;
79*61046927SAndroid Build Coastguard Worker };
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker struct pvr_suballoc_bo {
82*61046927SAndroid Build Coastguard Worker /* Since multiple components (command buffer, clear, descriptor sets,
83*61046927SAndroid Build Coastguard Worker * pipeline, SPM, etc.) can make use of linking sub-allocated bo(s), we
84*61046927SAndroid Build Coastguard Worker * add 'link' in pvr_suballoc_bo and avoid one extra level of structure
85*61046927SAndroid Build Coastguard Worker * inheritance. It is users' responsibility to manage the linked list,
86*61046927SAndroid Build Coastguard Worker * to remove sub-allocations before freeing it.
87*61046927SAndroid Build Coastguard Worker */
88*61046927SAndroid Build Coastguard Worker struct list_head link;
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker struct pvr_suballocator *allocator;
91*61046927SAndroid Build Coastguard Worker struct pvr_bo *bo;
92*61046927SAndroid Build Coastguard Worker pvr_dev_addr_t dev_addr;
93*61046927SAndroid Build Coastguard Worker uint64_t offset;
94*61046927SAndroid Build Coastguard Worker uint32_t size;
95*61046927SAndroid Build Coastguard Worker };
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker /**
98*61046927SAndroid Build Coastguard Worker * \brief Flag passed to #pvr_bo_alloc() to indicate that the buffer should be
99*61046927SAndroid Build Coastguard Worker * CPU accessible. This is required in order to map a buffer with
100*61046927SAndroid Build Coastguard Worker * #pvr_bo_cpu_map().
101*61046927SAndroid Build Coastguard Worker */
102*61046927SAndroid Build Coastguard Worker #define PVR_BO_ALLOC_FLAG_CPU_ACCESS BITFIELD_BIT(0U)
103*61046927SAndroid Build Coastguard Worker /**
104*61046927SAndroid Build Coastguard Worker * \brief Flag passed to #pvr_bo_alloc() to indicate that the buffer should
105*61046927SAndroid Build Coastguard Worker * be mapped to the CPU. Implies #PVR_BO_ALLOC_FLAG_CPU_ACCESS.
106*61046927SAndroid Build Coastguard Worker */
107*61046927SAndroid Build Coastguard Worker #define PVR_BO_ALLOC_FLAG_CPU_MAPPED BITFIELD_BIT(1U)
108*61046927SAndroid Build Coastguard Worker /**
109*61046927SAndroid Build Coastguard Worker * \brief Flag passed to #pvr_bo_alloc() to indicate that the buffer should be
110*61046927SAndroid Build Coastguard Worker * mapped to the GPU as uncached.
111*61046927SAndroid Build Coastguard Worker */
112*61046927SAndroid Build Coastguard Worker #define PVR_BO_ALLOC_FLAG_GPU_UNCACHED BITFIELD_BIT(2U)
113*61046927SAndroid Build Coastguard Worker /**
114*61046927SAndroid Build Coastguard Worker * \brief Flag passed to #pvr_bo_alloc() to indicate that the buffer GPU mapping
115*61046927SAndroid Build Coastguard Worker * should be restricted to only allow access to the Parameter Manager unit and
116*61046927SAndroid Build Coastguard Worker * firmware processor.
117*61046927SAndroid Build Coastguard Worker */
118*61046927SAndroid Build Coastguard Worker #define PVR_BO_ALLOC_FLAG_PM_FW_PROTECT BITFIELD_BIT(3U)
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker VkResult pvr_bo_alloc(struct pvr_device *device,
121*61046927SAndroid Build Coastguard Worker struct pvr_winsys_heap *heap,
122*61046927SAndroid Build Coastguard Worker uint64_t size,
123*61046927SAndroid Build Coastguard Worker uint64_t alignment,
124*61046927SAndroid Build Coastguard Worker uint64_t flags,
125*61046927SAndroid Build Coastguard Worker struct pvr_bo **const bo_out);
126*61046927SAndroid Build Coastguard Worker VkResult pvr_bo_cpu_map(struct pvr_device *device, struct pvr_bo *bo);
127*61046927SAndroid Build Coastguard Worker void pvr_bo_cpu_unmap(struct pvr_device *device, struct pvr_bo *bo);
128*61046927SAndroid Build Coastguard Worker void pvr_bo_free(struct pvr_device *device, struct pvr_bo *bo);
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker void pvr_bo_suballocator_init(struct pvr_suballocator *allocator,
131*61046927SAndroid Build Coastguard Worker struct pvr_winsys_heap *heap,
132*61046927SAndroid Build Coastguard Worker struct pvr_device *device,
133*61046927SAndroid Build Coastguard Worker uint32_t default_size);
134*61046927SAndroid Build Coastguard Worker void pvr_bo_suballocator_fini(struct pvr_suballocator *suballoc);
135*61046927SAndroid Build Coastguard Worker VkResult pvr_bo_suballoc(struct pvr_suballocator *allocator,
136*61046927SAndroid Build Coastguard Worker uint32_t size,
137*61046927SAndroid Build Coastguard Worker uint32_t alignment,
138*61046927SAndroid Build Coastguard Worker bool zero_on_alloc,
139*61046927SAndroid Build Coastguard Worker struct pvr_suballoc_bo **const suballoc_bo_out);
140*61046927SAndroid Build Coastguard Worker void pvr_bo_suballoc_free(struct pvr_suballoc_bo *suballoc_bo);
141*61046927SAndroid Build Coastguard Worker void *pvr_bo_suballoc_get_map_addr(const struct pvr_suballoc_bo *suballoc_bo);
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker #if defined(HAVE_VALGRIND)
144*61046927SAndroid Build Coastguard Worker VkResult pvr_bo_cpu_map_unchanged(struct pvr_device *device,
145*61046927SAndroid Build Coastguard Worker struct pvr_bo *pvr_bo);
146*61046927SAndroid Build Coastguard Worker #else /* defined(HAVE_VALGRIND) */
147*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE VkResult
pvr_bo_cpu_map_unchanged(struct pvr_device * device,struct pvr_bo * pvr_bo)148*61046927SAndroid Build Coastguard Worker pvr_bo_cpu_map_unchanged(struct pvr_device *device, struct pvr_bo *pvr_bo)
149*61046927SAndroid Build Coastguard Worker {
150*61046927SAndroid Build Coastguard Worker return pvr_bo_cpu_map(device, pvr_bo);
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker #endif /* defined(HAVE_VALGRIND) */
153*61046927SAndroid Build Coastguard Worker
154*61046927SAndroid Build Coastguard Worker struct pvr_bo_store;
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker VkResult pvr_bo_store_create(struct pvr_device *device);
157*61046927SAndroid Build Coastguard Worker void pvr_bo_store_destroy(struct pvr_device *device);
158*61046927SAndroid Build Coastguard Worker struct pvr_bo *pvr_bo_store_lookup(struct pvr_device *device,
159*61046927SAndroid Build Coastguard Worker pvr_dev_addr_t addr);
160*61046927SAndroid Build Coastguard Worker bool pvr_bo_store_dump(struct pvr_device *device);
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker void pvr_bo_list_dump(struct pvr_dump_ctx *ctx,
163*61046927SAndroid Build Coastguard Worker const struct list_head *bo_list,
164*61046927SAndroid Build Coastguard Worker uint32_t bo_size);
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker #endif /* PVR_BO_H */
167