diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index cfc47214161a..00583baab132 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | |||
@@ -91,3 +91,61 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
91 | ttm_eu_backoff_reservation(&ticket, &list); | 91 | ttm_eu_backoff_reservation(&ticket, &list); |
92 | return 0; | 92 | return 0; |
93 | } | 93 | } |
94 | |||
95 | void amdgpu_virt_init_setting(struct amdgpu_device *adev) | ||
96 | { | ||
97 | mutex_init(&adev->virt.lock); | ||
98 | } | ||
99 | |||
100 | uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) | ||
101 | { | ||
102 | signed long r; | ||
103 | uint32_t val; | ||
104 | struct dma_fence *f; | ||
105 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; | ||
106 | struct amdgpu_ring *ring = &kiq->ring; | ||
107 | |||
108 | BUG_ON(!ring->funcs->emit_rreg); | ||
109 | |||
110 | mutex_lock(&adev->virt.lock); | ||
111 | amdgpu_ring_alloc(ring, 32); | ||
112 | amdgpu_ring_emit_hdp_flush(ring); | ||
113 | amdgpu_ring_emit_rreg(ring, reg); | ||
114 | amdgpu_ring_emit_hdp_invalidate(ring); | ||
115 | amdgpu_fence_emit(ring, &f); | ||
116 | amdgpu_ring_commit(ring); | ||
117 | mutex_unlock(&adev->virt.lock); | ||
118 | |||
119 | r = dma_fence_wait(f, false); | ||
120 | if (r) | ||
121 | DRM_ERROR("wait for kiq fence error: %ld.\n", r); | ||
122 | dma_fence_put(f); | ||
123 | |||
124 | val = adev->wb.wb[adev->virt.reg_val_offs]; | ||
125 | |||
126 | return val; | ||
127 | } | ||
128 | |||
129 | void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) | ||
130 | { | ||
131 | signed long r; | ||
132 | struct dma_fence *f; | ||
133 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; | ||
134 | struct amdgpu_ring *ring = &kiq->ring; | ||
135 | |||
136 | BUG_ON(!ring->funcs->emit_wreg); | ||
137 | |||
138 | mutex_lock(&adev->virt.lock); | ||
139 | amdgpu_ring_alloc(ring, 32); | ||
140 | amdgpu_ring_emit_hdp_flush(ring); | ||
141 | amdgpu_ring_emit_wreg(ring, reg, v); | ||
142 | amdgpu_ring_emit_hdp_invalidate(ring); | ||
143 | amdgpu_fence_emit(ring, &f); | ||
144 | amdgpu_ring_commit(ring); | ||
145 | mutex_unlock(&adev->virt.lock); | ||
146 | |||
147 | r = dma_fence_wait(f, false); | ||
148 | if (r) | ||
149 | DRM_ERROR("wait for kiq fence error: %ld.\n", r); | ||
150 | dma_fence_put(f); | ||
151 | } | ||