blob: 6e544c9097f9ca60c83a6232788cbcaee9b7afdb [file] [log] [blame]
Ferran Balaguer1b941722019-08-28 16:57:18 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Ferran Balaguer1b941722019-08-28 16:57:18 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Sadik Armagan3896b472020-02-10 12:24:15 +00008#include "ProfilingStateMachine.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +01009#include "SendCounterPacket.hpp"
10#include "IPeriodicCounterCapture.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +010011
Jim Flynn27761832022-03-20 21:52:17 +000012#include <client/include/CounterIdMap.hpp>
13#include <client/include/Holder.hpp>
14#include <client/include/ICounterValues.hpp>
15
16#include <client/include/backends/IBackendProfilingContext.hpp>
Finn Williams032bc742020-02-12 11:02:34 +000017
Jim Flynnbbfe6032020-07-20 16:57:44 +010018#include <common/include/CommandHandlerFunctor.hpp>
Jim Flynn6c9f17d2022-03-10 23:13:01 +000019#include <common/include/Logging.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010020#include <common/include/Packet.hpp>
Finn Williams032bc742020-02-12 11:02:34 +000021
Jim Flynnbbfe6032020-07-20 16:57:44 +010022#include <set>
Finn Williams032bc742020-02-12 11:02:34 +000023
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000024namespace arm
Ferran Balaguer1b941722019-08-28 16:57:18 +010025{
26
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000027namespace pipe
Ferran Balaguer1b941722019-08-28 16:57:18 +010028{
29
Finn Williams032bc742020-02-12 11:02:34 +000030
Jim Flynnbbfe6032020-07-20 16:57:44 +010031class PeriodicCounterSelectionCommandHandler : public arm::pipe::CommandHandlerFunctor
Ferran Balaguer1b941722019-08-28 16:57:18 +010032{
33
34public:
Jim Flynn397043f2019-10-17 17:37:10 +010035 PeriodicCounterSelectionCommandHandler(uint32_t familyId,
36 uint32_t packetId,
Matteo Martincighe8485382019-10-10 14:08:21 +010037 uint32_t version,
Cathal Corbett6f073722022-03-04 12:11:09 +000038 const std::unordered_map<std::string,
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000039 std::shared_ptr<IBackendProfilingContext>>&
Finn Williamsfe5a24b2020-04-09 16:05:28 +010040 backendProfilingContexts,
Finn Williams032bc742020-02-12 11:02:34 +000041 const ICounterMappings& counterIdMap,
Matteo Martincighe8485382019-10-10 14:08:21 +010042 Holder& captureDataHolder,
Finn Williams032bc742020-02-12 11:02:34 +000043 const uint16_t maxArmnnCounterId,
Matteo Martincighe8485382019-10-10 14:08:21 +010044 IPeriodicCounterCapture& periodicCounterCapture,
45 const IReadCounterValues& readCounterValue,
46 ISendCounterPacket& sendCounterPacket,
47 const ProfilingStateMachine& profilingStateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +010048 : CommandHandlerFunctor(familyId, packetId, version)
Finn Williamsfe5a24b2020-04-09 16:05:28 +010049 , m_BackendProfilingContexts(backendProfilingContexts)
Finn Williams032bc742020-02-12 11:02:34 +000050 , m_CounterIdMap(counterIdMap)
Matteo Martincighe8485382019-10-10 14:08:21 +010051 , m_CaptureDataHolder(captureDataHolder)
Finn Williams032bc742020-02-12 11:02:34 +000052 , m_MaxArmCounterId(maxArmnnCounterId)
Matteo Martincighe8485382019-10-10 14:08:21 +010053 , m_PeriodicCounterCapture(periodicCounterCapture)
Finn Williams032bc742020-02-12 11:02:34 +000054 , m_PrevCapturePeriod(0)
Matteo Martincighe8485382019-10-10 14:08:21 +010055 , m_ReadCounterValues(readCounterValue)
56 , m_SendCounterPacket(sendCounterPacket)
57 , m_StateMachine(profilingStateMachine)
Finn Williams032bc742020-02-12 11:02:34 +000058
59 {
60
61 }
Ferran Balaguer1b941722019-08-28 16:57:18 +010062
Jim Flynnbbfe6032020-07-20 16:57:44 +010063 void operator()(const arm::pipe::Packet& packet) override;
Ferran Balaguer1b941722019-08-28 16:57:18 +010064
Ferran Balaguer1b941722019-08-28 16:57:18 +010065private:
Finn Williams032bc742020-02-12 11:02:34 +000066
Cathal Corbett6f073722022-03-04 12:11:09 +000067 std::unordered_map<std::string, std::vector<uint16_t>> m_BackendCounterMap;
68 const std::unordered_map<std::string,
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000069 std::shared_ptr<IBackendProfilingContext>>& m_BackendProfilingContexts;
Finn Williams032bc742020-02-12 11:02:34 +000070 const ICounterMappings& m_CounterIdMap;
Ferran Balaguer1b941722019-08-28 16:57:18 +010071 Holder& m_CaptureDataHolder;
Finn Williams032bc742020-02-12 11:02:34 +000072 const uint16_t m_MaxArmCounterId;
Matteo Martincighe8485382019-10-10 14:08:21 +010073 IPeriodicCounterCapture& m_PeriodicCounterCapture;
Finn Williams032bc742020-02-12 11:02:34 +000074 uint32_t m_PrevCapturePeriod;
75 std::set<uint16_t> m_PrevBackendCounterIds;
Matteo Martincighe8485382019-10-10 14:08:21 +010076 const IReadCounterValues& m_ReadCounterValues;
Ferran Balaguer1b941722019-08-28 16:57:18 +010077 ISendCounterPacket& m_SendCounterPacket;
Matteo Martincighe8485382019-10-10 14:08:21 +010078 const ProfilingStateMachine& m_StateMachine;
79
Cathal Corbett6f073722022-03-04 12:11:09 +000080 void ActivateBackendCounters(const std::string backendId,
81 const uint32_t capturePeriod,
82 const std::vector<uint16_t> counterIds)
Finn Williams032bc742020-02-12 11:02:34 +000083 {
Jim Flynndecd08b2022-03-13 22:35:46 +000084 arm::pipe::Optional<std::string> errorMsg =
Finn Williamsfe5a24b2020-04-09 16:05:28 +010085 m_BackendProfilingContexts.at(backendId)->ActivateCounters(capturePeriod, counterIds);
Finn Williams032bc742020-02-12 11:02:34 +000086
87 if(errorMsg.has_value())
88 {
Jim Flynn6c9f17d2022-03-10 23:13:01 +000089 ARM_PIPE_LOG(warning) << "An error has occurred when activating counters of " << backendId << ": "
Finn Williams032bc742020-02-12 11:02:34 +000090 << errorMsg.value();
91 }
92 }
Jim Flynnbbfe6032020-07-20 16:57:44 +010093 void ParseData(const arm::pipe::Packet& packet, CaptureData& captureData);
Cathal Corbett6f073722022-03-04 12:11:09 +000094 std::set<std::string> ProcessBackendCounterIds(const uint32_t capturePeriod,
Finn Williamsfe5a24b2020-04-09 16:05:28 +010095 const std::set<uint16_t> newCounterIds,
96 const std::set<uint16_t> unusedCounterIds);
Finn Williams032bc742020-02-12 11:02:34 +000097
Ferran Balaguer1b941722019-08-28 16:57:18 +010098};
99
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000100} // namespace pipe
Ferran Balaguer1b941722019-08-28 16:57:18 +0100101
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000102} // namespace arm