-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRadeonInterrupts.h
71 lines (57 loc) · 1.28 KB
/
RadeonInterrupts.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#pragma once
#include <SupportDefs.h>
#include <AutoDeleter.h>
#include "RadeonMemory.h"
#include "SADomains/Domains.h"
enum {
intSrcIdProtFault = 146,
intSrcIdProtFault2 = 147, // ?
intSrcIdRingGfx = 176,
intSrcIdRingCp1 = 177,
intSrcIdRingCp2 = 178,
intSrcIdCpEop = 181,
intSrcIdRingDma0 = 224,
intSrcIdGuiIdle = 233,
intSrcIdRingDma1 = 244,
};
struct InterruptPacket {
uint32 clientId;
uint32 srcId;
uint32 srcData;
uint32 ringId;
uint32 vmId;
};
typedef void (*InterruptHandler)(void *arg, InterruptPacket &pkt);
class RadeonRingBufferInt: public Object {
private:
enum {
srcIdCnt = 256,
};
struct HandlerEntry {
InterruptHandler handler;
void *arg;
};
MappedBuffer fBuffer;
bool fEnabled;
uint32 fRptr, fWptr;
vuint32 *fWptrAdr;
uint64 fWptrGpuAdr;
HandlerEntry fHandlers[srcIdCnt];
thread_id fThread;
bool fRun;
status_t ThreadEntry();
public:
RadeonRingBufferInt();
~RadeonRingBufferInt();
status_t Init(uint64 size);
void Enable();
void Disable();
void InstallHandler(uint32 clientId, uint32 srcId, InterruptHandler handler, void *arg);
void UninstallHandler(uint32 clientId, uint32 srcId);
uint32 Rptr();
uint32 Wptr();
void SetRptr();
void Read(uint32 &val);
void ReadPacket(InterruptPacket &pkt);
bool Handle();
};