mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
drm fixes (round two) for 5.10-rc1
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) -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJfkhyvAAoJEAx081l5xIa+3qIQAKjvgIvuoLix+bl/gkOHwymv QHTXVA3Gi4Rup778L3k1GNppQX4/LE42Of9wnsZIELxG0vxKl59JGzlWJVld/rtJ ZXfoT5kh7Hh7kkiXnC2s11aqQSsgr25lfsY8gOWSPIGfwOn07JSMTkqPWlbwrOz2 il6qlOlgfSNfXwn2NxSTzGxZMrgOyUvKNZczRXU9gSuuoTsEo4bAvS7/vEN4hazX DFQAZfd82PfcdAIkVzk/gOoaCQ6a9YgjOzg1RQ4gKhrj8UaWu4gUyJwWPjSMnLrh uP2RM3gU54MhVF3jHt+D0Trv2ti2zStD9wc4AEJwOVQZtcDSsgGduOdUs5Xc/1l5 dBOvpumBmNxsYbVvvThijNeSx6Y5ybzI3iUp8SLDftiRZtwsXds2aRaskuVgMqj4 MSBdOiZqoJudLjwCBHWKe328+r00X+f14Vi30Y0cy4VW59NxLG5D7qjc5BGqJw1q J3FQ/9uDh0lWbeKT/grapjP43IWcLApykZa3Rn6p2w0mW2+8Wht/WbrFYyNYGlzf aNS9RnknTaMYWpvZUZLVG83dJpn6Y9ooHa9L/blMzfCxpF6ftEYf+Iq2x8s0gprz tIq0xsGvBacsnQIOWRuHjuF87zibVbDp9ba+x78F/woyUqEhip+lBXaPofp132gQ HtIdQewvG9KcLZcoluO4 =rAUM -----END PGP SIGNATURE----- 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. ...
This commit is contained in:
commit
fc03b2d6a9
@ -81,7 +81,7 @@ C. Boot options
|
||||
1. fbcon=font:<name>
|
||||
|
||||
Select the initial font to use. The value 'name' can be any of the
|
||||
compiled-in fonts: 10x18, 6x10, 7x14, Acorn8x8, MINI4x6,
|
||||
compiled-in fonts: 10x18, 6x10, 6x8, 7x14, Acorn8x8, MINI4x6,
|
||||
PEARL8x8, ProFont6x11, SUN12x22, SUN8x16, TER16x32, VGA8x16, VGA8x8.
|
||||
|
||||
Note, not all drivers can handle font with widths not divisible by 8,
|
||||
|
@ -4625,7 +4625,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
retry: /* Rest of adevs pre asic reset from XGMI hive. */
|
||||
list_for_each_entry(tmp_adev, device_list_handle, gmc.xgmi.head) {
|
||||
r = amdgpu_device_pre_asic_reset(tmp_adev,
|
||||
NULL,
|
||||
(tmp_adev == adev) ? job : NULL,
|
||||
&need_full_reset);
|
||||
/*TODO Should we stop ?*/
|
||||
if (r) {
|
||||
|
@ -208,7 +208,8 @@ static int psp_sw_fini(void *handle)
|
||||
adev->psp.ta_fw = NULL;
|
||||
}
|
||||
|
||||
if (adev->asic_type == CHIP_NAVI10)
|
||||
if (adev->asic_type == CHIP_NAVI10 ||
|
||||
adev->asic_type == CHIP_SIENNA_CICHLID)
|
||||
psp_sysfs_fini(adev);
|
||||
|
||||
return 0;
|
||||
@ -1750,6 +1751,12 @@ static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
|
||||
case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
|
||||
*type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
|
||||
break;
|
||||
case AMDGPU_UCODE_ID_RLC_IRAM:
|
||||
*type = GFX_FW_TYPE_RLC_IRAM;
|
||||
break;
|
||||
case AMDGPU_UCODE_ID_RLC_DRAM:
|
||||
*type = GFX_FW_TYPE_RLC_DRAM_BOOT;
|
||||
break;
|
||||
case AMDGPU_UCODE_ID_SMC:
|
||||
*type = GFX_FW_TYPE_SMU;
|
||||
break;
|
||||
|
@ -1986,7 +1986,8 @@ static int amdgpu_ras_check_asic_type(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->asic_type != CHIP_VEGA10 &&
|
||||
adev->asic_type != CHIP_VEGA20 &&
|
||||
adev->asic_type != CHIP_ARCTURUS)
|
||||
adev->asic_type != CHIP_ARCTURUS &&
|
||||
adev->asic_type != CHIP_SIENNA_CICHLID)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
@ -2030,7 +2031,6 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev,
|
||||
|
||||
*supported = amdgpu_ras_enable == 0 ?
|
||||
0 : *hw_supported & amdgpu_ras_mask;
|
||||
|
||||
adev->ras_features = *supported;
|
||||
}
|
||||
|
||||
|
@ -168,12 +168,16 @@ struct amdgpu_rlc {
|
||||
u32 save_restore_list_cntl_size_bytes;
|
||||
u32 save_restore_list_gpm_size_bytes;
|
||||
u32 save_restore_list_srm_size_bytes;
|
||||
u32 rlc_iram_ucode_size_bytes;
|
||||
u32 rlc_dram_ucode_size_bytes;
|
||||
|
||||
u32 *register_list_format;
|
||||
u32 *register_restore;
|
||||
u8 *save_restore_list_cntl;
|
||||
u8 *save_restore_list_gpm;
|
||||
u8 *save_restore_list_srm;
|
||||
u8 *rlc_iram_ucode;
|
||||
u8 *rlc_dram_ucode;
|
||||
|
||||
bool is_rlc_v2_1;
|
||||
|
||||
|
@ -500,6 +500,8 @@ static int amdgpu_ucode_init_single_fw(struct amdgpu_device *adev,
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_RLC_IRAM &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_RLC_DRAM &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_DMCU_ERAM &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_DMCU_INTV &&
|
||||
ucode->ucode_id != AMDGPU_UCODE_ID_DMCUB)) {
|
||||
@ -556,6 +558,14 @@ static int amdgpu_ucode_init_single_fw(struct amdgpu_device *adev,
|
||||
ucode->ucode_size = adev->gfx.rlc.save_restore_list_srm_size_bytes;
|
||||
memcpy(ucode->kaddr, adev->gfx.rlc.save_restore_list_srm,
|
||||
ucode->ucode_size);
|
||||
} else if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_IRAM) {
|
||||
ucode->ucode_size = adev->gfx.rlc.rlc_iram_ucode_size_bytes;
|
||||
memcpy(ucode->kaddr, adev->gfx.rlc.rlc_iram_ucode,
|
||||
ucode->ucode_size);
|
||||
} else if (ucode->ucode_id == AMDGPU_UCODE_ID_RLC_DRAM) {
|
||||
ucode->ucode_size = adev->gfx.rlc.rlc_dram_ucode_size_bytes;
|
||||
memcpy(ucode->kaddr, adev->gfx.rlc.rlc_dram_ucode,
|
||||
ucode->ucode_size);
|
||||
} else if (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MES) {
|
||||
ucode->ucode_size = le32_to_cpu(mes_hdr->mes_ucode_size_bytes);
|
||||
memcpy(ucode->kaddr, (void *)((uint8_t *)adev->mes.fw->data +
|
||||
|
@ -222,6 +222,15 @@ struct rlc_firmware_header_v2_1 {
|
||||
uint32_t save_restore_list_srm_offset_bytes;
|
||||
};
|
||||
|
||||
/* version_major=2, version_minor=1 */
|
||||
struct rlc_firmware_header_v2_2 {
|
||||
struct rlc_firmware_header_v2_1 v2_1;
|
||||
uint32_t rlc_iram_ucode_size_bytes;
|
||||
uint32_t rlc_iram_ucode_offset_bytes;
|
||||
uint32_t rlc_dram_ucode_size_bytes;
|
||||
uint32_t rlc_dram_ucode_offset_bytes;
|
||||
};
|
||||
|
||||
/* version_major=1, version_minor=0 */
|
||||
struct sdma_firmware_header_v1_0 {
|
||||
struct common_firmware_header header;
|
||||
@ -339,6 +348,8 @@ enum AMDGPU_UCODE_ID {
|
||||
AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL,
|
||||
AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM,
|
||||
AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM,
|
||||
AMDGPU_UCODE_ID_RLC_IRAM,
|
||||
AMDGPU_UCODE_ID_RLC_DRAM,
|
||||
AMDGPU_UCODE_ID_RLC_G,
|
||||
AMDGPU_UCODE_ID_STORAGE,
|
||||
AMDGPU_UCODE_ID_SMC,
|
||||
|
@ -112,6 +112,22 @@
|
||||
#define mmCP_HYP_ME_UCODE_DATA 0x5817
|
||||
#define mmCP_HYP_ME_UCODE_DATA_BASE_IDX 1
|
||||
|
||||
//CC_GC_SA_UNIT_DISABLE
|
||||
#define mmCC_GC_SA_UNIT_DISABLE 0x0fe9
|
||||
#define mmCC_GC_SA_UNIT_DISABLE_BASE_IDX 0
|
||||
#define CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8
|
||||
#define CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L
|
||||
//GC_USER_SA_UNIT_DISABLE
|
||||
#define mmGC_USER_SA_UNIT_DISABLE 0x0fea
|
||||
#define mmGC_USER_SA_UNIT_DISABLE_BASE_IDX 0
|
||||
#define GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8
|
||||
#define GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L
|
||||
//PA_SC_ENHANCE_3
|
||||
#define mmPA_SC_ENHANCE_3 0x1085
|
||||
#define mmPA_SC_ENHANCE_3_BASE_IDX 0
|
||||
#define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO__SHIFT 0x3
|
||||
#define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO_MASK 0x00000008L
|
||||
|
||||
MODULE_FIRMWARE("amdgpu/navi10_ce.bin");
|
||||
MODULE_FIRMWARE("amdgpu/navi10_pfp.bin");
|
||||
MODULE_FIRMWARE("amdgpu/navi10_me.bin");
|
||||
@ -3091,6 +3107,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3[] =
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_ADDR_MATCH_MASK, 0xffffffff, 0xffffffcf),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CM_CTRL1, 0xff8fff0f, 0x580f1008),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CTRL3, 0xf7ffffff, 0x10f80988),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x00000020, 0x00000020),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_CL_ENHANCE, 0xf17fffff, 0x01200007),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_TIMEOUT_COUNTER, 0xffffffff, 0x00000800),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000820),
|
||||
@ -3188,6 +3205,8 @@ static int gfx_v10_0_wait_for_rlc_autoload_complete(struct amdgpu_device *adev);
|
||||
static void gfx_v10_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume);
|
||||
static void gfx_v10_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume);
|
||||
static void gfx_v10_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, bool secure);
|
||||
static u32 gfx_v10_3_get_disabled_sa(struct amdgpu_device *adev);
|
||||
static void gfx_v10_3_program_pbb_mode(struct amdgpu_device *adev);
|
||||
|
||||
static void gfx10_kiq_set_resources(struct amdgpu_ring *kiq_ring, uint64_t queue_mask)
|
||||
{
|
||||
@ -3586,6 +3605,17 @@ static void gfx_v10_0_init_rlc_ext_microcode(struct amdgpu_device *adev)
|
||||
le32_to_cpu(rlc_hdr->reg_list_format_direct_reg_list_length);
|
||||
}
|
||||
|
||||
static void gfx_v10_0_init_rlc_iram_dram_microcode(struct amdgpu_device *adev)
|
||||
{
|
||||
const struct rlc_firmware_header_v2_2 *rlc_hdr;
|
||||
|
||||
rlc_hdr = (const struct rlc_firmware_header_v2_2 *)adev->gfx.rlc_fw->data;
|
||||
adev->gfx.rlc.rlc_iram_ucode_size_bytes = le32_to_cpu(rlc_hdr->rlc_iram_ucode_size_bytes);
|
||||
adev->gfx.rlc.rlc_iram_ucode = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->rlc_iram_ucode_offset_bytes);
|
||||
adev->gfx.rlc.rlc_dram_ucode_size_bytes = le32_to_cpu(rlc_hdr->rlc_dram_ucode_size_bytes);
|
||||
adev->gfx.rlc.rlc_dram_ucode = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->rlc_dram_ucode_offset_bytes);
|
||||
}
|
||||
|
||||
static bool gfx_v10_0_navi10_gfxoff_should_enable(struct amdgpu_device *adev)
|
||||
{
|
||||
bool ret = false;
|
||||
@ -3701,8 +3731,6 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
|
||||
version_major = le16_to_cpu(rlc_hdr->header.header_version_major);
|
||||
version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor);
|
||||
if (version_major == 2 && version_minor == 1)
|
||||
adev->gfx.rlc.is_rlc_v2_1 = true;
|
||||
|
||||
adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version);
|
||||
adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version);
|
||||
@ -3744,8 +3772,12 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++)
|
||||
adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
|
||||
|
||||
if (adev->gfx.rlc.is_rlc_v2_1)
|
||||
gfx_v10_0_init_rlc_ext_microcode(adev);
|
||||
if (version_major == 2) {
|
||||
if (version_minor >= 1)
|
||||
gfx_v10_0_init_rlc_ext_microcode(adev);
|
||||
if (version_minor == 2)
|
||||
gfx_v10_0_init_rlc_iram_dram_microcode(adev);
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec%s.bin", chip_name, wks);
|
||||
@ -3806,8 +3838,7 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
adev->firmware.fw_size +=
|
||||
ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
|
||||
}
|
||||
if (adev->gfx.rlc.is_rlc_v2_1 &&
|
||||
adev->gfx.rlc.save_restore_list_cntl_size_bytes &&
|
||||
if (adev->gfx.rlc.save_restore_list_cntl_size_bytes &&
|
||||
adev->gfx.rlc.save_restore_list_gpm_size_bytes &&
|
||||
adev->gfx.rlc.save_restore_list_srm_size_bytes) {
|
||||
info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL];
|
||||
@ -3827,6 +3858,21 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
|
||||
info->fw = adev->gfx.rlc_fw;
|
||||
adev->firmware.fw_size +=
|
||||
ALIGN(adev->gfx.rlc.save_restore_list_srm_size_bytes, PAGE_SIZE);
|
||||
|
||||
if (adev->gfx.rlc.rlc_iram_ucode_size_bytes &&
|
||||
adev->gfx.rlc.rlc_dram_ucode_size_bytes) {
|
||||
info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_IRAM];
|
||||
info->ucode_id = AMDGPU_UCODE_ID_RLC_IRAM;
|
||||
info->fw = adev->gfx.rlc_fw;
|
||||
adev->firmware.fw_size +=
|
||||
ALIGN(adev->gfx.rlc.rlc_iram_ucode_size_bytes, PAGE_SIZE);
|
||||
|
||||
info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_DRAM];
|
||||
info->ucode_id = AMDGPU_UCODE_ID_RLC_DRAM;
|
||||
info->fw = adev->gfx.rlc_fw;
|
||||
adev->firmware.fw_size +=
|
||||
ALIGN(adev->gfx.rlc.rlc_dram_ucode_size_bytes, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1];
|
||||
@ -4536,12 +4582,17 @@ static void gfx_v10_0_setup_rb(struct amdgpu_device *adev)
|
||||
int i, j;
|
||||
u32 data;
|
||||
u32 active_rbs = 0;
|
||||
u32 bitmap;
|
||||
u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
|
||||
adev->gfx.config.max_sh_per_se;
|
||||
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
|
||||
for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
|
||||
bitmap = i * adev->gfx.config.max_sh_per_se + j;
|
||||
if ((adev->asic_type == CHIP_SIENNA_CICHLID) &&
|
||||
((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1))
|
||||
continue;
|
||||
gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff);
|
||||
data = gfx_v10_0_get_rb_active_bitmap(adev);
|
||||
active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
|
||||
@ -6950,6 +7001,9 @@ static int gfx_v10_0_hw_init(void *handle)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (adev->asic_type == CHIP_SIENNA_CICHLID)
|
||||
gfx_v10_3_program_pbb_mode(adev);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -8763,6 +8817,10 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
|
||||
for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
|
||||
bitmap = i * adev->gfx.config.max_sh_per_se + j;
|
||||
if ((adev->asic_type == CHIP_SIENNA_CICHLID) &&
|
||||
((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1))
|
||||
continue;
|
||||
mask = 1;
|
||||
ao_bitmap = 0;
|
||||
counter = 0;
|
||||
@ -8797,6 +8855,47 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 gfx_v10_3_get_disabled_sa(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t efuse_setting, vbios_setting, disabled_sa, max_sa_mask;
|
||||
|
||||
efuse_setting = RREG32_SOC15(GC, 0, mmCC_GC_SA_UNIT_DISABLE);
|
||||
efuse_setting &= CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK;
|
||||
efuse_setting >>= CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT;
|
||||
|
||||
vbios_setting = RREG32_SOC15(GC, 0, mmGC_USER_SA_UNIT_DISABLE);
|
||||
vbios_setting &= GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK;
|
||||
vbios_setting >>= GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT;
|
||||
|
||||
max_sa_mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_sh_per_se *
|
||||
adev->gfx.config.max_shader_engines);
|
||||
disabled_sa = efuse_setting | vbios_setting;
|
||||
disabled_sa &= max_sa_mask;
|
||||
|
||||
return disabled_sa;
|
||||
}
|
||||
|
||||
static void gfx_v10_3_program_pbb_mode(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t max_sa_per_se, max_sa_per_se_mask, max_shader_engines;
|
||||
uint32_t disabled_sa_mask, se_index, disabled_sa_per_se;
|
||||
|
||||
disabled_sa_mask = gfx_v10_3_get_disabled_sa(adev);
|
||||
|
||||
max_sa_per_se = adev->gfx.config.max_sh_per_se;
|
||||
max_sa_per_se_mask = (1 << max_sa_per_se) - 1;
|
||||
max_shader_engines = adev->gfx.config.max_shader_engines;
|
||||
|
||||
for (se_index = 0; max_shader_engines > se_index; se_index++) {
|
||||
disabled_sa_per_se = disabled_sa_mask >> (se_index * max_sa_per_se);
|
||||
disabled_sa_per_se &= max_sa_per_se_mask;
|
||||
if (disabled_sa_per_se == max_sa_per_se_mask) {
|
||||
WREG32_FIELD15(GC, 0, PA_SC_ENHANCE_3, FORCE_PBB_WORKLOAD_MODE_TO_ZERO, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const struct amdgpu_ip_block_version gfx_v10_0_ip_block =
|
||||
{
|
||||
.type = AMD_IP_BLOCK_TYPE_GFX,
|
||||
|
@ -201,7 +201,7 @@ enum psp_gfx_fw_type {
|
||||
GFX_FW_TYPE_UVD1 = 23, /* UVD1 VG-20 */
|
||||
GFX_FW_TYPE_TOC = 24, /* TOC NV-10 */
|
||||
GFX_FW_TYPE_RLC_P = 25, /* RLC P NV */
|
||||
GFX_FW_TYPE_RLX6 = 26, /* RLX6 NV */
|
||||
GFX_FW_TYPE_RLC_IRAM = 26, /* RLC_IRAM NV */
|
||||
GFX_FW_TYPE_GLOBAL_TAP_DELAYS = 27, /* GLOBAL TAP DELAYS NV */
|
||||
GFX_FW_TYPE_SE0_TAP_DELAYS = 28, /* SE0 TAP DELAYS NV */
|
||||
GFX_FW_TYPE_SE1_TAP_DELAYS = 29, /* SE1 TAP DELAYS NV */
|
||||
@ -223,7 +223,7 @@ enum psp_gfx_fw_type {
|
||||
GFX_FW_TYPE_ACCUM_CTRL_RAM = 45, /* ACCUM CTRL RAM NV */
|
||||
GFX_FW_TYPE_RLCP_CAM = 46, /* RLCP CAM NV */
|
||||
GFX_FW_TYPE_RLC_SPP_CAM_EXT = 47, /* RLC SPP CAM EXT NV */
|
||||
GFX_FW_TYPE_RLX6_DRAM_BOOT = 48, /* RLX6 DRAM BOOT NV */
|
||||
GFX_FW_TYPE_RLC_DRAM_BOOT = 48, /* RLC DRAM BOOT NV */
|
||||
GFX_FW_TYPE_VCN0_RAM = 49, /* VCN_RAM NV + RN */
|
||||
GFX_FW_TYPE_VCN1_RAM = 50, /* VCN_RAM NV + RN */
|
||||
GFX_FW_TYPE_DMUB = 51, /* DMUB RN */
|
||||
|
@ -58,8 +58,9 @@ static int update_qpd_v10(struct device_queue_manager *dqm,
|
||||
/* check if sh_mem_config register already configured */
|
||||
if (qpd->sh_mem_config == 0) {
|
||||
qpd->sh_mem_config =
|
||||
SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
|
||||
SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT;
|
||||
(SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
|
||||
SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) |
|
||||
(3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT);
|
||||
#if 0
|
||||
/* TODO:
|
||||
* This shouldn't be an issue with Navi10. Verify.
|
||||
|
@ -5063,7 +5063,13 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->dev);
|
||||
struct amdgpu_display_manager *dm = &adev->dm;
|
||||
|
||||
drm_atomic_private_obj_fini(&aconnector->mst_mgr.base);
|
||||
/*
|
||||
* Call only if mst_mgr was iniitalized before since it's not done
|
||||
* for all connector types.
|
||||
*/
|
||||
if (aconnector->mst_mgr.dev)
|
||||
drm_dp_mst_topology_mgr_destroy(&aconnector->mst_mgr);
|
||||
|
||||
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
|
||||
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
|
||||
|
||||
|
@ -220,6 +220,7 @@ enum smu_clk_type {
|
||||
__SMU_DUMMY_MAP(DPM_MP0CLK), \
|
||||
__SMU_DUMMY_MAP(DPM_LINK), \
|
||||
__SMU_DUMMY_MAP(DPM_DCEFCLK), \
|
||||
__SMU_DUMMY_MAP(DPM_XGMI), \
|
||||
__SMU_DUMMY_MAP(DS_GFXCLK), \
|
||||
__SMU_DUMMY_MAP(DS_SOCCLK), \
|
||||
__SMU_DUMMY_MAP(DS_LCLK), \
|
||||
|
@ -151,14 +151,17 @@ static struct cmn2asic_mapping sienna_cichlid_feature_mask_map[SMU_FEATURE_COUNT
|
||||
FEA_MAP(DPM_GFXCLK),
|
||||
FEA_MAP(DPM_GFX_GPO),
|
||||
FEA_MAP(DPM_UCLK),
|
||||
FEA_MAP(DPM_FCLK),
|
||||
FEA_MAP(DPM_SOCCLK),
|
||||
FEA_MAP(DPM_MP0CLK),
|
||||
FEA_MAP(DPM_LINK),
|
||||
FEA_MAP(DPM_DCEFCLK),
|
||||
FEA_MAP(DPM_XGMI),
|
||||
FEA_MAP(MEM_VDDCI_SCALING),
|
||||
FEA_MAP(MEM_MVDD_SCALING),
|
||||
FEA_MAP(DS_GFXCLK),
|
||||
FEA_MAP(DS_SOCCLK),
|
||||
FEA_MAP(DS_FCLK),
|
||||
FEA_MAP(DS_LCLK),
|
||||
FEA_MAP(DS_DCEFCLK),
|
||||
FEA_MAP(DS_UCLK),
|
||||
@ -452,6 +455,9 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_CURR_DCEFCLK:
|
||||
*value = metrics->CurrClock[PPCLK_DCEFCLK];
|
||||
break;
|
||||
case METRICS_CURR_FCLK:
|
||||
*value = metrics->CurrClock[PPCLK_FCLK];
|
||||
break;
|
||||
case METRICS_AVERAGE_GFXCLK:
|
||||
if (metrics->AverageGfxActivity <= SMU_11_0_7_GFX_BUSY_THRESHOLD)
|
||||
*value = metrics->AverageGfxclkFrequencyPostDs;
|
||||
@ -948,19 +954,23 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
|
||||
freq_values[1] = cur_value;
|
||||
mark_index = cur_value == freq_values[0] ? 0 :
|
||||
cur_value == freq_values[2] ? 2 : 1;
|
||||
if (mark_index != 1)
|
||||
freq_values[1] = (freq_values[0] + freq_values[2]) / 2;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
count = 3;
|
||||
if (mark_index != 1) {
|
||||
count = 2;
|
||||
freq_values[1] = freq_values[2];
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n", i, freq_values[i],
|
||||
i == mark_index ? "*" : "");
|
||||
cur_value == freq_values[i] ? "*" : "");
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case SMU_PCIE:
|
||||
gen_speed = smu_v11_0_get_current_pcie_link_speed(smu);
|
||||
lane_width = smu_v11_0_get_current_pcie_link_width(smu);
|
||||
gen_speed = smu_v11_0_get_current_pcie_link_speed_level(smu);
|
||||
lane_width = smu_v11_0_get_current_pcie_link_width_level(smu);
|
||||
for (i = 0; i < NUM_LINK_LEVELS; i++)
|
||||
size += sprintf(buf + size, "%d: %s %s %dMhz %s\n", i,
|
||||
(dpm_context->dpm_tables.pcie_table.pcie_gen[i] == 0) ? "2.5GT/s," :
|
||||
|
@ -431,10 +431,9 @@ size_t smu_cmn_get_pp_feature_mask(struct smu_context *smu,
|
||||
char *buf)
|
||||
{
|
||||
uint32_t feature_mask[2] = { 0 };
|
||||
int32_t feature_index = 0;
|
||||
int feature_index = 0;
|
||||
uint32_t count = 0;
|
||||
uint32_t sort_feature[SMU_FEATURE_COUNT];
|
||||
uint64_t hw_feature_count = 0;
|
||||
int8_t sort_feature[SMU_FEATURE_COUNT];
|
||||
size_t size = 0;
|
||||
int ret = 0, i;
|
||||
|
||||
@ -447,23 +446,31 @@ size_t smu_cmn_get_pp_feature_mask(struct smu_context *smu,
|
||||
size = sprintf(buf + size, "features high: 0x%08x low: 0x%08x\n",
|
||||
feature_mask[1], feature_mask[0]);
|
||||
|
||||
memset(sort_feature, -1, sizeof(sort_feature));
|
||||
|
||||
for (i = 0; i < SMU_FEATURE_COUNT; i++) {
|
||||
feature_index = smu_cmn_to_asic_specific_index(smu,
|
||||
CMN2ASIC_MAPPING_FEATURE,
|
||||
i);
|
||||
if (feature_index < 0)
|
||||
continue;
|
||||
|
||||
sort_feature[feature_index] = i;
|
||||
hw_feature_count++;
|
||||
}
|
||||
|
||||
for (i = 0; i < hw_feature_count; i++) {
|
||||
size += sprintf(buf + size, "%-2s. %-20s %-3s : %-s\n",
|
||||
"No", "Feature", "Bit", "State");
|
||||
|
||||
for (i = 0; i < SMU_FEATURE_COUNT; i++) {
|
||||
if (sort_feature[i] < 0)
|
||||
continue;
|
||||
|
||||
size += sprintf(buf + size, "%02d. %-20s (%2d) : %s\n",
|
||||
count++,
|
||||
smu_get_feature_name(smu, sort_feature[i]),
|
||||
i,
|
||||
!!smu_cmn_feature_is_enabled(smu, sort_feature[i]) ?
|
||||
"enabled" : "disabled");
|
||||
count++,
|
||||
smu_get_feature_name(smu, sort_feature[i]),
|
||||
i,
|
||||
!!smu_cmn_feature_is_enabled(smu, sort_feature[i]) ?
|
||||
"enabled" : "disabled");
|
||||
}
|
||||
|
||||
return size;
|
||||
|
@ -153,6 +153,7 @@ config DRM_I915_SELFTEST
|
||||
select DRM_EXPORT_FOR_TESTS if m
|
||||
select FAULT_INJECTION
|
||||
select PRIME_NUMBERS
|
||||
select CRC32
|
||||
help
|
||||
Choose this option to allow the driver to perform selftests upon
|
||||
loading; also requires the i915.selftest=1 module parameter. To
|
||||
|
@ -3434,6 +3434,14 @@ initial_plane_vma(struct drm_i915_private *i915,
|
||||
if (IS_ERR(obj))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Mark it WT ahead of time to avoid changing the
|
||||
* cache_level during fbdev initialization. The
|
||||
* unbind there would get stuck waiting for rcu.
|
||||
*/
|
||||
i915_gem_object_set_cache_coherency(obj, HAS_WT(i915) ?
|
||||
I915_CACHE_WT : I915_CACHE_NONE);
|
||||
|
||||
switch (plane_config->tiling) {
|
||||
case I915_TILING_NONE:
|
||||
break;
|
||||
|
@ -52,6 +52,25 @@ static void set_aux_backlight_enable(struct intel_dp *intel_dp, bool enable)
|
||||
}
|
||||
}
|
||||
|
||||
static bool intel_dp_aux_backlight_dpcd_mode(struct intel_connector *connector)
|
||||
{
|
||||
struct intel_dp *intel_dp = intel_attached_dp(connector);
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
u8 mode_reg;
|
||||
|
||||
if (drm_dp_dpcd_readb(&intel_dp->aux,
|
||||
DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
|
||||
&mode_reg) != 1) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Failed to read the DPCD register 0x%x\n",
|
||||
DP_EDP_BACKLIGHT_MODE_SET_REGISTER);
|
||||
return false;
|
||||
}
|
||||
|
||||
return (mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) ==
|
||||
DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the current backlight value from DPCD register(s) based
|
||||
* on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported
|
||||
@ -61,24 +80,13 @@ static u32 intel_dp_aux_get_backlight(struct intel_connector *connector)
|
||||
struct intel_dp *intel_dp = intel_attached_dp(connector);
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
u8 read_val[2] = { 0x0 };
|
||||
u8 mode_reg;
|
||||
u16 level = 0;
|
||||
|
||||
if (drm_dp_dpcd_readb(&intel_dp->aux,
|
||||
DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
|
||||
&mode_reg) != 1) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Failed to read the DPCD register 0x%x\n",
|
||||
DP_EDP_BACKLIGHT_MODE_SET_REGISTER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're not in DPCD control mode yet, the programmed brightness
|
||||
* value is meaningless and we should assume max brightness
|
||||
*/
|
||||
if ((mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) !=
|
||||
DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD)
|
||||
if (!intel_dp_aux_backlight_dpcd_mode(connector))
|
||||
return connector->panel.backlight.max;
|
||||
|
||||
if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
|
||||
@ -319,7 +327,8 @@ static int intel_dp_aux_setup_backlight(struct intel_connector *connector,
|
||||
|
||||
panel->backlight.min = 0;
|
||||
panel->backlight.level = intel_dp_aux_get_backlight(connector);
|
||||
panel->backlight.enabled = panel->backlight.level != 0;
|
||||
panel->backlight.enabled = intel_dp_aux_backlight_dpcd_mode(connector) &&
|
||||
panel->backlight.level != 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -287,8 +287,8 @@ struct i915_execbuffer {
|
||||
u64 invalid_flags; /** Set of execobj.flags that are invalid */
|
||||
u32 context_flags; /** Set of execobj.flags to insert from the ctx */
|
||||
|
||||
u64 batch_len; /** Length of batch within object */
|
||||
u32 batch_start_offset; /** Location within object of batch */
|
||||
u32 batch_len; /** Length of batch within object */
|
||||
u32 batch_flags; /** Flags composed for emit_bb_start() */
|
||||
struct intel_gt_buffer_pool_node *batch_pool; /** pool node for batch buffer */
|
||||
|
||||
@ -871,6 +871,10 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb)
|
||||
|
||||
if (eb->batch_len == 0)
|
||||
eb->batch_len = eb->batch->vma->size - eb->batch_start_offset;
|
||||
if (unlikely(eb->batch_len == 0)) { /* impossible! */
|
||||
drm_dbg(&i915->drm, "Invalid batch length\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@ -2424,7 +2428,7 @@ static int eb_parse(struct i915_execbuffer *eb)
|
||||
struct drm_i915_private *i915 = eb->i915;
|
||||
struct intel_gt_buffer_pool_node *pool = eb->batch_pool;
|
||||
struct i915_vma *shadow, *trampoline, *batch;
|
||||
unsigned int len;
|
||||
unsigned long len;
|
||||
int err;
|
||||
|
||||
if (!eb_use_cmdparser(eb)) {
|
||||
@ -2449,6 +2453,8 @@ static int eb_parse(struct i915_execbuffer *eb)
|
||||
} else {
|
||||
len += I915_CMD_PARSER_TRAMPOLINE_SIZE;
|
||||
}
|
||||
if (unlikely(len < eb->batch_len)) /* last paranoid check of overflow */
|
||||
return -EINVAL;
|
||||
|
||||
if (!pool) {
|
||||
pool = intel_gt_get_buffer_pool(eb->engine->gt, len);
|
||||
|
@ -53,8 +53,10 @@ int i915_gem_stolen_insert_node(struct drm_i915_private *i915,
|
||||
struct drm_mm_node *node, u64 size,
|
||||
unsigned alignment)
|
||||
{
|
||||
return i915_gem_stolen_insert_node_in_range(i915, node, size,
|
||||
alignment, 0, U64_MAX);
|
||||
return i915_gem_stolen_insert_node_in_range(i915, node,
|
||||
size, alignment,
|
||||
I915_GEM_STOLEN_BIAS,
|
||||
U64_MAX);
|
||||
}
|
||||
|
||||
void i915_gem_stolen_remove_node(struct drm_i915_private *i915,
|
||||
|
@ -30,4 +30,6 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
|
||||
resource_size_t stolen_offset,
|
||||
resource_size_t size);
|
||||
|
||||
#define I915_GEM_STOLEN_BIAS SZ_128K
|
||||
|
||||
#endif /* __I915_GEM_STOLEN_H__ */
|
||||
|
@ -239,18 +239,24 @@ static int gen6_ppgtt_init_scratch(struct gen6_ppgtt *ppgtt)
|
||||
I915_CACHE_NONE, PTE_READ_ONLY);
|
||||
|
||||
vm->scratch[1] = vm->alloc_pt_dma(vm, I915_GTT_PAGE_SIZE_4K);
|
||||
if (IS_ERR(vm->scratch[1]))
|
||||
return PTR_ERR(vm->scratch[1]);
|
||||
if (IS_ERR(vm->scratch[1])) {
|
||||
ret = PTR_ERR(vm->scratch[1]);
|
||||
goto err_scratch0;
|
||||
}
|
||||
|
||||
ret = pin_pt_dma(vm, vm->scratch[1]);
|
||||
if (ret) {
|
||||
i915_gem_object_put(vm->scratch[1]);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err_scratch1;
|
||||
|
||||
fill32_px(vm->scratch[1], vm->scratch[0]->encode);
|
||||
|
||||
return 0;
|
||||
|
||||
err_scratch1:
|
||||
i915_gem_object_put(vm->scratch[1]);
|
||||
err_scratch0:
|
||||
i915_gem_object_put(vm->scratch[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gen6_ppgtt_free_pd(struct gen6_ppgtt *ppgtt)
|
||||
|
@ -604,7 +604,8 @@ static int gen8_init_scratch(struct i915_address_space *vm)
|
||||
return 0;
|
||||
|
||||
free_scratch:
|
||||
free_scratch(vm);
|
||||
while (i--)
|
||||
i915_gem_object_put(vm->scratch[i]);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -278,7 +278,7 @@ struct intel_engine_execlists {
|
||||
*
|
||||
* Note these register may be either mmio or HWSP shadow.
|
||||
*/
|
||||
u32 *csb_status;
|
||||
u64 *csb_status;
|
||||
|
||||
/**
|
||||
* @csb_size: context status buffer FIFO size
|
||||
|
@ -1140,9 +1140,8 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine)
|
||||
|
||||
/* Check in case we rollback so far we wrap [size/2] */
|
||||
if (intel_ring_direction(rq->ring,
|
||||
intel_ring_wrap(rq->ring,
|
||||
rq->tail),
|
||||
rq->ring->tail) > 0)
|
||||
rq->tail,
|
||||
rq->ring->tail + 8) > 0)
|
||||
rq->context->lrc.desc |= CTX_DESC_FORCE_RESTORE;
|
||||
|
||||
active = rq;
|
||||
@ -2464,7 +2463,7 @@ cancel_port_requests(struct intel_engine_execlists * const execlists)
|
||||
}
|
||||
|
||||
static inline void
|
||||
invalidate_csb_entries(const u32 *first, const u32 *last)
|
||||
invalidate_csb_entries(const u64 *first, const u64 *last)
|
||||
{
|
||||
clflush((void *)first);
|
||||
clflush((void *)last);
|
||||
@ -2496,14 +2495,25 @@ invalidate_csb_entries(const u32 *first, const u32 *last)
|
||||
* bits 47-57: sw context id of the lrc the GT switched away from
|
||||
* bits 58-63: sw counter of the lrc the GT switched away from
|
||||
*/
|
||||
static inline bool
|
||||
gen12_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
|
||||
static inline bool gen12_csb_parse(const u64 *csb)
|
||||
{
|
||||
u32 lower_dw = csb[0];
|
||||
u32 upper_dw = csb[1];
|
||||
bool ctx_to_valid = GEN12_CSB_CTX_VALID(lower_dw);
|
||||
bool ctx_away_valid = GEN12_CSB_CTX_VALID(upper_dw);
|
||||
bool new_queue = lower_dw & GEN12_CTX_STATUS_SWITCHED_TO_NEW_QUEUE;
|
||||
bool ctx_away_valid;
|
||||
bool new_queue;
|
||||
u64 entry;
|
||||
|
||||
/* HSD#22011248461 */
|
||||
entry = READ_ONCE(*csb);
|
||||
if (unlikely(entry == -1)) {
|
||||
preempt_disable();
|
||||
if (wait_for_atomic_us((entry = READ_ONCE(*csb)) != -1, 50))
|
||||
GEM_WARN_ON("50us CSB timeout");
|
||||
preempt_enable();
|
||||
}
|
||||
WRITE_ONCE(*(u64 *)csb, -1);
|
||||
|
||||
ctx_away_valid = GEN12_CSB_CTX_VALID(upper_32_bits(entry));
|
||||
new_queue =
|
||||
lower_32_bits(entry) & GEN12_CTX_STATUS_SWITCHED_TO_NEW_QUEUE;
|
||||
|
||||
/*
|
||||
* The context switch detail is not guaranteed to be 5 when a preemption
|
||||
@ -2513,7 +2523,7 @@ gen12_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
|
||||
* would require some extra handling, but we don't support that.
|
||||
*/
|
||||
if (!ctx_away_valid || new_queue) {
|
||||
GEM_BUG_ON(!ctx_to_valid);
|
||||
GEM_BUG_ON(!GEN12_CSB_CTX_VALID(lower_32_bits(entry)));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2522,12 +2532,11 @@ gen12_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
|
||||
* context switch on an unsuccessful wait instruction since we always
|
||||
* use polling mode.
|
||||
*/
|
||||
GEM_BUG_ON(GEN12_CTX_SWITCH_DETAIL(upper_dw));
|
||||
GEM_BUG_ON(GEN12_CTX_SWITCH_DETAIL(upper_32_bits(entry)));
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
gen8_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
|
||||
static inline bool gen8_csb_parse(const u64 *csb)
|
||||
{
|
||||
return *csb & (GEN8_CTX_STATUS_IDLE_ACTIVE | GEN8_CTX_STATUS_PREEMPTED);
|
||||
}
|
||||
@ -2535,7 +2544,7 @@ gen8_csb_parse(const struct intel_engine_execlists *execlists, const u32 *csb)
|
||||
static void process_csb(struct intel_engine_cs *engine)
|
||||
{
|
||||
struct intel_engine_execlists * const execlists = &engine->execlists;
|
||||
const u32 * const buf = execlists->csb_status;
|
||||
const u64 * const buf = execlists->csb_status;
|
||||
const u8 num_entries = execlists->csb_size;
|
||||
u8 head, tail;
|
||||
|
||||
@ -2616,12 +2625,14 @@ static void process_csb(struct intel_engine_cs *engine)
|
||||
*/
|
||||
|
||||
ENGINE_TRACE(engine, "csb[%d]: status=0x%08x:0x%08x\n",
|
||||
head, buf[2 * head + 0], buf[2 * head + 1]);
|
||||
head,
|
||||
upper_32_bits(buf[head]),
|
||||
lower_32_bits(buf[head]));
|
||||
|
||||
if (INTEL_GEN(engine->i915) >= 12)
|
||||
promote = gen12_csb_parse(execlists, buf + 2 * head);
|
||||
promote = gen12_csb_parse(buf + head);
|
||||
else
|
||||
promote = gen8_csb_parse(execlists, buf + 2 * head);
|
||||
promote = gen8_csb_parse(buf + head);
|
||||
if (promote) {
|
||||
struct i915_request * const *old = execlists->active;
|
||||
|
||||
@ -2649,6 +2660,9 @@ static void process_csb(struct intel_engine_cs *engine)
|
||||
smp_wmb(); /* complete the seqlock */
|
||||
WRITE_ONCE(execlists->active, execlists->inflight);
|
||||
|
||||
/* XXX Magic delay for tgl */
|
||||
ENGINE_POSTING_READ(engine, RING_CONTEXT_STATUS_PTR);
|
||||
|
||||
WRITE_ONCE(execlists->pending[0], NULL);
|
||||
} else {
|
||||
if (GEM_WARN_ON(!*execlists->active)) {
|
||||
@ -4005,6 +4019,8 @@ static void reset_csb_pointers(struct intel_engine_cs *engine)
|
||||
WRITE_ONCE(*execlists->csb_write, reset_value);
|
||||
wmb(); /* Make sure this is visible to HW (paranoia?) */
|
||||
|
||||
/* Check that the GPU does indeed update the CSB entries! */
|
||||
memset(execlists->csb_status, -1, (reset_value + 1) * sizeof(u64));
|
||||
invalidate_csb_entries(&execlists->csb_status[0],
|
||||
&execlists->csb_status[reset_value]);
|
||||
|
||||
@ -5157,7 +5173,7 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine)
|
||||
}
|
||||
|
||||
execlists->csb_status =
|
||||
&engine->status_page.addr[I915_HWS_CSB_BUF0_INDEX];
|
||||
(u64 *)&engine->status_page.addr[I915_HWS_CSB_BUF0_INDEX];
|
||||
|
||||
execlists->csb_write =
|
||||
&engine->status_page.addr[intel_hws_csb_write_index(i915)];
|
||||
|
@ -234,11 +234,17 @@ static const struct drm_i915_mocs_entry broxton_mocs_table[] = {
|
||||
L3_1_UC)
|
||||
|
||||
static const struct drm_i915_mocs_entry tgl_mocs_table[] = {
|
||||
/* Base - Error (Reserved for Non-Use) */
|
||||
MOCS_ENTRY(0, 0x0, 0x0),
|
||||
/* Base - Reserved */
|
||||
MOCS_ENTRY(1, 0x0, 0x0),
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* Reserved and unspecified MOCS indices have been set to (L3 + LCC).
|
||||
* These reserved entries should never be used, they may be changed
|
||||
* to low performant variants with better coherency in the future if
|
||||
* more entries are needed. We are programming index I915_MOCS_PTE(1)
|
||||
* only, __init_mocs_table() take care to program unused index with
|
||||
* this entry.
|
||||
*/
|
||||
MOCS_ENTRY(1, LE_3_WB | LE_TC_1_LLC | LE_LRUM(3),
|
||||
L3_3_WB),
|
||||
GEN11_MOCS_ENTRIES,
|
||||
|
||||
/* Implicitly enable L1 - HDC:L1 + L3 + LLC */
|
||||
|
@ -3,9 +3,203 @@
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/crc32.h>
|
||||
|
||||
#include "gem/i915_gem_stolen.h"
|
||||
|
||||
#include "i915_memcpy.h"
|
||||
#include "i915_selftest.h"
|
||||
#include "selftests/igt_reset.h"
|
||||
#include "selftests/igt_atomic.h"
|
||||
#include "selftests/igt_spinner.h"
|
||||
|
||||
static int
|
||||
__igt_reset_stolen(struct intel_gt *gt,
|
||||
intel_engine_mask_t mask,
|
||||
const char *msg)
|
||||
{
|
||||
struct i915_ggtt *ggtt = >->i915->ggtt;
|
||||
const struct resource *dsm = >->i915->dsm;
|
||||
resource_size_t num_pages, page;
|
||||
struct intel_engine_cs *engine;
|
||||
intel_wakeref_t wakeref;
|
||||
enum intel_engine_id id;
|
||||
struct igt_spinner spin;
|
||||
long max, count;
|
||||
void *tmp;
|
||||
u32 *crc;
|
||||
int err;
|
||||
|
||||
if (!drm_mm_node_allocated(&ggtt->error_capture))
|
||||
return 0;
|
||||
|
||||
num_pages = resource_size(dsm) >> PAGE_SHIFT;
|
||||
if (!num_pages)
|
||||
return 0;
|
||||
|
||||
crc = kmalloc_array(num_pages, sizeof(u32), GFP_KERNEL);
|
||||
if (!crc)
|
||||
return -ENOMEM;
|
||||
|
||||
tmp = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
if (!tmp) {
|
||||
err = -ENOMEM;
|
||||
goto err_crc;
|
||||
}
|
||||
|
||||
igt_global_reset_lock(gt);
|
||||
wakeref = intel_runtime_pm_get(gt->uncore->rpm);
|
||||
|
||||
err = igt_spinner_init(&spin, gt);
|
||||
if (err)
|
||||
goto err_lock;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct intel_context *ce;
|
||||
struct i915_request *rq;
|
||||
|
||||
if (!(mask & engine->mask))
|
||||
continue;
|
||||
|
||||
if (!intel_engine_can_store_dword(engine))
|
||||
continue;
|
||||
|
||||
ce = intel_context_create(engine);
|
||||
if (IS_ERR(ce)) {
|
||||
err = PTR_ERR(ce);
|
||||
goto err_spin;
|
||||
}
|
||||
rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK);
|
||||
intel_context_put(ce);
|
||||
if (IS_ERR(rq)) {
|
||||
err = PTR_ERR(rq);
|
||||
goto err_spin;
|
||||
}
|
||||
i915_request_add(rq);
|
||||
}
|
||||
|
||||
for (page = 0; page < num_pages; page++) {
|
||||
dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT);
|
||||
void __iomem *s;
|
||||
void *in;
|
||||
|
||||
ggtt->vm.insert_page(&ggtt->vm, dma,
|
||||
ggtt->error_capture.start,
|
||||
I915_CACHE_NONE, 0);
|
||||
mb();
|
||||
|
||||
s = io_mapping_map_wc(&ggtt->iomap,
|
||||
ggtt->error_capture.start,
|
||||
PAGE_SIZE);
|
||||
|
||||
if (!__drm_mm_interval_first(>->i915->mm.stolen,
|
||||
page << PAGE_SHIFT,
|
||||
((page + 1) << PAGE_SHIFT) - 1))
|
||||
memset32(s, STACK_MAGIC, PAGE_SIZE / sizeof(u32));
|
||||
|
||||
in = s;
|
||||
if (i915_memcpy_from_wc(tmp, s, PAGE_SIZE))
|
||||
in = tmp;
|
||||
crc[page] = crc32_le(0, in, PAGE_SIZE);
|
||||
|
||||
io_mapping_unmap(s);
|
||||
}
|
||||
mb();
|
||||
ggtt->vm.clear_range(&ggtt->vm, ggtt->error_capture.start, PAGE_SIZE);
|
||||
|
||||
if (mask == ALL_ENGINES) {
|
||||
intel_gt_reset(gt, mask, NULL);
|
||||
} else {
|
||||
for_each_engine(engine, gt, id) {
|
||||
if (mask & engine->mask)
|
||||
intel_engine_reset(engine, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
max = -1;
|
||||
count = 0;
|
||||
for (page = 0; page < num_pages; page++) {
|
||||
dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT);
|
||||
void __iomem *s;
|
||||
void *in;
|
||||
u32 x;
|
||||
|
||||
ggtt->vm.insert_page(&ggtt->vm, dma,
|
||||
ggtt->error_capture.start,
|
||||
I915_CACHE_NONE, 0);
|
||||
mb();
|
||||
|
||||
s = io_mapping_map_wc(&ggtt->iomap,
|
||||
ggtt->error_capture.start,
|
||||
PAGE_SIZE);
|
||||
|
||||
in = s;
|
||||
if (i915_memcpy_from_wc(tmp, s, PAGE_SIZE))
|
||||
in = tmp;
|
||||
x = crc32_le(0, in, PAGE_SIZE);
|
||||
|
||||
if (x != crc[page] &&
|
||||
!__drm_mm_interval_first(>->i915->mm.stolen,
|
||||
page << PAGE_SHIFT,
|
||||
((page + 1) << PAGE_SHIFT) - 1)) {
|
||||
pr_debug("unused stolen page %pa modified by GPU reset\n",
|
||||
&page);
|
||||
if (count++ == 0)
|
||||
igt_hexdump(in, PAGE_SIZE);
|
||||
max = page;
|
||||
}
|
||||
|
||||
io_mapping_unmap(s);
|
||||
}
|
||||
mb();
|
||||
ggtt->vm.clear_range(&ggtt->vm, ggtt->error_capture.start, PAGE_SIZE);
|
||||
|
||||
if (count > 0) {
|
||||
pr_info("%s reset clobbered %ld pages of stolen, last clobber at page %ld\n",
|
||||
msg, count, max);
|
||||
}
|
||||
if (max >= I915_GEM_STOLEN_BIAS >> PAGE_SHIFT) {
|
||||
pr_err("%s reset clobbered unreserved area [above %x] of stolen; may cause severe faults\n",
|
||||
msg, I915_GEM_STOLEN_BIAS);
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
err_spin:
|
||||
igt_spinner_fini(&spin);
|
||||
|
||||
err_lock:
|
||||
intel_runtime_pm_put(gt->uncore->rpm, wakeref);
|
||||
igt_global_reset_unlock(gt);
|
||||
|
||||
kfree(tmp);
|
||||
err_crc:
|
||||
kfree(crc);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int igt_reset_device_stolen(void *arg)
|
||||
{
|
||||
return __igt_reset_stolen(arg, ALL_ENGINES, "device");
|
||||
}
|
||||
|
||||
static int igt_reset_engines_stolen(void *arg)
|
||||
{
|
||||
struct intel_gt *gt = arg;
|
||||
struct intel_engine_cs *engine;
|
||||
enum intel_engine_id id;
|
||||
int err;
|
||||
|
||||
if (!intel_has_reset_engine(gt))
|
||||
return 0;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
err = __igt_reset_stolen(gt, engine->mask, engine->name);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int igt_global_reset(void *arg)
|
||||
{
|
||||
@ -164,6 +358,8 @@ int intel_reset_live_selftests(struct drm_i915_private *i915)
|
||||
{
|
||||
static const struct i915_subtest tests[] = {
|
||||
SUBTEST(igt_global_reset), /* attempt to recover GPU first */
|
||||
SUBTEST(igt_reset_device_stolen),
|
||||
SUBTEST(igt_reset_engines_stolen),
|
||||
SUBTEST(igt_wedged_reset),
|
||||
SUBTEST(igt_atomic_reset),
|
||||
SUBTEST(igt_atomic_engine_reset),
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <uapi/drm/i915_drm.h>
|
||||
#include <uapi/drm/drm_fourcc.h>
|
||||
|
||||
#include <asm/hypervisor.h>
|
||||
|
||||
#include <linux/io-mapping.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
@ -1760,7 +1762,9 @@ static inline bool intel_vtd_active(void)
|
||||
if (intel_iommu_gfx_mapped)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
/* Running as a guest, we assume the host is enforcing VT'd */
|
||||
return !hypervisor_is_type(X86_HYPER_NATIVE);
|
||||
}
|
||||
|
||||
static inline bool intel_scanout_needs_vtd_wa(struct drm_i915_private *dev_priv)
|
||||
|
@ -1312,7 +1312,7 @@ capture_vma(struct intel_engine_capture_vma *next,
|
||||
}
|
||||
|
||||
strcpy(c->name, name);
|
||||
c->vma = i915_vma_get(vma);
|
||||
c->vma = vma; /* reference held while active */
|
||||
|
||||
c->next = next;
|
||||
return c;
|
||||
@ -1402,7 +1402,6 @@ intel_engine_coredump_add_vma(struct intel_engine_coredump *ee,
|
||||
compress));
|
||||
|
||||
i915_active_release(&vma->active);
|
||||
i915_vma_put(vma);
|
||||
|
||||
capture = this->next;
|
||||
kfree(this);
|
||||
|
@ -1209,6 +1209,18 @@ unclaimed_reg_debug(struct intel_uncore *uncore,
|
||||
spin_unlock(&uncore->debug->lock);
|
||||
}
|
||||
|
||||
#define __vgpu_read(x) \
|
||||
static u##x \
|
||||
vgpu_read##x(struct intel_uncore *uncore, i915_reg_t reg, bool trace) { \
|
||||
u##x val = __raw_uncore_read##x(uncore, reg); \
|
||||
trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
|
||||
return val; \
|
||||
}
|
||||
__vgpu_read(8)
|
||||
__vgpu_read(16)
|
||||
__vgpu_read(32)
|
||||
__vgpu_read(64)
|
||||
|
||||
#define GEN2_READ_HEADER(x) \
|
||||
u##x val = 0; \
|
||||
assert_rpm_wakelock_held(uncore->rpm);
|
||||
@ -1414,6 +1426,16 @@ __gen_reg_write_funcs(gen8);
|
||||
#undef GEN6_WRITE_FOOTER
|
||||
#undef GEN6_WRITE_HEADER
|
||||
|
||||
#define __vgpu_write(x) \
|
||||
static void \
|
||||
vgpu_write##x(struct intel_uncore *uncore, i915_reg_t reg, u##x val, bool trace) { \
|
||||
trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
|
||||
__raw_uncore_write##x(uncore, reg, val); \
|
||||
}
|
||||
__vgpu_write(8)
|
||||
__vgpu_write(16)
|
||||
__vgpu_write(32)
|
||||
|
||||
#define ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, x) \
|
||||
do { \
|
||||
(uncore)->funcs.mmio_writeb = x##_write8; \
|
||||
@ -1735,7 +1757,10 @@ static void uncore_raw_init(struct intel_uncore *uncore)
|
||||
{
|
||||
GEM_BUG_ON(intel_uncore_has_forcewake(uncore));
|
||||
|
||||
if (IS_GEN(uncore->i915, 5)) {
|
||||
if (intel_vgpu_active(uncore->i915)) {
|
||||
ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, vgpu);
|
||||
ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, vgpu);
|
||||
} else if (IS_GEN(uncore->i915, 5)) {
|
||||
ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, gen5);
|
||||
ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, gen5);
|
||||
} else {
|
||||
|
@ -647,7 +647,7 @@ bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
|
||||
/* Don't evict this BO if it's outside of the
|
||||
* requested placement range
|
||||
*/
|
||||
if (place->fpfn >= (bo->mem.start + bo->mem.size) ||
|
||||
if (place->fpfn >= (bo->mem.start + bo->mem.num_pages) ||
|
||||
(place->lpfn && place->lpfn <= bo->mem.start))
|
||||
return false;
|
||||
|
||||
|
@ -3,8 +3,8 @@
|
||||
|
||||
#define FONTDATAMAX 2048
|
||||
|
||||
static const unsigned char fontdata_6x8[FONTDATAMAX] = {
|
||||
|
||||
static struct font_data fontdata_6x8 = {
|
||||
{ 0, 0, FONTDATAMAX, 0 }, {
|
||||
/* 0 0x00 '^@' */
|
||||
0x00, /* 000000 */
|
||||
0x00, /* 000000 */
|
||||
@ -2564,13 +2564,13 @@ static const unsigned char fontdata_6x8[FONTDATAMAX] = {
|
||||
0x00, /* 000000 */
|
||||
0x00, /* 000000 */
|
||||
0x00, /* 000000 */
|
||||
};
|
||||
} };
|
||||
|
||||
const struct font_desc font_6x8 = {
|
||||
.idx = FONT6x8_IDX,
|
||||
.name = "6x8",
|
||||
.width = 6,
|
||||
.height = 8,
|
||||
.data = fontdata_6x8,
|
||||
.data = fontdata_6x8.data,
|
||||
.pref = 0,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user