Skip to content

Commit fc4d262

Browse files
committed
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 <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 8cf0b93 + 32fda56 commit fc4d262

File tree

9 files changed

+78
-41
lines changed

9 files changed

+78
-41
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,8 +1439,8 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
14391439
list_add_tail(&vm->vm_list_node,
14401440
&(vm->process_info->vm_list_head));
14411441
vm->process_info->n_vms++;
1442-
1443-
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
1442+
if (ef)
1443+
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
14441444
mutex_unlock(&vm->process_info->lock);
14451445

14461446
return 0;

drivers/gpu/drm/amd/amdkfd/kfd_process.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,12 +1702,15 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
17021702

17031703
ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(dev->adev, avm,
17041704
&p->kgd_process_info,
1705-
&ef);
1705+
p->ef ? NULL : &ef);
17061706
if (ret) {
17071707
dev_err(dev->adev->dev, "Failed to create process VM object\n");
17081708
return ret;
17091709
}
1710-
RCU_INIT_POINTER(p->ef, ef);
1710+
1711+
if (!p->ef)
1712+
RCU_INIT_POINTER(p->ef, ef);
1713+
17111714
pdd->drm_priv = drm_file->private_data;
17121715

17131716
ret = kfd_process_device_reserve_ib_mem(pdd);

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,10 +2972,11 @@ static int dm_suspend(void *handle)
29722972

29732973
hpd_rx_irq_work_suspend(dm);
29742974

2975-
if (adev->dm.dc->caps.ips_support)
2976-
dc_allow_idle_optimizations(adev->dm.dc, true);
2977-
29782975
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);
2976+
2977+
if (dm->dc->caps.ips_support && adev->in_s0ix)
2978+
dc_allow_idle_optimizations(dm->dc, true);
2979+
29792980
dc_dmub_srv_set_power_state(dm->dc->ctx->dmub_srv, DC_ACPI_CM_POWER_STATE_D3);
29802981

29812982
return 0;

drivers/gpu/drm/amd/display/dc/core/dc.c

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5065,11 +5065,26 @@ static bool update_planes_and_stream_v3(struct dc *dc,
50655065
return true;
50665066
}
50675067

5068+
static void clear_update_flags(struct dc_surface_update *srf_updates,
5069+
int surface_count, struct dc_stream_state *stream)
5070+
{
5071+
int i;
5072+
5073+
if (stream)
5074+
stream->update_flags.raw = 0;
5075+
5076+
for (i = 0; i < surface_count; i++)
5077+
if (srf_updates[i].surface)
5078+
srf_updates[i].surface->update_flags.raw = 0;
5079+
}
5080+
50685081
bool dc_update_planes_and_stream(struct dc *dc,
50695082
struct dc_surface_update *srf_updates, int surface_count,
50705083
struct dc_stream_state *stream,
50715084
struct dc_stream_update *stream_update)
50725085
{
5086+
bool ret = false;
5087+
50735088
dc_exit_ips_for_hw_access(dc);
50745089
/*
50755090
* update planes and stream version 3 separates FULL and FAST updates
@@ -5086,10 +5101,16 @@ bool dc_update_planes_and_stream(struct dc *dc,
50865101
* features as they are now transparent to the new sequence.
50875102
*/
50885103
if (dc->ctx->dce_version >= DCN_VERSION_4_01)
5089-
return update_planes_and_stream_v3(dc, srf_updates,
5104+
ret = update_planes_and_stream_v3(dc, srf_updates,
50905105
surface_count, stream, stream_update);
5091-
return update_planes_and_stream_v2(dc, srf_updates,
5106+
else
5107+
ret = update_planes_and_stream_v2(dc, srf_updates,
50925108
surface_count, stream, stream_update);
5109+
5110+
if (ret)
5111+
clear_update_flags(srf_updates, surface_count, stream);
5112+
5113+
return ret;
50935114
}
50945115

50955116
void dc_commit_updates_for_stream(struct dc *dc,
@@ -5099,24 +5120,26 @@ void dc_commit_updates_for_stream(struct dc *dc,
50995120
struct dc_stream_update *stream_update,
51005121
struct dc_state *state)
51015122
{
5123+
bool ret = false;
5124+
51025125
dc_exit_ips_for_hw_access(dc);
51035126
/* TODO: Since change commit sequence can have a huge impact,
51045127
* we decided to only enable it for DCN3x. However, as soon as
51055128
* we get more confident about this change we'll need to enable
51065129
* the new sequence for all ASICs.
51075130
*/
51085131
if (dc->ctx->dce_version >= DCN_VERSION_4_01) {
5109-
update_planes_and_stream_v3(dc, srf_updates, surface_count,
5132+
ret = update_planes_and_stream_v3(dc, srf_updates, surface_count,
51105133
stream, stream_update);
5111-
return;
5112-
}
5113-
if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
5114-
update_planes_and_stream_v2(dc, srf_updates, surface_count,
5134+
} else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
5135+
ret = update_planes_and_stream_v2(dc, srf_updates, surface_count,
51155136
stream, stream_update);
5116-
return;
5117-
}
5118-
update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
5119-
stream_update, state);
5137+
} else
5138+
ret = update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
5139+
stream_update, state);
5140+
5141+
if (ret)
5142+
clear_update_flags(srf_updates, surface_count, stream);
51205143
}
51215144

51225145
uint8_t dc_get_current_stream_count(struct dc *dc)

drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct vi_dpm_level {
6060

6161
struct vi_dpm_table {
6262
uint32_t count;
63-
struct vi_dpm_level dpm_level[] __counted_by(count);
63+
struct vi_dpm_level dpm_level[];
6464
};
6565

6666
#define PCIE_PERF_REQ_REMOVE_REGISTRY 0
@@ -91,7 +91,7 @@ struct phm_set_power_state_input {
9191

9292
struct phm_clock_array {
9393
uint32_t count;
94-
uint32_t values[] __counted_by(count);
94+
uint32_t values[];
9595
};
9696

9797
struct phm_clock_voltage_dependency_record {
@@ -123,7 +123,7 @@ struct phm_acpclock_voltage_dependency_record {
123123

124124
struct phm_clock_voltage_dependency_table {
125125
uint32_t count;
126-
struct phm_clock_voltage_dependency_record entries[] __counted_by(count);
126+
struct phm_clock_voltage_dependency_record entries[];
127127
};
128128

129129
struct phm_phase_shedding_limits_record {
@@ -140,7 +140,7 @@ struct phm_uvd_clock_voltage_dependency_record {
140140

141141
struct phm_uvd_clock_voltage_dependency_table {
142142
uint8_t count;
143-
struct phm_uvd_clock_voltage_dependency_record entries[] __counted_by(count);
143+
struct phm_uvd_clock_voltage_dependency_record entries[];
144144
};
145145

146146
struct phm_acp_clock_voltage_dependency_record {
@@ -150,7 +150,7 @@ struct phm_acp_clock_voltage_dependency_record {
150150

151151
struct phm_acp_clock_voltage_dependency_table {
152152
uint32_t count;
153-
struct phm_acp_clock_voltage_dependency_record entries[] __counted_by(count);
153+
struct phm_acp_clock_voltage_dependency_record entries[];
154154
};
155155

156156
struct phm_vce_clock_voltage_dependency_record {
@@ -161,32 +161,32 @@ struct phm_vce_clock_voltage_dependency_record {
161161

162162
struct phm_phase_shedding_limits_table {
163163
uint32_t count;
164-
struct phm_phase_shedding_limits_record entries[] __counted_by(count);
164+
struct phm_phase_shedding_limits_record entries[];
165165
};
166166

167167
struct phm_vceclock_voltage_dependency_table {
168168
uint8_t count;
169-
struct phm_vceclock_voltage_dependency_record entries[] __counted_by(count);
169+
struct phm_vceclock_voltage_dependency_record entries[];
170170
};
171171

172172
struct phm_uvdclock_voltage_dependency_table {
173173
uint8_t count;
174-
struct phm_uvdclock_voltage_dependency_record entries[] __counted_by(count);
174+
struct phm_uvdclock_voltage_dependency_record entries[];
175175
};
176176

177177
struct phm_samuclock_voltage_dependency_table {
178178
uint8_t count;
179-
struct phm_samuclock_voltage_dependency_record entries[] __counted_by(count);
179+
struct phm_samuclock_voltage_dependency_record entries[];
180180
};
181181

182182
struct phm_acpclock_voltage_dependency_table {
183183
uint32_t count;
184-
struct phm_acpclock_voltage_dependency_record entries[] __counted_by(count);
184+
struct phm_acpclock_voltage_dependency_record entries[];
185185
};
186186

187187
struct phm_vce_clock_voltage_dependency_table {
188188
uint8_t count;
189-
struct phm_vce_clock_voltage_dependency_record entries[] __counted_by(count);
189+
struct phm_vce_clock_voltage_dependency_record entries[];
190190
};
191191

192192

@@ -393,7 +393,7 @@ union phm_cac_leakage_record {
393393

394394
struct phm_cac_leakage_table {
395395
uint32_t count;
396-
union phm_cac_leakage_record entries[] __counted_by(count);
396+
union phm_cac_leakage_record entries[];
397397
};
398398

399399
struct phm_samu_clock_voltage_dependency_record {
@@ -404,7 +404,7 @@ struct phm_samu_clock_voltage_dependency_record {
404404

405405
struct phm_samu_clock_voltage_dependency_table {
406406
uint8_t count;
407-
struct phm_samu_clock_voltage_dependency_record entries[] __counted_by(count);
407+
struct phm_samu_clock_voltage_dependency_record entries[];
408408
};
409409

410410
struct phm_cac_tdp_table {

drivers/gpu/drm/radeon/atombios_dp.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
228228
{
229229
struct drm_device *dev = radeon_connector->base.dev;
230230
struct radeon_device *rdev = dev->dev_private;
231-
int ret;
232231

233232
radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
234-
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
235233
radeon_connector->ddc_bus->aux.drm_dev = radeon_connector->base.dev;
236234
if (ASIC_IS_DCE5(rdev)) {
237235
if (radeon_auxch)
@@ -242,11 +240,8 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector)
242240
radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer_atom;
243241
}
244242

245-
ret = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
246-
if (!ret)
247-
radeon_connector->ddc_bus->has_aux = true;
248-
249-
WARN(ret, "drm_dp_aux_register() failed with error %d\n", ret);
243+
drm_dp_aux_init(&radeon_connector->ddc_bus->aux);
244+
radeon_connector->ddc_bus->has_aux = true;
250245
}
251246

252247
/***** general DP utility functions *****/

drivers/gpu/drm/radeon/radeon_connectors.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,20 @@ static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector
17861786
return MODE_OK;
17871787
}
17881788

1789+
static int
1790+
radeon_connector_late_register(struct drm_connector *connector)
1791+
{
1792+
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1793+
int r = 0;
1794+
1795+
if (radeon_connector->ddc_bus->has_aux) {
1796+
radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
1797+
r = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);
1798+
}
1799+
1800+
return r;
1801+
}
1802+
17891803
static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
17901804
.get_modes = radeon_dp_get_modes,
17911805
.mode_valid = radeon_dp_mode_valid,
@@ -1800,6 +1814,7 @@ static const struct drm_connector_funcs radeon_dp_connector_funcs = {
18001814
.early_unregister = radeon_connector_unregister,
18011815
.destroy = radeon_connector_destroy,
18021816
.force = radeon_dvi_force,
1817+
.late_register = radeon_connector_late_register,
18031818
};
18041819

18051820
static const struct drm_connector_funcs radeon_edp_connector_funcs = {
@@ -1810,6 +1825,7 @@ static const struct drm_connector_funcs radeon_edp_connector_funcs = {
18101825
.early_unregister = radeon_connector_unregister,
18111826
.destroy = radeon_connector_destroy,
18121827
.force = radeon_dvi_force,
1828+
.late_register = radeon_connector_late_register,
18131829
};
18141830

18151831
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 = {
18201836
.early_unregister = radeon_connector_unregister,
18211837
.destroy = radeon_connector_destroy,
18221838
.force = radeon_dvi_force,
1839+
.late_register = radeon_connector_late_register,
18231840
};
18241841

18251842
void

drivers/gpu/drm/radeon/radeon_gem.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj);
4444
int radeon_gem_prime_pin(struct drm_gem_object *obj);
4545
void radeon_gem_prime_unpin(struct drm_gem_object *obj);
4646

47-
const struct drm_gem_object_funcs radeon_gem_object_funcs;
48-
4947
static vm_fault_t radeon_gem_fault(struct vm_fault *vmf)
5048
{
5149
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,
132130
return r;
133131
}
134132
*obj = &robj->tbo.base;
135-
(*obj)->funcs = &radeon_gem_object_funcs;
136133
robj->pid = task_pid_nr(current);
137134

138135
mutex_lock(&rdev->gem.mutex);

drivers/gpu/drm/radeon/radeon_object.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ int radeon_bo_create(struct radeon_device *rdev,
151151
if (bo == NULL)
152152
return -ENOMEM;
153153
drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size);
154+
bo->tbo.base.funcs = &radeon_gem_object_funcs;
154155
bo->rdev = rdev;
155156
bo->surface_reg = -1;
156157
INIT_LIST_HEAD(&bo->list);

0 commit comments

Comments
 (0)