xref: /aosp_15_r20/external/ComputeLibrary/tests/framework/instruments/MaliCounter.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2017-2019 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_TEST_MALI_COUNTER
25*c217d954SCole Faust #define ARM_COMPUTE_TEST_MALI_COUNTER
26*c217d954SCole Faust 
27*c217d954SCole Faust #include "Instrument.h"
28*c217d954SCole Faust #include "Measurement.h"
29*c217d954SCole Faust #include "hwc.hpp"
30*c217d954SCole Faust 
31*c217d954SCole Faust #include <map>
32*c217d954SCole Faust #include <vector>
33*c217d954SCole Faust 
34*c217d954SCole Faust namespace arm_compute
35*c217d954SCole Faust {
36*c217d954SCole Faust namespace test
37*c217d954SCole Faust {
38*c217d954SCole Faust namespace framework
39*c217d954SCole Faust {
40*c217d954SCole Faust /** Instrument implementation for mali hw counters. */
41*c217d954SCole Faust class MaliCounter : public Instrument
42*c217d954SCole Faust {
43*c217d954SCole Faust public:
44*c217d954SCole Faust     /** Default constructor.
45*c217d954SCole Faust      *
46*c217d954SCole Faust      * @param[in] scale_factor Measurement scale factor;
47*c217d954SCole Faust      */
48*c217d954SCole Faust     MaliCounter(ScaleFactor scale_factor);
49*c217d954SCole Faust 
50*c217d954SCole Faust     /** Prevent instances of this class from being copy constructed */
51*c217d954SCole Faust     MaliCounter(const MaliCounter &) = delete;
52*c217d954SCole Faust     /** Prevent instances of this class from being copied */
53*c217d954SCole Faust     MaliCounter &operator=(const MaliCounter &) = delete;
54*c217d954SCole Faust 
55*c217d954SCole Faust     /** Default destructor */
56*c217d954SCole Faust     ~MaliCounter();
57*c217d954SCole Faust 
58*c217d954SCole Faust     std::string     id() const override;
59*c217d954SCole Faust     void            start() override;
60*c217d954SCole Faust     void            stop() override;
61*c217d954SCole Faust     MeasurementsMap measurements() const override;
62*c217d954SCole Faust 
63*c217d954SCole Faust private:
64*c217d954SCole Faust     void init();
65*c217d954SCole Faust     void term();
66*c217d954SCole Faust 
67*c217d954SCole Faust     void            sample_counters();
68*c217d954SCole Faust     void            wait_next_event();
69*c217d954SCole Faust     const uint32_t *get_counters() const;
70*c217d954SCole Faust     const uint32_t *get_counters(mali_userspace::MaliCounterBlockName block, int core = -1) const;
71*c217d954SCole Faust     int find_counter_index_by_name(mali_userspace::MaliCounterBlockName block, const char *name);
72*c217d954SCole Faust 
73*c217d954SCole Faust     std::map<std::string, Measurement> _counters{};
74*c217d954SCole Faust 
75*c217d954SCole Faust     struct core_counters
76*c217d954SCole Faust     {
77*c217d954SCole Faust         std::string name;
78*c217d954SCole Faust         std::map<int, uint64_t> values;
79*c217d954SCole Faust         std::string unit;
80*c217d954SCole Faust     };
81*c217d954SCole Faust 
82*c217d954SCole Faust     std::map<std::string, core_counters> _core_counters{};
83*c217d954SCole Faust     uint64_t _start_time{ 0 };
84*c217d954SCole Faust     uint64_t _stop_time{ 0 };
85*c217d954SCole Faust 
86*c217d954SCole Faust     const char *const  _device
87*c217d954SCole Faust     { "/dev/mali0"
88*c217d954SCole Faust     };
89*c217d954SCole Faust     uint32_t           _num_cores{ 0 };
90*c217d954SCole Faust     uint32_t           _hw_ver{ 0 };
91*c217d954SCole Faust     int                _buffer_count{ 16 };
92*c217d954SCole Faust     size_t             _buffer_size{ 0 };
93*c217d954SCole Faust     uint8_t           *_sample_data{ nullptr };
94*c217d954SCole Faust     uint64_t           _timestamp{ 0 };
95*c217d954SCole Faust     const char *const *_names_lut
96*c217d954SCole Faust     {
97*c217d954SCole Faust         nullptr
98*c217d954SCole Faust     };
99*c217d954SCole Faust     std::vector<uint32_t>     _raw_counter_buffer{};
100*c217d954SCole Faust     std::vector<unsigned int> _core_index_remap{};
101*c217d954SCole Faust     int                       _fd{ -1 };
102*c217d954SCole Faust     int                       _hwc_fd{ -1 };
103*c217d954SCole Faust     int                       _scale_factor{};
104*c217d954SCole Faust };
105*c217d954SCole Faust } // namespace framework
106*c217d954SCole Faust } // namespace test
107*c217d954SCole Faust } // namespace arm_compute
108*c217d954SCole Faust #endif /* ARM_COMPUTE_TEST_MALI_COUNTER */
109