mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
amd-drm-fixes-6.12-2024-10-08:
amdgpu: - Fix invalid UBSAN warnings - Fix artifacts in MPO transitions - Hibernation fix amdkfd: - Fix an eviction fence leak radeon: - Add late register for connectors - Always set GEM function pointers -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQgO5Idg2tXNTSZAr293/aFa7yZ2AUCZwVAzQAKCRC93/aFa7yZ 2JP2AQC/n4RMsATvyJ0iWNL7R9XGNLi6B6NryaZStd/iYh8RlgD9FUZ/S3svF8kQ lwRxw61x7+0vCVBOSCM/jyt270oYqwY= =pGmT -----END PGP SIGNATURE----- Merge tag 'amd-drm-fixes-6.12-2024-10-08' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes amd-drm-fixes-6.12-2024-10-08: amdgpu: - Fix invalid UBSAN warnings - Fix artifacts in MPO transitions - Hibernation fix amdkfd: - Fix an eviction fence leak radeon: - Add late register for connectors - Always set GEM function pointers Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241008142831.3739244-1-alexander.deucher@amd.com
This commit is contained in:
commit
fc4d262721
|
|
@ -1439,8 +1439,8 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
|
|||
list_add_tail(&vm->vm_list_node,
|
||||
&(vm->process_info->vm_list_head));
|
||||
vm->process_info->n_vms++;
|
||||
|
||||
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
|
||||
if (ef)
|
||||
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
|
||||
mutex_unlock(&vm->process_info->lock);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1702,12 +1702,15 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
|
|||
|
||||
ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(dev->adev, avm,
|
||||
&p->kgd_process_info,
|
||||
&ef);
|
||||
p->ef ? NULL : &ef);
|
||||
if (ret) {
|
||||
dev_err(dev->adev->dev, "Failed to create process VM object\n");
|
||||
return ret;
|
||||
}
|
||||
RCU_INIT_POINTER(p->ef, ef);
|
||||
|
||||
if (!p->ef)
|
||||
RCU_INIT_POINTER(p->ef, ef);
|
||||
|
||||
pdd->drm_priv = drm_file->private_data;
|
||||
|
||||
ret = kfd_process_device_reserve_ib_mem(pdd);
|
||||
|
|
|
|||
|
|
@ -2972,10 +2972,11 @@ static int dm_suspend(void *handle)
|
|||
|
||||
hpd_rx_irq_work_suspend(dm);
|
||||
|
||||
if (adev->dm.dc->caps.ips_support)
|
||||
dc_allow_idle_optimizations(adev->dm.dc, true);
|
||||
|
||||
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);
|
||||
|
||||
if (dm->dc->caps.ips_support && adev->in_s0ix)
|
||||
dc_allow_idle_optimizations(dm->dc, true);
|
||||
|
||||
dc_dmub_srv_set_power_state(dm->dc->ctx->dmub_srv, DC_ACPI_CM_POWER_STATE_D3);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -5065,11 +5065,26 @@ static bool update_planes_and_stream_v3(struct dc *dc,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void clear_update_flags(struct dc_surface_update *srf_updates,
|
||||
int surface_count, struct dc_stream_state *stream)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (stream)
|
||||
stream->update_flags.raw = 0;
|
||||
|
||||
for (i = 0; i < surface_count; i++)
|
||||
if (srf_updates[i].surface)
|
||||
srf_updates[i].surface->update_flags.raw = 0;
|
||||
}
|
||||
|
||||
bool dc_update_planes_and_stream(struct dc *dc,
|
||||
struct dc_surface_update *srf_updates, int surface_count,
|
||||
struct dc_stream_state *stream,
|
||||
struct dc_stream_update *stream_update)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
dc_exit_ips_for_hw_access(dc);
|
||||
/*
|
||||
* update planes and stream version 3 separates FULL and FAST updates
|
||||
|
|
@ -5086,10 +5101,16 @@ bool dc_update_planes_and_stream(struct dc *dc,
|
|||
* features as they are now transparent to the new sequence.
|
||||
*/
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_4_01)
|
||||
return update_planes_and_stream_v3(dc, srf_updates,
|
||||
ret = update_planes_and_stream_v3(dc, srf_updates,
|
||||
surface_count, stream, stream_update);
|
||||
return update_planes_and_stream_v2(dc, srf_updates,
|
||||
else
|
||||
ret = update_planes_and_stream_v2(dc, srf_updates,
|
||||
surface_count, stream, stream_update);
|
||||
|
||||
if (ret)
|
||||
clear_update_flags(srf_updates, surface_count, stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dc_commit_updates_for_stream(struct dc *dc,
|
||||
|
|
@ -5099,6 +5120,8 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
|||
struct dc_stream_update *stream_update,
|
||||
struct dc_state *state)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
dc_exit_ips_for_hw_access(dc);
|
||||
/* TODO: Since change commit sequence can have a huge impact,
|
||||
* we decided to only enable it for DCN3x. However, as soon as
|
||||
|
|
@ -5106,17 +5129,17 @@ void dc_commit_updates_for_stream(struct dc *dc,
|
|||
* the new sequence for all ASICs.
|
||||
*/
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_4_01) {
|
||||
update_planes_and_stream_v3(dc, srf_updates, surface_count,
|
||||
ret = update_planes_and_stream_v3(dc, srf_updates, surface_count,
|
||||
stream, stream_update);
|
||||
return;
|
||||
}
|
||||
if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
|
||||
update_planes_and_stream_v2(dc, srf_updates, surface_count,
|
||||
} else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
|
||||
ret = update_planes_and_stream_v2(dc, srf_updates, surface_count,
|
||||
stream, stream_update);
|
||||
return;
|
||||
}
|
||||
update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
|
||||
stream_update, state);
|
||||
} else
|
||||
ret = update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
|
||||
stream_update, state);
|
||||
|
||||
if (ret)
|
||||
clear_update_flags(srf_updates, surface_count, stream);
|
||||
}
|
||||
|
||||
uint8_t dc_get_current_stream_count(struct dc *dc)
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ struct vi_dpm_level {
|
|||
|
||||
struct vi_dpm_table {
|
||||
uint32_t count;
|
||||
struct vi_dpm_level dpm_level[] __counted_by(count);
|
||||
struct vi_dpm_level dpm_level[];
|
||||
};
|
||||
|
||||
#define PCIE_PERF_REQ_REMOVE_REGISTRY 0
|
||||
|
|
@ -91,7 +91,7 @@ struct phm_set_power_state_input {
|
|||
|
||||
struct phm_clock_array {
|
||||
uint32_t count;
|
||||
uint32_t values[] __counted_by(count);
|
||||
uint32_t values[];
|
||||
};
|
||||
|
||||
struct phm_clock_voltage_dependency_record {
|
||||
|
|
@ -123,7 +123,7 @@ struct phm_acpclock_voltage_dependency_record {
|
|||
|
||||
struct phm_clock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_phase_shedding_limits_record {
|
||||
|
|
@ -140,7 +140,7 @@ struct phm_uvd_clock_voltage_dependency_record {
|
|||
|
||||
struct phm_uvd_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_uvd_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_uvd_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_acp_clock_voltage_dependency_record {
|
||||
|
|
@ -150,7 +150,7 @@ struct phm_acp_clock_voltage_dependency_record {
|
|||
|
||||
struct phm_acp_clock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_acp_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_acp_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vce_clock_voltage_dependency_record {
|
||||
|
|
@ -161,32 +161,32 @@ struct phm_vce_clock_voltage_dependency_record {
|
|||
|
||||
struct phm_phase_shedding_limits_table {
|
||||
uint32_t count;
|
||||
struct phm_phase_shedding_limits_record entries[] __counted_by(count);
|
||||
struct phm_phase_shedding_limits_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vceclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_vceclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_vceclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_uvdclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_uvdclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_uvdclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_samuclock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_samuclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_samuclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_acpclock_voltage_dependency_table {
|
||||
uint32_t count;
|
||||
struct phm_acpclock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_acpclock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_vce_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_vce_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_vce_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -393,7 +393,7 @@ union phm_cac_leakage_record {
|
|||
|
||||
struct phm_cac_leakage_table {
|
||||
uint32_t count;
|
||||
union phm_cac_leakage_record entries[] __counted_by(count);
|
||||
union phm_cac_leakage_record entries[];
|
||||
};
|
||||
|
||||
struct phm_samu_clock_voltage_dependency_record {
|
||||
|
|
@ -404,7 +404,7 @@ struct phm_samu_clock_voltage_dependency_record {
|
|||
|
||||
struct phm_samu_clock_voltage_dependency_table {
|
||||
uint8_t count;
|
||||
struct phm_samu_clock_voltage_dependency_record entries[] __counted_by(count);
|
||||
struct phm_samu_clock_voltage_dependency_record entries[];
|
||||
};
|
||||
|
||||
struct phm_cac_tdp_table {
|
||||
|
|
|
|||
|
|
@ -228,10 +228,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
|
|||
{
|
||||
struct drm_device *dev = radeon_connector->base.dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
int ret;
|
||||
|
||||
radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
|
||||
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
|
||||
radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
|
||||
if (ASIC_IS_DCE5(rdev)) {
|
||||
if (radeon_auxch)
|
||||
|
|
@ -242,11 +240,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
|
|||
radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer_atom;
|
||||
}
|
||||
|
||||
ret = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
|
||||
if (!ret)
|
||||
radeon_connector->ddc_bus->has_aux = true;
|
||||
|
||||
WARN(ret, "drm_dp_aux_register() failed with error %d\n", ret);
|
||||
drm_dp_aux_init(&radeon_connector->ddc_bus->aux);
|
||||
radeon_connector->ddc_bus->has_aux = true;
|
||||
}
|
||||
|
||||
/***** general DP utility functions *****/
|
||||
|
|
|
|||
|
|
@ -1786,6 +1786,20 @@ static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector
|
|||
return MODE_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
radeon_connector_late_register(struct drm_connector *connector)
|
||||
{
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
int r = 0;
|
||||
|
||||
if (radeon_connector->ddc_bus->has_aux) {
|
||||
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
|
||||
r = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
|
||||
.get_modes = radeon_dp_get_modes,
|
||||
.mode_valid = radeon_dp_mode_valid,
|
||||
|
|
@ -1800,6 +1814,7 @@ static const struct drm_connector_funcs radeon_dp_connector_funcs = {
|
|||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
static const struct drm_connector_funcs radeon_edp_connector_funcs = {
|
||||
|
|
@ -1810,6 +1825,7 @@ static const struct drm_connector_funcs radeon_edp_connector_funcs = {
|
|||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
|
||||
|
|
@ -1820,6 +1836,7 @@ static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
|
|||
.early_unregister = radeon_connector_unregister,
|
||||
.destroy = radeon_connector_destroy,
|
||||
.force = radeon_dvi_force,
|
||||
.late_register = radeon_connector_late_register,
|
||||
};
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -44,8 +44,6 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj);
|
|||
int radeon_gem_prime_pin(struct drm_gem_object *obj);
|
||||
void radeon_gem_prime_unpin(struct drm_gem_object *obj);
|
||||
|
||||
const struct drm_gem_object_funcs radeon_gem_object_funcs;
|
||||
|
||||
static vm_fault_t radeon_gem_fault(struct vm_fault *vmf)
|
||||
{
|
||||
struct ttm_buffer_object *bo = vmf->vma->vm_private_data;
|
||||
|
|
@ -132,7 +130,6 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
|
|||
return r;
|
||||
}
|
||||
*obj = &robj->tbo.base;
|
||||
(*obj)->funcs = &radeon_gem_object_funcs;
|
||||
robj->pid = task_pid_nr(current);
|
||||
|
||||
mutex_lock(&rdev->gem.mutex);
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ int radeon_bo_create(struct radeon_device *rdev,
|
|||
if (bo == NULL)
|
||||
return -ENOMEM;
|
||||
drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size);
|
||||
bo->tbo.base.funcs = &radeon_gem_object_funcs;
|
||||
bo->rdev = rdev;
|
||||
bo->surface_reg = -1;
|
||||
INIT_LIST_HEAD(&bo->list);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user