1#include "pan_pps_perf.h"
2
3#include <lib/pan_device.h>
4#include <perf/pan_perf.h>
5#include <util/ralloc.h>
6#include <pps/pps.h>
7
8namespace pps
9{
10PanfrostDevice::PanfrostDevice(int fd)
11   : ctx {ralloc_context(nullptr)}
12   , dev {reinterpret_cast<struct panfrost_device*>(new struct panfrost_device())}
13{
14   assert(fd >= 0);
15   panfrost_open_device(ctx, fd, dev);
16}
17
18PanfrostDevice::~PanfrostDevice()
19{
20   if (ctx) {
21      panfrost_close_device(dev);
22   }
23   if (dev) {
24      delete dev;
25   }
26}
27
28PanfrostDevice::PanfrostDevice(PanfrostDevice &&o)
29   : ctx {o.ctx}
30   , dev {o.dev}
31{
32   o.ctx = nullptr;
33   o.dev = nullptr;
34}
35
36PanfrostDevice &PanfrostDevice::operator=(PanfrostDevice &&o)
37{
38   std::swap(ctx, o.ctx);
39   std::swap(dev, o.dev);
40   return *this;
41}
42
43PanfrostPerf::PanfrostPerf(const PanfrostDevice& dev)
44   : perf {reinterpret_cast<struct panfrost_perf *>(rzalloc(nullptr, struct panfrost_perf))}
45{
46   assert(perf);
47   assert(dev.dev);
48   panfrost_perf_init(perf, dev.dev);
49}
50
51PanfrostPerf::~PanfrostPerf()
52{
53   if (perf) {
54      panfrost_perf_disable(perf);
55      ralloc_free(perf);
56   }
57}
58
59PanfrostPerf::PanfrostPerf(PanfrostPerf &&o)
60   : perf {o.perf}
61{
62   o.perf = nullptr;
63}
64
65PanfrostPerf &PanfrostPerf::operator=(PanfrostPerf &&o)
66{
67   std::swap(perf, o.perf);
68   return *this;
69}
70
71int PanfrostPerf::enable() const
72{
73   assert(perf);
74   return panfrost_perf_enable(perf);
75}
76
77void PanfrostPerf::disable() const
78{
79   assert(perf);
80   panfrost_perf_disable(perf);
81}
82
83int PanfrostPerf::dump() const
84{
85   assert(perf);
86   return panfrost_perf_dump(perf);
87}
88
89} // namespace pps
90