1*ba62d9d3SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
2*ba62d9d3SAndroid Build Coastguard Worker /*
3*ba62d9d3SAndroid Build Coastguard Worker * Copyright (c) 2022, Intel Corporation
4*ba62d9d3SAndroid Build Coastguard Worker *
5*ba62d9d3SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*ba62d9d3SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
7*ba62d9d3SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
8*ba62d9d3SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
9*ba62d9d3SAndroid Build Coastguard Worker * distribute, sublicense, and/or sell copies of the Software, and to
10*ba62d9d3SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
11*ba62d9d3SAndroid Build Coastguard Worker * the following conditions:
12*ba62d9d3SAndroid Build Coastguard Worker *
13*ba62d9d3SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*ba62d9d3SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*ba62d9d3SAndroid Build Coastguard Worker *
16*ba62d9d3SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*ba62d9d3SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*ba62d9d3SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19*ba62d9d3SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20*ba62d9d3SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21*ba62d9d3SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22*ba62d9d3SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*ba62d9d3SAndroid Build Coastguard Worker */
24*ba62d9d3SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
25*ba62d9d3SAndroid Build Coastguard Worker
26*ba62d9d3SAndroid Build Coastguard Worker #include <iostream>
27*ba62d9d3SAndroid Build Coastguard Worker #include <fstream>
28*ba62d9d3SAndroid Build Coastguard Worker #include <sstream>
29*ba62d9d3SAndroid Build Coastguard Worker #include <iomanip>
30*ba62d9d3SAndroid Build Coastguard Worker #include <string>
31*ba62d9d3SAndroid Build Coastguard Worker #include <map>
32*ba62d9d3SAndroid Build Coastguard Worker #include <algorithm>
33*ba62d9d3SAndroid Build Coastguard Worker #include <sys/stat.h>
34*ba62d9d3SAndroid Build Coastguard Worker #include <ctime>
35*ba62d9d3SAndroid Build Coastguard Worker #ifdef __linux__
36*ba62d9d3SAndroid Build Coastguard Worker #include <bits/stdc++.h>
37*ba62d9d3SAndroid Build Coastguard Worker #endif
38*ba62d9d3SAndroid Build Coastguard Worker
39*ba62d9d3SAndroid Build Coastguard Worker static const int32_t MAJ_VERSION = 1;
40*ba62d9d3SAndroid Build Coastguard Worker static const int32_t MIN_VERSION = 1;
41*ba62d9d3SAndroid Build Coastguard Worker static const char *HEADER_EXT = ".h";
42*ba62d9d3SAndroid Build Coastguard Worker static const char *SOURCE_EXT = ".c";
43*ba62d9d3SAndroid Build Coastguard Worker static const char *PARAM_I = "-i";
44*ba62d9d3SAndroid Build Coastguard Worker static const char *PARAM_O = "-o";
45*ba62d9d3SAndroid Build Coastguard Worker static const char *PARAM_V = "-v";
46*ba62d9d3SAndroid Build Coastguard Worker static const char *PARAM_INDEX = "-index";
47*ba62d9d3SAndroid Build Coastguard Worker static const char *PARAM_TOTAL = "-t";
48*ba62d9d3SAndroid Build Coastguard Worker
49*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
50*ba62d9d3SAndroid Build Coastguard Worker static const char *FILE_SEP = "/";
51*ba62d9d3SAndroid Build Coastguard Worker #else
52*ba62d9d3SAndroid Build Coastguard Worker static const char *FILE_SEP = "\\";
53*ba62d9d3SAndroid Build Coastguard Worker #endif
54*ba62d9d3SAndroid Build Coastguard Worker
55*ba62d9d3SAndroid Build Coastguard Worker static std::string COPYRIGHT = "";
56*ba62d9d3SAndroid Build Coastguard Worker static const std::string copyright_front =
57*ba62d9d3SAndroid Build Coastguard Worker "/*\n"
58*ba62d9d3SAndroid Build Coastguard Worker " * Copyright (c) "
59*ba62d9d3SAndroid Build Coastguard Worker ;
60*ba62d9d3SAndroid Build Coastguard Worker static const std::string copyright_end =
61*ba62d9d3SAndroid Build Coastguard Worker ", Intel Corporation\n"
62*ba62d9d3SAndroid Build Coastguard Worker " *\n"
63*ba62d9d3SAndroid Build Coastguard Worker " * Permission is hereby granted, free of charge, to any person obtaining a\n"
64*ba62d9d3SAndroid Build Coastguard Worker " * copy of this software and associated documentation files (the\n"
65*ba62d9d3SAndroid Build Coastguard Worker " * 'Software'), to deal in the Software without restriction, including\n"
66*ba62d9d3SAndroid Build Coastguard Worker " * without limitation the rights to use, copy, modify, merge, publish,\n"
67*ba62d9d3SAndroid Build Coastguard Worker " * distribute, sublicense, and/or sell copies of the Software, and to\n"
68*ba62d9d3SAndroid Build Coastguard Worker " * permit persons to whom the Software is furnished to do so, subject to\n"
69*ba62d9d3SAndroid Build Coastguard Worker " * the following conditions:\n"
70*ba62d9d3SAndroid Build Coastguard Worker " *\n"
71*ba62d9d3SAndroid Build Coastguard Worker " * The above copyright notice and this permission notice shall be included\n"
72*ba62d9d3SAndroid Build Coastguard Worker " * in all copies or substantial portions of the Software.\n"
73*ba62d9d3SAndroid Build Coastguard Worker " *\n"
74*ba62d9d3SAndroid Build Coastguard Worker " * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS\n"
75*ba62d9d3SAndroid Build Coastguard Worker " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n"
76*ba62d9d3SAndroid Build Coastguard Worker " * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n"
77*ba62d9d3SAndroid Build Coastguard Worker " * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n"
78*ba62d9d3SAndroid Build Coastguard Worker " * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n"
79*ba62d9d3SAndroid Build Coastguard Worker " * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n"
80*ba62d9d3SAndroid Build Coastguard Worker " * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
81*ba62d9d3SAndroid Build Coastguard Worker "*/\n"
82*ba62d9d3SAndroid Build Coastguard Worker "\n"
83*ba62d9d3SAndroid Build Coastguard Worker "////////////////////////////////////////////////////////////////////////////////\n"
84*ba62d9d3SAndroid Build Coastguard Worker "// !!! WARNING - AUTO GENERATED FILE. DO NOT EDIT DIRECTLY. !!!\n"
85*ba62d9d3SAndroid Build Coastguard Worker "// Generated by KernelBinToSource.exe tool\n"
86*ba62d9d3SAndroid Build Coastguard Worker "////////////////////////////////////////////////////////////////////////////////\n"
87*ba62d9d3SAndroid Build Coastguard Worker ;
88*ba62d9d3SAndroid Build Coastguard Worker
89*ba62d9d3SAndroid Build Coastguard Worker
90*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
91*ba62d9d3SAndroid Build Coastguard Worker // String EndsWith
92*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
strEndsWith(const std::string & str,const std::string & substr)93*ba62d9d3SAndroid Build Coastguard Worker bool strEndsWith(
94*ba62d9d3SAndroid Build Coastguard Worker const std::string &str,
95*ba62d9d3SAndroid Build Coastguard Worker const std::string &substr)
96*ba62d9d3SAndroid Build Coastguard Worker {
97*ba62d9d3SAndroid Build Coastguard Worker size_t i = str.rfind(substr);
98*ba62d9d3SAndroid Build Coastguard Worker return (i != std::string::npos) && (i == (str.length() - substr.length()));
99*ba62d9d3SAndroid Build Coastguard Worker }
100*ba62d9d3SAndroid Build Coastguard Worker
101*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
102*ba62d9d3SAndroid Build Coastguard Worker // Append Path
103*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
appendPath(const std::string & sPath,const std::string & sSubPath)104*ba62d9d3SAndroid Build Coastguard Worker std::string appendPath(
105*ba62d9d3SAndroid Build Coastguard Worker const std::string &sPath,
106*ba62d9d3SAndroid Build Coastguard Worker const std::string &sSubPath)
107*ba62d9d3SAndroid Build Coastguard Worker {
108*ba62d9d3SAndroid Build Coastguard Worker std::string strAppendPath = sPath;
109*ba62d9d3SAndroid Build Coastguard Worker if (!strEndsWith(sPath, FILE_SEP))
110*ba62d9d3SAndroid Build Coastguard Worker {
111*ba62d9d3SAndroid Build Coastguard Worker strAppendPath += FILE_SEP;
112*ba62d9d3SAndroid Build Coastguard Worker }
113*ba62d9d3SAndroid Build Coastguard Worker strAppendPath += sSubPath;
114*ba62d9d3SAndroid Build Coastguard Worker
115*ba62d9d3SAndroid Build Coastguard Worker return strAppendPath;
116*ba62d9d3SAndroid Build Coastguard Worker }
117*ba62d9d3SAndroid Build Coastguard Worker
118*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
119*ba62d9d3SAndroid Build Coastguard Worker // Get the filename from file path
120*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
getFileName(const std::string & sFilePath)121*ba62d9d3SAndroid Build Coastguard Worker std::string getFileName(const std::string &sFilePath)
122*ba62d9d3SAndroid Build Coastguard Worker {
123*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
124*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type uiLoc = sFilePath.rfind("/");
125*ba62d9d3SAndroid Build Coastguard Worker #else
126*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type uiLoc = sFilePath.rfind("\\");
127*ba62d9d3SAndroid Build Coastguard Worker #endif
128*ba62d9d3SAndroid Build Coastguard Worker
129*ba62d9d3SAndroid Build Coastguard Worker if (uiLoc != std::string::npos)
130*ba62d9d3SAndroid Build Coastguard Worker {
131*ba62d9d3SAndroid Build Coastguard Worker return sFilePath.substr(uiLoc+1, sFilePath.length());
132*ba62d9d3SAndroid Build Coastguard Worker }
133*ba62d9d3SAndroid Build Coastguard Worker
134*ba62d9d3SAndroid Build Coastguard Worker return sFilePath;
135*ba62d9d3SAndroid Build Coastguard Worker }
136*ba62d9d3SAndroid Build Coastguard Worker
137*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
138*ba62d9d3SAndroid Build Coastguard Worker // Writes the Header file
139*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
writeHeaderFile(const uint32_t * pBuffer,uint32_t uiSize,const std::string & sFileName,const std::string & sVarName)140*ba62d9d3SAndroid Build Coastguard Worker int32_t writeHeaderFile(
141*ba62d9d3SAndroid Build Coastguard Worker const uint32_t *pBuffer,
142*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiSize,
143*ba62d9d3SAndroid Build Coastguard Worker const std::string &sFileName,
144*ba62d9d3SAndroid Build Coastguard Worker const std::string &sVarName)
145*ba62d9d3SAndroid Build Coastguard Worker {
146*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
147*ba62d9d3SAndroid Build Coastguard Worker std::ofstream oOutStream;
148*ba62d9d3SAndroid Build Coastguard Worker std::stringstream oSs;
149*ba62d9d3SAndroid Build Coastguard Worker std::string sHeaderSentry;
150*ba62d9d3SAndroid Build Coastguard Worker std::string sSizeName;
151*ba62d9d3SAndroid Build Coastguard Worker
152*ba62d9d3SAndroid Build Coastguard Worker oOutStream.open(sFileName.c_str(), std::ios::out | std::ios::trunc );
153*ba62d9d3SAndroid Build Coastguard Worker if (!oOutStream.is_open())
154*ba62d9d3SAndroid Build Coastguard Worker {
155*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to open file '%s' for writing\n", sFileName.c_str());
156*ba62d9d3SAndroid Build Coastguard Worker goto finish;
157*ba62d9d3SAndroid Build Coastguard Worker }
158*ba62d9d3SAndroid Build Coastguard Worker
159*ba62d9d3SAndroid Build Coastguard Worker sHeaderSentry = "__" + sVarName + "_H__";
160*ba62d9d3SAndroid Build Coastguard Worker sSizeName = "extern const unsigned int " + sVarName + "_SIZE";
161*ba62d9d3SAndroid Build Coastguard Worker
162*ba62d9d3SAndroid Build Coastguard Worker oSs << COPYRIGHT
163*ba62d9d3SAndroid Build Coastguard Worker << "#ifndef " << sHeaderSentry << std::endl
164*ba62d9d3SAndroid Build Coastguard Worker << "#define " << sHeaderSentry << std::endl << std::endl
165*ba62d9d3SAndroid Build Coastguard Worker << sSizeName.c_str() << ";" << std::endl
166*ba62d9d3SAndroid Build Coastguard Worker << "extern const unsigned int " << sVarName.c_str() << "[]" << ";"
167*ba62d9d3SAndroid Build Coastguard Worker << std::endl << std::endl;
168*ba62d9d3SAndroid Build Coastguard Worker
169*ba62d9d3SAndroid Build Coastguard Worker oSs << "#endif // " << sHeaderSentry << std::endl;
170*ba62d9d3SAndroid Build Coastguard Worker
171*ba62d9d3SAndroid Build Coastguard Worker oOutStream << oSs.rdbuf();
172*ba62d9d3SAndroid Build Coastguard Worker
173*ba62d9d3SAndroid Build Coastguard Worker printf("Header file '%s' generated successfully!\n", sFileName.c_str());
174*ba62d9d3SAndroid Build Coastguard Worker
175*ba62d9d3SAndroid Build Coastguard Worker iStatus = 0;
176*ba62d9d3SAndroid Build Coastguard Worker
177*ba62d9d3SAndroid Build Coastguard Worker finish:
178*ba62d9d3SAndroid Build Coastguard Worker if (oOutStream.is_open())
179*ba62d9d3SAndroid Build Coastguard Worker {
180*ba62d9d3SAndroid Build Coastguard Worker oOutStream.close();
181*ba62d9d3SAndroid Build Coastguard Worker }
182*ba62d9d3SAndroid Build Coastguard Worker
183*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
184*ba62d9d3SAndroid Build Coastguard Worker }
185*ba62d9d3SAndroid Build Coastguard Worker
186*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
187*ba62d9d3SAndroid Build Coastguard Worker // Writes Partial Source file
188*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
writePartialSourceFile(const uint32_t * pBuffer,uint32_t uiSize,const std::string & sFileName,const std::string & sVarName,const uint32_t & index,const uint32_t & total)189*ba62d9d3SAndroid Build Coastguard Worker int32_t writePartialSourceFile(
190*ba62d9d3SAndroid Build Coastguard Worker const uint32_t *pBuffer,
191*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiSize,
192*ba62d9d3SAndroid Build Coastguard Worker const std::string &sFileName,
193*ba62d9d3SAndroid Build Coastguard Worker const std::string &sVarName,
194*ba62d9d3SAndroid Build Coastguard Worker const uint32_t &index,
195*ba62d9d3SAndroid Build Coastguard Worker const uint32_t &total)
196*ba62d9d3SAndroid Build Coastguard Worker {
197*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
198*ba62d9d3SAndroid Build Coastguard Worker std::ofstream oOutStream;
199*ba62d9d3SAndroid Build Coastguard Worker std::stringstream oSs;
200*ba62d9d3SAndroid Build Coastguard Worker std::string sSizeName;
201*ba62d9d3SAndroid Build Coastguard Worker std::string sPlatformName;
202*ba62d9d3SAndroid Build Coastguard Worker const uint32_t uiHexLen = 11;
203*ba62d9d3SAndroid Build Coastguard Worker char sHex[uiHexLen];
204*ba62d9d3SAndroid Build Coastguard Worker uint32_t offset_size = 0;
205*ba62d9d3SAndroid Build Coastguard Worker uint32_t final_size = (uiSize + total) * sizeof(uint32_t);
206*ba62d9d3SAndroid Build Coastguard Worker uint32_t stub = 0;
207*ba62d9d3SAndroid Build Coastguard Worker
208*ba62d9d3SAndroid Build Coastguard Worker int gPos = 0;
209*ba62d9d3SAndroid Build Coastguard Worker int underPos = 0;
210*ba62d9d3SAndroid Build Coastguard Worker
211*ba62d9d3SAndroid Build Coastguard Worker oOutStream.open(sFileName.c_str(), std::ios::out | std::ios::trunc );
212*ba62d9d3SAndroid Build Coastguard Worker if (!oOutStream.is_open())
213*ba62d9d3SAndroid Build Coastguard Worker {
214*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to open file '%s' for writing\n", sFileName.c_str());
215*ba62d9d3SAndroid Build Coastguard Worker goto finish;
216*ba62d9d3SAndroid Build Coastguard Worker }
217*ba62d9d3SAndroid Build Coastguard Worker
218*ba62d9d3SAndroid Build Coastguard Worker sSizeName = "extern const unsigned int " + sVarName + "_SIZE";
219*ba62d9d3SAndroid Build Coastguard Worker
220*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = sVarName;
221*ba62d9d3SAndroid Build Coastguard Worker
222*ba62d9d3SAndroid Build Coastguard Worker // support platform/ip names of both G series and Xe series
223*ba62d9d3SAndroid Build Coastguard Worker gPos = sPlatformName.find_first_of('G', 3);
224*ba62d9d3SAndroid Build Coastguard Worker underPos = sPlatformName.find_first_of('_');
225*ba62d9d3SAndroid Build Coastguard Worker if (gPos > 3 && gPos - 1 == underPos)
226*ba62d9d3SAndroid Build Coastguard Worker {
227*ba62d9d3SAndroid Build Coastguard Worker sPlatformName.erase(0, gPos + 1);
228*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = "GEN" + sPlatformName;
229*ba62d9d3SAndroid Build Coastguard Worker }
230*ba62d9d3SAndroid Build Coastguard Worker else
231*ba62d9d3SAndroid Build Coastguard Worker {
232*ba62d9d3SAndroid Build Coastguard Worker sPlatformName.erase(0, underPos + 1);
233*ba62d9d3SAndroid Build Coastguard Worker std::map<std::string, std::string> nameMap = {
234*ba62d9d3SAndroid Build Coastguard Worker {"XE_HPG", "XE_HPG"}, {"XE_HPG_CMFCPATCH", "XE_HPG_CMFCPATCH"}
235*ba62d9d3SAndroid Build Coastguard Worker };
236*ba62d9d3SAndroid Build Coastguard Worker
237*ba62d9d3SAndroid Build Coastguard Worker if (nameMap.find(sPlatformName) == nameMap.end())
238*ba62d9d3SAndroid Build Coastguard Worker {
239*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to recognize platform name '%s', KernelBinToSource tool should add support for newer platform\n", sPlatformName.c_str());
240*ba62d9d3SAndroid Build Coastguard Worker goto finish;
241*ba62d9d3SAndroid Build Coastguard Worker }
242*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = nameMap[sPlatformName];
243*ba62d9d3SAndroid Build Coastguard Worker }
244*ba62d9d3SAndroid Build Coastguard Worker
245*ba62d9d3SAndroid Build Coastguard Worker oSs << COPYRIGHT << std::endl;
246*ba62d9d3SAndroid Build Coastguard Worker oSs << "#ifdef IGFX_" << sPlatformName.c_str() << "_SUPPORTED" << std::endl;
247*ba62d9d3SAndroid Build Coastguard Worker oSs << sSizeName.c_str() << " = " << final_size << ";" << std::endl
248*ba62d9d3SAndroid Build Coastguard Worker << "extern const unsigned int " << sVarName.c_str() << "[] ="
249*ba62d9d3SAndroid Build Coastguard Worker << std::endl << "{";
250*ba62d9d3SAndroid Build Coastguard Worker
251*ba62d9d3SAndroid Build Coastguard Worker for(stub = 0; stub < total; stub++)
252*ba62d9d3SAndroid Build Coastguard Worker {
253*ba62d9d3SAndroid Build Coastguard Worker if (stub % 8 == 0)
254*ba62d9d3SAndroid Build Coastguard Worker {
255*ba62d9d3SAndroid Build Coastguard Worker oSs << std::endl << " ";
256*ba62d9d3SAndroid Build Coastguard Worker }
257*ba62d9d3SAndroid Build Coastguard Worker
258*ba62d9d3SAndroid Build Coastguard Worker if( stub == index + 1)
259*ba62d9d3SAndroid Build Coastguard Worker {
260*ba62d9d3SAndroid Build Coastguard Worker offset_size = uiSize * sizeof(uint32_t);
261*ba62d9d3SAndroid Build Coastguard Worker }
262*ba62d9d3SAndroid Build Coastguard Worker
263*ba62d9d3SAndroid Build Coastguard Worker snprintf(sHex, uiHexLen, "0x%08x", offset_size);
264*ba62d9d3SAndroid Build Coastguard Worker
265*ba62d9d3SAndroid Build Coastguard Worker sHex[uiHexLen - 1] = '\0';
266*ba62d9d3SAndroid Build Coastguard Worker
267*ba62d9d3SAndroid Build Coastguard Worker if (stub % 8 == 7)
268*ba62d9d3SAndroid Build Coastguard Worker {
269*ba62d9d3SAndroid Build Coastguard Worker oSs << sHex << ",";
270*ba62d9d3SAndroid Build Coastguard Worker }else
271*ba62d9d3SAndroid Build Coastguard Worker {
272*ba62d9d3SAndroid Build Coastguard Worker oSs << sHex << ", ";
273*ba62d9d3SAndroid Build Coastguard Worker }
274*ba62d9d3SAndroid Build Coastguard Worker }
275*ba62d9d3SAndroid Build Coastguard Worker
276*ba62d9d3SAndroid Build Coastguard Worker for (uint32_t i = 0; i < uiSize; i++)
277*ba62d9d3SAndroid Build Coastguard Worker {
278*ba62d9d3SAndroid Build Coastguard Worker if ((i + stub) % 8 == 0)
279*ba62d9d3SAndroid Build Coastguard Worker {
280*ba62d9d3SAndroid Build Coastguard Worker oSs << std::endl << " ";
281*ba62d9d3SAndroid Build Coastguard Worker }
282*ba62d9d3SAndroid Build Coastguard Worker
283*ba62d9d3SAndroid Build Coastguard Worker snprintf(sHex, uiHexLen, "0x%08x", pBuffer[i]);
284*ba62d9d3SAndroid Build Coastguard Worker sHex[uiHexLen - 1] = '\0';
285*ba62d9d3SAndroid Build Coastguard Worker oSs << sHex;
286*ba62d9d3SAndroid Build Coastguard Worker
287*ba62d9d3SAndroid Build Coastguard Worker if (i < (uiSize - 1))
288*ba62d9d3SAndroid Build Coastguard Worker {
289*ba62d9d3SAndroid Build Coastguard Worker if ((i + stub) % 8 == 7)
290*ba62d9d3SAndroid Build Coastguard Worker {
291*ba62d9d3SAndroid Build Coastguard Worker oSs << ",";
292*ba62d9d3SAndroid Build Coastguard Worker }
293*ba62d9d3SAndroid Build Coastguard Worker else
294*ba62d9d3SAndroid Build Coastguard Worker {
295*ba62d9d3SAndroid Build Coastguard Worker oSs << ", ";
296*ba62d9d3SAndroid Build Coastguard Worker }
297*ba62d9d3SAndroid Build Coastguard Worker }
298*ba62d9d3SAndroid Build Coastguard Worker }
299*ba62d9d3SAndroid Build Coastguard Worker
300*ba62d9d3SAndroid Build Coastguard Worker oSs << std::endl << "};" << std::endl;
301*ba62d9d3SAndroid Build Coastguard Worker
302*ba62d9d3SAndroid Build Coastguard Worker //Dummy kernel filled with 216 bytes
303*ba62d9d3SAndroid Build Coastguard Worker oSs << "#else" << std::endl
304*ba62d9d3SAndroid Build Coastguard Worker << sSizeName.c_str() << " = 216;" << std::endl
305*ba62d9d3SAndroid Build Coastguard Worker << "extern const unsigned int " << sVarName.c_str() << "[] = {" << std::endl
306*ba62d9d3SAndroid Build Coastguard Worker << " 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000," << std::endl
307*ba62d9d3SAndroid Build Coastguard Worker << "};" << std::endl
308*ba62d9d3SAndroid Build Coastguard Worker << "#endif" << std::endl;
309*ba62d9d3SAndroid Build Coastguard Worker
310*ba62d9d3SAndroid Build Coastguard Worker oOutStream << oSs.rdbuf();
311*ba62d9d3SAndroid Build Coastguard Worker
312*ba62d9d3SAndroid Build Coastguard Worker printf("Source file '%s' generated successfully!\n", sFileName.c_str());
313*ba62d9d3SAndroid Build Coastguard Worker
314*ba62d9d3SAndroid Build Coastguard Worker iStatus = 0;
315*ba62d9d3SAndroid Build Coastguard Worker
316*ba62d9d3SAndroid Build Coastguard Worker finish:
317*ba62d9d3SAndroid Build Coastguard Worker if (oOutStream.is_open())
318*ba62d9d3SAndroid Build Coastguard Worker {
319*ba62d9d3SAndroid Build Coastguard Worker oOutStream.close();
320*ba62d9d3SAndroid Build Coastguard Worker }
321*ba62d9d3SAndroid Build Coastguard Worker
322*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
323*ba62d9d3SAndroid Build Coastguard Worker }
324*ba62d9d3SAndroid Build Coastguard Worker
325*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
326*ba62d9d3SAndroid Build Coastguard Worker // Writes the Source file
327*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
writeSourceFile(const uint32_t * pBuffer,uint32_t uiSize,const std::string & sFileName,const std::string & sVarName)328*ba62d9d3SAndroid Build Coastguard Worker int32_t writeSourceFile(
329*ba62d9d3SAndroid Build Coastguard Worker const uint32_t *pBuffer,
330*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiSize,
331*ba62d9d3SAndroid Build Coastguard Worker const std::string &sFileName,
332*ba62d9d3SAndroid Build Coastguard Worker const std::string &sVarName)
333*ba62d9d3SAndroid Build Coastguard Worker {
334*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
335*ba62d9d3SAndroid Build Coastguard Worker std::ofstream oOutStream;
336*ba62d9d3SAndroid Build Coastguard Worker std::stringstream oSs;
337*ba62d9d3SAndroid Build Coastguard Worker std::string sSizeName;
338*ba62d9d3SAndroid Build Coastguard Worker std::string sPlatformName;
339*ba62d9d3SAndroid Build Coastguard Worker const uint32_t uiHexLen = 11;
340*ba62d9d3SAndroid Build Coastguard Worker char sHex[uiHexLen];
341*ba62d9d3SAndroid Build Coastguard Worker
342*ba62d9d3SAndroid Build Coastguard Worker int gPos = 0;
343*ba62d9d3SAndroid Build Coastguard Worker int underPos = 0;
344*ba62d9d3SAndroid Build Coastguard Worker
345*ba62d9d3SAndroid Build Coastguard Worker oOutStream.open(sFileName.c_str(), std::ios::out | std::ios::trunc );
346*ba62d9d3SAndroid Build Coastguard Worker if (!oOutStream.is_open())
347*ba62d9d3SAndroid Build Coastguard Worker {
348*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to open file '%s' for writing\n", sFileName.c_str());
349*ba62d9d3SAndroid Build Coastguard Worker goto finish;
350*ba62d9d3SAndroid Build Coastguard Worker }
351*ba62d9d3SAndroid Build Coastguard Worker
352*ba62d9d3SAndroid Build Coastguard Worker sSizeName = "extern const unsigned int " + sVarName + "_SIZE";
353*ba62d9d3SAndroid Build Coastguard Worker
354*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = sVarName;
355*ba62d9d3SAndroid Build Coastguard Worker
356*ba62d9d3SAndroid Build Coastguard Worker // support platform/ip names of both G series and Xe series
357*ba62d9d3SAndroid Build Coastguard Worker gPos = sPlatformName.find_first_of('G', 3);
358*ba62d9d3SAndroid Build Coastguard Worker underPos = sPlatformName.find_first_of('_');
359*ba62d9d3SAndroid Build Coastguard Worker if (gPos > 3 && gPos - 1 == underPos)
360*ba62d9d3SAndroid Build Coastguard Worker {
361*ba62d9d3SAndroid Build Coastguard Worker sPlatformName.erase(0, gPos + 1);
362*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = "GEN" + sPlatformName;
363*ba62d9d3SAndroid Build Coastguard Worker }
364*ba62d9d3SAndroid Build Coastguard Worker else
365*ba62d9d3SAndroid Build Coastguard Worker {
366*ba62d9d3SAndroid Build Coastguard Worker sPlatformName.erase(0, underPos + 1);
367*ba62d9d3SAndroid Build Coastguard Worker std::map<std::string, std::string> nameMap = {
368*ba62d9d3SAndroid Build Coastguard Worker {"XE_HPG", "XE_HPG"}, {"XE_HPG_CMFCPATCH", "XE_HPG_CMFCPATCH"}
369*ba62d9d3SAndroid Build Coastguard Worker };
370*ba62d9d3SAndroid Build Coastguard Worker
371*ba62d9d3SAndroid Build Coastguard Worker if (nameMap.find(sPlatformName) == nameMap.end())
372*ba62d9d3SAndroid Build Coastguard Worker {
373*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to recognize platform name '%s', KernelBinToSource tool should add support for newer platform\n", sPlatformName.c_str());
374*ba62d9d3SAndroid Build Coastguard Worker goto finish;
375*ba62d9d3SAndroid Build Coastguard Worker }
376*ba62d9d3SAndroid Build Coastguard Worker sPlatformName = nameMap[sPlatformName];
377*ba62d9d3SAndroid Build Coastguard Worker }
378*ba62d9d3SAndroid Build Coastguard Worker
379*ba62d9d3SAndroid Build Coastguard Worker oSs << COPYRIGHT << std::endl;
380*ba62d9d3SAndroid Build Coastguard Worker oSs << "#ifdef IGFX_" << sPlatformName.c_str() << "_SUPPORTED" << std::endl;
381*ba62d9d3SAndroid Build Coastguard Worker
382*ba62d9d3SAndroid Build Coastguard Worker oSs << sSizeName.c_str() << " = " << uiSize * sizeof(uint32_t) << ";" << std::endl
383*ba62d9d3SAndroid Build Coastguard Worker << "extern const unsigned int " << sVarName.c_str() << "[] ="
384*ba62d9d3SAndroid Build Coastguard Worker << std::endl << "{";
385*ba62d9d3SAndroid Build Coastguard Worker
386*ba62d9d3SAndroid Build Coastguard Worker for (uint32_t i = 0; i < uiSize; i++)
387*ba62d9d3SAndroid Build Coastguard Worker {
388*ba62d9d3SAndroid Build Coastguard Worker if (i % 8 == 0)
389*ba62d9d3SAndroid Build Coastguard Worker {
390*ba62d9d3SAndroid Build Coastguard Worker oSs << std::endl << " ";
391*ba62d9d3SAndroid Build Coastguard Worker }
392*ba62d9d3SAndroid Build Coastguard Worker
393*ba62d9d3SAndroid Build Coastguard Worker snprintf(sHex, uiHexLen, "0x%08x", pBuffer[i]);
394*ba62d9d3SAndroid Build Coastguard Worker sHex[uiHexLen - 1] = '\0';
395*ba62d9d3SAndroid Build Coastguard Worker oSs << sHex;
396*ba62d9d3SAndroid Build Coastguard Worker
397*ba62d9d3SAndroid Build Coastguard Worker if (i < (uiSize - 1))
398*ba62d9d3SAndroid Build Coastguard Worker {
399*ba62d9d3SAndroid Build Coastguard Worker oSs << ", ";
400*ba62d9d3SAndroid Build Coastguard Worker }
401*ba62d9d3SAndroid Build Coastguard Worker }
402*ba62d9d3SAndroid Build Coastguard Worker oSs << std::endl << "};" << std::endl;
403*ba62d9d3SAndroid Build Coastguard Worker
404*ba62d9d3SAndroid Build Coastguard Worker //Dummy kernel filled with 216 bytes
405*ba62d9d3SAndroid Build Coastguard Worker oSs << "#else" << std::endl
406*ba62d9d3SAndroid Build Coastguard Worker << sSizeName.c_str() << " = 216;" << std::endl
407*ba62d9d3SAndroid Build Coastguard Worker << "extern const unsigned int " << sVarName.c_str() << "[] = {" << std::endl
408*ba62d9d3SAndroid Build Coastguard Worker << " 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000," << std::endl
409*ba62d9d3SAndroid Build Coastguard Worker << "};" << std::endl
410*ba62d9d3SAndroid Build Coastguard Worker << "#endif" << std::endl;
411*ba62d9d3SAndroid Build Coastguard Worker
412*ba62d9d3SAndroid Build Coastguard Worker oOutStream << oSs.rdbuf();
413*ba62d9d3SAndroid Build Coastguard Worker
414*ba62d9d3SAndroid Build Coastguard Worker printf("Source file '%s' generated successfully!\n", sFileName.c_str());
415*ba62d9d3SAndroid Build Coastguard Worker
416*ba62d9d3SAndroid Build Coastguard Worker iStatus = 0;
417*ba62d9d3SAndroid Build Coastguard Worker
418*ba62d9d3SAndroid Build Coastguard Worker finish:
419*ba62d9d3SAndroid Build Coastguard Worker if (oOutStream.is_open())
420*ba62d9d3SAndroid Build Coastguard Worker {
421*ba62d9d3SAndroid Build Coastguard Worker oOutStream.close();
422*ba62d9d3SAndroid Build Coastguard Worker }
423*ba62d9d3SAndroid Build Coastguard Worker
424*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
425*ba62d9d3SAndroid Build Coastguard Worker }
426*ba62d9d3SAndroid Build Coastguard Worker
427*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
428*ba62d9d3SAndroid Build Coastguard Worker // Creates the Source file
429*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
createSourceFile(const std::string & sInputFile,const std::string & sOutputDir,const std::string & sVar,const uint32_t & index,const uint32_t & total)430*ba62d9d3SAndroid Build Coastguard Worker int32_t createSourceFile(
431*ba62d9d3SAndroid Build Coastguard Worker const std::string &sInputFile,
432*ba62d9d3SAndroid Build Coastguard Worker const std::string &sOutputDir,
433*ba62d9d3SAndroid Build Coastguard Worker const std::string &sVar,
434*ba62d9d3SAndroid Build Coastguard Worker const uint32_t &index,
435*ba62d9d3SAndroid Build Coastguard Worker const uint32_t &total)
436*ba62d9d3SAndroid Build Coastguard Worker {
437*ba62d9d3SAndroid Build Coastguard Worker struct stat StatResult;
438*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
439*ba62d9d3SAndroid Build Coastguard Worker std::ifstream oInStream;
440*ba62d9d3SAndroid Build Coastguard Worker std::string sInputFileName;
441*ba62d9d3SAndroid Build Coastguard Worker std::string sOutputFile;
442*ba62d9d3SAndroid Build Coastguard Worker std::string sVarName;
443*ba62d9d3SAndroid Build Coastguard Worker uint32_t *pBuffer = nullptr;
444*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiSize = 0;
445*ba62d9d3SAndroid Build Coastguard Worker float fSize = (ceil)(0.0f);
446*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiIntSize = 0;
447*ba62d9d3SAndroid Build Coastguard Worker
448*ba62d9d3SAndroid Build Coastguard Worker // Check if input file exists
449*ba62d9d3SAndroid Build Coastguard Worker if (0 != stat(sInputFile.c_str(), &StatResult))
450*ba62d9d3SAndroid Build Coastguard Worker {
451*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to read file '%s'\n", sInputFile.c_str());
452*ba62d9d3SAndroid Build Coastguard Worker goto finish;
453*ba62d9d3SAndroid Build Coastguard Worker }
454*ba62d9d3SAndroid Build Coastguard Worker uiSize = StatResult.st_size;
455*ba62d9d3SAndroid Build Coastguard Worker
456*ba62d9d3SAndroid Build Coastguard Worker if (sOutputDir.length() > 0)
457*ba62d9d3SAndroid Build Coastguard Worker {
458*ba62d9d3SAndroid Build Coastguard Worker // Check if out direction exists and validate it is a directory
459*ba62d9d3SAndroid Build Coastguard Worker if (0 != stat(sOutputDir.c_str(), &StatResult))
460*ba62d9d3SAndroid Build Coastguard Worker {
461*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to find directory '%s'\n", sOutputDir.c_str());
462*ba62d9d3SAndroid Build Coastguard Worker goto finish;
463*ba62d9d3SAndroid Build Coastguard Worker }
464*ba62d9d3SAndroid Build Coastguard Worker if (0 == (StatResult.st_mode & S_IFDIR))
465*ba62d9d3SAndroid Build Coastguard Worker {
466*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Path '%s' is a valid directory\n", sOutputDir.c_str());
467*ba62d9d3SAndroid Build Coastguard Worker goto finish;
468*ba62d9d3SAndroid Build Coastguard Worker }
469*ba62d9d3SAndroid Build Coastguard Worker }
470*ba62d9d3SAndroid Build Coastguard Worker
471*ba62d9d3SAndroid Build Coastguard Worker sInputFileName = getFileName(sInputFile);
472*ba62d9d3SAndroid Build Coastguard Worker if (sOutputDir.find("media_softlet") != std::string::npos)
473*ba62d9d3SAndroid Build Coastguard Worker {
474*ba62d9d3SAndroid Build Coastguard Worker // For media softlet, move vp kernel from media ip to render ip
475*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type replaceIndex = sInputFileName.find("_hpm");
476*ba62d9d3SAndroid Build Coastguard Worker
477*ba62d9d3SAndroid Build Coastguard Worker if(replaceIndex != std::string::npos)
478*ba62d9d3SAndroid Build Coastguard Worker {
479*ba62d9d3SAndroid Build Coastguard Worker sInputFileName.replace(replaceIndex, 4, "_hpg");
480*ba62d9d3SAndroid Build Coastguard Worker }
481*ba62d9d3SAndroid Build Coastguard Worker }
482*ba62d9d3SAndroid Build Coastguard Worker
483*ba62d9d3SAndroid Build Coastguard Worker {
484*ba62d9d3SAndroid Build Coastguard Worker // Set the Output path
485*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type uiLoc = sInputFileName.find(".", 0 );
486*ba62d9d3SAndroid Build Coastguard Worker sOutputFile = (uiLoc != std::string::npos) ? sInputFileName.substr(0, uiLoc) : sInputFileName;
487*ba62d9d3SAndroid Build Coastguard Worker sVarName = (sVar.length() == 0) ? sOutputFile : sVar;
488*ba62d9d3SAndroid Build Coastguard Worker }
489*ba62d9d3SAndroid Build Coastguard Worker
490*ba62d9d3SAndroid Build Coastguard Worker // Read the File
491*ba62d9d3SAndroid Build Coastguard Worker oInStream.open(sInputFile.c_str(), std::ios::in | std::ios::binary);
492*ba62d9d3SAndroid Build Coastguard Worker if (! oInStream.is_open())
493*ba62d9d3SAndroid Build Coastguard Worker {
494*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to open file '%s' for reading\n", sInputFile.c_str());
495*ba62d9d3SAndroid Build Coastguard Worker goto finish;
496*ba62d9d3SAndroid Build Coastguard Worker }
497*ba62d9d3SAndroid Build Coastguard Worker
498*ba62d9d3SAndroid Build Coastguard Worker // Read from the file
499*ba62d9d3SAndroid Build Coastguard Worker fSize = (ceil)(uiSize / 4.0f);
500*ba62d9d3SAndroid Build Coastguard Worker uiIntSize = static_cast<uint32_t>(fSize);
501*ba62d9d3SAndroid Build Coastguard Worker
502*ba62d9d3SAndroid Build Coastguard Worker pBuffer = new uint32_t[uiIntSize];
503*ba62d9d3SAndroid Build Coastguard Worker pBuffer[uiIntSize - 1] = 0; // set the last entry as 0 for handling non uint32_t file sizes.
504*ba62d9d3SAndroid Build Coastguard Worker oInStream.read(reinterpret_cast<char*>(pBuffer), uiSize);
505*ba62d9d3SAndroid Build Coastguard Worker
506*ba62d9d3SAndroid Build Coastguard Worker if (oInStream.bad())
507*ba62d9d3SAndroid Build Coastguard Worker {
508*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to read from file '%s'\n", sInputFile.c_str());
509*ba62d9d3SAndroid Build Coastguard Worker goto finish;
510*ba62d9d3SAndroid Build Coastguard Worker }
511*ba62d9d3SAndroid Build Coastguard Worker else
512*ba62d9d3SAndroid Build Coastguard Worker {
513*ba62d9d3SAndroid Build Coastguard Worker sOutputFile += SOURCE_EXT;
514*ba62d9d3SAndroid Build Coastguard Worker sOutputFile = appendPath(sOutputDir, sOutputFile);
515*ba62d9d3SAndroid Build Coastguard Worker
516*ba62d9d3SAndroid Build Coastguard Worker std::transform(sVarName.begin(), sVarName.end(), sVarName.begin(), ::toupper);
517*ba62d9d3SAndroid Build Coastguard Worker if (index == -1)
518*ba62d9d3SAndroid Build Coastguard Worker {
519*ba62d9d3SAndroid Build Coastguard Worker iStatus = writeSourceFile(pBuffer, uiIntSize, sOutputFile, sVarName);
520*ba62d9d3SAndroid Build Coastguard Worker }
521*ba62d9d3SAndroid Build Coastguard Worker else
522*ba62d9d3SAndroid Build Coastguard Worker {
523*ba62d9d3SAndroid Build Coastguard Worker iStatus = writePartialSourceFile(pBuffer, uiIntSize, sOutputFile, sVarName, index, total);
524*ba62d9d3SAndroid Build Coastguard Worker }
525*ba62d9d3SAndroid Build Coastguard Worker }
526*ba62d9d3SAndroid Build Coastguard Worker
527*ba62d9d3SAndroid Build Coastguard Worker finish:
528*ba62d9d3SAndroid Build Coastguard Worker if (oInStream.is_open())
529*ba62d9d3SAndroid Build Coastguard Worker {
530*ba62d9d3SAndroid Build Coastguard Worker oInStream.close();
531*ba62d9d3SAndroid Build Coastguard Worker }
532*ba62d9d3SAndroid Build Coastguard Worker
533*ba62d9d3SAndroid Build Coastguard Worker if (pBuffer)
534*ba62d9d3SAndroid Build Coastguard Worker {
535*ba62d9d3SAndroid Build Coastguard Worker delete [] pBuffer;
536*ba62d9d3SAndroid Build Coastguard Worker pBuffer = nullptr;
537*ba62d9d3SAndroid Build Coastguard Worker }
538*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
539*ba62d9d3SAndroid Build Coastguard Worker }
540*ba62d9d3SAndroid Build Coastguard Worker
541*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
542*ba62d9d3SAndroid Build Coastguard Worker // Creates the Header file
543*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
createHeaderFile(const std::string & sInputFile,const std::string & sOutputDir,const std::string & sVar)544*ba62d9d3SAndroid Build Coastguard Worker int32_t createHeaderFile(
545*ba62d9d3SAndroid Build Coastguard Worker const std::string &sInputFile,
546*ba62d9d3SAndroid Build Coastguard Worker const std::string &sOutputDir,
547*ba62d9d3SAndroid Build Coastguard Worker const std::string &sVar)
548*ba62d9d3SAndroid Build Coastguard Worker {
549*ba62d9d3SAndroid Build Coastguard Worker struct stat StatResult;
550*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
551*ba62d9d3SAndroid Build Coastguard Worker std::ifstream oInStream;
552*ba62d9d3SAndroid Build Coastguard Worker std::string sInputFileName;
553*ba62d9d3SAndroid Build Coastguard Worker std::string sOutputFile;
554*ba62d9d3SAndroid Build Coastguard Worker std::string sVarName;
555*ba62d9d3SAndroid Build Coastguard Worker uint32_t *pBuffer = nullptr;
556*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiSize = 0;
557*ba62d9d3SAndroid Build Coastguard Worker float fSize = (ceil)(0.0f);
558*ba62d9d3SAndroid Build Coastguard Worker uint32_t uiIntSize = 0;
559*ba62d9d3SAndroid Build Coastguard Worker
560*ba62d9d3SAndroid Build Coastguard Worker // Check if input file exists
561*ba62d9d3SAndroid Build Coastguard Worker if (0 != stat(sInputFile.c_str(), &StatResult))
562*ba62d9d3SAndroid Build Coastguard Worker {
563*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to read file '%s'\n", sInputFile.c_str());
564*ba62d9d3SAndroid Build Coastguard Worker goto finish;
565*ba62d9d3SAndroid Build Coastguard Worker }
566*ba62d9d3SAndroid Build Coastguard Worker if (StatResult.st_size > 0)
567*ba62d9d3SAndroid Build Coastguard Worker {
568*ba62d9d3SAndroid Build Coastguard Worker uiSize = StatResult.st_size;
569*ba62d9d3SAndroid Build Coastguard Worker }
570*ba62d9d3SAndroid Build Coastguard Worker else
571*ba62d9d3SAndroid Build Coastguard Worker {
572*ba62d9d3SAndroid Build Coastguard Worker printf("Error: The read file '%s' is null!\n", sInputFile.c_str());
573*ba62d9d3SAndroid Build Coastguard Worker goto finish;
574*ba62d9d3SAndroid Build Coastguard Worker }
575*ba62d9d3SAndroid Build Coastguard Worker
576*ba62d9d3SAndroid Build Coastguard Worker if (sOutputDir.length() > 0)
577*ba62d9d3SAndroid Build Coastguard Worker {
578*ba62d9d3SAndroid Build Coastguard Worker // Check if out direction exists and validate it is a directory
579*ba62d9d3SAndroid Build Coastguard Worker if (0 != stat(sOutputDir.c_str(), &StatResult))
580*ba62d9d3SAndroid Build Coastguard Worker {
581*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to find directory '%s'\n", sOutputDir.c_str());
582*ba62d9d3SAndroid Build Coastguard Worker goto finish;
583*ba62d9d3SAndroid Build Coastguard Worker }
584*ba62d9d3SAndroid Build Coastguard Worker if (0 == (StatResult.st_mode & S_IFDIR))
585*ba62d9d3SAndroid Build Coastguard Worker {
586*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Path '%s' is a valid directory\n", sOutputDir.c_str());
587*ba62d9d3SAndroid Build Coastguard Worker goto finish;
588*ba62d9d3SAndroid Build Coastguard Worker }
589*ba62d9d3SAndroid Build Coastguard Worker }
590*ba62d9d3SAndroid Build Coastguard Worker
591*ba62d9d3SAndroid Build Coastguard Worker sInputFileName = getFileName(sInputFile);
592*ba62d9d3SAndroid Build Coastguard Worker if (sOutputDir.find("media_softlet") != std::string::npos)
593*ba62d9d3SAndroid Build Coastguard Worker {
594*ba62d9d3SAndroid Build Coastguard Worker // For media softlet, move vp kernel from media ip to render ip
595*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type replaceIndex = sInputFileName.find("_hpm");
596*ba62d9d3SAndroid Build Coastguard Worker
597*ba62d9d3SAndroid Build Coastguard Worker if(replaceIndex != std::string::npos)
598*ba62d9d3SAndroid Build Coastguard Worker {
599*ba62d9d3SAndroid Build Coastguard Worker sInputFileName.replace(replaceIndex, 4, "_hpg");
600*ba62d9d3SAndroid Build Coastguard Worker }
601*ba62d9d3SAndroid Build Coastguard Worker }
602*ba62d9d3SAndroid Build Coastguard Worker
603*ba62d9d3SAndroid Build Coastguard Worker {
604*ba62d9d3SAndroid Build Coastguard Worker // Set the Output path
605*ba62d9d3SAndroid Build Coastguard Worker std::string::size_type uiLoc = sInputFileName.find(".", 0 );
606*ba62d9d3SAndroid Build Coastguard Worker sOutputFile = (uiLoc != std::string::npos) ? sInputFileName.substr(0, uiLoc) : sInputFileName;
607*ba62d9d3SAndroid Build Coastguard Worker sVarName = (sVar.length() == 0) ? sOutputFile : sVar;
608*ba62d9d3SAndroid Build Coastguard Worker }
609*ba62d9d3SAndroid Build Coastguard Worker
610*ba62d9d3SAndroid Build Coastguard Worker // Read the File
611*ba62d9d3SAndroid Build Coastguard Worker oInStream.open(sInputFile.c_str(), std::ios::in | std::ios::binary);
612*ba62d9d3SAndroid Build Coastguard Worker if (! oInStream.is_open())
613*ba62d9d3SAndroid Build Coastguard Worker {
614*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to open file '%s' for reading\n", sInputFile.c_str());
615*ba62d9d3SAndroid Build Coastguard Worker goto finish;
616*ba62d9d3SAndroid Build Coastguard Worker }
617*ba62d9d3SAndroid Build Coastguard Worker
618*ba62d9d3SAndroid Build Coastguard Worker // Read from the file
619*ba62d9d3SAndroid Build Coastguard Worker fSize = (ceil)(uiSize / 4.0f);
620*ba62d9d3SAndroid Build Coastguard Worker uiIntSize = static_cast<uint32_t>(fSize);
621*ba62d9d3SAndroid Build Coastguard Worker
622*ba62d9d3SAndroid Build Coastguard Worker pBuffer = new uint32_t[uiIntSize];
623*ba62d9d3SAndroid Build Coastguard Worker pBuffer[uiIntSize - 1] = 0; // set the last entry as 0 for handling non uint32_t file sizes.
624*ba62d9d3SAndroid Build Coastguard Worker oInStream.read(reinterpret_cast<char*>(pBuffer), uiSize);
625*ba62d9d3SAndroid Build Coastguard Worker
626*ba62d9d3SAndroid Build Coastguard Worker if (oInStream.bad())
627*ba62d9d3SAndroid Build Coastguard Worker {
628*ba62d9d3SAndroid Build Coastguard Worker printf("Error: Unable to read from file '%s'\n", sInputFile.c_str());
629*ba62d9d3SAndroid Build Coastguard Worker goto finish;
630*ba62d9d3SAndroid Build Coastguard Worker }
631*ba62d9d3SAndroid Build Coastguard Worker else
632*ba62d9d3SAndroid Build Coastguard Worker {
633*ba62d9d3SAndroid Build Coastguard Worker sOutputFile += HEADER_EXT;
634*ba62d9d3SAndroid Build Coastguard Worker sOutputFile = appendPath(sOutputDir, sOutputFile);
635*ba62d9d3SAndroid Build Coastguard Worker }
636*ba62d9d3SAndroid Build Coastguard Worker std::transform(sVarName.begin(), sVarName.end(), sVarName.begin(), ::toupper);
637*ba62d9d3SAndroid Build Coastguard Worker iStatus = writeHeaderFile(pBuffer, uiIntSize, sOutputFile, sVarName);
638*ba62d9d3SAndroid Build Coastguard Worker
639*ba62d9d3SAndroid Build Coastguard Worker finish:
640*ba62d9d3SAndroid Build Coastguard Worker if (oInStream.is_open())
641*ba62d9d3SAndroid Build Coastguard Worker {
642*ba62d9d3SAndroid Build Coastguard Worker oInStream.close();
643*ba62d9d3SAndroid Build Coastguard Worker }
644*ba62d9d3SAndroid Build Coastguard Worker
645*ba62d9d3SAndroid Build Coastguard Worker if (pBuffer)
646*ba62d9d3SAndroid Build Coastguard Worker {
647*ba62d9d3SAndroid Build Coastguard Worker delete [] pBuffer;
648*ba62d9d3SAndroid Build Coastguard Worker pBuffer = nullptr;
649*ba62d9d3SAndroid Build Coastguard Worker }
650*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
651*ba62d9d3SAndroid Build Coastguard Worker }
652*ba62d9d3SAndroid Build Coastguard Worker
653*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
654*ba62d9d3SAndroid Build Coastguard Worker // Prints Usage
655*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
printUsage(const std::string & sProgram)656*ba62d9d3SAndroid Build Coastguard Worker void printUsage(const std::string &sProgram)
657*ba62d9d3SAndroid Build Coastguard Worker {
658*ba62d9d3SAndroid Build Coastguard Worker std::cout << "Usage: "
659*ba62d9d3SAndroid Build Coastguard Worker << sProgram.c_str()
660*ba62d9d3SAndroid Build Coastguard Worker << " (" << PARAM_I << " InPath)"
661*ba62d9d3SAndroid Build Coastguard Worker << " [" << PARAM_O << " OutPath]"
662*ba62d9d3SAndroid Build Coastguard Worker << " [" << PARAM_V << " VarName]"
663*ba62d9d3SAndroid Build Coastguard Worker << " [" << PARAM_INDEX << " Kernel Index]"
664*ba62d9d3SAndroid Build Coastguard Worker << " [" << PARAM_TOTAL << " Kernel Total]"
665*ba62d9d3SAndroid Build Coastguard Worker << std::endl
666*ba62d9d3SAndroid Build Coastguard Worker << " " << PARAM_I << " Path to Kernel binary input file (required)" << std::endl
667*ba62d9d3SAndroid Build Coastguard Worker << " " << PARAM_O << " Path to Kernel binary output directory (optional)" << std::endl
668*ba62d9d3SAndroid Build Coastguard Worker << " " << PARAM_V << " Variable Name on the generated source file (optional)" << std::endl
669*ba62d9d3SAndroid Build Coastguard Worker << " " << PARAM_INDEX << " Variable kernel Index (optional)" << std::endl
670*ba62d9d3SAndroid Build Coastguard Worker << " " << PARAM_TOTAL << " Variable kernel total count (optional)" << std::endl;
671*ba62d9d3SAndroid Build Coastguard Worker
672*ba62d9d3SAndroid Build Coastguard Worker }
673*ba62d9d3SAndroid Build Coastguard Worker
674*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
675*ba62d9d3SAndroid Build Coastguard Worker // Parses input
676*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
parseInput(int32_t argc,char * argv[],const std::string & sProgram,std::string & sInput,std::string & sOutput,std::string & sVarName,uint32_t & index,uint32_t & total)677*ba62d9d3SAndroid Build Coastguard Worker int32_t parseInput(
678*ba62d9d3SAndroid Build Coastguard Worker int32_t argc,
679*ba62d9d3SAndroid Build Coastguard Worker char *argv[],
680*ba62d9d3SAndroid Build Coastguard Worker const std::string &sProgram,
681*ba62d9d3SAndroid Build Coastguard Worker std::string &sInput,
682*ba62d9d3SAndroid Build Coastguard Worker std::string &sOutput,
683*ba62d9d3SAndroid Build Coastguard Worker std::string &sVarName,
684*ba62d9d3SAndroid Build Coastguard Worker uint32_t &index,
685*ba62d9d3SAndroid Build Coastguard Worker uint32_t &total)
686*ba62d9d3SAndroid Build Coastguard Worker {
687*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
688*ba62d9d3SAndroid Build Coastguard Worker
689*ba62d9d3SAndroid Build Coastguard Worker // Must have even number of arguments (excluding argv[0])
690*ba62d9d3SAndroid Build Coastguard Worker if (argc % 2 == 0)
691*ba62d9d3SAndroid Build Coastguard Worker {
692*ba62d9d3SAndroid Build Coastguard Worker goto finish;
693*ba62d9d3SAndroid Build Coastguard Worker }
694*ba62d9d3SAndroid Build Coastguard Worker
695*ba62d9d3SAndroid Build Coastguard Worker for (int i = 1; i < argc; i += 2)
696*ba62d9d3SAndroid Build Coastguard Worker {
697*ba62d9d3SAndroid Build Coastguard Worker if (0 == strcmp(PARAM_I, argv[i]))
698*ba62d9d3SAndroid Build Coastguard Worker {
699*ba62d9d3SAndroid Build Coastguard Worker sInput = argv[i+1];
700*ba62d9d3SAndroid Build Coastguard Worker }
701*ba62d9d3SAndroid Build Coastguard Worker else if (0 == strcmp(PARAM_O, argv[i]))
702*ba62d9d3SAndroid Build Coastguard Worker {
703*ba62d9d3SAndroid Build Coastguard Worker sOutput = argv[i+1];
704*ba62d9d3SAndroid Build Coastguard Worker }
705*ba62d9d3SAndroid Build Coastguard Worker else if (0 == strcmp(PARAM_V, argv[i]))
706*ba62d9d3SAndroid Build Coastguard Worker {
707*ba62d9d3SAndroid Build Coastguard Worker sVarName = argv[i+1];
708*ba62d9d3SAndroid Build Coastguard Worker }
709*ba62d9d3SAndroid Build Coastguard Worker else if (0 == strcmp(PARAM_INDEX, argv[i]))
710*ba62d9d3SAndroid Build Coastguard Worker {
711*ba62d9d3SAndroid Build Coastguard Worker index = atoi(argv[i+1]);
712*ba62d9d3SAndroid Build Coastguard Worker }
713*ba62d9d3SAndroid Build Coastguard Worker else if (0 == strcmp(PARAM_TOTAL, argv[i]))
714*ba62d9d3SAndroid Build Coastguard Worker {
715*ba62d9d3SAndroid Build Coastguard Worker total = atoi(argv[i+1]) + 1;
716*ba62d9d3SAndroid Build Coastguard Worker }
717*ba62d9d3SAndroid Build Coastguard Worker else
718*ba62d9d3SAndroid Build Coastguard Worker {
719*ba62d9d3SAndroid Build Coastguard Worker std::cout << "Error: Invalid option " << argv[i] << std::endl;
720*ba62d9d3SAndroid Build Coastguard Worker goto finish;
721*ba62d9d3SAndroid Build Coastguard Worker }
722*ba62d9d3SAndroid Build Coastguard Worker }
723*ba62d9d3SAndroid Build Coastguard Worker
724*ba62d9d3SAndroid Build Coastguard Worker if (sInput.length() == 0)
725*ba62d9d3SAndroid Build Coastguard Worker {
726*ba62d9d3SAndroid Build Coastguard Worker goto finish;
727*ba62d9d3SAndroid Build Coastguard Worker }
728*ba62d9d3SAndroid Build Coastguard Worker
729*ba62d9d3SAndroid Build Coastguard Worker iStatus = 0;
730*ba62d9d3SAndroid Build Coastguard Worker
731*ba62d9d3SAndroid Build Coastguard Worker finish:
732*ba62d9d3SAndroid Build Coastguard Worker if (iStatus != 0)
733*ba62d9d3SAndroid Build Coastguard Worker {
734*ba62d9d3SAndroid Build Coastguard Worker printUsage(sProgram);
735*ba62d9d3SAndroid Build Coastguard Worker }
736*ba62d9d3SAndroid Build Coastguard Worker
737*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
738*ba62d9d3SAndroid Build Coastguard Worker }
739*ba62d9d3SAndroid Build Coastguard Worker
740*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
741*ba62d9d3SAndroid Build Coastguard Worker // Prints time
742*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
printTime(int64_t lFreq,int64_t lTime)743*ba62d9d3SAndroid Build Coastguard Worker void printTime(int64_t lFreq, int64_t lTime)
744*ba62d9d3SAndroid Build Coastguard Worker {
745*ba62d9d3SAndroid Build Coastguard Worker double dsec = ((double)lTime) / ((double)lFreq);
746*ba62d9d3SAndroid Build Coastguard Worker double dms = dsec * 1000;
747*ba62d9d3SAndroid Build Coastguard Worker std::cout << "Time Took " << std::setw(2) << dsec << "s "
748*ba62d9d3SAndroid Build Coastguard Worker << "(" << dms << "ms)"
749*ba62d9d3SAndroid Build Coastguard Worker << std::endl;
750*ba62d9d3SAndroid Build Coastguard Worker }
751*ba62d9d3SAndroid Build Coastguard Worker
752*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
753*ba62d9d3SAndroid Build Coastguard Worker // Main Function
754*ba62d9d3SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
main(int argc,char * argv[])755*ba62d9d3SAndroid Build Coastguard Worker int32_t main(int argc, char *argv[])
756*ba62d9d3SAndroid Build Coastguard Worker {
757*ba62d9d3SAndroid Build Coastguard Worker std::string sProgram = getFileName(argv[0]);
758*ba62d9d3SAndroid Build Coastguard Worker //get current time
759*ba62d9d3SAndroid Build Coastguard Worker time_t t = time(0);
760*ba62d9d3SAndroid Build Coastguard Worker tm* now = localtime(&t);
761*ba62d9d3SAndroid Build Coastguard Worker uint64_t year = 1900 + now->tm_year;
762*ba62d9d3SAndroid Build Coastguard Worker
763*ba62d9d3SAndroid Build Coastguard Worker std::cout << std::endl
764*ba62d9d3SAndroid Build Coastguard Worker << sProgram.c_str() << " v" << MAJ_VERSION << "." << MIN_VERSION << std::endl
765*ba62d9d3SAndroid Build Coastguard Worker << "(c) Intel Corporation " << year << ". All rights reserved." << std::endl << std::endl;
766*ba62d9d3SAndroid Build Coastguard Worker
767*ba62d9d3SAndroid Build Coastguard Worker COPYRIGHT = copyright_front + std::to_string(year) + copyright_end;
768*ba62d9d3SAndroid Build Coastguard Worker
769*ba62d9d3SAndroid Build Coastguard Worker int32_t iStatus = -1;
770*ba62d9d3SAndroid Build Coastguard Worker std::string sInputPath;
771*ba62d9d3SAndroid Build Coastguard Worker std::string sOutputDir;
772*ba62d9d3SAndroid Build Coastguard Worker std::string sVarName;
773*ba62d9d3SAndroid Build Coastguard Worker uint32_t index=-1;
774*ba62d9d3SAndroid Build Coastguard Worker uint32_t total=-1;
775*ba62d9d3SAndroid Build Coastguard Worker
776*ba62d9d3SAndroid Build Coastguard Worker iStatus = parseInput(argc, argv, sProgram, sInputPath, sOutputDir, sVarName, index, total);
777*ba62d9d3SAndroid Build Coastguard Worker if (iStatus != 0)
778*ba62d9d3SAndroid Build Coastguard Worker {
779*ba62d9d3SAndroid Build Coastguard Worker goto finish;
780*ba62d9d3SAndroid Build Coastguard Worker }
781*ba62d9d3SAndroid Build Coastguard Worker
782*ba62d9d3SAndroid Build Coastguard Worker iStatus = createHeaderFile(sInputPath, sOutputDir, sVarName);
783*ba62d9d3SAndroid Build Coastguard Worker
784*ba62d9d3SAndroid Build Coastguard Worker iStatus = createSourceFile(sInputPath, sOutputDir, sVarName, index, total);
785*ba62d9d3SAndroid Build Coastguard Worker
786*ba62d9d3SAndroid Build Coastguard Worker finish:
787*ba62d9d3SAndroid Build Coastguard Worker return iStatus;
788*ba62d9d3SAndroid Build Coastguard Worker }
789