blob: e37e109094b6e02382d4e05c6e42dc31672440e5 [file] [log] [blame]
Ferran Balaguer73882172019-09-02 16:39:42 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Ferran Balaguer73882172019-09-02 16:39:42 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Francis Murtagh3a161982019-09-04 15:25:02 +01008#include <armnn/Exceptions.hpp>
Colm Donelan5ccb33d2020-01-24 16:27:02 +00009#include <armnn/profiling/ISendTimelinePacket.hpp>
Francis Murtagh3a161982019-09-04 15:25:02 +010010
Matthew Sloyan371b70e2020-09-11 10:14:57 +010011#include <armnn/utility/NumericCast.hpp>
12
Keith Davis3201eea2019-10-24 17:30:41 +010013#include "ICounterDirectory.hpp"
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010014#include "IPacketBuffer.hpp"
Finn Williams0c8cb992020-05-07 10:38:15 +010015
Jim Flynnbbfe6032020-07-20 16:57:44 +010016#include <common/include/Packet.hpp>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010017
Matteo Martincigh6db5f202019-09-05 12:02:04 +010018#include <algorithm>
19#include <cstring>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010020#include <memory>
21#include <string>
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000022#include <thread>
Colm Donelan5ccb33d2020-01-24 16:27:02 +000023#include <vector>
Ferran Balaguer73882172019-09-02 16:39:42 +010024
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000025namespace arm
Ferran Balaguer73882172019-09-02 16:39:42 +010026{
27
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000028namespace pipe
Ferran Balaguer73882172019-09-02 16:39:42 +010029{
30
Jim Flynn1fdeb992020-07-09 07:28:37 +010031constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent
Colm Donelan5bb3d8a2020-05-12 16:36:46 +010032
Matteo Martincigh6db5f202019-09-05 12:02:04 +010033uint16_t GetNextUid(bool peekOnly = false);
34
Keith Davise394bd92019-12-02 15:12:19 +000035std::vector<uint16_t> GetNextCounterUids(uint16_t firstUid, uint16_t cores);
Matteo Martincighab173e92019-09-05 12:02:04 +010036
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000037void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize);
38
Keith Davis3201eea2019-10-24 17:30:41 +010039uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId);
40
Jim Flynn83d08a92020-07-09 13:48:16 +010041uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType);
42
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000043void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010044
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000045void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010046
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000047void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010048
Matteo Martincigh34a407d2019-11-06 15:30:54 +000049void WriteUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint8_t value);
50
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000051void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize);
52
Francis Murtagh3a161982019-09-04 15:25:02 +010053void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);
54
Ferran Balaguer73882172019-09-02 16:39:42 +010055void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value);
56
57void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value);
58
Matteo Martincigh34a407d2019-11-06 15:30:54 +000059void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value);
60
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000061void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
62
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000063uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Francis Murtagh3a161982019-09-04 15:25:02 +010064
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000065uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +010066
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000067uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +010068
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000069uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010070
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000071void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
72
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010073uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset);
74
75uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset);
76
77uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset);
78
79uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset);
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +010080
Keith Davis97da5e22020-03-05 16:25:28 +000081std::pair<uint32_t, uint32_t> CreateTimelinePacketHeader(uint32_t packetFamily,
82 uint32_t packetClass,
83 uint32_t packetType,
84 uint32_t streamId,
85 uint32_t sequenceNumbered,
86 uint32_t dataLength);
87
Ferran Balaguer47d0fe92019-09-04 16:47:34 +010088std::string GetSoftwareInfo();
89
90std::string GetSoftwareVersion();
91
92std::string GetHardwareVersion();
93
94std::string GetProcessName();
95
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010096enum class TimelinePacketStatus
97{
98 Ok,
99 Error,
100 BufferExhaustion
101};
102
103TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid,
104 const std::string& label,
105 unsigned char* buffer,
106 unsigned int bufferSize,
107 unsigned int& numberOfBytesWritten);
108
Keith Davis97da5e22020-03-05 16:25:28 +0000109TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid,
110 unsigned char* buffer,
111 unsigned int bufferSize,
112 unsigned int& numberOfBytesWritten);
113
114TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType,
115 uint64_t relationshipGuid,
116 uint64_t headGuid,
117 uint64_t tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100118 uint64_t attributeGuid,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100119 unsigned char* buffer,
120 unsigned int bufferSize,
121 unsigned int& numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100122
Sadik Armagan784db772019-10-08 15:05:38 +0100123TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer,
124 unsigned int bufferSize,
125 unsigned int& numberOfBytesWritten);
126
Keith Davis97da5e22020-03-05 16:25:28 +0000127TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100128 uint64_t nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000129 unsigned char* buffer,
130 unsigned int bufferSize,
131 unsigned int& numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100132
Keith Davis97da5e22020-03-05 16:25:28 +0000133TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100134 int threadId,
Keith Davis97da5e22020-03-05 16:25:28 +0000135 uint64_t profilingGuid,
136 unsigned char* buffer,
137 unsigned int bufferSize,
138 unsigned int& numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100139
Keith Davis3201eea2019-10-24 17:30:41 +0100140std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth);
141
142void PrintCounterDirectory(ICounterDirectory& counterDirectory);
143
Francis Murtagh3a161982019-09-04 15:25:02 +0100144class BufferExhaustion : public armnn::Exception
145{
146 using Exception::Exception;
147};
148
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000149uint64_t GetTimestamp();
Ferran Balaguer73882172019-09-02 16:39:42 +0100150
Jim Flynnbbfe6032020-07-20 16:57:44 +0100151arm::pipe::Packet ReceivePacket(const unsigned char* buffer, uint32_t length);
Jim Flynn4e755a52020-03-29 17:48:26 +0100152
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000153} // namespace pipe
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000154
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000155} // namespace arm
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000156
157namespace std
158{
159
Jim Flynn1fdeb992020-07-09 07:28:37 +0100160bool operator==(const std::vector<uint8_t>& left, int right);
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000161
162} // namespace std