17ec681f3Smrg#include "pan_pps_perf.h"
27ec681f3Smrg
37ec681f3Smrg#include <lib/pan_device.h>
47ec681f3Smrg#include <perf/pan_perf.h>
57ec681f3Smrg#include <util/ralloc.h>
67ec681f3Smrg#include <pps/pps.h>
77ec681f3Smrg
87ec681f3Smrgnamespace pps
97ec681f3Smrg{
107ec681f3SmrgPanfrostDevice::PanfrostDevice(int fd)
117ec681f3Smrg   : ctx {ralloc_context(nullptr)}
127ec681f3Smrg   , dev {reinterpret_cast<struct panfrost_device*>(new struct panfrost_device())}
137ec681f3Smrg{
147ec681f3Smrg   assert(fd >= 0);
157ec681f3Smrg   panfrost_open_device(ctx, fd, dev);
167ec681f3Smrg}
177ec681f3Smrg
187ec681f3SmrgPanfrostDevice::~PanfrostDevice()
197ec681f3Smrg{
207ec681f3Smrg   if (ctx) {
217ec681f3Smrg      panfrost_close_device(dev);
227ec681f3Smrg   }
237ec681f3Smrg   if (dev) {
247ec681f3Smrg      delete dev;
257ec681f3Smrg   }
267ec681f3Smrg}
277ec681f3Smrg
287ec681f3SmrgPanfrostDevice::PanfrostDevice(PanfrostDevice &&o)
297ec681f3Smrg   : ctx {o.ctx}
307ec681f3Smrg   , dev {o.dev}
317ec681f3Smrg{
327ec681f3Smrg   o.ctx = nullptr;
337ec681f3Smrg   o.dev = nullptr;
347ec681f3Smrg}
357ec681f3Smrg
367ec681f3SmrgPanfrostDevice &PanfrostDevice::operator=(PanfrostDevice &&o)
377ec681f3Smrg{
387ec681f3Smrg   std::swap(ctx, o.ctx);
397ec681f3Smrg   std::swap(dev, o.dev);
407ec681f3Smrg   return *this;
417ec681f3Smrg}
427ec681f3Smrg
437ec681f3SmrgPanfrostPerf::PanfrostPerf(const PanfrostDevice& dev)
447ec681f3Smrg   : perf {reinterpret_cast<struct panfrost_perf *>(rzalloc(nullptr, struct panfrost_perf))}
457ec681f3Smrg{
467ec681f3Smrg   assert(perf);
477ec681f3Smrg   assert(dev.dev);
487ec681f3Smrg   panfrost_perf_init(perf, dev.dev);
497ec681f3Smrg}
507ec681f3Smrg
517ec681f3SmrgPanfrostPerf::~PanfrostPerf()
527ec681f3Smrg{
537ec681f3Smrg   if (perf) {
547ec681f3Smrg      panfrost_perf_disable(perf);
557ec681f3Smrg      ralloc_free(perf);
567ec681f3Smrg   }
577ec681f3Smrg}
587ec681f3Smrg
597ec681f3SmrgPanfrostPerf::PanfrostPerf(PanfrostPerf &&o)
607ec681f3Smrg   : perf {o.perf}
617ec681f3Smrg{
627ec681f3Smrg   o.perf = nullptr;
637ec681f3Smrg}
647ec681f3Smrg
657ec681f3SmrgPanfrostPerf &PanfrostPerf::operator=(PanfrostPerf &&o)
667ec681f3Smrg{
677ec681f3Smrg   std::swap(perf, o.perf);
687ec681f3Smrg   return *this;
697ec681f3Smrg}
707ec681f3Smrg
717ec681f3Smrgint PanfrostPerf::enable() const
727ec681f3Smrg{
737ec681f3Smrg   assert(perf);
747ec681f3Smrg   return panfrost_perf_enable(perf);
757ec681f3Smrg}
767ec681f3Smrg
777ec681f3Smrgvoid PanfrostPerf::disable() const
787ec681f3Smrg{
797ec681f3Smrg   assert(perf);
807ec681f3Smrg   panfrost_perf_disable(perf);
817ec681f3Smrg}
827ec681f3Smrg
837ec681f3Smrgint PanfrostPerf::dump() const
847ec681f3Smrg{
857ec681f3Smrg   assert(perf);
867ec681f3Smrg   return panfrost_perf_dump(perf);
877ec681f3Smrg}
887ec681f3Smrg
897ec681f3Smrg} // namespace pps
90