xref: /aosp_15_r20/external/intel-media-driver/Tools/MediaDriverTools/GenDmyHex/main.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1*ba62d9d3SAndroid Build Coastguard Worker #include <dirent.h>
2*ba62d9d3SAndroid Build Coastguard Worker #include <sys/stat.h>
3*ba62d9d3SAndroid Build Coastguard Worker #include <cstring>
4*ba62d9d3SAndroid Build Coastguard Worker #include <list>
5*ba62d9d3SAndroid Build Coastguard Worker #include <stdio.h>
6*ba62d9d3SAndroid Build Coastguard Worker #include <cstdlib>
7*ba62d9d3SAndroid Build Coastguard Worker #include <string>
8*ba62d9d3SAndroid Build Coastguard Worker #include <algorithm>
9*ba62d9d3SAndroid Build Coastguard Worker 
10*ba62d9d3SAndroid Build Coastguard Worker #define MAX_STRING_SIZE  4096
11*ba62d9d3SAndroid Build Coastguard Worker #define MAX_KERNEL_NAME_LENGTH 100
12*ba62d9d3SAndroid Build Coastguard Worker #define MAX_CACHE_STRING_LENGTH (MAX_KERNEL_NAME_LENGTH + 10)
13*ba62d9d3SAndroid Build Coastguard Worker 
14*ba62d9d3SAndroid Build Coastguard Worker using namespace std;
15*ba62d9d3SAndroid Build Coastguard Worker 
16*ba62d9d3SAndroid Build Coastguard Worker #define StrCmp strncasecmp
17*ba62d9d3SAndroid Build Coastguard Worker 
main(int argc,char * argv[])18*ba62d9d3SAndroid Build Coastguard Worker int main(int argc, char *argv[])
19*ba62d9d3SAndroid Build Coastguard Worker {
20*ba62d9d3SAndroid Build Coastguard Worker 
21*ba62d9d3SAndroid Build Coastguard Worker     if (argc != 3)
22*ba62d9d3SAndroid Build Coastguard Worker     {
23*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Usage: GenDmyHex.exe <kernel hex dir> <kernel header file> \n");
24*ba62d9d3SAndroid Build Coastguard Worker         exit(-1);
25*ba62d9d3SAndroid Build Coastguard Worker     }
26*ba62d9d3SAndroid Build Coastguard Worker 
27*ba62d9d3SAndroid Build Coastguard Worker     struct dirent* ent = NULL;
28*ba62d9d3SAndroid Build Coastguard Worker 
29*ba62d9d3SAndroid Build Coastguard Worker     char dirkrnhex[MAX_STRING_SIZE];
30*ba62d9d3SAndroid Build Coastguard Worker     FILE *pfkrnheader = NULL;
31*ba62d9d3SAndroid Build Coastguard Worker     DIR *pHexDir = opendir(argv[1]);
32*ba62d9d3SAndroid Build Coastguard Worker 
33*ba62d9d3SAndroid Build Coastguard Worker     if (!pHexDir)
34*ba62d9d3SAndroid Build Coastguard Worker     {
35*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Open kernel hex dir failed!\n");
36*ba62d9d3SAndroid Build Coastguard Worker         exit(-1);
37*ba62d9d3SAndroid Build Coastguard Worker     }
38*ba62d9d3SAndroid Build Coastguard Worker 
39*ba62d9d3SAndroid Build Coastguard Worker     if(sprintf(dirkrnhex, "%s", argv[1]) < 0)
40*ba62d9d3SAndroid Build Coastguard Worker     {
41*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Copy kernel hex dir failed!\n");
42*ba62d9d3SAndroid Build Coastguard Worker         exit(-1);
43*ba62d9d3SAndroid Build Coastguard Worker     }
44*ba62d9d3SAndroid Build Coastguard Worker     strcat(dirkrnhex, "/");
45*ba62d9d3SAndroid Build Coastguard Worker 
46*ba62d9d3SAndroid Build Coastguard Worker     if(!(pfkrnheader = fopen(argv[2], "r")))
47*ba62d9d3SAndroid Build Coastguard Worker     {
48*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Read kernel header file failed!\n");
49*ba62d9d3SAndroid Build Coastguard Worker         exit(-1);
50*ba62d9d3SAndroid Build Coastguard Worker     }
51*ba62d9d3SAndroid Build Coastguard Worker 
52*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////
53*ba62d9d3SAndroid Build Coastguard Worker     //Get Full kernel list from pre-built kernele header file//
54*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////
55*ba62d9d3SAndroid Build Coastguard Worker 
56*ba62d9d3SAndroid Build Coastguard Worker     list <string> KernelFullList;
57*ba62d9d3SAndroid Build Coastguard Worker     char scache[MAX_CACHE_STRING_LENGTH];
58*ba62d9d3SAndroid Build Coastguard Worker 
59*ba62d9d3SAndroid Build Coastguard Worker     while (fgets(scache, MAX_CACHE_STRING_LENGTH, pfkrnheader))
60*ba62d9d3SAndroid Build Coastguard Worker     {
61*ba62d9d3SAndroid Build Coastguard Worker         string strcache(scache);
62*ba62d9d3SAndroid Build Coastguard Worker         if (strcache.size() < 16)
63*ba62d9d3SAndroid Build Coastguard Worker         {
64*ba62d9d3SAndroid Build Coastguard Worker             continue;
65*ba62d9d3SAndroid Build Coastguard Worker         }
66*ba62d9d3SAndroid Build Coastguard Worker         string head = strcache.substr(8, 6);
67*ba62d9d3SAndroid Build Coastguard Worker         if (!head.compare("IDR_VP"))
68*ba62d9d3SAndroid Build Coastguard Worker         {
69*ba62d9d3SAndroid Build Coastguard Worker             strcache.erase(0, 15);
70*ba62d9d3SAndroid Build Coastguard Worker             strcache.erase(strcache.find(" "), strcache.size());
71*ba62d9d3SAndroid Build Coastguard Worker             if (!strcache.compare("TOTAL_NUM_KERNELS") ||
72*ba62d9d3SAndroid Build Coastguard Worker                 !strcache.compare("KERNEL_NAMES") ||
73*ba62d9d3SAndroid Build Coastguard Worker                 !strcache.compare("LINKFILE_HEADER") ||
74*ba62d9d3SAndroid Build Coastguard Worker                 !strcache.compare("LINKFILE_VERSION") ||
75*ba62d9d3SAndroid Build Coastguard Worker                 !strcache.compare("LinkFile")
76*ba62d9d3SAndroid Build Coastguard Worker                 )
77*ba62d9d3SAndroid Build Coastguard Worker             {
78*ba62d9d3SAndroid Build Coastguard Worker                 continue;
79*ba62d9d3SAndroid Build Coastguard Worker             }
80*ba62d9d3SAndroid Build Coastguard Worker             strcache.append(".hex");
81*ba62d9d3SAndroid Build Coastguard Worker             KernelFullList.push_back(strcache);
82*ba62d9d3SAndroid Build Coastguard Worker         }
83*ba62d9d3SAndroid Build Coastguard Worker     }
84*ba62d9d3SAndroid Build Coastguard Worker 
85*ba62d9d3SAndroid Build Coastguard Worker     fclose(pfkrnheader);
86*ba62d9d3SAndroid Build Coastguard Worker 
87*ba62d9d3SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
88*ba62d9d3SAndroid Build Coastguard Worker     // Remove a superset list of all the kernels according to generated kernel//
89*ba62d9d3SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
90*ba62d9d3SAndroid Build Coastguard Worker 
91*ba62d9d3SAndroid Build Coastguard Worker     char dirNewfile[MAX_STRING_SIZE];
92*ba62d9d3SAndroid Build Coastguard Worker     char dirOldfile[MAX_STRING_SIZE];
93*ba62d9d3SAndroid Build Coastguard Worker 
94*ba62d9d3SAndroid Build Coastguard Worker     while (NULL != (ent=readdir(pHexDir)))
95*ba62d9d3SAndroid Build Coastguard Worker     {
96*ba62d9d3SAndroid Build Coastguard Worker         int n = strlen(ent->d_name);
97*ba62d9d3SAndroid Build Coastguard Worker         if (n < 4 || (StrCmp(ent->d_name + n - 4, ".hex", 4) != 0))
98*ba62d9d3SAndroid Build Coastguard Worker         {
99*ba62d9d3SAndroid Build Coastguard Worker             continue;
100*ba62d9d3SAndroid Build Coastguard Worker         }
101*ba62d9d3SAndroid Build Coastguard Worker 
102*ba62d9d3SAndroid Build Coastguard Worker         //Rename kernel name which contains "Dscale" to "DScale" except for "P010_444Dscale16_Buf*"
103*ba62d9d3SAndroid Build Coastguard Worker         string sfilename(ent->d_name);
104*ba62d9d3SAndroid Build Coastguard Worker         size_t pos = sfilename.find("Dscale");
105*ba62d9d3SAndroid Build Coastguard Worker         if (pos != string::npos)
106*ba62d9d3SAndroid Build Coastguard Worker         {
107*ba62d9d3SAndroid Build Coastguard Worker             string ssub = sfilename.substr(0, 9);
108*ba62d9d3SAndroid Build Coastguard Worker             if (ssub.compare("P010_444D"))
109*ba62d9d3SAndroid Build Coastguard Worker             {
110*ba62d9d3SAndroid Build Coastguard Worker                 sfilename.replace(pos, 6, "DScale");
111*ba62d9d3SAndroid Build Coastguard Worker                 strcpy(dirNewfile, dirkrnhex);
112*ba62d9d3SAndroid Build Coastguard Worker                 strcpy(dirOldfile, dirkrnhex);
113*ba62d9d3SAndroid Build Coastguard Worker                 strcat(dirOldfile, ent->d_name);
114*ba62d9d3SAndroid Build Coastguard Worker                 strcat(dirNewfile, sfilename.c_str());
115*ba62d9d3SAndroid Build Coastguard Worker                 if (rename(dirOldfile, dirNewfile))
116*ba62d9d3SAndroid Build Coastguard Worker                 {
117*ba62d9d3SAndroid Build Coastguard Worker                     fprintf(stderr, "Rename file %s to %s failed!\n", dirOldfile, dirNewfile);
118*ba62d9d3SAndroid Build Coastguard Worker                     exit(-1);
119*ba62d9d3SAndroid Build Coastguard Worker                 }
120*ba62d9d3SAndroid Build Coastguard Worker             }
121*ba62d9d3SAndroid Build Coastguard Worker 
122*ba62d9d3SAndroid Build Coastguard Worker         }
123*ba62d9d3SAndroid Build Coastguard Worker 
124*ba62d9d3SAndroid Build Coastguard Worker         // Remove the generated kernel
125*ba62d9d3SAndroid Build Coastguard Worker         list <string>::iterator iter = find(KernelFullList.begin(), KernelFullList.end(), sfilename);
126*ba62d9d3SAndroid Build Coastguard Worker         if (iter != KernelFullList.end())
127*ba62d9d3SAndroid Build Coastguard Worker         {
128*ba62d9d3SAndroid Build Coastguard Worker             KernelFullList.erase(iter);
129*ba62d9d3SAndroid Build Coastguard Worker         }
130*ba62d9d3SAndroid Build Coastguard Worker     }
131*ba62d9d3SAndroid Build Coastguard Worker 
132*ba62d9d3SAndroid Build Coastguard Worker     closedir(pHexDir);
133*ba62d9d3SAndroid Build Coastguard Worker 
134*ba62d9d3SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////////////
135*ba62d9d3SAndroid Build Coastguard Worker     // Create a set of dummy kernel hex that are not included in the generated kernels//
136*ba62d9d3SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////////////
137*ba62d9d3SAndroid Build Coastguard Worker 
138*ba62d9d3SAndroid Build Coastguard Worker     while (!KernelFullList.empty())
139*ba62d9d3SAndroid Build Coastguard Worker     {
140*ba62d9d3SAndroid Build Coastguard Worker         string skernelhex = KernelFullList.front();
141*ba62d9d3SAndroid Build Coastguard Worker         strcpy(dirNewfile, dirkrnhex);
142*ba62d9d3SAndroid Build Coastguard Worker         strcat(dirNewfile, skernelhex.c_str());
143*ba62d9d3SAndroid Build Coastguard Worker         FILE *pfkernelhex = NULL;
144*ba62d9d3SAndroid Build Coastguard Worker         if (!(pfkernelhex = fopen(dirNewfile, "wb")))
145*ba62d9d3SAndroid Build Coastguard Worker         {
146*ba62d9d3SAndroid Build Coastguard Worker             fprintf(stderr, "Create dummy kernel hex file failed!\n");
147*ba62d9d3SAndroid Build Coastguard Worker             exit(-1);
148*ba62d9d3SAndroid Build Coastguard Worker         }
149*ba62d9d3SAndroid Build Coastguard Worker         else
150*ba62d9d3SAndroid Build Coastguard Worker         {
151*ba62d9d3SAndroid Build Coastguard Worker             fclose(pfkernelhex);
152*ba62d9d3SAndroid Build Coastguard Worker         }
153*ba62d9d3SAndroid Build Coastguard Worker         KernelFullList.pop_front();
154*ba62d9d3SAndroid Build Coastguard Worker     }
155*ba62d9d3SAndroid Build Coastguard Worker 
156*ba62d9d3SAndroid Build Coastguard Worker     fprintf(stdout, "Create dummy kernel hex files successfully!\n");
157*ba62d9d3SAndroid Build Coastguard Worker     return 0;
158*ba62d9d3SAndroid Build Coastguard Worker }
159