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