diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/files/0741-drm-amd-dal-refactor-hw_sequencer.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/files/0741-drm-amd-dal-refactor-hw_sequencer.patch | 3195 |
1 files changed, 0 insertions, 3195 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/files/0741-drm-amd-dal-refactor-hw_sequencer.patch b/meta-amdfalconx86/recipes-kernel/linux/files/0741-drm-amd-dal-refactor-hw_sequencer.patch deleted file mode 100644 index b9c8fa93..00000000 --- a/meta-amdfalconx86/recipes-kernel/linux/files/0741-drm-amd-dal-refactor-hw_sequencer.patch +++ /dev/null @@ -1,3195 +0,0 @@ -From 8aa635d8c08f9736593d3e8896094481c6da174a Mon Sep 17 00:00:00 2001 -From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> -Date: Wed, 27 Jan 2016 16:03:57 -0500 -Subject: [PATCH 0741/1110] drm/amd/dal: refactor hw_sequencer - -Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> -Acked-by: Harry Wentland <harry.wentland@amd.com> ---- - drivers/gpu/drm/amd/dal/dc/core/dc.c | 65 +-- - drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 12 +- - drivers/gpu/drm/amd/dal/dc/core/dc_resource.c | 28 +- - drivers/gpu/drm/amd/dal/dc/core/dc_target.c | 16 +- - .../drm/amd/dal/dc/dce100/dce100_hw_sequencer.c | 326 ++++++++++- - .../drm/amd/dal/dc/dce100/dce100_hw_sequencer.h | 2 +- - .../gpu/drm/amd/dal/dc/dce100/dce100_resource.c | 445 ++++++++------- - .../drm/amd/dal/dc/dce110/dce110_clock_source.c | 1 - - .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 630 +++++++++------------ - .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 452 +++++++-------- - .../gpu/drm/amd/dal/dc/dce110/dce110_resource.h | 15 - - .../amd/dal/dc/dce110/dce110_timing_generator.c | 2 +- - .../amd/dal/dc/dce110/dce110_timing_generator.h | 2 +- - drivers/gpu/drm/amd/dal/dc/inc/core_dc.h | 2 - - drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 21 + - drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h | 110 ++-- - drivers/gpu/drm/amd/dal/dc/inc/resource.h | 4 + - drivers/gpu/drm/amd/dal/dc/inc/timing_generator.h | 155 +++++ - .../drm/amd/dal/dc/inc/timing_generator_types.h | 155 ----- - 19 files changed, 1333 insertions(+), 1110 deletions(-) - create mode 100644 drivers/gpu/drm/amd/dal/dc/inc/timing_generator.h - delete mode 100644 drivers/gpu/drm/amd/dal/dc/inc/timing_generator_types.h - -diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c -index 1a17090..b3c919c 100644 ---- a/drivers/gpu/drm/amd/dal/dc/core/dc.c -+++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c -@@ -38,8 +38,9 @@ - - #include "bandwidth_calcs.h" - #include "include/irq_service_interface.h" --#include "inc/transform.h" --#include "../virtual/virtual_link_encoder.h" -+#include "transform.h" -+#include "timing_generator.h" -+#include "virtual/virtual_link_encoder.h" - - #include "link_hwss.h" - #include "link_encoder.h" -@@ -63,13 +64,11 @@ static void destroy_links(struct dc *dc) - uint32_t i; - - for (i = 0; i < dc->link_count; i++) { -- - if (NULL != dc->links[i]) - link_destroy(&dc->links[i]); - } - } - -- - static bool create_links(struct dc *dc, const struct dc_init_data *init_params) - { - int i; -@@ -83,8 +82,10 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params) - connectors_num = dcb->funcs->get_connectors_number(dcb); - - if (connectors_num > ENUM_ID_COUNT) { -- dal_error("DC: Number of connectors %d exceeds maximum of %d!\n", -- connectors_num, ENUM_ID_COUNT); -+ dal_error( -+ "DC: Number of connectors %d exceeds maximum of %d!\n", -+ connectors_num, -+ ENUM_ID_COUNT); - return false; - } - -@@ -93,8 +94,11 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params) - return false; - } - -- dal_output_to_console("DC: %s: connectors_num: physical:%d, virtual:%d\n", -- __func__, connectors_num, init_params->num_virtual_links); -+ dal_output_to_console( -+ "DC: %s: connectors_num: physical:%d, virtual:%d\n", -+ __func__, -+ connectors_num, -+ init_params->num_virtual_links); - - for (i = 0; i < connectors_num; i++) { - struct link_init_data link_init_params = {0}; -@@ -105,22 +109,22 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params) - link_init_params.connector_index = i; - link_init_params.link_index = dc->link_count; - link_init_params.dc = dc; -- link = link_create(&link_init_params); -+ link = link_create(&link_init_params); - - if (link) { - dc->links[dc->link_count] = link; - link->dc = dc; - ++dc->link_count; -- } -- else { -+ } else { - dal_error("DC: failed to create link!\n"); - } - } - - for (i = 0; i < init_params->num_virtual_links; i++) { -- struct core_link *link = -- dc_service_alloc(dc->ctx, sizeof(*link)); -- struct encoder_init_data enc_init = { 0 }; -+ struct core_link *link = dc_service_alloc( -+ dc->ctx, -+ sizeof(*link)); -+ struct encoder_init_data enc_init = {0}; - - if (link == NULL) { - BREAK_TO_DEBUGGER(); -@@ -134,8 +138,9 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params) - link->link_id.type = OBJECT_TYPE_CONNECTOR; - link->link_id.id = CONNECTOR_ID_VIRTUAL; - link->link_id.enum_id = ENUM_ID_1; -- link->link_enc = -- dc_service_alloc(dc->ctx, sizeof(*link->link_enc)); -+ link->link_enc = dc_service_alloc( -+ dc->ctx, -+ sizeof(*link->link_enc)); - - enc_init.adapter_service = init_params->adapter_srv; - enc_init.ctx = init_params->ctx; -@@ -159,6 +164,7 @@ failed_alloc: - return false; - } - -+ - static void init_hw(struct dc *dc) - { - int i; -@@ -198,11 +204,11 @@ static void init_hw(struct dc *dc) - for(i = 0; i < dc->res_pool.controller_count; i++) { - struct timing_generator *tg = dc->res_pool.timing_generators[i]; - -- dc->hwss.disable_vga(tg); -+ tg->funcs->disable_vga(tg); - - /* Blank controller using driver code instead of - * command table. */ -- dc->hwss.disable_memory_requests(tg); -+ tg->funcs->set_blank(tg, true); - } - - for(i = 0; i < dc->res_pool.audio_count; i++) { -@@ -359,18 +365,12 @@ static bool construct(struct dc *dc, const struct dal_init_data *init_params) - if (!dc_construct_hw_sequencer(dc_init_data.adapter_srv, dc)) - goto hwss_fail; - -- -- /* TODO: create all the sub-objects of DC. */ -- if (false == create_links(dc, &dc_init_data)) -- goto create_links_fail; -- -- if (!dc->hwss.construct_resource_pool( -- dc_init_data.adapter_srv, -- dc_init_data.num_virtual_links, -- dc, -- &dc->res_pool)) -+ if (!dc_construct_resource_pool( -+ dc_init_data.adapter_srv, dc, dc_init_data.num_virtual_links)) - goto construct_resource_fail; - -+ if (!create_links(dc, &dc_init_data)) -+ goto create_links_fail; - - bw_calcs_init(&dc->bw_dceip, &dc->bw_vbios); - -@@ -393,7 +393,7 @@ ctx_fail: - static void destruct(struct dc *dc) - { - destroy_links(dc); -- dc->hwss.destruct_resource_pool(&dc->res_pool); -+ dc->res_pool.funcs->destruct(&dc->res_pool); - dal_logger_destroy(&dc->ctx->logger); - dc_service_free(dc->ctx, dc->ctx); - } -@@ -449,7 +449,8 @@ bool dc_validate_resources( - if(context == NULL) - goto context_alloc_fail; - -- result = dc->hwss.validate_with_context(dc, set, set_count, context); -+ result = dc->res_pool.funcs->validate_with_context( -+ dc, set, set_count, context); - - dc_service_free(dc->ctx, context); - context_alloc_fail: -@@ -559,7 +560,7 @@ bool dc_commit_targets( - if (context == NULL) - goto context_alloc_fail; - -- result = dc->hwss.validate_with_context(dc, set, target_count, context); -+ result = dc->res_pool.funcs->validate_with_context(dc, set, target_count, context); - if (result != DC_OK){ - BREAK_TO_DEBUGGER(); - goto fail; -@@ -679,6 +680,7 @@ void dc_flip_surface_addrs(struct dc* dc, - surface->public.flip_immediate = flip_addrs[i].flip_immediate; - - dc->hwss.update_plane_address( -+ dc, - surface, - DC_TARGET_TO_CORE(surface->status.dc_target)); - } -@@ -789,7 +791,6 @@ void dc_resume(const struct dc *dc) - core_link_resume(dc->links[i]); - } - -- - bool dc_read_dpcd( - struct dc *dc, - uint32_t link_index, -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 a2879bb..c81f4a2 100644 ---- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c -+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c -@@ -67,7 +67,7 @@ static void destruct(struct core_link *link) - dal_ddc_service_destroy(&link->ddc); - - if(link->link_enc) -- link->ctx->dc->hwss.encoder_destroy(&link->link_enc); -+ link->ctx->dc->res_pool.funcs->link_enc_destroy(&link->link_enc); - } - - /* -@@ -988,7 +988,8 @@ static bool construct( - enc_init_data.hpd_source = get_hpd_line(link, as); - enc_init_data.transmitter = - translate_encoder_to_transmitter(enc_init_data.encoder); -- link->link_enc = dc_ctx->dc->hwss.encoder_create(&enc_init_data); -+ link->link_enc = dc_ctx->dc->res_pool.funcs->link_enc_create( -+ &enc_init_data); - - if( link->link_enc == NULL) { - DC_ERROR("Failed to create link encoder!\n"); -@@ -1449,7 +1450,6 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) - struct stream_encoder *stream_encoder = stream->stream_enc; - struct dp_mst_stream_allocation_table proposed_table = {0}; - struct fixed31_32 avg_time_slots_per_mtp; -- struct dc *dc = stream->ctx->dc; - struct fixed31_32 pbn; - struct fixed31_32 pbn_per_slot; - uint8_t i; -@@ -1524,7 +1524,8 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) - avg_time_slots_per_mtp = dal_fixed31_32_div(pbn, pbn_per_slot); - - -- dc->hwss.set_mst_bandwidth( -+ -+ stream_encoder->funcs->set_mst_bandwidth( - stream_encoder, - avg_time_slots_per_mtp); - -@@ -1539,7 +1540,6 @@ static enum dc_status deallocate_mst_payload(struct core_stream *stream) - struct stream_encoder *stream_encoder = stream->stream_enc; - struct dp_mst_stream_allocation_table proposed_table = {0}; - struct fixed31_32 avg_time_slots_per_mtp = dal_fixed31_32_from_int(0); -- struct dc *dc = stream->ctx->dc; - uint8_t i; - bool mst_mode = (link->public.type == dc_connection_mst_branch); - -@@ -1551,7 +1551,7 @@ static enum dc_status deallocate_mst_payload(struct core_stream *stream) - */ - - /* slot X.Y */ -- dc->hwss.set_mst_bandwidth( -+ stream_encoder->funcs->set_mst_bandwidth( - stream_encoder, - avg_time_slots_per_mtp); - -diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c -index 52307cb..fcda0cb 100644 ---- a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c -+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c -@@ -31,6 +31,33 @@ - #include "opp.h" - #include "transform.h" - -+#include "dce100/dce100_resource.h" -+#include "dce110/dce110_resource.h" -+ -+bool dc_construct_resource_pool(struct adapter_service *adapter_serv, -+ struct dc *dc, -+ uint8_t num_virtual_links) -+{ -+ enum dce_version dce_ver = dal_adapter_service_get_dce_version(adapter_serv); -+ -+ switch (dce_ver) { -+#if defined(CONFIG_DRM_AMD_DAL_DCE10_0) -+ case DCE_VERSION_10_0: -+ return dce100_construct_resource_pool( -+ adapter_serv, num_virtual_links, dc, &dc->res_pool); -+#endif -+#if defined(CONFIG_DRM_AMD_DAL_DCE11_0) -+ case DCE_VERSION_11_0: -+ return dce110_construct_resource_pool( -+ adapter_serv, num_virtual_links, dc, &dc->res_pool); -+#endif -+ default: -+ break; -+ } -+ -+ return false; -+} -+ - void unreference_clock_source( - struct resource_context *res_ctx, - struct clock_source *clock_source) -@@ -512,7 +539,6 @@ void pplib_apply_display_requirements( - - pp_display_cfg.avail_mclk_switch_time_us = - get_min_vblank_time_us(context); -- /* TODO: dce11.2*/ - pp_display_cfg.avail_mclk_switch_time_in_disp_active_us = 0; - - pp_display_cfg.disp_clk_khz = context->bw_results.dispclk_khz; -diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c -index 8cb05b7..2756e7b 100644 ---- a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c -+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c -@@ -27,6 +27,7 @@ - #include "hw_sequencer.h" - #include "resource.h" - #include "ipp.h" -+#include "timing_generator.h" - - #define COEFF_RANGE 3 - #define REGAMMA_COEFF_A0 31308 -@@ -280,7 +281,8 @@ bool dc_commit_surfaces_to_target( - new_surfaces[i], - DC_STREAM_TO_CORE(target->public.streams[j])); - -- if (dc->hwss.validate_bandwidth(dc, &dc->current_context) != DC_OK) { -+ if (dc->res_pool.funcs->validate_bandwidth(dc, &dc->current_context) -+ != DC_OK) { - BREAK_TO_DEBUGGER(); - goto unexpected_fail; - } -@@ -309,12 +311,10 @@ bool dc_commit_surfaces_to_target( - DC_STREAM_TO_CORE(target->public.streams[0])->ipp, - DC_STREAM_TO_CORE(target->public.streams[0])->opp); - -- dc->hwss.set_plane_config( -- core_surface, -- target); -+ dc->hwss.set_plane_config(dc, core_surface, target); - - if (is_valid_address) -- dc->hwss.update_plane_address(core_surface, target); -+ dc->hwss.update_plane_address(dc, core_surface, target); - } - - if (current_enabled_surface_count == 0 && new_enabled_surface_count > 0) -@@ -358,7 +358,7 @@ void dc_target_enable_memory_requests(struct dc_target *target) - struct timing_generator *tg = - DC_STREAM_TO_CORE(core_target->public.streams[i])->tg; - -- if (!core_target->ctx->dc->hwss.enable_memory_requests(tg)) { -+ if (!tg->funcs->set_blank(tg, false)) { - dal_error("DC: failed to unblank crtc!\n"); - BREAK_TO_DEBUGGER(); - } -@@ -379,7 +379,7 @@ void dc_target_disable_memory_requests(struct dc_target *target) - continue; - } - -- if (false == core_target->ctx->dc->hwss.disable_memory_requests(tg)) { -+ if (false == tg->funcs->set_blank(tg, true)) { - dal_error("DC: failed to blank crtc!\n"); - BREAK_TO_DEBUGGER(); - } -@@ -464,7 +464,7 @@ uint32_t dc_target_get_vblank_counter(const struct dc_target *dc_target) - struct timing_generator *tg = - DC_STREAM_TO_CORE(core_target->public.streams[0])->tg; - -- return core_target->ctx->dc->hwss.get_vblank_counter(tg); -+ return tg->funcs->get_frame_count(tg); - } - - enum dc_irq_source dc_target_get_irq_src( -diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.c -index b37df4a..b76c8ee 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.c -@@ -22,20 +22,332 @@ - * Authors: AMD - * - */ -- - #include "dc_services.h" -- -+#include "dc.h" -+#include "core_dc.h" -+#include "core_types.h" -+#include "hw_sequencer.h" -+#include "dce100_hw_sequencer.h" - #include "dce110/dce110_hw_sequencer.h" - --#include "resource.h" --#include "hw_sequencer.h" --#include "dce100_resource.h" -+/* include DCE10 register header files */ -+#include "dce/dce_10_0_d.h" -+#include "dce/dce_10_0_sh_mask.h" -+ -+struct dce100_hw_seq_reg_offsets { -+ uint32_t blnd; -+ uint32_t crtc; -+}; -+ -+enum pipe_lock_control { -+ PIPE_LOCK_CONTROL_GRAPHICS = 1 << 0, -+ PIPE_LOCK_CONTROL_BLENDER = 1 << 1, -+ PIPE_LOCK_CONTROL_SCL = 1 << 2, -+ PIPE_LOCK_CONTROL_SURFACE = 1 << 3, -+ PIPE_LOCK_CONTROL_MODE = 1 << 4 -+}; -+ -+enum blender_mode { -+ BLENDER_MODE_CURRENT_PIPE = 0,/* Data from current pipe only */ -+ BLENDER_MODE_OTHER_PIPE, /* Data from other pipe only */ -+ BLENDER_MODE_BLENDING,/* Alpha blending - blend 'current' and 'other' */ -+ BLENDER_MODE_STEREO -+}; -+ -+static const struct dce100_hw_seq_reg_offsets reg_offsets[] = { -+{ -+ .blnd = (mmBLND0_BLND_CONTROL - mmBLND_CONTROL), -+ .crtc = (mmCRTC0_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), -+}, -+{ -+ .blnd = (mmBLND1_BLND_CONTROL - mmBLND_CONTROL), -+ .crtc = (mmCRTC1_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), -+}, -+{ -+ .blnd = (mmBLND2_BLND_CONTROL - mmBLND_CONTROL), -+ .crtc = (mmCRTC2_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), -+} -+}; -+ -+#define HW_REG_BLND(reg, id)\ -+ (reg + reg_offsets[id].blnd) -+ -+#define HW_REG_CRTC(reg, id)\ -+ (reg + reg_offsets[id].crtc) -+ -+ -+/******************************************************************************* -+ * Private definitions -+ ******************************************************************************/ -+/***************************PIPE_CONTROL***********************************/ -+static void dce100_enable_fe_clock( -+ struct dc_context *ctx, uint8_t controller_id, bool enable) -+{ -+ uint32_t value = 0; -+ uint32_t addr; -+ -+ addr = HW_REG_CRTC(mmDCFE_CLOCK_CONTROL, controller_id); -+ -+ value = dal_read_reg(ctx, addr); -+ -+ set_reg_field_value( -+ value, -+ enable, -+ DCFE_CLOCK_CONTROL, -+ DCFE_CLOCK_ENABLE); -+ -+ dal_write_reg(ctx, addr, value); -+} -+ -+static bool dce100_pipe_control_lock( -+ struct dc_context *ctx, -+ uint8_t controller_idx, -+ uint32_t control_mask, -+ bool lock) -+{ -+ uint32_t addr = HW_REG_BLND(mmBLND_V_UPDATE_LOCK, controller_idx); -+ uint32_t value = dal_read_reg(ctx, addr); -+ bool need_to_wait = false; -+ -+ if (control_mask & PIPE_LOCK_CONTROL_GRAPHICS) -+ set_reg_field_value( -+ value, -+ lock, -+ BLND_V_UPDATE_LOCK, -+ BLND_DCP_GRPH_V_UPDATE_LOCK); -+ -+ if (control_mask & PIPE_LOCK_CONTROL_SCL) -+ set_reg_field_value( -+ value, -+ lock, -+ BLND_V_UPDATE_LOCK, -+ BLND_SCL_V_UPDATE_LOCK); -+ -+ if (control_mask & PIPE_LOCK_CONTROL_SURFACE) -+ set_reg_field_value( -+ value, -+ lock, -+ BLND_V_UPDATE_LOCK, -+ BLND_DCP_GRPH_SURF_V_UPDATE_LOCK); -+ -+ if (control_mask & PIPE_LOCK_CONTROL_BLENDER) { -+ set_reg_field_value( -+ value, -+ lock, -+ BLND_V_UPDATE_LOCK, -+ BLND_BLND_V_UPDATE_LOCK); -+ need_to_wait = true; -+ } -+ -+ if (control_mask & PIPE_LOCK_CONTROL_MODE) -+ set_reg_field_value( -+ value, -+ lock, -+ BLND_V_UPDATE_LOCK, -+ BLND_V_UPDATE_LOCK_MODE); -+ -+ dal_write_reg(ctx, addr, value); -+ -+ if (!lock && need_to_wait) { -+ uint8_t counter = 0; -+ const uint8_t counter_limit = 100; -+ const uint16_t delay_us = 1000; -+ -+ uint8_t pipe_pending; -+ -+ addr = HW_REG_BLND(mmBLND_REG_UPDATE_STATUS, -+ controller_idx); -+ -+ while (counter < counter_limit) { -+ value = dal_read_reg(ctx, addr); -+ -+ pipe_pending = 0; -+ -+ if (control_mask & PIPE_LOCK_CONTROL_BLENDER) { -+ pipe_pending |= -+ get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ BLND_BLNDC_UPDATE_PENDING); -+ pipe_pending |= get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ BLND_BLNDO_UPDATE_PENDING); -+ } -+ -+ if (control_mask & PIPE_LOCK_CONTROL_SCL) { -+ pipe_pending |= -+ get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ SCL_BLNDC_UPDATE_PENDING); -+ pipe_pending |= -+ get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ SCL_BLNDO_UPDATE_PENDING); -+ } -+ if (control_mask & PIPE_LOCK_CONTROL_GRAPHICS) { -+ pipe_pending |= -+ get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ DCP_BLNDC_GRPH_UPDATE_PENDING); -+ pipe_pending |= -+ get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ DCP_BLNDO_GRPH_UPDATE_PENDING); -+ } -+ if (control_mask & PIPE_LOCK_CONTROL_SURFACE) { -+ pipe_pending |= get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ DCP_BLNDC_GRPH_SURF_UPDATE_PENDING); -+ pipe_pending |= get_reg_field_value( -+ value, -+ BLND_REG_UPDATE_STATUS, -+ DCP_BLNDO_GRPH_SURF_UPDATE_PENDING); -+ } -+ -+ if (pipe_pending == 0) -+ break; -+ -+ counter++; -+ dc_service_delay_in_microseconds(ctx, delay_us); -+ } -+ -+ if (counter == counter_limit) { -+ dal_logger_write( -+ ctx->logger, -+ LOG_MAJOR_WARNING, -+ LOG_MINOR_COMPONENT_CONTROLLER, -+ "%s: wait for update exceeded (wait %d us)\n", -+ __func__, -+ counter * delay_us); -+ dal_logger_write( -+ ctx->logger, -+ LOG_MAJOR_WARNING, -+ LOG_MINOR_COMPONENT_CONTROLLER, -+ "%s: control %d, remain value %x\n", -+ __func__, -+ control_mask, -+ value); -+ } else { -+ /* OK. */ -+ } -+ } -+ -+ return true; -+} -+ -+static void dce100_set_blender_mode( -+ struct dc_context *ctx, -+ uint8_t controller_id, -+ uint32_t mode) -+{ -+ uint32_t value; -+ uint32_t addr = HW_REG_BLND(mmBLND_CONTROL, controller_id); -+ uint32_t blnd_mode; -+ uint32_t feedthrough = 0; -+ -+ switch (mode) { -+ case BLENDER_MODE_OTHER_PIPE: -+ feedthrough = 0; -+ blnd_mode = 1; -+ break; -+ case BLENDER_MODE_BLENDING: -+ feedthrough = 0; -+ blnd_mode = 2; -+ break; -+ case BLENDER_MODE_CURRENT_PIPE: -+ default: -+ feedthrough = 1; -+ blnd_mode = 0; -+ break; -+ } -+ -+ value = dal_read_reg(ctx, addr); -+ -+ set_reg_field_value( -+ value, -+ feedthrough, -+ BLND_CONTROL, -+ BLND_FEEDTHROUGH_EN); -+ -+ set_reg_field_value( -+ value, -+ blnd_mode, -+ BLND_CONTROL, -+ BLND_MODE); -+ -+ dal_write_reg(ctx, addr, value); -+} -+ -+static bool dce100_enable_display_power_gating( -+ struct dc_context *ctx, -+ uint8_t controller_id, -+ struct dc_bios *dcb, -+ enum pipe_gating_control power_gating) -+{ -+ enum bp_result bp_result = BP_RESULT_OK; -+ enum bp_pipe_control_action cntl; -+ -+ if (power_gating == PIPE_GATING_CONTROL_INIT) -+ cntl = ASIC_PIPE_INIT; -+ else if (power_gating == PIPE_GATING_CONTROL_ENABLE) -+ cntl = ASIC_PIPE_ENABLE; -+ else -+ cntl = ASIC_PIPE_DISABLE; -+ -+ if (!(power_gating == PIPE_GATING_CONTROL_INIT && controller_id != 0)) -+ bp_result = dcb->funcs->enable_disp_power_gating( -+ dcb, controller_id + 1, cntl); -+ -+ if (bp_result == BP_RESULT_OK) -+ return true; -+ else -+ return false; -+} -+ -+static void enable_hw_base_light_sleep(void) -+{ -+ /* TODO: implement */ -+} -+ -+static void disable_sw_manual_control_light_sleep(void) -+{ -+ /* TODO: implement */ -+} -+ -+static void enable_sw_manual_control_light_sleep(void) -+{ -+ /* TODO: implement */ -+} -+ -+static void dal_dc_clock_gating_dce100_power_up(struct dc_context *ctx, bool enable) -+{ -+ if (enable) { -+ enable_hw_base_light_sleep(); -+ disable_sw_manual_control_light_sleep(); -+ } else { -+ enable_sw_manual_control_light_sleep(); -+ } -+} -+ -+/**************************************************************************/ - - bool dce100_hw_sequencer_construct(struct dc *dc) - { - dce110_hw_sequencer_construct(dc); -- dc->hwss.construct_resource_pool = dce100_construct_resource_pool; -- dc->hwss.destruct_resource_pool = dce100_destruct_resource_pool; -+ -+ /* TODO: dce80 is empty implementation at the moment*/ -+ dc->hwss.clock_gating_power_up = dal_dc_clock_gating_dce100_power_up; -+ -+ dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating; -+ dc->hwss.enable_fe_clock = dce100_enable_fe_clock; -+ dc->hwss.pipe_control_lock = dce100_pipe_control_lock; -+ dc->hwss.set_blender_mode = dce100_set_blender_mode; - - return true; - } -diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.h -index d52bfda..0ce637e 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.h -+++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_hw_sequencer.h -@@ -32,5 +32,5 @@ struct dc; - - bool dce100_hw_sequencer_construct(struct dc *dc); - --#endif /* __DC_HWSS_DCE110_H__ */ -+#endif /* __DC_HWSS_DCE100_H__ */ - -diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c -index 4027547..0c1757b 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c -@@ -30,6 +30,8 @@ - #include "resource.h" - #include "include/irq_service_interface.h" - -+#include "../virtual/virtual_stream_encoder.h" -+#include "dce110/dce110_resource.h" - #include "dce110/dce110_timing_generator.h" - #include "dce110/dce110_link_encoder.h" - #include "dce110/dce110_mem_input.h" -@@ -41,7 +43,6 @@ - - #include "dce/dce_10_0_d.h" - --/* TODO remove these defines */ - #ifndef mmDP_DPHY_INTERNAL_CTRL - #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7 - #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7 -@@ -524,215 +525,6 @@ void dce100_clock_source_destroy(struct clock_source **clk_src) - *clk_src = NULL; - } - --bool dce100_construct_resource_pool( -- struct adapter_service *adapter_serv, -- uint8_t num_virtual_links, -- struct dc *dc, -- struct resource_pool *pool) --{ -- unsigned int i; -- struct audio_init_data audio_init_data = { 0 }; -- struct dc_context *ctx = dc->ctx; -- -- pool->adapter_srv = adapter_serv; -- -- pool->stream_engines.engine.ENGINE_ID_DIGA = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGB = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGC = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGD = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGE = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGF = 1; -- -- pool->clock_sources[DCE100_CLK_SRC_PLL0] = dce100_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_PLL0, &dce100_clk_src_reg_offsets[0]); -- pool->clock_sources[DCE100_CLK_SRC_PLL1] = dce100_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_PLL1, &dce100_clk_src_reg_offsets[1]); -- pool->clock_sources[DCE100_CLK_SRC_EXT] = dce100_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_EXTERNAL, &dce100_clk_src_reg_offsets[0]); -- pool->clk_src_count = DCE100_CLK_SRC_TOTAL; -- -- for (i = 0; i < pool->clk_src_count; i++) { -- if (pool->clock_sources[i] == NULL) { -- dal_error("DC: failed to create clock sources!\n"); -- BREAK_TO_DEBUGGER(); -- goto clk_src_create_fail; -- } -- } -- -- pool->display_clock = dal_display_clock_dce110_create(ctx, adapter_serv); -- if (pool->display_clock == NULL) { -- dal_error("DC: failed to create display clock!\n"); -- BREAK_TO_DEBUGGER(); -- goto disp_clk_create_fail; -- } -- -- { -- struct irq_service_init_data init_data; -- -- init_data.ctx = dc->ctx; -- pool->irqs = dal_irq_service_create( -- dal_adapter_service_get_dce_version( -- dc->res_pool.adapter_srv), -- &init_data); -- if (!pool->irqs) -- goto irqs_create_fail; -- -- } -- -- pool->controller_count = -- dal_adapter_service_get_func_controllers_num(adapter_serv); -- pool->stream_enc_count = dal_adapter_service_get_stream_engines_num( -- adapter_serv); -- pool->scaler_filter = dal_scaler_filter_create(ctx); -- if (pool->scaler_filter == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create filter!\n"); -- goto filter_create_fail; -- } -- -- for (i = 0; i < pool->controller_count; i++) { -- pool->timing_generators[i] = dce100_timing_generator_create( -- adapter_serv, ctx, i, &dce100_tg_offsets[i]); -- if (pool->timing_generators[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create tg!\n"); -- goto controller_create_fail; -- } -- -- pool->mis[i] = dce100_mem_input_create(ctx, i, -- &dce100_mi_reg_offsets[i]); -- if (pool->mis[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create memory input!\n"); -- goto controller_create_fail; -- } -- -- pool->ipps[i] = dce100_ipp_create(ctx, i, -- &dce100_ipp_reg_offsets[i]); -- if (pool->ipps[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create input pixel processor!\n"); -- goto controller_create_fail; -- } -- -- pool->transforms[i] = dce100_transform_create( -- ctx, i, &dce100_xfm_offsets[i]); -- if (pool->transforms[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create transform!\n"); -- goto controller_create_fail; -- } -- pool->transforms[i]->funcs->transform_set_scaler_filter( -- pool->transforms[i], -- pool->scaler_filter); -- -- pool->opps[i] = dce100_opp_create(ctx, i, &dce100_opp_reg_offsets[i]); -- if (pool->opps[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create output pixel processor!\n"); -- goto controller_create_fail; -- } -- } -- -- audio_init_data.as = adapter_serv; -- audio_init_data.ctx = ctx; -- pool->audio_count = 0; -- for (i = 0; i < pool->controller_count; i++) { -- struct graphics_object_id obj_id; -- -- obj_id = dal_adapter_service_enum_audio_object(adapter_serv, i); -- if (false == dal_graphics_object_id_is_valid(obj_id)) { -- /* no more valid audio objects */ -- break; -- } -- -- audio_init_data.audio_stream_id = obj_id; -- pool->audios[i] = dal_audio_create(&audio_init_data); -- if (pool->audios[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create DPPs!\n"); -- goto audio_create_fail; -- } -- pool->audio_count++; -- } -- -- for (i = 0; i < pool->stream_enc_count; i++) { -- /* TODO: rework fragile code*/ -- if (pool->stream_engines.u_all & 1 << i) { -- pool->stream_enc[i] = dce100_stream_encoder_create( -- i, dc->ctx, -- dal_adapter_service_get_bios_parser( -- adapter_serv), -- &stream_enc_regs[i]); -- if (pool->stream_enc[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create stream_encoder!\n"); -- goto stream_enc_create_fail; -- } -- } -- } -- -- return true; -- --stream_enc_create_fail: -- for (i = 0; i < pool->stream_enc_count; i++) { -- if (pool->stream_enc[i] != NULL) -- dc_service_free(pool->stream_enc[i]->ctx, -- DCE110STRENC_FROM_STRENC(pool->stream_enc[i])); -- } -- --audio_create_fail: -- for (i = 0; i < pool->controller_count; i++) { -- if (pool->audios[i] != NULL) -- dal_audio_destroy(&pool->audios[i]); -- } -- --controller_create_fail: -- for (i = 0; i < pool->controller_count; i++) { -- if (pool->opps[i] != NULL) -- dce100_opp_destroy(&pool->opps[i]); -- -- if (pool->transforms[i] != NULL) -- dce100_transform_destroy(&pool->transforms[i]); -- -- if (pool->ipps[i] != NULL) -- dce110_ipp_destroy(&pool->ipps[i]); -- -- if (pool->mis[i] != NULL) { -- dc_service_free(pool->mis[i]->ctx, -- TO_DCE110_MEM_INPUT(pool->mis[i])); -- pool->mis[i] = NULL; -- } -- -- if (pool->timing_generators[i] != NULL) { -- dc_service_free(pool->timing_generators[i]->ctx, -- DCE110TG_FROM_TG(pool->timing_generators[i])); -- pool->timing_generators[i] = NULL; -- } -- } -- --filter_create_fail: -- dal_irq_service_destroy(&pool->irqs); -- --irqs_create_fail: -- dal_display_clock_destroy(&pool->display_clock); -- --disp_clk_create_fail: --clk_src_create_fail: -- for (i = 0; i < pool->clk_src_count; i++) { -- if (pool->clock_sources[i] != NULL) -- dce100_clock_source_destroy(&pool->clock_sources[i]); -- } -- return false; --} -- - void dce100_destruct_resource_pool(struct resource_pool *pool) - { - unsigned int i; -@@ -775,6 +567,7 @@ void dce100_destruct_resource_pool(struct resource_pool *pool) - if (pool->audios[i] != NULL) - dal_audio_destroy(&pool->audios[i]); - } -+ - if (pool->display_clock != NULL) - dal_display_clock_destroy(&pool->display_clock); - -@@ -1273,3 +1066,235 @@ enum dc_status dce100_validate_with_context( - - return result; - } -+ -+static struct resource_funcs dce100_res_pool_funcs = { -+ .destruct = dce100_destruct_resource_pool, -+ .link_enc_create = dce100_link_encoder_create, -+ .link_enc_destroy = dce110_link_encoder_destroy, -+ .validate_with_context = dce100_validate_with_context, -+ .validate_bandwidth = dce100_validate_bandwidth -+}; -+ -+bool dce100_construct_resource_pool( -+ struct adapter_service *adapter_serv, -+ uint8_t num_virtual_links, -+ struct dc *dc, -+ struct resource_pool *pool) -+{ -+ unsigned int i; -+ struct audio_init_data audio_init_data = { 0 }; -+ struct dc_context *ctx = dc->ctx; -+ -+ pool->adapter_srv = adapter_serv; -+ pool->funcs = &dce100_res_pool_funcs; -+ -+ pool->stream_engines.engine.ENGINE_ID_DIGA = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGB = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGC = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGD = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGE = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGF = 1; -+ -+ pool->clock_sources[DCE100_CLK_SRC_PLL0] = dce100_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_PLL0, &dce100_clk_src_reg_offsets[0]); -+ pool->clock_sources[DCE100_CLK_SRC_PLL1] = dce100_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_PLL1, &dce100_clk_src_reg_offsets[1]); -+ pool->clock_sources[DCE100_CLK_SRC_EXT] = dce100_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_EXTERNAL, &dce100_clk_src_reg_offsets[0]); -+ pool->clk_src_count = DCE100_CLK_SRC_TOTAL; -+ -+ for (i = 0; i < pool->clk_src_count; i++) { -+ if (pool->clock_sources[i] == NULL) { -+ dal_error("DC: failed to create clock sources!\n"); -+ BREAK_TO_DEBUGGER(); -+ goto clk_src_create_fail; -+ } -+ } -+ -+ pool->display_clock = dal_display_clock_dce110_create(ctx, adapter_serv); -+ if (pool->display_clock == NULL) { -+ dal_error("DC: failed to create display clock!\n"); -+ BREAK_TO_DEBUGGER(); -+ goto disp_clk_create_fail; -+ } -+ -+ { -+ struct irq_service_init_data init_data; -+ -+ init_data.ctx = dc->ctx; -+ pool->irqs = dal_irq_service_create( -+ dal_adapter_service_get_dce_version( -+ dc->res_pool.adapter_srv), -+ &init_data); -+ if (!pool->irqs) -+ goto irqs_create_fail; -+ -+ } -+ -+ pool->controller_count = -+ dal_adapter_service_get_func_controllers_num(adapter_serv); -+ pool->stream_enc_count = dal_adapter_service_get_stream_engines_num( -+ adapter_serv); -+ pool->scaler_filter = dal_scaler_filter_create(ctx); -+ if (pool->scaler_filter == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create filter!\n"); -+ goto filter_create_fail; -+ } -+ -+ for (i = 0; i < pool->controller_count; i++) { -+ pool->timing_generators[i] = dce100_timing_generator_create( -+ adapter_serv, ctx, i, &dce100_tg_offsets[i]); -+ if (pool->timing_generators[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create tg!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->mis[i] = dce100_mem_input_create(ctx, i, -+ &dce100_mi_reg_offsets[i]); -+ if (pool->mis[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create memory input!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->ipps[i] = dce100_ipp_create(ctx, i, -+ &dce100_ipp_reg_offsets[i]); -+ if (pool->ipps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create input pixel processor!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->transforms[i] = dce100_transform_create( -+ ctx, i, &dce100_xfm_offsets[i]); -+ if (pool->transforms[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create transform!\n"); -+ goto controller_create_fail; -+ } -+ pool->transforms[i]->funcs->transform_set_scaler_filter( -+ pool->transforms[i], -+ pool->scaler_filter); -+ -+ pool->opps[i] = dce100_opp_create(ctx, i, &dce100_opp_reg_offsets[i]); -+ if (pool->opps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create output pixel processor!\n"); -+ goto controller_create_fail; -+ } -+ } -+ -+ audio_init_data.as = adapter_serv; -+ audio_init_data.ctx = ctx; -+ pool->audio_count = 0; -+ for (i = 0; i < pool->controller_count; i++) { -+ struct graphics_object_id obj_id; -+ -+ obj_id = dal_adapter_service_enum_audio_object(adapter_serv, i); -+ if (false == dal_graphics_object_id_is_valid(obj_id)) { -+ /* no more valid audio objects */ -+ break; -+ } -+ -+ audio_init_data.audio_stream_id = obj_id; -+ pool->audios[i] = dal_audio_create(&audio_init_data); -+ if (pool->audios[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create DPPs!\n"); -+ goto audio_create_fail; -+ } -+ pool->audio_count++; -+ } -+ -+ for (i = 0; i < pool->stream_enc_count; i++) { -+ /* TODO: rework fragile code*/ -+ if (pool->stream_engines.u_all & 1 << i) { -+ pool->stream_enc[i] = dce100_stream_encoder_create( -+ i, dc->ctx, -+ dal_adapter_service_get_bios_parser( -+ adapter_serv), -+ &stream_enc_regs[i]); -+ if (pool->stream_enc[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create stream_encoder!\n"); -+ goto stream_enc_create_fail; -+ } -+ } -+ } -+ -+ for (i = 0; i < num_virtual_links; i++) { -+ pool->stream_enc[pool->stream_enc_count] = -+ virtual_stream_encoder_create( -+ dc->ctx, dal_adapter_service_get_bios_parser( -+ adapter_serv)); -+ if (pool->stream_enc[pool->stream_enc_count] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create stream_encoder!\n"); -+ goto stream_enc_create_fail; -+ } -+ pool->stream_enc_count++; -+ } -+ -+ return true; -+ -+stream_enc_create_fail: -+ for (i = 0; i < pool->stream_enc_count; i++) { -+ if (pool->stream_enc[i] != NULL) -+ dc_service_free(pool->stream_enc[i]->ctx, -+ DCE110STRENC_FROM_STRENC(pool->stream_enc[i])); -+ } -+ -+audio_create_fail: -+ for (i = 0; i < pool->controller_count; i++) { -+ if (pool->audios[i] != NULL) -+ dal_audio_destroy(&pool->audios[i]); -+ } -+ -+controller_create_fail: -+ for (i = 0; i < pool->controller_count; i++) { -+ if (pool->opps[i] != NULL) -+ dce100_opp_destroy(&pool->opps[i]); -+ -+ if (pool->transforms[i] != NULL) -+ dce100_transform_destroy(&pool->transforms[i]); -+ -+ if (pool->ipps[i] != NULL) -+ dce110_ipp_destroy(&pool->ipps[i]); -+ -+ if (pool->mis[i] != NULL) { -+ dc_service_free(pool->mis[i]->ctx, -+ TO_DCE110_MEM_INPUT(pool->mis[i])); -+ pool->mis[i] = NULL; -+ } -+ -+ if (pool->timing_generators[i] != NULL) { -+ dc_service_free(pool->timing_generators[i]->ctx, -+ DCE110TG_FROM_TG(pool->timing_generators[i])); -+ pool->timing_generators[i] = NULL; -+ } -+ } -+ -+filter_create_fail: -+ dal_irq_service_destroy(&pool->irqs); -+ -+irqs_create_fail: -+ dal_display_clock_destroy(&pool->display_clock); -+ -+disp_clk_create_fail: -+clk_src_create_fail: -+ for (i = 0; i < pool->clk_src_count; i++) { -+ if (pool->clock_sources[i] != NULL) -+ dce100_clock_source_destroy(&pool->clock_sources[i]); -+ } -+ -+ return false; -+} -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_clock_source.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_clock_source.c -index b096444..c5a081a 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_clock_source.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_clock_source.c -@@ -820,7 +820,6 @@ static bool dce110_clock_source_power_down( - return bp_result == BP_RESULT_OK; - } - -- - /*****************************************/ - /* Constructor */ - /*****************************************/ -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -index 046a9a5..9158955 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -@@ -30,18 +30,18 @@ - #include "resource.h" - #include "hw_sequencer.h" - #include "dc_helpers.h" --#include "gamma_types.h" -+#include "dce110_hw_sequencer.h" - --#include "dce110/dce110_resource.h" --#include "dce110/dce110_timing_generator.h" --#include "dce110/dce110_mem_input.h" --#include "dce110/dce110_opp.h" - #include "gpu/dce110/dc_clock_gating_dce110.h" -+ -+#include "timing_generator.h" -+#include "mem_input.h" -+#include "opp.h" - #include "ipp.h" - #include "transform.h" - #include "stream_encoder.h" - #include "link_encoder.h" --#include "inc/clock_source.h" -+#include "clock_source.h" - - /* include DCE11 register header files */ - #include "dce/dce_11_0_d.h" -@@ -51,20 +51,6 @@ struct dce110_hw_seq_reg_offsets { - uint32_t dcfe; - uint32_t blnd; - uint32_t crtc; -- uint32_t dcp; --}; -- --enum crtc_stereo_mixer_mode { -- HW_STEREO_MIXER_MODE_INACTIVE, -- HW_STEREO_MIXER_MODE_ROW_INTERLEAVE, -- HW_STEREO_MIXER_MODE_COLUMN_INTERLEAVE, -- HW_STEREO_MIXER_MODE_PIXEL_INTERLEAVE, -- HW_STEREO_MIXER_MODE_BLENDER --}; -- --struct crtc_mixer_params { -- bool sub_sampling; -- enum crtc_stereo_mixer_mode mode; - }; - - enum pipe_lock_control { -@@ -82,41 +68,21 @@ enum blender_mode { - BLENDER_MODE_STEREO - }; - --enum blender_type { -- BLENDER_TYPE_NON_SINGLE_PIPE = 0, -- BLENDER_TYPE_SB_SINGLE_PIPE, -- BLENDER_TYPE_TB_SINGLE_PIPE --}; -- --enum dc_memory_sleep_state { -- DC_MEMORY_SLEEP_DISABLE = 0, -- DC_MEMORY_LIGHT_SLEEP, -- DC_MEMORY_DEEP_SLEEP, -- DC_MEMORY_SHUTDOWN --}; --enum { -- DCE110_PIPE_UPDATE_PENDING_DELAY = 1000, -- DCE110_PIPE_UPDATE_PENDING_CHECKCOUNT = 5000 --}; -- - static const struct dce110_hw_seq_reg_offsets reg_offsets[] = { - { - .dcfe = (mmDCFE0_DCFE_MEM_PWR_CTRL - mmDCFE_MEM_PWR_CTRL), - .blnd = (mmBLND0_BLND_CONTROL - mmBLND_CONTROL), - .crtc = (mmCRTC0_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), -- .dcp = (mmDCP0_DVMM_PTE_CONTROL - mmDVMM_PTE_CONTROL), - }, - { -- .dcfe = (mmDCFE1_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL), -- .blnd = (mmBLND1_BLND_CONTROL - mmBLND0_BLND_CONTROL), -- .crtc = (mmCRTC1_CRTC_GSL_CONTROL - mmCRTC0_CRTC_GSL_CONTROL), -- .dcp = (mmDCP1_DVMM_PTE_CONTROL - mmDCP0_DVMM_PTE_CONTROL), -+ .dcfe = (mmDCFE1_DCFE_MEM_PWR_CTRL - mmDCFE_MEM_PWR_CTRL), -+ .blnd = (mmBLND1_BLND_CONTROL - mmBLND_CONTROL), -+ .crtc = (mmCRTC1_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), - }, - { -- .dcfe = (mmDCFE2_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL), -- .blnd = (mmBLND2_BLND_CONTROL - mmBLND0_BLND_CONTROL), -- .crtc = (mmCRTC2_CRTC_GSL_CONTROL - mmCRTC0_CRTC_GSL_CONTROL), -- .dcp = (mmDCP2_DVMM_PTE_CONTROL - mmDCP0_DVMM_PTE_CONTROL), -+ .dcfe = (mmDCFE2_DCFE_MEM_PWR_CTRL - mmDCFE_MEM_PWR_CTRL), -+ .blnd = (mmBLND2_BLND_CONTROL - mmBLND_CONTROL), -+ .crtc = (mmCRTC2_CRTC_GSL_CONTROL - mmCRTC_GSL_CONTROL), - } - }; - -@@ -129,192 +95,12 @@ static const struct dce110_hw_seq_reg_offsets reg_offsets[] = { - #define HW_REG_CRTC(reg, id)\ - (reg + reg_offsets[id].crtc) - --#define HW_REG_DCP(reg, id)\ -- (reg + reg_offsets[id].dcp) -- -- --static void init_pte(struct dc_context *ctx); - - /******************************************************************************* - * Private definitions - ******************************************************************************/ -- --static void dce110_enable_display_pipe_clock_gating( -- struct dc_context *ctx, -- bool clock_gating) --{ -- /*TODO*/ --} -- --static bool dce110_enable_display_power_gating( -- struct dc_context *ctx, -- uint8_t controller_id, -- struct dc_bios *dcb, -- enum pipe_gating_control power_gating) --{ -- enum bp_result bp_result = BP_RESULT_OK; -- enum bp_pipe_control_action cntl; -- -- if (power_gating == PIPE_GATING_CONTROL_INIT) -- cntl = ASIC_PIPE_INIT; -- else if (power_gating == PIPE_GATING_CONTROL_ENABLE) -- cntl = ASIC_PIPE_ENABLE; -- else -- cntl = ASIC_PIPE_DISABLE; -- -- if (!(power_gating == PIPE_GATING_CONTROL_INIT && -- (controller_id + 1) != CONTROLLER_ID_D0)) -- bp_result = dcb->funcs->enable_disp_power_gating( -- dcb, controller_id + 1, cntl); -- -- if (power_gating != PIPE_GATING_CONTROL_ENABLE) -- init_pte(ctx); -- -- if (bp_result == BP_RESULT_OK) -- return true; -- else -- return false; --} -- -- --static bool set_gamma_ramp( -- struct input_pixel_processor *ipp, -- struct output_pixel_processor *opp, -- const struct gamma_ramp *ramp, -- const struct gamma_parameters *params) --{ -- /*Power on LUT memory*/ -- opp->funcs->opp_power_on_regamma_lut(opp, true); -- -- -- if (params->surface_pixel_format == PIXEL_FORMAT_INDEX8 || -- params->selected_gamma_lut == GRAPHICS_GAMMA_LUT_LEGACY) { -- /* do legacy DCP for 256 colors if we are requested to do so */ -- ipp->funcs->ipp_set_legacy_input_gamma_ramp( -- ipp, ramp, params); -- -- ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, true); -- -- /* set bypass */ -- ipp->funcs->ipp_program_prescale(ipp, PIXEL_FORMAT_UNINITIALIZED); -- -- ipp->funcs->ipp_set_degamma(ipp, params, true); -- -- opp->funcs->opp_set_regamma(opp, ramp, params, true); -- } else if (params->selected_gamma_lut == -- GRAPHICS_GAMMA_LUT_LEGACY_AND_REGAMMA) { -- if (!opp->funcs->opp_map_legacy_and_regamma_hw_to_x_user( -- opp, ramp, params)) { -- BREAK_TO_DEBUGGER(); -- /* invalid parameters or bug */ -- return false; -- } -- -- /* do legacy DCP for 256 colors if we are requested to do so */ -- ipp->funcs->ipp_set_legacy_input_gamma_ramp( -- ipp, ramp, params); -- -- ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, true); -- -- /* set bypass */ -- ipp->funcs->ipp_program_prescale(ipp, PIXEL_FORMAT_UNINITIALIZED); -- } else { -- ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, false); -- -- ipp->funcs->ipp_program_prescale(ipp, params->surface_pixel_format); -- -- /* Do degamma step : remove the given gamma value from FB. -- * For FP16 or no degamma do by pass */ -- ipp->funcs->ipp_set_degamma(ipp, params, false); -- -- opp->funcs->opp_set_regamma(opp, ramp, params, false); -- } -- -- /*re-enable low power mode for LUT memory*/ -- opp->funcs->opp_power_on_regamma_lut(opp, false); -- -- return true; --} -- --static enum dc_status bios_parser_crtc_source_select( -- struct core_stream *stream) --{ -- struct dc_bios *dcb; -- /* call VBIOS table to set CRTC source for the HW -- * encoder block -- * note: video bios clears all FMT setting here. */ -- struct bp_crtc_source_select crtc_source_select = {0}; -- const struct core_sink *sink = stream->sink; -- -- crtc_source_select.engine_id = stream->stream_enc->id; -- crtc_source_select.controller_id = stream->controller_idx + 1; -- /*TODO: Need to un-hardcode color depth, dp_audio and account for -- * the case where signal and sink signal is different (translator -- * encoder)*/ -- crtc_source_select.signal = sink->public.sink_signal; -- crtc_source_select.enable_dp_audio = false; -- crtc_source_select.sink_signal = sink->public.sink_signal; -- crtc_source_select.display_output_bit_depth = PANEL_8BIT_COLOR; -- -- dcb = dal_adapter_service_get_bios_parser(sink->link->adapter_srv); -- -- if (BP_RESULT_OK != dcb->funcs->crtc_source_select( -- dcb, -- &crtc_source_select)) { -- return DC_ERROR_UNEXPECTED; -- } -- -- return DC_OK; --} -- --static enum color_space surface_color_to_color_space( -- struct plane_colorimetry *colorimetry) --{ -- enum color_space color_space = COLOR_SPACE_UNKNOWN; -- -- switch (colorimetry->color_space) { -- case SURFACE_COLOR_SPACE_SRGB: -- case SURFACE_COLOR_SPACE_XRRGB: -- if (colorimetry->limited_range) -- color_space = COLOR_SPACE_SRGB_LIMITED_RANGE; -- else -- color_space = COLOR_SPACE_SRGB_FULL_RANGE; -- break; -- case SURFACE_COLOR_SPACE_BT601: -- case SURFACE_COLOR_SPACE_XVYCC_BT601: -- color_space = COLOR_SPACE_YCBCR601; -- break; -- case SURFACE_COLOR_SPACE_BT709: -- case SURFACE_COLOR_SPACE_XVYCC_BT709: -- color_space = COLOR_SPACE_YCBCR709; -- break; -- } -- -- return color_space; --} -- --/*******************************FMT**************************************/ --static void program_fmt( -- struct output_pixel_processor *opp, -- struct bit_depth_reduction_params *fmt_bit_depth, -- struct clamping_and_pixel_encoding_params *clamping) --{ -- /* dithering is affected by <CrtcSourceSelect>, hence should be -- * programmed afterwards */ -- -- opp->funcs->opp_program_bit_depth_reduction( -- opp, -- fmt_bit_depth); -- -- opp->funcs->opp_program_clamping_and_pixel_encoding( -- opp, -- clamping); -- -- return; --} -- - /***************************PIPE_CONTROL***********************************/ --static void enable_fe_clock( -+static void dce110_enable_fe_clock( - struct dc_context *ctx, uint8_t controller_id, bool enable) - { - uint32_t value = 0; -@@ -333,21 +119,8 @@ static void enable_fe_clock( - - dal_write_reg(ctx, addr, value); - } --/* --static void enable_stereo_mixer( -- struct dc_context *ctx, -- const struct crtc_mixer_params *params) --{ -- TODO --} --*/ --static void disable_stereo_mixer( -- struct dc_context *ctx) --{ -- /*TODO*/ --} - --static void init_pte(struct dc_context *ctx) -+static void dce110_init_pte(struct dc_context *ctx) - { - uint32_t addr; - uint32_t value = 0; -@@ -414,21 +187,7 @@ static void init_pte(struct dc_context *ctx) - } - } - --/** -- ***************************************************************************** -- * Function: enable_disp_power_gating -- * -- * @brief -- * enable or disable power gating -- * -- * @param [in] enum pipe_gating_control power_gating true - power down, -- * false - power up -- ***************************************************************************** -- */ -- -- - /* this is a workaround for hw bug - it is a trigger on r/w */ -- - static void trigger_write_crtc_h_blank_start_end( - struct dc_context *ctx, - uint8_t controller_id) -@@ -441,7 +200,7 @@ static void trigger_write_crtc_h_blank_start_end( - dal_write_reg(ctx, addr, value); - } - --static bool pipe_control_lock( -+static bool dce110_pipe_control_lock( - struct dc_context *ctx, - uint8_t controller_idx, - uint32_t control_mask, -@@ -586,10 +345,10 @@ static bool pipe_control_lock( - return true; - } - --static void set_blender_mode( -+static void dce110_set_blender_mode( - struct dc_context *ctx, - uint8_t controller_id, -- enum blender_mode mode) -+ uint32_t mode) - { - uint32_t value; - uint32_t addr = HW_REG_BLND(mmBLND_CONTROL, controller_id); -@@ -628,7 +387,209 @@ static void set_blender_mode( - - dal_write_reg(ctx, addr, value); - } -+ -+static void dce110_crtc_switch_to_clk_src( -+ struct clock_source *clk_src, uint8_t crtc_inst) -+{ -+ uint32_t pixel_rate_cntl_value; -+ uint32_t addr; -+ -+ addr = mmCRTC0_PIXEL_RATE_CNTL + crtc_inst * -+ (mmCRTC1_PIXEL_RATE_CNTL - mmCRTC0_PIXEL_RATE_CNTL); -+ -+ pixel_rate_cntl_value = dal_read_reg(clk_src->ctx, addr); -+ -+ if (clk_src->id == CLOCK_SOURCE_ID_EXTERNAL) -+ set_reg_field_value(pixel_rate_cntl_value, 1, -+ CRTC0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE); -+ else { -+ set_reg_field_value(pixel_rate_cntl_value, -+ 0, -+ CRTC0_PIXEL_RATE_CNTL, -+ DP_DTO0_ENABLE); -+ -+ set_reg_field_value(pixel_rate_cntl_value, -+ clk_src->id - 1, -+ CRTC0_PIXEL_RATE_CNTL, -+ CRTC0_PIXEL_RATE_SOURCE); -+ } -+ dal_write_reg(clk_src->ctx, addr, pixel_rate_cntl_value); -+} - /**************************************************************************/ -+ -+static void enable_display_pipe_clock_gating( -+ struct dc_context *ctx, -+ bool clock_gating) -+{ -+ /*TODO*/ -+} -+ -+static bool dce110_enable_display_power_gating( -+ struct dc_context *ctx, -+ uint8_t controller_id, -+ struct dc_bios *dcb, -+ enum pipe_gating_control power_gating) -+{ -+ enum bp_result bp_result = BP_RESULT_OK; -+ enum bp_pipe_control_action cntl; -+ -+ if (power_gating == PIPE_GATING_CONTROL_INIT) -+ cntl = ASIC_PIPE_INIT; -+ else if (power_gating == PIPE_GATING_CONTROL_ENABLE) -+ cntl = ASIC_PIPE_ENABLE; -+ else -+ cntl = ASIC_PIPE_DISABLE; -+ -+ if (!(power_gating == PIPE_GATING_CONTROL_INIT && controller_id != 0)) -+ bp_result = dcb->funcs->enable_disp_power_gating( -+ dcb, controller_id + 1, cntl); -+ -+ if (power_gating != PIPE_GATING_CONTROL_ENABLE) -+ dce110_init_pte(ctx); -+ -+ if (bp_result == BP_RESULT_OK) -+ return true; -+ else -+ return false; -+} -+ -+ -+static bool set_gamma_ramp( -+ struct input_pixel_processor *ipp, -+ struct output_pixel_processor *opp, -+ const struct gamma_ramp *ramp, -+ const struct gamma_parameters *params) -+{ -+ /*Power on LUT memory*/ -+ opp->funcs->opp_power_on_regamma_lut(opp, true); -+ -+ -+ if (params->surface_pixel_format == PIXEL_FORMAT_INDEX8 || -+ params->selected_gamma_lut == GRAPHICS_GAMMA_LUT_LEGACY) { -+ /* do legacy DCP for 256 colors if we are requested to do so */ -+ ipp->funcs->ipp_set_legacy_input_gamma_ramp( -+ ipp, ramp, params); -+ -+ ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, true); -+ -+ /* set bypass */ -+ ipp->funcs->ipp_program_prescale(ipp, PIXEL_FORMAT_UNINITIALIZED); -+ -+ ipp->funcs->ipp_set_degamma(ipp, params, true); -+ -+ opp->funcs->opp_set_regamma(opp, ramp, params, true); -+ } else if (params->selected_gamma_lut == -+ GRAPHICS_GAMMA_LUT_LEGACY_AND_REGAMMA) { -+ if (!opp->funcs->opp_map_legacy_and_regamma_hw_to_x_user( -+ opp, ramp, params)) { -+ BREAK_TO_DEBUGGER(); -+ /* invalid parameters or bug */ -+ return false; -+ } -+ -+ /* do legacy DCP for 256 colors if we are requested to do so */ -+ ipp->funcs->ipp_set_legacy_input_gamma_ramp( -+ ipp, ramp, params); -+ -+ ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, true); -+ -+ /* set bypass */ -+ ipp->funcs->ipp_program_prescale(ipp, PIXEL_FORMAT_UNINITIALIZED); -+ } else { -+ ipp->funcs->ipp_set_legacy_input_gamma_mode(ipp, false); -+ -+ ipp->funcs->ipp_program_prescale(ipp, params->surface_pixel_format); -+ -+ /* Do degamma step : remove the given gamma value from FB. -+ * For FP16 or no degamma do by pass */ -+ ipp->funcs->ipp_set_degamma(ipp, params, false); -+ -+ opp->funcs->opp_set_regamma(opp, ramp, params, false); -+ } -+ -+ /*re-enable low power mode for LUT memory*/ -+ opp->funcs->opp_power_on_regamma_lut(opp, false); -+ -+ return true; -+} -+ -+static enum dc_status bios_parser_crtc_source_select( -+ struct core_stream *stream) -+{ -+ struct dc_bios *dcb; -+ /* call VBIOS table to set CRTC source for the HW -+ * encoder block -+ * note: video bios clears all FMT setting here. */ -+ struct bp_crtc_source_select crtc_source_select = {0}; -+ const struct core_sink *sink = stream->sink; -+ -+ crtc_source_select.engine_id = stream->stream_enc->id; -+ crtc_source_select.controller_id = stream->controller_idx + 1; -+ /*TODO: Need to un-hardcode color depth, dp_audio and account for -+ * the case where signal and sink signal is different (translator -+ * encoder)*/ -+ crtc_source_select.signal = sink->public.sink_signal; -+ crtc_source_select.enable_dp_audio = false; -+ crtc_source_select.sink_signal = sink->public.sink_signal; -+ crtc_source_select.display_output_bit_depth = PANEL_8BIT_COLOR; -+ -+ dcb = dal_adapter_service_get_bios_parser(sink->link->adapter_srv); -+ -+ if (BP_RESULT_OK != dcb->funcs->crtc_source_select( -+ dcb, -+ &crtc_source_select)) { -+ return DC_ERROR_UNEXPECTED; -+ } -+ -+ return DC_OK; -+} -+ -+static enum color_space surface_color_to_color_space( -+ struct plane_colorimetry *colorimetry) -+{ -+ enum color_space color_space = COLOR_SPACE_UNKNOWN; -+ -+ switch (colorimetry->color_space) { -+ case SURFACE_COLOR_SPACE_SRGB: -+ case SURFACE_COLOR_SPACE_XRRGB: -+ if (colorimetry->limited_range) -+ color_space = COLOR_SPACE_SRGB_LIMITED_RANGE; -+ else -+ color_space = COLOR_SPACE_SRGB_FULL_RANGE; -+ break; -+ case SURFACE_COLOR_SPACE_BT601: -+ case SURFACE_COLOR_SPACE_XVYCC_BT601: -+ color_space = COLOR_SPACE_YCBCR601; -+ break; -+ case SURFACE_COLOR_SPACE_BT709: -+ case SURFACE_COLOR_SPACE_XVYCC_BT709: -+ color_space = COLOR_SPACE_YCBCR709; -+ break; -+ } -+ -+ return color_space; -+} -+ -+/*******************************FMT**************************************/ -+static void program_fmt( -+ struct output_pixel_processor *opp, -+ struct bit_depth_reduction_params *fmt_bit_depth, -+ struct clamping_and_pixel_encoding_params *clamping) -+{ -+ /* dithering is affected by <CrtcSourceSelect>, hence should be -+ * programmed afterwards */ -+ -+ opp->funcs->opp_program_bit_depth_reduction( -+ opp, -+ fmt_bit_depth); -+ -+ opp->funcs->opp_program_clamping_and_pixel_encoding( -+ opp, -+ clamping); -+ -+ return; -+} -+ - static void update_bios_scratch_critical_state(struct adapter_service *as, - bool state) - { -@@ -968,9 +929,9 @@ static void disable_vga_and_power_gate_all_controllers( - - /* Enable CLOCK gating for each pipe BEFORE controller - * powergating. */ -- dce110_enable_display_pipe_clock_gating(ctx, -+ enable_display_pipe_clock_gating(ctx, - true); -- dce110_enable_display_power_gating(ctx, i, dcb, -+ dc->hwss.enable_display_power_gating(ctx, i, dcb, - PIPE_GATING_CONTROL_ENABLE); - } - } -@@ -1181,7 +1142,7 @@ static void set_safe_displaymarks(struct validate_context *context) - } - } - --static void dce110_program_bw(struct dc *dc, struct validate_context *context) -+static void program_bw(struct dc *dc, struct validate_context *context) - { - set_safe_displaymarks(context); - /*TODO: when pplib works*/ -@@ -1191,46 +1152,8 @@ static void dce110_program_bw(struct dc *dc, struct validate_context *context) - set_displaymarks(dc, context); - } - --/*TODO: break out clock sources like timing gen/ encoder*/ --static void dce110_switch_dp_clk_src( -- const struct dc_context *ctx, -- const struct core_stream *stream) --{ -- uint32_t pixel_rate_cntl_value; -- uint32_t addr; -- enum clock_source_id id = stream->clock_source->id; -- -- /*TODO: proper offset*/ -- addr = mmCRTC0_PIXEL_RATE_CNTL + stream->controller_idx * -- (mmCRTC1_PIXEL_RATE_CNTL - mmCRTC0_PIXEL_RATE_CNTL); -- -- pixel_rate_cntl_value = dal_read_reg(ctx, addr); -- -- if (id == CLOCK_SOURCE_ID_EXTERNAL) { -- -- if (!get_reg_field_value(pixel_rate_cntl_value, -- CRTC0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE)) { -- -- set_reg_field_value(pixel_rate_cntl_value, 1, -- CRTC0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE); -- } -- -- } else { -- set_reg_field_value(pixel_rate_cntl_value, -- 0, -- CRTC0_PIXEL_RATE_CNTL, -- DP_DTO0_ENABLE); -- -- set_reg_field_value(pixel_rate_cntl_value, -- id - 1, -- CRTC0_PIXEL_RATE_CNTL, -- CRTC0_PIXEL_RATE_SOURCE); -- } -- dal_write_reg(ctx, addr, pixel_rate_cntl_value); --} -- - static void switch_dp_clock_sources( -- const struct dc_context *ctx, -+ const struct dc *dc, - struct validate_context *val_context) - { - uint8_t i, j; -@@ -1253,7 +1176,8 @@ static void switch_dp_clock_sources( - stream->clock_source = clk_src; - reference_clock_source( - &val_context->res_ctx, clk_src); -- dce110_switch_dp_clk_src(ctx, stream); -+ dc->hwss.crtc_switch_to_clk_src( -+ clk_src, stream->opp->inst); - } - } - } -@@ -1287,7 +1211,7 @@ static enum dc_status apply_ctx_to_hw( - dcb = dal_adapter_service_get_bios_parser( - context->res_ctx.pool.adapter_srv); - -- dce110_enable_display_power_gating( -+ dc->hwss.enable_display_power_gating( - dc->ctx, i, dcb, - PIPE_GATING_CONTROL_DISABLE); - } -@@ -1319,7 +1243,7 @@ static enum dc_status apply_ctx_to_hw( - update_bios_scratch_critical_state(context->res_ctx.pool.adapter_srv, - false); - -- switch_dp_clock_sources(dc->ctx, context); -+ switch_dp_clock_sources(dc, context); - - return DC_OK; - } -@@ -1442,23 +1366,12 @@ static void program_scaler( - false); - } - --static void configure_locking(struct dc_context *ctx, uint8_t controller_id) --{ -- /* main controller should be in mode 0 (master pipe) */ -- pipe_control_lock( -- ctx, -- controller_id, -- PIPE_LOCK_CONTROL_MODE, -- false); -- -- /* TODO: for MPO finish the non-root controllers */ --} -- - /** - * Program the Front End of the Pipe. - * The Back End was already programmed by Set Mode. - */ - static bool set_plane_config( -+ const struct dc *dc, - struct core_surface *surface, - struct core_target *target) - { -@@ -1478,11 +1391,15 @@ static bool set_plane_config( - enum color_space input_color_space = - surface_color_to_color_space(&(surface->public.colorimetry)); - -- configure_locking(ctx, controller_idx); -+ dc->hwss.pipe_control_lock( -+ ctx, -+ controller_idx, -+ PIPE_LOCK_CONTROL_MODE, -+ false); - - /* While a non-root controller is programmed we - * have to lock the root controller. */ -- pipe_control_lock( -+ dc->hwss.pipe_control_lock( - ctx, - controller_idx, - PIPE_LOCK_CONTROL_GRAPHICS | -@@ -1493,7 +1410,7 @@ static bool set_plane_config( - - tg->funcs->program_timing(tg, dc_crtc_timing, false); - -- enable_fe_clock(ctx, controller_idx, true); -+ dc->hwss.enable_fe_clock(ctx, controller_idx, true); - - set_default_colors( - ipp, -@@ -1507,7 +1424,7 @@ static bool set_plane_config( - program_scaler( - controller_idx, tg, xfm, surface, core_stream); - -- set_blender_mode( -+ dc->hwss.set_blender_mode( - ctx, - controller_idx, - BLENDER_MODE_CURRENT_PIPE); -@@ -1519,7 +1436,7 @@ static bool set_plane_config( - &surface->public.plane_size, - surface->public.rotation); - -- pipe_control_lock( -+ dc->hwss.pipe_control_lock( - ctx, - controller_idx, - PIPE_LOCK_CONTROL_GRAPHICS | -@@ -1532,6 +1449,7 @@ static bool set_plane_config( - } - - static bool update_plane_address( -+ const struct dc *dc, - const struct core_surface *surface, - struct core_target *target) - { -@@ -1542,7 +1460,7 @@ static bool update_plane_address( - uint8_t controller_id = core_stream->controller_idx; - - /* TODO: crtc should be per surface, NOT per-target */ -- pipe_control_lock( -+ dc->hwss.pipe_control_lock( - ctx, - controller_id, - PIPE_LOCK_CONTROL_SURFACE, -@@ -1553,7 +1471,7 @@ static bool update_plane_address( - mi, &surface->public.address, surface->public.flip_immediate)) - return false; - -- pipe_control_lock( -+ dc->hwss.pipe_control_lock( - ctx, - controller_id, - PIPE_LOCK_CONTROL_SURFACE, -@@ -1562,7 +1480,9 @@ static bool update_plane_address( - return true; - } - --static void reset_single_stream_hw_ctx(struct core_stream *stream, -+static void reset_single_stream_hw_ctx( -+ const struct dc *dc, -+ struct core_stream *stream, - struct validate_context *context) - { - struct dc_bios *dcb; -@@ -1583,9 +1503,8 @@ static void reset_single_stream_hw_ctx(struct core_stream *stream, - stream->mi->funcs->mem_input_deallocate_dmif_buffer( - stream->mi, context->target_count); - stream->xfm->funcs->transform_set_scaler_bypass(stream->xfm); -- disable_stereo_mixer(stream->ctx); - unreference_clock_source(&context->res_ctx, stream->clock_source); -- dce110_enable_display_power_gating( -+ dc->hwss.enable_display_power_gating( - stream->ctx, stream->controller_idx, dcb, - PIPE_GATING_CONTROL_ENABLE); - } -@@ -1608,7 +1527,7 @@ static void reset_hw_ctx(struct dc *dc, - .flags.timing_changed) - continue; - -- reset_single_stream_hw_ctx(core_stream, &dc->current_context); -+ reset_single_stream_hw_ctx(dc, core_stream, &dc->current_context); - } - } - -@@ -1708,68 +1627,25 @@ static void enable_timing_synchronization( - DC_SYNC_INFO("GSL: Set-up complete.\n"); - } - --static void get_crtc_positions(struct timing_generator *tg, -- int32_t *h_position, int32_t *v_position) --{ -- tg->funcs->get_position(tg, h_position, v_position); --} -- --static bool enable_memory_request(struct timing_generator *tg) --{ -- return tg->funcs->set_blank(tg, false); --} -- --static bool disable_memory_requests(struct timing_generator *tg) --{ -- return tg->funcs->set_blank(tg, true); --} -- --static uint32_t get_vblank_counter(struct timing_generator *tg) --{ -- return tg->funcs->get_frame_count(tg); --} -- --static void disable_vga(struct timing_generator *tg) --{ -- tg->funcs->disable_vga(tg); --} -- --static void set_mst_bandwidth(struct stream_encoder *stream_enc, -- struct fixed31_32 avg_time_slots_per_mtp) --{ -- stream_enc->funcs->set_mst_bandwidth(stream_enc, -- avg_time_slots_per_mtp); --} -- -- - static const struct hw_sequencer_funcs dce110_funcs = { - .apply_ctx_to_hw = apply_ctx_to_hw, - .reset_hw_ctx = reset_hw_ctx, - .set_plane_config = set_plane_config, - .update_plane_address = update_plane_address, -- .enable_memory_requests = enable_memory_request, -- .disable_memory_requests = disable_memory_requests, - .set_gamma_ramp = set_gamma_ramp, - .power_down = power_down, - .enable_accelerated_mode = enable_accelerated_mode, -- .get_crtc_positions = get_crtc_positions, -- .get_vblank_counter = get_vblank_counter, - .enable_timing_synchronization = enable_timing_synchronization, -- .disable_vga = disable_vga, -- .encoder_create = dce110_link_encoder_create, -- .encoder_destroy = dce110_link_encoder_destroy, -- .clock_gating_power_up = dal_dc_clock_gating_dce110_power_up, -- .construct_resource_pool = dce110_construct_resource_pool, -- .destruct_resource_pool = dce110_destruct_resource_pool, -- .validate_with_context = dce110_validate_with_context, -- .validate_bandwidth = dce110_validate_bandwidth, -- .enable_display_pipe_clock_gating = -- dce110_enable_display_pipe_clock_gating, -- .enable_display_power_gating = dce110_enable_display_power_gating, -- .program_bw = dce110_program_bw, -+ .program_bw = program_bw, - .enable_stream = enable_stream, - .disable_stream = disable_stream, -- .set_mst_bandwidth = set_mst_bandwidth, -+ .enable_display_pipe_clock_gating = enable_display_pipe_clock_gating, -+ .crtc_switch_to_clk_src = dce110_crtc_switch_to_clk_src, -+ .enable_display_power_gating = dce110_enable_display_power_gating, -+ .enable_fe_clock = dce110_enable_fe_clock, -+ .pipe_control_lock = dce110_pipe_control_lock, -+ .set_blender_mode = dce110_set_blender_mode, -+ .clock_gating_power_up = dal_dc_clock_gating_dce110_power_up,/*todo*/ - }; - - bool dce110_hw_sequencer_construct(struct dc *dc) -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c -index 41717eb..8f5acbd 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c -@@ -30,8 +30,6 @@ - #include "resource.h" - #include "include/irq_service_interface.h" - #include "../virtual/virtual_stream_encoder.h" --#include "inc/timing_generator_types.h" -- - #include "dce110/dce110_timing_generator.h" - #include "dce110/dce110_link_encoder.h" - #include "dce110/dce110_mem_input.h" -@@ -43,7 +41,6 @@ - - #include "dce/dce_11_0_d.h" - --/* TODO remove these defines */ - #ifndef mmDP_DPHY_INTERNAL_CTRL - #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7 - #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7 -@@ -475,225 +472,6 @@ void dce110_clock_source_destroy(struct clock_source **clk_src) - *clk_src = NULL; - } - --bool dce110_construct_resource_pool( -- struct adapter_service *adapter_serv, -- uint8_t num_virtual_links, -- struct dc *dc, -- struct resource_pool *pool) --{ -- unsigned int i; -- struct audio_init_data audio_init_data = { 0 }; -- struct dc_context *ctx = dc->ctx; -- pool->adapter_srv = adapter_serv; -- -- pool->stream_engines.engine.ENGINE_ID_DIGA = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGB = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGC = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGD = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGE = 1; -- pool->stream_engines.engine.ENGINE_ID_DIGF = 1; -- -- pool->clock_sources[DCE110_CLK_SRC_PLL0] = dce110_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_PLL0, &dce110_clk_src_reg_offsets[0]); -- pool->clock_sources[DCE110_CLK_SRC_PLL1] = dce110_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_PLL1, &dce110_clk_src_reg_offsets[1]); -- pool->clock_sources[DCE110_CLK_SRC_EXT] = dce110_clock_source_create( -- ctx, dal_adapter_service_get_bios_parser(adapter_serv), -- CLOCK_SOURCE_ID_EXTERNAL, &dce110_clk_src_reg_offsets[0]); -- pool->clk_src_count = DCE110_CLK_SRC_TOTAL; -- -- for (i = 0; i < pool->clk_src_count; i++) { -- if (pool->clock_sources[i] == NULL) { -- dal_error("DC: failed to create clock sources!\n"); -- BREAK_TO_DEBUGGER(); -- goto clk_src_create_fail; -- } -- } -- -- pool->display_clock = dal_display_clock_dce110_create(ctx, adapter_serv); -- if (pool->display_clock == NULL) { -- dal_error("DC: failed to create display clock!\n"); -- BREAK_TO_DEBUGGER(); -- goto disp_clk_create_fail; -- } -- -- { -- struct irq_service_init_data init_data; -- init_data.ctx = dc->ctx; -- pool->irqs = dal_irq_service_create( -- dal_adapter_service_get_dce_version( -- dc->res_pool.adapter_srv), -- &init_data); -- if (!pool->irqs) -- goto irqs_create_fail; -- -- } -- -- pool->controller_count = -- dal_adapter_service_get_func_controllers_num(adapter_serv); -- pool->stream_enc_count = dal_adapter_service_get_stream_engines_num( -- adapter_serv); -- pool->scaler_filter = dal_scaler_filter_create(ctx); -- if (pool->scaler_filter == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create filter!\n"); -- goto filter_create_fail; -- } -- -- for (i = 0; i < pool->controller_count; i++) { -- pool->timing_generators[i] = dce110_timing_generator_create( -- adapter_serv, ctx, i, &dce110_tg_offsets[i]); -- if (pool->timing_generators[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create tg!\n"); -- goto controller_create_fail; -- } -- -- pool->mis[i] = dce110_mem_input_create(ctx, i, -- &dce110_mi_reg_offsets[i]); -- if (pool->mis[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create memory input!\n"); -- goto controller_create_fail; -- } -- -- pool->ipps[i] = dce110_ipp_create(ctx, i, &dce110_ipp_reg_offsets[i]); -- if (pool->ipps[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create input pixel processor!\n"); -- goto controller_create_fail; -- } -- -- pool->transforms[i] = dce110_transform_create( -- ctx, i, &dce110_xfm_offsets[i]); -- if (pool->transforms[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create transform!\n"); -- goto controller_create_fail; -- } -- pool->transforms[i]->funcs->transform_set_scaler_filter( -- pool->transforms[i], -- pool->scaler_filter); -- -- pool->opps[i] = dce110_opp_create(ctx, i, &dce110_opp_reg_offsets[i]); -- if (pool->opps[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error( -- "DC: failed to create output pixel processor!\n"); -- goto controller_create_fail; -- } -- } -- -- audio_init_data.as = adapter_serv; -- audio_init_data.ctx = ctx; -- pool->audio_count = 0; -- for (i = 0; i < pool->controller_count; i++) { -- struct graphics_object_id obj_id; -- -- obj_id = dal_adapter_service_enum_audio_object(adapter_serv, i); -- if (false == dal_graphics_object_id_is_valid(obj_id)) { -- /* no more valid audio objects */ -- break; -- } -- -- audio_init_data.audio_stream_id = obj_id; -- pool->audios[i] = dal_audio_create(&audio_init_data); -- if (pool->audios[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create DPPs!\n"); -- goto audio_create_fail; -- } -- pool->audio_count++; -- } -- -- for (i = 0; i < pool->stream_enc_count; i++) { -- /* TODO: rework fragile code*/ -- if (pool->stream_engines.u_all & 1 << i) { -- pool->stream_enc[i] = dce110_stream_encoder_create( -- i, dc->ctx, -- dal_adapter_service_get_bios_parser( -- adapter_serv), -- &stream_enc_regs[i]); -- if (pool->stream_enc[i] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create stream_encoder!\n"); -- goto stream_enc_create_fail; -- } -- } -- } -- -- for (i = 0; i < num_virtual_links; i++) { -- pool->stream_enc[pool->stream_enc_count] = -- virtual_stream_encoder_create( -- dc->ctx, dal_adapter_service_get_bios_parser( -- adapter_serv)); -- if (pool->stream_enc[pool->stream_enc_count] == NULL) { -- BREAK_TO_DEBUGGER(); -- dal_error("DC: failed to create stream_encoder!\n"); -- goto stream_enc_create_fail; -- } -- pool->stream_enc_count++; -- } -- -- return true; -- --stream_enc_create_fail: -- for (i = 0; i < pool->stream_enc_count; i++) { -- if (pool->stream_enc[i] != NULL) -- dc_service_free(pool->stream_enc[i]->ctx, -- DCE110STRENC_FROM_STRENC(pool->stream_enc[i])); -- } -- --audio_create_fail: -- for (i = 0; i < pool->controller_count; i++) { -- if (pool->audios[i] != NULL) -- dal_audio_destroy(&pool->audios[i]); -- } -- --controller_create_fail: -- for (i = 0; i < pool->controller_count; i++) { -- if (pool->opps[i] != NULL) -- dce110_opp_destroy(&pool->opps[i]); -- -- if (pool->transforms[i] != NULL) -- dce110_transform_destroy(&pool->transforms[i]); -- -- if (pool->ipps[i] != NULL) -- dce110_ipp_destroy(&pool->ipps[i]); -- -- if (pool->mis[i] != NULL) { -- dc_service_free(pool->mis[i]->ctx, -- TO_DCE110_MEM_INPUT(pool->mis[i])); -- pool->mis[i] = NULL; -- } -- -- if (pool->timing_generators[i] != NULL) { -- dc_service_free(pool->timing_generators[i]->ctx, -- DCE110TG_FROM_TG(pool->timing_generators[i])); -- pool->timing_generators[i] = NULL; -- } -- } -- --filter_create_fail: -- dal_irq_service_destroy(&pool->irqs); -- --irqs_create_fail: -- dal_display_clock_destroy(&pool->display_clock); -- --disp_clk_create_fail: --clk_src_create_fail: -- for (i = 0; i < pool->clk_src_count; i++) { -- if (pool->clock_sources[i] != NULL) -- dce110_clock_source_destroy(&pool->clock_sources[i]); -- } -- return false; --} -- - void dce110_destruct_resource_pool(struct resource_pool *pool) - { - unsigned int i; -@@ -737,6 +515,7 @@ void dce110_destruct_resource_pool(struct resource_pool *pool) - dal_audio_destroy(&pool->audios[i]); - } - } -+ - if (pool->display_clock != NULL) { - dal_display_clock_destroy(&pool->display_clock); - } -@@ -1227,3 +1006,232 @@ enum dc_status dce110_validate_with_context( - - return result; - } -+ -+static struct resource_funcs dce110_res_pool_funcs = { -+ .destruct = dce110_destruct_resource_pool, -+ .link_enc_create = dce110_link_encoder_create, -+ .link_enc_destroy = dce110_link_encoder_destroy, -+ .validate_with_context = dce110_validate_with_context, -+ .validate_bandwidth = dce110_validate_bandwidth -+}; -+ -+bool dce110_construct_resource_pool( -+ struct adapter_service *adapter_serv, -+ uint8_t num_virtual_links, -+ struct dc *dc, -+ struct resource_pool *pool) -+{ -+ unsigned int i; -+ struct audio_init_data audio_init_data = { 0 }; -+ struct dc_context *ctx = dc->ctx; -+ pool->adapter_srv = adapter_serv; -+ pool->funcs = &dce110_res_pool_funcs; -+ -+ pool->stream_engines.engine.ENGINE_ID_DIGA = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGB = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGC = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGD = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGE = 1; -+ pool->stream_engines.engine.ENGINE_ID_DIGF = 1; -+ -+ pool->clock_sources[DCE110_CLK_SRC_PLL0] = dce110_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_PLL0, &dce110_clk_src_reg_offsets[0]); -+ pool->clock_sources[DCE110_CLK_SRC_PLL1] = dce110_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_PLL1, &dce110_clk_src_reg_offsets[1]); -+ pool->clock_sources[DCE110_CLK_SRC_EXT] = dce110_clock_source_create( -+ ctx, dal_adapter_service_get_bios_parser(adapter_serv), -+ CLOCK_SOURCE_ID_EXTERNAL, &dce110_clk_src_reg_offsets[0]); -+ pool->clk_src_count = DCE110_CLK_SRC_TOTAL; -+ -+ for (i = 0; i < pool->clk_src_count; i++) { -+ if (pool->clock_sources[i] == NULL) { -+ dal_error("DC: failed to create clock sources!\n"); -+ BREAK_TO_DEBUGGER(); -+ goto clk_src_create_fail; -+ } -+ } -+ -+ pool->display_clock = dal_display_clock_dce110_create(ctx, adapter_serv); -+ if (pool->display_clock == NULL) { -+ dal_error("DC: failed to create display clock!\n"); -+ BREAK_TO_DEBUGGER(); -+ goto disp_clk_create_fail; -+ } -+ -+ { -+ struct irq_service_init_data init_data; -+ init_data.ctx = dc->ctx; -+ pool->irqs = dal_irq_service_create( -+ dal_adapter_service_get_dce_version( -+ dc->res_pool.adapter_srv), -+ &init_data); -+ if (!pool->irqs) -+ goto irqs_create_fail; -+ -+ } -+ -+ pool->controller_count = -+ dal_adapter_service_get_func_controllers_num(adapter_serv); -+ pool->stream_enc_count = dal_adapter_service_get_stream_engines_num( -+ adapter_serv); -+ pool->scaler_filter = dal_scaler_filter_create(ctx); -+ if (pool->scaler_filter == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create filter!\n"); -+ goto filter_create_fail; -+ } -+ -+ for (i = 0; i < pool->controller_count; i++) { -+ pool->timing_generators[i] = dce110_timing_generator_create( -+ adapter_serv, ctx, i, &dce110_tg_offsets[i]); -+ if (pool->timing_generators[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create tg!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->mis[i] = dce110_mem_input_create(ctx, i, -+ &dce110_mi_reg_offsets[i]); -+ if (pool->mis[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create memory input!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->ipps[i] = dce110_ipp_create(ctx, i, &dce110_ipp_reg_offsets[i]); -+ if (pool->ipps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create input pixel processor!\n"); -+ goto controller_create_fail; -+ } -+ -+ pool->transforms[i] = dce110_transform_create( -+ ctx, i, &dce110_xfm_offsets[i]); -+ if (pool->transforms[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create transform!\n"); -+ goto controller_create_fail; -+ } -+ pool->transforms[i]->funcs->transform_set_scaler_filter( -+ pool->transforms[i], -+ pool->scaler_filter); -+ -+ pool->opps[i] = dce110_opp_create(ctx, i, &dce110_opp_reg_offsets[i]); -+ if (pool->opps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error( -+ "DC: failed to create output pixel processor!\n"); -+ goto controller_create_fail; -+ } -+ } -+ -+ audio_init_data.as = adapter_serv; -+ audio_init_data.ctx = ctx; -+ pool->audio_count = 0; -+ for (i = 0; i < pool->controller_count; i++) { -+ struct graphics_object_id obj_id; -+ -+ obj_id = dal_adapter_service_enum_audio_object(adapter_serv, i); -+ if (false == dal_graphics_object_id_is_valid(obj_id)) { -+ /* no more valid audio objects */ -+ break; -+ } -+ -+ audio_init_data.audio_stream_id = obj_id; -+ pool->audios[i] = dal_audio_create(&audio_init_data); -+ if (pool->audios[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create DPPs!\n"); -+ goto audio_create_fail; -+ } -+ pool->audio_count++; -+ } -+ -+ for (i = 0; i < pool->stream_enc_count; i++) { -+ /* TODO: rework fragile code*/ -+ if (pool->stream_engines.u_all & 1 << i) { -+ pool->stream_enc[i] = dce110_stream_encoder_create( -+ i, dc->ctx, -+ dal_adapter_service_get_bios_parser( -+ adapter_serv), -+ &stream_enc_regs[i]); -+ if (pool->stream_enc[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create stream_encoder!\n"); -+ goto stream_enc_create_fail; -+ } -+ } -+ } -+ -+ for (i = 0; i < num_virtual_links; i++) { -+ pool->stream_enc[pool->stream_enc_count] = -+ virtual_stream_encoder_create( -+ dc->ctx, dal_adapter_service_get_bios_parser( -+ adapter_serv)); -+ if (pool->stream_enc[pool->stream_enc_count] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dal_error("DC: failed to create stream_encoder!\n"); -+ goto stream_enc_create_fail; -+ } -+ pool->stream_enc_count++; -+ } -+ -+ return true; -+ -+stream_enc_create_fail: -+ for (i = 0; i < pool->stream_enc_count; i++) { -+ if (pool->stream_enc[i] != NULL) -+ dc_service_free(pool->stream_enc[i]->ctx, -+ DCE110STRENC_FROM_STRENC(pool->stream_enc[i])); -+ } -+ -+audio_create_fail: -+ for (i = 0; i < pool->controller_count; i++) { -+ if (pool->audios[i] != NULL) -+ dal_audio_destroy(&pool->audios[i]); -+ } -+ -+controller_create_fail: -+ for (i = 0; i < pool->controller_count; i++) { -+ if (pool->opps[i] != NULL) -+ dce110_opp_destroy(&pool->opps[i]); -+ -+ if (pool->transforms[i] != NULL) -+ dce110_transform_destroy(&pool->transforms[i]); -+ -+ if (pool->ipps[i] != NULL) -+ dce110_ipp_destroy(&pool->ipps[i]); -+ -+ if (pool->mis[i] != NULL) { -+ dc_service_free(pool->mis[i]->ctx, -+ TO_DCE110_MEM_INPUT(pool->mis[i])); -+ pool->mis[i] = NULL; -+ } -+ -+ if (pool->timing_generators[i] != NULL) { -+ dc_service_free(pool->timing_generators[i]->ctx, -+ DCE110TG_FROM_TG(pool->timing_generators[i])); -+ pool->timing_generators[i] = NULL; -+ } -+ } -+ -+filter_create_fail: -+ dal_irq_service_destroy(&pool->irqs); -+ -+irqs_create_fail: -+ dal_display_clock_destroy(&pool->display_clock); -+ -+disp_clk_create_fail: -+clk_src_create_fail: -+ for (i = 0; i < pool->clk_src_count; i++) { -+ if (pool->clock_sources[i] != NULL) -+ dce110_clock_source_destroy(&pool->clock_sources[i]); -+ } -+ -+ return false; -+} -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h -index 5f00a3c..5d60df2 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h -@@ -31,8 +31,6 @@ - struct adapter_service; - struct dc; - struct resource_pool; --struct dc_validation_set; -- - - bool dce110_construct_resource_pool( - struct adapter_service *adapter_serv, -@@ -42,19 +40,6 @@ bool dce110_construct_resource_pool( - - void dce110_destruct_resource_pool(struct resource_pool *pool); - --enum dc_status dce110_validate_with_context( -- const struct dc *dc, -- const struct dc_validation_set set[], -- uint8_t set_count, -- struct validate_context *context); -- --enum dc_status dce110_validate_bandwidth( -- const struct dc *dc, -- struct validate_context *context); -- --struct link_encoder *dce110_link_encoder_create( -- const struct encoder_init_data *enc_init_data); -- - void dce110_link_encoder_destroy(struct link_encoder **enc); - - #endif /* __DC_RESOURCE_DCE110_H__ */ -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c -index 79e34dc..50b7c70 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c -@@ -35,8 +35,8 @@ - #include "include/grph_object_id.h" - #include "include/adapter_service_interface.h" - #include "include/logger_interface.h" --#include "inc/timing_generator_types.h" - #include "dce110_timing_generator.h" -+#include "../inc/timing_generator.h" - - enum black_color_format { - BLACK_COLOR_FORMAT_RGB_FULLRANGE = 0, /* used as index in array */ -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h -index 0a57052..163fadd 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h -@@ -27,7 +27,7 @@ - #define __DC_TIMING_GENERATOR_DCE110_H__ - - --#include "inc/timing_generator_types.h" -+#include "../inc/timing_generator.h" - #include "../include/grph_object_id.h" - #include "../include/hw_sequencer_types.h" - -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h b/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h -index d794132..4d4fd0c 100644 ---- a/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h -+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h -@@ -14,10 +14,8 @@ - struct dc { - struct dc_context *ctx; - -- /** link-related data - begin **/ - uint8_t link_count; - struct core_link *links[MAX_PIPES * 2]; -- /** link-related data - end **/ - - /* TODO: determine max number of targets*/ - struct validate_context current_context; -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h -index e3b5918..7d63ebb 100644 ---- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h -+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h -@@ -273,6 +273,25 @@ void core_link_disable_stream( - /********** DAL Core*********************/ - #include "display_clock_interface.h" - -+struct resource_pool; -+struct validate_context; -+ -+struct resource_funcs { -+ void (*destruct)(struct resource_pool *pool); -+ struct link_encoder *(*link_enc_create)( -+ const struct encoder_init_data *init); -+ void (*link_enc_destroy)(struct link_encoder **enc); -+ enum dc_status (*validate_with_context)( -+ const struct dc *dc, -+ const struct dc_validation_set set[], -+ uint8_t set_count, -+ struct validate_context *context); -+ -+ enum dc_status (*validate_bandwidth)( -+ const struct dc *dc, -+ struct validate_context *context); -+}; -+ - struct resource_pool { - struct scaler_filter * scaler_filter; - -@@ -297,6 +316,8 @@ struct resource_pool { - struct display_clock *display_clock; - struct adapter_service *adapter_srv; - struct irq_service *irqs; -+ -+ struct resource_funcs *funcs; - }; - - struct controller_ctx { -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -index 1dedf7c..bbb39e4 100644 ---- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -+++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -@@ -39,68 +39,47 @@ enum pipe_gating_control { - struct hw_sequencer_funcs { - - enum dc_status (*apply_ctx_to_hw)( -- const struct dc *dc, -- struct validate_context *context); -+ const struct dc *dc, struct validate_context *context); - -- void (*reset_hw_ctx)(struct dc *dc, -- struct validate_context *context, -- uint8_t target_count); -+ void (*reset_hw_ctx)( -+ struct dc *dc, -+ struct validate_context *context, -+ uint8_t target_count); - - bool (*set_plane_config)( -- struct core_surface *surface, -- struct core_target *target); -+ const struct dc *dc, -+ struct core_surface *surface, -+ struct core_target *target); - - bool (*update_plane_address)( -- const struct core_surface *surface, -- struct core_target *target); -- -- bool (*enable_memory_requests)(struct timing_generator *tg); -- -- bool (*disable_memory_requests)(struct timing_generator *tg); -- -- bool (*transform_power_up)(struct transform *xfm); -+ const struct dc *dc, -+ const struct core_surface *surface, -+ struct core_target *target); - - bool (*set_gamma_ramp)( -- struct input_pixel_processor *ipp, -- struct output_pixel_processor *opp, -- const struct gamma_ramp *ramp, -- const struct gamma_parameters *params); -+ struct input_pixel_processor *ipp, -+ struct output_pixel_processor *opp, -+ const struct gamma_ramp *ramp, -+ const struct gamma_parameters *params); - - void (*power_down)(struct dc *dc); - - void (*enable_accelerated_mode)(struct dc *dc); - -- void (*get_crtc_positions)( -- struct timing_generator *tg, -- int32_t *h_position, -- int32_t *v_position); -- -- uint32_t (*get_vblank_counter)(struct timing_generator *tg); -- - void (*enable_timing_synchronization)( - struct dc_context *dc_ctx, - uint32_t timing_generator_num, - struct timing_generator *tgs[]); - -- void (*disable_vga)(struct timing_generator *tg); -- -- -- -- /* link encoder sequences */ -- struct link_encoder *(*encoder_create)( -- const struct encoder_init_data *init); -- -- void (*encoder_destroy)(struct link_encoder **enc); -- - /* backlight control */ -- void (*encoder_set_lcd_backlight_level)(struct link_encoder *enc, -- uint32_t level); -+ void (*encoder_set_lcd_backlight_level)( -+ struct link_encoder *enc, uint32_t level); -+ - -+ void (*crtc_switch_to_clk_src)(struct clock_source *, uint8_t); - - /* power management */ -- void (*clock_gating_power_up)( -- struct dc_context *ctx, -- bool enable); -+ void (*clock_gating_power_up)(struct dc_context *ctx, bool enable); - - void (*enable_display_pipe_clock_gating)( - struct dc_context *ctx, -@@ -112,36 +91,25 @@ struct hw_sequencer_funcs { - struct dc_bios *dcb, - enum pipe_gating_control power_gating); - -- /* resource management and validation*/ -- bool (*construct_resource_pool)( -- struct adapter_service *adapter_serv, -- uint8_t num_virtual_links, -- struct dc *dc, -- struct resource_pool *pool); -- -- void (*destruct_resource_pool)(struct resource_pool *pool); -- -- enum dc_status (*validate_with_context)( -- const struct dc *dc, -- const struct dc_validation_set set[], -- uint8_t set_count, -- struct validate_context *context); -- -- enum dc_status (*validate_bandwidth)( -- const struct dc *dc, -- struct validate_context *context); -- void (*program_bw)( -- struct dc *dc, -- struct validate_context *context); -- void (*enable_stream)( -- struct core_stream *stream); -- -- void (*disable_stream)( -- struct core_stream *stream); -- -- void (*set_mst_bandwidth)( -- struct stream_encoder *enc, -- struct fixed31_32 avg_time_slots_per_mtp); -+ void (*program_bw)(struct dc *dc, struct validate_context *context); -+ -+ void (*enable_stream)(struct core_stream *stream); -+ -+ void (*disable_stream)(struct core_stream *stream); -+ -+ void (*enable_fe_clock)( -+ struct dc_context *ctx, uint8_t controller_id, bool enable); -+ -+ bool (*pipe_control_lock)( -+ struct dc_context *ctx, -+ uint8_t controller_idx, -+ uint32_t control_mask, -+ bool lock); -+ -+ void (*set_blender_mode)( -+ struct dc_context *ctx, -+ uint8_t controller_id, -+ uint32_t mode); - }; - - bool dc_construct_hw_sequencer( -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/resource.h b/drivers/gpu/drm/amd/dal/dc/inc/resource.h -index ea6be75..bda92e3 100644 ---- a/drivers/gpu/drm/amd/dal/dc/inc/resource.h -+++ b/drivers/gpu/drm/amd/dal/dc/inc/resource.h -@@ -32,6 +32,10 @@ - /* TODO unhardcode, 4 for CZ*/ - #define MEMORY_TYPE_MULTIPLIER 4 - -+bool dc_construct_resource_pool(struct adapter_service *adapter_serv, -+ struct dc *dc, -+ uint8_t num_virtual_links); -+ - void build_scaling_params( - const struct dc_surface *surface, - struct core_stream *stream); -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/timing_generator.h b/drivers/gpu/drm/amd/dal/dc/inc/timing_generator.h -new file mode 100644 -index 0000000..e9ca169 ---- /dev/null -+++ b/drivers/gpu/drm/amd/dal/dc/inc/timing_generator.h -@@ -0,0 +1,155 @@ -+/* -+ * 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 -+ * -+ */ -+ -+#ifndef __DAL_TIMING_GENERATOR_TYPES_H__ -+#define __DAL_TIMING_GENERATOR_TYPES_H__ -+ -+#include "include/grph_csc_types.h" -+ -+struct dc_bios; -+ -+/** -+ * These parameters are required as input when doing blanking/Unblanking -+*/ -+struct crtc_black_color { -+ uint32_t black_color_r_cr; -+ uint32_t black_color_g_y; -+ uint32_t black_color_b_cb; -+}; -+ -+/* Contains CRTC vertical/horizontal pixel counters */ -+struct crtc_position { -+ uint32_t vertical_count; -+ uint32_t horizontal_count; -+ uint32_t nominal_vcount; -+}; -+ -+ -+enum dcp_gsl_purpose { -+ DCP_GSL_PURPOSE_SURFACE_FLIP = 0, -+ DCP_GSL_PURPOSE_STEREO3D_PHASE, -+ DCP_GSL_PURPOSE_UNDEFINED -+}; -+ -+struct dcp_gsl_params { -+ enum sync_source gsl_group; -+ enum dcp_gsl_purpose gsl_purpose; -+ bool timing_server; -+ bool overlay_present; -+ bool gsl_paused; -+}; -+ -+#define LEFT_EYE_3D_PRIMARY_SURFACE 1 -+#define RIGHT_EYE_3D_PRIMARY_SURFACE 0 -+ -+enum test_pattern_dyn_range { -+ TEST_PATTERN_DYN_RANGE_VESA = 0, -+ TEST_PATTERN_DYN_RANGE_CEA -+}; -+ -+enum test_pattern_mode { -+ TEST_PATTERN_MODE_COLORSQUARES_RGB = 0, -+ TEST_PATTERN_MODE_COLORSQUARES_YCBCR601, -+ TEST_PATTERN_MODE_COLORSQUARES_YCBCR709, -+ TEST_PATTERN_MODE_VERTICALBARS, -+ TEST_PATTERN_MODE_HORIZONTALBARS, -+ TEST_PATTERN_MODE_SINGLERAMP_RGB, -+ TEST_PATTERN_MODE_DUALRAMP_RGB -+}; -+ -+enum test_pattern_color_format { -+ TEST_PATTERN_COLOR_FORMAT_BPC_6 = 0, -+ TEST_PATTERN_COLOR_FORMAT_BPC_8, -+ TEST_PATTERN_COLOR_FORMAT_BPC_10, -+ TEST_PATTERN_COLOR_FORMAT_BPC_12 -+}; -+ -+enum controller_dp_test_pattern { -+ CONTROLLER_DP_TEST_PATTERN_D102 = 0, -+ CONTROLLER_DP_TEST_PATTERN_SYMBOLERROR, -+ CONTROLLER_DP_TEST_PATTERN_PRBS7, -+ CONTROLLER_DP_TEST_PATTERN_COLORSQUARES, -+ CONTROLLER_DP_TEST_PATTERN_VERTICALBARS, -+ CONTROLLER_DP_TEST_PATTERN_HORIZONTALBARS, -+ CONTROLLER_DP_TEST_PATTERN_COLORRAMP, -+ CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, -+ CONTROLLER_DP_TEST_PATTERN_RESERVED_8, -+ CONTROLLER_DP_TEST_PATTERN_RESERVED_9, -+ CONTROLLER_DP_TEST_PATTERN_RESERVED_A, -+ CONTROLLER_DP_TEST_PATTERN_COLORSQUARES_CEA -+}; -+ -+enum crtc_state { -+ CRTC_STATE_VBLANK = 0, -+ CRTC_STATE_VACTIVE -+}; -+ -+struct timing_generator { -+ struct timing_generator_funcs *funcs; -+ struct dc_bios *bp; -+ struct dc_context *ctx; -+}; -+ -+ -+struct dc_crtc_timing; -+ -+struct timing_generator_funcs { -+ bool (*validate_timing)(struct timing_generator *tg, -+ const struct dc_crtc_timing *timing); -+ void (*program_timing)(struct timing_generator *tg, -+ const struct dc_crtc_timing *timing, -+ bool use_vbios); -+ bool (*enable_crtc)(struct timing_generator *tg); -+ bool (*disable_crtc)(struct timing_generator *tg); -+ bool (*is_counter_moving)(struct timing_generator *tg); -+ void (*get_position)(struct timing_generator *tg, -+ int32_t *h_position, -+ int32_t *v_position); -+ uint32_t (*get_frame_count)(struct timing_generator *tg); -+ void (*set_early_control)(struct timing_generator *tg, -+ uint32_t early_cntl); -+ void (*wait_for_state)(struct timing_generator *tg, -+ enum crtc_state state); -+ bool (*set_blank)(struct timing_generator *tg, -+ bool enable_blanking); -+ void (*set_overscan_blank_color) (struct timing_generator *tg, enum color_space black_color); -+ void (*set_blank_color)(struct timing_generator *tg, enum color_space black_color); -+ void (*set_colors)(struct timing_generator *tg, -+ const struct crtc_black_color *blank_color, -+ const struct crtc_black_color *overscan_color); -+ -+ void (*disable_vga)(struct timing_generator *tg); -+ bool (*did_triggered_reset_occur)(struct timing_generator *tg); -+ void (*setup_global_swap_lock)(struct timing_generator *tg, -+ const struct dcp_gsl_params *gsl_params); -+ void (*enable_reset_trigger)(struct timing_generator *tg, -+ const struct trigger_params *trigger_params); -+ void (*disable_reset_trigger)(struct timing_generator *tg); -+ void (*tear_down_global_swap_lock)(struct timing_generator *tg); -+ void (*enable_advanced_request)(struct timing_generator *tg, -+ bool enable, const struct dc_crtc_timing *timing); -+}; -+ -+#endif -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/timing_generator_types.h b/drivers/gpu/drm/amd/dal/dc/inc/timing_generator_types.h -deleted file mode 100644 -index e9ca169..0000000 ---- a/drivers/gpu/drm/amd/dal/dc/inc/timing_generator_types.h -+++ /dev/null -@@ -1,155 +0,0 @@ --/* -- * 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 -- * -- */ -- --#ifndef __DAL_TIMING_GENERATOR_TYPES_H__ --#define __DAL_TIMING_GENERATOR_TYPES_H__ -- --#include "include/grph_csc_types.h" -- --struct dc_bios; -- --/** -- * These parameters are required as input when doing blanking/Unblanking --*/ --struct crtc_black_color { -- uint32_t black_color_r_cr; -- uint32_t black_color_g_y; -- uint32_t black_color_b_cb; --}; -- --/* Contains CRTC vertical/horizontal pixel counters */ --struct crtc_position { -- uint32_t vertical_count; -- uint32_t horizontal_count; -- uint32_t nominal_vcount; --}; -- -- --enum dcp_gsl_purpose { -- DCP_GSL_PURPOSE_SURFACE_FLIP = 0, -- DCP_GSL_PURPOSE_STEREO3D_PHASE, -- DCP_GSL_PURPOSE_UNDEFINED --}; -- --struct dcp_gsl_params { -- enum sync_source gsl_group; -- enum dcp_gsl_purpose gsl_purpose; -- bool timing_server; -- bool overlay_present; -- bool gsl_paused; --}; -- --#define LEFT_EYE_3D_PRIMARY_SURFACE 1 --#define RIGHT_EYE_3D_PRIMARY_SURFACE 0 -- --enum test_pattern_dyn_range { -- TEST_PATTERN_DYN_RANGE_VESA = 0, -- TEST_PATTERN_DYN_RANGE_CEA --}; -- --enum test_pattern_mode { -- TEST_PATTERN_MODE_COLORSQUARES_RGB = 0, -- TEST_PATTERN_MODE_COLORSQUARES_YCBCR601, -- TEST_PATTERN_MODE_COLORSQUARES_YCBCR709, -- TEST_PATTERN_MODE_VERTICALBARS, -- TEST_PATTERN_MODE_HORIZONTALBARS, -- TEST_PATTERN_MODE_SINGLERAMP_RGB, -- TEST_PATTERN_MODE_DUALRAMP_RGB --}; -- --enum test_pattern_color_format { -- TEST_PATTERN_COLOR_FORMAT_BPC_6 = 0, -- TEST_PATTERN_COLOR_FORMAT_BPC_8, -- TEST_PATTERN_COLOR_FORMAT_BPC_10, -- TEST_PATTERN_COLOR_FORMAT_BPC_12 --}; -- --enum controller_dp_test_pattern { -- CONTROLLER_DP_TEST_PATTERN_D102 = 0, -- CONTROLLER_DP_TEST_PATTERN_SYMBOLERROR, -- CONTROLLER_DP_TEST_PATTERN_PRBS7, -- CONTROLLER_DP_TEST_PATTERN_COLORSQUARES, -- CONTROLLER_DP_TEST_PATTERN_VERTICALBARS, -- CONTROLLER_DP_TEST_PATTERN_HORIZONTALBARS, -- CONTROLLER_DP_TEST_PATTERN_COLORRAMP, -- CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, -- CONTROLLER_DP_TEST_PATTERN_RESERVED_8, -- CONTROLLER_DP_TEST_PATTERN_RESERVED_9, -- CONTROLLER_DP_TEST_PATTERN_RESERVED_A, -- CONTROLLER_DP_TEST_PATTERN_COLORSQUARES_CEA --}; -- --enum crtc_state { -- CRTC_STATE_VBLANK = 0, -- CRTC_STATE_VACTIVE --}; -- --struct timing_generator { -- struct timing_generator_funcs *funcs; -- struct dc_bios *bp; -- struct dc_context *ctx; --}; -- -- --struct dc_crtc_timing; -- --struct timing_generator_funcs { -- bool (*validate_timing)(struct timing_generator *tg, -- const struct dc_crtc_timing *timing); -- void (*program_timing)(struct timing_generator *tg, -- const struct dc_crtc_timing *timing, -- bool use_vbios); -- bool (*enable_crtc)(struct timing_generator *tg); -- bool (*disable_crtc)(struct timing_generator *tg); -- bool (*is_counter_moving)(struct timing_generator *tg); -- void (*get_position)(struct timing_generator *tg, -- int32_t *h_position, -- int32_t *v_position); -- uint32_t (*get_frame_count)(struct timing_generator *tg); -- void (*set_early_control)(struct timing_generator *tg, -- uint32_t early_cntl); -- void (*wait_for_state)(struct timing_generator *tg, -- enum crtc_state state); -- bool (*set_blank)(struct timing_generator *tg, -- bool enable_blanking); -- void (*set_overscan_blank_color) (struct timing_generator *tg, enum color_space black_color); -- void (*set_blank_color)(struct timing_generator *tg, enum color_space black_color); -- void (*set_colors)(struct timing_generator *tg, -- const struct crtc_black_color *blank_color, -- const struct crtc_black_color *overscan_color); -- -- void (*disable_vga)(struct timing_generator *tg); -- bool (*did_triggered_reset_occur)(struct timing_generator *tg); -- void (*setup_global_swap_lock)(struct timing_generator *tg, -- const struct dcp_gsl_params *gsl_params); -- void (*enable_reset_trigger)(struct timing_generator *tg, -- const struct trigger_params *trigger_params); -- void (*disable_reset_trigger)(struct timing_generator *tg); -- void (*tear_down_global_swap_lock)(struct timing_generator *tg); -- void (*enable_advanced_request)(struct timing_generator *tg, -- bool enable, const struct dc_crtc_timing *timing); --}; -- --#endif --- -2.7.4 - |