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

Merge tag 'drm-next-2020-10-23' of git://anongit.freedesktop.org/drm/drm

Pull more drm fixes from Dave Airlie:
"This should be the last round of things for rc1, a bunch of i915
fixes, some amdgpu, more font OOB fixes and one ttm fix just found
reading code:

fbcon/fonts:
- Two patches to prevent OOB access

ttm:
- fix for evicition value range check

amdgpu:
- Sienna Cichlid fixes
- MST manager resource leak fix
- GPU reset fix

amdkfd:
- Luxmark fix for Navi1x

i915:
- Tweak initial DPCD backlight.enabled value (Sean)
- Initialize reserved MOCS indices (Ayaz)
- Mark initial fb obj as WT on eLLC machines to avoid rcu lockup (Ville)
- Support parsing of oversize batches (Chris)
- Delay execlists processing for TGL (Chris)
- Use the active reference on the vma during error capture (Chris)
- Widen CSB pointer (Chris)
- Wait for CSB entries on TGL (Chris)
- Fix unwind for scratch page allocation (Chris)
- Exclude low patches of stolen memory (Chris)
- Force VT'd workarounds when running as a guest OS (Chris)
- Drop runtime-pm assert from vpgu io accessors (Chris)"

* tag 'drm-next-2020-10-23' of git://anongit.freedesktop.org/drm/drm: (31 commits)
drm/amdgpu: correct the cu and rb info for sienna cichlid
drm/amd/pm: remove the average clock value in sysfs
drm/amd/pm: fix pp_dpm_fclk
Revert drm/amdgpu: disable sienna chichlid UMC RAS
drm/amd/pm: fix pcie information for sienna cichlid
drm/amdkfd: Use same SQ prefetch setting as amdgpu
drm/amd/swsmu: correct wrong feature bit mapping
drm/amd/psp: Fix sysfs: cannot create duplicate filename
drm/amd/display: Avoid MST manager resource leak.
drm/amd/display: Revert "drm/amd/display: Fix a list corruption"
drm/amdgpu: update golden setting for sienna_cichlid
drm/amd/swsmu: add missing feature map for sienna_cichlid
drm/amdgpu: correct the gpu reset handling for job != NULL case
drm/amdgpu: add rlc iram and dram firmware support
drm/amdgpu: add function to program pbb mode for sienna cichlid
drm/i915: Drop runtime-pm assert from vgpu io accessors
drm/i915: Force VT'd workarounds when running as a guest OS
drm/i915: Exclude low pages (128KiB) of stolen from use
drm/i915/gt: Onion unwind for scratch page allocation failure
drm/ttm: fix eviction valuable range check.
...

+528 -91
+1 -1
Documentation/fb/fbcon.rst
··· 81 81 1. fbcon=font:<name> 82 82 83 83 Select the initial font to use. The value 'name' can be any of the 84 - compiled-in fonts: 10x18, 6x10, 7x14, Acorn8x8, MINI4x6, 84 + compiled-in fonts: 10x18, 6x10, 6x8, 7x14, Acorn8x8, MINI4x6, 85 85 PEARL8x8, ProFont6x11, SUN12x22, SUN8x16, TER16x32, VGA8x16, VGA8x8. 86 86 87 87 Note, not all drivers can handle font with widths not divisible by 8,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 4625 4625 retry: /* Rest of adevs pre asic reset from XGMI hive. */ 4626 4626 list_for_each_entry(tmp_adev, device_list_handle, gmc.xgmi.head) { 4627 4627 r = amdgpu_device_pre_asic_reset(tmp_adev, 4628 - NULL, 4628 + (tmp_adev == adev) ? job : NULL, 4629 4629 &need_full_reset); 4630 4630 /*TODO Should we stop ?*/ 4631 4631 if (r) {
+8 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 208 208 adev->psp.ta_fw = NULL; 209 209 } 210 210 211 - if (adev->asic_type == CHIP_NAVI10) 211 + if (adev->asic_type == CHIP_NAVI10 || 212 + adev->asic_type == CHIP_SIENNA_CICHLID) 212 213 psp_sysfs_fini(adev); 213 214 214 215 return 0; ··· 1750 1749 break; 1751 1750 case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM: 1752 1751 *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM; 1752 + break; 1753 + case AMDGPU_UCODE_ID_RLC_IRAM: 1754 + *type = GFX_FW_TYPE_RLC_IRAM; 1755 + break; 1756 + case AMDGPU_UCODE_ID_RLC_DRAM: 1757 + *type = GFX_FW_TYPE_RLC_DRAM_BOOT; 1753 1758 break; 1754 1759 case AMDGPU_UCODE_ID_SMC: 1755 1760 *type = GFX_FW_TYPE_SMU;
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
··· 1986 1986 { 1987 1987 if (adev->asic_type != CHIP_VEGA10 && 1988 1988 adev->asic_type != CHIP_VEGA20 && 1989 - adev->asic_type != CHIP_ARCTURUS) 1989 + adev->asic_type != CHIP_ARCTURUS && 1990 + adev->asic_type != CHIP_SIENNA_CICHLID) 1990 1991 return 1; 1991 1992 else 1992 1993 return 0; ··· 2031 2030 2032 2031 *supported = amdgpu_ras_enable == 0 ? 2033 2032 0 : *hw_supported & amdgpu_ras_mask; 2034 - 2035 2033 adev->ras_features = *supported; 2036 2034 } 2037 2035
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h
··· 168 168 u32 save_restore_list_cntl_size_bytes; 169 169 u32 save_restore_list_gpm_size_bytes; 170 170 u32 save_restore_list_srm_size_bytes; 171 + u32 rlc_iram_ucode_size_bytes; 172 + u32 rlc_dram_ucode_size_bytes; 171 173 172 174 u32 *register_list_format; 173 175 u32 *register_restore; 174 176 u8 *save_restore_list_cntl; 175 177 u8 *save_restore_list_gpm; 176 178 u8 *save_restore_list_srm; 179 + u8 *rlc_iram_ucode; 180 + u8 *rlc_dram_ucode; 177 181 178 182 bool is_rlc_v2_1; 179 183
+10
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
··· 500 500 ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL && 501 501 ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM && 502 502 ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM && 503 + ucode->ucode_id != AMDGPU_UCODE_ID_RLC_IRAM && 504 + ucode->ucode_id != AMDGPU_UCODE_ID_RLC_DRAM && 503 505 ucode->ucode_id != AMDGPU_UCODE_ID_DMCU_ERAM && 504 506 ucode->ucode_id != AMDGPU_UCODE_ID_DMCU_INTV && 505 507 ucode->ucode_id != AMDGPU_UCODE_ID_DMCUB)) { ··· 557 555 } else if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM) { 558 556 ucode->ucode_size = adev->gfx.rlc.save_restore_list_srm_size_bytes; 559 557 memcpy(ucode->kaddr, adev->gfx.rlc.save_restore_list_srm, 558 + ucode->ucode_size); 559 + } else if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_IRAM) { 560 + ucode->ucode_size = adev->gfx.rlc.rlc_iram_ucode_size_bytes; 561 + memcpy(ucode->kaddr, adev->gfx.rlc.rlc_iram_ucode, 562 + ucode->ucode_size); 563 + } else if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_DRAM) { 564 + ucode->ucode_size = adev->gfx.rlc.rlc_dram_ucode_size_bytes; 565 + memcpy(ucode->kaddr, adev->gfx.rlc.rlc_dram_ucode, 560 566 ucode->ucode_size); 561 567 } else if (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MES) { 562 568 ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_size_bytes);
+11
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
··· 222 222 uint32_t save_restore_list_srm_offset_bytes; 223 223 }; 224 224 225 + /* version_major=2, version_minor=1 */ 226 + struct rlc_firmware_header_v2_2 { 227 + struct rlc_firmware_header_v2_1 v2_1; 228 + uint32_t rlc_iram_ucode_size_bytes; 229 + uint32_t rlc_iram_ucode_offset_bytes; 230 + uint32_t rlc_dram_ucode_size_bytes; 231 + uint32_t rlc_dram_ucode_offset_bytes; 232 + }; 233 + 225 234 /* version_major=1, version_minor=0 */ 226 235 struct sdma_firmware_header_v1_0 { 227 236 struct common_firmware_header header; ··· 348 339 AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL, 349 340 AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM, 350 341 AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM, 342 + AMDGPU_UCODE_ID_RLC_IRAM, 343 + AMDGPU_UCODE_ID_RLC_DRAM, 351 344 AMDGPU_UCODE_ID_RLC_G, 352 345 AMDGPU_UCODE_ID_STORAGE, 353 346 AMDGPU_UCODE_ID_SMC,
+105 -6
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
··· 112 112 #define mmCP_HYP_ME_UCODE_DATA 0x5817 113 113 #define mmCP_HYP_ME_UCODE_DATA_BASE_IDX 1 114 114 115 + //CC_GC_SA_UNIT_DISABLE 116 + #define mmCC_GC_SA_UNIT_DISABLE 0x0fe9 117 + #define mmCC_GC_SA_UNIT_DISABLE_BASE_IDX 0 118 + #define CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8 119 + #define CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L 120 + //GC_USER_SA_UNIT_DISABLE 121 + #define mmGC_USER_SA_UNIT_DISABLE 0x0fea 122 + #define mmGC_USER_SA_UNIT_DISABLE_BASE_IDX 0 123 + #define GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8 124 + #define GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L 125 + //PA_SC_ENHANCE_3 126 + #define mmPA_SC_ENHANCE_3 0x1085 127 + #define mmPA_SC_ENHANCE_3_BASE_IDX 0 128 + #define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO__SHIFT 0x3 129 + #define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO_MASK 0x00000008L 130 + 115 131 MODULE_FIRMWARE("amdgpu/navi10_ce.bin"); 116 132 MODULE_FIRMWARE("amdgpu/navi10_pfp.bin"); 117 133 MODULE_FIRMWARE("amdgpu/navi10_me.bin"); ··· 3107 3091 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_ADDR_MATCH_MASK, 0xffffffff, 0xffffffcf), 3108 3092 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CM_CTRL1, 0xff8fff0f, 0x580f1008), 3109 3093 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CTRL3, 0xf7ffffff, 0x10f80988), 3094 + SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x00000020, 0x00000020), 3110 3095 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_CL_ENHANCE, 0xf17fffff, 0x01200007), 3111 3096 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_TIMEOUT_COUNTER, 0xffffffff, 0x00000800), 3112 3097 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000820), ··· 3205 3188 static void gfx_v10_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume); 3206 3189 static void gfx_v10_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume); 3207 3190 static void gfx_v10_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, bool secure); 3191 + static u32 gfx_v10_3_get_disabled_sa(struct amdgpu_device *adev); 3192 + static void gfx_v10_3_program_pbb_mode(struct amdgpu_device *adev); 3208 3193 3209 3194 static void gfx10_kiq_set_resources(struct amdgpu_ring *kiq_ring, uint64_t queue_mask) 3210 3195 { ··· 3605 3586 le32_to_cpu(rlc_hdr->reg_list_format_direct_reg_list_length); 3606 3587 } 3607 3588 3589 + static void gfx_v10_0_init_rlc_iram_dram_microcode(struct amdgpu_device *adev) 3590 + { 3591 + const struct rlc_firmware_header_v2_2 *rlc_hdr; 3592 + 3593 + rlc_hdr = (const struct rlc_firmware_header_v2_2 *)adev->gfx.rlc_fw->data; 3594 + adev->gfx.rlc.rlc_iram_ucode_size_bytes = le32_to_cpu(rlc_hdr->rlc_iram_ucode_size_bytes); 3595 + adev->gfx.rlc.rlc_iram_ucode = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->rlc_iram_ucode_offset_bytes); 3596 + adev->gfx.rlc.rlc_dram_ucode_size_bytes = le32_to_cpu(rlc_hdr->rlc_dram_ucode_size_bytes); 3597 + adev->gfx.rlc.rlc_dram_ucode = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->rlc_dram_ucode_offset_bytes); 3598 + } 3599 + 3608 3600 static bool gfx_v10_0_navi10_gfxoff_should_enable(struct amdgpu_device *adev) 3609 3601 { 3610 3602 bool ret = false; ··· 3731 3701 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; 3732 3702 version_major = le16_to_cpu(rlc_hdr->header.header_version_major); 3733 3703 version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor); 3734 - if (version_major == 2 && version_minor == 1) 3735 - adev->gfx.rlc.is_rlc_v2_1 = true; 3736 3704 3737 3705 adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version); 3738 3706 adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version); ··· 3772 3744 for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++) 3773 3745 adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]); 3774 3746 3775 - if (adev->gfx.rlc.is_rlc_v2_1) 3776 - gfx_v10_0_init_rlc_ext_microcode(adev); 3747 + if (version_major == 2) { 3748 + if (version_minor >= 1) 3749 + gfx_v10_0_init_rlc_ext_microcode(adev); 3750 + if (version_minor == 2) 3751 + gfx_v10_0_init_rlc_iram_dram_microcode(adev); 3752 + } 3777 3753 } 3778 3754 3779 3755 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec%s.bin", chip_name, wks); ··· 3838 3806 adev->firmware.fw_size += 3839 3807 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 3840 3808 } 3841 - if (adev->gfx.rlc.is_rlc_v2_1 && 3842 - adev->gfx.rlc.save_restore_list_cntl_size_bytes && 3809 + if (adev->gfx.rlc.save_restore_list_cntl_size_bytes && 3843 3810 adev->gfx.rlc.save_restore_list_gpm_size_bytes && 3844 3811 adev->gfx.rlc.save_restore_list_srm_size_bytes) { 3845 3812 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL]; ··· 3858 3827 info->fw = adev->gfx.rlc_fw; 3859 3828 adev->firmware.fw_size += 3860 3829 ALIGN(adev->gfx.rlc.save_restore_list_srm_size_bytes, PAGE_SIZE); 3830 + 3831 + if (adev->gfx.rlc.rlc_iram_ucode_size_bytes && 3832 + adev->gfx.rlc.rlc_dram_ucode_size_bytes) { 3833 + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_IRAM]; 3834 + info->ucode_id = AMDGPU_UCODE_ID_RLC_IRAM; 3835 + info->fw = adev->gfx.rlc_fw; 3836 + adev->firmware.fw_size += 3837 + ALIGN(adev->gfx.rlc.rlc_iram_ucode_size_bytes, PAGE_SIZE); 3838 + 3839 + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_DRAM]; 3840 + info->ucode_id = AMDGPU_UCODE_ID_RLC_DRAM; 3841 + info->fw = adev->gfx.rlc_fw; 3842 + adev->firmware.fw_size += 3843 + ALIGN(adev->gfx.rlc.rlc_dram_ucode_size_bytes, PAGE_SIZE); 3844 + } 3861 3845 } 3862 3846 3863 3847 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1]; ··· 4582 4536 int i, j; 4583 4537 u32 data; 4584 4538 u32 active_rbs = 0; 4539 + u32 bitmap; 4585 4540 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / 4586 4541 adev->gfx.config.max_sh_per_se; 4587 4542 4588 4543 mutex_lock(&adev->grbm_idx_mutex); 4589 4544 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 4590 4545 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 4546 + bitmap = i * adev->gfx.config.max_sh_per_se + j; 4547 + if ((adev->asic_type == CHIP_SIENNA_CICHLID) && 4548 + ((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1)) 4549 + continue; 4591 4550 gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff); 4592 4551 data = gfx_v10_0_get_rb_active_bitmap(adev); 4593 4552 active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * ··· 7001 6950 if (r) 7002 6951 return r; 7003 6952 6953 + if (adev->asic_type == CHIP_SIENNA_CICHLID) 6954 + gfx_v10_3_program_pbb_mode(adev); 6955 + 7004 6956 return r; 7005 6957 } 7006 6958 ··· 8817 8763 mutex_lock(&adev->grbm_idx_mutex); 8818 8764 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 8819 8765 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 8766 + bitmap = i * adev->gfx.config.max_sh_per_se + j; 8767 + if ((adev->asic_type == CHIP_SIENNA_CICHLID) && 8768 + ((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1)) 8769 + continue; 8820 8770 mask = 1; 8821 8771 ao_bitmap = 0; 8822 8772 counter = 0; ··· 8853 8795 cu_info->simd_per_cu = NUM_SIMD_PER_CU; 8854 8796 8855 8797 return 0; 8798 + } 8799 + 8800 + static u32 gfx_v10_3_get_disabled_sa(struct amdgpu_device *adev) 8801 + { 8802 + uint32_t efuse_setting, vbios_setting, disabled_sa, max_sa_mask; 8803 + 8804 + efuse_setting = RREG32_SOC15(GC, 0, mmCC_GC_SA_UNIT_DISABLE); 8805 + efuse_setting &= CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK; 8806 + efuse_setting >>= CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT; 8807 + 8808 + vbios_setting = RREG32_SOC15(GC, 0, mmGC_USER_SA_UNIT_DISABLE); 8809 + vbios_setting &= GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK; 8810 + vbios_setting >>= GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT; 8811 + 8812 + max_sa_mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_sh_per_se * 8813 + adev->gfx.config.max_shader_engines); 8814 + disabled_sa = efuse_setting | vbios_setting; 8815 + disabled_sa &= max_sa_mask; 8816 + 8817 + return disabled_sa; 8818 + } 8819 + 8820 + static void gfx_v10_3_program_pbb_mode(struct amdgpu_device *adev) 8821 + { 8822 + uint32_t max_sa_per_se, max_sa_per_se_mask, max_shader_engines; 8823 + uint32_t disabled_sa_mask, se_index, disabled_sa_per_se; 8824 + 8825 + disabled_sa_mask = gfx_v10_3_get_disabled_sa(adev); 8826 + 8827 + max_sa_per_se = adev->gfx.config.max_sh_per_se; 8828 + max_sa_per_se_mask = (1 << max_sa_per_se) - 1; 8829 + max_shader_engines = adev->gfx.config.max_shader_engines; 8830 + 8831 + for (se_index = 0; max_shader_engines > se_index; se_index++) { 8832 + disabled_sa_per_se = disabled_sa_mask >> (se_index * max_sa_per_se); 8833 + disabled_sa_per_se &= max_sa_per_se_mask; 8834 + if (disabled_sa_per_se == max_sa_per_se_mask) { 8835 + WREG32_FIELD15(GC, 0, PA_SC_ENHANCE_3, FORCE_PBB_WORKLOAD_MODE_TO_ZERO, 1); 8836 + break; 8837 + } 8838 + } 8856 8839 } 8857 8840 8858 8841 const struct amdgpu_ip_block_version gfx_v10_0_ip_block =
+2 -2
drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h
··· 201 201 GFX_FW_TYPE_UVD1 = 23, /* UVD1 VG-20 */ 202 202 GFX_FW_TYPE_TOC = 24, /* TOC NV-10 */ 203 203 GFX_FW_TYPE_RLC_P = 25, /* RLC P NV */ 204 - GFX_FW_TYPE_RLX6 = 26, /* RLX6 NV */ 204 + GFX_FW_TYPE_RLC_IRAM = 26, /* RLC_IRAM NV */ 205 205 GFX_FW_TYPE_GLOBAL_TAP_DELAYS = 27, /* GLOBAL TAP DELAYS NV */ 206 206 GFX_FW_TYPE_SE0_TAP_DELAYS = 28, /* SE0 TAP DELAYS NV */ 207 207 GFX_FW_TYPE_SE1_TAP_DELAYS = 29, /* SE1 TAP DELAYS NV */ ··· 223 223 GFX_FW_TYPE_ACCUM_CTRL_RAM = 45, /* ACCUM CTRL RAM NV */ 224 224 GFX_FW_TYPE_RLCP_CAM = 46, /* RLCP CAM NV */ 225 225 GFX_FW_TYPE_RLC_SPP_CAM_EXT = 47, /* RLC SPP CAM EXT NV */ 226 - GFX_FW_TYPE_RLX6_DRAM_BOOT = 48, /* RLX6 DRAM BOOT NV */ 226 + GFX_FW_TYPE_RLC_DRAM_BOOT = 48, /* RLC DRAM BOOT NV */ 227 227 GFX_FW_TYPE_VCN0_RAM = 49, /* VCN_RAM NV + RN */ 228 228 GFX_FW_TYPE_VCN1_RAM = 50, /* VCN_RAM NV + RN */ 229 229 GFX_FW_TYPE_DMUB = 51, /* DMUB RN */
+3 -2
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c
··· 58 58 /* check if sh_mem_config register already configured */ 59 59 if (qpd->sh_mem_config == 0) { 60 60 qpd->sh_mem_config = 61 - SH_MEM_ALIGNMENT_MODE_UNALIGNED << 62 - SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; 61 + (SH_MEM_ALIGNMENT_MODE_UNALIGNED << 62 + SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | 63 + (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT); 63 64 #if 0 64 65 /* TODO: 65 66 * This shouldn't be an issue with Navi10. Verify.
+7 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 5063 5063 struct amdgpu_device *adev = drm_to_adev(connector->dev); 5064 5064 struct amdgpu_display_manager *dm = &adev->dm; 5065 5065 5066 - drm_atomic_private_obj_fini(&aconnector->mst_mgr.base); 5066 + /* 5067 + * Call only if mst_mgr was iniitalized before since it's not done 5068 + * for all connector types. 5069 + */ 5070 + if (aconnector->mst_mgr.dev) 5071 + drm_dp_mst_topology_mgr_destroy(&aconnector->mst_mgr); 5072 + 5067 5073 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\ 5068 5074 defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 5069 5075
+1
drivers/gpu/drm/amd/pm/inc/smu_types.h
··· 220 220 __SMU_DUMMY_MAP(DPM_MP0CLK), \ 221 221 __SMU_DUMMY_MAP(DPM_LINK), \ 222 222 __SMU_DUMMY_MAP(DPM_DCEFCLK), \ 223 + __SMU_DUMMY_MAP(DPM_XGMI), \ 223 224 __SMU_DUMMY_MAP(DS_GFXCLK), \ 224 225 __SMU_DUMMY_MAP(DS_SOCCLK), \ 225 226 __SMU_DUMMY_MAP(DS_LCLK), \
+16 -6
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 151 151 FEA_MAP(DPM_GFXCLK), 152 152 FEA_MAP(DPM_GFX_GPO), 153 153 FEA_MAP(DPM_UCLK), 154 + FEA_MAP(DPM_FCLK), 154 155 FEA_MAP(DPM_SOCCLK), 155 156 FEA_MAP(DPM_MP0CLK), 156 157 FEA_MAP(DPM_LINK), 157 158 FEA_MAP(DPM_DCEFCLK), 159 + FEA_MAP(DPM_XGMI), 158 160 FEA_MAP(MEM_VDDCI_SCALING), 159 161 FEA_MAP(MEM_MVDD_SCALING), 160 162 FEA_MAP(DS_GFXCLK), 161 163 FEA_MAP(DS_SOCCLK), 164 + FEA_MAP(DS_FCLK), 162 165 FEA_MAP(DS_LCLK), 163 166 FEA_MAP(DS_DCEFCLK), 164 167 FEA_MAP(DS_UCLK), ··· 454 451 break; 455 452 case METRICS_CURR_DCEFCLK: 456 453 *value = metrics->CurrClock[PPCLK_DCEFCLK]; 454 + break; 455 + case METRICS_CURR_FCLK: 456 + *value = metrics->CurrClock[PPCLK_FCLK]; 457 457 break; 458 458 case METRICS_AVERAGE_GFXCLK: 459 459 if (metrics->AverageGfxActivity <= SMU_11_0_7_GFX_BUSY_THRESHOLD) ··· 954 948 freq_values[1] = cur_value; 955 949 mark_index = cur_value == freq_values[0] ? 0 : 956 950 cur_value == freq_values[2] ? 2 : 1; 957 - if (mark_index != 1) 958 - freq_values[1] = (freq_values[0] + freq_values[2]) / 2; 959 951 960 - for (i = 0; i < 3; i++) { 952 + count = 3; 953 + if (mark_index != 1) { 954 + count = 2; 955 + freq_values[1] = freq_values[2]; 956 + } 957 + 958 + for (i = 0; i < count; i++) { 961 959 size += sprintf(buf + size, "%d: %uMhz %s\n", i, freq_values[i], 962 - i == mark_index ? "*" : ""); 960 + cur_value == freq_values[i] ? "*" : ""); 963 961 } 964 962 965 963 } 966 964 break; 967 965 case SMU_PCIE: 968 - gen_speed = smu_v11_0_get_current_pcie_link_speed(smu); 969 - lane_width = smu_v11_0_get_current_pcie_link_width(smu); 966 + gen_speed = smu_v11_0_get_current_pcie_link_speed_level(smu); 967 + lane_width = smu_v11_0_get_current_pcie_link_width_level(smu); 970 968 for (i = 0; i < NUM_LINK_LEVELS; i++) 971 969 size += sprintf(buf + size, "%d: %s %s %dMhz %s\n", i, 972 970 (dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 0) ? "2.5GT/s," :
+17 -10
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
··· 431 431 char *buf) 432 432 { 433 433 uint32_t feature_mask[2] = { 0 }; 434 - int32_t feature_index = 0; 434 + int feature_index = 0; 435 435 uint32_t count = 0; 436 - uint32_t sort_feature[SMU_FEATURE_COUNT]; 437 - uint64_t hw_feature_count = 0; 436 + int8_t sort_feature[SMU_FEATURE_COUNT]; 438 437 size_t size = 0; 439 438 int ret = 0, i; 440 439 ··· 446 447 size = sprintf(buf + size, "features high: 0x%08x low: 0x%08x\n", 447 448 feature_mask[1], feature_mask[0]); 448 449 450 + memset(sort_feature, -1, sizeof(sort_feature)); 451 + 449 452 for (i = 0; i < SMU_FEATURE_COUNT; i++) { 450 453 feature_index = smu_cmn_to_asic_specific_index(smu, 451 454 CMN2ASIC_MAPPING_FEATURE, 452 455 i); 453 456 if (feature_index < 0) 454 457 continue; 458 + 455 459 sort_feature[feature_index] = i; 456 - hw_feature_count++; 457 460 } 458 461 459 - for (i = 0; i < hw_feature_count; i++) { 462 + size += sprintf(buf + size, "%-2s. %-20s %-3s : %-s\n", 463 + "No", "Feature", "Bit", "State"); 464 + 465 + for (i = 0; i < SMU_FEATURE_COUNT; i++) { 466 + if (sort_feature[i] < 0) 467 + continue; 468 + 460 469 size += sprintf(buf + size, "%02d. %-20s (%2d) : %s\n", 461 - count++, 462 - smu_get_feature_name(smu, sort_feature[i]), 463 - i, 464 - !!smu_cmn_feature_is_enabled(smu, sort_feature[i]) ? 465 - "enabled" : "disabled"); 470 + count++, 471 + smu_get_feature_name(smu, sort_feature[i]), 472 + i, 473 + !!smu_cmn_feature_is_enabled(smu, sort_feature[i]) ? 474 + "enabled" : "disabled"); 466 475 } 467 476 468 477 return size;
+1
drivers/gpu/drm/i915/Kconfig.debug
··· 153 153 select DRM_EXPORT_FOR_TESTS if m 154 154 select FAULT_INJECTION 155 155 select PRIME_NUMBERS 156 + select CRC32 156 157 help 157 158 Choose this option to allow the driver to perform selftests upon 158 159 loading; also requires the i915.selftest=1 module parameter. To
+8
drivers/gpu/drm/i915/display/intel_display.c
··· 3434 3434 if (IS_ERR(obj)) 3435 3435 return NULL; 3436 3436 3437 + /* 3438 + * Mark it WT ahead of time to avoid changing the 3439 + * cache_level during fbdev initialization. The 3440 + * unbind there would get stuck waiting for rcu. 3441 + */ 3442 + i915_gem_object_set_cache_coherency(obj, HAS_WT(i915) ? 3443 + I915_CACHE_WT : I915_CACHE_NONE); 3444 + 3437 3445 switch (plane_config->tiling) { 3438 3446 case I915_TILING_NONE: 3439 3447 break;
+22 -13
drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
··· 52 52 } 53 53 } 54 54 55 + static bool intel_dp_aux_backlight_dpcd_mode(struct intel_connector *connector) 56 + { 57 + struct intel_dp *intel_dp = intel_attached_dp(connector); 58 + struct drm_i915_private *i915 = dp_to_i915(intel_dp); 59 + u8 mode_reg; 60 + 61 + if (drm_dp_dpcd_readb(&intel_dp->aux, 62 + DP_EDP_BACKLIGHT_MODE_SET_REGISTER, 63 + &mode_reg) != 1) { 64 + drm_dbg_kms(&i915->drm, 65 + "Failed to read the DPCD register 0x%x\n", 66 + DP_EDP_BACKLIGHT_MODE_SET_REGISTER); 67 + return false; 68 + } 69 + 70 + return (mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) == 71 + DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD; 72 + } 73 + 55 74 /* 56 75 * Read the current backlight value from DPCD register(s) based 57 76 * on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported ··· 80 61 struct intel_dp *intel_dp = intel_attached_dp(connector); 81 62 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 82 63 u8 read_val[2] = { 0x0 }; 83 - u8 mode_reg; 84 64 u16 level = 0; 85 - 86 - if (drm_dp_dpcd_readb(&intel_dp->aux, 87 - DP_EDP_BACKLIGHT_MODE_SET_REGISTER, 88 - &mode_reg) != 1) { 89 - drm_dbg_kms(&i915->drm, 90 - "Failed to read the DPCD register 0x%x\n", 91 - DP_EDP_BACKLIGHT_MODE_SET_REGISTER); 92 - return 0; 93 - } 94 65 95 66 /* 96 67 * If we're not in DPCD control mode yet, the programmed brightness 97 68 * value is meaningless and we should assume max brightness 98 69 */ 99 - if ((mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) != 100 - DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD) 70 + if (!intel_dp_aux_backlight_dpcd_mode(connector)) 101 71 return connector->panel.backlight.max; 102 72 103 73 if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, ··· 327 319 328 320 panel->backlight.min = 0; 329 321 panel->backlight.level = intel_dp_aux_get_backlight(connector); 330 - panel->backlight.enabled = panel->backlight.level != 0; 322 + panel->backlight.enabled = intel_dp_aux_backlight_dpcd_mode(connector) && 323 + panel->backlight.level != 0; 331 324 332 325 return 0; 333 326 }
+8 -2
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
··· 287 287 u64 invalid_flags; /** Set of execobj.flags that are invalid */ 288 288 u32 context_flags; /** Set of execobj.flags to insert from the ctx */ 289 289 290 + u64 batch_len; /** Length of batch within object */ 290 291 u32 batch_start_offset; /** Location within object of batch */ 291 - u32 batch_len; /** Length of batch within object */ 292 292 u32 batch_flags; /** Flags composed for emit_bb_start() */ 293 293 struct intel_gt_buffer_pool_node *batch_pool; /** pool node for batch buffer */ 294 294 ··· 871 871 872 872 if (eb->batch_len == 0) 873 873 eb->batch_len = eb->batch->vma->size - eb->batch_start_offset; 874 + if (unlikely(eb->batch_len == 0)) { /* impossible! */ 875 + drm_dbg(&i915->drm, "Invalid batch length\n"); 876 + return -EINVAL; 877 + } 874 878 875 879 return 0; 876 880 ··· 2428 2424 struct drm_i915_private *i915 = eb->i915; 2429 2425 struct intel_gt_buffer_pool_node *pool = eb->batch_pool; 2430 2426 struct i915_vma *shadow, *trampoline, *batch; 2431 - unsigned int len; 2427 + unsigned long len; 2432 2428 int err; 2433 2429 2434 2430 if (!eb_use_cmdparser(eb)) { ··· 2453 2449 } else { 2454 2450 len += I915_CMD_PARSER_TRAMPOLINE_SIZE; 2455 2451 } 2452 + if (unlikely(len < eb->batch_len)) /* last paranoid check of overflow */ 2453 + return -EINVAL; 2456 2454 2457 2455 if (!pool) { 2458 2456 pool = intel_gt_get_buffer_pool(eb->engine->gt, len);
+4 -2
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
··· 53 53 struct drm_mm_node *node, u64 size, 54 54 unsigned alignment) 55 55 { 56 - return i915_gem_stolen_insert_node_in_range(i915, node, size, 57 - alignment, 0, U64_MAX); 56 + return i915_gem_stolen_insert_node_in_range(i915, node, 57 + size, alignment, 58 + I915_GEM_STOLEN_BIAS, 59 + U64_MAX); 58 60 } 59 61 60 62 void i915_gem_stolen_remove_node(struct drm_i915_private *i915,
+2
drivers/gpu/drm/i915/gem/i915_gem_stolen.h
··· 30 30 resource_size_t stolen_offset, 31 31 resource_size_t size); 32 32 33 + #define I915_GEM_STOLEN_BIAS SZ_128K 34 + 33 35 #endif /* __I915_GEM_STOLEN_H__ */
+12 -6
drivers/gpu/drm/i915/gt/gen6_ppgtt.c
··· 239 239 I915_CACHE_NONE, PTE_READ_ONLY); 240 240 241 241 vm->scratch[1] = vm->alloc_pt_dma(vm, I915_GTT_PAGE_SIZE_4K); 242 - if (IS_ERR(vm->scratch[1])) 243 - return PTR_ERR(vm->scratch[1]); 242 + if (IS_ERR(vm->scratch[1])) { 243 + ret = PTR_ERR(vm->scratch[1]); 244 + goto err_scratch0; 245 + } 244 246 245 247 ret = pin_pt_dma(vm, vm->scratch[1]); 246 - if (ret) { 247 - i915_gem_object_put(vm->scratch[1]); 248 - return ret; 249 - } 248 + if (ret) 249 + goto err_scratch1; 250 250 251 251 fill32_px(vm->scratch[1], vm->scratch[0]->encode); 252 252 253 253 return 0; 254 + 255 + err_scratch1: 256 + i915_gem_object_put(vm->scratch[1]); 257 + err_scratch0: 258 + i915_gem_object_put(vm->scratch[0]); 259 + return ret; 254 260 } 255 261 256 262 static void gen6_ppgtt_free_pd(struct gen6_ppgtt *ppgtt)
+2 -1
drivers/gpu/drm/i915/gt/gen8_ppgtt.c
··· 604 604 return 0; 605 605 606 606 free_scratch: 607 - free_scratch(vm); 607 + while (i--) 608 + i915_gem_object_put(vm->scratch[i]); 608 609 return -ENOMEM; 609 610 } 610 611
+1 -1
drivers/gpu/drm/i915/gt/intel_engine_types.h
··· 278 278 * 279 279 * Note these register may be either mmio or HWSP shadow. 280 280 */ 281 - u32 *csb_status; 281 + u64 *csb_status; 282 282 283 283 /** 284 284 * @csb_size: context status buffer FIFO size
+36 -20
drivers/gpu/drm/i915/gt/intel_lrc.c
··· 1140 1140 1141 1141 /* Check in case we rollback so far we wrap [size/2] */ 1142 1142 if (intel_ring_direction(rq->ring, 1143 - intel_ring_wrap(rq->ring, 1144 - rq->tail), 1145 - rq->ring->tail) > 0) 1143 + rq->tail, 1144 + rq->ring->tail + 8) > 0) 1146 1145 rq->context->lrc.desc |= CTX_DESC_FORCE_RESTORE; 1147 1146 1148 1147 active = rq; ··· 2463 2464 } 2464 2465 2465 2466 static inline void 2466 - invalidate_csb_entries(const u32 *first, const u32 *last) 2467 + invalidate_csb_entries(const u64 *first, const u64 *last) 2467 2468 { 2468 2469 clflush((void *)first); 2469 2470 clflush((void *)last); ··· 2495 2496 * bits 47-57: sw context id of the lrc the GT switched away from 2496 2497 * bits 58-63: sw counter of the lrc the GT switched away from 2497 2498 */ 2498 - static inline bool 2499 - gen12_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb) 2499 + static inline bool gen12_csb_parse(const u64 *csb) 2500 2500 { 2501 - u32 lower_dw = csb[0]; 2502 - u32 upper_dw = csb[1]; 2503 - bool ctx_to_valid = GEN12_CSB_CTX_VALID(lower_dw); 2504 - bool ctx_away_valid = GEN12_CSB_CTX_VALID(upper_dw); 2505 - bool new_queue = lower_dw & GEN12_CTX_STATUS_SWITCHED_TO_NEW_QUEUE; 2501 + bool ctx_away_valid; 2502 + bool new_queue; 2503 + u64 entry; 2504 + 2505 + /* HSD#22011248461 */ 2506 + entry = READ_ONCE(*csb); 2507 + if (unlikely(entry == -1)) { 2508 + preempt_disable(); 2509 + if (wait_for_atomic_us((entry = READ_ONCE(*csb)) != -1, 50)) 2510 + GEM_WARN_ON("50us CSB timeout"); 2511 + preempt_enable(); 2512 + } 2513 + WRITE_ONCE(*(u64 *)csb, -1); 2514 + 2515 + ctx_away_valid = GEN12_CSB_CTX_VALID(upper_32_bits(entry)); 2516 + new_queue = 2517 + lower_32_bits(entry) & GEN12_CTX_STATUS_SWITCHED_TO_NEW_QUEUE; 2506 2518 2507 2519 /* 2508 2520 * The context switch detail is not guaranteed to be 5 when a preemption ··· 2523 2513 * would require some extra handling, but we don't support that. 2524 2514 */ 2525 2515 if (!ctx_away_valid || new_queue) { 2526 - GEM_BUG_ON(!ctx_to_valid); 2516 + GEM_BUG_ON(!GEN12_CSB_CTX_VALID(lower_32_bits(entry))); 2527 2517 return true; 2528 2518 } 2529 2519 ··· 2532 2522 * context switch on an unsuccessful wait instruction since we always 2533 2523 * use polling mode. 2534 2524 */ 2535 - GEM_BUG_ON(GEN12_CTX_SWITCH_DETAIL(upper_dw)); 2525 + GEM_BUG_ON(GEN12_CTX_SWITCH_DETAIL(upper_32_bits(entry))); 2536 2526 return false; 2537 2527 } 2538 2528 2539 - static inline bool 2540 - gen8_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb) 2529 + static inline bool gen8_csb_parse(const u64 *csb) 2541 2530 { 2542 2531 return *csb & (GEN8_CTX_STATUS_IDLE_ACTIVE | GEN8_CTX_STATUS_PREEMPTED); 2543 2532 } ··· 2544 2535 static void process_csb(struct intel_engine_cs *engine) 2545 2536 { 2546 2537 struct intel_engine_execlists * const execlists = &engine->execlists; 2547 - const u32 * const buf = execlists->csb_status; 2538 + const u64 * const buf = execlists->csb_status; 2548 2539 const u8 num_entries = execlists->csb_size; 2549 2540 u8 head, tail; 2550 2541 ··· 2625 2616 */ 2626 2617 2627 2618 ENGINE_TRACE(engine, "csb[%d]: status=0x%08x:0x%08x\n", 2628 - head, buf[2 * head + 0], buf[2 * head + 1]); 2619 + head, 2620 + upper_32_bits(buf[head]), 2621 + lower_32_bits(buf[head])); 2629 2622 2630 2623 if (INTEL_GEN(engine->i915) >= 12) 2631 - promote = gen12_csb_parse(execlists, buf + 2 * head); 2624 + promote = gen12_csb_parse(buf + head); 2632 2625 else 2633 - promote = gen8_csb_parse(execlists, buf + 2 * head); 2626 + promote = gen8_csb_parse(buf + head); 2634 2627 if (promote) { 2635 2628 struct i915_request * const *old = execlists->active; 2636 2629 ··· 2659 2648 execlists_num_ports(execlists)); 2660 2649 smp_wmb(); /* complete the seqlock */ 2661 2650 WRITE_ONCE(execlists->active, execlists->inflight); 2651 + 2652 + /* XXX Magic delay for tgl */ 2653 + ENGINE_POSTING_READ(engine, RING_CONTEXT_STATUS_PTR); 2662 2654 2663 2655 WRITE_ONCE(execlists->pending[0], NULL); 2664 2656 } else { ··· 4019 4005 WRITE_ONCE(*execlists->csb_write, reset_value); 4020 4006 wmb(); /* Make sure this is visible to HW (paranoia?) */ 4021 4007 4008 + /* Check that the GPU does indeed update the CSB entries! */ 4009 + memset(execlists->csb_status, -1, (reset_value + 1) * sizeof(u64)); 4022 4010 invalidate_csb_entries(&execlists->csb_status[0], 4023 4011 &execlists->csb_status[reset_value]); 4024 4012 ··· 5173 5157 } 5174 5158 5175 5159 execlists->csb_status = 5176 - &engine->status_page.addr[I915_HWS_CSB_BUF0_INDEX]; 5160 + (u64 *)&engine->status_page.addr[I915_HWS_CSB_BUF0_INDEX]; 5177 5161 5178 5162 execlists->csb_write = 5179 5163 &engine->status_page.addr[intel_hws_csb_write_index(i915)];
+11 -5
drivers/gpu/drm/i915/gt/intel_mocs.c
··· 234 234 L3_1_UC) 235 235 236 236 static const struct drm_i915_mocs_entry tgl_mocs_table[] = { 237 - /* Base - Error (Reserved for Non-Use) */ 238 - MOCS_ENTRY(0, 0x0, 0x0), 239 - /* Base - Reserved */ 240 - MOCS_ENTRY(1, 0x0, 0x0), 241 - 237 + /* 238 + * NOTE: 239 + * Reserved and unspecified MOCS indices have been set to (L3 + LCC). 240 + * These reserved entries should never be used, they may be changed 241 + * to low performant variants with better coherency in the future if 242 + * more entries are needed. We are programming index I915_MOCS_PTE(1) 243 + * only, __init_mocs_table() take care to program unused index with 244 + * this entry. 245 + */ 246 + MOCS_ENTRY(1, LE_3_WB | LE_TC_1_LLC | LE_LRUM(3), 247 + L3_3_WB), 242 248 GEN11_MOCS_ENTRIES, 243 249 244 250 /* Implicitly enable L1 - HDC:L1 + L3 + LLC */
+196
drivers/gpu/drm/i915/gt/selftest_reset.c
··· 3 3 * Copyright © 2018 Intel Corporation 4 4 */ 5 5 6 + #include <linux/crc32.h> 7 + 8 + #include "gem/i915_gem_stolen.h" 9 + 10 + #include "i915_memcpy.h" 6 11 #include "i915_selftest.h" 7 12 #include "selftests/igt_reset.h" 8 13 #include "selftests/igt_atomic.h" 14 + #include "selftests/igt_spinner.h" 15 + 16 + static int 17 + __igt_reset_stolen(struct intel_gt *gt, 18 + intel_engine_mask_t mask, 19 + const char *msg) 20 + { 21 + struct i915_ggtt *ggtt = &gt->i915->ggtt; 22 + const struct resource *dsm = &gt->i915->dsm; 23 + resource_size_t num_pages, page; 24 + struct intel_engine_cs *engine; 25 + intel_wakeref_t wakeref; 26 + enum intel_engine_id id; 27 + struct igt_spinner spin; 28 + long max, count; 29 + void *tmp; 30 + u32 *crc; 31 + int err; 32 + 33 + if (!drm_mm_node_allocated(&ggtt->error_capture)) 34 + return 0; 35 + 36 + num_pages = resource_size(dsm) >> PAGE_SHIFT; 37 + if (!num_pages) 38 + return 0; 39 + 40 + crc = kmalloc_array(num_pages, sizeof(u32), GFP_KERNEL); 41 + if (!crc) 42 + return -ENOMEM; 43 + 44 + tmp = kmalloc(PAGE_SIZE, GFP_KERNEL); 45 + if (!tmp) { 46 + err = -ENOMEM; 47 + goto err_crc; 48 + } 49 + 50 + igt_global_reset_lock(gt); 51 + wakeref = intel_runtime_pm_get(gt->uncore->rpm); 52 + 53 + err = igt_spinner_init(&spin, gt); 54 + if (err) 55 + goto err_lock; 56 + 57 + for_each_engine(engine, gt, id) { 58 + struct intel_context *ce; 59 + struct i915_request *rq; 60 + 61 + if (!(mask & engine->mask)) 62 + continue; 63 + 64 + if (!intel_engine_can_store_dword(engine)) 65 + continue; 66 + 67 + ce = intel_context_create(engine); 68 + if (IS_ERR(ce)) { 69 + err = PTR_ERR(ce); 70 + goto err_spin; 71 + } 72 + rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK); 73 + intel_context_put(ce); 74 + if (IS_ERR(rq)) { 75 + err = PTR_ERR(rq); 76 + goto err_spin; 77 + } 78 + i915_request_add(rq); 79 + } 80 + 81 + for (page = 0; page < num_pages; page++) { 82 + dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT); 83 + void __iomem *s; 84 + void *in; 85 + 86 + ggtt->vm.insert_page(&ggtt->vm, dma, 87 + ggtt->error_capture.start, 88 + I915_CACHE_NONE, 0); 89 + mb(); 90 + 91 + s = io_mapping_map_wc(&ggtt->iomap, 92 + ggtt->error_capture.start, 93 + PAGE_SIZE); 94 + 95 + if (!__drm_mm_interval_first(&gt->i915->mm.stolen, 96 + page << PAGE_SHIFT, 97 + ((page + 1) << PAGE_SHIFT) - 1)) 98 + memset32(s, STACK_MAGIC, PAGE_SIZE / sizeof(u32)); 99 + 100 + in = s; 101 + if (i915_memcpy_from_wc(tmp, s, PAGE_SIZE)) 102 + in = tmp; 103 + crc[page] = crc32_le(0, in, PAGE_SIZE); 104 + 105 + io_mapping_unmap(s); 106 + } 107 + mb(); 108 + ggtt->vm.clear_range(&ggtt->vm, ggtt->error_capture.start, PAGE_SIZE); 109 + 110 + if (mask == ALL_ENGINES) { 111 + intel_gt_reset(gt, mask, NULL); 112 + } else { 113 + for_each_engine(engine, gt, id) { 114 + if (mask & engine->mask) 115 + intel_engine_reset(engine, NULL); 116 + } 117 + } 118 + 119 + max = -1; 120 + count = 0; 121 + for (page = 0; page < num_pages; page++) { 122 + dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT); 123 + void __iomem *s; 124 + void *in; 125 + u32 x; 126 + 127 + ggtt->vm.insert_page(&ggtt->vm, dma, 128 + ggtt->error_capture.start, 129 + I915_CACHE_NONE, 0); 130 + mb(); 131 + 132 + s = io_mapping_map_wc(&ggtt->iomap, 133 + ggtt->error_capture.start, 134 + PAGE_SIZE); 135 + 136 + in = s; 137 + if (i915_memcpy_from_wc(tmp, s, PAGE_SIZE)) 138 + in = tmp; 139 + x = crc32_le(0, in, PAGE_SIZE); 140 + 141 + if (x != crc[page] && 142 + !__drm_mm_interval_first(&gt->i915->mm.stolen, 143 + page << PAGE_SHIFT, 144 + ((page + 1) << PAGE_SHIFT) - 1)) { 145 + pr_debug("unused stolen page %pa modified by GPU reset\n", 146 + &page); 147 + if (count++ == 0) 148 + igt_hexdump(in, PAGE_SIZE); 149 + max = page; 150 + } 151 + 152 + io_mapping_unmap(s); 153 + } 154 + mb(); 155 + ggtt->vm.clear_range(&ggtt->vm, ggtt->error_capture.start, PAGE_SIZE); 156 + 157 + if (count > 0) { 158 + pr_info("%s reset clobbered %ld pages of stolen, last clobber at page %ld\n", 159 + msg, count, max); 160 + } 161 + if (max >= I915_GEM_STOLEN_BIAS >> PAGE_SHIFT) { 162 + pr_err("%s reset clobbered unreserved area [above %x] of stolen; may cause severe faults\n", 163 + msg, I915_GEM_STOLEN_BIAS); 164 + err = -EINVAL; 165 + } 166 + 167 + err_spin: 168 + igt_spinner_fini(&spin); 169 + 170 + err_lock: 171 + intel_runtime_pm_put(gt->uncore->rpm, wakeref); 172 + igt_global_reset_unlock(gt); 173 + 174 + kfree(tmp); 175 + err_crc: 176 + kfree(crc); 177 + return err; 178 + } 179 + 180 + static int igt_reset_device_stolen(void *arg) 181 + { 182 + return __igt_reset_stolen(arg, ALL_ENGINES, "device"); 183 + } 184 + 185 + static int igt_reset_engines_stolen(void *arg) 186 + { 187 + struct intel_gt *gt = arg; 188 + struct intel_engine_cs *engine; 189 + enum intel_engine_id id; 190 + int err; 191 + 192 + if (!intel_has_reset_engine(gt)) 193 + return 0; 194 + 195 + for_each_engine(engine, gt, id) { 196 + err = __igt_reset_stolen(gt, engine->mask, engine->name); 197 + if (err) 198 + return err; 199 + } 200 + 201 + return 0; 202 + } 9 203 10 204 static int igt_global_reset(void *arg) 11 205 { ··· 358 164 { 359 165 static const struct i915_subtest tests[] = { 360 166 SUBTEST(igt_global_reset), /* attempt to recover GPU first */ 167 + SUBTEST(igt_reset_device_stolen), 168 + SUBTEST(igt_reset_engines_stolen), 361 169 SUBTEST(igt_wedged_reset), 362 170 SUBTEST(igt_atomic_reset), 363 171 SUBTEST(igt_atomic_engine_reset),
+5 -1
drivers/gpu/drm/i915/i915_drv.h
··· 33 33 #include <uapi/drm/i915_drm.h> 34 34 #include <uapi/drm/drm_fourcc.h> 35 35 36 + #include <asm/hypervisor.h> 37 + 36 38 #include <linux/io-mapping.h> 37 39 #include <linux/i2c.h> 38 40 #include <linux/i2c-algo-bit.h> ··· 1762 1760 if (intel_iommu_gfx_mapped) 1763 1761 return true; 1764 1762 #endif 1765 - return false; 1763 + 1764 + /* Running as a guest, we assume the host is enforcing VT'd */ 1765 + return !hypervisor_is_type(X86_HYPER_NATIVE); 1766 1766 } 1767 1767 1768 1768 static inline bool intel_scanout_needs_vtd_wa(struct drm_i915_private *dev_priv)
+1 -2
drivers/gpu/drm/i915/i915_gpu_error.c
··· 1312 1312 } 1313 1313 1314 1314 strcpy(c->name, name); 1315 - c->vma = i915_vma_get(vma); 1315 + c->vma = vma; /* reference held while active */ 1316 1316 1317 1317 c->next = next; 1318 1318 return c; ··· 1402 1402 compress)); 1403 1403 1404 1404 i915_active_release(&vma->active); 1405 - i915_vma_put(vma); 1406 1405 1407 1406 capture = this->next; 1408 1407 kfree(this);
+26 -1
drivers/gpu/drm/i915/intel_uncore.c
··· 1209 1209 spin_unlock(&uncore->debug->lock); 1210 1210 } 1211 1211 1212 + #define __vgpu_read(x) \ 1213 + static u##x \ 1214 + vgpu_read##x(struct intel_uncore *uncore, i915_reg_t reg, bool trace) { \ 1215 + u##x val = __raw_uncore_read##x(uncore, reg); \ 1216 + trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ 1217 + return val; \ 1218 + } 1219 + __vgpu_read(8) 1220 + __vgpu_read(16) 1221 + __vgpu_read(32) 1222 + __vgpu_read(64) 1223 + 1212 1224 #define GEN2_READ_HEADER(x) \ 1213 1225 u##x val = 0; \ 1214 1226 assert_rpm_wakelock_held(uncore->rpm); ··· 1425 1413 #undef __gen_reg_write_funcs 1426 1414 #undef GEN6_WRITE_FOOTER 1427 1415 #undef GEN6_WRITE_HEADER 1416 + 1417 + #define __vgpu_write(x) \ 1418 + static void \ 1419 + vgpu_write##x(struct intel_uncore *uncore, i915_reg_t reg, u##x val, bool trace) { \ 1420 + trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ 1421 + __raw_uncore_write##x(uncore, reg, val); \ 1422 + } 1423 + __vgpu_write(8) 1424 + __vgpu_write(16) 1425 + __vgpu_write(32) 1428 1426 1429 1427 #define ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, x) \ 1430 1428 do { \ ··· 1757 1735 { 1758 1736 GEM_BUG_ON(intel_uncore_has_forcewake(uncore)); 1759 1737 1760 - if (IS_GEN(uncore->i915, 5)) { 1738 + if (intel_vgpu_active(uncore->i915)) { 1739 + ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, vgpu); 1740 + ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, vgpu); 1741 + } else if (IS_GEN(uncore->i915, 5)) { 1761 1742 ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, gen5); 1762 1743 ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, gen5); 1763 1744 } else {
+1 -1
drivers/gpu/drm/ttm/ttm_bo.c
··· 647 647 /* Don't evict this BO if it's outside of the 648 648 * requested placement range 649 649 */ 650 - if (place->fpfn >= (bo->mem.start + bo->mem.size) || 650 + if (place->fpfn >= (bo->mem.start + bo->mem.num_pages) || 651 651 (place->lpfn && place->lpfn <= bo->mem.start)) 652 652 return false; 653 653
+4 -4
lib/fonts/font_6x8.c
··· 3 3 4 4 #define FONTDATAMAX 2048 5 5 6 - static const unsigned char fontdata_6x8[FONTDATAMAX] = { 7 - 6 + static struct font_data fontdata_6x8 = { 7 + { 0, 0, FONTDATAMAX, 0 }, { 8 8 /* 0 0x00 '^@' */ 9 9 0x00, /* 000000 */ 10 10 0x00, /* 000000 */ ··· 2564 2564 0x00, /* 000000 */ 2565 2565 0x00, /* 000000 */ 2566 2566 0x00, /* 000000 */ 2567 - }; 2567 + } }; 2568 2568 2569 2569 const struct font_desc font_6x8 = { 2570 2570 .idx = FONT6x8_IDX, 2571 2571 .name = "6x8", 2572 2572 .width = 6, 2573 2573 .height = 8, 2574 - .data = fontdata_6x8, 2574 + .data = fontdata_6x8.data, 2575 2575 .pref = 0, 2576 2576 };