diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0855-drm-amd-dal-fix-memory-during-fail-link-creation.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0855-drm-amd-dal-fix-memory-during-fail-link-creation.patch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0855-drm-amd-dal-fix-memory-during-fail-link-creation.patch b/common/recipes-kernel/linux/files/0855-drm-amd-dal-fix-memory-during-fail-link-creation.patch new file mode 100644 index 00000000..8e75566a --- /dev/null +++ b/common/recipes-kernel/linux/files/0855-drm-amd-dal-fix-memory-during-fail-link-creation.patch @@ -0,0 +1,89 @@ +From cfb494199e72b18539e80a266470b40110221eb4 Mon Sep 17 00:00:00 2001 +From: Mykola Lysenko <Mykola.Lysenko@amd.com> +Date: Fri, 26 Feb 2016 04:06:56 -0500 +Subject: [PATCH 0855/1110] drm/amd/dal: fix memory during fail link creation + +In case device tag is incorrect, already allocated +resources should be cleaned-up + +Signed-off-by: Mykola Lysenko <Mykola.Lysenko@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 28 ++++++++++++++++++++-------- + 1 file changed, 20 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +index e259509..9bfa35b 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +@@ -954,6 +954,8 @@ static bool construct( + if (hpd_gpio != NULL) { + dal_adapter_service_release_irq( + as, hpd_gpio); ++ ++ hpd_gpio = NULL; + } + + /* TODO: #DAL3 Implement id to str function.*/ +@@ -968,15 +970,15 @@ static bool construct( + ddc_service_init_data.link = link; + link->ddc = dal_ddc_service_create(&ddc_service_init_data); + +- link->public.ddc_hw_inst = +- dal_ddc_get_line( +- dal_ddc_service_get_ddc_pin(link->ddc)); +- + if (NULL == link->ddc) { + DC_ERROR("Failed to create ddc_service!\n"); +- goto create_fail; ++ goto ddc_create_fail; + } + ++ link->public.ddc_hw_inst = ++ dal_ddc_get_line( ++ dal_ddc_service_get_ddc_pin(link->ddc)); ++ + enc_init_data.adapter_service = as; + enc_init_data.ctx = dc_ctx; + enc_init_data.encoder = dal_adapter_service_get_src_obj( +@@ -991,7 +993,7 @@ static bool construct( + + if( link->link_enc == NULL) { + DC_ERROR("Failed to create link encoder!\n"); +- goto create_fail; ++ goto link_enc_create_fail; + } + + link->public.link_enc_hw_inst = link->link_enc->transmitter; +@@ -1002,7 +1004,7 @@ static bool construct( + if (!dal_adapter_service_get_device_tag( + as, link->link_id, i, &link->device_tag)) { + DC_ERROR("Failed to find device tag!\n"); +- goto create_fail; ++ goto device_tag_fail; + } + + /* Look for device tag that matches connector signal, +@@ -1046,8 +1048,18 @@ static bool construct( + program_hpd_filter(link); + + return true; +- ++device_tag_fail: ++ link->ctx->dc->res_pool.funcs->link_enc_destroy(&link->link_enc); ++link_enc_create_fail: ++ dal_ddc_service_destroy(&link->ddc); ++ddc_create_fail: + create_fail: ++ ++ if (hpd_gpio != NULL) { ++ dal_adapter_service_release_irq( ++ as, hpd_gpio); ++ } ++ + return false; + } + +-- +2.7.4 + |