1 /*
2 * Copyright (C) 2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "shared/source/device/device.h"
9 #include "shared/source/memory_manager/os_agnostic_memory_manager.h"
10 #include "shared/test/common/mocks/mock_sip.h"
11
12 #include "common/StateSaveAreaHeader.h"
13
14 #include <cassert>
15
16 namespace NEO {
17
18 namespace MockSipData {
19 std::unique_ptr<MockSipKernel> mockSipKernel;
20 SipKernelType calledType = SipKernelType::COUNT;
21 bool called = false;
22 bool returned = true;
23 bool useMockSip = false;
24
clearUseFlags()25 void clearUseFlags() {
26 calledType = SipKernelType::COUNT;
27 called = false;
28 }
29
createStateSaveAreaHeader(uint32_t version)30 std::vector<char> createStateSaveAreaHeader(uint32_t version) {
31 SIP::StateSaveAreaHeader stateSaveAreaHeader = {
32 {
33 // versionHeader
34 "tssarea", // magic
35 0, // reserved1
36 { // version
37 1, // major
38 0, // minor
39 0}, // patch
40 40, // size
41 {0, 0, 0}, // reserved2
42 },
43 {
44 // regHeader
45 1, // num_slices
46 6, // num_subslices_per_slice
47 16, // num_eus_per_subslice
48 7, // num_threads_per_eu
49 0, // state_area_offset
50 6144, // state_save_size
51 0, // slm_area_offset
52 0, // slm_bank_size
53 0, // slm_bank_valid
54 4740, // sr_magic_offset
55 {0, 128, 256, 32}, // grf
56 {4096, 1, 256, 32}, // addr
57 {4128, 2, 32, 4}, // flag
58 {4156, 1, 32, 4}, // emask
59 {4160, 2, 128, 16}, // sr
60 {4192, 1, 128, 16}, // cr
61 {4256, 1, 96, 12}, // notification
62 {4288, 1, 128, 16}, // tdr
63 {4320, 10, 256, 32}, // acc
64 {0, 0, 0, 0}, // mme
65 {4672, 1, 32, 4}, // ce
66 {4704, 1, 128, 16}, // sp
67 {0, 0, 0, 0}, // cmd
68 {4640, 1, 128, 16}, // tm
69 {0, 0, 0, 0}, // fc
70 {4736, 1, 32, 4}, // dbg
71 },
72 };
73
74 SIP::StateSaveAreaHeader stateSaveAreaHeader2 = {
75 {
76 // versionHeader
77 "tssarea", // magic
78 0, // reserved1
79 { // version
80 2, // major
81 0, // minor
82 0}, // patch
83 40, // size
84 {0, 0, 0}, // reserved2
85 },
86 {
87 // regHeader
88 1, // num_slices
89 1, // num_subslices_per_slice
90 8, // num_eus_per_subslice
91 7, // num_threads_per_eu
92 0, // state_area_offset
93 6144, // state_save_size
94 0, // slm_area_offset
95 0, // slm_bank_size
96 0, // slm_bank_valid
97 4740, // sr_magic_offset
98 {0, 128, 256, 32}, // grf
99 {4096, 1, 256, 32}, // addr
100 {4128, 2, 32, 4}, // flag
101 {4156, 1, 32, 4}, // emask
102 {4160, 2, 128, 16}, // sr
103 {4192, 1, 128, 16}, // cr
104 {4256, 1, 96, 12}, // notification
105 {4288, 1, 128, 16}, // tdr
106 {4320, 10, 256, 32}, // acc
107 {0, 0, 0, 0}, // mme
108 {4672, 1, 32, 4}, // ce
109 {4704, 1, 128, 16}, // sp
110 {4768, 1, 128 * 8, 128}, // cmd
111 {4640, 1, 128, 16}, // tm
112 {0, 0, 0, 0}, // fc
113 {4736, 1, 32, 4}, // dbg
114 },
115 };
116
117 char *begin = nullptr;
118
119 if (version == 1) {
120 begin = reinterpret_cast<char *>(&stateSaveAreaHeader);
121 } else if (version == 2) {
122 begin = reinterpret_cast<char *>(&stateSaveAreaHeader2);
123 }
124 return std::vector<char>(begin, begin + sizeof(stateSaveAreaHeader));
125 }
126 } // namespace MockSipData
127
initSipKernel(SipKernelType type,Device & device)128 bool SipKernel::initSipKernel(SipKernelType type, Device &device) {
129 if (MockSipData::useMockSip) {
130 auto &hwHelper = HwHelper::get(device.getRootDeviceEnvironment().getHardwareInfo()->platform.eRenderCoreFamily);
131 if (hwHelper.isSipKernelAsHexadecimalArrayPreferred()) {
132 SipKernel::classType = SipClassType::HexadecimalHeaderFile;
133 } else {
134 SipKernel::classType = SipClassType::Builtins;
135 }
136 MockSipData::calledType = type;
137 MockSipData::called = true;
138
139 MockSipData::mockSipKernel->mockSipMemoryAllocation->clearUsageInfo();
140 return MockSipData::returned;
141 } else {
142 return SipKernel::initSipKernelImpl(type, device);
143 }
144 }
145
getSipKernel(Device & device)146 const SipKernel &SipKernel::getSipKernel(Device &device) {
147 if (MockSipData::useMockSip) {
148 return *MockSipData::mockSipKernel.get();
149 } else {
150 auto sipType = SipKernel::getSipKernelType(device);
151 SipKernel::initSipKernel(sipType, device);
152 return SipKernel::getSipKernelImpl(device);
153 }
154 }
155
156 } // namespace NEO
157