aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2017-03-23 02:16:07 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:54:13 -0400
commit345346108bdca312b3458374a7fac833490a1303 (patch)
treeb71ea2e9f0300bfc7a5898e2aee5894505c57ad5 /drivers/gpu/drm/amd
parent015c23600a4dc9844c4a6195a343604bcc88ba01 (diff)
drm/amdgpu/gfx8: store the eop gpu addr in the ring structure
Avoids passing around additional parameters during setup. Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c14
2 files changed, 7 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 8103cba00e91..9bc453f1855c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -168,6 +168,7 @@ struct amdgpu_ring {
168 struct amdgpu_bo *mqd_obj; 168 struct amdgpu_bo *mqd_obj;
169 uint64_t mqd_gpu_addr; 169 uint64_t mqd_gpu_addr;
170 void *mqd_ptr; 170 void *mqd_ptr;
171 uint64_t eop_gpu_addr;
171 u32 doorbell_index; 172 u32 doorbell_index;
172 bool use_doorbell; 173 bool use_doorbell;
173 unsigned wptr_offs; 174 unsigned wptr_offs;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index d66a061bfbe7..4241e3254d20 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -1377,6 +1377,7 @@ static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev,
1377 struct amdgpu_ring *ring, 1377 struct amdgpu_ring *ring,
1378 struct amdgpu_irq_src *irq) 1378 struct amdgpu_irq_src *irq)
1379{ 1379{
1380 struct amdgpu_kiq *kiq = &adev->gfx.kiq;
1380 int r = 0; 1381 int r = 0;
1381 1382
1382 r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs); 1383 r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs);
@@ -1396,6 +1397,7 @@ static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev,
1396 } 1397 }
1397 1398
1398 ring->queue = 0; 1399 ring->queue = 0;
1400 ring->eop_gpu_addr = kiq->eop_gpu_addr;
1399 sprintf(ring->name, "kiq %d.%d.%d", ring->me, ring->pipe, ring->queue); 1401 sprintf(ring->name, "kiq %d.%d.%d", ring->me, ring->pipe, ring->queue);
1400 r = amdgpu_ring_init(adev, ring, 1024, 1402 r = amdgpu_ring_init(adev, ring, 1024,
1401 irq, AMDGPU_CP_KIQ_IRQ_DRIVER0); 1403 irq, AMDGPU_CP_KIQ_IRQ_DRIVER0);
@@ -2153,6 +2155,7 @@ static int gfx_v8_0_sw_init(void *handle)
2153 ring->me = 1; /* first MEC */ 2155 ring->me = 1; /* first MEC */
2154 ring->pipe = i / 8; 2156 ring->pipe = i / 8;
2155 ring->queue = i % 8; 2157 ring->queue = i % 8;
2158 ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE);
2156 sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue); 2159 sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
2157 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 2160 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
2158 /* type-2 packets are deprecated on MEC, use type-3 instead */ 2161 /* type-2 packets are deprecated on MEC, use type-3 instead */
@@ -4692,8 +4695,7 @@ static void gfx_v8_0_map_queue_enable(struct amdgpu_ring *kiq_ring,
4692} 4695}
4693 4696
4694static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring, 4697static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring,
4695 struct vi_mqd *mqd, 4698 struct vi_mqd *mqd)
4696 uint64_t eop_gpu_addr)
4697{ 4699{
4698 struct amdgpu_device *adev = ring->adev; 4700 struct amdgpu_device *adev = ring->adev;
4699 uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr; 4701 uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;
@@ -4707,7 +4709,7 @@ static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring,
4707 mqd->compute_static_thread_mgmt_se3 = 0xffffffff; 4709 mqd->compute_static_thread_mgmt_se3 = 0xffffffff;
4708 mqd->compute_misc_reserved = 0x00000003; 4710 mqd->compute_misc_reserved = 0x00000003;
4709 4711
4710 eop_base_addr = eop_gpu_addr >> 8; 4712 eop_base_addr = ring->eop_gpu_addr >> 8;
4711 mqd->cp_hqd_eop_base_addr_lo = eop_base_addr; 4713 mqd->cp_hqd_eop_base_addr_lo = eop_base_addr;
4712 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr); 4714 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr);
4713 4715
@@ -4906,16 +4908,12 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring,
4906{ 4908{
4907 struct amdgpu_device *adev = ring->adev; 4909 struct amdgpu_device *adev = ring->adev;
4908 struct amdgpu_kiq *kiq = &adev->gfx.kiq; 4910 struct amdgpu_kiq *kiq = &adev->gfx.kiq;
4909 uint64_t eop_gpu_addr;
4910 bool is_kiq = (ring->funcs->type == AMDGPU_RING_TYPE_KIQ); 4911 bool is_kiq = (ring->funcs->type == AMDGPU_RING_TYPE_KIQ);
4911 int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS; 4912 int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;
4912 4913
4913 if (is_kiq) { 4914 if (is_kiq) {
4914 eop_gpu_addr = kiq->eop_gpu_addr;
4915 gfx_v8_0_kiq_setting(&kiq->ring); 4915 gfx_v8_0_kiq_setting(&kiq->ring);
4916 } else { 4916 } else {
4917 eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr +
4918 ring->queue * MEC_HPD_SIZE;
4919 mqd_idx = ring - &adev->gfx.compute_ring[0]; 4917 mqd_idx = ring - &adev->gfx.compute_ring[0];
4920 } 4918 }
4921 4919
@@ -4923,7 +4921,7 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring,
4923 memset((void *)mqd, 0, sizeof(*mqd)); 4921 memset((void *)mqd, 0, sizeof(*mqd));
4924 mutex_lock(&adev->srbm_mutex); 4922 mutex_lock(&adev->srbm_mutex);
4925 vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); 4923 vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
4926 gfx_v8_0_mqd_init(ring, mqd, eop_gpu_addr); 4924 gfx_v8_0_mqd_init(ring, mqd);
4927 if (is_kiq) 4925 if (is_kiq)
4928 gfx_v8_0_kiq_init_register(ring, mqd); 4926 gfx_v8_0_kiq_init_register(ring, mqd);
4929 vi_srbm_select(adev, 0, 0, 0, 0); 4927 vi_srbm_select(adev, 0, 0, 0, 0);