Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/etnaviv/drm/etnaviv_device.c
4564 views
1
/*
2
* Copyright (C) 2014 Etnaviv Project
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
* Authors:
24
* Christian Gmeiner <[email protected]>
25
*/
26
27
#include "util/hash_table.h"
28
#include "util/os_file.h"
29
30
#include "etnaviv_priv.h"
31
#include "etnaviv_drmif.h"
32
33
struct etna_device *etna_device_new(int fd)
34
{
35
struct etna_device *dev = calloc(sizeof(*dev), 1);
36
struct drm_etnaviv_param req = {
37
.param = ETNAVIV_PARAM_SOFTPIN_START_ADDR,
38
};
39
int ret;
40
41
if (!dev)
42
return NULL;
43
44
p_atomic_set(&dev->refcnt, 1);
45
dev->fd = fd;
46
dev->handle_table = _mesa_hash_table_create(NULL, _mesa_hash_u32, _mesa_key_u32_equal);
47
dev->name_table = _mesa_hash_table_create(NULL, _mesa_hash_u32, _mesa_key_u32_equal);
48
etna_bo_cache_init(&dev->bo_cache);
49
50
ret = drmCommandWriteRead(dev->fd, DRM_ETNAVIV_GET_PARAM, &req, sizeof(req));
51
if (!ret && req.value != ~0ULL) {
52
const uint64_t _4GB = 1ull << 32;
53
54
util_vma_heap_init(&dev->address_space, req.value, _4GB - req.value);
55
dev->use_softpin = 1;
56
}
57
58
return dev;
59
}
60
61
/* like etna_device_new() but creates it's own private dup() of the fd
62
* which is close()d when the device is finalized. */
63
struct etna_device *etna_device_new_dup(int fd)
64
{
65
int dup_fd = os_dupfd_cloexec(fd);
66
struct etna_device *dev = etna_device_new(dup_fd);
67
68
if (dev)
69
dev->closefd = 1;
70
else
71
close(dup_fd);
72
73
return dev;
74
}
75
76
struct etna_device *etna_device_ref(struct etna_device *dev)
77
{
78
p_atomic_inc(&dev->refcnt);
79
80
return dev;
81
}
82
83
static void etna_device_del_impl(struct etna_device *dev)
84
{
85
etna_bo_cache_cleanup(&dev->bo_cache, 0);
86
87
if (dev->use_softpin)
88
util_vma_heap_finish(&dev->address_space);
89
90
_mesa_hash_table_destroy(dev->handle_table, NULL);
91
_mesa_hash_table_destroy(dev->name_table, NULL);
92
93
if (dev->closefd)
94
close(dev->fd);
95
96
free(dev);
97
}
98
99
void etna_device_del_locked(struct etna_device *dev)
100
{
101
simple_mtx_assert_locked(&etna_drm_table_lock);
102
103
if (!p_atomic_dec_zero(&dev->refcnt))
104
return;
105
106
etna_device_del_impl(dev);
107
}
108
109
void etna_device_del(struct etna_device *dev)
110
{
111
if (!p_atomic_dec_zero(&dev->refcnt))
112
return;
113
114
simple_mtx_lock(&etna_drm_table_lock);
115
etna_device_del_impl(dev);
116
simple_mtx_unlock(&etna_drm_table_lock);
117
}
118
119
int etna_device_fd(struct etna_device *dev)
120
{
121
return dev->fd;
122
}
123
124
bool etnaviv_device_softpin_capable(struct etna_device *dev)
125
{
126
return !!dev->use_softpin;
127
}
128
129