xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/agx_va.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "agx_bo.h"
7*61046927SAndroid Build Coastguard Worker #include "agx_device.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker static struct util_vma_heap *
agx_vma_heap(struct agx_device * dev,enum agx_va_flags flags)10*61046927SAndroid Build Coastguard Worker agx_vma_heap(struct agx_device *dev, enum agx_va_flags flags)
11*61046927SAndroid Build Coastguard Worker {
12*61046927SAndroid Build Coastguard Worker    return (flags & AGX_VA_USC) ? &dev->usc_heap : &dev->main_heap;
13*61046927SAndroid Build Coastguard Worker }
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker struct agx_va *
agx_va_alloc(struct agx_device * dev,uint32_t size_B,uint32_t align_B,enum agx_va_flags flags,uint64_t fixed_va)16*61046927SAndroid Build Coastguard Worker agx_va_alloc(struct agx_device *dev, uint32_t size_B, uint32_t align_B,
17*61046927SAndroid Build Coastguard Worker              enum agx_va_flags flags, uint64_t fixed_va)
18*61046927SAndroid Build Coastguard Worker {
19*61046927SAndroid Build Coastguard Worker    assert((fixed_va != 0) == !!(flags & AGX_VA_FIXED));
20*61046927SAndroid Build Coastguard Worker    assert((fixed_va % align_B) == 0);
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker    /* All allocations need a guard at the end to prevent overreads.
23*61046927SAndroid Build Coastguard Worker     *
24*61046927SAndroid Build Coastguard Worker     * TODO: Even with soft fault?
25*61046927SAndroid Build Coastguard Worker     */
26*61046927SAndroid Build Coastguard Worker    size_B += dev->guard_size;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    struct util_vma_heap *heap = agx_vma_heap(dev, flags);
29*61046927SAndroid Build Coastguard Worker    uint64_t addr = 0;
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&dev->vma_lock);
32*61046927SAndroid Build Coastguard Worker    if (flags & AGX_VA_FIXED) {
33*61046927SAndroid Build Coastguard Worker       if (util_vma_heap_alloc_addr(heap, fixed_va, size_B))
34*61046927SAndroid Build Coastguard Worker          addr = fixed_va;
35*61046927SAndroid Build Coastguard Worker    } else {
36*61046927SAndroid Build Coastguard Worker       addr = util_vma_heap_alloc(heap, size_B, align_B);
37*61046927SAndroid Build Coastguard Worker    }
38*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&dev->vma_lock);
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    if (addr == 0)
41*61046927SAndroid Build Coastguard Worker       return NULL;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    struct agx_va *va = malloc(sizeof(struct agx_va));
44*61046927SAndroid Build Coastguard Worker    *va = (struct agx_va){
45*61046927SAndroid Build Coastguard Worker       .flags = flags,
46*61046927SAndroid Build Coastguard Worker       .size_B = size_B,
47*61046927SAndroid Build Coastguard Worker       .addr = addr,
48*61046927SAndroid Build Coastguard Worker    };
49*61046927SAndroid Build Coastguard Worker    return va;
50*61046927SAndroid Build Coastguard Worker }
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker void
agx_va_free(struct agx_device * dev,struct agx_va * va)53*61046927SAndroid Build Coastguard Worker agx_va_free(struct agx_device *dev, struct agx_va *va)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker    if (!va)
56*61046927SAndroid Build Coastguard Worker       return;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    struct util_vma_heap *heap = agx_vma_heap(dev, va->flags);
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&dev->vma_lock);
61*61046927SAndroid Build Coastguard Worker    util_vma_heap_free(heap, va->addr, va->size_B);
62*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&dev->vma_lock);
63*61046927SAndroid Build Coastguard Worker    free(va);
64*61046927SAndroid Build Coastguard Worker }
65