/* * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include #include #include #include typedef std::list GenCmdList; template Type genCmdCast(void *cmd); template static inline GenCmdList::iterator find(GenCmdList::iterator itorStart, GenCmdList::const_iterator itorEnd) { GenCmdList::iterator itor = itorStart; while (itor != itorEnd) { if (genCmdCast(*itor)) break; ++itor; } return itor; } template static inline std::vector findAll(GenCmdList::iterator commandListStart, GenCmdList::const_iterator commandListEnd) { std::vector matchedCommands; GenCmdList::iterator currentCommand = commandListStart; while (currentCommand != commandListEnd) { if (genCmdCast(*currentCommand)) { matchedCommands.push_back(currentCommand); } ++currentCommand; } return matchedCommands; } template static inline GenCmdList::iterator findMmio(GenCmdList::iterator itorStart, GenCmdList::const_iterator itorEnd, uint32_t regOffset) { GenCmdList::iterator itor = itorStart; while (itor != itorEnd) { auto cmd = genCmdCast(*itor); if (cmd && cmd->getRegisterOffset() == regOffset) break; ++itor; } return itor; } template static inline size_t countMmio(GenCmdList::iterator itorStart, GenCmdList::const_iterator itorEnd, uint32_t regOffset) { size_t count = 0; GenCmdList::iterator itor = itorStart; while (itor != itorEnd) { auto cmd = genCmdCast(*itor); if (cmd && cmd->getRegisterOffset() == regOffset) { ++count; } ++itor; } return count; } template static inline typename FamilyType::MI_LOAD_REGISTER_IMM *findMmioCmd(GenCmdList::iterator itorStart, GenCmdList::const_iterator itorEnd, uint32_t regOffset) { auto itor = findMmio(itorStart, itorEnd, regOffset); if (itor == itorEnd) { return nullptr; } return reinterpret_cast(*itor); } template static inline GenCmdList::reverse_iterator reverseFind(GenCmdList::reverse_iterator itorStart, GenCmdList::const_reverse_iterator itorEnd) { GenCmdList::reverse_iterator itor = itorStart; while (itor != itorEnd) { if (genCmdCast(*itor)) break; ++itor; } return itor; } template struct CmdParse : public T { static size_t getCommandLength(void *cmd); static size_t getCommandLengthHwSpecific(void *cmd); static size_t getAdditionalCommandLength(void *cmd); static bool parseCommandBuffer(GenCmdList &cmds, void *buffer, size_t length); template static void validateCommand(GenCmdList::iterator itorBegin, GenCmdList::iterator itorEnd); static const char *getCommandName(void *cmd); static const char *getCommandNameHwSpecific(void *cmd); static const char *getAdditionalCommandName(void *cmd); };