Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-fixes

- fix and enable iceland/topaz support
- handle WC on platforms that don't support it

* 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux:
drm/amdgpu: disable uvd and vce clockgating on Fiji
drm/amdgpu: remove exp hardware support from iceland
drm/amdgpu: load MEC ucode manually on iceland
drm/amdgpu: don't load MEC2 on topaz
drm/amdgpu: drop topaz support from gmc8 module
drm/amdgpu: pull topaz gmc bits into gmc_v7
drm/amdgpu: The VI specific EXE bit should only apply to GMC v8.0 above
drm/amdgpu: iceland use CI based MC IP
drm/amdgpu: move gmc7 support out of CIK dependency
drm/amdgpu/gfx7: enable cp inst/reg error interrupts
drm/amdgpu/gfx8: enable cp inst/reg error interrupts
drm/amdgpu: mask out WC from BO on unsupported arches
drm/radeon: mask out WC from BO on unsupported arches
drm: add helper to check for wc memory support
drm/amdgpu: no need to load MC firmware on fiji

+123 -59
+2 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 25 25 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o 26 26 27 27 # add asic specific block 28 - amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o gmc_v7_0.o cik_ih.o kv_smc.o kv_dpm.o \ 28 + amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ 29 29 ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o \ 30 30 amdgpu_amdkfd_gfx_v7.o 31 31 ··· 34 34 35 35 # add GMC block 36 36 amdgpu-y += \ 37 + gmc_v7_0.o \ 37 38 gmc_v8_0.o 38 39 39 40 # add IH block
+5 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 256 256 {0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU}, 257 257 #endif 258 258 /* topaz */ 259 - {0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, 260 - {0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, 261 - {0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, 262 - {0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, 263 - {0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, 259 + {0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, 260 + {0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, 261 + {0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, 262 + {0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, 263 + {0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, 264 264 /* tonga */ 265 265 {0x1002, 0x6920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA}, 266 266 {0x1002, 0x6921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
+8
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 33 33 #include <linux/slab.h> 34 34 #include <drm/drmP.h> 35 35 #include <drm/amdgpu_drm.h> 36 + #include <drm/drm_cache.h> 36 37 #include "amdgpu.h" 37 38 #include "amdgpu_trace.h" 38 39 ··· 262 261 AMDGPU_GEM_DOMAIN_OA); 263 262 264 263 bo->flags = flags; 264 + 265 + /* For architectures that don't support WC memory, 266 + * mask out the WC flag from the BO 267 + */ 268 + if (!drm_arch_can_wc_memory()) 269 + bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC; 270 + 265 271 amdgpu_fill_placement_to_bo(bo, placement); 266 272 /* Kernel allocation are uninterruptible */ 267 273 r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 808 808 flags |= AMDGPU_PTE_SNOOPED; 809 809 } 810 810 811 - if (adev->asic_type >= CHIP_TOPAZ) 811 + if (adev->asic_type >= CHIP_TONGA) 812 812 flags |= AMDGPU_PTE_EXECUTABLE; 813 813 814 814 flags |= AMDGPU_PTE_READABLE;
+19 -1
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 4738 4738 return 0; 4739 4739 } 4740 4740 4741 + static int gfx_v7_0_late_init(void *handle) 4742 + { 4743 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4744 + int r; 4745 + 4746 + r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0); 4747 + if (r) 4748 + return r; 4749 + 4750 + r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); 4751 + if (r) 4752 + return r; 4753 + 4754 + return 0; 4755 + } 4756 + 4741 4757 static int gfx_v7_0_sw_init(void *handle) 4742 4758 { 4743 4759 struct amdgpu_ring *ring; ··· 4906 4890 { 4907 4891 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4908 4892 4893 + amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); 4894 + amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); 4909 4895 gfx_v7_0_cp_enable(adev, false); 4910 4896 gfx_v7_0_rlc_stop(adev); 4911 4897 gfx_v7_0_fini_pg(adev); ··· 5545 5527 5546 5528 const struct amd_ip_funcs gfx_v7_0_ip_funcs = { 5547 5529 .early_init = gfx_v7_0_early_init, 5548 - .late_init = NULL, 5530 + .late_init = gfx_v7_0_late_init, 5549 5531 .sw_init = gfx_v7_0_sw_init, 5550 5532 .sw_fini = gfx_v7_0_sw_fini, 5551 5533 .hw_init = gfx_v7_0_hw_init,
+22 -6
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 111 111 MODULE_FIRMWARE("amdgpu/topaz_pfp.bin"); 112 112 MODULE_FIRMWARE("amdgpu/topaz_me.bin"); 113 113 MODULE_FIRMWARE("amdgpu/topaz_mec.bin"); 114 - MODULE_FIRMWARE("amdgpu/topaz_mec2.bin"); 115 114 MODULE_FIRMWARE("amdgpu/topaz_rlc.bin"); 116 115 117 116 MODULE_FIRMWARE("amdgpu/fiji_ce.bin"); ··· 827 828 adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); 828 829 adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 829 830 830 - if (adev->asic_type != CHIP_STONEY) { 831 + if ((adev->asic_type != CHIP_STONEY) && 832 + (adev->asic_type != CHIP_TOPAZ)) { 831 833 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 832 834 err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 833 835 if (!err) { ··· 3851 3851 if (r) 3852 3852 return -EINVAL; 3853 3853 3854 - r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, 3855 - AMDGPU_UCODE_ID_CP_MEC1); 3856 - if (r) 3857 - return -EINVAL; 3854 + if (adev->asic_type == CHIP_TOPAZ) { 3855 + r = gfx_v8_0_cp_compute_load_microcode(adev); 3856 + if (r) 3857 + return r; 3858 + } else { 3859 + r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, 3860 + AMDGPU_UCODE_ID_CP_MEC1); 3861 + if (r) 3862 + return -EINVAL; 3863 + } 3858 3864 } 3859 3865 } 3860 3866 ··· 3907 3901 { 3908 3902 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3909 3903 3904 + amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); 3905 + amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); 3910 3906 gfx_v8_0_cp_enable(adev, false); 3911 3907 gfx_v8_0_rlc_stop(adev); 3912 3908 gfx_v8_0_cp_compute_fini(adev); ··· 4336 4328 { 4337 4329 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4338 4330 int r; 4331 + 4332 + r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0); 4333 + if (r) 4334 + return r; 4335 + 4336 + r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); 4337 + if (r) 4338 + return r; 4339 4339 4340 4340 /* requires IBs so do in late init after IB pool is initialized */ 4341 4341 r = gfx_v8_0_do_edc_gpr_workarounds(adev);
+41 -2
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 42 42 43 43 MODULE_FIRMWARE("radeon/bonaire_mc.bin"); 44 44 MODULE_FIRMWARE("radeon/hawaii_mc.bin"); 45 + MODULE_FIRMWARE("amdgpu/topaz_mc.bin"); 46 + 47 + static const u32 golden_settings_iceland_a11[] = 48 + { 49 + mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff, 50 + mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 51 + mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 52 + mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff 53 + }; 54 + 55 + static const u32 iceland_mgcg_cgcg_init[] = 56 + { 57 + mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 58 + }; 59 + 60 + static void gmc_v7_0_init_golden_registers(struct amdgpu_device *adev) 61 + { 62 + switch (adev->asic_type) { 63 + case CHIP_TOPAZ: 64 + amdgpu_program_register_sequence(adev, 65 + iceland_mgcg_cgcg_init, 66 + (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); 67 + amdgpu_program_register_sequence(adev, 68 + golden_settings_iceland_a11, 69 + (const u32)ARRAY_SIZE(golden_settings_iceland_a11)); 70 + break; 71 + default: 72 + break; 73 + } 74 + } 45 75 46 76 /** 47 - * gmc8_mc_wait_for_idle - wait for MC idle callback. 77 + * gmc7_mc_wait_for_idle - wait for MC idle callback. 48 78 * 49 79 * @adev: amdgpu_device pointer 50 80 * ··· 162 132 case CHIP_HAWAII: 163 133 chip_name = "hawaii"; 164 134 break; 135 + case CHIP_TOPAZ: 136 + chip_name = "topaz"; 137 + break; 165 138 case CHIP_KAVERI: 166 139 case CHIP_KABINI: 167 140 return 0; 168 141 default: BUG(); 169 142 } 170 143 171 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 144 + if (adev->asic_type == CHIP_TOPAZ) 145 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); 146 + else 147 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 148 + 172 149 err = request_firmware(&adev->mc.fw, fw_name, adev->dev); 173 150 if (err) 174 151 goto out; ··· 1020 983 { 1021 984 int r; 1022 985 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 986 + 987 + gmc_v7_0_init_golden_registers(adev); 1023 988 1024 989 gmc_v7_0_mc_program(adev); 1025 990
+1 -29
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
··· 42 42 static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); 43 43 static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); 44 44 45 - MODULE_FIRMWARE("amdgpu/topaz_mc.bin"); 46 45 MODULE_FIRMWARE("amdgpu/tonga_mc.bin"); 47 - MODULE_FIRMWARE("amdgpu/fiji_mc.bin"); 48 46 49 47 static const u32 golden_settings_tonga_a11[] = 50 48 { ··· 73 75 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 74 76 }; 75 77 76 - static const u32 golden_settings_iceland_a11[] = 77 - { 78 - mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff, 79 - mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, 80 - mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, 81 - mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff 82 - }; 83 - 84 - static const u32 iceland_mgcg_cgcg_init[] = 85 - { 86 - mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 87 - }; 88 - 89 78 static const u32 cz_mgcg_cgcg_init[] = 90 79 { 91 80 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 ··· 87 102 static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev) 88 103 { 89 104 switch (adev->asic_type) { 90 - case CHIP_TOPAZ: 91 - amdgpu_program_register_sequence(adev, 92 - iceland_mgcg_cgcg_init, 93 - (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); 94 - amdgpu_program_register_sequence(adev, 95 - golden_settings_iceland_a11, 96 - (const u32)ARRAY_SIZE(golden_settings_iceland_a11)); 97 - break; 98 105 case CHIP_FIJI: 99 106 amdgpu_program_register_sequence(adev, 100 107 fiji_mgcg_cgcg_init, ··· 206 229 DRM_DEBUG("\n"); 207 230 208 231 switch (adev->asic_type) { 209 - case CHIP_TOPAZ: 210 - chip_name = "topaz"; 211 - break; 212 232 case CHIP_TONGA: 213 233 chip_name = "tonga"; 214 234 break; 215 235 case CHIP_FIJI: 216 - chip_name = "fiji"; 217 - break; 218 236 case CHIP_CARRIZO: 219 237 case CHIP_STONEY: 220 238 return 0; ··· 979 1007 980 1008 gmc_v8_0_mc_program(adev); 981 1009 982 - if (!(adev->flags & AMD_IS_APU)) { 1010 + if (adev->asic_type == CHIP_TONGA) { 983 1011 r = gmc_v8_0_mc_load_microcode(adev); 984 1012 if (r) { 985 1013 DRM_ERROR("Failed to load MC firmware!\n");
+3 -9
drivers/gpu/drm/amd/amdgpu/iceland_smc.c
··· 432 432 case AMDGPU_UCODE_ID_CP_ME: 433 433 return UCODE_ID_CP_ME_MASK; 434 434 case AMDGPU_UCODE_ID_CP_MEC1: 435 - return UCODE_ID_CP_MEC_MASK | UCODE_ID_CP_MEC_JT1_MASK | UCODE_ID_CP_MEC_JT2_MASK; 435 + return UCODE_ID_CP_MEC_MASK | UCODE_ID_CP_MEC_JT1_MASK; 436 436 case AMDGPU_UCODE_ID_CP_MEC2: 437 437 return UCODE_ID_CP_MEC_MASK; 438 438 case AMDGPU_UCODE_ID_RLC_G: ··· 522 522 return -EINVAL; 523 523 } 524 524 525 - if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT2, 526 - &toc->entry[toc->num_entries++])) { 527 - DRM_ERROR("Failed to get firmware entry for MEC_JT2\n"); 528 - return -EINVAL; 529 - } 530 - 531 525 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA0, 532 526 &toc->entry[toc->num_entries++])) { 533 527 DRM_ERROR("Failed to get firmware entry for SDMA0\n"); ··· 544 550 UCODE_ID_CP_ME_MASK | 545 551 UCODE_ID_CP_PFP_MASK | 546 552 UCODE_ID_CP_MEC_MASK | 547 - UCODE_ID_CP_MEC_JT1_MASK | 548 - UCODE_ID_CP_MEC_JT2_MASK; 553 + UCODE_ID_CP_MEC_JT1_MASK; 554 + 549 555 550 556 if (iceland_send_msg_to_smc_with_parameter_without_waiting(adev, PPSMC_MSG_LoadUcodes, fw_to_load)) { 551 557 DRM_ERROR("Fail to request SMU load ucode\n");
+5 -5
drivers/gpu/drm/amd/amdgpu/vi.c
··· 61 61 #include "vi.h" 62 62 #include "vi_dpm.h" 63 63 #include "gmc_v8_0.h" 64 + #include "gmc_v7_0.h" 64 65 #include "gfx_v8_0.h" 65 66 #include "sdma_v2_4.h" 66 67 #include "sdma_v3_0.h" ··· 1110 1109 }, 1111 1110 { 1112 1111 .type = AMD_IP_BLOCK_TYPE_GMC, 1113 - .major = 8, 1114 - .minor = 0, 1112 + .major = 7, 1113 + .minor = 4, 1115 1114 .rev = 0, 1116 - .funcs = &gmc_v8_0_ip_funcs, 1115 + .funcs = &gmc_v7_0_ip_funcs, 1117 1116 }, 1118 1117 { 1119 1118 .type = AMD_IP_BLOCK_TYPE_IH, ··· 1443 1442 break; 1444 1443 case CHIP_FIJI: 1445 1444 adev->has_uvd = true; 1446 - adev->cg_flags = AMDGPU_CG_SUPPORT_UVD_MGCG | 1447 - AMDGPU_CG_SUPPORT_VCE_MGCG; 1445 + adev->cg_flags = 0; 1448 1446 adev->pg_flags = 0; 1449 1447 adev->external_rev_id = adev->rev_id + 0x3c; 1450 1448 break;
+7
drivers/gpu/drm/radeon/radeon_object.c
··· 33 33 #include <linux/slab.h> 34 34 #include <drm/drmP.h> 35 35 #include <drm/radeon_drm.h> 36 + #include <drm/drm_cache.h> 36 37 #include "radeon.h" 37 38 #include "radeon_trace.h" 38 39 ··· 246 245 DRM_INFO_ONCE("Please enable CONFIG_MTRR and CONFIG_X86_PAT for " 247 246 "better performance thanks to write-combining\n"); 248 247 bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); 248 + #else 249 + /* For architectures that don't support WC memory, 250 + * mask out the WC flag from the BO 251 + */ 252 + if (!drm_arch_can_wc_memory()) 253 + bo->flags &= ~RADEON_GEM_GTT_WC; 249 254 #endif 250 255 251 256 radeon_ttm_placement_from_domain(bo, domain);
+9
include/drm/drm_cache.h
··· 35 35 36 36 void drm_clflush_pages(struct page *pages[], unsigned long num_pages); 37 37 38 + static inline bool drm_arch_can_wc_memory(void) 39 + { 40 + #if defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE) 41 + return false; 42 + #else 43 + return true; 44 + #endif 45 + } 46 + 38 47 #endif