diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3070-drm-amd-display-Hook-up-calls-to-do-stereo-mux-and-d.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3070-drm-amd-display-Hook-up-calls-to-do-stereo-mux-and-d.patch | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3070-drm-amd-display-Hook-up-calls-to-do-stereo-mux-and-d.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3070-drm-amd-display-Hook-up-calls-to-do-stereo-mux-and-d.patch new file mode 100644 index 00000000..a6432523 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3070-drm-amd-display-Hook-up-calls-to-do-stereo-mux-and-d.patch @@ -0,0 +1,322 @@ +From f9eb6fef4679f546c2ad208ba22d00d782d6a3fe Mon Sep 17 00:00:00 2001 +From: Murton Liu <murton.liu@amd.com> +Date: Tue, 25 Jun 2019 11:15:09 -0400 +Subject: [PATCH 3070/4256] drm/amd/display: Hook up calls to do stereo mux and + dig programming to stereo control interface + +[Why] +Implementation of stereo mux register is complete, but unused. Need to +call functions to write relevant configs. + +[How] +Add function to write stereo config for enable/disable case and call in +stereo control interface. + +Signed-off-by: Murton Liu <murton.liu@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc.c | 47 ++++++++++++ + drivers/gpu/drm/amd/display/dc/dc.h | 3 + + .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 7 ++ + .../display/dc/gpio/dcn10/hw_factory_dcn10.c | 42 ++++++++++- + .../drm/amd/display/dc/gpio/gpio_service.c | 72 +++++++++++++++++++ + .../display/include/gpio_service_interface.h | 18 ++++- + 6 files changed, 186 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 2503e3308b42..7142651ab640 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1246,6 +1246,53 @@ void dc_release_state(struct dc_state *context) + kref_put(&context->refcount, dc_state_free); + } + ++bool dc_set_generic_gpio_for_stereo(bool enable, ++ struct gpio_service *gpio_service) ++{ ++ enum gpio_result gpio_result = GPIO_RESULT_NON_SPECIFIC_ERROR; ++ struct gpio_pin_info pin_info; ++ struct gpio *generic; ++ struct gpio_generic_mux_config *config = kzalloc(sizeof(struct gpio_generic_mux_config), ++ GFP_KERNEL); ++ ++ pin_info = dal_gpio_get_generic_pin_info(gpio_service, GPIO_ID_GENERIC, 0); ++ ++ if (pin_info.mask == 0xFFFFFFFF || pin_info.offset == 0xFFFFFFFF) { ++ kfree(config); ++ return false; ++ } else { ++ generic = dal_gpio_service_create_generic_mux( ++ gpio_service, ++ pin_info.offset, ++ pin_info.mask); ++ } ++ ++ if (!generic) { ++ kfree(config); ++ return false; ++ } ++ ++ gpio_result = dal_gpio_open(generic, GPIO_MODE_OUTPUT); ++ ++ config->enable_output_from_mux = enable; ++ config->mux_select = GPIO_SIGNAL_SOURCE_PASS_THROUGH_STEREO_SYNC; ++ ++ if (gpio_result == GPIO_RESULT_OK) ++ gpio_result = dal_mux_setup_config(generic, config); ++ ++ if (gpio_result == GPIO_RESULT_OK) { ++ dal_gpio_close(generic); ++ dal_gpio_destroy_generic_mux(&generic); ++ kfree(config); ++ return true; ++ } else { ++ dal_gpio_close(generic); ++ dal_gpio_destroy_generic_mux(&generic); ++ kfree(config); ++ return false; ++ } ++} ++ + static bool is_surface_in_context( + const struct dc_state *context, + const struct dc_plane_state *plane_state) +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index bd4c32afd603..783c37977e73 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -866,6 +866,9 @@ enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *pla + + void get_clock_requirements_for_state(struct dc_state *state, struct AsicStateEx *info); + ++bool dc_set_generic_gpio_for_stereo(bool enable, ++ struct gpio_service *gpio_service); ++ + /* + * fast_validate: we return after determining if we can support the new state, + * but before we populate the programming info +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index 2b5614bea6c3..4ac9056f79d1 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -2690,6 +2690,13 @@ static void dcn10_setup_stereo(struct pipe_ctx *pipe_ctx, struct dc *dc) + + dcn10_config_stereo_parameters(stream, &flags); + ++ if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_SIDEBAND_FA) { ++ if (!dc_set_generic_gpio_for_stereo(true, dc->ctx->gpio_service)) ++ dc_set_generic_gpio_for_stereo(false, dc->ctx->gpio_service); ++ } else { ++ dc_set_generic_gpio_for_stereo(false, dc->ctx->gpio_service); ++ } ++ + pipe_ctx->stream_res.opp->funcs->opp_program_stereo( + pipe_ctx->stream_res.opp, + flags.PROGRAM_STEREO == 1 ? true:false, +diff --git a/drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.c b/drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.c +index 32aa47a04a0d..5711f30cf848 100644 +--- a/drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.c ++++ b/drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.c +@@ -31,6 +31,7 @@ + #include "../hw_gpio.h" + #include "../hw_ddc.h" + #include "../hw_hpd.h" ++#include "../hw_generic.h" + + #include "hw_factory_dcn10.h" + +@@ -121,6 +122,42 @@ static const struct ddc_sh_mask ddc_mask = { + DDC_MASK_SH_LIST(_MASK) + }; + ++#include "../generic_regs.h" ++ ++/* set field name */ ++#define SF_GENERIC(reg_name, field_name, post_fix)\ ++ .field_name = reg_name ## __ ## field_name ## post_fix ++ ++#define generic_regs(id) \ ++{\ ++ GENERIC_REG_LIST(id)\ ++} ++ ++static const struct generic_registers generic_regs[] = { ++ generic_regs(A), ++ generic_regs(B), ++}; ++ ++static const struct generic_sh_mask generic_shift[] = { ++ GENERIC_MASK_SH_LIST(__SHIFT, A), ++ GENERIC_MASK_SH_LIST(__SHIFT, B), ++}; ++ ++static const struct generic_sh_mask generic_mask[] = { ++ GENERIC_MASK_SH_LIST(_MASK, A), ++ GENERIC_MASK_SH_LIST(_MASK, B), ++}; ++ ++static void define_generic_registers(struct hw_gpio_pin *pin, uint32_t en) ++{ ++ struct hw_generic *generic = HW_GENERIC_FROM_BASE(pin); ++ ++ generic->regs = &generic_regs[en]; ++ generic->shifts = &generic_shift[en]; ++ generic->masks = &generic_mask[en]; ++ generic->base.regs = &generic_regs[en].gpio; ++} ++ + static void define_ddc_registers( + struct hw_gpio_pin *pin, + uint32_t en) +@@ -161,12 +198,13 @@ static void define_hpd_registers(struct hw_gpio_pin *pin, uint32_t en) + static const struct hw_factory_funcs funcs = { + .create_ddc_data = dal_hw_ddc_create, + .create_ddc_clock = dal_hw_ddc_create, +- .create_generic = NULL, ++ .create_generic = dal_hw_generic_create, + .create_hpd = dal_hw_hpd_create, + .create_sync = NULL, + .create_gsl = NULL, + .define_hpd_registers = define_hpd_registers, +- .define_ddc_registers = define_ddc_registers ++ .define_ddc_registers = define_ddc_registers, ++ .define_generic_registers = define_generic_registers + }; + /* + * dal_hw_factory_dcn10_init +diff --git a/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c b/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c +index 3c63a3c04dbb..937478bac796 100644 +--- a/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c ++++ b/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c +@@ -139,6 +139,62 @@ struct gpio *dal_gpio_service_create_irq( + return dal_gpio_create_irq(service, id, en); + } + ++struct gpio *dal_gpio_service_create_generic_mux( ++ struct gpio_service *service, ++ uint32_t offset, ++ uint32_t mask) ++{ ++ enum gpio_id id; ++ uint32_t en; ++ struct gpio *generic; ++ ++ if (mask == 1) ++ en = GPIO_GENERIC_A; ++ else if (mask == 0x00000100L) ++ en = GPIO_GENERIC_B; ++ else ++ return NULL; ++ ++ id = GPIO_ID_GENERIC; ++ ++ generic = dal_gpio_create( ++ service, id, en, GPIO_PIN_OUTPUT_STATE_DEFAULT); ++ ++ return generic; ++} ++ ++void dal_gpio_destroy_generic_mux( ++ struct gpio **mux) ++{ ++ if (!mux || !*mux) { ++ ASSERT_CRITICAL(false); ++ return; ++ } ++ ++ dal_gpio_close(*mux); ++ dal_gpio_destroy(mux); ++ kfree(*mux); ++ ++ *mux = NULL; ++} ++ ++struct gpio_pin_info dal_gpio_get_generic_pin_info( ++ struct gpio_service *service, ++ enum gpio_id id, ++ uint32_t en) ++{ ++ struct gpio_pin_info pin; ++ ++ if (service->translate.funcs->id_to_offset) { ++ service->translate.funcs->id_to_offset(id, en, &pin); ++ } else { ++ pin.mask = 0xFFFFFFFF; ++ pin.offset = 0xFFFFFFFF; ++ } ++ ++ return pin; ++} ++ + void dal_gpio_service_destroy( + struct gpio_service **ptr) + { +@@ -163,6 +219,21 @@ void dal_gpio_service_destroy( + *ptr = NULL; + } + ++enum gpio_result dal_mux_setup_config( ++ struct gpio *mux, ++ struct gpio_generic_mux_config *config) ++{ ++ struct gpio_config_data config_data; ++ ++ if (!config) ++ return GPIO_RESULT_INVALID_DATA; ++ ++ config_data.config.generic_mux = *config; ++ config_data.type = GPIO_CONFIG_TYPE_GENERIC_MUX; ++ ++ return dal_gpio_set_config(mux, &config_data); ++} ++ + /* + * @brief + * Private API. +@@ -253,6 +324,7 @@ enum gpio_result dal_gpio_service_open( + case GPIO_ID_GENERIC: + pin = service->factory.funcs->create_generic( + service->ctx, id, en); ++ service->factory.funcs->define_generic_registers(pin, en); + break; + case GPIO_ID_HPD: + pin = service->factory.funcs->create_hpd( +diff --git a/drivers/gpu/drm/amd/display/include/gpio_service_interface.h b/drivers/gpu/drm/amd/display/include/gpio_service_interface.h +index f40259bade40..9c55d247227e 100644 +--- a/drivers/gpu/drm/amd/display/include/gpio_service_interface.h ++++ b/drivers/gpu/drm/amd/display/include/gpio_service_interface.h +@@ -51,13 +51,29 @@ struct gpio *dal_gpio_service_create_irq( + uint32_t offset, + uint32_t mask); + ++struct gpio *dal_gpio_service_create_generic_mux( ++ struct gpio_service *service, ++ uint32_t offset, ++ uint32_t mask); ++ ++void dal_gpio_destroy_generic_mux( ++ struct gpio **mux); ++ ++enum gpio_result dal_mux_setup_config( ++ struct gpio *mux, ++ struct gpio_generic_mux_config *config); ++ ++struct gpio_pin_info dal_gpio_get_generic_pin_info( ++ struct gpio_service *service, ++ enum gpio_id id, ++ uint32_t en); ++ + struct ddc *dal_gpio_create_ddc( + struct gpio_service *service, + uint32_t offset, + uint32_t mask, + struct gpio_ddc_hw_info *info); + +- + void dal_gpio_destroy_ddc( + struct ddc **ddc); + +-- +2.17.1 + |