/* * Copyright (C) 2020-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/command_container/command_encoder.h" #include "shared/source/command_stream/linear_stream.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/debugger/debugger_l0.h" #include "shared/source/device/device.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/gfx_core_helper.h" namespace NEO { template void DebuggerL0Hw::captureStateBaseAddress(NEO::LinearStream &cmdStream, SbaAddresses sba, bool useFirstLevelBB) { using MI_STORE_DATA_IMM = typename GfxFamily::MI_STORE_DATA_IMM; using MI_STORE_REGISTER_MEM = typename GfxFamily::MI_STORE_REGISTER_MEM; using MI_BATCH_BUFFER_START = typename GfxFamily::MI_BATCH_BUFFER_START; const auto gmmHelper = device->getGmmHelper(); const auto gpuAddress = gmmHelper->decanonize(sbaTrackingGpuVa.address); SbaAddresses sbaCanonized = sba; sbaCanonized.GeneralStateBaseAddress = gmmHelper->canonize(sba.GeneralStateBaseAddress); sbaCanonized.SurfaceStateBaseAddress = gmmHelper->canonize(sba.SurfaceStateBaseAddress); sbaCanonized.DynamicStateBaseAddress = gmmHelper->canonize(sba.DynamicStateBaseAddress); sbaCanonized.IndirectObjectBaseAddress = gmmHelper->canonize(sba.IndirectObjectBaseAddress); sbaCanonized.InstructionBaseAddress = gmmHelper->canonize(sba.InstructionBaseAddress); sbaCanonized.BindlessSurfaceStateBaseAddress = gmmHelper->canonize(sba.BindlessSurfaceStateBaseAddress); sbaCanonized.BindlessSamplerStateBaseAddress = gmmHelper->canonize(sba.BindlessSamplerStateBaseAddress); PRINT_DEBUGGER_INFO_LOG("Debugger: SBA stored ssh = %" SCNx64 " gsba = %" SCNx64 " dsba = %" SCNx64 " ioba = %" SCNx64 " iba = %" SCNx64 " bsurfsba = %" SCNx64 "\n", sbaCanonized.SurfaceStateBaseAddress, sbaCanonized.GeneralStateBaseAddress, sbaCanonized.DynamicStateBaseAddress, sbaCanonized.IndirectObjectBaseAddress, sbaCanonized.InstructionBaseAddress, sbaCanonized.BindlessSurfaceStateBaseAddress); if (singleAddressSpaceSbaTracking) { programSbaTrackingCommandsSingleAddressSpace(cmdStream, sbaCanonized, useFirstLevelBB); } else { if (sbaCanonized.GeneralStateBaseAddress) { auto generalStateBaseAddress = sbaCanonized.GeneralStateBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, GeneralStateBaseAddress), static_cast(generalStateBaseAddress & 0x0000FFFFFFFFULL), static_cast(generalStateBaseAddress >> 32), true, false); } if (sbaCanonized.SurfaceStateBaseAddress) { auto surfaceStateBaseAddress = sbaCanonized.SurfaceStateBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, SurfaceStateBaseAddress), static_cast(surfaceStateBaseAddress & 0x0000FFFFFFFFULL), static_cast(surfaceStateBaseAddress >> 32), true, false); } if (sbaCanonized.DynamicStateBaseAddress) { auto dynamicStateBaseAddress = sbaCanonized.DynamicStateBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, DynamicStateBaseAddress), static_cast(dynamicStateBaseAddress & 0x0000FFFFFFFFULL), static_cast(dynamicStateBaseAddress >> 32), true, false); } if (sbaCanonized.IndirectObjectBaseAddress) { auto indirectObjectBaseAddress = sbaCanonized.IndirectObjectBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, IndirectObjectBaseAddress), static_cast(indirectObjectBaseAddress & 0x0000FFFFFFFFULL), static_cast(indirectObjectBaseAddress >> 32), true, false); } if (sbaCanonized.InstructionBaseAddress) { auto instructionBaseAddress = sbaCanonized.InstructionBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, InstructionBaseAddress), static_cast(instructionBaseAddress & 0x0000FFFFFFFFULL), static_cast(instructionBaseAddress >> 32), true, false); } if (sbaCanonized.BindlessSurfaceStateBaseAddress) { auto bindlessSurfaceStateBaseAddress = sbaCanonized.BindlessSurfaceStateBaseAddress; NEO::EncodeStoreMemory::programStoreDataImm(cmdStream, gpuAddress + offsetof(SbaTrackedAddresses, BindlessSurfaceStateBaseAddress), static_cast(bindlessSurfaceStateBaseAddress & 0x0000FFFFFFFFULL), static_cast(bindlessSurfaceStateBaseAddress >> 32), true, false); } } } template DebuggerL0 *DebuggerL0Hw::allocate(NEO::Device *device) { return new DebuggerL0Hw(device); } template size_t DebuggerL0Hw::getSbaAddressLoadCommandsSize() { if (!singleAddressSpaceSbaTracking) { return 0; } return 2 * sizeof(typename GfxFamily::MI_LOAD_REGISTER_IMM); } template void DebuggerL0Hw::programSbaAddressLoad(NEO::LinearStream &cmdStream, uint64_t sbaGpuVa) { if (!singleAddressSpaceSbaTracking) { return; } uint32_t low = sbaGpuVa & 0xffffffff; uint32_t high = (sbaGpuVa >> 32) & 0xffffffff; NEO::LriHelper::program(&cmdStream, CS_GPR_R15, low, true); NEO::LriHelper::program(&cmdStream, CS_GPR_R15 + 4, high, true); } } // namespace NEO