feature: Add interface for Ext area regarding payload args in zebin spec

Related-To: NEO-14899, IGC-11358

Signed-off-by: Arek G <arkadiusz.grubba@intel.com>
This commit is contained in:
Arek G
2025-06-04 10:09:27 +00:00
committed by Compute-Runtime-Automation
parent b83fbdd9e8
commit fa7d69209c
8 changed files with 100 additions and 2 deletions

View File

@@ -12,6 +12,7 @@
#include "shared/source/utilities/const_stringref.h"
#include <array>
#include <cstring>
#include <optional>
namespace NEO::Zebin::ZeInfo {
@@ -663,7 +664,43 @@ inline constexpr OffsetT offset = -1;
inline constexpr BtiValueT btiValue = -1;
} // namespace Defaults
struct PayloadArgumentBaseT {
struct PayloadArgElasticPtrBaseT;
struct PayloadArgumentBaseT;
struct PayloadArgumentExtT;
PayloadArgumentExtT *allocatePayloadArgumentExt();
void freePayloadArgumentExt(PayloadArgumentExtT *);
void copyPayloadArgumentExt(PayloadArgumentExtT *&, const PayloadArgElasticPtrBaseT &);
struct PayloadArgElasticPtrBaseT {
PayloadArgElasticPtrBaseT() {
pPayArgExt = allocatePayloadArgumentExt();
}
~PayloadArgElasticPtrBaseT() {
freePayloadArgumentExt(pPayArgExt);
}
PayloadArgElasticPtrBaseT(const PayloadArgElasticPtrBaseT &src) {
copyPayloadArgumentExt(pPayArgExt, src);
}
PayloadArgElasticPtrBaseT &operator=(const PayloadArgElasticPtrBaseT &rhs) {
if (this != &rhs) {
copyPayloadArgumentExt(pPayArgExt, rhs);
}
return *this;
}
PayloadArgElasticPtrBaseT(PayloadArgElasticPtrBaseT &&src) noexcept : pPayArgExt(src.pPayArgExt) {
src.pPayArgExt = nullptr;
}
PayloadArgElasticPtrBaseT &operator=(PayloadArgElasticPtrBaseT &&rhs) noexcept {
if (this != &rhs) {
this->pPayArgExt = rhs.pPayArgExt;
rhs.pPayArgExt = nullptr;
}
return *this;
}
PayloadArgumentExtT *pPayArgExt = nullptr;
};
struct PayloadArgumentBaseT : PayloadArgElasticPtrBaseT {
ArgTypeT argType = argTypeUnknown;
OffsetT offset = Defaults::offset;
SourceOffseT sourceOffset = Defaults::sourceOffset;

View File

@@ -1107,7 +1107,8 @@ DecodeError readZeInfoPayloadArguments(const Yaml::YamlParser &parser, const Yam
for (const auto &payloadArgumentMemberNd : parser.createChildrenRange(payloadArgumentNd)) {
auto key = parser.readKey(payloadArgumentMemberNd);
if (Tags::Kernel::PayloadArgument::argType == key) {
validPayload &= readZeInfoEnumChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.argType, context, outErrReason);
validPayload &= readZeInfoArgTypeNameCheckedExt(parser, payloadArgumentMemberNd, payloadArgMetadata) ||
readZeInfoEnumChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.argType, context, outErrReason);
} else if (Tags::Kernel::PayloadArgument::argIndex == key) {
validPayload &= parser.readValueChecked(payloadArgumentMemberNd, payloadArgMetadata.argIndex);
outMaxPayloadArgumentIndex = std::max<int32_t>(outMaxPayloadArgumentIndex, payloadArgMetadata.argIndex);
@@ -1207,6 +1208,9 @@ DecodeError populateKernelPayloadArgument(NEO::KernelDescriptor &dst, const Kern
switch (src.argType) {
default:
if (DecodeError::success == populateKernelPayloadArgumentExt(dst, src, outErrReason)) {
return DecodeError::success;
}
outErrReason.append("DeviceBinaryFormat::zebin : Invalid arg type in cross thread data section in context of : " + kernelName + ".\n");
return DecodeError::invalidBinary; // unsupported

View File

@@ -22,6 +22,7 @@ namespace Zebin::ZeInfo {
inline constexpr NEO::Zebin::ZeInfo::Types::Version zeInfoDecoderVersion{1, 54};
using KernelExecutionEnvBaseT = Types::Kernel::ExecutionEnv::ExecutionEnvBaseT;
using KernelPayloadArgBaseT = Types::Kernel::PayloadArgument::PayloadArgumentBaseT;
template <typename T>
bool readZeInfoValueChecked(const NEO::Yaml::YamlParser &parser, const NEO::Yaml::Node &node, T &outValue, ConstStringRef context, std::string &outErrReason);

View File

@@ -17,6 +17,10 @@ void readZeInfoValueCheckedExtra(const NEO::Yaml::YamlParser &parser, const NEO:
encounterUnknownZeInfoAttribute(entry.str(), outErrReason, outWarning, error);
}
bool readZeInfoArgTypeNameCheckedExt(const NEO::Yaml::YamlParser &parser, const NEO::Yaml::Node &payloadArgumentMemberNd, KernelPayloadArgBaseT &outKernelPayArg) {
return false;
}
namespace Types::Kernel::ExecutionEnv {
ExecutionEnvExt *allocateExecEnvExt() {
return nullptr;
@@ -28,4 +32,18 @@ void freeExecEnvExt(ExecutionEnvExt *envExt) {
void populateKernelExecutionEnvironmentExt(KernelDescriptor &dst, const KernelExecutionEnvBaseT &execEnv, const Types::Version &srcZeInfoVersion) {
}
namespace Types::Kernel::PayloadArgument {
PayloadArgumentExtT *allocatePayloadArgumentExt() {
return nullptr;
}
void freePayloadArgumentExt(PayloadArgumentExtT *pPayArgExt) {
}
void copyPayloadArgumentExt(PayloadArgumentExtT *&pPayArgExtOut, const PayloadArgElasticPtrBaseT &src) {
}
} // namespace Types::Kernel::PayloadArgument
DecodeError populateKernelPayloadArgumentExt(NEO::KernelDescriptor &dst, const KernelPayloadArgBaseT &src, std::string &outErrReason) {
return DecodeError::unhandledBinary;
}
} // namespace NEO::Zebin::ZeInfo

View File

@@ -13,4 +13,8 @@ namespace NEO::Zebin::ZeInfo {
void populateKernelExecutionEnvironmentExt(KernelDescriptor &dst, const KernelExecutionEnvBaseT &execEnv, const Types::Version &srcZeInfoVersion);
DecodeError populateKernelPayloadArgumentExt(NEO::KernelDescriptor &dst, const KernelPayloadArgBaseT &src, std::string &outErrReason);
bool readZeInfoArgTypeNameCheckedExt(const NEO::Yaml::YamlParser &parser, const NEO::Yaml::Node &payloadArgumentMemberNd, KernelPayloadArgBaseT &outKernelPayArg);
} // namespace NEO::Zebin::ZeInfo