blob: de10ec8892d1e4145517cf9bec04fd44c95e2126 [file] [log] [blame]
Keith Davis3201eea2019-10-24 17:30:41 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Keith Davis3201eea2019-10-24 17:30:41 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Jim Flynnbbfe6032020-07-20 16:57:44 +01008#include <common/include/CommandHandlerFunctor.hpp>
Jim Flynnc454ac92022-03-16 18:43:18 +00009#include <common/include/CounterDirectory.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010010
Keith Davis3201eea2019-10-24 17:30:41 +010011#include <atomic>
12
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000013namespace arm
Keith Davis3201eea2019-10-24 17:30:41 +010014{
15
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000016namespace pipe
Keith Davis3201eea2019-10-24 17:30:41 +010017{
18
19struct CounterDirectoryEventRecord
20{
21 uint16_t m_CounterClass;
22 std::string m_CounterDescription;
23 uint16_t m_CounterInterpolation;
24 double m_CounterMultiplier;
25 std::string m_CounterName;
26 uint16_t m_CounterSetUid;
27 uint16_t m_CounterUid;
Jim Flynndecd08b2022-03-13 22:35:46 +000028 arm::pipe::Optional<std::string> m_CounterUnits;
Keith Davis3201eea2019-10-24 17:30:41 +010029 uint16_t m_DeviceUid;
30 uint16_t m_MaxCounterUid;
31};
32
Jim Flynnbbfe6032020-07-20 16:57:44 +010033class DirectoryCaptureCommandHandler : public arm::pipe::CommandHandlerFunctor
Keith Davis3201eea2019-10-24 17:30:41 +010034{
35
36public:
Jim Flynn4a962112022-03-13 20:18:58 +000037 DirectoryCaptureCommandHandler(const std::string& applicationName,
38 uint32_t familyId,
39 uint32_t packetId,
40 uint32_t version,
41 bool quietOperation = true)
Keith Davis3201eea2019-10-24 17:30:41 +010042 : CommandHandlerFunctor(familyId, packetId, version)
Jim Flynn4a962112022-03-13 20:18:58 +000043 , m_ApplicationName(applicationName)
Keith Davis3201eea2019-10-24 17:30:41 +010044 , m_QuietOperation(quietOperation)
45 , m_AlreadyParsed(false)
46 {}
47
Jim Flynnbbfe6032020-07-20 16:57:44 +010048 void operator()(const arm::pipe::Packet& packet) override;
Keith Davis3201eea2019-10-24 17:30:41 +010049
50 const ICounterDirectory& GetCounterDirectory() const;
51
52 bool ParsedCounterDirectory()
53 {
54 return m_AlreadyParsed.load();
55 }
56
57 /**
58 * Given a Uid that came from a copy of the counter directory translate it to the original.
59 *
60 * @param copyUid
61 * @return the original Uid that the copy maps to.
62 */
63 uint16_t TranslateUIDCopyToOriginal(uint16_t copyUid)
64 {
65 return m_UidTranslation[copyUid];
66 }
67
68private:
Jim Flynnbbfe6032020-07-20 16:57:44 +010069 void ParseData(const arm::pipe::Packet& packet);
Keith Davis3201eea2019-10-24 17:30:41 +010070
71 void ReadCategoryRecords(const unsigned char* data, uint32_t offset, std::vector<uint32_t> categoryOffsets);
72
73 std::vector<CounterDirectoryEventRecord>
74 ReadEventRecords(const unsigned char* data, uint32_t offset, std::vector<uint32_t> eventRecordsOffsets);
75
76 std::string GetStringNameFromBuffer(const unsigned char* data, uint32_t offset);
77 bool IsValidChar(unsigned char c);
78
Jim Flynn4a962112022-03-13 20:18:58 +000079 std::string m_ApplicationName;
Keith Davis3201eea2019-10-24 17:30:41 +010080 CounterDirectory m_CounterDirectory;
81 std::unordered_map<uint16_t, uint16_t> m_UidTranslation;
82 bool m_QuietOperation;
83 // We can only parse the counter directory once per instance. It won't change anyway as it's static
84 // per instance of ArmNN.
85 std::atomic<bool> m_AlreadyParsed;
86};
87
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000088} // namespace pipe
Keith Davis3201eea2019-10-24 17:30:41 +010089
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000090} // namespace arm