xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/agx_bo.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * Copyright 2019 Collabora, Ltd.
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #pragma once
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
10*61046927SAndroid Build Coastguard Worker #include <stddef.h>
11*61046927SAndroid Build Coastguard Worker #include <stdint.h>
12*61046927SAndroid Build Coastguard Worker #include <time.h>
13*61046927SAndroid Build Coastguard Worker #include "util/list.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker struct agx_device;
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker enum agx_bo_flags {
18*61046927SAndroid Build Coastguard Worker    /* BO is shared across processes (imported or exported) and therefore cannot
19*61046927SAndroid Build Coastguard Worker     * be cached locally
20*61046927SAndroid Build Coastguard Worker     */
21*61046927SAndroid Build Coastguard Worker    AGX_BO_SHARED = 1 << 0,
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker    /* BO must be allocated in the low 32-bits of VA space */
24*61046927SAndroid Build Coastguard Worker    AGX_BO_LOW_VA = 1 << 1,
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker    /* BO is executable */
27*61046927SAndroid Build Coastguard Worker    AGX_BO_EXEC = 1 << 2,
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker    /* BO should be mapped write-back on the CPU (else, write combine) */
30*61046927SAndroid Build Coastguard Worker    AGX_BO_WRITEBACK = 1 << 3,
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker    /* BO could potentially be shared (imported or exported) and therefore cannot
33*61046927SAndroid Build Coastguard Worker     * be allocated as private
34*61046927SAndroid Build Coastguard Worker     */
35*61046927SAndroid Build Coastguard Worker    AGX_BO_SHAREABLE = 1 << 4,
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker    /* BO is read-only from the GPU side
38*61046927SAndroid Build Coastguard Worker     */
39*61046927SAndroid Build Coastguard Worker    AGX_BO_READONLY = 1 << 5,
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker enum agx_va_flags {
43*61046927SAndroid Build Coastguard Worker    /* VA must be inside the USC region, otherwise unrestricted. */
44*61046927SAndroid Build Coastguard Worker    AGX_VA_USC = (1 << 0),
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker    /* VA must be fixed, otherwise allocated by the driver. */
47*61046927SAndroid Build Coastguard Worker    AGX_VA_FIXED = (1 << 1),
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker struct agx_va {
51*61046927SAndroid Build Coastguard Worker    enum agx_va_flags flags;
52*61046927SAndroid Build Coastguard Worker    uint64_t addr;
53*61046927SAndroid Build Coastguard Worker    uint64_t size_B;
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker struct agx_ptr {
57*61046927SAndroid Build Coastguard Worker    /* If CPU mapped, CPU address. NULL if not mapped */
58*61046927SAndroid Build Coastguard Worker    void *cpu;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    /* Mapped GPU address */
61*61046927SAndroid Build Coastguard Worker    uint64_t gpu;
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker struct agx_bo {
65*61046927SAndroid Build Coastguard Worker    /* Must be first for casting */
66*61046927SAndroid Build Coastguard Worker    struct list_head bucket_link;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    /* Used to link the BO to the BO cache LRU list. */
69*61046927SAndroid Build Coastguard Worker    struct list_head lru_link;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    /* The time this BO was used last, so we can evict stale BOs. */
72*61046927SAndroid Build Coastguard Worker    time_t last_used;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    /* Creation attributes */
75*61046927SAndroid Build Coastguard Worker    enum agx_bo_flags flags;
76*61046927SAndroid Build Coastguard Worker    size_t size;
77*61046927SAndroid Build Coastguard Worker    size_t align;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    /* Mapping */
80*61046927SAndroid Build Coastguard Worker    struct agx_va *va;
81*61046927SAndroid Build Coastguard Worker    void *map;
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    /* Process-local index */
84*61046927SAndroid Build Coastguard Worker    uint32_t handle;
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    /* DMA-BUF fd clone for adding fences to imports/exports */
87*61046927SAndroid Build Coastguard Worker    int prime_fd;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    /* Current writer, if any (queue in upper 32 bits, syncobj in lower 32 bits) */
90*61046927SAndroid Build Coastguard Worker    uint64_t writer;
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    /* Update atomically */
93*61046927SAndroid Build Coastguard Worker    int32_t refcnt;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    /* For debugging */
96*61046927SAndroid Build Coastguard Worker    const char *label;
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    /* virtio blob_id */
99*61046927SAndroid Build Coastguard Worker    uint32_t blob_id;
100*61046927SAndroid Build Coastguard Worker    uint32_t vbo_res_id;
101*61046927SAndroid Build Coastguard Worker };
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker static inline uint32_t
agx_bo_writer_syncobj(uint64_t writer)104*61046927SAndroid Build Coastguard Worker agx_bo_writer_syncobj(uint64_t writer)
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker    return writer;
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker static inline uint32_t
agx_bo_writer_queue(uint64_t writer)110*61046927SAndroid Build Coastguard Worker agx_bo_writer_queue(uint64_t writer)
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker    return writer >> 32;
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static inline uint64_t
agx_bo_writer(uint32_t queue,uint32_t syncobj)116*61046927SAndroid Build Coastguard Worker agx_bo_writer(uint32_t queue, uint32_t syncobj)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    return (((uint64_t)queue) << 32) | syncobj;
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker struct agx_bo *agx_bo_create(struct agx_device *dev, unsigned size,
122*61046927SAndroid Build Coastguard Worker                              unsigned align, enum agx_bo_flags flags,
123*61046927SAndroid Build Coastguard Worker                              const char *label);
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker void agx_bo_reference(struct agx_bo *bo);
126*61046927SAndroid Build Coastguard Worker void agx_bo_unreference(struct agx_device *dev, struct agx_bo *bo);
127*61046927SAndroid Build Coastguard Worker struct agx_bo *agx_bo_import(struct agx_device *dev, int fd);
128*61046927SAndroid Build Coastguard Worker int agx_bo_export(struct agx_device *dev, struct agx_bo *bo);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker void agx_bo_free(struct agx_device *dev, struct agx_bo *bo);
131*61046927SAndroid Build Coastguard Worker struct agx_bo *agx_bo_cache_fetch(struct agx_device *dev, size_t size,
132*61046927SAndroid Build Coastguard Worker                                   size_t align, uint32_t flags,
133*61046927SAndroid Build Coastguard Worker                                   const bool dontwait);
134*61046927SAndroid Build Coastguard Worker void agx_bo_cache_evict_all(struct agx_device *dev);
135