@@ -13,29 +13,48 @@ using namespace loader_driver_ddi;
1313
1414namespace loader
1515{
16+ // /////////////////////////////////////////////////////////////////////////////
17+ // / @brief Initialize all DDI tables for a driver by calling *FromDriver functions
18+ // /
19+ // / @details This function can fail in the following scenarios:
20+ // / - driver->initStatus is already set to a failure code (from a previous
21+ // / required DDI initialization failure). Each *FromDriver call first checks
22+ // / driver->initStatus and returns it immediately if it's already a failure.
23+ // / - A required DDI table's getTable call into the driver returns a failure,
24+ // / which updates driver->initStatus and is propagated back
25+ // /
26+ // / Note: If GET_FUNCTION_PTR returns null (function not found in driver),
27+ // / it only fails if driver->initStatus was already a failure. Otherwise,
28+ // / driver->initStatus is returned (which would be SUCCESS).
29+ // /
30+ // / Note: Optional DDI tables (when namespace != "zer") are ignored if they
31+ // / fail, and this function continues to attempt loading remaining tables.
32+ // / Only required DDI table failures cause this function to fail and return
33+ // / immediately.
34+ // /
35+ // / @returns
36+ // / - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
37+ // / - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
1638 __zedlllocal ze_result_t ZE_APICALL
1739 zesloaderInitDriverDDITables (loader::driver_t *driver) {
1840 ze_result_t result = ZE_RESULT_SUCCESS;
19- result = zesGetGlobalProcAddrTableFromDriver (driver);
20- if (result != ZE_RESULT_SUCCESS) {
21- return result;
22- }
41+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
42+ zesGetGlobalProcAddrTableFromDriver (driver);
43+ result = ZE_RESULT_SUCCESS;
2344 result = zesGetDeviceProcAddrTableFromDriver (driver);
2445 if (result != ZE_RESULT_SUCCESS) {
2546 return result;
2647 }
27- result = zesGetDeviceExpProcAddrTableFromDriver (driver);
28- if (result != ZE_RESULT_SUCCESS) {
29- return result;
30- }
48+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
49+ zesGetDeviceExpProcAddrTableFromDriver (driver);
50+ result = ZE_RESULT_SUCCESS;
3151 result = zesGetDriverProcAddrTableFromDriver (driver);
3252 if (result != ZE_RESULT_SUCCESS) {
3353 return result;
3454 }
35- result = zesGetDriverExpProcAddrTableFromDriver (driver);
36- if (result != ZE_RESULT_SUCCESS) {
37- return result;
38- }
55+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
56+ zesGetDriverExpProcAddrTableFromDriver (driver);
57+ result = ZE_RESULT_SUCCESS;
3958 result = zesGetDiagnosticsProcAddrTableFromDriver (driver);
4059 if (result != ZE_RESULT_SUCCESS) {
4160 return result;
@@ -56,10 +75,9 @@ namespace loader
5675 if (result != ZE_RESULT_SUCCESS) {
5776 return result;
5877 }
59- result = zesGetFirmwareExpProcAddrTableFromDriver (driver);
60- if (result != ZE_RESULT_SUCCESS) {
61- return result;
62- }
78+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
79+ zesGetFirmwareExpProcAddrTableFromDriver (driver);
80+ result = ZE_RESULT_SUCCESS;
6381 result = zesGetFrequencyProcAddrTableFromDriver (driver);
6482 if (result != ZE_RESULT_SUCCESS) {
6583 return result;
@@ -72,10 +90,9 @@ namespace loader
7290 if (result != ZE_RESULT_SUCCESS) {
7391 return result;
7492 }
75- result = zesGetOverclockProcAddrTableFromDriver (driver);
76- if (result != ZE_RESULT_SUCCESS) {
77- return result;
78- }
93+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
94+ zesGetOverclockProcAddrTableFromDriver (driver);
95+ result = ZE_RESULT_SUCCESS;
7996 result = zesGetPerformanceFactorProcAddrTableFromDriver (driver);
8097 if (result != ZE_RESULT_SUCCESS) {
8198 return result;
@@ -92,10 +109,9 @@ namespace loader
92109 if (result != ZE_RESULT_SUCCESS) {
93110 return result;
94111 }
95- result = zesGetRasExpProcAddrTableFromDriver (driver);
96- if (result != ZE_RESULT_SUCCESS) {
97- return result;
98- }
112+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
113+ zesGetRasExpProcAddrTableFromDriver (driver);
114+ result = ZE_RESULT_SUCCESS;
99115 result = zesGetSchedulerProcAddrTableFromDriver (driver);
100116 if (result != ZE_RESULT_SUCCESS) {
101117 return result;
@@ -108,10 +124,9 @@ namespace loader
108124 if (result != ZE_RESULT_SUCCESS) {
109125 return result;
110126 }
111- result = zesGetVFManagementExpProcAddrTableFromDriver (driver);
112- if (result != ZE_RESULT_SUCCESS) {
113- return result;
114- }
127+ // Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
128+ zesGetVFManagementExpProcAddrTableFromDriver (driver);
129+ result = ZE_RESULT_SUCCESS;
115130 return result;
116131 }
117132 // /////////////////////////////////////////////////////////////////////////////
@@ -5059,8 +5074,7 @@ zesGetGlobalProcAddrTableFromDriver(loader::driver_t *driver)
50595074 auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .Global );
50605075 if (getTableResult == ZE_RESULT_SUCCESS) {
50615076 loader::context->configured_version = loader::context->ddi_init_version ;
5062- } else
5063- driver->initStatus = getTableResult;
5077+ }
50645078 return result;
50655079}
50665080// /////////////////////////////////////////////////////////////////////////////
@@ -5108,7 +5122,10 @@ zesGetDeviceExpProcAddrTableFromDriver(loader::driver_t *driver)
51085122 GET_FUNCTION_PTR ( driver->handle , " zesGetDeviceExpProcAddrTable" ) );
51095123 if (!getTable)
51105124 return driver->initStatus ;
5111- result = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .DeviceExp );
5125+ auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .DeviceExp );
5126+ if (getTableResult == ZE_RESULT_SUCCESS) {
5127+ loader::context->configured_version = loader::context->ddi_init_version ;
5128+ }
51125129 return result;
51135130}
51145131// /////////////////////////////////////////////////////////////////////////////
@@ -5156,7 +5173,10 @@ zesGetDriverExpProcAddrTableFromDriver(loader::driver_t *driver)
51565173 GET_FUNCTION_PTR ( driver->handle , " zesGetDriverExpProcAddrTable" ) );
51575174 if (!getTable)
51585175 return driver->initStatus ;
5159- result = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .DriverExp );
5176+ auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .DriverExp );
5177+ if (getTableResult == ZE_RESULT_SUCCESS) {
5178+ loader::context->configured_version = loader::context->ddi_init_version ;
5179+ }
51605180 return result;
51615181}
51625182// /////////////////////////////////////////////////////////////////////////////
@@ -5308,7 +5328,10 @@ zesGetFirmwareExpProcAddrTableFromDriver(loader::driver_t *driver)
53085328 GET_FUNCTION_PTR ( driver->handle , " zesGetFirmwareExpProcAddrTable" ) );
53095329 if (!getTable)
53105330 return driver->initStatus ;
5311- result = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .FirmwareExp );
5331+ auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .FirmwareExp );
5332+ if (getTableResult == ZE_RESULT_SUCCESS) {
5333+ loader::context->configured_version = loader::context->ddi_init_version ;
5334+ }
53125335 return result;
53135336}
53145337// /////////////////////////////////////////////////////////////////////////////
@@ -5414,8 +5437,7 @@ zesGetOverclockProcAddrTableFromDriver(loader::driver_t *driver)
54145437 auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .Overclock );
54155438 if (getTableResult == ZE_RESULT_SUCCESS) {
54165439 loader::context->configured_version = loader::context->ddi_init_version ;
5417- } else
5418- driver->initStatus = getTableResult;
5440+ }
54195441 return result;
54205442}
54215443// /////////////////////////////////////////////////////////////////////////////
@@ -5541,7 +5563,10 @@ zesGetRasExpProcAddrTableFromDriver(loader::driver_t *driver)
55415563 GET_FUNCTION_PTR ( driver->handle , " zesGetRasExpProcAddrTable" ) );
55425564 if (!getTable)
55435565 return driver->initStatus ;
5544- result = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .RasExp );
5566+ auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .RasExp );
5567+ if (getTableResult == ZE_RESULT_SUCCESS) {
5568+ loader::context->configured_version = loader::context->ddi_init_version ;
5569+ }
55455570 return result;
55465571}
55475572// /////////////////////////////////////////////////////////////////////////////
@@ -5641,7 +5666,10 @@ zesGetVFManagementExpProcAddrTableFromDriver(loader::driver_t *driver)
56415666 GET_FUNCTION_PTR ( driver->handle , " zesGetVFManagementExpProcAddrTable" ) );
56425667 if (!getTable)
56435668 return driver->initStatus ;
5644- result = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .VFManagementExp );
5669+ auto getTableResult = getTable ( loader::context->ddi_init_version , &driver->dditable .zes .VFManagementExp );
5670+ if (getTableResult == ZE_RESULT_SUCCESS) {
5671+ loader::context->configured_version = loader::context->ddi_init_version ;
5672+ }
56455673 return result;
56465674}
56475675// /////////////////////////////////////////////////////////////////////////////
0 commit comments