• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Alyssa Rosenzweig <alyssa@rosenzweig.io>
3  * © Copyright 2019 Collabora, Ltd.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 
25 #ifndef __AGX_BO_H
26 #define __AGX_BO_H
27 
28 #include <stdbool.h>
29 #include <stddef.h>
30 #include <stdint.h>
31 
32 struct agx_device;
33 
34 enum agx_alloc_type {
35    AGX_ALLOC_REGULAR = 0,
36    AGX_ALLOC_MEMMAP = 1,
37    AGX_ALLOC_CMDBUF = 2,
38    AGX_NUM_ALLOC,
39 };
40 
41 struct agx_ptr {
42    /* If CPU mapped, CPU address. NULL if not mapped */
43    void *cpu;
44 
45    /* If type REGULAR, mapped GPU address */
46    uint64_t gpu;
47 };
48 
49 struct agx_bo {
50    enum agx_alloc_type type;
51 
52    /* Creation attributes */
53    unsigned flags;
54    size_t size;
55 
56    /* Mapping */
57    struct agx_ptr ptr;
58 
59    /* Index unique only up to type, process-local */
60    uint32_t handle;
61 
62    /* Globally unique value (system wide) for tracing. Exists for resources,
63     * command buffers, GPU submissions, segments, segmentent lists, encoders,
64     * accelerators, and channels. Corresponds to Instruments' magic table
65     * metal-gpu-submission-to-command-buffer-id */
66    uint64_t guid;
67 
68    /* Human-readable label, or NULL if none */
69    char *name;
70 
71    /* Owner */
72    struct agx_device *dev;
73 
74    /* Update atomically */
75    int32_t refcnt;
76 
77    /* Used while decoding, marked read-only */
78    bool ro;
79 
80    /* Used while decoding, mapped */
81    bool mapped;
82 };
83 
84 struct agx_bo *
85 agx_bo_create(struct agx_device *dev, unsigned size, unsigned flags);
86 
87 void agx_bo_reference(struct agx_bo *bo);
88 void agx_bo_unreference(struct agx_bo *bo);
89 
90 #endif
91