xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/GoldfishAddressSpace/include/address_space.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2023 Google
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #pragma once
7 
8 #include <inttypes.h>
9 #include <stddef.h>
10 
11 #if defined(__Fuchsia__)
12     typedef void* address_space_handle_t;
13 #else
14     typedef int address_space_handle_t;
15 #endif
16 
17 enum AddressSpaceSubdeviceType {
18     NoSubdevice = -1,
19     Graphics = 0,
20     Media = 1,
21     HostMemoryAllocator = 5,
22     SharedSlotsHostMemoryAllocator = 6,
23     VirtioGpuGraphics = 10,
24 };
25 
26 // We also expose the ping info struct that is shared between host and guest.
27 struct address_space_ping {
28     uint64_t offset;
29     uint64_t size;
30     uint64_t metadata;
31     uint32_t resourceId;
32     uint32_t wait_fd;
33     uint32_t wait_flags;
34     uint32_t direction;
35 };
36 
37 // typedef/struct to abstract over goldfish vs virtio-gpu implementations
38 typedef address_space_handle_t (*address_space_open_t)(void);
39 typedef void (*address_space_close_t)(address_space_handle_t);
40 
41 typedef bool (*address_space_allocate_t)(
42     address_space_handle_t, size_t size, uint64_t* phys_addr, uint64_t* offset);
43 typedef bool (*address_space_free_t)(
44     address_space_handle_t, uint64_t offset);
45 
46 typedef bool (*address_space_claim_shared_t)(
47     address_space_handle_t, uint64_t offset, uint64_t size);
48 typedef bool (*address_space_unclaim_shared_t)(
49     address_space_handle_t, uint64_t offset);
50 
51 // pgoff is the offset into the page to return in the result
52 typedef void* (*address_space_map_t)(
53     address_space_handle_t, uint64_t offset, uint64_t size, uint64_t pgoff);
54 typedef void (*address_space_unmap_t)(void* ptr, uint64_t size);
55 
56 typedef bool (*address_space_set_subdevice_type_t)(
57     address_space_handle_t, AddressSpaceSubdeviceType type, address_space_handle_t*);
58 typedef bool (*address_space_ping_t)(
59     address_space_handle_t, struct address_space_ping*);
60 
61 struct address_space_ops {
62     address_space_open_t open;
63     address_space_close_t close;
64     address_space_claim_shared_t claim_shared;
65     address_space_unclaim_shared_t unclaim_shared;
66     address_space_map_t map;
67     address_space_unmap_t unmap;
68     address_space_set_subdevice_type_t set_subdevice_type;
69     address_space_ping_t ping;
70 };
71