blob: fb3eee8f2069f5c289b6107eb0497964f53e9ea8 [file] [log] [blame]
Jim Flynn01d02812020-04-29 21:12:13 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Jim Flynn01d02812020-04-29 21:12:13 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "RequestCountersPacketHandler.hpp"
7
8#include "DirectoryCaptureCommandHandler.hpp"
Jim Flynn01d02812020-04-29 21:12:13 +01009
Matthew Sloyan371b70e2020-09-11 10:14:57 +010010#include <armnn/utility/NumericCast.hpp>
11
12#include <common/include/PacketVersionResolver.hpp>
Jim Flynn01d02812020-04-29 21:12:13 +010013#include <common/include/ProfilingException.hpp>
14
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000015namespace arm
Jim Flynn01d02812020-04-29 21:12:13 +010016{
17
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000018namespace pipe
Jim Flynn01d02812020-04-29 21:12:13 +010019{
20
21std::vector<uint32_t> RequestCountersPacketHandler::GetHeadersAccepted()
22{
23 std::vector<uint32_t> headers;
24 headers.push_back(m_CounterDirectoryMessageHeader); // counter directory
25 return headers;
26}
27
Jim Flynnbbfe6032020-07-20 16:57:44 +010028void RequestCountersPacketHandler::HandlePacket(const arm::pipe::Packet& packet)
Jim Flynn01d02812020-04-29 21:12:13 +010029{
30 if (packet.GetHeader() != m_CounterDirectoryMessageHeader)
31 {
32 return;
33 }
Jim Flynnbbfe6032020-07-20 16:57:44 +010034 arm::pipe::PacketVersionResolver packetVersionResolver;
Jim Flynn01d02812020-04-29 21:12:13 +010035 DirectoryCaptureCommandHandler directoryCaptureCommandHandler(
36 0, 2, packetVersionResolver.ResolvePacketVersion(0, 2).GetEncodedValue());
37 directoryCaptureCommandHandler.operator()(packet);
38 const ICounterDirectory& counterDirectory = directoryCaptureCommandHandler.GetCounterDirectory();
39 for (auto& category : counterDirectory.GetCategories())
40 {
41 // Remember we need to translate the Uid's from our CounterDirectory instance to the parent one.
42 std::vector<uint16_t> translatedCounters;
43 for (auto const& copyUid : category->m_Counters)
44 {
45 translatedCounters.emplace_back(directoryCaptureCommandHandler.TranslateUIDCopyToOriginal(copyUid));
46 }
47 m_IdList.insert(std::end(m_IdList), std::begin(translatedCounters), std::end(translatedCounters));
48 }
49 SendCounterSelectionPacket();
50}
51
52void RequestCountersPacketHandler::SendCounterSelectionPacket()
53{
54 uint32_t uint16_t_size = sizeof(uint16_t);
55 uint32_t uint32_t_size = sizeof(uint32_t);
56
57 uint32_t offset = 0;
Matthew Sloyan371b70e2020-09-11 10:14:57 +010058 uint32_t bodySize = uint32_t_size + armnn::numeric_cast<uint32_t>(m_IdList.size()) * uint16_t_size;
Jim Flynn01d02812020-04-29 21:12:13 +010059
60 auto uniqueData = std::make_unique<unsigned char[]>(bodySize);
61 auto data = reinterpret_cast<unsigned char*>(uniqueData.get());
62
63 // Copy capturePeriod
64 WriteUint32(data, offset, m_CapturePeriod);
65
66 // Copy m_IdList
67 offset += uint32_t_size;
68 for (const uint16_t& id : m_IdList)
69 {
70 WriteUint16(data, offset, id);
71 offset += uint16_t_size;
72 }
73
Jim Flynnbbfe6032020-07-20 16:57:44 +010074 arm::pipe::Packet packet(0x40000, bodySize, uniqueData);
Jim Flynn01d02812020-04-29 21:12:13 +010075 m_Connection->ReturnPacket(packet);
76}
77
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000078} // namespace pipe
Jim Flynn01d02812020-04-29 21:12:13 +010079
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000080} // namespace arm