diff options
author | Xiangliang Yu <Xiangliang.Yu@amd.com> | 2017-01-12 00:57:48 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-01-27 11:13:21 -0500 |
commit | 880e87e380985480cc5bee5f389f912554064930 (patch) | |
tree | d0d3bee08cf004f0a78b741dc888f92cc3ba1f7c | |
parent | b6091c1217e16606ee231c053cde000d8fa1f674 (diff) |
drm/amdgpu/gfx8: implement emit_rreg/wreg function
Implement emit_rreg/wreg function for kiq ring.
Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com>
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 37 |
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h index fa1d569ec479..70ab72cd8fae 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | |||
@@ -34,6 +34,7 @@ struct amdgpu_virt { | |||
34 | uint32_t caps; | 34 | uint32_t caps; |
35 | struct amdgpu_bo *csa_obj; | 35 | struct amdgpu_bo *csa_obj; |
36 | uint64_t csa_vmid0_addr; | 36 | uint64_t csa_vmid0_addr; |
37 | uint32_t reg_val_offs; | ||
37 | }; | 38 | }; |
38 | 39 | ||
39 | #define AMDGPU_CSA_SIZE (8 * 1024) | 40 | #define AMDGPU_CSA_SIZE (8 * 1024) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 0907173d9681..aa053f628786 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -1373,6 +1373,12 @@ static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev, | |||
1373 | { | 1373 | { |
1374 | int r = 0; | 1374 | int r = 0; |
1375 | 1375 | ||
1376 | if (amdgpu_sriov_vf(adev)) { | ||
1377 | r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs); | ||
1378 | if (r) | ||
1379 | return r; | ||
1380 | } | ||
1381 | |||
1376 | ring->adev = NULL; | 1382 | ring->adev = NULL; |
1377 | ring->ring_obj = NULL; | 1383 | ring->ring_obj = NULL; |
1378 | ring->use_doorbell = true; | 1384 | ring->use_doorbell = true; |
@@ -1399,6 +1405,9 @@ static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev, | |||
1399 | static void gfx_v8_0_kiq_free_ring(struct amdgpu_ring *ring, | 1405 | static void gfx_v8_0_kiq_free_ring(struct amdgpu_ring *ring, |
1400 | struct amdgpu_irq_src *irq) | 1406 | struct amdgpu_irq_src *irq) |
1401 | { | 1407 | { |
1408 | if (amdgpu_sriov_vf(ring->adev)) | ||
1409 | amdgpu_wb_free(ring->adev, ring->adev->virt.reg_val_offs); | ||
1410 | |||
1402 | amdgpu_ring_fini(ring); | 1411 | amdgpu_ring_fini(ring); |
1403 | irq->data = NULL; | 1412 | irq->data = NULL; |
1404 | } | 1413 | } |
@@ -6720,6 +6729,32 @@ static void gfx_v8_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags) | |||
6720 | amdgpu_ring_write(ring, 0); | 6729 | amdgpu_ring_write(ring, 0); |
6721 | } | 6730 | } |
6722 | 6731 | ||
6732 | static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) | ||
6733 | { | ||
6734 | struct amdgpu_device *adev = ring->adev; | ||
6735 | |||
6736 | amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4)); | ||
6737 | amdgpu_ring_write(ring, 0 | /* src: register*/ | ||
6738 | (5 << 8) | /* dst: memory */ | ||
6739 | (1 << 20)); /* write confirm */ | ||
6740 | amdgpu_ring_write(ring, reg); | ||
6741 | amdgpu_ring_write(ring, 0); | ||
6742 | amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + | ||
6743 | adev->virt.reg_val_offs * 4)); | ||
6744 | amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + | ||
6745 | adev->virt.reg_val_offs * 4)); | ||
6746 | } | ||
6747 | |||
6748 | static void gfx_v8_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, | ||
6749 | uint32_t val) | ||
6750 | { | ||
6751 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
6752 | amdgpu_ring_write(ring, (1 << 16)); /* no inc addr */ | ||
6753 | amdgpu_ring_write(ring, reg); | ||
6754 | amdgpu_ring_write(ring, 0); | ||
6755 | amdgpu_ring_write(ring, val); | ||
6756 | } | ||
6757 | |||
6723 | static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, | 6758 | static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, |
6724 | enum amdgpu_interrupt_state state) | 6759 | enum amdgpu_interrupt_state state) |
6725 | { | 6760 | { |
@@ -7035,6 +7070,8 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = { | |||
7035 | .test_ib = gfx_v8_0_ring_test_ib, | 7070 | .test_ib = gfx_v8_0_ring_test_ib, |
7036 | .insert_nop = amdgpu_ring_insert_nop, | 7071 | .insert_nop = amdgpu_ring_insert_nop, |
7037 | .pad_ib = amdgpu_ring_generic_pad_ib, | 7072 | .pad_ib = amdgpu_ring_generic_pad_ib, |
7073 | .emit_rreg = gfx_v8_0_ring_emit_rreg, | ||
7074 | .emit_wreg = gfx_v8_0_ring_emit_wreg, | ||
7038 | }; | 7075 | }; |
7039 | 7076 | ||
7040 | static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev) | 7077 | static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev) |