From db32b4a0641e8372aac15f01ea50bcd940ca00fc Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 2 Apr 2022 21:55:25 -0400 Subject: [PATCH] asahi: Sync some names with Project Zero This should clarify a few things I didn't get independently investigating the interface. Of coruse, I got other pieces... the sum of the parts is better :-) Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/lib/agx_device.c | 10 ++-- src/asahi/lib/decode.c | 12 ++--- src/asahi/lib/io.h | 77 ++++++++++++++++++------------- src/gallium/drivers/asahi/magic.c | 23 +++++---- 4 files changed, 67 insertions(+), 55 deletions(-) diff --git a/src/asahi/lib/agx_device.c b/src/asahi/lib/agx_device.c index 5fb8d9d1d43..796f2c4cc60 100644 --- a/src/asahi/lib/agx_device.c +++ b/src/asahi/lib/agx_device.c @@ -446,11 +446,11 @@ agx_submit_cmdbuf(struct agx_device *dev, unsigned cmdbuf, unsigned mappings, ui #if __APPLE__ struct agx_submit_cmdbuf_req req = { .unk0 = 0x10, - .unk1 = 0x1, - .cmdbuf = cmdbuf, - .mappings = mappings, - .user_0 = (void *) ((uintptr_t) 0xABCD), // Passed in the notif queue - .user_1 = (void *) ((uintptr_t) 0x1234), // Maybe pick better + .count = 1, + .command_buffer_shmem_id = cmdbuf, + .segment_list_shmem_id = mappings, + .notify_1 = 0xABCD, + .notify_2 = 0x1234, .unk2 = 0x0, .unk3 = 0x1, }; diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c index 5acd1c892f2..585e7a52328 100644 --- a/src/asahi/lib/decode.c +++ b/src/asahi/lib/decode.c @@ -125,18 +125,18 @@ agxdecode_validate_map(void *map) /* Check the header */ struct agx_map_header *hdr = map; - if (hdr->nr_entries == 0) { + if (hdr->resource_group_count == 0) { fprintf(stderr, "ERROR - empty map\n"); return; } /* Check the entries */ struct agx_map_entry *entries = ((void *) hdr) + sizeof(*hdr); - for (unsigned i = 0; i < hdr->nr_entries; ++i) { + for (unsigned i = 0; i < hdr->resource_group_count; ++i) { struct agx_map_entry entry = entries[i]; - for (unsigned j = 0; j < ARRAY_SIZE(entry.indices); ++j) { - unsigned handle = entry.indices[j]; + for (unsigned j = 0; j < ARRAY_SIZE(entry.resource_id); ++j) { + unsigned handle = entry.resource_id[j]; if (handle) { agxdecode_mark_mapped(handle); nr_handles++; @@ -145,9 +145,9 @@ agxdecode_validate_map(void *map) } /* Check the handle count */ - if (nr_handles != hdr->nr_handles) { + if (nr_handles != hdr->total_resources) { fprintf(stderr, "ERROR - wrong handle count, got %u, expected %u (%u entries)\n", - nr_handles, hdr->nr_handles, hdr->nr_entries); + nr_handles, hdr->total_resources, hdr->resource_group_count); } } diff --git a/src/asahi/lib/io.h b/src/asahi/lib/io.h index a1f442eaf48..35e00255e6d 100644 --- a/src/asahi/lib/io.h +++ b/src/asahi/lib/io.h @@ -32,6 +32,19 @@ #include #endif +/* + * This file contains necessary defines for the macOS (IOKit) interface to the + * AGX accelerator, required to build a userspace graphics driver on macOS. + * + * They are not used under Linux. + * + * Information is this file was originally determined independently. More + * recently, names have been augmented via the oob_timestamp code sample from + * Project Zero [1] + * + * [1] https://bugs.chromium.org/p/project-zero/issues/detail?id=1986 + */ + #define AGX_SERVICE_TYPE 0x100005 enum agx_selector { @@ -116,9 +129,10 @@ struct agx_create_command_queue_resp { } __attribute__((packed)); struct agx_create_shmem_resp { - void *map; - uint32_t size; - uint32_t id; + /* IOAccelDeviceShmemData */ + void *map; + uint32_t size; + uint32_t id; } __attribute__((packed)); struct agx_create_notification_queue_resp { @@ -132,15 +146,18 @@ struct agx_create_notification_queue_resp { } __attribute__((packed)); struct agx_submit_cmdbuf_req { - uint32_t unk0; - uint32_t unk1; - uint32_t cmdbuf; - uint32_t mappings; + /* IOAccelCommandQueueSubmitArgs_Header */ + uint32_t unk0; + uint32_t count; + + /* IOAccelCommandQueueSubmitArgs_Command */ + uint32_t command_buffer_shmem_id; + uint32_t segment_list_shmem_id; uint64_t unk1B; // 0, new in 12.x - void *user_0; - void *user_1; - uint32_t unk2; - uint32_t unk3; + uint64_t notify_1; + uint64_t notify_2; + uint32_t unk2; + uint32_t unk3; } __attribute__((packed)); /* Memory allocation isn't really understood yet. By comparing SHADER/CMDBUF_32 @@ -186,32 +203,28 @@ struct agx_command_queue { struct agx_notification_queue notif; }; -/* Not sure if this is hardware or software defined */ - struct agx_map_header { - uint64_t cmdbuf_id; // GUID - uint32_t unk2; // 01 00 00 00 - uint32_t unk3; // 28 05 00 80, 12.x: 30 01 00 80 - uint64_t encoder_id; // GUID - uint32_t unk6; // 00 00 00 00 - uint32_t cmdbuf_size; + /* IOAccelSegmentListHeader */ + uint64_t cmdbuf_id; // GUID + uint32_t segment_count; + uint32_t length; + uint64_t encoder_id; // GUID + + /* IOAccelSegmentResourceListHeader */ + uint32_t kernel_commands_start_offset; + uint32_t kernel_commands_end_offset; uint32_t padding[2]; - uint32_t nr_handles; - uint32_t nr_entries; + uint32_t total_resources; + uint32_t resource_group_count; } __attribute__((packed)); +/* IOAccelSegmentResourceList_ResourceGroup */ struct agx_map_entry { - uint32_t indices[6]; - uint32_t unkAAA; // 20 00 00 00 - uint32_t unk2; // 00 00 00 00 - uint32_t unk3; // 00 00 00 00 - uint32_t unk4; // 00 00 00 00 - uint32_t unk5; // 00 00 00 00 - uint32_t unk6; // 00 00 00 00 - uint32_t unkBBB; // 01 00 00 00 - uint32_t unk8; // 00 00 00 00 - uint32_t unk9; // 00 00 00 00 - uint32_t unka; // ff ff 01 00 + uint32_t resource_id[6]; + uint32_t resource_unk[6]; + uint16_t resource_flags[6]; + uint16_t unka; // ff ff + uint16_t resource_count; } __attribute__((packed)); uint64_t diff --git a/src/gallium/drivers/asahi/magic.c b/src/gallium/drivers/asahi/magic.c index 7e0066941ef..14d1fd96bc9 100644 --- a/src/gallium/drivers/asahi/magic.c +++ b/src/gallium/drivers/asahi/magic.c @@ -279,15 +279,13 @@ demo_map_header(uint64_t cmdbuf_id, uint64_t encoder_id, unsigned cmdbuf_size, u { return (struct agx_map_header) { .cmdbuf_id = cmdbuf_id, - .unk2 = 0x1, - .unk3 = 0x528, // 1320 + .segment_count = 1, + .length = 0x130, .encoder_id = encoder_id, - .unk6 = 0x0, - .cmdbuf_size = cmdbuf_size, - - /* +1 for the sentinel ending */ - .nr_entries = count, - .nr_handles = count, + .kernel_commands_start_offset = 0, + .kernel_commands_end_offset = cmdbuf_size, + .total_resources = count, + .resource_group_count = count, }; } @@ -306,10 +304,11 @@ demo_mem_map(void *map, size_t size, unsigned *handles, unsigned count, for (unsigned i = 0; i < count; ++i) { assert((entries + i) < end); entries[i] = (struct agx_map_entry) { - .indices = {handles[i]}, - .unkAAA = 0x20, - .unkBBB = 0x1, - .unka = 0x1ffff, + .resource_id = { handles[i] }, + .resource_unk = { 0x20 }, + .resource_flags = { 0x1 }, + .resource_count = 1, + .unka = 0xffff, }; } }