From dc3a2c4818810b2dc5be400943da7dbf802482da Mon Sep 17 00:00:00 2001 From: Jordan Lazare Date: Mon, 4 Apr 2016 19:43:13 -0400 Subject: [PATCH 1004/1110] drm/amd/dal: Fix incorrect max size of validation array Was leading to stack corruption with >4 displays Signed-off-by: Jordan Lazare Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 12 ++++-------- drivers/gpu/drm/amd/dal/dc/core/dc.c | 2 +- drivers/gpu/drm/amd/dal/dc/dc.h | 4 +++- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c index a091d97..8ad78f5 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c @@ -58,7 +58,6 @@ struct dm_connector_state { container_of((x), struct dm_connector_state, base) #define AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET 1 -#define MAX_TARGET_NUM 6 void amdgpu_dm_encoder_destroy(struct drm_encoder *encoder) { @@ -813,9 +812,6 @@ static void fill_audio_info( } -/*TODO: move these defines elsewhere*/ -#define DAL_MAX_CONTROLLERS 4 - static void copy_crtc_timing_for_drm_display_mode( const struct drm_display_mode *src_mode, struct drm_display_mode *dst_mode) @@ -2110,8 +2106,8 @@ int amdgpu_dm_atomic_commit( struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; - struct dc_target *commit_targets[DAL_MAX_CONTROLLERS]; - struct amdgpu_crtc *new_crtcs[DAL_MAX_CONTROLLERS]; + struct dc_target *commit_targets[MAX_TARGETS]; + struct amdgpu_crtc *new_crtcs[MAX_TARGETS]; /* In this step all new fb would be pinned */ @@ -2516,8 +2512,8 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, int ret; int set_count; int new_target_count; - struct dc_validation_set set[MAX_TARGET_NUM] = {{ 0 }}; - struct dc_target *new_targets[MAX_TARGET_NUM] = { 0 }; + struct dc_validation_set set[MAX_TARGETS] = {{ 0 }}; + struct dc_target *new_targets[MAX_TARGETS] = { 0 }; struct amdgpu_device *adev = dev->dev_private; struct dc *dc = adev->dm.dc; bool need_to_validate = false; diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c index e71088d..d49ab5e 100644 --- a/drivers/gpu/drm/amd/dal/dc/core/dc.c +++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c @@ -720,7 +720,7 @@ bool dc_commit_targets( struct dc_bios *dcb = core_dc->ctx->dc_bios; enum dc_status result = DC_ERROR_UNEXPECTED; struct validate_context *context; - struct dc_validation_set set[4]; + struct dc_validation_set set[MAX_TARGETS]; uint8_t i; if (false == targets_changed(core_dc, targets, target_count)) diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h index e394dd2..dbc972f 100644 --- a/drivers/gpu/drm/amd/dal/dc/dc.h +++ b/drivers/gpu/drm/amd/dal/dc/dc.h @@ -33,6 +33,8 @@ #include "gpio_types.h" #include "link_service_types.h" +#define MAX_TARGETS 6 +#define MAX_SURFACES 6 #define MAX_SINKS_PER_LINK 4 /******************************************************************************* @@ -271,7 +273,7 @@ enum dc_irq_source dc_target_get_irq_src( */ struct dc_validation_set { const struct dc_target *target; - const struct dc_surface *surfaces[4]; + const struct dc_surface *surfaces[MAX_SURFACES]; uint8_t surface_count; }; -- 2.7.4