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