summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/dal/controller/controller.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/dal/controller/controller.c')
-rw-r--r--drivers/gpu/drm/amd/dal/controller/controller.c970
1 files changed, 970 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/dal/controller/controller.c b/drivers/gpu/drm/amd/dal/controller/controller.c
new file mode 100644
index 000000000000..e587b7058958
--- /dev/null
+++ b/drivers/gpu/drm/amd/dal/controller/controller.c
@@ -0,0 +1,970 @@
+/*
+ * Copyright 2012-15 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "dal_services.h"
+
+#include "include/adapter_service_interface.h"
+#include "include/signal_types.h"
+#include "include/controller_interface.h"
+#include "include/line_buffer_interface.h"
+#include "include/display_clock_interface.h"
+#include "include/dc_clock_generator_interface.h"
+#include "include/fixed31_32.h"
+
+#include "controller.h"
+#include "timing_generator.h"
+#include "csc.h"
+#include "scaler.h"
+#include "surface.h"
+#include "formatter.h"
+#include "pipe_control.h"
+#include "vga.h"
+#include "line_buffer.h"
+#include "cursor.h"
+
+#if defined(CONFIG_DRM_AMD_DAL_DCE11_0)
+#include "dce110/controller_dce110.h"
+#include "dce110/controller_v_dce110.h"
+#endif
+
+/*
+ * **************************************************************************
+ * ************************* Basic functionality on Controllers ***************
+ * **************************************************************************
+ */
+
+bool dal_controller_base_construct(
+ struct controller *crtc,
+ struct controller_init_data *init_data)
+{
+ if (!init_data)
+ return false;
+
+ if (!init_data->as)
+ return false;
+
+ crtc->dal_context = init_data->dal_context;
+ crtc->id = init_data->controller;
+ crtc->paired_id = init_data->paired_controller;
+
+ return true;
+}
+
+/* destruct actions common for ALL versions of DCE. */
+void dal_controller_base_destruct(struct controller *crtc)
+{
+ if (crtc->cursor)
+ crtc->cursor->funcs->destroy(&crtc->cursor);
+
+ if (crtc->surface)
+ crtc->surface->funcs->destroy(&crtc->surface);
+
+ if (crtc->pc)
+ crtc->pc->funcs->destroy(&crtc->pc);
+
+ if (crtc->vga)
+ crtc->vga->funcs->destroy(&crtc->vga);
+
+ if (crtc->fmt)
+ crtc->fmt->funcs->destroy(&crtc->fmt);
+
+ if (crtc->csc)
+ crtc->csc->funcs->destroy(&crtc->csc);
+
+ if (crtc->video_gamma)
+ crtc->video_gamma->funcs->destroy(&crtc->video_gamma);
+
+ if (crtc->grph_gamma)
+ crtc->grph_gamma->funcs->destroy(&crtc->grph_gamma);
+
+ if (crtc->scl)
+ crtc->scl->funcs->destroy(&crtc->scl);
+
+ if (crtc->tg)
+ crtc->tg->funcs->destroy(&crtc->tg);
+
+ if (crtc->lb)
+ dal_line_buffer_destroy(&crtc->lb);
+}
+
+struct controller *dal_controller_create(struct controller_init_data *init_data)
+{
+ struct controller *crtc = NULL;
+ enum dce_version dce_version;
+
+ if (!init_data)
+ return NULL;
+ if (!init_data->as)
+ return NULL;
+
+ dce_version = dal_adapter_service_get_dce_version(init_data->as);
+
+ switch (dce_version) {
+#if defined(CONFIG_DRM_AMD_DAL_DCE11_0)
+ case DCE_VERSION_11_0:
+ if (IS_UNDERLAY_CONTROLLER(init_data->controller))
+ crtc = dal_controller_v_dce110_create(init_data);
+ else
+ crtc = dal_controller_dce110_create(init_data);
+ break;
+#endif
+ default:
+ BREAK_TO_DEBUGGER();
+ break;
+ }
+
+ if (NULL == crtc)
+ return NULL;
+
+ crtc->go_id = dal_graphics_object_id_init(init_data->controller,
+ ENUM_ID_1, OBJECT_TYPE_CONTROLLER);
+
+ return crtc;
+}
+
+void dal_controller_destroy(struct controller **crtc)
+{
+ if (!crtc || !*crtc) {
+ BREAK_TO_DEBUGGER();
+ return;
+ }
+
+ (*crtc)->funcs.destroy(crtc);
+ *crtc = NULL;
+}
+
+const struct graphics_object_id dal_controller_get_graphics_object_id(
+ const struct controller *crtc)
+{
+ return crtc->go_id;
+}
+
+void dal_controller_power_up(struct controller *crtc)
+{
+ dal_line_buffer_power_up(crtc->lb);
+}
+
+void dal_controller_power_down(struct controller *crtc)
+{
+ crtc->tg->funcs->disable_crtc(crtc->tg);
+}
+
+bool dal_controller_power_gating_enable(
+ struct controller *crtc,
+ enum pipe_gating_control cntl)
+{
+ if (crtc->pc)
+ return crtc->pc->funcs->
+ enable_disp_power_gating(crtc->pc, cntl);
+ else
+ return PIPE_GATING_CONTROL_DISABLE == cntl;
+}
+
+enum controller_id dal_controller_get_id(struct controller *crtc)
+{
+ return crtc->id;
+}
+
+enum controller_id dal_controller_get_paired_controller_id(
+ struct controller *crtc)
+{
+ return crtc->paired_id;
+}
+enum sync_source dal_controller_get_sync_source(struct controller *crtc)
+{
+ switch (crtc->id) {
+ case CONTROLLER_ID_D0:
+ return SYNC_SOURCE_CONTROLLER0;
+ case CONTROLLER_ID_D1:
+ return SYNC_SOURCE_CONTROLLER1;
+ case CONTROLLER_ID_D2:
+ return SYNC_SOURCE_CONTROLLER2;
+ case CONTROLLER_ID_D3:
+ return SYNC_SOURCE_CONTROLLER3;
+ case CONTROLLER_ID_D4:
+ return SYNC_SOURCE_CONTROLLER4;
+ case CONTROLLER_ID_D5:
+ return SYNC_SOURCE_CONTROLLER5;
+ default:
+ return SYNC_SOURCE_NONE;
+ }
+}
+
+/*
+ * **************************************************************************
+ * ******************************* Shared Objects Pointers ******************
+ * **************************************************************************
+ */
+
+/* Get */
+struct line_buffer *dal_controller_get_line_buffer(struct controller *crtc)
+{
+ return crtc->lb;
+}
+
+struct display_clock *dal_controller_get_display_clock(
+ struct controller *crtc)
+{
+ return crtc->dc;
+}
+
+struct bandwidth_manager *dal_controller_get_bandwidth_manager(
+ struct controller *crtc)
+{
+ return crtc->bm;
+}
+
+struct dc_clock_generator *dal_controller_get_dc_clock_generator(
+ struct controller *crtc)
+{
+ return crtc->dc_clk_gen;
+}
+
+/* Set */
+void dal_controller_set_display_clock(
+ struct controller *crtc,
+ struct display_clock *dc)
+{
+ crtc->dc = dc;
+}
+
+void dal_controller_set_bandwidth_manager(
+ struct controller *crtc,
+ struct bandwidth_manager *bm)
+{
+ crtc->bm = bm;
+}
+
+void dal_controller_set_dc_clock_generator(
+ struct controller *crtc,
+ struct dc_clock_generator *dc_clk_gen)
+{
+ crtc->dc_clk_gen = dc_clk_gen;
+}
+
+/*
+ * **************************************************************************
+ * ********************* Timing Generator Interface *************************
+ * **************************************************************************
+ */
+
+/* Get */
+void dal_controller_get_crtc_timing(
+ struct controller *crtc,
+ struct hw_crtc_timing *hw_crtc_timing)
+{
+ crtc->tg->funcs->get_crtc_timing(crtc->tg, hw_crtc_timing);
+}
+
+bool dal_controller_is_counter_moving(struct controller *crtc)
+{
+ return crtc->tg->funcs->is_counter_moving(crtc->tg);
+}
+
+void dal_controller_get_crtc_position(
+ struct controller *crtc,
+ struct crtc_position *crtc_position)
+{
+ crtc->tg->funcs->get_crtc_position(crtc->tg, crtc_position);
+}
+
+void dal_controller_wait_for_vblank(struct controller *crtc)
+{
+ crtc->tg->funcs->wait_for_vblank(crtc->tg);
+}
+
+void dal_controller_wait_for_vactive(struct controller *crtc)
+{
+ crtc->tg->funcs->wait_for_vactive(crtc->tg);
+}
+
+void dal_controller_wait_frames(struct controller *crtc, uint32_t num_of_frames)
+{
+ uint32_t i;
+
+ for (i = 0; i < num_of_frames; i++) {
+ crtc->tg->funcs->wait_for_vactive(crtc->tg);
+ crtc->tg->funcs->wait_for_vblank(crtc->tg);
+ }
+}
+
+bool dal_controller_validate_timing(
+ struct controller *crtc,
+ const struct hw_crtc_timing *timing,
+ enum signal_type signal)
+{
+ return crtc->tg->funcs->validate_timing(crtc->tg, timing, signal);
+}
+
+bool dal_controller_get_active_pll_id(
+ struct controller *crtc,
+ enum signal_type signal,
+ bool *dto_mode,
+ enum clock_source_id *clk_src_id)
+{
+ return crtc->funcs.get_active_pll_id(
+ crtc, signal, dto_mode, clk_src_id);
+}
+
+uint32_t dal_controller_get_crtc_scanoutpos(
+ struct controller *crtc,
+ int32_t *vpos,
+ int32_t *hpos)
+{
+ return crtc->tg->funcs->get_crtc_scanoutpos(
+ crtc->tg,
+ vpos,
+ hpos);
+}
+
+/* Set */
+bool dal_controller_enable_timing_generator(struct controller *crtc)
+{
+ return crtc->tg->funcs->enable_crtc(crtc->tg);
+}
+
+bool dal_controller_disable_timing_generator(struct controller *crtc)
+{
+ return crtc->tg->funcs->disable_crtc(crtc->tg);
+}
+
+bool dal_controller_program_timing_generator(
+ struct controller *crtc,
+ struct hw_crtc_timing *timing)
+{
+ return crtc->tg->funcs->program_timing_generator(crtc->tg, timing);
+}
+
+void dal_controller_program_drr(
+ struct controller *crtc,
+ const struct hw_ranged_timing *timing)
+{
+ crtc->tg->funcs->program_drr(crtc->tg, timing);
+}
+
+bool dal_controller_blank_crtc(struct controller *crtc, enum color_space cs)
+{
+ return crtc->tg->funcs->blank_crtc(crtc->tg, cs);
+}
+
+bool dal_controller_unblank_crtc(struct controller *crtc, enum color_space cs)
+{
+ return crtc->tg->funcs->unblank_crtc(crtc->tg, cs);
+}
+
+void dal_controller_reprogram_timing(
+ struct controller *crtc,
+ const struct hw_crtc_timing *ref_timing,
+ const struct hw_crtc_timing *new_timing)
+{
+ crtc->tg->funcs->reprogram_timing(crtc->tg, ref_timing, new_timing);
+}
+
+void dal_controller_program_vbi_end_signal(
+ struct controller *crtc,
+ const struct vbi_end_signal_setup *setup)
+{
+ crtc->tg->funcs->program_vbi_end_signal(crtc->tg, setup);
+}
+
+void dal_controller_program_blanking(
+ struct controller *crtc,
+ const struct hw_crtc_timing *timing)
+{
+ crtc->tg->funcs->program_blanking(crtc->tg, timing);
+}
+
+/*
+ * *****************************************************************************
+ * ********************* Generic Control Interface ****************************
+ * *****************************************************************************
+ */
+
+/* (Get) Controller IO sequence */
+bool dal_controller_get_io_sequence(
+ struct controller *crtc,
+ enum io_register_sequence sequence,
+ struct io_reg_sequence *reg_sequence)
+{
+ return crtc->tg->funcs->
+ get_io_sequence(crtc->tg, sequence, reg_sequence);
+}
+
+/* (Set) Pipe control */
+void dal_controller_set_fe_clock(struct controller *crtc, bool enable)
+{
+ if (crtc->pc)
+ crtc->pc->funcs->enable_fe_clock(crtc->pc, enable);
+}
+
+void dal_controller_enable_display_pipe_clock_gating(
+ struct controller *crtc,
+ bool enable)
+{
+ if (crtc->pc)
+ crtc->pc->funcs->
+ enable_display_pipe_clock_gating(crtc->pc, enable);
+}
+
+bool dal_controller_pipe_control_lock(
+ struct controller *crtc,
+ uint32_t control_mask,
+ bool lock)
+{
+ if (crtc->pc)
+ return crtc->pc->funcs->pipe_control_lock(
+ crtc->pc,
+ control_mask,
+ lock);
+ else
+ return false;
+}
+
+/* (Set) Enable/disable triggered CRTC reset */
+bool dal_controller_enable_reset_trigger(
+ struct controller *crtc,
+ const struct trigger_params *params)
+{
+ return crtc->tg->funcs->enable_reset_trigger(crtc->tg, params);
+}
+
+void dal_controller_disable_reset_trigger(struct controller *crtc)
+{
+ crtc->tg->funcs->disable_reset_trigger(crtc->tg);
+}
+
+bool dal_controller_force_triggered_reset_now(
+ struct controller *crtc,
+ const struct trigger_params *params)
+{
+ return crtc->tg->funcs->force_triggered_reset_now(crtc->tg, params);
+}
+
+bool dal_controller_program_flow_control(
+ struct controller *crtc,
+ enum sync_source source)
+{
+ return crtc->tg->funcs->program_flow_control(crtc->tg, source);
+}
+
+void dal_controller_set_early_control(
+ struct controller *crtc,
+ uint32_t early_cntl)
+{
+ crtc->tg->funcs->set_early_control(crtc->tg, early_cntl);
+}
+
+void dal_controller_set_advanced_request(
+ struct controller *crtc,
+ bool enable,
+ const struct hw_crtc_timing *timing)
+{
+ crtc->tg->funcs->enable_advanced_request(crtc->tg, enable, timing);
+}
+
+/* (Set) Double buffering */
+void dal_controller_set_lock_timing_registers(
+ struct controller *crtc,
+ bool lock)
+{
+ crtc->tg->funcs->set_lock_timing_registers(crtc->tg, lock);
+}
+
+void dal_controller_set_lock_graph_surface_registers(
+ struct controller *crtc,
+ bool lock)
+{
+ crtc->tg->funcs->set_lock_graph_surface_registers(crtc->tg, lock);
+}
+
+void dal_controller_set_lock_master(struct controller *crtc, bool lock)
+{
+ crtc->tg->funcs->set_lock_master(crtc->tg, lock);
+}
+
+/* (Set/Get) Global Swap Lock */
+void dal_controller_setup_global_swaplock(
+ struct controller *crtc,
+ const struct dcp_gsl_params *params)
+{
+ crtc->tg->funcs->setup_global_swap_lock(crtc->tg, params);
+}
+
+void dal_controller_get_global_swaplock_setup(
+ struct controller *crtc,
+ struct dcp_gsl_params *params)
+{
+ crtc->tg->funcs->get_global_swap_lock_setup(crtc->tg, params);
+}
+
+/*
+ * **************************************************************************
+ * ***************************** VGA ***************************************
+ * **************************************************************************
+ */
+
+void dal_controller_disable_vga(struct controller *crtc)
+{
+ if (crtc->vga)
+ crtc->vga->funcs->disable_vga(crtc->vga);
+}
+
+/*
+ * **************************************************************************
+ * *************************** Display Scaler *******************************
+ * **************************************************************************
+ */
+
+/* Get */
+enum scaler_validation_code dal_controller_get_optimal_taps_number(
+ struct controller *crtc,
+ struct scaler_validation_params *params,
+ struct scaling_tap_info *taps)
+{
+ return crtc->scl->funcs->get_optimal_taps_number(params, taps);
+}
+
+enum scaler_validation_code dal_controller_get_next_lower_taps_number(
+ struct controller *crtc,
+ struct scaler_validation_params *params,
+ struct scaling_tap_info *taps)
+{
+ return crtc->scl->funcs->get_next_lower_taps_number(params, taps);
+}
+
+/* Set */
+/* General purpose scaler programming interface */
+bool dal_controller_set_scaler_wrapper(
+ struct controller *crtc,
+ const struct scaler_data *data)
+{
+ return crtc->scl->funcs->set_scaler_wrapper(crtc->scl, data);
+}
+
+/* not use scaling */
+void dal_controller_set_scaler_bypass(struct controller *crtc)
+{
+ crtc->scl->funcs->set_scaler_bypass(crtc->scl);
+}
+
+bool dal_controller_is_scaling_enabled(struct controller *crtc)
+{
+ return crtc->scl->funcs->is_scaling_enabled(crtc->scl);
+}
+
+bool dal_controller_update_viewport(
+ struct controller *crtc,
+ const struct rect *view_port,
+ bool is_fbc_attached)
+{
+ return
+ dal_scaler_update_viewport(
+ crtc->scl,
+ view_port,
+ is_fbc_attached);
+}
+
+/*
+ * **************************************************************************
+ * *************************** LUT and Gamma ******************************
+ * **************************************************************************
+ */
+
+/* Set */
+bool dal_controller_set_gamma_ramp(
+ struct controller *crtc,
+ const struct gamma_ramp *ramp,
+ const struct gamma_parameters *params)
+{
+ return crtc->grph_gamma->funcs->set_gamma_ramp(
+ crtc->grph_gamma, ramp, params);
+}
+
+bool dal_controller_set_palette(
+ struct controller *crtc,
+ const struct dev_c_lut *palette,
+ uint32_t start,
+ uint32_t length,
+ enum pixel_format surface_format)
+{
+ return dal_grph_gamma_set_palette(
+ crtc->grph_gamma, palette, start, length, surface_format);
+}
+
+/* set driver default gamma without any adjustment */
+bool dal_controller_set_default_gamma(
+ struct controller *crtc,
+ enum pixel_format surface_format)
+{
+ return dal_grph_gamma_set_default_gamma(
+ crtc->grph_gamma, surface_format);
+}
+
+/*
+ *******************************************************************************
+ ************************* Display color space and color adjustment ***********
+ *******************************************************************************
+ */
+
+/*******************************************************************************
+* GetGrphAdjustmentRange
+* @param [in] alphatype: one of the graphic matrix adjustment type
+* @param [out] pAdjustRange: adjustment HW range.
+* @return
+* @note
+* HW graphic color matrix adjustment range, DS provides API range, HWSS
+* converts HW adjustment unit to do adjustment.
+* @see
+*******************************************************************************/
+void dal_controller_get_grph_adjustment_range(
+ struct controller *crtc,
+ enum grph_csc_adjust_item adjust_item,
+ struct hw_adjustment_range *adjust_range)
+{
+ dal_csc_grph_get_graphic_color_adjustment_range(
+ adjust_item, adjust_range);
+}
+
+bool dal_controller_is_supported_custom_gamut_adjustment(
+ struct controller *crtc,
+ enum surface_type surface_type)
+{
+ return crtc->csc->funcs->
+ is_supported_custom_gamut_adjustment(crtc->csc);
+}
+
+bool dal_controller_is_supported_custom_gamma_coefficients(
+ struct controller *crtc,
+ enum surface_type surface_type)
+{
+ return surface_type == GRAPHIC_SURFACE;
+}
+
+bool dal_controller_is_supported_overlay_alpha_adjustment(
+ struct controller *crtc)
+{
+ return crtc->csc->funcs->
+ is_supported_overlay_alpha_adjustment(crtc->csc);
+}
+
+bool dal_controller_set_input_csc(
+ struct controller *crtc,
+ const enum color_space color_space)
+{
+ return crtc->csc->funcs->
+ set_input_csc(crtc->csc, color_space);
+}
+
+void dal_controller_get_overlay_adjustment_range(
+ struct controller *crtc,
+ enum ovl_csc_adjust_item overlay_adjust_item,
+ struct hw_adjustment_range *adjust_range)
+{
+ dal_csc_video_get_ovl_adjustment_range(
+ crtc->csc->csc_video,
+ overlay_adjust_item,
+ adjust_range);
+}
+
+void dal_controller_set_grph_csc_default(
+ struct controller *crtc,
+ const struct default_adjustment *default_adjust)
+{
+ if (default_adjust)
+ crtc->csc->funcs->
+ set_grph_csc_default(crtc->csc, default_adjust);
+}
+
+void dal_controller_set_grph_csc_adjustment(
+ struct controller *crtc,
+ const struct grph_csc_adjustment *adjust)
+{
+ crtc->csc->funcs->set_grph_csc_adjustment(crtc->csc, adjust);
+}
+
+void dal_controller_set_overscan_color_black(
+ struct controller *crtc,
+ enum color_space color_space)
+{
+ crtc->csc->funcs->set_overscan_color_black(crtc->csc, color_space);
+}
+
+void dal_controller_set_ovl_csc_adjustment(
+ struct controller *crtc,
+ const struct ovl_csc_adjustment *adjust,
+ enum color_space color_space)
+{
+ crtc->csc->funcs->
+ set_ovl_csc_adjustment(crtc->csc, adjust, color_space);
+
+ ASSERT(0 != adjust->overlay_gamma.adjust_divider);
+ if (adjust->overlay_gamma.adjust_divider) {
+ struct overlay_gamma_parameters *data = NULL;
+
+ data = dal_alloc(sizeof(*data));
+
+ if (!data) {
+ BREAK_TO_DEBUGGER();
+ /* memory allocation failure */
+ return;
+ }
+
+ data->ovl_gamma_cont = adjust->overlay_gamma.adjust
+ / adjust->overlay_gamma.adjust_divider;
+ data->adjust_type = adjust->adjust_gamma_type;
+ data->desktop_surface = adjust->desktop_surface_pixel_format;
+ data->flag.u_all = adjust->flag.u_all;
+
+ dal_memmove(&data->regamma, &adjust->regamma,
+ sizeof(data->regamma));
+
+ crtc->video_gamma->funcs->
+ set_overlay_pwl_adjustment(crtc->video_gamma, data);
+
+ dal_free(data);
+ }
+}
+
+void dal_controller_set_vertical_sync_adjustment(
+ struct controller *crtc,
+ uint32_t v_sync_polarity)
+{
+ crtc->tg->funcs->set_vertical_sync_polarity(crtc->tg, v_sync_polarity);
+}
+
+void dal_controller_set_horizontal_sync_adjustment(
+ struct controller *crtc,
+ uint32_t h_sync_polarity)
+{
+ crtc->tg->funcs->set_horizontal_sync_polarity(
+ crtc->tg,
+ h_sync_polarity);
+}
+
+void dal_controller_set_horizontal_sync_composite(
+ struct controller *crtc,
+ uint32_t h_sync_composite)
+{
+ crtc->tg->funcs->
+ set_horizontal_sync_composite(crtc->tg, h_sync_composite);
+}
+
+/*
+ *******************************************************************************
+ **************************** FMT (Dithering) **********************************
+ *******************************************************************************
+ */
+
+/* Formatter Block */
+void dal_controller_program_formatter_bit_depth_reduction(
+ struct controller *crtc,
+ const struct bit_depth_reduction_params *info)
+{
+ crtc->fmt->funcs->program_bit_depth_reduction(crtc->fmt, info);
+}
+
+void dal_controller_program_formatter_clamping_and_pixel_encoding(
+ struct controller *crtc,
+ const struct clamping_and_pixel_encoding_params
+ *info)
+{
+ crtc->fmt->funcs->program_clamping_and_pixel_encoding(crtc->fmt, info);
+}
+
+/* Deep color in FMAT */
+void dal_controller_formatter_set_dyn_expansion(
+ struct controller *crtc,
+ enum color_space color_space,
+ enum color_depth color_depth,
+ enum signal_type signal)
+{
+ crtc->fmt->funcs->
+ set_dyn_expansion(crtc->fmt, color_space, color_depth, signal);
+}
+
+/*
+ * *****************************************************************************
+ * ************************** Stereo *******************************************
+ * *****************************************************************************
+ */
+
+bool dal_controller_get_stereo_status(
+ struct controller *crtc,
+ struct crtc_stereo_status *status)
+{
+ return crtc->tg->funcs->get_stereo_status(crtc->tg, status);
+}
+
+void dal_controller_enable_stereo(
+ struct controller *crtc,
+ const struct crtc_stereo_parameters *params)
+{
+ if (!params->FRAME_PACKED) {
+ if (params->PROGRAM_STEREO)
+ crtc->fmt->funcs->setup_stereo_polarity(crtc->fmt,
+ FMT_STEREO_ACTION_ENABLE,
+ params->RIGHT_EYE_POLARITY);
+ else if (params->PROGRAM_POLARITY)
+ crtc->fmt->funcs->setup_stereo_polarity(crtc->fmt,
+ FMT_STEREO_ACTION_UPDATE_POLARITY,
+ params->RIGHT_EYE_POLARITY);
+ }
+
+ crtc->tg->funcs->enable_stereo(crtc->tg, params);
+}
+
+void dal_controller_disable_stereo(struct controller *crtc)
+{
+ crtc->fmt->funcs->setup_stereo_polarity(crtc->fmt,
+ FMT_STEREO_ACTION_DISABLE,
+ false);
+ crtc->tg->funcs->disable_stereo(crtc->tg);
+}
+
+void dal_controller_force_stereo_next_eye(
+ struct controller *crtc,
+ bool right_eye)
+{
+ crtc->tg->funcs->force_stereo_next_eye(crtc->tg, right_eye);
+}
+
+void dal_controller_reset_stereo_3d_phase(struct controller *crtc)
+{
+ crtc->tg->funcs->reset_stereo_3d_phase(crtc->tg);
+}
+
+void dal_controller_enable_stereo_mixer(
+ struct controller *crtc,
+ const struct crtc_mixer_params *params)
+{
+ if (crtc->pc)
+ crtc->pc->funcs->enable_stereo_mixer(crtc->pc, params);
+}
+
+void dal_controller_disable_stereo_mixer(struct controller *crtc)
+{
+ if (crtc->pc)
+ crtc->pc->funcs->disable_stereo_mixer(crtc->pc);
+}
+
+void dal_controller_set_test_pattern(
+ struct controller *crtc,
+ enum dp_test_pattern test_pattern,
+ enum hw_color_depth color_depth)
+{
+ crtc->tg->funcs->set_test_pattern(crtc->tg, test_pattern, color_depth);
+}
+
+void dal_controller_set_scaler_filter(
+ struct controller *crtc,
+ struct scaler_filter *filter)
+{
+ crtc->scl->filter = filter;
+}
+
+/*
+ * dal_controller_get_vblank_counter
+ *
+ * @brief
+ * Get counter of vblanks
+ *
+ * @param
+ * struct controller *crtc - [in] desired controller
+ *
+ * @return
+ * Counter of frames
+ */
+uint32_t dal_controller_get_vblank_counter(struct controller *crtc)
+{
+ return crtc->tg->funcs->get_vblank_counter(crtc->tg);
+}
+
+void dal_controller_set_blender_mode(
+ struct controller *crtc,
+ enum blender_mode mode)
+{
+ crtc->pc->funcs->set_blender_mode(crtc->pc, mode);
+}
+
+bool dal_controller_program_alpha_blending(
+ struct controller *crtc,
+ const struct alpha_mode_cfg *cfg)
+{
+ return crtc->pc->funcs->program_alpha_blending(crtc->pc, cfg);
+}
+
+bool dal_controller_is_surface_supported(
+ struct controller *crtc,
+ const struct plane_config *pl_cfg)
+{
+ return crtc->funcs.is_surface_supported(crtc, pl_cfg);
+}
+
+/*
+ * **************************************************************************
+ * ********************* Surface Interface *************************
+ * **************************************************************************
+ */
+
+bool dal_controller_program_surface_config(
+ struct controller *crtc,
+ const struct plane_surface_config *configs)
+{
+ return dal_surface_program_config(
+ crtc->surface,
+ configs);
+}
+
+bool dal_controller_program_surface_flip_and_addr(
+ struct controller *crtc,
+ const struct plane_addr_flip_info *flip_info)
+{
+ return dal_surface_program_flip_and_addr(
+ crtc->surface,
+ flip_info);
+}
+
+/*
+ * **************************************************************************
+ * ********************* Cursor Interface *************************
+ * **************************************************************************
+ */
+bool dal_controller_set_cursor_position(
+ struct controller *crtc,
+ const struct cursor_position *position)
+{
+ return dal_cursor_set_position(
+ crtc->cursor,
+ position);
+}
+
+bool dal_controller_set_cursor_attributes(
+ struct controller *crtc,
+ const struct cursor_attributes *attributes)
+{
+ return dal_cursor_set_attributes(
+ crtc->cursor,
+ attributes);
+}