From 50a030b02a67df44aa15c4ca2e31dc7f467a8413 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 16 Aug 2024 16:05:53 -0500 Subject: [PATCH] nouveau/mme: Add a generic simulator function This one takes a devinfo and decodes and simulates the shader with whichever sim is appropriate. Part-of: --- src/nouveau/mme/meson.build | 1 + src/nouveau/mme/mme_sim.c | 40 +++++++++++++++++++++++++++++++++++++ src/nouveau/mme/mme_sim.h | 5 +++++ 3 files changed, 46 insertions(+) create mode 100644 src/nouveau/mme/mme_sim.c diff --git a/src/nouveau/mme/meson.build b/src/nouveau/mme/meson.build index 4fa18e7c8cb..b392bcb2250 100644 --- a/src/nouveau/mme/meson.build +++ b/src/nouveau/mme/meson.build @@ -8,6 +8,7 @@ libnouveau_mme_files = files( 'mme_fermi_builder.c', 'mme_fermi_sim.c', 'mme_sim.h', + 'mme_sim.c', 'mme_tu104.c', 'mme_tu104.h', 'mme_tu104_builder.c', diff --git a/src/nouveau/mme/mme_sim.c b/src/nouveau/mme/mme_sim.c new file mode 100644 index 00000000000..0dded7004e9 --- /dev/null +++ b/src/nouveau/mme/mme_sim.c @@ -0,0 +1,40 @@ +/* + * Copyright © 2022 Mary Guillemard + * SPDX-License-Identifier: MIT + */ +#include "mme_sim.h" + +#include "mme_fermi.h" +#include "mme_fermi_sim.h" +#include "mme_tu104.h" +#include "mme_tu104_sim.h" + +#define MME_CLS_FERMI 0x9000 +#define MME_CLS_TURING 0xc500 + +void +mme_sim_core(const struct nv_device_info *devinfo, + size_t macro_size, const void *macro, + const struct mme_sim_state_ops *state_ops, + void *state_handler) +{ + if (devinfo->cls_eng3d >= MME_CLS_TURING) { + assert(macro_size % 12 == 0); + uint32_t inst_count = macro_size / 12; + struct mme_tu104_inst *insts = + malloc(inst_count * sizeof(struct mme_tu104_inst)); + mme_tu104_decode(insts, macro, inst_count); + mme_tu104_sim_core(inst_count, insts, state_ops, state_handler); + free(insts); + } else if (devinfo->cls_eng3d >= MME_CLS_FERMI) { + assert(macro_size % 4 == 0); + uint32_t inst_count = macro_size / 4; + struct mme_fermi_inst *insts = + malloc(inst_count * sizeof(struct mme_fermi_inst)); + mme_fermi_decode(insts, macro, inst_count); + mme_fermi_sim_core(inst_count, insts, state_ops, state_handler); + free(insts); + } else { + unreachable("Unsupported GPU class"); + } +} diff --git a/src/nouveau/mme/mme_sim.h b/src/nouveau/mme/mme_sim.h index 61d611ba1f0..d5730e2439b 100644 --- a/src/nouveau/mme/mme_sim.h +++ b/src/nouveau/mme/mme_sim.h @@ -19,6 +19,11 @@ struct mme_sim_state_ops { uint32_t *(*map_dram)(void *handler, uint32_t idx); }; +void mme_sim_core(const struct nv_device_info *devinfo, + size_t macro_size, const void *macro, + const struct mme_sim_state_ops *state_ops, + void *state_handler); + #ifdef __cplusplus } #endif