diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 2c188fb9fd22..0d8bf2cb1956 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -2561,7 +2561,7 @@ static bool gfx_v7_0_ring_emit_semaphore(struct amdgpu_ring *ring, | |||
2561 | * sheduling on the ring. This function schedules the IB | 2561 | * sheduling on the ring. This function schedules the IB |
2562 | * on the gfx ring for execution by the GPU. | 2562 | * on the gfx ring for execution by the GPU. |
2563 | */ | 2563 | */ |
2564 | static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | 2564 | static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
2565 | struct amdgpu_ib *ib) | 2565 | struct amdgpu_ib *ib) |
2566 | { | 2566 | { |
2567 | bool need_ctx_switch = ring->current_ctx != ib->ctx; | 2567 | bool need_ctx_switch = ring->current_ctx != ib->ctx; |
@@ -2569,15 +2569,10 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2569 | u32 next_rptr = ring->wptr + 5; | 2569 | u32 next_rptr = ring->wptr + 5; |
2570 | 2570 | ||
2571 | /* drop the CE preamble IB for the same context */ | 2571 | /* drop the CE preamble IB for the same context */ |
2572 | if ((ring->type == AMDGPU_RING_TYPE_GFX) && | 2572 | if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch) |
2573 | (ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && | ||
2574 | !need_ctx_switch) | ||
2575 | return; | 2573 | return; |
2576 | 2574 | ||
2577 | if (ring->type == AMDGPU_RING_TYPE_COMPUTE) | 2575 | if (need_ctx_switch) |
2578 | control |= INDIRECT_BUFFER_VALID; | ||
2579 | |||
2580 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) | ||
2581 | next_rptr += 2; | 2576 | next_rptr += 2; |
2582 | 2577 | ||
2583 | next_rptr += 4; | 2578 | next_rptr += 4; |
@@ -2588,7 +2583,7 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2588 | amdgpu_ring_write(ring, next_rptr); | 2583 | amdgpu_ring_write(ring, next_rptr); |
2589 | 2584 | ||
2590 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ | 2585 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
2591 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) { | 2586 | if (need_ctx_switch) { |
2592 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | 2587 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
2593 | amdgpu_ring_write(ring, 0); | 2588 | amdgpu_ring_write(ring, 0); |
2594 | } | 2589 | } |
@@ -2611,6 +2606,35 @@ static void gfx_v7_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
2611 | amdgpu_ring_write(ring, control); | 2606 | amdgpu_ring_write(ring, control); |
2612 | } | 2607 | } |
2613 | 2608 | ||
2609 | static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | ||
2610 | struct amdgpu_ib *ib) | ||
2611 | { | ||
2612 | u32 header, control = 0; | ||
2613 | u32 next_rptr = ring->wptr + 5; | ||
2614 | |||
2615 | control |= INDIRECT_BUFFER_VALID; | ||
2616 | next_rptr += 4; | ||
2617 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
2618 | amdgpu_ring_write(ring, WRITE_DATA_DST_SEL(5) | WR_CONFIRM); | ||
2619 | amdgpu_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); | ||
2620 | amdgpu_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); | ||
2621 | amdgpu_ring_write(ring, next_rptr); | ||
2622 | |||
2623 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | ||
2624 | |||
2625 | control |= ib->length_dw | | ||
2626 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
2627 | |||
2628 | amdgpu_ring_write(ring, header); | ||
2629 | amdgpu_ring_write(ring, | ||
2630 | #ifdef __BIG_ENDIAN | ||
2631 | (2 << 0) | | ||
2632 | #endif | ||
2633 | (ib->gpu_addr & 0xFFFFFFFC)); | ||
2634 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); | ||
2635 | amdgpu_ring_write(ring, control); | ||
2636 | } | ||
2637 | |||
2614 | /** | 2638 | /** |
2615 | * gfx_v7_0_ring_test_ib - basic ring IB test | 2639 | * gfx_v7_0_ring_test_ib - basic ring IB test |
2616 | * | 2640 | * |
@@ -3056,6 +3080,8 @@ static int gfx_v7_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
3056 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | 3080 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
3057 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); | 3081 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); |
3058 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); | 3082 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); |
3083 | adev->gfx.mec_feature_version = le32_to_cpu( | ||
3084 | mec_hdr->ucode_feature_version); | ||
3059 | 3085 | ||
3060 | gfx_v7_0_cp_compute_enable(adev, false); | 3086 | gfx_v7_0_cp_compute_enable(adev, false); |
3061 | 3087 | ||
@@ -3078,6 +3104,8 @@ static int gfx_v7_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
3078 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; | 3104 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
3079 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); | 3105 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); |
3080 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); | 3106 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); |
3107 | adev->gfx.mec2_feature_version = le32_to_cpu( | ||
3108 | mec2_hdr->ucode_feature_version); | ||
3081 | 3109 | ||
3082 | /* MEC2 */ | 3110 | /* MEC2 */ |
3083 | fw_data = (const __le32 *) | 3111 | fw_data = (const __le32 *) |
@@ -4042,6 +4070,8 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev) | |||
4042 | hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; | 4070 | hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; |
4043 | amdgpu_ucode_print_rlc_hdr(&hdr->header); | 4071 | amdgpu_ucode_print_rlc_hdr(&hdr->header); |
4044 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); | 4072 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); |
4073 | adev->gfx.rlc_feature_version = le32_to_cpu( | ||
4074 | hdr->ucode_feature_version); | ||
4045 | 4075 | ||
4046 | gfx_v7_0_rlc_stop(adev); | 4076 | gfx_v7_0_rlc_stop(adev); |
4047 | 4077 | ||
@@ -5098,7 +5128,7 @@ static void gfx_v7_0_print_status(void *handle) | |||
5098 | dev_info(adev->dev, " CP_HPD_EOP_CONTROL=0x%08X\n", | 5128 | dev_info(adev->dev, " CP_HPD_EOP_CONTROL=0x%08X\n", |
5099 | RREG32(mmCP_HPD_EOP_CONTROL)); | 5129 | RREG32(mmCP_HPD_EOP_CONTROL)); |
5100 | 5130 | ||
5101 | for (queue = 0; queue < 8; i++) { | 5131 | for (queue = 0; queue < 8; queue++) { |
5102 | cik_srbm_select(adev, me, pipe, queue, 0); | 5132 | cik_srbm_select(adev, me, pipe, queue, 0); |
5103 | dev_info(adev->dev, " queue: %d\n", queue); | 5133 | dev_info(adev->dev, " queue: %d\n", queue); |
5104 | dev_info(adev->dev, " CP_PQ_WPTR_POLL_CNTL=0x%08X\n", | 5134 | dev_info(adev->dev, " CP_PQ_WPTR_POLL_CNTL=0x%08X\n", |
@@ -5555,7 +5585,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = { | |||
5555 | .get_wptr = gfx_v7_0_ring_get_wptr_gfx, | 5585 | .get_wptr = gfx_v7_0_ring_get_wptr_gfx, |
5556 | .set_wptr = gfx_v7_0_ring_set_wptr_gfx, | 5586 | .set_wptr = gfx_v7_0_ring_set_wptr_gfx, |
5557 | .parse_cs = NULL, | 5587 | .parse_cs = NULL, |
5558 | .emit_ib = gfx_v7_0_ring_emit_ib, | 5588 | .emit_ib = gfx_v7_0_ring_emit_ib_gfx, |
5559 | .emit_fence = gfx_v7_0_ring_emit_fence_gfx, | 5589 | .emit_fence = gfx_v7_0_ring_emit_fence_gfx, |
5560 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, | 5590 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, |
5561 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, | 5591 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, |
@@ -5571,7 +5601,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = { | |||
5571 | .get_wptr = gfx_v7_0_ring_get_wptr_compute, | 5601 | .get_wptr = gfx_v7_0_ring_get_wptr_compute, |
5572 | .set_wptr = gfx_v7_0_ring_set_wptr_compute, | 5602 | .set_wptr = gfx_v7_0_ring_set_wptr_compute, |
5573 | .parse_cs = NULL, | 5603 | .parse_cs = NULL, |
5574 | .emit_ib = gfx_v7_0_ring_emit_ib, | 5604 | .emit_ib = gfx_v7_0_ring_emit_ib_compute, |
5575 | .emit_fence = gfx_v7_0_ring_emit_fence_compute, | 5605 | .emit_fence = gfx_v7_0_ring_emit_fence_compute, |
5576 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, | 5606 | .emit_semaphore = gfx_v7_0_ring_emit_semaphore, |
5577 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, | 5607 | .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush, |