drm next fixes for 6.19-rc1
core: - revert dumb bo 8 byte alignment amdgpu: - SI fix - DC reduce stack usage - HDMI fixes - VCN 4.0.5 fix - DP MST fix - DC memory allocation fix amdkfd: - SVM fix - Trap handler fix - VGPR fixes for GC 11.5 i915: - Fix format string truncation warning - FIx runtime PM reference during fbdev BO creation panthor: - fix UAF renesas: - fix sync flag handling -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmk8y2sACgkQDHTzWXnE hr4Jyg/+ItjFIJN8btaYANTfXGLTPrlGZb7RYwgWLmzj11yT8Xh8qgHXdBBPPSAp sQ4XlVVZVKB1tv3DCQNcOAfzO1KRCoQwAY7QNmyT6+cbJWmAvARD9kyR+MUbYS2a 5Dy54ZOziBjUEIDgLsl3qSu6SLaECrL0IiGjvY7jnr5I1CO7q9xOZTlSTBXoUhN3 sg8eLR7I5iLWdhmfisASPtWeCgfpa/H5tiWDxkIPHSEfkLQ3b4582MXxNfNOsxeQ tPn8jKOLnPYFJnud9G73dbm244z1qdVl6p+ihYolG417I64CZngVOqBcodbT9zgy 10N1EDf0eblrI9HGxWmx5iXx6EIt1B/FVOWrHugBKmFSUwKRQRB7Tyz4R2PTK9Jd U394/kh+49gXIVG6okT32jpvqlWJgqIV4G9Bdw05qbG9JNnCYbyaKuTmElPSPqtF ktTp8XGSGbm3Em7efb+nMXoMnli16V8tzXjVgJ6LkC8O7z7BHny9zY0tX23sTCoI /Vr5Oi1NoVks1Xm4miXLib6rmTQ/f2RZKm24QMqZsUefrrOniDWzhwA8gLSpMnBj aFhV+FuNquGXG1bUzotI3NJtA0E9gYHugC/7I9s4U8mXEHXnXEaMEagMS5hReJE7 9UxBCsa4XDylAyJ5tc4ggnVFA1FjokHLZqpvsVErx0y7gjFQAzE= =/78c -----END PGP SIGNATURE----- Merge tag 'drm-next-2025-12-13' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Dave Airlie: "This is the weekly fixes for what is in next tree, mostly amdgpu and some i915, panthor and a core revert. core: - revert dumb bo 8 byte alignment amdgpu: - SI fix - DC reduce stack usage - HDMI fixes - VCN 4.0.5 fix - DP MST fix - DC memory allocation fix amdkfd: - SVM fix - Trap handler fix - VGPR fixes for GC 11.5 i915: - Fix format string truncation warning - FIx runtime PM reference during fbdev BO creation panthor: - fix UAF renesas: - fix sync flag handling" * tag 'drm-next-2025-12-13' of https://gitlab.freedesktop.org/drm/kernel: Revert "drm/amd/display: Fix pbn to kbps Conversion" drm/amd: Fix unbind/rebind for VCN 4.0.5 drm/i915: Fix format string truncation warning drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation drm/amd/display: Improve HDMI info retrieval drm/amdkfd: bump minimum vgpr size for gfx1151 drm/amd/display: shrink struct members drm/amdkfd: Export the cwsr_size and ctl_stack_size to userspace drm/amd/display: Refactor dml_core_mode_support to reduce stack frame drm/amdgpu: don't attach the tlb fence for SI drm/amd/display: Use GFP_ATOMIC in dc_create_plane_state() drm/amdkfd: Trap handler support for expert scheduling mode drm/amdkfd: Use huge page size to check split svm range alignment drm/rcar-du: dsi: Handle both DRM_MODE_FLAG_N.SYNC and !DRM_MODE_FLAG_P.SYNC drm/gem-shmem: revert the 8-byte alignment constraint drm/gem-dma: revert the 8-byte alignment constraint drm/panthor: Prevent potential UAF in group creationpull/1354/merge
commit
237f1bbfe3
|
|
@ -1069,7 +1069,9 @@ amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params,
|
|||
}
|
||||
|
||||
/* Prepare a TLB flush fence to be attached to PTs */
|
||||
if (!params->unlocked) {
|
||||
if (!params->unlocked &&
|
||||
/* SI doesn't support pasid or KIQ/MES */
|
||||
params->adev->family > AMDGPU_FAMILY_SI) {
|
||||
amdgpu_vm_tlb_fence_create(params->adev, vm, fence);
|
||||
|
||||
/* Makes sure no PD/PT is freed before the flush */
|
||||
|
|
|
|||
|
|
@ -265,6 +265,8 @@ static int vcn_v4_0_5_sw_fini(struct amdgpu_ip_block *ip_block)
|
|||
if (amdgpu_sriov_vf(adev))
|
||||
amdgpu_virt_free_mm_table(adev);
|
||||
|
||||
amdgpu_vcn_sysfs_reset_mask_fini(adev);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
|
||||
r = amdgpu_vcn_suspend(adev, i);
|
||||
if (r)
|
||||
|
|
|
|||
|
|
@ -3644,14 +3644,18 @@ static const uint32_t cwsr_trap_gfx9_4_3_hex[] = {
|
|||
};
|
||||
|
||||
static const uint32_t cwsr_trap_gfx12_hex[] = {
|
||||
0xbfa00001, 0xbfa002a2,
|
||||
0xb0804009, 0xb8f8f804,
|
||||
0xbfa00001, 0xbfa002b2,
|
||||
0xb0804009, 0xb8eef81a,
|
||||
0xbf880000, 0xb980081a,
|
||||
0x00000000, 0xb8f8f804,
|
||||
0x9177ff77, 0x0c000000,
|
||||
0x846e9a6e, 0x8c776e77,
|
||||
0x9178ff78, 0x00008c00,
|
||||
0xb8fbf811, 0x8b6eff78,
|
||||
0x00004000, 0xbfa10008,
|
||||
0x8b6eff7b, 0x00000080,
|
||||
0xbfa20018, 0x8b6ea07b,
|
||||
0xbfa20042, 0xbf830010,
|
||||
0xbfa2004a, 0xbf830010,
|
||||
0xb8fbf811, 0xbfa0fffb,
|
||||
0x8b6eff7b, 0x00000bd0,
|
||||
0xbfa20010, 0xb8eef812,
|
||||
|
|
@ -3662,28 +3666,32 @@ static const uint32_t cwsr_trap_gfx12_hex[] = {
|
|||
0xf0000000, 0xbfa20005,
|
||||
0x8b6fff6f, 0x00000200,
|
||||
0xbfa20002, 0x8b6ea07b,
|
||||
0xbfa2002c, 0xbefa4d82,
|
||||
0xbfa20034, 0xbefa4d82,
|
||||
0xbf8a0000, 0x84fa887a,
|
||||
0xbf0d8f7b, 0xbfa10002,
|
||||
0x8c7bff7b, 0xffff0000,
|
||||
0xf4601bbd, 0xf8000010,
|
||||
0xbf8a0000, 0x846e976e,
|
||||
0x9177ff77, 0x00800000,
|
||||
0x8c776e77, 0xf4603bbd,
|
||||
0xf8000000, 0xbf8a0000,
|
||||
0xf4603ebd, 0xf8000008,
|
||||
0xbf8a0000, 0x8bee6e6e,
|
||||
0xbfa10001, 0xbe80486e,
|
||||
0x8b6eff6d, 0xf0000000,
|
||||
0xbfa20009, 0xb8eef811,
|
||||
0x8b6eff6e, 0x00000080,
|
||||
0xbfa20007, 0x8c78ff78,
|
||||
0x00004000, 0x80ec886c,
|
||||
0x82ed806d, 0xbfa00002,
|
||||
0x806c846c, 0x826d806d,
|
||||
0x8b6dff6d, 0x0000ffff,
|
||||
0x8bfe7e7e, 0x8bea6a6a,
|
||||
0x85788978, 0xb9783244,
|
||||
0x8b6eff77, 0x0c000000,
|
||||
0x916dff6d, 0x0c000000,
|
||||
0x8c6d6e6d, 0xf4601bbd,
|
||||
0xf8000010, 0xbf8a0000,
|
||||
0x846e976e, 0x9177ff77,
|
||||
0x00800000, 0x8c776e77,
|
||||
0xf4603bbd, 0xf8000000,
|
||||
0xbf8a0000, 0xf4603ebd,
|
||||
0xf8000008, 0xbf8a0000,
|
||||
0x8bee6e6e, 0xbfa10001,
|
||||
0xbe80486e, 0x8b6eff6d,
|
||||
0xf0000000, 0xbfa20009,
|
||||
0xb8eef811, 0x8b6eff6e,
|
||||
0x00000080, 0xbfa20007,
|
||||
0x8c78ff78, 0x00004000,
|
||||
0x80ec886c, 0x82ed806d,
|
||||
0xbfa00002, 0x806c846c,
|
||||
0x826d806d, 0x8b6dff6d,
|
||||
0x0000ffff, 0x8bfe7e7e,
|
||||
0x8bea6a6a, 0x85788978,
|
||||
0x936eff77, 0x0002001a,
|
||||
0xb96ef81a, 0xb9783244,
|
||||
0xbe804a6c, 0xb8faf802,
|
||||
0xbf0d987a, 0xbfa10001,
|
||||
0xbfb00000, 0x8b6dff6d,
|
||||
|
|
@ -3981,7 +3989,7 @@ static const uint32_t cwsr_trap_gfx12_hex[] = {
|
|||
0x008ce800, 0x00000000,
|
||||
0x807d817d, 0x8070ff70,
|
||||
0x00000080, 0xbf0a7b7d,
|
||||
0xbfa2fff7, 0xbfa0016e,
|
||||
0xbfa2fff7, 0xbfa00171,
|
||||
0xbef4007e, 0x8b75ff7f,
|
||||
0x0000ffff, 0x8c75ff75,
|
||||
0x00040000, 0xbef60080,
|
||||
|
|
@ -4163,12 +4171,14 @@ static const uint32_t cwsr_trap_gfx12_hex[] = {
|
|||
0xf8000074, 0xbf8a0000,
|
||||
0x8b6dff6d, 0x0000ffff,
|
||||
0x8bfe7e7e, 0x8bea6a6a,
|
||||
0xb97af804, 0xbe804ec2,
|
||||
0xbf94fffe, 0xbe804a6c,
|
||||
0x936eff77, 0x0002001a,
|
||||
0xb96ef81a, 0xb97af804,
|
||||
0xbe804ec2, 0xbf94fffe,
|
||||
0xbfb10000, 0xbf9f0000,
|
||||
0xbe804a6c, 0xbe804ec2,
|
||||
0xbf94fffe, 0xbfb10000,
|
||||
0xbf9f0000, 0xbf9f0000,
|
||||
0xbf9f0000, 0xbf9f0000,
|
||||
0xbf9f0000, 0x00000000,
|
||||
};
|
||||
|
||||
static const uint32_t cwsr_trap_gfx9_5_0_hex[] = {
|
||||
|
|
|
|||
|
|
@ -78,9 +78,16 @@ var SQ_WAVE_EXCP_FLAG_PRIV_RESTORE_PART_2_SHIFT = SQ_WAVE_EXCP_FLAG_PRIV_ILLEGAL
|
|||
var SQ_WAVE_EXCP_FLAG_PRIV_RESTORE_PART_2_SIZE = SQ_WAVE_EXCP_FLAG_PRIV_HOST_TRAP_SHIFT - SQ_WAVE_EXCP_FLAG_PRIV_ILLEGAL_INST_SHIFT
|
||||
var SQ_WAVE_EXCP_FLAG_PRIV_RESTORE_PART_3_SHIFT = SQ_WAVE_EXCP_FLAG_PRIV_WAVE_START_SHIFT
|
||||
var SQ_WAVE_EXCP_FLAG_PRIV_RESTORE_PART_3_SIZE = 32 - SQ_WAVE_EXCP_FLAG_PRIV_RESTORE_PART_3_SHIFT
|
||||
|
||||
var SQ_WAVE_SCHED_MODE_DEP_MODE_SHIFT = 0
|
||||
var SQ_WAVE_SCHED_MODE_DEP_MODE_SIZE = 2
|
||||
|
||||
var BARRIER_STATE_SIGNAL_OFFSET = 16
|
||||
var BARRIER_STATE_VALID_OFFSET = 0
|
||||
|
||||
var TTMP11_SCHED_MODE_SHIFT = 26
|
||||
var TTMP11_SCHED_MODE_SIZE = 2
|
||||
var TTMP11_SCHED_MODE_MASK = 0xC000000
|
||||
var TTMP11_DEBUG_TRAP_ENABLED_SHIFT = 23
|
||||
var TTMP11_DEBUG_TRAP_ENABLED_MASK = 0x800000
|
||||
|
||||
|
|
@ -160,8 +167,19 @@ L_JUMP_TO_RESTORE:
|
|||
s_branch L_RESTORE
|
||||
|
||||
L_SKIP_RESTORE:
|
||||
// Assume most relaxed scheduling mode is set. Save and revert to normal mode.
|
||||
s_getreg_b32 ttmp2, hwreg(HW_REG_WAVE_SCHED_MODE)
|
||||
s_wait_alu 0
|
||||
s_setreg_imm32_b32 hwreg(HW_REG_WAVE_SCHED_MODE, \
|
||||
SQ_WAVE_SCHED_MODE_DEP_MODE_SHIFT, SQ_WAVE_SCHED_MODE_DEP_MODE_SIZE), 0
|
||||
|
||||
s_getreg_b32 s_save_state_priv, hwreg(HW_REG_WAVE_STATE_PRIV) //save STATUS since we will change SCC
|
||||
|
||||
// Save SCHED_MODE[1:0] into ttmp11[27:26].
|
||||
s_andn2_b32 ttmp11, ttmp11, TTMP11_SCHED_MODE_MASK
|
||||
s_lshl_b32 ttmp2, ttmp2, TTMP11_SCHED_MODE_SHIFT
|
||||
s_or_b32 ttmp11, ttmp11, ttmp2
|
||||
|
||||
// Clear SPI_PRIO: do not save with elevated priority.
|
||||
// Clear ECC_ERR: prevents SQC store and triggers FATAL_HALT if setreg'd.
|
||||
s_andn2_b32 s_save_state_priv, s_save_state_priv, SQ_WAVE_STATE_PRIV_ALWAYS_CLEAR_MASK
|
||||
|
|
@ -238,6 +256,13 @@ L_FETCH_2ND_TRAP:
|
|||
s_cbranch_scc0 L_NO_SIGN_EXTEND_TMA
|
||||
s_or_b32 ttmp15, ttmp15, 0xFFFF0000
|
||||
L_NO_SIGN_EXTEND_TMA:
|
||||
#if ASIC_FAMILY == CHIP_GFX12
|
||||
// Move SCHED_MODE[1:0] from ttmp11 to unused bits in ttmp1[27:26] (return PC_HI).
|
||||
// The second-level trap will restore from ttmp1 for backwards compatibility.
|
||||
s_and_b32 ttmp2, ttmp11, TTMP11_SCHED_MODE_MASK
|
||||
s_andn2_b32 ttmp1, ttmp1, TTMP11_SCHED_MODE_MASK
|
||||
s_or_b32 ttmp1, ttmp1, ttmp2
|
||||
#endif
|
||||
|
||||
s_load_dword ttmp2, [ttmp14, ttmp15], 0x10 scope:SCOPE_SYS // debug trap enabled flag
|
||||
s_wait_idle
|
||||
|
|
@ -287,6 +312,10 @@ L_EXIT_TRAP:
|
|||
// STATE_PRIV.BARRIER_COMPLETE may have changed since we read it.
|
||||
// Only restore fields which the trap handler changes.
|
||||
s_lshr_b32 s_save_state_priv, s_save_state_priv, SQ_WAVE_STATE_PRIV_SCC_SHIFT
|
||||
|
||||
// Assume relaxed scheduling mode after this point.
|
||||
restore_sched_mode(ttmp2)
|
||||
|
||||
s_setreg_b32 hwreg(HW_REG_WAVE_STATE_PRIV, SQ_WAVE_STATE_PRIV_SCC_SHIFT, \
|
||||
SQ_WAVE_STATE_PRIV_POISON_ERR_SHIFT - SQ_WAVE_STATE_PRIV_SCC_SHIFT + 1), s_save_state_priv
|
||||
|
||||
|
|
@ -1043,6 +1072,9 @@ L_SKIP_BARRIER_RESTORE:
|
|||
s_and_b64 exec, exec, exec // Restore STATUS.EXECZ, not writable by s_setreg_b32
|
||||
s_and_b64 vcc, vcc, vcc // Restore STATUS.VCCZ, not writable by s_setreg_b32
|
||||
|
||||
// Assume relaxed scheduling mode after this point.
|
||||
restore_sched_mode(s_restore_tmp)
|
||||
|
||||
s_setreg_b32 hwreg(HW_REG_WAVE_STATE_PRIV), s_restore_state_priv // SCC is included, which is changed by previous salu
|
||||
|
||||
// Make barrier and LDS state visible to all waves in the group.
|
||||
|
|
@ -1134,3 +1166,8 @@ function valu_sgpr_hazard
|
|||
end
|
||||
#endif
|
||||
end
|
||||
|
||||
function restore_sched_mode(s_tmp)
|
||||
s_bfe_u32 s_tmp, ttmp11, (TTMP11_SCHED_MODE_SHIFT | (TTMP11_SCHED_MODE_SIZE << 0x10))
|
||||
s_setreg_b32 hwreg(HW_REG_WAVE_SCHED_MODE), s_tmp
|
||||
end
|
||||
|
|
|
|||
|
|
@ -409,6 +409,7 @@ static u32 kfd_get_vgpr_size_per_cu(u32 gfxv)
|
|||
vgpr_size = 0x80000;
|
||||
else if (gfxv == 110000 || /* GFX_VERSION_PLUM_BONITO */
|
||||
gfxv == 110001 || /* GFX_VERSION_WHEAT_NAS */
|
||||
gfxv == 110501 || /* GFX_VERSION_GFX1151 */
|
||||
gfxv == 120000 || /* GFX_VERSION_GFX1200 */
|
||||
gfxv == 120001) /* GFX_VERSION_GFX1201 */
|
||||
vgpr_size = 0x60000;
|
||||
|
|
|
|||
|
|
@ -1144,30 +1144,48 @@ static int
|
|||
svm_range_split_tail(struct svm_range *prange, uint64_t new_last,
|
||||
struct list_head *insert_list, struct list_head *remap_list)
|
||||
{
|
||||
unsigned long last_align_down = ALIGN_DOWN(prange->last, 512);
|
||||
unsigned long start_align = ALIGN(prange->start, 512);
|
||||
bool huge_page_mapping = last_align_down > start_align;
|
||||
struct svm_range *tail = NULL;
|
||||
int r = svm_range_split(prange, prange->start, new_last, &tail);
|
||||
int r;
|
||||
|
||||
if (!r) {
|
||||
list_add(&tail->list, insert_list);
|
||||
if (!IS_ALIGNED(new_last + 1, 1UL << prange->granularity))
|
||||
list_add(&tail->update_list, remap_list);
|
||||
}
|
||||
r = svm_range_split(prange, prange->start, new_last, &tail);
|
||||
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
list_add(&tail->list, insert_list);
|
||||
|
||||
if (huge_page_mapping && tail->start > start_align &&
|
||||
tail->start < last_align_down && (!IS_ALIGNED(tail->start, 512)))
|
||||
list_add(&tail->update_list, remap_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
svm_range_split_head(struct svm_range *prange, uint64_t new_start,
|
||||
struct list_head *insert_list, struct list_head *remap_list)
|
||||
{
|
||||
unsigned long last_align_down = ALIGN_DOWN(prange->last, 512);
|
||||
unsigned long start_align = ALIGN(prange->start, 512);
|
||||
bool huge_page_mapping = last_align_down > start_align;
|
||||
struct svm_range *head = NULL;
|
||||
int r = svm_range_split(prange, new_start, prange->last, &head);
|
||||
int r;
|
||||
|
||||
if (!r) {
|
||||
list_add(&head->list, insert_list);
|
||||
if (!IS_ALIGNED(new_start, 1UL << prange->granularity))
|
||||
list_add(&head->update_list, remap_list);
|
||||
}
|
||||
r = svm_range_split(prange, new_start, prange->last, &head);
|
||||
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
list_add(&head->list, insert_list);
|
||||
|
||||
if (huge_page_mapping && head->last + 1 > start_align &&
|
||||
head->last + 1 < last_align_down && (!IS_ALIGNED(head->last, 512)))
|
||||
list_add(&head->update_list, remap_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -491,6 +491,10 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,
|
|||
dev->node_props.num_sdma_queues_per_engine);
|
||||
sysfs_show_32bit_prop(buffer, offs, "num_cp_queues",
|
||||
dev->node_props.num_cp_queues);
|
||||
sysfs_show_32bit_prop(buffer, offs, "cwsr_size",
|
||||
dev->node_props.cwsr_size);
|
||||
sysfs_show_32bit_prop(buffer, offs, "ctl_stack_size",
|
||||
dev->node_props.ctl_stack_size);
|
||||
|
||||
if (dev->gpu) {
|
||||
log_max_watch_addr =
|
||||
|
|
|
|||
|
|
@ -1063,6 +1063,9 @@ int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
|
|||
void amdgpu_dm_update_connector_after_detect(
|
||||
struct amdgpu_dm_connector *aconnector);
|
||||
|
||||
void populate_hdmi_info_from_connector(struct drm_hdmi_info *info,
|
||||
struct dc_edid_caps *edid_caps);
|
||||
|
||||
extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
|
||||
|
||||
int amdgpu_dm_process_dmub_aux_transfer_sync(struct dc_context *ctx, unsigned int link_index,
|
||||
|
|
|
|||
|
|
@ -139,6 +139,9 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
|
|||
|
||||
edid_caps->edid_hdmi = connector->display_info.is_hdmi;
|
||||
|
||||
if (edid_caps->edid_hdmi)
|
||||
populate_hdmi_info_from_connector(&connector->display_info.hdmi, edid_caps);
|
||||
|
||||
apply_edid_quirks(dev, edid_buf, edid_caps);
|
||||
|
||||
sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads);
|
||||
|
|
@ -990,6 +993,11 @@ dm_helpers_read_acpi_edid(struct amdgpu_dm_connector *aconnector)
|
|||
return drm_edid_read_custom(connector, dm_helpers_probe_acpi_edid, connector);
|
||||
}
|
||||
|
||||
void populate_hdmi_info_from_connector(struct drm_hdmi_info *hdmi, struct dc_edid_caps *edid_caps)
|
||||
{
|
||||
edid_caps->scdc_present = hdmi->scdc.supported;
|
||||
}
|
||||
|
||||
enum dc_edid_status dm_helpers_read_local_edid(
|
||||
struct dc_context *ctx,
|
||||
struct dc_link *link,
|
||||
|
|
|
|||
|
|
@ -884,28 +884,26 @@ struct dsc_mst_fairness_params {
|
|||
};
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_FP)
|
||||
static uint64_t kbps_to_pbn(int kbps, bool is_peak_pbn)
|
||||
static uint16_t get_fec_overhead_multiplier(struct dc_link *dc_link)
|
||||
{
|
||||
uint64_t effective_kbps = (uint64_t)kbps;
|
||||
u8 link_coding_cap;
|
||||
uint16_t fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_8B_10B;
|
||||
|
||||
if (is_peak_pbn) { // add 0.6% (1006/1000) overhead into effective kbps
|
||||
effective_kbps *= 1006;
|
||||
effective_kbps = div_u64(effective_kbps, 1000);
|
||||
link_coding_cap = dc_link_dp_mst_decide_link_encoding_format(dc_link);
|
||||
if (link_coding_cap == DP_128b_132b_ENCODING)
|
||||
fec_overhead_multiplier_x1000 = PBN_FEC_OVERHEAD_MULTIPLIER_128B_132B;
|
||||
|
||||
return fec_overhead_multiplier_x1000;
|
||||
}
|
||||
|
||||
return (uint64_t) DIV64_U64_ROUND_UP(effective_kbps * 64, (54 * 8 * 1000));
|
||||
}
|
||||
|
||||
static uint32_t pbn_to_kbps(unsigned int pbn, bool with_margin)
|
||||
static int kbps_to_peak_pbn(int kbps, uint16_t fec_overhead_multiplier_x1000)
|
||||
{
|
||||
uint64_t pbn_effective = (uint64_t)pbn;
|
||||
u64 peak_kbps = kbps;
|
||||
|
||||
if (with_margin) // deduct 0.6% (994/1000) overhead from effective pbn
|
||||
pbn_effective *= (1000000 / PEAK_FACTOR_X1000);
|
||||
else
|
||||
pbn_effective *= 1000;
|
||||
|
||||
return DIV_U64_ROUND_UP(pbn_effective * 8 * 54, 64);
|
||||
peak_kbps *= 1006;
|
||||
peak_kbps *= fec_overhead_multiplier_x1000;
|
||||
peak_kbps = div_u64(peak_kbps, 1000 * 1000);
|
||||
return (int) DIV64_U64_ROUND_UP(peak_kbps * 64, (54 * 8 * 1000));
|
||||
}
|
||||
|
||||
static void set_dsc_configs_from_fairness_vars(struct dsc_mst_fairness_params *params,
|
||||
|
|
@ -976,7 +974,7 @@ static int bpp_x16_from_pbn(struct dsc_mst_fairness_params param, int pbn)
|
|||
dc_dsc_get_default_config_option(param.sink->ctx->dc, &dsc_options);
|
||||
dsc_options.max_target_bpp_limit_override_x16 = drm_connector->display_info.max_dsc_bpp * 16;
|
||||
|
||||
kbps = pbn_to_kbps(pbn, false);
|
||||
kbps = div_u64((u64)pbn * 994 * 8 * 54, 64);
|
||||
dc_dsc_compute_config(
|
||||
param.sink->ctx->dc->res_pool->dscs[0],
|
||||
¶m.sink->dsc_caps.dsc_dec_caps,
|
||||
|
|
@ -1005,11 +1003,12 @@ static int increase_dsc_bpp(struct drm_atomic_state *state,
|
|||
int link_timeslots_used;
|
||||
int fair_pbn_alloc;
|
||||
int ret = 0;
|
||||
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (vars[i + k].dsc_enabled) {
|
||||
initial_slack[i] =
|
||||
kbps_to_pbn(params[i].bw_range.max_kbps, false) - vars[i + k].pbn;
|
||||
kbps_to_peak_pbn(params[i].bw_range.max_kbps, fec_overhead_multiplier_x1000) - vars[i + k].pbn;
|
||||
bpp_increased[i] = false;
|
||||
remaining_to_increase += 1;
|
||||
} else {
|
||||
|
|
@ -1105,6 +1104,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
|
|||
int next_index;
|
||||
int remaining_to_try = 0;
|
||||
int ret;
|
||||
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
|
||||
int var_pbn;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
|
|
@ -1137,7 +1137,7 @@ static int try_disable_dsc(struct drm_atomic_state *state,
|
|||
|
||||
DRM_DEBUG_DRIVER("MST_DSC index #%d, try no compression\n", next_index);
|
||||
var_pbn = vars[next_index].pbn;
|
||||
vars[next_index].pbn = kbps_to_pbn(params[next_index].bw_range.stream_kbps, true);
|
||||
vars[next_index].pbn = kbps_to_peak_pbn(params[next_index].bw_range.stream_kbps, fec_overhead_multiplier_x1000);
|
||||
ret = drm_dp_atomic_find_time_slots(state,
|
||||
params[next_index].port->mgr,
|
||||
params[next_index].port,
|
||||
|
|
@ -1197,6 +1197,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
|
|||
int count = 0;
|
||||
int i, k, ret;
|
||||
bool debugfs_overwrite = false;
|
||||
uint16_t fec_overhead_multiplier_x1000 = get_fec_overhead_multiplier(dc_link);
|
||||
struct drm_connector_state *new_conn_state;
|
||||
|
||||
memset(params, 0, sizeof(params));
|
||||
|
|
@ -1277,7 +1278,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
|
|||
DRM_DEBUG_DRIVER("MST_DSC Try no compression\n");
|
||||
for (i = 0; i < count; i++) {
|
||||
vars[i + k].aconnector = params[i].aconnector;
|
||||
vars[i + k].pbn = kbps_to_pbn(params[i].bw_range.stream_kbps, false);
|
||||
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps, fec_overhead_multiplier_x1000);
|
||||
vars[i + k].dsc_enabled = false;
|
||||
vars[i + k].bpp_x16 = 0;
|
||||
ret = drm_dp_atomic_find_time_slots(state, params[i].port->mgr, params[i].port,
|
||||
|
|
@ -1299,7 +1300,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
|
|||
DRM_DEBUG_DRIVER("MST_DSC Try max compression\n");
|
||||
for (i = 0; i < count; i++) {
|
||||
if (params[i].compression_possible && params[i].clock_force_enable != DSC_CLK_FORCE_DISABLE) {
|
||||
vars[i + k].pbn = kbps_to_pbn(params[i].bw_range.min_kbps, false);
|
||||
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.min_kbps, fec_overhead_multiplier_x1000);
|
||||
vars[i + k].dsc_enabled = true;
|
||||
vars[i + k].bpp_x16 = params[i].bw_range.min_target_bpp_x16;
|
||||
ret = drm_dp_atomic_find_time_slots(state, params[i].port->mgr,
|
||||
|
|
@ -1307,7 +1308,7 @@ static int compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
} else {
|
||||
vars[i + k].pbn = kbps_to_pbn(params[i].bw_range.stream_kbps, false);
|
||||
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps, fec_overhead_multiplier_x1000);
|
||||
vars[i + k].dsc_enabled = false;
|
||||
vars[i + k].bpp_x16 = 0;
|
||||
ret = drm_dp_atomic_find_time_slots(state, params[i].port->mgr,
|
||||
|
|
@ -1762,6 +1763,18 @@ clean_exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static uint32_t kbps_from_pbn(unsigned int pbn)
|
||||
{
|
||||
uint64_t kbps = (uint64_t)pbn;
|
||||
|
||||
kbps *= (1000000 / PEAK_FACTOR_X1000);
|
||||
kbps *= 8;
|
||||
kbps *= 54;
|
||||
kbps /= 64;
|
||||
|
||||
return (uint32_t)kbps;
|
||||
}
|
||||
|
||||
static bool is_dsc_common_config_possible(struct dc_stream_state *stream,
|
||||
struct dc_dsc_bw_range *bw_range)
|
||||
{
|
||||
|
|
@ -1860,7 +1873,7 @@ enum dc_status dm_dp_mst_is_port_support_mode(
|
|||
dc_link_get_highest_encoding_format(stream->link));
|
||||
cur_link_settings = stream->link->verified_link_cap;
|
||||
root_link_bw_in_kbps = dc_link_bandwidth_kbps(aconnector->dc_link, &cur_link_settings);
|
||||
virtual_channel_bw_in_kbps = pbn_to_kbps(aconnector->mst_output_port->full_pbn, true);
|
||||
virtual_channel_bw_in_kbps = kbps_from_pbn(aconnector->mst_output_port->full_pbn);
|
||||
|
||||
/* pick the end to end bw bottleneck */
|
||||
end_to_end_bw_in_kbps = min(root_link_bw_in_kbps, virtual_channel_bw_in_kbps);
|
||||
|
|
@ -1913,7 +1926,7 @@ enum dc_status dm_dp_mst_is_port_support_mode(
|
|||
immediate_upstream_port = aconnector->mst_output_port->parent->port_parent;
|
||||
|
||||
if (immediate_upstream_port) {
|
||||
virtual_channel_bw_in_kbps = pbn_to_kbps(immediate_upstream_port->full_pbn, true);
|
||||
virtual_channel_bw_in_kbps = kbps_from_pbn(immediate_upstream_port->full_pbn);
|
||||
virtual_channel_bw_in_kbps = min(root_link_bw_in_kbps, virtual_channel_bw_in_kbps);
|
||||
} else {
|
||||
/* For topology LCT 1 case - only one mstb*/
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ uint8_t dc_plane_get_pipe_mask(struct dc_state *dc_state, const struct dc_plane
|
|||
struct dc_plane_state *dc_create_plane_state(const struct dc *dc)
|
||||
{
|
||||
struct dc_plane_state *plane_state = kvzalloc(sizeof(*plane_state),
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
|
||||
if (NULL == plane_state)
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -6711,6 +6711,76 @@ static noinline_for_stack void dml_prefetch_check(struct display_mode_lib_st *mo
|
|||
} // for j
|
||||
}
|
||||
|
||||
static noinline_for_stack void set_vm_row_and_swath_parameters(struct display_mode_lib_st *mode_lib)
|
||||
{
|
||||
struct CalculateVMRowAndSwath_params_st *CalculateVMRowAndSwath_params = &mode_lib->scratch.CalculateVMRowAndSwath_params;
|
||||
struct dml_core_mode_support_locals_st *s = &mode_lib->scratch.dml_core_mode_support_locals;
|
||||
|
||||
CalculateVMRowAndSwath_params->NumberOfActiveSurfaces = mode_lib->ms.num_active_planes;
|
||||
CalculateVMRowAndSwath_params->myPipe = s->SurfParameters;
|
||||
CalculateVMRowAndSwath_params->SurfaceSizeInMALL = mode_lib->ms.SurfaceSizeInMALL;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsLuma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_luma;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsChroma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_chroma;
|
||||
CalculateVMRowAndSwath_params->DCCMetaBufferSizeBytes = mode_lib->ms.ip.dcc_meta_buffer_size_bytes;
|
||||
CalculateVMRowAndSwath_params->UseMALLForStaticScreen = mode_lib->ms.cache_display_cfg.plane.UseMALLForStaticScreen;
|
||||
CalculateVMRowAndSwath_params->UseMALLForPStateChange = mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange;
|
||||
CalculateVMRowAndSwath_params->MALLAllocatedForDCN = mode_lib->ms.soc.mall_allocated_for_dcn_mbytes;
|
||||
CalculateVMRowAndSwath_params->SwathWidthY = mode_lib->ms.SwathWidthYThisState;
|
||||
CalculateVMRowAndSwath_params->SwathWidthC = mode_lib->ms.SwathWidthCThisState;
|
||||
CalculateVMRowAndSwath_params->GPUVMEnable = mode_lib->ms.cache_display_cfg.plane.GPUVMEnable;
|
||||
CalculateVMRowAndSwath_params->HostVMEnable = mode_lib->ms.cache_display_cfg.plane.HostVMEnable;
|
||||
CalculateVMRowAndSwath_params->HostVMMaxNonCachedPageTableLevels = mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels;
|
||||
CalculateVMRowAndSwath_params->GPUVMMaxPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels;
|
||||
CalculateVMRowAndSwath_params->GPUVMMinPageSizeKBytes = mode_lib->ms.cache_display_cfg.plane.GPUVMMinPageSizeKBytes;
|
||||
CalculateVMRowAndSwath_params->HostVMMinPageSize = mode_lib->ms.soc.hostvm_min_page_size_kbytes * 1024;
|
||||
CalculateVMRowAndSwath_params->PTEBufferModeOverrideEn = mode_lib->ms.cache_display_cfg.plane.PTEBufferModeOverrideEn;
|
||||
CalculateVMRowAndSwath_params->PTEBufferModeOverrideVal = mode_lib->ms.cache_display_cfg.plane.PTEBufferMode;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeNotExceeded = mode_lib->ms.PTEBufferSizeNotExceededPerState;
|
||||
CalculateVMRowAndSwath_params->DCCMetaBufferSizeNotExceeded = mode_lib->ms.DCCMetaBufferSizeNotExceededPerState;
|
||||
CalculateVMRowAndSwath_params->dpte_row_width_luma_ub = s->dummy_integer_array[0];
|
||||
CalculateVMRowAndSwath_params->dpte_row_width_chroma_ub = s->dummy_integer_array[1];
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_luma = mode_lib->ms.dpte_row_height;
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_chroma = mode_lib->ms.dpte_row_height_chroma;
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_linear_luma = s->dummy_integer_array[2]; // VBA_DELTA
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_linear_chroma = s->dummy_integer_array[3]; // VBA_DELTA
|
||||
CalculateVMRowAndSwath_params->meta_req_width = s->dummy_integer_array[4];
|
||||
CalculateVMRowAndSwath_params->meta_req_width_chroma = s->dummy_integer_array[5];
|
||||
CalculateVMRowAndSwath_params->meta_req_height = s->dummy_integer_array[6];
|
||||
CalculateVMRowAndSwath_params->meta_req_height_chroma = s->dummy_integer_array[7];
|
||||
CalculateVMRowAndSwath_params->meta_row_width = s->dummy_integer_array[8];
|
||||
CalculateVMRowAndSwath_params->meta_row_width_chroma = s->dummy_integer_array[9];
|
||||
CalculateVMRowAndSwath_params->meta_row_height = mode_lib->ms.meta_row_height;
|
||||
CalculateVMRowAndSwath_params->meta_row_height_chroma = mode_lib->ms.meta_row_height_chroma;
|
||||
CalculateVMRowAndSwath_params->vm_group_bytes = s->dummy_integer_array[10];
|
||||
CalculateVMRowAndSwath_params->dpte_group_bytes = mode_lib->ms.dpte_group_bytes;
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqWidthY = s->dummy_integer_array[11];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqHeightY = s->dummy_integer_array[12];
|
||||
CalculateVMRowAndSwath_params->PTERequestSizeY = s->dummy_integer_array[13];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqWidthC = s->dummy_integer_array[14];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqHeightC = s->dummy_integer_array[15];
|
||||
CalculateVMRowAndSwath_params->PTERequestSizeC = s->dummy_integer_array[16];
|
||||
CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_l = s->dummy_integer_array[17];
|
||||
CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_l = s->dummy_integer_array[18];
|
||||
CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_c = s->dummy_integer_array[19];
|
||||
CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_c = s->dummy_integer_array[20];
|
||||
CalculateVMRowAndSwath_params->PrefetchSourceLinesY = mode_lib->ms.PrefetchLinesYThisState;
|
||||
CalculateVMRowAndSwath_params->PrefetchSourceLinesC = mode_lib->ms.PrefetchLinesCThisState;
|
||||
CalculateVMRowAndSwath_params->VInitPreFillY = mode_lib->ms.PrefillY;
|
||||
CalculateVMRowAndSwath_params->VInitPreFillC = mode_lib->ms.PrefillC;
|
||||
CalculateVMRowAndSwath_params->MaxNumSwathY = mode_lib->ms.MaxNumSwY;
|
||||
CalculateVMRowAndSwath_params->MaxNumSwathC = mode_lib->ms.MaxNumSwC;
|
||||
CalculateVMRowAndSwath_params->meta_row_bw = mode_lib->ms.meta_row_bandwidth_this_state;
|
||||
CalculateVMRowAndSwath_params->dpte_row_bw = mode_lib->ms.dpte_row_bandwidth_this_state;
|
||||
CalculateVMRowAndSwath_params->PixelPTEBytesPerRow = mode_lib->ms.DPTEBytesPerRowThisState;
|
||||
CalculateVMRowAndSwath_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrameThisState;
|
||||
CalculateVMRowAndSwath_params->MetaRowByte = mode_lib->ms.MetaRowBytesThisState;
|
||||
CalculateVMRowAndSwath_params->use_one_row_for_frame = mode_lib->ms.use_one_row_for_frame_this_state;
|
||||
CalculateVMRowAndSwath_params->use_one_row_for_frame_flip = mode_lib->ms.use_one_row_for_frame_flip_this_state;
|
||||
CalculateVMRowAndSwath_params->UsesMALLForStaticScreen = s->dummy_boolean_array[0];
|
||||
CalculateVMRowAndSwath_params->PTE_BUFFER_MODE = s->dummy_boolean_array[1];
|
||||
CalculateVMRowAndSwath_params->BIGK_FRAGMENT_SIZE = s->dummy_integer_array[21];
|
||||
}
|
||||
|
||||
/// @brief The Mode Support function.
|
||||
dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)
|
||||
{
|
||||
|
|
@ -7683,69 +7753,7 @@ dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)
|
|||
s->SurfParameters[k].SwathHeightC = mode_lib->ms.SwathHeightCThisState[k];
|
||||
}
|
||||
|
||||
CalculateVMRowAndSwath_params->NumberOfActiveSurfaces = mode_lib->ms.num_active_planes;
|
||||
CalculateVMRowAndSwath_params->myPipe = s->SurfParameters;
|
||||
CalculateVMRowAndSwath_params->SurfaceSizeInMALL = mode_lib->ms.SurfaceSizeInMALL;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsLuma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_luma;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsChroma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_chroma;
|
||||
CalculateVMRowAndSwath_params->DCCMetaBufferSizeBytes = mode_lib->ms.ip.dcc_meta_buffer_size_bytes;
|
||||
CalculateVMRowAndSwath_params->UseMALLForStaticScreen = mode_lib->ms.cache_display_cfg.plane.UseMALLForStaticScreen;
|
||||
CalculateVMRowAndSwath_params->UseMALLForPStateChange = mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange;
|
||||
CalculateVMRowAndSwath_params->MALLAllocatedForDCN = mode_lib->ms.soc.mall_allocated_for_dcn_mbytes;
|
||||
CalculateVMRowAndSwath_params->SwathWidthY = mode_lib->ms.SwathWidthYThisState;
|
||||
CalculateVMRowAndSwath_params->SwathWidthC = mode_lib->ms.SwathWidthCThisState;
|
||||
CalculateVMRowAndSwath_params->GPUVMEnable = mode_lib->ms.cache_display_cfg.plane.GPUVMEnable;
|
||||
CalculateVMRowAndSwath_params->HostVMEnable = mode_lib->ms.cache_display_cfg.plane.HostVMEnable;
|
||||
CalculateVMRowAndSwath_params->HostVMMaxNonCachedPageTableLevels = mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels;
|
||||
CalculateVMRowAndSwath_params->GPUVMMaxPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels;
|
||||
CalculateVMRowAndSwath_params->GPUVMMinPageSizeKBytes = mode_lib->ms.cache_display_cfg.plane.GPUVMMinPageSizeKBytes;
|
||||
CalculateVMRowAndSwath_params->HostVMMinPageSize = mode_lib->ms.soc.hostvm_min_page_size_kbytes * 1024;
|
||||
CalculateVMRowAndSwath_params->PTEBufferModeOverrideEn = mode_lib->ms.cache_display_cfg.plane.PTEBufferModeOverrideEn;
|
||||
CalculateVMRowAndSwath_params->PTEBufferModeOverrideVal = mode_lib->ms.cache_display_cfg.plane.PTEBufferMode;
|
||||
CalculateVMRowAndSwath_params->PTEBufferSizeNotExceeded = mode_lib->ms.PTEBufferSizeNotExceededPerState;
|
||||
CalculateVMRowAndSwath_params->DCCMetaBufferSizeNotExceeded = mode_lib->ms.DCCMetaBufferSizeNotExceededPerState;
|
||||
CalculateVMRowAndSwath_params->dpte_row_width_luma_ub = s->dummy_integer_array[0];
|
||||
CalculateVMRowAndSwath_params->dpte_row_width_chroma_ub = s->dummy_integer_array[1];
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_luma = mode_lib->ms.dpte_row_height;
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_chroma = mode_lib->ms.dpte_row_height_chroma;
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_linear_luma = s->dummy_integer_array[2]; // VBA_DELTA
|
||||
CalculateVMRowAndSwath_params->dpte_row_height_linear_chroma = s->dummy_integer_array[3]; // VBA_DELTA
|
||||
CalculateVMRowAndSwath_params->meta_req_width = s->dummy_integer_array[4];
|
||||
CalculateVMRowAndSwath_params->meta_req_width_chroma = s->dummy_integer_array[5];
|
||||
CalculateVMRowAndSwath_params->meta_req_height = s->dummy_integer_array[6];
|
||||
CalculateVMRowAndSwath_params->meta_req_height_chroma = s->dummy_integer_array[7];
|
||||
CalculateVMRowAndSwath_params->meta_row_width = s->dummy_integer_array[8];
|
||||
CalculateVMRowAndSwath_params->meta_row_width_chroma = s->dummy_integer_array[9];
|
||||
CalculateVMRowAndSwath_params->meta_row_height = mode_lib->ms.meta_row_height;
|
||||
CalculateVMRowAndSwath_params->meta_row_height_chroma = mode_lib->ms.meta_row_height_chroma;
|
||||
CalculateVMRowAndSwath_params->vm_group_bytes = s->dummy_integer_array[10];
|
||||
CalculateVMRowAndSwath_params->dpte_group_bytes = mode_lib->ms.dpte_group_bytes;
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqWidthY = s->dummy_integer_array[11];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqHeightY = s->dummy_integer_array[12];
|
||||
CalculateVMRowAndSwath_params->PTERequestSizeY = s->dummy_integer_array[13];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqWidthC = s->dummy_integer_array[14];
|
||||
CalculateVMRowAndSwath_params->PixelPTEReqHeightC = s->dummy_integer_array[15];
|
||||
CalculateVMRowAndSwath_params->PTERequestSizeC = s->dummy_integer_array[16];
|
||||
CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_l = s->dummy_integer_array[17];
|
||||
CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_l = s->dummy_integer_array[18];
|
||||
CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_c = s->dummy_integer_array[19];
|
||||
CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_c = s->dummy_integer_array[20];
|
||||
CalculateVMRowAndSwath_params->PrefetchSourceLinesY = mode_lib->ms.PrefetchLinesYThisState;
|
||||
CalculateVMRowAndSwath_params->PrefetchSourceLinesC = mode_lib->ms.PrefetchLinesCThisState;
|
||||
CalculateVMRowAndSwath_params->VInitPreFillY = mode_lib->ms.PrefillY;
|
||||
CalculateVMRowAndSwath_params->VInitPreFillC = mode_lib->ms.PrefillC;
|
||||
CalculateVMRowAndSwath_params->MaxNumSwathY = mode_lib->ms.MaxNumSwY;
|
||||
CalculateVMRowAndSwath_params->MaxNumSwathC = mode_lib->ms.MaxNumSwC;
|
||||
CalculateVMRowAndSwath_params->meta_row_bw = mode_lib->ms.meta_row_bandwidth_this_state;
|
||||
CalculateVMRowAndSwath_params->dpte_row_bw = mode_lib->ms.dpte_row_bandwidth_this_state;
|
||||
CalculateVMRowAndSwath_params->PixelPTEBytesPerRow = mode_lib->ms.DPTEBytesPerRowThisState;
|
||||
CalculateVMRowAndSwath_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrameThisState;
|
||||
CalculateVMRowAndSwath_params->MetaRowByte = mode_lib->ms.MetaRowBytesThisState;
|
||||
CalculateVMRowAndSwath_params->use_one_row_for_frame = mode_lib->ms.use_one_row_for_frame_this_state;
|
||||
CalculateVMRowAndSwath_params->use_one_row_for_frame_flip = mode_lib->ms.use_one_row_for_frame_flip_this_state;
|
||||
CalculateVMRowAndSwath_params->UsesMALLForStaticScreen = s->dummy_boolean_array[0];
|
||||
CalculateVMRowAndSwath_params->PTE_BUFFER_MODE = s->dummy_boolean_array[1];
|
||||
CalculateVMRowAndSwath_params->BIGK_FRAGMENT_SIZE = s->dummy_integer_array[21];
|
||||
set_vm_row_and_swath_parameters(mode_lib);
|
||||
|
||||
CalculateVMRowAndSwath(&mode_lib->scratch,
|
||||
CalculateVMRowAndSwath_params);
|
||||
|
|
|
|||
|
|
@ -1484,9 +1484,6 @@ void build_audio_output(
|
|||
state->clk_mgr);
|
||||
}
|
||||
|
||||
audio_output->pll_info.feed_back_divider =
|
||||
pipe_ctx->pll_settings.feedback_divider;
|
||||
|
||||
audio_output->pll_info.dto_source =
|
||||
translate_to_dto_source(
|
||||
pipe_ctx->stream_res.tg->inst + 1);
|
||||
|
|
|
|||
|
|
@ -47,15 +47,15 @@ struct audio_crtc_info {
|
|||
uint32_t h_total;
|
||||
uint32_t h_active;
|
||||
uint32_t v_active;
|
||||
uint32_t pixel_repetition;
|
||||
uint32_t requested_pixel_clock_100Hz; /* in 100Hz */
|
||||
uint32_t calculated_pixel_clock_100Hz; /* in 100Hz */
|
||||
uint32_t refresh_rate;
|
||||
enum dc_color_depth color_depth;
|
||||
enum dc_pixel_encoding pixel_encoding;
|
||||
bool interlaced;
|
||||
uint32_t dsc_bits_per_pixel;
|
||||
uint32_t dsc_num_slices;
|
||||
enum dc_color_depth color_depth;
|
||||
enum dc_pixel_encoding pixel_encoding;
|
||||
uint16_t refresh_rate;
|
||||
uint8_t pixel_repetition;
|
||||
bool interlaced;
|
||||
};
|
||||
struct azalia_clock_info {
|
||||
uint32_t pixel_clock_in_10khz;
|
||||
|
|
@ -78,11 +78,9 @@ enum audio_dto_source {
|
|||
|
||||
struct audio_pll_info {
|
||||
uint32_t audio_dto_source_clock_in_khz;
|
||||
uint32_t feed_back_divider;
|
||||
uint32_t ss_percentage;
|
||||
enum audio_dto_source dto_source;
|
||||
bool ss_enabled;
|
||||
uint32_t ss_percentage;
|
||||
uint32_t ss_percentage_divider;
|
||||
};
|
||||
|
||||
struct audio_channel_associate_info {
|
||||
|
|
|
|||
|
|
@ -308,7 +308,7 @@ int drm_gem_dma_dumb_create(struct drm_file *file_priv,
|
|||
struct drm_gem_dma_object *dma_obj;
|
||||
int ret;
|
||||
|
||||
ret = drm_mode_size_dumb(drm, args, SZ_8, 0);
|
||||
ret = drm_mode_size_dumb(drm, args, 0, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -559,7 +559,7 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_mode_size_dumb(dev, args, SZ_8, 0);
|
||||
ret = drm_mode_size_dumb(dev, args, 0, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -288,13 +288,18 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
|
|||
drm_framebuffer_put(&fb->base);
|
||||
fb = NULL;
|
||||
}
|
||||
|
||||
wakeref = intel_display_rpm_get(display);
|
||||
|
||||
if (!fb || drm_WARN_ON(display->drm, !intel_fb_bo(&fb->base))) {
|
||||
drm_dbg_kms(display->drm,
|
||||
"no BIOS fb, allocating a new one\n");
|
||||
|
||||
fb = __intel_fbdev_fb_alloc(display, sizes);
|
||||
if (IS_ERR(fb))
|
||||
return PTR_ERR(fb);
|
||||
if (IS_ERR(fb)) {
|
||||
ret = PTR_ERR(fb);
|
||||
goto out_unlock;
|
||||
}
|
||||
} else {
|
||||
drm_dbg_kms(display->drm, "re-using BIOS fb\n");
|
||||
prealloc = true;
|
||||
|
|
@ -302,8 +307,6 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
|
|||
sizes->fb_height = fb->base.height;
|
||||
}
|
||||
|
||||
wakeref = intel_display_rpm_get(display);
|
||||
|
||||
/* Pin the GGTT vma for our access via info->screen_base.
|
||||
* This also validates that any existing fb inherited from the
|
||||
* BIOS is suitable for own access.
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ struct intel_memory_region {
|
|||
u16 instance;
|
||||
enum intel_region_id id;
|
||||
char name[16];
|
||||
char uabi_name[16];
|
||||
char uabi_name[20];
|
||||
bool private; /* not for userspace */
|
||||
|
||||
struct {
|
||||
|
|
|
|||
|
|
@ -779,6 +779,12 @@ struct panthor_job_profiling_data {
|
|||
*/
|
||||
#define MAX_GROUPS_PER_POOL 128
|
||||
|
||||
/*
|
||||
* Mark added on an entry of group pool Xarray to identify if the group has
|
||||
* been fully initialized and can be accessed elsewhere in the driver code.
|
||||
*/
|
||||
#define GROUP_REGISTERED XA_MARK_1
|
||||
|
||||
/**
|
||||
* struct panthor_group_pool - Group pool
|
||||
*
|
||||
|
|
@ -3007,7 +3013,7 @@ void panthor_fdinfo_gather_group_samples(struct panthor_file *pfile)
|
|||
return;
|
||||
|
||||
xa_lock(&gpool->xa);
|
||||
xa_for_each(&gpool->xa, i, group) {
|
||||
xa_for_each_marked(&gpool->xa, i, group, GROUP_REGISTERED) {
|
||||
guard(spinlock)(&group->fdinfo.lock);
|
||||
pfile->stats.cycles += group->fdinfo.data.cycles;
|
||||
pfile->stats.time += group->fdinfo.data.time;
|
||||
|
|
@ -3727,6 +3733,8 @@ int panthor_group_create(struct panthor_file *pfile,
|
|||
|
||||
group_init_task_info(group);
|
||||
|
||||
xa_set_mark(&gpool->xa, gid, GROUP_REGISTERED);
|
||||
|
||||
return gid;
|
||||
|
||||
err_erase_gid:
|
||||
|
|
@ -3744,6 +3752,9 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)
|
|||
struct panthor_scheduler *sched = ptdev->scheduler;
|
||||
struct panthor_group *group;
|
||||
|
||||
if (!xa_get_mark(&gpool->xa, group_handle, GROUP_REGISTERED))
|
||||
return -EINVAL;
|
||||
|
||||
group = xa_erase(&gpool->xa, group_handle);
|
||||
if (!group)
|
||||
return -EINVAL;
|
||||
|
|
@ -3769,12 +3780,12 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)
|
|||
}
|
||||
|
||||
static struct panthor_group *group_from_handle(struct panthor_group_pool *pool,
|
||||
u32 group_handle)
|
||||
unsigned long group_handle)
|
||||
{
|
||||
struct panthor_group *group;
|
||||
|
||||
xa_lock(&pool->xa);
|
||||
group = group_get(xa_load(&pool->xa, group_handle));
|
||||
group = group_get(xa_find(&pool->xa, &group_handle, group_handle, GROUP_REGISTERED));
|
||||
xa_unlock(&pool->xa);
|
||||
|
||||
return group;
|
||||
|
|
@ -3861,7 +3872,7 @@ panthor_fdinfo_gather_group_mem_info(struct panthor_file *pfile,
|
|||
return;
|
||||
|
||||
xa_lock(&gpool->xa);
|
||||
xa_for_each(&gpool->xa, i, group) {
|
||||
xa_for_each_marked(&gpool->xa, i, group, GROUP_REGISTERED) {
|
||||
stats->resident += group->fdinfo.kbo_sizes;
|
||||
if (group->csg_id >= 0)
|
||||
stats->active += group->fdinfo.kbo_sizes;
|
||||
|
|
|
|||
|
|
@ -492,9 +492,9 @@ static void rcar_mipi_dsi_set_display_timing(struct rcar_mipi_dsi *dsi,
|
|||
|
||||
/* Configuration for Video Parameters, input is always RGB888 */
|
||||
vprmset0r = TXVMVPRMSET0R_BPP_24;
|
||||
if (mode->flags & DRM_MODE_FLAG_NVSYNC)
|
||||
if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
|
||||
vprmset0r |= TXVMVPRMSET0R_VSPOL_LOW;
|
||||
if (mode->flags & DRM_MODE_FLAG_NHSYNC)
|
||||
if (!(mode->flags & DRM_MODE_FLAG_PHSYNC))
|
||||
vprmset0r |= TXVMVPRMSET0R_HSPOL_LOW;
|
||||
|
||||
vprmset1r = TXVMVPRMSET1R_VACTIVE(mode->vdisplay)
|
||||
|
|
|
|||
Loading…
Reference in New Issue