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
30struct amdgpu_device;
31struct amdgpu_iv_entry;
32
33
34
35
36struct 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
59struct 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
72int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
73 unsigned ring_size, bool use_bus_addr);
74void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
75int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
76
77#endif
78