• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Alyssa Rosenzweig <alyssa@rosenzweig.io>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #ifndef __AGX_DEVICE_H
25 #define __AGX_DEVICE_H
26 
27 #include "util/sparse_array.h"
28 #include "io.h"
29 #include "agx_formats.h"
30 
31 #if __APPLE__
32 #include <mach/mach.h>
33 #include <IOKit/IOKitLib.h>
34 #endif
35 
36 enum agx_dbg {
37    AGX_DBG_TRACE = BITFIELD_BIT(0),
38    AGX_DBG_DEQP  = BITFIELD_BIT(1),
39    AGX_DBG_NO16  = BITFIELD_BIT(2),
40 };
41 
42 struct agx_device {
43    void *memctx;
44    uint32_t debug;
45 
46    /* XXX What to bind to? I don't understand the IOGPU UABI */
47    struct agx_command_queue queue;
48    struct agx_bo cmdbuf, memmap;
49    uint64_t next_global_id, last_global_id;
50 
51    /* Device handle */
52 #if __APPLE__
53    io_connect_t fd;
54 #else
55    int fd;
56 #endif
57 
58    pthread_mutex_t bo_map_lock;
59    struct util_sparse_array bo_map;
60 
61    /* Fixed shaders */
62    struct {
63       struct agx_bo *bo;
64       uint32_t clear;
65       uint32_t store;
66    } internal;
67 
68    struct {
69       struct agx_bo *bo;
70       uint32_t format[AGX_NUM_FORMATS];
71    } reload;
72 };
73 
74 bool
75 agx_open_device(void *memctx, struct agx_device *dev);
76 
77 void
78 agx_close_device(struct agx_device *dev);
79 
80 static inline struct agx_bo *
agx_lookup_bo(struct agx_device * dev,uint32_t handle)81 agx_lookup_bo(struct agx_device *dev, uint32_t handle)
82 {
83    return util_sparse_array_get(&dev->bo_map, handle);
84 }
85 
86 struct agx_bo
87 agx_shmem_alloc(struct agx_device *dev, size_t size, bool cmdbuf);
88 
89 void
90 agx_shmem_free(struct agx_device *dev, unsigned handle);
91 
92 uint64_t
93 agx_get_global_id(struct agx_device *dev);
94 
95 struct agx_command_queue
96 agx_create_command_queue(struct agx_device *dev);
97 
98 void
99 agx_submit_cmdbuf(struct agx_device *dev, unsigned cmdbuf, unsigned mappings, uint64_t scalar);
100 
101 void
102 agx_wait_queue(struct agx_command_queue queue);
103 
104 #endif
105