mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
asahi: Add a shared library interface for decode
Add a simple API so that decode can be used as a shared library by the Python hypervisor. Note that this is not thread-safe. If we ever want to use this in other contexts with thread safety, it will need a refactor (along with the core decode code anyway). Signed-off-by: Asahi Lina <lina@asahilina.net> Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24258>
This commit is contained in:
parent
55d363e02e
commit
ee83453f69
3 changed files with 85 additions and 9 deletions
|
|
@ -28,6 +28,8 @@ struct drm_asahi_params_global {
|
||||||
int num_clusters_total;
|
int num_clusters_total;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct libagxdecode_config lib_config;
|
||||||
|
|
||||||
UNUSED static const char *agx_alloc_types[AGX_NUM_ALLOC] = {"mem", "map",
|
UNUSED static const char *agx_alloc_types[AGX_NUM_ALLOC] = {"mem", "map",
|
||||||
"cmd"};
|
"cmd"};
|
||||||
|
|
||||||
|
|
@ -213,6 +215,9 @@ __agxdecode_fetch_gpu_mem(const struct agx_bo *mem, uint64_t gpu_va,
|
||||||
size_t size, void *buf, int line,
|
size_t size, void *buf, int line,
|
||||||
const char *filename)
|
const char *filename)
|
||||||
{
|
{
|
||||||
|
if (lib_config.read_gpu_mem)
|
||||||
|
return lib_config.read_gpu_mem(gpu_va, size, buf);
|
||||||
|
|
||||||
if (!mem)
|
if (!mem)
|
||||||
mem = agxdecode_find_mapped_gpu_mem_containing(gpu_va);
|
mem = agxdecode_find_mapped_gpu_mem_containing(gpu_va);
|
||||||
|
|
||||||
|
|
@ -282,10 +287,14 @@ agxdecode_stateful(uint64_t va, const char *label, decode_cmd decoder,
|
||||||
bool verbose, decoder_params *params, void *data)
|
bool verbose, decoder_params *params, void *data)
|
||||||
{
|
{
|
||||||
uint8_t buf[1024];
|
uint8_t buf[1024];
|
||||||
struct agx_bo *alloc = agxdecode_find_mapped_gpu_mem_containing(va);
|
if (!lib_config.read_gpu_mem) {
|
||||||
assert(alloc != NULL && "nonexistent object");
|
struct agx_bo *alloc = agxdecode_find_mapped_gpu_mem_containing(va);
|
||||||
fprintf(agxdecode_dump_stream, "%s (%" PRIx64 ", handle %u)\n", label, va,
|
assert(alloc != NULL && "nonexistent object");
|
||||||
alloc->handle);
|
fprintf(agxdecode_dump_stream, "%s (%" PRIx64 ", handle %u)\n", label, va,
|
||||||
|
alloc->handle);
|
||||||
|
} else {
|
||||||
|
fprintf(agxdecode_dump_stream, "%s (%" PRIx64 ")\n", label, va);
|
||||||
|
}
|
||||||
fflush(agxdecode_dump_stream);
|
fflush(agxdecode_dump_stream);
|
||||||
|
|
||||||
int len = agxdecode_fetch_gpu_array(va, buf);
|
int len = agxdecode_fetch_gpu_array(va, buf);
|
||||||
|
|
@ -608,13 +617,17 @@ agxdecode_vdm(const uint8_t *map, uint64_t *link, bool verbose,
|
||||||
agx_unpack(agxdecode_dump_stream, map, PPP_STATE, cmd);
|
agx_unpack(agxdecode_dump_stream, map, PPP_STATE, cmd);
|
||||||
|
|
||||||
uint64_t address = (((uint64_t)cmd.pointer_hi) << 32) | cmd.pointer_lo;
|
uint64_t address = (((uint64_t)cmd.pointer_hi) << 32) | cmd.pointer_lo;
|
||||||
struct agx_bo *mem = agxdecode_find_mapped_gpu_mem_containing(address);
|
|
||||||
|
|
||||||
if (mem)
|
if (!lib_config.read_gpu_mem) {
|
||||||
agxdecode_record(address, cmd.size_words * 4, verbose, params);
|
struct agx_bo *mem = agxdecode_find_mapped_gpu_mem_containing(address);
|
||||||
else
|
|
||||||
DUMP_UNPACKED(PPP_STATE, cmd, "Non-existent record (XXX)\n");
|
|
||||||
|
|
||||||
|
if (!mem) {
|
||||||
|
DUMP_UNPACKED(PPP_STATE, cmd, "Non-existent record (XXX)\n");
|
||||||
|
return AGX_PPP_STATE_LENGTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
agxdecode_record(address, cmd.size_words * 4, verbose, params);
|
||||||
return AGX_PPP_STATE_LENGTH;
|
return AGX_PPP_STATE_LENGTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -951,3 +964,44 @@ agxdecode_close(void)
|
||||||
{
|
{
|
||||||
agxdecode_dump_file_close();
|
agxdecode_dump_file_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
libagxdecode_writer(void *cookie, const char *buffer, size_t size)
|
||||||
|
{
|
||||||
|
return lib_config.stream_write(buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cookie_io_functions_t funcs = {.write = libagxdecode_writer};
|
||||||
|
|
||||||
|
static decoder_params lib_params;
|
||||||
|
|
||||||
|
void
|
||||||
|
libagxdecode_init(struct libagxdecode_config *config)
|
||||||
|
{
|
||||||
|
lib_config = *config;
|
||||||
|
agxdecode_dump_stream = fopencookie(NULL, "w", funcs);
|
||||||
|
|
||||||
|
chip_id_to_params(&lib_params, config->chip_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
libagxdecode_vdm(uint64_t addr, const char *label, bool verbose)
|
||||||
|
{
|
||||||
|
agxdecode_stateful(addr, label, agxdecode_vdm, verbose, &lib_params, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
libagxdecode_cdm(uint64_t addr, const char *label, bool verbose)
|
||||||
|
{
|
||||||
|
agxdecode_stateful(addr, label, agxdecode_cdm, verbose, &lib_params, NULL);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
libagxdecode_usc(uint64_t addr, const char *label, bool verbose)
|
||||||
|
{
|
||||||
|
agxdecode_stateful(addr, label, agxdecode_usc, verbose, &lib_params, NULL);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
libagxdecode_shutdown(void)
|
||||||
|
{
|
||||||
|
agxdecode_dump_file_close();
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#ifndef __AGX_DECODE_H__
|
#ifndef __AGX_DECODE_H__
|
||||||
#define __AGX_DECODE_H__
|
#define __AGX_DECODE_H__
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
#include "agx_bo.h"
|
#include "agx_bo.h"
|
||||||
|
|
||||||
void agxdecode_next_frame(void);
|
void agxdecode_next_frame(void);
|
||||||
|
|
@ -25,4 +26,16 @@ void agxdecode_dump_mappings(unsigned map_index);
|
||||||
|
|
||||||
void agxdecode_track_free(struct agx_bo *bo);
|
void agxdecode_track_free(struct agx_bo *bo);
|
||||||
|
|
||||||
|
struct libagxdecode_config {
|
||||||
|
uint32_t chip_id;
|
||||||
|
size_t (*read_gpu_mem)(uint64_t addr, size_t size, void *data);
|
||||||
|
ssize_t (*stream_write)(const char *buffer, size_t size);
|
||||||
|
};
|
||||||
|
|
||||||
|
void libagxdecode_init(struct libagxdecode_config *config);
|
||||||
|
void libagxdecode_vdm(uint64_t addr, const char *label, bool verbose);
|
||||||
|
void libagxdecode_cdm(uint64_t addr, const char *label, bool verbose);
|
||||||
|
void libagxdecode_usc(uint64_t addr, const char *label, bool verbose);
|
||||||
|
void libagxdecode_shutdown(void);
|
||||||
|
|
||||||
#endif /* __AGX_DECODE_H__ */
|
#endif /* __AGX_DECODE_H__ */
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,15 @@ libasahi_decode = static_library(
|
||||||
build_by_default : false,
|
build_by_default : false,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
libasahi_decode_shared = shared_library(
|
||||||
|
'asahi_decode',
|
||||||
|
[libasahi_decode_files, agx_pack],
|
||||||
|
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_asahi],
|
||||||
|
dependencies : [dep_valgrind, idep_mesautil],
|
||||||
|
c_args : [no_override_init_args],
|
||||||
|
build_by_default : with_tools.contains('asahi'),
|
||||||
|
)
|
||||||
|
|
||||||
libasahi_lib = static_library(
|
libasahi_lib = static_library(
|
||||||
'asahi_lib',
|
'asahi_lib',
|
||||||
[libasahi_lib_files, agx_pack],
|
[libasahi_lib_files, agx_pack],
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue