diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 85 |
1 files changed, 60 insertions, 25 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 1c7c992dea37..20e2cfd521d5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -587,6 +587,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
587 | int err; | 587 | int err; |
588 | struct amdgpu_firmware_info *info = NULL; | 588 | struct amdgpu_firmware_info *info = NULL; |
589 | const struct common_firmware_header *header = NULL; | 589 | const struct common_firmware_header *header = NULL; |
590 | const struct gfx_firmware_header_v1_0 *cp_hdr; | ||
590 | 591 | ||
591 | DRM_DEBUG("\n"); | 592 | DRM_DEBUG("\n"); |
592 | 593 | ||
@@ -611,6 +612,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
611 | err = amdgpu_ucode_validate(adev->gfx.pfp_fw); | 612 | err = amdgpu_ucode_validate(adev->gfx.pfp_fw); |
612 | if (err) | 613 | if (err) |
613 | goto out; | 614 | goto out; |
615 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; | ||
616 | adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
617 | adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
614 | 618 | ||
615 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); | 619 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); |
616 | err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); | 620 | err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); |
@@ -619,6 +623,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
619 | err = amdgpu_ucode_validate(adev->gfx.me_fw); | 623 | err = amdgpu_ucode_validate(adev->gfx.me_fw); |
620 | if (err) | 624 | if (err) |
621 | goto out; | 625 | goto out; |
626 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; | ||
627 | adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
628 | adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
622 | 629 | ||
623 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); | 630 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); |
624 | err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); | 631 | err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); |
@@ -627,12 +634,18 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
627 | err = amdgpu_ucode_validate(adev->gfx.ce_fw); | 634 | err = amdgpu_ucode_validate(adev->gfx.ce_fw); |
628 | if (err) | 635 | if (err) |
629 | goto out; | 636 | goto out; |
637 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; | ||
638 | adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
639 | adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
630 | 640 | ||
631 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); | 641 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
632 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); | 642 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
633 | if (err) | 643 | if (err) |
634 | goto out; | 644 | goto out; |
635 | err = amdgpu_ucode_validate(adev->gfx.rlc_fw); | 645 | err = amdgpu_ucode_validate(adev->gfx.rlc_fw); |
646 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.rlc_fw->data; | ||
647 | adev->gfx.rlc_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
648 | adev->gfx.rlc_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
636 | 649 | ||
637 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); | 650 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); |
638 | err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); | 651 | err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); |
@@ -641,6 +654,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
641 | err = amdgpu_ucode_validate(adev->gfx.mec_fw); | 654 | err = amdgpu_ucode_validate(adev->gfx.mec_fw); |
642 | if (err) | 655 | if (err) |
643 | goto out; | 656 | goto out; |
657 | cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | ||
658 | adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); | ||
659 | adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); | ||
644 | 660 | ||
645 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); | 661 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); |
646 | err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); | 662 | err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); |
@@ -648,6 +664,12 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
648 | err = amdgpu_ucode_validate(adev->gfx.mec2_fw); | 664 | err = amdgpu_ucode_validate(adev->gfx.mec2_fw); |
649 | if (err) | 665 | if (err) |
650 | goto out; | 666 | goto out; |
667 | cp_hdr = (const struct gfx_firmware_header_v1_0 *) | ||
668 | adev->gfx.mec2_fw->data; | ||
669 | adev->gfx.mec2_fw_version = le32_to_cpu( | ||
670 | cp_hdr->header.ucode_version); | ||
671 | adev->gfx.mec2_feature_version = le32_to_cpu( | ||
672 | cp_hdr->ucode_feature_version); | ||
651 | } else { | 673 | } else { |
652 | err = 0; | 674 | err = 0; |
653 | adev->gfx.mec2_fw = NULL; | 675 | adev->gfx.mec2_fw = NULL; |
@@ -1983,6 +2005,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
1983 | adev->gfx.config.max_shader_engines = 1; | 2005 | adev->gfx.config.max_shader_engines = 1; |
1984 | adev->gfx.config.max_tile_pipes = 2; | 2006 | adev->gfx.config.max_tile_pipes = 2; |
1985 | adev->gfx.config.max_sh_per_se = 1; | 2007 | adev->gfx.config.max_sh_per_se = 1; |
2008 | adev->gfx.config.max_backends_per_se = 2; | ||
1986 | 2009 | ||
1987 | switch (adev->pdev->revision) { | 2010 | switch (adev->pdev->revision) { |
1988 | case 0xc4: | 2011 | case 0xc4: |
@@ -1991,7 +2014,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
1991 | case 0xcc: | 2014 | case 0xcc: |
1992 | /* B10 */ | 2015 | /* B10 */ |
1993 | adev->gfx.config.max_cu_per_sh = 8; | 2016 | adev->gfx.config.max_cu_per_sh = 8; |
1994 | adev->gfx.config.max_backends_per_se = 2; | ||
1995 | break; | 2017 | break; |
1996 | case 0xc5: | 2018 | case 0xc5: |
1997 | case 0x81: | 2019 | case 0x81: |
@@ -2000,14 +2022,12 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2000 | case 0xcd: | 2022 | case 0xcd: |
2001 | /* B8 */ | 2023 | /* B8 */ |
2002 | adev->gfx.config.max_cu_per_sh = 6; | 2024 | adev->gfx.config.max_cu_per_sh = 6; |
2003 | adev->gfx.config.max_backends_per_se = 2; | ||
2004 | break; | 2025 | break; |
2005 | case 0xc6: | 2026 | case 0xc6: |
2006 | case 0xca: | 2027 | case 0xca: |
2007 | case 0xce: | 2028 | case 0xce: |
2008 | /* B6 */ | 2029 | /* B6 */ |
2009 | adev->gfx.config.max_cu_per_sh = 6; | 2030 | adev->gfx.config.max_cu_per_sh = 6; |
2010 | adev->gfx.config.max_backends_per_se = 2; | ||
2011 | break; | 2031 | break; |
2012 | case 0xc7: | 2032 | case 0xc7: |
2013 | case 0x87: | 2033 | case 0x87: |
@@ -2015,7 +2035,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2015 | default: | 2035 | default: |
2016 | /* B4 */ | 2036 | /* B4 */ |
2017 | adev->gfx.config.max_cu_per_sh = 4; | 2037 | adev->gfx.config.max_cu_per_sh = 4; |
2018 | adev->gfx.config.max_backends_per_se = 1; | ||
2019 | break; | 2038 | break; |
2020 | } | 2039 | } |
2021 | 2040 | ||
@@ -2275,7 +2294,6 @@ static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev) | |||
2275 | 2294 | ||
2276 | hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; | 2295 | hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; |
2277 | amdgpu_ucode_print_rlc_hdr(&hdr->header); | 2296 | amdgpu_ucode_print_rlc_hdr(&hdr->header); |
2278 | adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version); | ||
2279 | 2297 | ||
2280 | fw_data = (const __le32 *)(adev->gfx.rlc_fw->data + | 2298 | fw_data = (const __le32 *)(adev->gfx.rlc_fw->data + |
2281 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); | 2299 | le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
@@ -2361,12 +2379,6 @@ static int gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device *adev) | |||
2361 | amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header); | 2379 | amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header); |
2362 | amdgpu_ucode_print_gfx_hdr(&ce_hdr->header); | 2380 | amdgpu_ucode_print_gfx_hdr(&ce_hdr->header); |
2363 | amdgpu_ucode_print_gfx_hdr(&me_hdr->header); | 2381 | amdgpu_ucode_print_gfx_hdr(&me_hdr->header); |
2364 | adev->gfx.pfp_fw_version = le32_to_cpu(pfp_hdr->header.ucode_version); | ||
2365 | adev->gfx.ce_fw_version = le32_to_cpu(ce_hdr->header.ucode_version); | ||
2366 | adev->gfx.me_fw_version = le32_to_cpu(me_hdr->header.ucode_version); | ||
2367 | adev->gfx.me_feature_version = le32_to_cpu(me_hdr->ucode_feature_version); | ||
2368 | adev->gfx.ce_feature_version = le32_to_cpu(ce_hdr->ucode_feature_version); | ||
2369 | adev->gfx.pfp_feature_version = le32_to_cpu(pfp_hdr->ucode_feature_version); | ||
2370 | 2382 | ||
2371 | gfx_v8_0_cp_gfx_enable(adev, false); | 2383 | gfx_v8_0_cp_gfx_enable(adev, false); |
2372 | 2384 | ||
@@ -2622,7 +2634,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
2622 | 2634 | ||
2623 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; | 2635 | mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
2624 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); | 2636 | amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); |
2625 | adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version); | ||
2626 | 2637 | ||
2627 | fw_data = (const __le32 *) | 2638 | fw_data = (const __le32 *) |
2628 | (adev->gfx.mec_fw->data + | 2639 | (adev->gfx.mec_fw->data + |
@@ -2641,7 +2652,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev) | |||
2641 | 2652 | ||
2642 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; | 2653 | mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data; |
2643 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); | 2654 | amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header); |
2644 | adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version); | ||
2645 | 2655 | ||
2646 | fw_data = (const __le32 *) | 2656 | fw_data = (const __le32 *) |
2647 | (adev->gfx.mec2_fw->data + | 2657 | (adev->gfx.mec2_fw->data + |
@@ -3125,7 +3135,7 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3125 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, | 3135 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, |
3126 | AMDGPU_DOORBELL_KIQ << 2); | 3136 | AMDGPU_DOORBELL_KIQ << 2); |
3127 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, | 3137 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, |
3128 | 0x7FFFF << 2); | 3138 | AMDGPU_DOORBELL_MEC_RING7 << 2); |
3129 | } | 3139 | } |
3130 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); | 3140 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); |
3131 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, | 3141 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, |
@@ -3753,7 +3763,7 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) | |||
3753 | amdgpu_ring_write(ring, 0x20); /* poll interval */ | 3763 | amdgpu_ring_write(ring, 0x20); /* poll interval */ |
3754 | } | 3764 | } |
3755 | 3765 | ||
3756 | static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | 3766 | static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
3757 | struct amdgpu_ib *ib) | 3767 | struct amdgpu_ib *ib) |
3758 | { | 3768 | { |
3759 | bool need_ctx_switch = ring->current_ctx != ib->ctx; | 3769 | bool need_ctx_switch = ring->current_ctx != ib->ctx; |
@@ -3761,15 +3771,10 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3761 | u32 next_rptr = ring->wptr + 5; | 3771 | u32 next_rptr = ring->wptr + 5; |
3762 | 3772 | ||
3763 | /* drop the CE preamble IB for the same context */ | 3773 | /* drop the CE preamble IB for the same context */ |
3764 | if ((ring->type == AMDGPU_RING_TYPE_GFX) && | 3774 | if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch) |
3765 | (ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && | ||
3766 | !need_ctx_switch) | ||
3767 | return; | 3775 | return; |
3768 | 3776 | ||
3769 | if (ring->type == AMDGPU_RING_TYPE_COMPUTE) | 3777 | if (need_ctx_switch) |
3770 | control |= INDIRECT_BUFFER_VALID; | ||
3771 | |||
3772 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) | ||
3773 | next_rptr += 2; | 3778 | next_rptr += 2; |
3774 | 3779 | ||
3775 | next_rptr += 4; | 3780 | next_rptr += 4; |
@@ -3780,7 +3785,7 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3780 | amdgpu_ring_write(ring, next_rptr); | 3785 | amdgpu_ring_write(ring, next_rptr); |
3781 | 3786 | ||
3782 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ | 3787 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
3783 | if (need_ctx_switch && ring->type == AMDGPU_RING_TYPE_GFX) { | 3788 | if (need_ctx_switch) { |
3784 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | 3789 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
3785 | amdgpu_ring_write(ring, 0); | 3790 | amdgpu_ring_write(ring, 0); |
3786 | } | 3791 | } |
@@ -3803,6 +3808,36 @@ static void gfx_v8_0_ring_emit_ib(struct amdgpu_ring *ring, | |||
3803 | amdgpu_ring_write(ring, control); | 3808 | amdgpu_ring_write(ring, control); |
3804 | } | 3809 | } |
3805 | 3810 | ||
3811 | static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | ||
3812 | struct amdgpu_ib *ib) | ||
3813 | { | ||
3814 | u32 header, control = 0; | ||
3815 | u32 next_rptr = ring->wptr + 5; | ||
3816 | |||
3817 | control |= INDIRECT_BUFFER_VALID; | ||
3818 | |||
3819 | next_rptr += 4; | ||
3820 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3821 | amdgpu_ring_write(ring, WRITE_DATA_DST_SEL(5) | WR_CONFIRM); | ||
3822 | amdgpu_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); | ||
3823 | amdgpu_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); | ||
3824 | amdgpu_ring_write(ring, next_rptr); | ||
3825 | |||
3826 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | ||
3827 | |||
3828 | control |= ib->length_dw | | ||
3829 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
3830 | |||
3831 | amdgpu_ring_write(ring, header); | ||
3832 | amdgpu_ring_write(ring, | ||
3833 | #ifdef __BIG_ENDIAN | ||
3834 | (2 << 0) | | ||
3835 | #endif | ||
3836 | (ib->gpu_addr & 0xFFFFFFFC)); | ||
3837 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); | ||
3838 | amdgpu_ring_write(ring, control); | ||
3839 | } | ||
3840 | |||
3806 | static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, | 3841 | static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, |
3807 | u64 seq, unsigned flags) | 3842 | u64 seq, unsigned flags) |
3808 | { | 3843 | { |
@@ -4224,7 +4259,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { | |||
4224 | .get_wptr = gfx_v8_0_ring_get_wptr_gfx, | 4259 | .get_wptr = gfx_v8_0_ring_get_wptr_gfx, |
4225 | .set_wptr = gfx_v8_0_ring_set_wptr_gfx, | 4260 | .set_wptr = gfx_v8_0_ring_set_wptr_gfx, |
4226 | .parse_cs = NULL, | 4261 | .parse_cs = NULL, |
4227 | .emit_ib = gfx_v8_0_ring_emit_ib, | 4262 | .emit_ib = gfx_v8_0_ring_emit_ib_gfx, |
4228 | .emit_fence = gfx_v8_0_ring_emit_fence_gfx, | 4263 | .emit_fence = gfx_v8_0_ring_emit_fence_gfx, |
4229 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, | 4264 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, |
4230 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, | 4265 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, |
@@ -4240,7 +4275,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { | |||
4240 | .get_wptr = gfx_v8_0_ring_get_wptr_compute, | 4275 | .get_wptr = gfx_v8_0_ring_get_wptr_compute, |
4241 | .set_wptr = gfx_v8_0_ring_set_wptr_compute, | 4276 | .set_wptr = gfx_v8_0_ring_set_wptr_compute, |
4242 | .parse_cs = NULL, | 4277 | .parse_cs = NULL, |
4243 | .emit_ib = gfx_v8_0_ring_emit_ib, | 4278 | .emit_ib = gfx_v8_0_ring_emit_ib_compute, |
4244 | .emit_fence = gfx_v8_0_ring_emit_fence_compute, | 4279 | .emit_fence = gfx_v8_0_ring_emit_fence_compute, |
4245 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, | 4280 | .emit_semaphore = gfx_v8_0_ring_emit_semaphore, |
4246 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, | 4281 | .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush, |