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