blob: 19ec12775a394bded3afdd01244de498e700be7a [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurstb1d07442015-05-08 12:04:18 +01002 * Copyright (C) ARM Limited 2013-2015. All rights reserved.
Jon Medhurstaaf37a32013-06-11 12:10:56 +01003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef DRIVER_H
10#define DRIVER_H
11
Jon Medhurst96b56152014-10-30 18:01:15 +000012#include <stdint.h>
13
Jon Medhurstaaf37a32013-06-11 12:10:56 +010014#include "mxml/mxml.h"
15
Jon Medhurst96b56152014-10-30 18:01:15 +000016class Buffer;
Jon Medhurstaaf37a32013-06-11 12:10:56 +010017class Counter;
18
Jon Medhurst96b56152014-10-30 18:01:15 +000019class DriverCounter {
20public:
21 DriverCounter(DriverCounter *const next, const char *const name);
22 virtual ~DriverCounter();
23
24 DriverCounter *getNext() const { return mNext; }
25 const char *getName() const { return mName; }
26 int getKey() const { return mKey; }
27 bool isEnabled() const { return mEnabled; }
28 void setEnabled(const bool enabled) { mEnabled = enabled; }
29 virtual int64_t read() { return -1; }
30
31private:
32 DriverCounter *const mNext;
33 const char *const mName;
34 const int mKey;
35 bool mEnabled;
36
37 // Intentionally unimplemented
38 DriverCounter(const DriverCounter &);
39 DriverCounter &operator=(const DriverCounter &);
40};
41
Jon Medhurstaaf37a32013-06-11 12:10:56 +010042class Driver {
43public:
44 static Driver *getHead() { return head; }
45
46 virtual ~Driver() {}
47
48 // Returns true if this driver can manage the counter
49 virtual bool claimCounter(const Counter &counter) const = 0;
50 // Clears and disables all counters
51 virtual void resetCounters() = 0;
52 // Enables and prepares the counter for capture
53 virtual void setupCounter(Counter &counter) = 0;
54
Jon Medhurst96b56152014-10-30 18:01:15 +000055 // Performs any actions needed for setup or based on eventsXML
56 virtual void readEvents(mxml_node_t *const) {}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010057 // Emits available counters
Jon Medhurst96b56152014-10-30 18:01:15 +000058 virtual int writeCounters(mxml_node_t *const root) const = 0;
Jon Medhurstaaf37a32013-06-11 12:10:56 +010059 // Emits possible dynamically generated events/counters
Jon Medhurst96b56152014-10-30 18:01:15 +000060 virtual void writeEvents(mxml_node_t *const) const {}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010061
62 Driver *getNext() const { return next; }
63
64protected:
Jon Medhurst96b56152014-10-30 18:01:15 +000065 Driver();
Jon Medhurstaaf37a32013-06-11 12:10:56 +010066
67private:
68 static Driver *head;
69 Driver *next;
Jon Medhurst34d97692013-12-19 09:23:06 +000070
71 // Intentionally unimplemented
72 Driver(const Driver &);
73 Driver &operator=(const Driver &);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010074};
75
Jon Medhurst96b56152014-10-30 18:01:15 +000076class SimpleDriver : public Driver {
77public:
78 virtual ~SimpleDriver();
79
80 bool claimCounter(const Counter &counter) const;
81 bool countersEnabled() const;
82 void resetCounters();
83 void setupCounter(Counter &counter);
84 int writeCounters(mxml_node_t *root) const;
85
86protected:
87 SimpleDriver() : mCounters(NULL) {}
88
89 DriverCounter *getCounters() const { return mCounters; }
90 void setCounters(DriverCounter *const counter) { mCounters = counter; }
91
92 DriverCounter *findCounter(const Counter &counter) const;
93
94private:
95 DriverCounter *mCounters;
96
97 // Intentionally unimplemented
98 SimpleDriver(const SimpleDriver &);
99 SimpleDriver &operator=(const SimpleDriver &);
100};
101
102class PolledDriver : public SimpleDriver {
103public:
104 virtual ~PolledDriver();
105
106 virtual void start() {}
107 virtual void read(Buffer *const buffer);
108
109protected:
110 PolledDriver() {}
111
112private:
113 // Intentionally unimplemented
114 PolledDriver(const PolledDriver &);
115 PolledDriver &operator=(const PolledDriver &);
116};
117
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100118#endif // DRIVER_H