1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #pragma once
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
9*61046927SAndroid Build Coastguard Worker #include "agx_bo.h"
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #if __APPLE__
12*61046927SAndroid Build Coastguard Worker #include <IOKit/IODataQueueClient.h>
13*61046927SAndroid Build Coastguard Worker #include <mach/mach.h>
14*61046927SAndroid Build Coastguard Worker #endif
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker /*
17*61046927SAndroid Build Coastguard Worker * This file contains necessary defines for the macOS (IOKit) interface to the
18*61046927SAndroid Build Coastguard Worker * AGX accelerator, required to build a userspace graphics driver on macOS.
19*61046927SAndroid Build Coastguard Worker *
20*61046927SAndroid Build Coastguard Worker * They are not used under Linux.
21*61046927SAndroid Build Coastguard Worker *
22*61046927SAndroid Build Coastguard Worker * Information is this file was originally determined independently. More
23*61046927SAndroid Build Coastguard Worker * recently, names have been augmented via the oob_timestamp code sample from
24*61046927SAndroid Build Coastguard Worker * Project Zero [1]
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker * [1] https://bugs.chromium.org/p/project-zero/issues/detail?id=1986
27*61046927SAndroid Build Coastguard Worker */
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #define AGX_SERVICE_TYPE 0x100005
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker enum agx_selector {
32*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_GET_GLOBAL_IDS = 0x6,
33*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_SET_API = 0x7,
34*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_CREATE_COMMAND_QUEUE = 0x8,
35*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_FREE_COMMAND_QUEUE = 0x9,
36*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_ALLOCATE_MEM = 0xA,
37*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_FREE_MEM = 0xB,
38*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_CREATE_SHMEM = 0xF,
39*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_FREE_SHMEM = 0x10,
40*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_CREATE_NOTIFICATION_QUEUE = 0x11,
41*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_FREE_NOTIFICATION_QUEUE = 0x12,
42*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_SUBMIT_COMMAND_BUFFERS = 0x1E,
43*61046927SAndroid Build Coastguard Worker AGX_SELECTOR_GET_VERSION = 0x23,
44*61046927SAndroid Build Coastguard Worker AGX_NUM_SELECTORS = 0x32
45*61046927SAndroid Build Coastguard Worker };
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker static const char *selector_table[AGX_NUM_SELECTORS] = {
48*61046927SAndroid Build Coastguard Worker "unk0",
49*61046927SAndroid Build Coastguard Worker "unk1",
50*61046927SAndroid Build Coastguard Worker "unk2",
51*61046927SAndroid Build Coastguard Worker "unk3",
52*61046927SAndroid Build Coastguard Worker "unk4",
53*61046927SAndroid Build Coastguard Worker "unk5",
54*61046927SAndroid Build Coastguard Worker "GET_GLOBAL_IDS",
55*61046927SAndroid Build Coastguard Worker "SET_API",
56*61046927SAndroid Build Coastguard Worker "CREATE_COMMAND_QUEUE",
57*61046927SAndroid Build Coastguard Worker "FREE_COMMAND_QUEUE",
58*61046927SAndroid Build Coastguard Worker "ALLOCATE_MEM",
59*61046927SAndroid Build Coastguard Worker "FREE_MEM",
60*61046927SAndroid Build Coastguard Worker "unkC",
61*61046927SAndroid Build Coastguard Worker "unkD",
62*61046927SAndroid Build Coastguard Worker "unkE",
63*61046927SAndroid Build Coastguard Worker "CREATE_SHMEM",
64*61046927SAndroid Build Coastguard Worker "FREE_SHMEM",
65*61046927SAndroid Build Coastguard Worker "CREATE_NOTIFICATION_QUEUE",
66*61046927SAndroid Build Coastguard Worker "FREE_NOTIFICATION_QUEUE",
67*61046927SAndroid Build Coastguard Worker "unk13",
68*61046927SAndroid Build Coastguard Worker "unk14",
69*61046927SAndroid Build Coastguard Worker "unk15",
70*61046927SAndroid Build Coastguard Worker "unk16",
71*61046927SAndroid Build Coastguard Worker "unk17",
72*61046927SAndroid Build Coastguard Worker "unk18",
73*61046927SAndroid Build Coastguard Worker "unk19",
74*61046927SAndroid Build Coastguard Worker "unk1A",
75*61046927SAndroid Build Coastguard Worker "unk1B",
76*61046927SAndroid Build Coastguard Worker "unk1C",
77*61046927SAndroid Build Coastguard Worker "unk1D",
78*61046927SAndroid Build Coastguard Worker "SUBMIT_COMMAND_BUFFERS",
79*61046927SAndroid Build Coastguard Worker "unk1F",
80*61046927SAndroid Build Coastguard Worker "unk20",
81*61046927SAndroid Build Coastguard Worker "unk21",
82*61046927SAndroid Build Coastguard Worker "unk22",
83*61046927SAndroid Build Coastguard Worker "GET_VERSION",
84*61046927SAndroid Build Coastguard Worker "unk24",
85*61046927SAndroid Build Coastguard Worker "unk25",
86*61046927SAndroid Build Coastguard Worker "unk26",
87*61046927SAndroid Build Coastguard Worker "unk27",
88*61046927SAndroid Build Coastguard Worker "unk28",
89*61046927SAndroid Build Coastguard Worker "unk29",
90*61046927SAndroid Build Coastguard Worker "unk2A",
91*61046927SAndroid Build Coastguard Worker "unk2B",
92*61046927SAndroid Build Coastguard Worker "unk2C",
93*61046927SAndroid Build Coastguard Worker "unk2D",
94*61046927SAndroid Build Coastguard Worker "unk2E",
95*61046927SAndroid Build Coastguard Worker "unk2F",
96*61046927SAndroid Build Coastguard Worker "unk30",
97*61046927SAndroid Build Coastguard Worker "unk31"};
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker static inline const char *
wrap_selector_name(uint32_t selector)100*61046927SAndroid Build Coastguard Worker wrap_selector_name(uint32_t selector)
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker return (selector < AGX_NUM_SELECTORS) ? selector_table[selector] : "unk??";
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker struct agx_create_command_queue_resp {
106*61046927SAndroid Build Coastguard Worker uint64_t id;
107*61046927SAndroid Build Coastguard Worker uint32_t unk2; // 90 0A 08 27
108*61046927SAndroid Build Coastguard Worker uint32_t unk3; // 0
109*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker struct agx_create_shmem_resp {
112*61046927SAndroid Build Coastguard Worker /* IOAccelDeviceShmemData */
113*61046927SAndroid Build Coastguard Worker void *map;
114*61046927SAndroid Build Coastguard Worker uint32_t size;
115*61046927SAndroid Build Coastguard Worker uint32_t id;
116*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker struct agx_create_notification_queue_resp {
119*61046927SAndroid Build Coastguard Worker #ifdef __APPLE__
120*61046927SAndroid Build Coastguard Worker IODataQueueMemory *queue;
121*61046927SAndroid Build Coastguard Worker #else
122*61046927SAndroid Build Coastguard Worker void *queue;
123*61046927SAndroid Build Coastguard Worker #endif
124*61046927SAndroid Build Coastguard Worker uint32_t unk2; // 1
125*61046927SAndroid Build Coastguard Worker uint32_t unk3; // 0
126*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker struct IOAccelCommandQueueSubmitArgs_Header {
129*61046927SAndroid Build Coastguard Worker uint32_t unk0;
130*61046927SAndroid Build Coastguard Worker uint32_t count;
131*61046927SAndroid Build Coastguard Worker };
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker struct IOAccelCommandQueueSubmitArgs_Command {
134*61046927SAndroid Build Coastguard Worker uint32_t command_buffer_shmem_id;
135*61046927SAndroid Build Coastguard Worker uint32_t segment_list_shmem_id;
136*61046927SAndroid Build Coastguard Worker uint64_t unk1B; // 0, new in 12.x
137*61046927SAndroid Build Coastguard Worker uint64_t notify_1;
138*61046927SAndroid Build Coastguard Worker uint64_t notify_2;
139*61046927SAndroid Build Coastguard Worker uint32_t unk2;
140*61046927SAndroid Build Coastguard Worker uint32_t unk3;
141*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker /* Memory allocation isn't really understood yet. By comparing SHADER/CMDBUF_32
144*61046927SAndroid Build Coastguard Worker * vs everything else, it appears the 0x40000000 bit indicates the GPU VA must
145*61046927SAndroid Build Coastguard Worker * be be in the first 4GiB */
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker enum agx_memory_type {
148*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_NORMAL = 0x00000000, /* used for user allocations */
149*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_UNK = 0x08000000, /* unknown */
150*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_CMDBUF_64 = 0x18000000, /* used for command buffer storage */
151*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_SHADER =
152*61046927SAndroid Build Coastguard Worker 0x48000000, /* used for shader memory, with VA = 0 */
153*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_CMDBUF_32 =
154*61046927SAndroid Build Coastguard Worker 0x58000000, /* used for command buffers, with VA < 32-bit */
155*61046927SAndroid Build Coastguard Worker AGX_MEMORY_TYPE_FRAMEBUFFER = 0x00888F00, /* used for framebuffer backing */
156*61046927SAndroid Build Coastguard Worker };
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker static inline const char *
agx_memory_type_name(uint32_t type)159*61046927SAndroid Build Coastguard Worker agx_memory_type_name(uint32_t type)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker switch (type) {
162*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_NORMAL:
163*61046927SAndroid Build Coastguard Worker return "normal";
164*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_UNK:
165*61046927SAndroid Build Coastguard Worker return "unk";
166*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_CMDBUF_64:
167*61046927SAndroid Build Coastguard Worker return "cmdbuf_64";
168*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_SHADER:
169*61046927SAndroid Build Coastguard Worker return "shader";
170*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_CMDBUF_32:
171*61046927SAndroid Build Coastguard Worker return "cmdbuf_32";
172*61046927SAndroid Build Coastguard Worker case AGX_MEMORY_TYPE_FRAMEBUFFER:
173*61046927SAndroid Build Coastguard Worker return "framebuffer";
174*61046927SAndroid Build Coastguard Worker default:
175*61046927SAndroid Build Coastguard Worker return NULL;
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker struct agx_allocate_resource_req {
180*61046927SAndroid Build Coastguard Worker uint32_t unk0[5];
181*61046927SAndroid Build Coastguard Worker uint32_t mode;
182*61046927SAndroid Build Coastguard Worker uint32_t unk6[6];
183*61046927SAndroid Build Coastguard Worker uint64_t cpu_fixed;
184*61046927SAndroid Build Coastguard Worker uint64_t cpu_fixed_parent;
185*61046927SAndroid Build Coastguard Worker uint32_t size;
186*61046927SAndroid Build Coastguard Worker uint32_t unk17;
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker /* Handle of the parent resource when a suballocation is requested.
189*61046927SAndroid Build Coastguard Worker * Based on an assertion failure, this corresponds to:
190*61046927SAndroid Build Coastguard Worker *
191*61046927SAndroid Build Coastguard Worker * -[IOGPUMetalBuffer
192*61046927SAndroid Build Coastguard Worker * initWithPrimaryBuffer:heapIndex:bufferIndex:bufferOffset:length:args:argsSize:]
193*61046927SAndroid Build Coastguard Worker */
194*61046927SAndroid Build Coastguard Worker uint32_t parent;
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker uint32_t unk19;
197*61046927SAndroid Build Coastguard Worker uint32_t flags;
198*61046927SAndroid Build Coastguard Worker uint32_t unk21[3];
199*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker struct agx_allocate_resource_resp {
202*61046927SAndroid Build Coastguard Worker /* Returned GPU virtual address */
203*61046927SAndroid Build Coastguard Worker uint64_t gpu_va;
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker /* Returned CPU virtual address */
206*61046927SAndroid Build Coastguard Worker uint64_t cpu;
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker uint32_t unk4[3];
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker /* Handle used to identify the resource in the segment list */
211*61046927SAndroid Build Coastguard Worker uint32_t handle;
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker /* Size of the root resource from which we are allocated. If this is not a
214*61046927SAndroid Build Coastguard Worker * suballocation, this is equal to the size.
215*61046927SAndroid Build Coastguard Worker */
216*61046927SAndroid Build Coastguard Worker uint64_t root_size;
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker /* Globally unique identifier for the resource, shown in Instruments */
219*61046927SAndroid Build Coastguard Worker uint32_t guid;
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker uint32_t unk11[7];
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker /* Maximum size of the suballocation. For a suballocation, this equals:
224*61046927SAndroid Build Coastguard Worker *
225*61046927SAndroid Build Coastguard Worker * sub_size = root_size - (sub_cpu - root_cpu)
226*61046927SAndroid Build Coastguard Worker *
227*61046927SAndroid Build Coastguard Worker * For root allocations, this equals the size.
228*61046927SAndroid Build Coastguard Worker */
229*61046927SAndroid Build Coastguard Worker uint64_t sub_size;
230*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Worker struct agx_notification_queue {
233*61046927SAndroid Build Coastguard Worker #ifdef __APPLE__
234*61046927SAndroid Build Coastguard Worker mach_port_t port;
235*61046927SAndroid Build Coastguard Worker IODataQueueMemory *queue;
236*61046927SAndroid Build Coastguard Worker #else
237*61046927SAndroid Build Coastguard Worker unsigned port;
238*61046927SAndroid Build Coastguard Worker void *queue;
239*61046927SAndroid Build Coastguard Worker #endif
240*61046927SAndroid Build Coastguard Worker unsigned id;
241*61046927SAndroid Build Coastguard Worker };
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker struct agx_command_queue {
244*61046927SAndroid Build Coastguard Worker unsigned id;
245*61046927SAndroid Build Coastguard Worker struct agx_notification_queue notif;
246*61046927SAndroid Build Coastguard Worker };
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker struct agx_map_header {
249*61046927SAndroid Build Coastguard Worker /* IOAccelSegmentListHeader */
250*61046927SAndroid Build Coastguard Worker uint64_t cmdbuf_id; // GUID
251*61046927SAndroid Build Coastguard Worker uint32_t segment_count;
252*61046927SAndroid Build Coastguard Worker uint16_t length;
253*61046927SAndroid Build Coastguard Worker uint16_t unk; // 0x8000
254*61046927SAndroid Build Coastguard Worker uint64_t encoder_id; // GUID
255*61046927SAndroid Build Coastguard Worker
256*61046927SAndroid Build Coastguard Worker /* IOAccelSegmentResourceListHeader */
257*61046927SAndroid Build Coastguard Worker uint32_t kernel_commands_start_offset;
258*61046927SAndroid Build Coastguard Worker uint32_t kernel_commands_end_offset;
259*61046927SAndroid Build Coastguard Worker uint32_t padding[2];
260*61046927SAndroid Build Coastguard Worker uint32_t total_resources;
261*61046927SAndroid Build Coastguard Worker uint32_t resource_group_count;
262*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker /* IOAccelSegmentResourceList_ResourceGroup */
265*61046927SAndroid Build Coastguard Worker struct agx_map_entry {
266*61046927SAndroid Build Coastguard Worker uint32_t resource_id[6];
267*61046927SAndroid Build Coastguard Worker uint32_t resource_unk[6];
268*61046927SAndroid Build Coastguard Worker uint16_t resource_flags[6];
269*61046927SAndroid Build Coastguard Worker uint16_t unka; // ff ff
270*61046927SAndroid Build Coastguard Worker uint16_t resource_count;
271*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker uint64_t agx_get_global_id(struct agx_device *dev);
274