mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
drm fixes for 7.0-rc6
loognsoon: - update MAINTAINERS shmem: - fault handler fix syncobj: - fix GFP flags amdgpu: - DSC fix - Module parameter parsing fix - PASID reuse fix - drm_edid leak fix - SMU 13.x fixes - SMU 14.x fix - Fence fix in amdgpu_amdkfd_submit_ib() - LVDS fixes - GPU page fault fix for non-4K pages amdkfd: - Ordering fix in kfd_ioctl_create_process() i915/display: - DP tunnel error handling fix - Spurious GMBUS timeout fix - Unlink NV12 planes earlier - Order OP vs. timeout correctly in __wait_for() xe: - Fix UAF in SRIOV migration restore - Updates to HW W/a - VMBind remap fix ivpu: - poweroff fix mediatek: - fix register ordering -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmnG/8IACgkQDHTzWXnE hr4FHQ/8Cfmk3McVy5toN3z0TsW15DuFUi6dhEo94gZzVLEH+VLV/EcnJDozA7sP oXUmp2YoEZ6WJ9cmLW1nwA/MozUbBPu9ED7pHXSKzM0DH7gTerGBazS+cnmw0Fx9 4HTP668BHR+CAQazXUwQ60/7CpqMYKaAxwzKZTxIkGEnkaqfnE0Ssg6J73b7UN2r BGS3akKp+urkFCmAG3e7ccMbGPdXxe65p/He0Dh3z8jtC3KmINemDVLYhXlRZukR /YBnOAbesTi1gOjwzGCitObovAsiu46o4LA1++OHOGJpk6M/xd+2hhrQambKVKxt hwFEkbIu+wkOCdZnGt8DIE9BYzLdjgS5u28BLB/HSgePNbqNCvDzFMVRuLK5HC+o tvwIe2z8XGvEPw9SA14+YECuunN08exmHQMnULh8lre7M2c+RdGGW72UMt3abWKZ rK8oCD/BzVZYotyu0Df7K9+A8MmbSOSgOBRSBZM6V7qetHsnoHvkhtaf67cKNmAG OqzCkyMH/XVaAfL2FZqdKZ4klZccQR2Xb39CtFJnJnrAWO70xDpVJZgdEmbs961s LbulrybOwJIlDlzvs3303TIOHegK+DXth4qGrvaMD9CDR5G00uDpVV+6q+DBJIe5 aR0GSx7YISemLIWC2wTa7zdJ8RslmxhowflBro2ypeGY9cMy9jA= =B3Cp -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2026-03-28-1' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Dave Airlie: "Weekly fixes, still a bit busy, but the usual suspects amdgpu and i915/xe have a bunch of small fixes, and otherwise it's just a few minor driver fixes. loognsoon: - update MAINTAINERS shmem: - fault handler fix syncobj: - fix GFP flags amdgpu: - DSC fix - Module parameter parsing fix - PASID reuse fix - drm_edid leak fix - SMU 13.x fixes - SMU 14.x fix - Fence fix in amdgpu_amdkfd_submit_ib() - LVDS fixes - GPU page fault fix for non-4K pages amdkfd: - Ordering fix in kfd_ioctl_create_process() i915/display: - DP tunnel error handling fix - Spurious GMBUS timeout fix - Unlink NV12 planes earlier - Order OP vs. timeout correctly in __wait_for() xe: - Fix UAF in SRIOV migration restore - Updates to HW W/a - VMBind remap fix ivpu: - poweroff fix mediatek: - fix register ordering" * tag 'drm-fixes-2026-03-28-1' of https://gitlab.freedesktop.org/drm/kernel: (25 commits) MAINTAINERS: Update GPU driver maintainer information drm/xe: always keep track of remap prev/next drm/syncobj: Fix xa_alloc allocation flags drm/amd/display: Fix DCE LVDS handling drm/amdgpu: Handle GPU page faults correctly on non-4K page systems drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid for smu v14 drm/amdkfd: Fix NULL pointer check order in kfd_ioctl_create_process drm/amd/display: check if ext_caps is valid in BL setup drm/amdgpu: Fix fence put before wait in amdgpu_amdkfd_submit_ib drm/xe: Implement recent spec updates to Wa_16025250150 accel/ivpu: Add disable clock relinquish workaround for NVL-A0 drm/i915/dp_tunnel: Fix error handling when clearing stream BW in atomic state drm/amd/pm: disable OD_FAN_CURVE if temp or pwm range invalid for smu v13 drm/amd/pm: Return -EOPNOTSUPP for unsupported OD_MCLK on smu_v13_0_6 drm/amd/pm: Skip redundant UCLK restore in smu_v13_0_6 drm/amd/display: Fix drm_edid leak in amdgpu_dm drm/amdgpu: prevent immediate PASID reuse case drm/amdgpu: fix strsep() corrupting lockup_timeout on multi-GPU (v3) drm/amd/display: Do not skip unrelated mode changes in DSC validation drm/xe/pf: Fix use-after-free in migration restore ...
This commit is contained in:
commit
26df51adf3
|
|
@ -8628,8 +8628,14 @@ F: drivers/gpu/drm/lima/
|
|||
F: include/uapi/drm/lima_drm.h
|
||||
|
||||
DRM DRIVERS FOR LOONGSON
|
||||
M: Jianmin Lv <lvjianmin@loongson.cn>
|
||||
M: Qianhai Wu <wuqianhai@loongson.cn>
|
||||
R: Huacai Chen <chenhuacai@kernel.org>
|
||||
R: Mingcong Bai <jeffbai@aosc.io>
|
||||
R: Xi Ruoyao <xry111@xry111.site>
|
||||
R: Icenowy Zheng <zhengxingda@iscas.ac.cn>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Orphan
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/loongson/
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#define IVPU_HW_IP_60XX 60
|
||||
|
||||
#define IVPU_HW_IP_REV_LNL_B0 4
|
||||
#define IVPU_HW_IP_REV_NVL_A0 0
|
||||
|
||||
#define IVPU_HW_BTRS_MTL 1
|
||||
#define IVPU_HW_BTRS_LNL 2
|
||||
|
|
|
|||
|
|
@ -70,8 +70,10 @@ static void wa_init(struct ivpu_device *vdev)
|
|||
if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
|
||||
vdev->wa.interrupt_clear_with_0 = ivpu_hw_btrs_irqs_clear_with_0_mtl(vdev);
|
||||
|
||||
if (ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
|
||||
ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0)
|
||||
if ((ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
|
||||
ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0) ||
|
||||
(ivpu_device_id(vdev) == PCI_DEVICE_ID_NVL &&
|
||||
ivpu_revision(vdev) == IVPU_HW_IP_REV_NVL_A0))
|
||||
vdev->wa.disable_clock_relinquish = true;
|
||||
|
||||
if (ivpu_test_mode & IVPU_TEST_MODE_CLK_RELINQ_ENABLE)
|
||||
|
|
|
|||
|
|
@ -692,9 +692,9 @@ int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,
|
|||
goto err_ib_sched;
|
||||
}
|
||||
|
||||
/* Drop the initial kref_init count (see drm_sched_main as example) */
|
||||
dma_fence_put(f);
|
||||
ret = dma_fence_wait(f, false);
|
||||
/* Drop the returned fence reference after the wait completes */
|
||||
dma_fence_put(f);
|
||||
|
||||
err_ib_sched:
|
||||
amdgpu_job_free(job);
|
||||
|
|
|
|||
|
|
@ -4207,7 +4207,8 @@ static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
|
|||
|
||||
static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)
|
||||
{
|
||||
char *input = amdgpu_lockup_timeout;
|
||||
char buf[AMDGPU_MAX_TIMEOUT_PARAM_LENGTH];
|
||||
char *input = buf;
|
||||
char *timeout_setting = NULL;
|
||||
int index = 0;
|
||||
long timeout;
|
||||
|
|
@ -4217,9 +4218,17 @@ static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)
|
|||
adev->gfx_timeout = adev->compute_timeout = adev->sdma_timeout =
|
||||
adev->video_timeout = msecs_to_jiffies(2000);
|
||||
|
||||
if (!strnlen(input, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH))
|
||||
if (!strnlen(amdgpu_lockup_timeout, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* strsep() destructively modifies its input by replacing delimiters
|
||||
* with '\0'. Use a stack copy so the global module parameter buffer
|
||||
* remains intact for multi-GPU systems where this function is called
|
||||
* once per device.
|
||||
*/
|
||||
strscpy(buf, amdgpu_lockup_timeout, sizeof(buf));
|
||||
|
||||
while ((timeout_setting = strsep(&input, ",")) &&
|
||||
strnlen(timeout_setting, AMDGPU_MAX_TIMEOUT_PARAM_LENGTH)) {
|
||||
ret = kstrtol(timeout_setting, 0, &timeout);
|
||||
|
|
|
|||
|
|
@ -35,10 +35,13 @@
|
|||
* PASIDs are global address space identifiers that can be shared
|
||||
* between the GPU, an IOMMU and the driver. VMs on different devices
|
||||
* may use the same PASID if they share the same address
|
||||
* space. Therefore PASIDs are allocated using a global IDA. VMs are
|
||||
* looked up from the PASID per amdgpu_device.
|
||||
* space. Therefore PASIDs are allocated using IDR cyclic allocator
|
||||
* (similar to kernel PID allocation) which naturally delays reuse.
|
||||
* VMs are looked up from the PASID per amdgpu_device.
|
||||
*/
|
||||
static DEFINE_IDA(amdgpu_pasid_ida);
|
||||
|
||||
static DEFINE_IDR(amdgpu_pasid_idr);
|
||||
static DEFINE_SPINLOCK(amdgpu_pasid_idr_lock);
|
||||
|
||||
/* Helper to free pasid from a fence callback */
|
||||
struct amdgpu_pasid_cb {
|
||||
|
|
@ -50,8 +53,8 @@ struct amdgpu_pasid_cb {
|
|||
* amdgpu_pasid_alloc - Allocate a PASID
|
||||
* @bits: Maximum width of the PASID in bits, must be at least 1
|
||||
*
|
||||
* Allocates a PASID of the given width while keeping smaller PASIDs
|
||||
* available if possible.
|
||||
* Uses kernel's IDR cyclic allocator (same as PID allocation).
|
||||
* Allocates sequentially with automatic wrap-around.
|
||||
*
|
||||
* Returns a positive integer on success. Returns %-EINVAL if bits==0.
|
||||
* Returns %-ENOSPC if no PASID was available. Returns %-ENOMEM on
|
||||
|
|
@ -59,14 +62,15 @@ struct amdgpu_pasid_cb {
|
|||
*/
|
||||
int amdgpu_pasid_alloc(unsigned int bits)
|
||||
{
|
||||
int pasid = -EINVAL;
|
||||
int pasid;
|
||||
|
||||
for (bits = min(bits, 31U); bits > 0; bits--) {
|
||||
pasid = ida_alloc_range(&amdgpu_pasid_ida, 1U << (bits - 1),
|
||||
(1U << bits) - 1, GFP_KERNEL);
|
||||
if (pasid != -ENOSPC)
|
||||
break;
|
||||
}
|
||||
if (bits == 0)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&amdgpu_pasid_idr_lock);
|
||||
pasid = idr_alloc_cyclic(&amdgpu_pasid_idr, NULL, 1,
|
||||
1U << bits, GFP_KERNEL);
|
||||
spin_unlock(&amdgpu_pasid_idr_lock);
|
||||
|
||||
if (pasid >= 0)
|
||||
trace_amdgpu_pasid_allocated(pasid);
|
||||
|
|
@ -81,7 +85,10 @@ int amdgpu_pasid_alloc(unsigned int bits)
|
|||
void amdgpu_pasid_free(u32 pasid)
|
||||
{
|
||||
trace_amdgpu_pasid_freed(pasid);
|
||||
ida_free(&amdgpu_pasid_ida, pasid);
|
||||
|
||||
spin_lock(&amdgpu_pasid_idr_lock);
|
||||
idr_remove(&amdgpu_pasid_idr, pasid);
|
||||
spin_unlock(&amdgpu_pasid_idr_lock);
|
||||
}
|
||||
|
||||
static void amdgpu_pasid_free_cb(struct dma_fence *fence,
|
||||
|
|
@ -616,3 +623,15 @@ void amdgpu_vmid_mgr_fini(struct amdgpu_device *adev)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_pasid_mgr_cleanup - cleanup PASID manager
|
||||
*
|
||||
* Cleanup the IDR allocator.
|
||||
*/
|
||||
void amdgpu_pasid_mgr_cleanup(void)
|
||||
{
|
||||
spin_lock(&amdgpu_pasid_idr_lock);
|
||||
idr_destroy(&amdgpu_pasid_idr);
|
||||
spin_unlock(&amdgpu_pasid_idr_lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ int amdgpu_pasid_alloc(unsigned int bits);
|
|||
void amdgpu_pasid_free(u32 pasid);
|
||||
void amdgpu_pasid_free_delayed(struct dma_resv *resv,
|
||||
u32 pasid);
|
||||
void amdgpu_pasid_mgr_cleanup(void);
|
||||
|
||||
bool amdgpu_vmid_had_gpu_reset(struct amdgpu_device *adev,
|
||||
struct amdgpu_vmid *id);
|
||||
|
|
|
|||
|
|
@ -2898,6 +2898,7 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
|
|||
xa_destroy(&adev->vm_manager.pasids);
|
||||
|
||||
amdgpu_vmid_mgr_fini(adev);
|
||||
amdgpu_pasid_mgr_cleanup();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2973,14 +2974,14 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
|
|||
if (!root)
|
||||
return false;
|
||||
|
||||
addr /= AMDGPU_GPU_PAGE_SIZE;
|
||||
|
||||
if (is_compute_context && !svm_range_restore_pages(adev, pasid, vmid,
|
||||
node_id, addr, ts, write_fault)) {
|
||||
node_id, addr >> PAGE_SHIFT, ts, write_fault)) {
|
||||
amdgpu_bo_unref(&root);
|
||||
return true;
|
||||
}
|
||||
|
||||
addr /= AMDGPU_GPU_PAGE_SIZE;
|
||||
|
||||
r = amdgpu_bo_reserve(root, true);
|
||||
if (r)
|
||||
goto error_unref;
|
||||
|
|
|
|||
|
|
@ -3170,11 +3170,11 @@ static int kfd_ioctl_create_process(struct file *filep, struct kfd_process *p, v
|
|||
struct kfd_process *process;
|
||||
int ret;
|
||||
|
||||
/* Each FD owns only one kfd_process */
|
||||
if (p->context_id != KFD_CONTEXT_ID_PRIMARY)
|
||||
if (!filep->private_data || !p)
|
||||
return -EINVAL;
|
||||
|
||||
if (!filep->private_data || !p)
|
||||
/* Each FD owns only one kfd_process */
|
||||
if (p->context_id != KFD_CONTEXT_ID_PRIMARY)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&kfd_processes_mutex);
|
||||
|
|
|
|||
|
|
@ -3909,8 +3909,9 @@ void amdgpu_dm_update_connector_after_detect(
|
|||
|
||||
aconnector->dc_sink = sink;
|
||||
dc_sink_retain(aconnector->dc_sink);
|
||||
drm_edid_free(aconnector->drm_edid);
|
||||
aconnector->drm_edid = NULL;
|
||||
if (sink->dc_edid.length == 0) {
|
||||
aconnector->drm_edid = NULL;
|
||||
hdmi_cec_unset_edid(aconnector);
|
||||
if (aconnector->dc_link->aux_mode) {
|
||||
drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
|
||||
|
|
@ -5422,7 +5423,7 @@ static void setup_backlight_device(struct amdgpu_display_manager *dm,
|
|||
caps = &dm->backlight_caps[aconnector->bl_idx];
|
||||
|
||||
/* Only offer ABM property when non-OLED and user didn't turn off by module parameter */
|
||||
if (!caps->ext_caps->bits.oled && amdgpu_dm_abm_level < 0)
|
||||
if (caps->ext_caps && !caps->ext_caps->bits.oled && amdgpu_dm_abm_level < 0)
|
||||
drm_object_attach_property(&aconnector->base.base,
|
||||
dm->adev->mode_info.abm_level_property,
|
||||
ABM_SYSFS_CONTROL);
|
||||
|
|
@ -12523,6 +12524,11 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
|
|||
}
|
||||
|
||||
if (dc_resource_is_dsc_encoding_supported(dc)) {
|
||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||
dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
|
||||
dm_new_crtc_state->mode_changed_independent_from_dsc = new_crtc_state->mode_changed;
|
||||
}
|
||||
|
||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
|
||||
ret = add_affected_mst_dsc_crtcs(state, crtc);
|
||||
|
|
|
|||
|
|
@ -984,6 +984,7 @@ struct dm_crtc_state {
|
|||
|
||||
bool freesync_vrr_info_changed;
|
||||
|
||||
bool mode_changed_independent_from_dsc;
|
||||
bool dsc_force_changed;
|
||||
bool vrr_supported;
|
||||
struct mod_freesync_config freesync_config;
|
||||
|
|
|
|||
|
|
@ -1744,9 +1744,11 @@ int pre_validate_dsc(struct drm_atomic_state *state,
|
|||
int ind = find_crtc_index_in_state_by_stream(state, stream);
|
||||
|
||||
if (ind >= 0) {
|
||||
struct dm_crtc_state *dm_new_crtc_state = to_dm_crtc_state(state->crtcs[ind].new_state);
|
||||
|
||||
DRM_INFO_ONCE("%s:%d MST_DSC no mode changed for stream 0x%p\n",
|
||||
__func__, __LINE__, stream);
|
||||
state->crtcs[ind].new_state->mode_changed = 0;
|
||||
dm_new_crtc_state->base.mode_changed = dm_new_crtc_state->mode_changed_independent_from_dsc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -650,9 +650,6 @@ static struct link_encoder *dce100_link_encoder_create(
|
|||
return &enc110->base;
|
||||
}
|
||||
|
||||
if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
|
||||
|
||||
|
|
@ -661,7 +658,8 @@ static struct link_encoder *dce100_link_encoder_create(
|
|||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
return &enc110->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -671,7 +671,7 @@ static struct link_encoder *dce110_link_encoder_create(
|
|||
kzalloc_obj(struct dce110_link_encoder);
|
||||
int link_regs_id;
|
||||
|
||||
if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
if (!enc110)
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
|
|
@ -682,7 +682,8 @@ static struct link_encoder *dce110_link_encoder_create(
|
|||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
return &enc110->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -632,7 +632,7 @@ static struct link_encoder *dce112_link_encoder_create(
|
|||
kzalloc_obj(struct dce110_link_encoder);
|
||||
int link_regs_id;
|
||||
|
||||
if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
if (!enc110)
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
|
|
@ -643,7 +643,8 @@ static struct link_encoder *dce112_link_encoder_create(
|
|||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
return &enc110->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -716,7 +716,7 @@ static struct link_encoder *dce120_link_encoder_create(
|
|||
kzalloc_obj(struct dce110_link_encoder);
|
||||
int link_regs_id;
|
||||
|
||||
if (!enc110 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
if (!enc110)
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
|
|
@ -727,7 +727,8 @@ static struct link_encoder *dce120_link_encoder_create(
|
|||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
|
||||
return &enc110->base;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -746,18 +746,16 @@ static struct link_encoder *dce60_link_encoder_create(
|
|||
return &enc110->base;
|
||||
}
|
||||
|
||||
if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
|
||||
|
||||
dce60_link_encoder_construct(enc110,
|
||||
enc_init_data,
|
||||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data,
|
||||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
return &enc110->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -752,9 +752,6 @@ static struct link_encoder *dce80_link_encoder_create(
|
|||
return &enc110->base;
|
||||
}
|
||||
|
||||
if (enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
|
||||
return NULL;
|
||||
|
||||
link_regs_id =
|
||||
map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
|
||||
|
||||
|
|
@ -763,7 +760,8 @@ static struct link_encoder *dce80_link_encoder_create(
|
|||
&link_enc_feature,
|
||||
&link_enc_regs[link_regs_id],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs) ?
|
||||
NULL : &link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
return &enc110->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@
|
|||
|
||||
#define to_amdgpu_device(x) (container_of(x, struct amdgpu_device, pm.smu_i2c))
|
||||
|
||||
static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
|
||||
int od_feature_bit,
|
||||
int32_t *min, int32_t *max);
|
||||
|
||||
static const struct smu_feature_bits smu_v13_0_0_dpm_features = {
|
||||
.bits = {
|
||||
SMU_FEATURE_BIT_INIT(FEATURE_DPM_GFXCLK_BIT),
|
||||
|
|
@ -1043,8 +1047,35 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu,
|
|||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||
const OverDriveLimits_t * const overdrive_upperlimits =
|
||||
&pptable->SkuTable.OverDriveLimitsBasicMax;
|
||||
int32_t min_value, max_value;
|
||||
bool feature_enabled;
|
||||
|
||||
return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit);
|
||||
switch (od_feature_bit) {
|
||||
case PP_OD_FEATURE_FAN_CURVE_BIT:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
if (feature_enabled) {
|
||||
smu_v13_0_0_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_TEMP,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
|
||||
smu_v13_0_0_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_PWM,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return feature_enabled;
|
||||
}
|
||||
|
||||
static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
|
||||
|
|
|
|||
|
|
@ -1391,7 +1391,7 @@ static int smu_v13_0_6_emit_clk_levels(struct smu_context *smu,
|
|||
break;
|
||||
case SMU_OD_MCLK:
|
||||
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(SET_UCLK_MAX)))
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
size += sysfs_emit_at(buf, size, "%s:\n", "OD_MCLK");
|
||||
size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n",
|
||||
|
|
@ -2122,6 +2122,7 @@ static int smu_v13_0_6_usr_edit_dpm_table(struct smu_context *smu,
|
|||
{
|
||||
struct smu_dpm_context *smu_dpm = &(smu->smu_dpm);
|
||||
struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context;
|
||||
struct smu_dpm_table *uclk_table = &dpm_context->dpm_tables.uclk_table;
|
||||
struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
|
||||
uint32_t min_clk;
|
||||
uint32_t max_clk;
|
||||
|
|
@ -2221,14 +2222,16 @@ static int smu_v13_0_6_usr_edit_dpm_table(struct smu_context *smu,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
min_clk = SMU_DPM_TABLE_MIN(
|
||||
&dpm_context->dpm_tables.uclk_table);
|
||||
max_clk = SMU_DPM_TABLE_MAX(
|
||||
&dpm_context->dpm_tables.uclk_table);
|
||||
ret = smu_v13_0_6_set_soft_freq_limited_range(
|
||||
smu, SMU_UCLK, min_clk, max_clk, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (SMU_DPM_TABLE_MAX(uclk_table) !=
|
||||
pstate_table->uclk_pstate.curr.max) {
|
||||
min_clk = SMU_DPM_TABLE_MIN(&dpm_context->dpm_tables.uclk_table);
|
||||
max_clk = SMU_DPM_TABLE_MAX(&dpm_context->dpm_tables.uclk_table);
|
||||
ret = smu_v13_0_6_set_soft_freq_limited_range(smu,
|
||||
SMU_UCLK, min_clk,
|
||||
max_clk, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
smu_v13_0_reset_custom_level(smu);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@
|
|||
|
||||
#define to_amdgpu_device(x) (container_of(x, struct amdgpu_device, pm.smu_i2c))
|
||||
|
||||
static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
|
||||
int od_feature_bit,
|
||||
int32_t *min, int32_t *max);
|
||||
|
||||
static const struct smu_feature_bits smu_v13_0_7_dpm_features = {
|
||||
.bits = {
|
||||
SMU_FEATURE_BIT_INIT(FEATURE_DPM_GFXCLK_BIT),
|
||||
|
|
@ -1053,8 +1057,35 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu,
|
|||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||
const OverDriveLimits_t * const overdrive_upperlimits =
|
||||
&pptable->SkuTable.OverDriveLimitsBasicMax;
|
||||
int32_t min_value, max_value;
|
||||
bool feature_enabled;
|
||||
|
||||
return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit);
|
||||
switch (od_feature_bit) {
|
||||
case PP_OD_FEATURE_FAN_CURVE_BIT:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
if (feature_enabled) {
|
||||
smu_v13_0_7_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_TEMP,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
|
||||
smu_v13_0_7_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_PWM,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return feature_enabled;
|
||||
}
|
||||
|
||||
static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
|
||||
|
|
|
|||
|
|
@ -56,6 +56,10 @@
|
|||
|
||||
#define to_amdgpu_device(x) (container_of(x, struct amdgpu_device, pm.smu_i2c))
|
||||
|
||||
static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
|
||||
int od_feature_bit,
|
||||
int32_t *min, int32_t *max);
|
||||
|
||||
static const struct smu_feature_bits smu_v14_0_2_dpm_features = {
|
||||
.bits = { SMU_FEATURE_BIT_INIT(FEATURE_DPM_GFXCLK_BIT),
|
||||
SMU_FEATURE_BIT_INIT(FEATURE_DPM_UCLK_BIT),
|
||||
|
|
@ -922,8 +926,35 @@ static bool smu_v14_0_2_is_od_feature_supported(struct smu_context *smu,
|
|||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||
const OverDriveLimits_t * const overdrive_upperlimits =
|
||||
&pptable->SkuTable.OverDriveLimitsBasicMax;
|
||||
int32_t min_value, max_value;
|
||||
bool feature_enabled;
|
||||
|
||||
return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit);
|
||||
switch (od_feature_bit) {
|
||||
case PP_OD_FEATURE_FAN_CURVE_BIT:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
if (feature_enabled) {
|
||||
smu_v14_0_2_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_TEMP,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
|
||||
smu_v14_0_2_get_od_setting_limits(smu, PP_OD_FEATURE_FAN_CURVE_PWM,
|
||||
&min_value, &max_value);
|
||||
if (!min_value && !max_value) {
|
||||
feature_enabled = false;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
feature_enabled = !!(overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit));
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return feature_enabled;
|
||||
}
|
||||
|
||||
static void smu_v14_0_2_get_od_setting_limits(struct smu_context *smu,
|
||||
|
|
|
|||
|
|
@ -550,27 +550,27 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);
|
||||
|
||||
static bool drm_gem_shmem_try_map_pmd(struct vm_fault *vmf, unsigned long addr,
|
||||
struct page *page)
|
||||
static vm_fault_t try_insert_pfn(struct vm_fault *vmf, unsigned int order,
|
||||
unsigned long pfn)
|
||||
{
|
||||
if (!order) {
|
||||
return vmf_insert_pfn(vmf->vma, vmf->address, pfn);
|
||||
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
unsigned long paddr = pfn << PAGE_SHIFT;
|
||||
bool aligned = (addr & ~PMD_MASK) == (paddr & ~PMD_MASK);
|
||||
} else if (order == PMD_ORDER) {
|
||||
unsigned long paddr = pfn << PAGE_SHIFT;
|
||||
bool aligned = (vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK);
|
||||
|
||||
if (aligned &&
|
||||
pmd_none(*vmf->pmd) &&
|
||||
folio_test_pmd_mappable(page_folio(page))) {
|
||||
pfn &= PMD_MASK >> PAGE_SHIFT;
|
||||
if (vmf_insert_pfn_pmd(vmf, pfn, false) == VM_FAULT_NOPAGE)
|
||||
return true;
|
||||
}
|
||||
if (aligned &&
|
||||
folio_test_pmd_mappable(page_folio(pfn_to_page(pfn)))) {
|
||||
pfn &= PMD_MASK >> PAGE_SHIFT;
|
||||
return vmf_insert_pfn_pmd(vmf, pfn, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
return VM_FAULT_FALLBACK;
|
||||
}
|
||||
|
||||
static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
|
||||
static vm_fault_t drm_gem_shmem_any_fault(struct vm_fault *vmf, unsigned int order)
|
||||
{
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
struct drm_gem_object *obj = vma->vm_private_data;
|
||||
|
|
@ -581,6 +581,9 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
|
|||
pgoff_t page_offset;
|
||||
unsigned long pfn;
|
||||
|
||||
if (order && order != PMD_ORDER)
|
||||
return VM_FAULT_FALLBACK;
|
||||
|
||||
/* Offset to faulty address in the VMA. */
|
||||
page_offset = vmf->pgoff - vma->vm_pgoff;
|
||||
|
||||
|
|
@ -593,13 +596,8 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (drm_gem_shmem_try_map_pmd(vmf, vmf->address, pages[page_offset])) {
|
||||
ret = VM_FAULT_NOPAGE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pfn = page_to_pfn(pages[page_offset]);
|
||||
ret = vmf_insert_pfn(vma, vmf->address, pfn);
|
||||
ret = try_insert_pfn(vmf, order, pfn);
|
||||
|
||||
out:
|
||||
dma_resv_unlock(shmem->base.resv);
|
||||
|
|
@ -607,6 +605,11 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
|
||||
{
|
||||
return drm_gem_shmem_any_fault(vmf, 0);
|
||||
}
|
||||
|
||||
static void drm_gem_shmem_vm_open(struct vm_area_struct *vma)
|
||||
{
|
||||
struct drm_gem_object *obj = vma->vm_private_data;
|
||||
|
|
@ -643,6 +646,9 @@ static void drm_gem_shmem_vm_close(struct vm_area_struct *vma)
|
|||
|
||||
const struct vm_operations_struct drm_gem_shmem_vm_ops = {
|
||||
.fault = drm_gem_shmem_fault,
|
||||
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
|
||||
.huge_fault = drm_gem_shmem_any_fault,
|
||||
#endif
|
||||
.open = drm_gem_shmem_vm_open,
|
||||
.close = drm_gem_shmem_vm_close,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -602,7 +602,7 @@ int drm_syncobj_get_handle(struct drm_file *file_private,
|
|||
drm_syncobj_get(syncobj);
|
||||
|
||||
ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
|
||||
GFP_NOWAIT);
|
||||
GFP_KERNEL);
|
||||
if (ret)
|
||||
drm_syncobj_put(syncobj);
|
||||
|
||||
|
|
@ -716,7 +716,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
|
|||
drm_syncobj_get(syncobj);
|
||||
|
||||
ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b,
|
||||
GFP_NOWAIT);
|
||||
GFP_KERNEL);
|
||||
if (ret)
|
||||
drm_syncobj_put(syncobj);
|
||||
|
||||
|
|
|
|||
|
|
@ -4602,6 +4602,7 @@ intel_crtc_prepare_cleared_state(struct intel_atomic_state *state,
|
|||
struct intel_crtc_state *crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
struct intel_crtc_state *saved_state;
|
||||
int err;
|
||||
|
||||
saved_state = intel_crtc_state_alloc(crtc);
|
||||
if (!saved_state)
|
||||
|
|
@ -4610,7 +4611,12 @@ intel_crtc_prepare_cleared_state(struct intel_atomic_state *state,
|
|||
/* free the old crtc_state->hw members */
|
||||
intel_crtc_free_hw_state(crtc_state);
|
||||
|
||||
intel_dp_tunnel_atomic_clear_stream_bw(state, crtc_state);
|
||||
err = intel_dp_tunnel_atomic_clear_stream_bw(state, crtc_state);
|
||||
if (err) {
|
||||
kfree(saved_state);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* FIXME: before the switch to atomic started, a new pipe_config was
|
||||
* kzalloc'd. Code that depends on any field being zero should be
|
||||
|
|
|
|||
|
|
@ -621,19 +621,27 @@ int intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state,
|
|||
*
|
||||
* Clear any DP tunnel stream BW requirement set by
|
||||
* intel_dp_tunnel_atomic_compute_stream_bw().
|
||||
*
|
||||
* Returns 0 in case of success, a negative error code otherwise.
|
||||
*/
|
||||
void intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
int intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
int err;
|
||||
|
||||
if (!crtc_state->dp_tunnel_ref.tunnel)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
err = drm_dp_tunnel_atomic_set_stream_bw(&state->base,
|
||||
crtc_state->dp_tunnel_ref.tunnel,
|
||||
crtc->pipe, 0);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
drm_dp_tunnel_atomic_set_stream_bw(&state->base,
|
||||
crtc_state->dp_tunnel_ref.tunnel,
|
||||
crtc->pipe, 0);
|
||||
drm_dp_tunnel_ref_put(&crtc_state->dp_tunnel_ref);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ int intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state,
|
|||
struct intel_dp *intel_dp,
|
||||
const struct intel_connector *connector,
|
||||
struct intel_crtc_state *crtc_state);
|
||||
void intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state,
|
||||
struct intel_crtc_state *crtc_state);
|
||||
int intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state,
|
||||
struct intel_crtc_state *crtc_state);
|
||||
|
||||
int intel_dp_tunnel_atomic_add_state_for_crtc(struct intel_atomic_state *state,
|
||||
struct intel_crtc *crtc);
|
||||
|
|
@ -88,9 +88,12 @@ intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
static inline int
|
||||
intel_dp_tunnel_atomic_clear_stream_bw(struct intel_atomic_state *state,
|
||||
struct intel_crtc_state *crtc_state) {}
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
intel_dp_tunnel_atomic_add_state_for_crtc(struct intel_atomic_state *state,
|
||||
|
|
|
|||
|
|
@ -496,8 +496,10 @@ gmbus_xfer_read_chunk(struct intel_display *display,
|
|||
|
||||
val = intel_de_read_fw(display, GMBUS3(display));
|
||||
do {
|
||||
if (extra_byte_added && len == 1)
|
||||
if (extra_byte_added && len == 1) {
|
||||
len--;
|
||||
break;
|
||||
}
|
||||
|
||||
*buf++ = val & 0xff;
|
||||
val >>= 8;
|
||||
|
|
|
|||
|
|
@ -436,11 +436,16 @@ void intel_plane_copy_hw_state(struct intel_plane_state *plane_state,
|
|||
drm_framebuffer_get(plane_state->hw.fb);
|
||||
}
|
||||
|
||||
static void unlink_nv12_plane(struct intel_crtc_state *crtc_state,
|
||||
struct intel_plane_state *plane_state);
|
||||
|
||||
void intel_plane_set_invisible(struct intel_crtc_state *crtc_state,
|
||||
struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
|
||||
|
||||
unlink_nv12_plane(crtc_state, plane_state);
|
||||
|
||||
crtc_state->active_planes &= ~BIT(plane->id);
|
||||
crtc_state->scaled_planes &= ~BIT(plane->id);
|
||||
crtc_state->nv12_planes &= ~BIT(plane->id);
|
||||
|
|
@ -1513,6 +1518,9 @@ static void unlink_nv12_plane(struct intel_crtc_state *crtc_state,
|
|||
struct intel_display *display = to_intel_display(plane_state);
|
||||
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
|
||||
|
||||
if (!plane_state->planar_linked_plane)
|
||||
return;
|
||||
|
||||
plane_state->planar_linked_plane = NULL;
|
||||
|
||||
if (!plane_state->is_y_plane)
|
||||
|
|
@ -1550,8 +1558,7 @@ static int icl_check_nv12_planes(struct intel_atomic_state *state,
|
|||
if (plane->pipe != crtc->pipe)
|
||||
continue;
|
||||
|
||||
if (plane_state->planar_linked_plane)
|
||||
unlink_nv12_plane(crtc_state, plane_state);
|
||||
unlink_nv12_plane(crtc_state, plane_state);
|
||||
}
|
||||
|
||||
if (!crtc_state->nv12_planes)
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@
|
|||
might_sleep(); \
|
||||
for (;;) { \
|
||||
const bool expired__ = ktime_after(ktime_get_raw(), end__); \
|
||||
OP; \
|
||||
/* Guarantee COND check prior to timeout */ \
|
||||
barrier(); \
|
||||
OP; \
|
||||
if (COND) { \
|
||||
ret__ = 0; \
|
||||
break; \
|
||||
|
|
|
|||
|
|
@ -1236,6 +1236,11 @@ static int mtk_dsi_probe(struct platform_device *pdev)
|
|||
|
||||
dsi->host.ops = &mtk_dsi_ops;
|
||||
dsi->host.dev = dev;
|
||||
|
||||
init_waitqueue_head(&dsi->irq_wait_queue);
|
||||
|
||||
platform_set_drvdata(pdev, dsi);
|
||||
|
||||
ret = mipi_dsi_host_register(&dsi->host);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(dev, ret, "Failed to register DSI host\n");
|
||||
|
|
@ -1247,10 +1252,6 @@ static int mtk_dsi_probe(struct platform_device *pdev)
|
|||
return dev_err_probe(&pdev->dev, ret, "Failed to request DSI irq\n");
|
||||
}
|
||||
|
||||
init_waitqueue_head(&dsi->irq_wait_queue);
|
||||
|
||||
platform_set_drvdata(pdev, dsi);
|
||||
|
||||
dsi->bridge.of_node = dev->of_node;
|
||||
dsi->bridge.type = DRM_MODE_CONNECTOR_DSI;
|
||||
|
||||
|
|
|
|||
|
|
@ -553,6 +553,7 @@
|
|||
#define ENABLE_SMP_LD_RENDER_SURFACE_CONTROL REG_BIT(44 - 32)
|
||||
#define FORCE_SLM_FENCE_SCOPE_TO_TILE REG_BIT(42 - 32)
|
||||
#define FORCE_UGM_FENCE_SCOPE_TO_TILE REG_BIT(41 - 32)
|
||||
#define L3_128B_256B_WRT_DIS REG_BIT(40 - 32)
|
||||
#define MAXREQS_PER_BANK REG_GENMASK(39 - 32, 37 - 32)
|
||||
#define DISABLE_128B_EVICTION_COMMAND_UDW REG_BIT(36 - 32)
|
||||
|
||||
|
|
|
|||
|
|
@ -1442,9 +1442,9 @@ static int op_check_svm_userptr(struct xe_vm *vm, struct xe_vma_op *op,
|
|||
err = vma_check_userptr(vm, op->map.vma, pt_update);
|
||||
break;
|
||||
case DRM_GPUVA_OP_REMAP:
|
||||
if (op->remap.prev)
|
||||
if (op->remap.prev && !op->remap.skip_prev)
|
||||
err = vma_check_userptr(vm, op->remap.prev, pt_update);
|
||||
if (!err && op->remap.next)
|
||||
if (!err && op->remap.next && !op->remap.skip_next)
|
||||
err = vma_check_userptr(vm, op->remap.next, pt_update);
|
||||
break;
|
||||
case DRM_GPUVA_OP_UNMAP:
|
||||
|
|
@ -2198,12 +2198,12 @@ static int op_prepare(struct xe_vm *vm,
|
|||
|
||||
err = unbind_op_prepare(tile, pt_update_ops, old);
|
||||
|
||||
if (!err && op->remap.prev) {
|
||||
if (!err && op->remap.prev && !op->remap.skip_prev) {
|
||||
err = bind_op_prepare(vm, tile, pt_update_ops,
|
||||
op->remap.prev, false);
|
||||
pt_update_ops->wait_vm_bookkeep = true;
|
||||
}
|
||||
if (!err && op->remap.next) {
|
||||
if (!err && op->remap.next && !op->remap.skip_next) {
|
||||
err = bind_op_prepare(vm, tile, pt_update_ops,
|
||||
op->remap.next, false);
|
||||
pt_update_ops->wait_vm_bookkeep = true;
|
||||
|
|
@ -2428,10 +2428,10 @@ static void op_commit(struct xe_vm *vm,
|
|||
|
||||
unbind_op_commit(vm, tile, pt_update_ops, old, fence, fence2);
|
||||
|
||||
if (op->remap.prev)
|
||||
if (op->remap.prev && !op->remap.skip_prev)
|
||||
bind_op_commit(vm, tile, pt_update_ops, op->remap.prev,
|
||||
fence, fence2, false);
|
||||
if (op->remap.next)
|
||||
if (op->remap.next && !op->remap.skip_next)
|
||||
bind_op_commit(vm, tile, pt_update_ops, op->remap.next,
|
||||
fence, fence2, false);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -341,6 +341,8 @@ ssize_t xe_sriov_packet_write_single(struct xe_device *xe, unsigned int vfid,
|
|||
ret = xe_sriov_pf_migration_restore_produce(xe, vfid, *data);
|
||||
if (ret) {
|
||||
xe_sriov_packet_free(*data);
|
||||
*data = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2554,7 +2554,6 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
|
|||
if (!err && op->remap.skip_prev) {
|
||||
op->remap.prev->tile_present =
|
||||
tile_present;
|
||||
op->remap.prev = NULL;
|
||||
}
|
||||
}
|
||||
if (op->remap.next) {
|
||||
|
|
@ -2564,11 +2563,13 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
|
|||
if (!err && op->remap.skip_next) {
|
||||
op->remap.next->tile_present =
|
||||
tile_present;
|
||||
op->remap.next = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Adjust for partial unbind after removing VMA from VM */
|
||||
/*
|
||||
* Adjust for partial unbind after removing VMA from VM. In case
|
||||
* of unwind we might need to undo this later.
|
||||
*/
|
||||
if (!err) {
|
||||
op->base.remap.unmap->va->va.addr = op->remap.start;
|
||||
op->base.remap.unmap->va->va.range = op->remap.range;
|
||||
|
|
@ -2687,6 +2688,8 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
|
|||
|
||||
op->remap.start = xe_vma_start(old);
|
||||
op->remap.range = xe_vma_size(old);
|
||||
op->remap.old_start = op->remap.start;
|
||||
op->remap.old_range = op->remap.range;
|
||||
|
||||
flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK;
|
||||
if (op->base.remap.prev) {
|
||||
|
|
@ -2835,8 +2838,19 @@ static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op,
|
|||
xe_svm_notifier_lock(vm);
|
||||
vma->gpuva.flags &= ~XE_VMA_DESTROYED;
|
||||
xe_svm_notifier_unlock(vm);
|
||||
if (post_commit)
|
||||
if (post_commit) {
|
||||
/*
|
||||
* Restore the old va range, in case of the
|
||||
* prev/next skip optimisation. Otherwise what
|
||||
* we re-insert here could be smaller than the
|
||||
* original range.
|
||||
*/
|
||||
op->base.remap.unmap->va->va.addr =
|
||||
op->remap.old_start;
|
||||
op->base.remap.unmap->va->va.range =
|
||||
op->remap.old_range;
|
||||
xe_vm_insert_vma(vm, vma);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,6 +373,10 @@ struct xe_vma_op_remap {
|
|||
u64 start;
|
||||
/** @range: range of the VMA unmap */
|
||||
u64 range;
|
||||
/** @old_start: Original start of the VMA we unmap */
|
||||
u64 old_start;
|
||||
/** @old_range: Original range of the VMA we unmap */
|
||||
u64 old_range;
|
||||
/** @skip_prev: skip prev rebind */
|
||||
bool skip_prev;
|
||||
/** @skip_next: skip next rebind */
|
||||
|
|
|
|||
|
|
@ -247,7 +247,8 @@ static const struct xe_rtp_entry_sr gt_was[] = {
|
|||
LSN_DIM_Z_WGT_MASK,
|
||||
LSN_LNI_WGT(1) | LSN_LNE_WGT(1) |
|
||||
LSN_DIM_X_WGT(1) | LSN_DIM_Y_WGT(1) |
|
||||
LSN_DIM_Z_WGT(1)))
|
||||
LSN_DIM_Z_WGT(1)),
|
||||
SET(LSC_CHICKEN_BIT_0_UDW, L3_128B_256B_WRT_DIS))
|
||||
},
|
||||
|
||||
/* Xe2_HPM */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user