1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef __AMDGPU_IH_H__
25 #define __AMDGPU_IH_H__
26
27
28 #define AMDGPU_IH_MAX_NUM_IVS 32
29
30 struct amdgpu_device;
31 struct amdgpu_iv_entry;
32
33
34
35
36 struct amdgpu_ih_ring {
37 unsigned ring_size;
38 uint32_t ptr_mask;
39 u32 doorbell_index;
40 bool use_doorbell;
41 bool use_bus_addr;
42
43 struct amdgpu_bo *ring_obj;
44 volatile uint32_t *ring;
45 uint64_t gpu_addr;
46
47 uint64_t wptr_addr;
48 volatile uint32_t *wptr_cpu;
49
50 uint64_t rptr_addr;
51 volatile uint32_t *rptr_cpu;
52
53 bool enabled;
54 unsigned rptr;
55 atomic_t lock;
56 };
57
58
59 struct amdgpu_ih_funcs {
60
61 u32 (*get_wptr)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
62 void (*decode_iv)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
63 struct amdgpu_iv_entry *entry);
64 void (*set_rptr)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
65 };
66
67 #define amdgpu_ih_get_wptr(adev, ih) (adev)->irq.ih_funcs->get_wptr((adev), (ih))
68 #define amdgpu_ih_decode_iv(adev, iv) \
69 (adev)->irq.ih_funcs->decode_iv((adev), (ih), (iv))
70 #define amdgpu_ih_set_rptr(adev, ih) (adev)->irq.ih_funcs->set_rptr((adev), (ih))
71
72 int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
73 unsigned ring_size, bool use_bus_addr);
74 void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
75 int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
76
77 #endif