xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/tests/mme_runner.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2022 Collabora Ltd.
3  * SPDX-License-Identifier: MIT
4  */
5 #include <gtest/gtest.h>
6 #include <vector>
7 
8 #include "mme_builder.h"
9 
10 struct nouveau_bo;
11 struct nouveau_ws_contxt;
12 struct nouveau_ws_device;
13 
14 #include "nv_push.h"
15 #include "nv_push_cl9097.h"
16 
17 #define DATA_BO_SIZE 4096
18 #define DATA_DWORDS 1024
19 
20 class mme_runner {
21 public:
22    mme_runner();
23    virtual ~mme_runner();
24 
25    virtual void run_macro(const std::vector<uint32_t>& macro,
26                           const std::vector<uint32_t>& params) = 0;
27 
28    void mme_store_data(mme_builder *b, uint32_t dw_idx,
29                        mme_value data, bool free_reg = false);
30 
31    const nv_device_info *devinfo;
32    uint64_t data_addr;
33    uint32_t *data;
34 };
35 
36 class mme_hw_runner : public mme_runner {
37 public:
38    mme_hw_runner();
39    virtual ~mme_hw_runner();
40 
41    bool set_up_hw(uint16_t min_cls, uint16_t max_cls);
42    void push_macro(uint32_t id, const std::vector<uint32_t>& macro);
43    void reset_push();
44    void submit_push();
45 
46    virtual void run_macro(const std::vector<uint32_t>& macro,
47                           const std::vector<uint32_t>& params);
48 
49    struct nv_push *p;
50 
51 private:
52    struct nouveau_ws_device *dev;
53    struct nouveau_ws_context *ctx;
54    struct nouveau_ws_bo *data_bo;
55    struct nouveau_ws_bo *push_bo;
56    uint32_t syncobj;
57    void *push_map;
58    struct nv_push push;
59 };
60 
61 class mme_fermi_sim_runner : public mme_runner {
62 public:
63    mme_fermi_sim_runner(uint64_t data_addr);
64    virtual ~mme_fermi_sim_runner();
65 
66    virtual void run_macro(const std::vector<uint32_t>& macro,
67                           const std::vector<uint32_t>& params);
68 
69 private:
70    struct nv_device_info info;
71    uint32_t data_store[DATA_DWORDS];
72 };
73 
74 class mme_tu104_sim_runner : public mme_runner {
75 public:
76    mme_tu104_sim_runner(uint64_t data_addr);
77    virtual ~mme_tu104_sim_runner();
78 
79    virtual void run_macro(const std::vector<uint32_t>& macro,
80                           const std::vector<uint32_t>& params);
81 
82 private:
83    struct nv_device_info info;
84    uint32_t data_store[DATA_DWORDS];
85 };
86 
87 inline std::vector<uint32_t>
mme_builder_finish_vec(mme_builder * b)88 mme_builder_finish_vec(mme_builder *b)
89 {
90    size_t size = 0;
91    uint32_t *dw = mme_builder_finish(b, &size);
92    std::vector<uint32_t> vec(dw, dw + (size / 4));
93    free(dw);
94    return vec;
95 }
96 
97 inline uint32_t
high32(uint64_t x)98 high32(uint64_t x)
99 {
100    return (uint32_t)(x >> 32);
101 }
102 
103 inline uint32_t
low32(uint64_t x)104 low32(uint64_t x)
105 {
106    return (uint32_t)x;
107 }
108 
109 inline void
110 mme_store_imm_addr(mme_builder *b, uint64_t addr, mme_value v,
111                    bool free_reg = false)
112 {
113    mme_mthd(b, NV9097_SET_REPORT_SEMAPHORE_A);
114    mme_emit(b, mme_imm(high32(addr)));
115    mme_emit(b, mme_imm(low32(addr)));
116    mme_emit(b, v);
117    mme_emit(b, mme_imm(0x10000000));
118 
119    if (free_reg && v.type == MME_VALUE_TYPE_REG)
120       mme_free_reg(b, v);
121 }
122 
123 inline void
124 mme_store(mme_builder *b, struct mme_value64 addr, mme_value v,
125           bool free_reg = false)
126 {
127    mme_mthd(b, NV9097_SET_REPORT_SEMAPHORE_A);
128    mme_emit(b, addr.hi);
129    mme_emit(b, addr.lo);
130    mme_emit(b, v);
131    mme_emit(b, mme_imm(0x10000000));
132 
133    if (free_reg && v.type == MME_VALUE_TYPE_REG)
134       mme_free_reg(b, v);
135 }
136