diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0432-drm-amd-display-dce-8-12-mem_input-refactor-to-new-s.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0432-drm-amd-display-dce-8-12-mem_input-refactor-to-new-s.patch | 3125 |
1 files changed, 3125 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0432-drm-amd-display-dce-8-12-mem_input-refactor-to-new-s.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0432-drm-amd-display-dce-8-12-mem_input-refactor-to-new-s.patch new file mode 100644 index 00000000..5c4d574f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0432-drm-amd-display-dce-8-12-mem_input-refactor-to-new-s.patch @@ -0,0 +1,3125 @@ +From 5fdd93ec6eb2f8e25797f2fa1381ff86426fd428 Mon Sep 17 00:00:00 2001 +From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Date: Mon, 15 May 2017 08:31:51 -0400 +Subject: [PATCH 0432/4131] drm/amd/display: dce 8 - 12 mem_input refactor to + new style + +Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | 306 +++++++++++++-- + drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h | 115 ++++-- + .../drm/amd/display/dc/dce100/dce100_resource.c | 78 +--- + drivers/gpu/drm/amd/display/dc/dce110/Makefile | 3 +- + .../drm/amd/display/dc/dce110/dce110_mem_input.c | 437 --------------------- + .../drm/amd/display/dc/dce110/dce110_mem_input.h | 121 ------ + .../drm/amd/display/dc/dce110/dce110_mem_input_v.c | 155 +++----- + .../drm/amd/display/dc/dce110/dce110_mem_input_v.h | 66 +--- + .../drm/amd/display/dc/dce110/dce110_resource.c | 58 +-- + drivers/gpu/drm/amd/display/dc/dce112/Makefile | 2 +- + .../drm/amd/display/dc/dce112/dce112_mem_input.c | 54 --- + .../drm/amd/display/dc/dce112/dce112_mem_input.h | 38 -- + .../drm/amd/display/dc/dce112/dce112_resource.c | 77 +--- + drivers/gpu/drm/amd/display/dc/dce120/Makefile | 2 +- + .../drm/amd/display/dc/dce120/dce120_mem_input.c | 340 ---------------- + .../drm/amd/display/dc/dce120/dce120_mem_input.h | 37 -- + .../drm/amd/display/dc/dce120/dce120_resource.c | 75 +--- + drivers/gpu/drm/amd/display/dc/dce80/Makefile | 3 +- + .../gpu/drm/amd/display/dc/dce80/dce80_mem_input.c | 83 ---- + .../gpu/drm/amd/display/dc/dce80/dce80_mem_input.h | 36 -- + .../gpu/drm/amd/display/dc/dce80/dce80_resource.c | 78 +--- + drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h | 8 - + 22 files changed, 476 insertions(+), 1696 deletions(-) + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.c + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.h + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.c + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.h + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.c + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.h + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.c + delete mode 100644 drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.h + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c +index 0552fc5..718688c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c +@@ -23,18 +23,18 @@ + * + */ + +-#include "mem_input.h" ++#include "dce_mem_input.h" + #include "reg_helper.h" + #include "basics/conversion.h" + + #define CTX \ +- mi->ctx ++ dce_mi->base.ctx + #define REG(reg)\ +- mi->regs->reg ++ dce_mi->regs->reg + + #undef FN + #define FN(reg_name, field_name) \ +- mi->shifts->field_name, mi->masks->field_name ++ dce_mi->shifts->field_name, dce_mi->masks->field_name + + struct pte_setting { + unsigned int bpp; +@@ -130,11 +130,13 @@ static bool is_vert_scan(enum dc_rotation_angle rotation) + } + } + +-void dce_mem_input_program_pte_vm(struct mem_input *mi, ++static void dce_mi_program_pte_vm( ++ struct mem_input *mi, + enum surface_pixel_format format, + union dc_tiling_info *tiling_info, + enum dc_rotation_angle rotation) + { ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); + enum mi_bits_per_pixel mi_bpp = get_mi_bpp(format); + enum mi_tiling_format mi_tiling = get_mi_tiling(tiling_info); + const struct pte_setting *pte = &pte_settings[mi_tiling][mi_bpp]; +@@ -158,7 +160,8 @@ void dce_mem_input_program_pte_vm(struct mem_input *mi, + DVMM_MAX_PTE_REQ_OUTSTANDING, 0xff); + } + +-static void program_urgency_watermark(struct mem_input *mi, ++static void program_urgency_watermark( ++ struct dce_mem_input *dce_mi, + uint32_t wm_select, + uint32_t urgency_low_wm, + uint32_t urgency_high_wm) +@@ -171,7 +174,8 @@ static void program_urgency_watermark(struct mem_input *mi, + URGENCY_HIGH_WATERMARK, urgency_high_wm); + } + +-static void program_nbp_watermark(struct mem_input *mi, ++static void program_nbp_watermark( ++ struct dce_mem_input *dce_mi, + uint32_t wm_select, + uint32_t nbp_wm) + { +@@ -202,7 +206,8 @@ static void program_nbp_watermark(struct mem_input *mi, + } + } + +-static void program_stutter_watermark(struct mem_input *mi, ++static void program_stutter_watermark( ++ struct dce_mem_input *dce_mi, + uint32_t wm_select, + uint32_t stutter_mark) + { +@@ -217,41 +222,67 @@ static void program_stutter_watermark(struct mem_input *mi, + STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark); + } + +-void dce_mem_input_program_display_marks(struct mem_input *mi, ++static void dce_mi_program_display_marks( ++ struct mem_input *mi, + struct dce_watermarks nbp, + struct dce_watermarks stutter, + struct dce_watermarks urgent, + uint32_t total_dest_line_time_ns) + { ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); + uint32_t stutter_en = mi->ctx->dc->debug.disable_stutter ? 0 : 1; + +- program_urgency_watermark(mi, 0, /* set a */ ++ program_urgency_watermark(dce_mi, 2, /* set a */ + urgent.a_mark, total_dest_line_time_ns); +- program_urgency_watermark(mi, 1, /* set b */ ++ program_urgency_watermark(dce_mi, 1, /* set d */ ++ urgent.d_mark, total_dest_line_time_ns); ++ ++ REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL, ++ STUTTER_ENABLE, stutter_en, ++ STUTTER_IGNORE_FBC, 1); ++ program_nbp_watermark(dce_mi, 2, nbp.a_mark); /* set a */ ++ program_nbp_watermark(dce_mi, 1, nbp.d_mark); /* set d */ ++ ++ program_stutter_watermark(dce_mi, 2, stutter.a_mark); /* set a */ ++ program_stutter_watermark(dce_mi, 1, stutter.d_mark); /* set d */ ++} ++ ++static void dce120_mi_program_display_marks(struct mem_input *mi, ++ struct dce_watermarks nbp, ++ struct dce_watermarks stutter, ++ struct dce_watermarks urgent, ++ uint32_t total_dest_line_time_ns) ++{ ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); ++ uint32_t stutter_en = mi->ctx->dc->debug.disable_stutter ? 0 : 1; ++ ++ program_urgency_watermark(dce_mi, 0, /* set a */ ++ urgent.a_mark, total_dest_line_time_ns); ++ program_urgency_watermark(dce_mi, 1, /* set b */ + urgent.b_mark, total_dest_line_time_ns); +- program_urgency_watermark(mi, 2, /* set c */ ++ program_urgency_watermark(dce_mi, 2, /* set c */ + urgent.c_mark, total_dest_line_time_ns); +- program_urgency_watermark(mi, 3, /* set d */ ++ program_urgency_watermark(dce_mi, 3, /* set d */ + urgent.d_mark, total_dest_line_time_ns); + + REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL, + STUTTER_ENABLE, stutter_en, + STUTTER_IGNORE_FBC, 1); +- program_nbp_watermark(mi, 0, nbp.a_mark); /* set a */ +- program_nbp_watermark(mi, 1, nbp.b_mark); /* set b */ +- program_nbp_watermark(mi, 2, nbp.c_mark); /* set c */ +- program_nbp_watermark(mi, 3, nbp.d_mark); /* set d */ +- +- program_stutter_watermark(mi, 0, stutter.a_mark); /* set a */ +- program_stutter_watermark(mi, 1, stutter.b_mark); /* set b */ +- program_stutter_watermark(mi, 2, stutter.c_mark); /* set c */ +- program_stutter_watermark(mi, 3, stutter.d_mark); /* set d */ ++ program_nbp_watermark(dce_mi, 0, nbp.a_mark); /* set a */ ++ program_nbp_watermark(dce_mi, 1, nbp.b_mark); /* set b */ ++ program_nbp_watermark(dce_mi, 2, nbp.c_mark); /* set c */ ++ program_nbp_watermark(dce_mi, 3, nbp.d_mark); /* set d */ ++ ++ program_stutter_watermark(dce_mi, 0, stutter.a_mark); /* set a */ ++ program_stutter_watermark(dce_mi, 1, stutter.b_mark); /* set b */ ++ program_stutter_watermark(dce_mi, 2, stutter.c_mark); /* set c */ ++ program_stutter_watermark(dce_mi, 3, stutter.d_mark); /* set d */ + } + +-static void program_tiling(struct mem_input *mi, +- const union dc_tiling_info *info) ++static void program_tiling( ++ struct dce_mem_input *dce_mi, const union dc_tiling_info *info) + { +- if (mi->masks->GRPH_SW_MODE) { /* GFX9 */ ++ if (dce_mi->masks->GRPH_SW_MODE) { /* GFX9 */ + REG_UPDATE_6(GRPH_CONTROL, + GRPH_SW_MODE, info->gfx9.swizzle, + GRPH_NUM_BANKS, log_2(info->gfx9.num_banks), +@@ -265,7 +296,7 @@ static void program_tiling(struct mem_input *mi, + */ + } + +- if (mi->masks->GRPH_ARRAY_MODE) { /* GFX8 */ ++ if (dce_mi->masks->GRPH_ARRAY_MODE) { /* GFX8 */ + REG_UPDATE_9(GRPH_CONTROL, + GRPH_NUM_BANKS, info->gfx8.num_banks, + GRPH_BANK_WIDTH, info->gfx8.bank_width, +@@ -285,7 +316,7 @@ static void program_tiling(struct mem_input *mi, + + + static void program_size_and_rotation( +- struct mem_input *mi, ++ struct dce_mem_input *dce_mi, + enum dc_rotation_angle rotation, + const union plane_size *plane_size) + { +@@ -326,7 +357,7 @@ static void program_size_and_rotation( + } + + static void program_grph_pixel_format( +- struct mem_input *mi, ++ struct dce_mem_input *dce_mi, + enum surface_pixel_format format) + { + uint32_t red_xbar = 0, blue_xbar = 0; /* no swap */ +@@ -397,7 +428,8 @@ static void program_grph_pixel_format( + GRPH_PRESCALE_B_SIGN, sign); + } + +-void dce_mem_input_program_surface_config(struct mem_input *mi, ++static void dce_mi_program_surface_config( ++ struct mem_input *mi, + enum surface_pixel_format format, + union dc_tiling_info *tiling_info, + union plane_size *plane_size, +@@ -405,14 +437,15 @@ void dce_mem_input_program_surface_config(struct mem_input *mi, + struct dc_plane_dcc_param *dcc, + bool horizontal_mirror) + { ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); + REG_UPDATE(GRPH_ENABLE, GRPH_ENABLE, 1); + +- program_tiling(mi, tiling_info); +- program_size_and_rotation(mi, rotation, plane_size); ++ program_tiling(dce_mi, tiling_info); ++ program_size_and_rotation(dce_mi, rotation, plane_size); + + if (format >= SURFACE_PIXEL_FORMAT_GRPH_BEGIN && + format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) +- program_grph_pixel_format(mi, format); ++ program_grph_pixel_format(dce_mi, format); + } + + static uint32_t get_dmif_switch_time_us( +@@ -461,12 +494,14 @@ static uint32_t get_dmif_switch_time_us( + return frame_time; + } + +-void dce_mem_input_allocate_dmif(struct mem_input *mi, ++static void dce_mi_allocate_dmif( ++ struct mem_input *mi, + uint32_t h_total, + uint32_t v_total, + uint32_t pix_clk_khz, + uint32_t total_stream_num) + { ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); + const uint32_t retry_delay = 10; + uint32_t retry_count = get_dmif_switch_time_us( + h_total, +@@ -497,18 +532,20 @@ void dce_mem_input_allocate_dmif(struct mem_input *mi, + PIXEL_DURATION, pix_dur); + } + +- if (mi->wa.single_head_rdreq_dmif_limit) { ++ if (dce_mi->wa.single_head_rdreq_dmif_limit) { + uint32_t eanble = (total_stream_num > 1) ? 0 : +- mi->wa.single_head_rdreq_dmif_limit; ++ dce_mi->wa.single_head_rdreq_dmif_limit; + + REG_UPDATE(MC_HUB_RDREQ_DMIF_LIMIT, + ENABLE, eanble); + } + } + +-void dce_mem_input_free_dmif(struct mem_input *mi, ++static void dce_mi_free_dmif( ++ struct mem_input *mi, + uint32_t total_stream_num) + { ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); + uint32_t buffers_allocated; + uint32_t dmif_buffer_control; + +@@ -525,11 +562,204 @@ void dce_mem_input_free_dmif(struct mem_input *mi, + DMIF_BUFFERS_ALLOCATION_COMPLETED, 1, + 10, 3500); + +- if (mi->wa.single_head_rdreq_dmif_limit) { ++ if (dce_mi->wa.single_head_rdreq_dmif_limit) { + uint32_t eanble = (total_stream_num > 1) ? 0 : +- mi->wa.single_head_rdreq_dmif_limit; ++ dce_mi->wa.single_head_rdreq_dmif_limit; + + REG_UPDATE(MC_HUB_RDREQ_DMIF_LIMIT, + ENABLE, eanble); + } + } ++ ++ ++static void program_sec_addr( ++ struct dce_mem_input *dce_mi, ++ PHYSICAL_ADDRESS_LOC address) ++{ ++ /*high register MUST be programmed first*/ ++ REG_SET(GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, 0, ++ GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, ++ address.high_part); ++ ++ REG_SET_2(GRPH_SECONDARY_SURFACE_ADDRESS, 0, ++ GRPH_SECONDARY_SURFACE_ADDRESS, address.low_part >> 8, ++ GRPH_SECONDARY_DFQ_ENABLE, 0); ++} ++ ++static void program_pri_addr( ++ struct dce_mem_input *dce_mi, ++ PHYSICAL_ADDRESS_LOC address) ++{ ++ /*high register MUST be programmed first*/ ++ REG_SET(GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, 0, ++ GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, ++ address.high_part); ++ ++ REG_SET(GRPH_PRIMARY_SURFACE_ADDRESS, 0, ++ GRPH_PRIMARY_SURFACE_ADDRESS, ++ address.low_part >> 8); ++} ++ ++ ++static bool dce_mi_is_flip_pending(struct mem_input *mem_input) ++{ ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mem_input); ++ uint32_t update_pending; ++ ++ REG_GET(GRPH_UPDATE, GRPH_SURFACE_UPDATE_PENDING, &update_pending); ++ if (update_pending) ++ return true; ++ ++ mem_input->current_address = mem_input->request_address; ++ return false; ++} ++ ++static bool dce_mi_program_surface_flip_and_addr( ++ struct mem_input *mem_input, ++ const struct dc_plane_address *address, ++ bool flip_immediate) ++{ ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mem_input); ++ ++ /* TODO: Figure out if two modes are needed: ++ * non-XDMA Mode: GRPH_SURFACE_UPDATE_IMMEDIATE_EN = 1 ++ * XDMA Mode: GRPH_SURFACE_UPDATE_H_RETRACE_EN = 1 ++ */ ++ REG_UPDATE(GRPH_UPDATE, ++ GRPH_UPDATE_LOCK, 1); ++ ++ if (flip_immediate) { ++ REG_UPDATE_2(GRPH_FLIP_CONTROL, ++ GRPH_SURFACE_UPDATE_IMMEDIATE_EN, 0, ++ GRPH_SURFACE_UPDATE_H_RETRACE_EN, 1); ++ } else { ++ REG_UPDATE_2(GRPH_FLIP_CONTROL, ++ GRPH_SURFACE_UPDATE_IMMEDIATE_EN, 0, ++ GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0); ++ } ++ ++ switch (address->type) { ++ case PLN_ADDR_TYPE_GRAPHICS: ++ if (address->grph.addr.quad_part == 0) ++ break; ++ program_pri_addr(dce_mi, address->grph.addr); ++ break; ++ case PLN_ADDR_TYPE_GRPH_STEREO: ++ if (address->grph_stereo.left_addr.quad_part == 0 ++ || address->grph_stereo.right_addr.quad_part == 0) ++ break; ++ program_pri_addr(dce_mi, address->grph_stereo.left_addr); ++ program_sec_addr(dce_mi, address->grph_stereo.right_addr); ++ break; ++ default: ++ /* not supported */ ++ BREAK_TO_DEBUGGER(); ++ break; ++ } ++ ++ mem_input->request_address = *address; ++ ++ if (flip_immediate) ++ mem_input->current_address = *address; ++ ++ REG_UPDATE(GRPH_UPDATE, ++ GRPH_UPDATE_LOCK, 0); ++ ++ return true; ++} ++ ++static void dce_mi_update_dchub(struct mem_input *mi, ++ struct dchub_init_data *dh_data) ++{ ++ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); ++ /* TODO: port code from dal2 */ ++ switch (dh_data->fb_mode) { ++ case FRAME_BUFFER_MODE_ZFB_ONLY: ++ /*For ZFB case need to put DCHUB FB BASE and TOP upside down to indicate ZFB mode*/ ++ REG_UPDATE_2(DCHUB_FB_LOCATION, ++ FB_TOP, 0, ++ FB_BASE, 0x0FFFF); ++ ++ REG_UPDATE(DCHUB_AGP_BASE, ++ AGP_BASE, dh_data->zfb_phys_addr_base >> 22); ++ ++ REG_UPDATE(DCHUB_AGP_BOT, ++ AGP_BOT, dh_data->zfb_mc_base_addr >> 22); ++ ++ REG_UPDATE(DCHUB_AGP_TOP, ++ AGP_TOP, (dh_data->zfb_mc_base_addr + dh_data->zfb_size_in_byte - 1) >> 22); ++ break; ++ case FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL: ++ /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ ++ REG_UPDATE(DCHUB_AGP_BASE, ++ AGP_BASE, dh_data->zfb_phys_addr_base >> 22); ++ ++ REG_UPDATE(DCHUB_AGP_BOT, ++ AGP_BOT, dh_data->zfb_mc_base_addr >> 22); ++ ++ REG_UPDATE(DCHUB_AGP_TOP, ++ AGP_TOP, (dh_data->zfb_mc_base_addr + dh_data->zfb_size_in_byte - 1) >> 22); ++ break; ++ case FRAME_BUFFER_MODE_LOCAL_ONLY: ++ /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ ++ REG_UPDATE(DCHUB_AGP_BASE, ++ AGP_BASE, 0); ++ ++ REG_UPDATE(DCHUB_AGP_BOT, ++ AGP_BOT, 0x03FFFF); ++ ++ REG_UPDATE(DCHUB_AGP_TOP, ++ AGP_TOP, 0); ++ break; ++ default: ++ break; ++ } ++ ++ dh_data->dchub_initialzied = true; ++ dh_data->dchub_info_valid = false; ++} ++ ++static struct mem_input_funcs dce_mi_funcs = { ++ .mem_input_program_display_marks = dce_mi_program_display_marks, ++ .allocate_mem_input = dce_mi_allocate_dmif, ++ .free_mem_input = dce_mi_free_dmif, ++ .mem_input_program_surface_flip_and_addr = ++ dce_mi_program_surface_flip_and_addr, ++ .mem_input_program_pte_vm = dce_mi_program_pte_vm, ++ .mem_input_program_surface_config = ++ dce_mi_program_surface_config, ++ .mem_input_is_flip_pending = dce_mi_is_flip_pending, ++ .mem_input_update_dchub = dce_mi_update_dchub ++}; ++ ++ ++void dce_mem_input_construct( ++ struct dce_mem_input *dce_mi, ++ struct dc_context *ctx, ++ int inst, ++ const struct dce_mem_input_registers *regs, ++ const struct dce_mem_input_shift *mi_shift, ++ const struct dce_mem_input_mask *mi_mask) ++{ ++ dce_mi->base.ctx = ctx; ++ ++ dce_mi->base.inst = inst; ++ dce_mi->base.funcs = &dce_mi_funcs; ++ ++ dce_mi->regs = regs; ++ dce_mi->shifts = mi_shift; ++ dce_mi->masks = mi_mask; ++ ++} ++ ++void dce112_mem_input_construct( ++ struct dce_mem_input *dce_mi, ++ struct dc_context *ctx, ++ int inst, ++ const struct dce_mem_input_registers *regs, ++ const struct dce_mem_input_shift *mi_shift, ++ const struct dce_mem_input_mask *mi_mask) ++{ ++ dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask); ++ dce_mi->base.funcs->mem_input_program_display_marks = dce120_mi_program_display_marks; ++} +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h +index 4977f5f..55481f5 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h +@@ -26,8 +26,10 @@ + #define __DCE_MEM_INPUT_H__ + + #include "dc_hw_types.h" +-struct dce_watermarks; +-struct mem_input; ++#include "mem_input.h" ++ ++#define TO_DCE_MEM_INPUT(mem_input)\ ++ container_of(mem_input, struct dce_mem_input, base) + + #define MI_DCE_BASE_REG_LIST(id)\ + SRI(GRPH_ENABLE, DCP, id),\ +@@ -40,6 +42,12 @@ struct mem_input; + SRI(HW_ROTATION, DCP, id),\ + SRI(GRPH_SWAP_CNTL, DCP, id),\ + SRI(PRESCALE_GRPH_CONTROL, DCP, id),\ ++ SRI(GRPH_UPDATE, DCP, id),\ ++ SRI(GRPH_FLIP_CONTROL, DCP, id),\ ++ SRI(GRPH_PRIMARY_SURFACE_ADDRESS, DCP, id),\ ++ SRI(GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, DCP, id),\ ++ SRI(GRPH_SECONDARY_SURFACE_ADDRESS, DCP, id),\ ++ SRI(GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, DCP, id),\ + SRI(DPG_PIPE_ARBITRATION_CONTROL1, DMIF_PG, id),\ + SRI(DPG_WATERMARK_MASK_CONTROL, DMIF_PG, id),\ + SRI(DPG_PIPE_URGENCY_CONTROL, DMIF_PG, id),\ +@@ -67,7 +75,11 @@ struct mem_input; + MI_DCE_PTE_REG_LIST(id),\ + SRI(GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, DCP, id),\ + SRI(DPG_PIPE_STUTTER_CONTROL2, DMIF_PG, id),\ +- SRI(DPG_PIPE_LOW_POWER_CONTROL, DMIF_PG, id) ++ SRI(DPG_PIPE_LOW_POWER_CONTROL, DMIF_PG, id),\ ++ SR(DCHUB_FB_LOCATION),\ ++ SR(DCHUB_AGP_BASE),\ ++ SR(DCHUB_AGP_BOT),\ ++ SR(DCHUB_AGP_TOP) + + struct dce_mem_input_registers { + /* DCP */ +@@ -84,6 +96,12 @@ struct dce_mem_input_registers { + uint32_t GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT; + uint32_t DVMM_PTE_CONTROL; + uint32_t DVMM_PTE_ARB_CONTROL; ++ uint32_t GRPH_UPDATE; ++ uint32_t GRPH_FLIP_CONTROL; ++ uint32_t GRPH_PRIMARY_SURFACE_ADDRESS; ++ uint32_t GRPH_PRIMARY_SURFACE_ADDRESS_HIGH; ++ uint32_t GRPH_SECONDARY_SURFACE_ADDRESS; ++ uint32_t GRPH_SECONDARY_SURFACE_ADDRESS_HIGH; + /* DMIF_PG */ + uint32_t DPG_PIPE_ARBITRATION_CONTROL1; + uint32_t DPG_WATERMARK_MASK_CONTROL; +@@ -96,6 +114,11 @@ struct dce_mem_input_registers { + uint32_t DMIF_BUFFER_CONTROL; + /* MC_HUB */ + uint32_t MC_HUB_RDREQ_DMIF_LIMIT; ++ /*DCHUB*/ ++ uint32_t DCHUB_FB_LOCATION; ++ uint32_t DCHUB_AGP_BASE; ++ uint32_t DCHUB_AGP_BOT; ++ uint32_t DCHUB_AGP_TOP; + }; + + /* Set_Filed_for_Block */ +@@ -129,9 +152,16 @@ struct dce_mem_input_registers { + SFB(blk, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_SELECT, mask_sh),\ + SFB(blk, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_R_SIGN, mask_sh),\ + SFB(blk, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_G_SIGN, mask_sh),\ +- SFB(blk, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_B_SIGN, mask_sh) ++ SFB(blk, PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_B_SIGN, mask_sh),\ ++ SFB(blk, GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, mask_sh),\ ++ SFB(blk, GRPH_SECONDARY_SURFACE_ADDRESS, GRPH_SECONDARY_SURFACE_ADDRESS, mask_sh),\ ++ SFB(blk, GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, mask_sh),\ ++ SFB(blk, GRPH_PRIMARY_SURFACE_ADDRESS, GRPH_PRIMARY_SURFACE_ADDRESS, mask_sh),\ ++ SFB(blk, GRPH_UPDATE, GRPH_SURFACE_UPDATE_PENDING, mask_sh),\ ++ SFB(blk, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_H_RETRACE_EN, mask_sh) + + #define MI_DCP_DCE11_MASK_SH_LIST(mask_sh, blk)\ ++ SFB(blk, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_IMMEDIATE_EN, mask_sh),\ + SFB(blk, GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, mask_sh) + + #define MI_DCP_PTE_MASK_SH_LIST(mask_sh, blk)\ +@@ -189,13 +219,22 @@ struct dce_mem_input_registers { + SFB(blk, DPG_PIPE_LOW_POWER_CONTROL, PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST, mask_sh),\ + SFB(blk, DPG_PIPE_LOW_POWER_CONTROL, PSTATE_CHANGE_WATERMARK, mask_sh) + ++#define MI_GFX9_DCHUB_MASK_SH_LIST(mask_sh)\ ++ SF(DCHUB_FB_LOCATION, FB_TOP, mask_sh),\ ++ SF(DCHUB_FB_LOCATION, FB_BASE, mask_sh),\ ++ SF(DCHUB_AGP_BASE, AGP_BASE, mask_sh),\ ++ SF(DCHUB_AGP_BOT, AGP_BOT, mask_sh),\ ++ SF(DCHUB_AGP_TOP, AGP_TOP, mask_sh) ++ + #define MI_DCE12_MASK_SH_LIST(mask_sh)\ + MI_DCP_MASK_SH_LIST(mask_sh, DCP0_),\ ++ SF(DCP0_GRPH_SECONDARY_SURFACE_ADDRESS, GRPH_SECONDARY_DFQ_ENABLE, mask_sh),\ + MI_DCP_DCE11_MASK_SH_LIST(mask_sh, DCP0_),\ + MI_DCP_PTE_MASK_SH_LIST(mask_sh, DCP0_),\ + MI_DMIF_PG_MASK_SH_LIST(mask_sh, DMIF_PG0_),\ + MI_DCE12_DMIF_PG_MASK_SH_LIST(mask_sh, DMIF_PG0_),\ +- MI_GFX9_TILE_MASK_SH_LIST(mask_sh, DCP0_) ++ MI_GFX9_TILE_MASK_SH_LIST(mask_sh, DCP0_),\ ++ MI_GFX9_DCHUB_MASK_SH_LIST(mask_sh) + + #define MI_REG_FIELD_LIST(type) \ + type GRPH_ENABLE; \ +@@ -232,6 +271,15 @@ struct dce_mem_input_registers { + type GRPH_SE_ENABLE; \ + type GRPH_NUM_SHADER_ENGINES; \ + type GRPH_NUM_PIPES; \ ++ type GRPH_SECONDARY_SURFACE_ADDRESS_HIGH; \ ++ type GRPH_SECONDARY_SURFACE_ADDRESS; \ ++ type GRPH_SECONDARY_DFQ_ENABLE; \ ++ type GRPH_PRIMARY_SURFACE_ADDRESS_HIGH; \ ++ type GRPH_PRIMARY_SURFACE_ADDRESS; \ ++ type GRPH_SURFACE_UPDATE_PENDING; \ ++ type GRPH_SURFACE_UPDATE_IMMEDIATE_EN; \ ++ type GRPH_SURFACE_UPDATE_H_RETRACE_EN; \ ++ type GRPH_UPDATE_LOCK; \ + type PIXEL_DURATION; \ + type URGENCY_WATERMARK_MASK; \ + type PSTATE_CHANGE_WATERMARK_MASK; \ +@@ -253,6 +301,11 @@ struct dce_mem_input_registers { + type DMIF_BUFFERS_ALLOCATED; \ + type DMIF_BUFFERS_ALLOCATION_COMPLETED; \ + type ENABLE; /* MC_HUB_RDREQ_DMIF_LIMIT */\ ++ type FB_BASE; \ ++ type FB_TOP; \ ++ type AGP_BASE; \ ++ type AGP_TOP; \ ++ type AGP_BOT; \ + + struct dce_mem_input_shift { + MI_REG_FIELD_LIST(uint8_t) +@@ -266,32 +319,30 @@ struct dce_mem_input_wa { + uint8_t single_head_rdreq_dmif_limit; + }; + +-void dce_mem_input_program_pte_vm(struct mem_input *mi, +- enum surface_pixel_format format, +- union dc_tiling_info *tiling_info, +- enum dc_rotation_angle rotation); +- +-void dce_mem_input_program_surface_config(struct mem_input *mi, +- enum surface_pixel_format format, +- union dc_tiling_info *tiling_info, +- union plane_size *plane_size, +- enum dc_rotation_angle rotation, +- struct dc_plane_dcc_param *dcc, +- bool horizontal_mirror); +- +-void dce_mem_input_allocate_dmif(struct mem_input *mi, +- uint32_t h_total, +- uint32_t v_total, +- uint32_t pix_clk_khz, +- uint32_t total_stream_num); +- +-void dce_mem_input_free_dmif(struct mem_input *mi, +- uint32_t total_stream_num); +- +-void dce_mem_input_program_display_marks(struct mem_input *mi, +- struct dce_watermarks nbp, +- struct dce_watermarks stutter, +- struct dce_watermarks urgent, +- uint32_t total_dest_line_time_ns); ++struct dce_mem_input { ++ struct mem_input base; ++ ++ const struct dce_mem_input_registers *regs; ++ const struct dce_mem_input_shift *shifts; ++ const struct dce_mem_input_mask *masks; ++ ++ struct dce_mem_input_wa wa; ++}; ++ ++void dce_mem_input_construct( ++ struct dce_mem_input *dce_mi, ++ struct dc_context *ctx, ++ int inst, ++ const struct dce_mem_input_registers *regs, ++ const struct dce_mem_input_shift *mi_shift, ++ const struct dce_mem_input_mask *mi_mask); ++ ++void dce112_mem_input_construct( ++ struct dce_mem_input *dce_mi, ++ struct dc_context *ctx, ++ int inst, ++ const struct dce_mem_input_registers *regs, ++ const struct dce_mem_input_shift *mi_shift, ++ const struct dce_mem_input_mask *mi_mask); + + #endif /*__DCE_MEM_INPUT_H__*/ +diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +index 254f9e4..8f1fe95 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +@@ -35,8 +35,8 @@ + #include "irq/dce110/irq_service_dce110.h" + #include "dce/dce_link_encoder.h" + #include "dce/dce_stream_encoder.h" +-#include "dce110/dce110_mem_input.h" +-#include "dce110/dce110_mem_input_v.h" ++ ++#include "dce/dce_mem_input.h" + #include "dce/dce_ipp.h" + #include "dce/dce_transform.h" + #include "dce/dce_opp.h" +@@ -123,51 +123,6 @@ static const struct dce110_timing_generator_offsets dce100_tg_offsets[] = { + } + }; + +-static const struct dce110_mem_input_reg_offsets dce100_mi_reg_offsets[] = { +- { +- .dcp = (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE0_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE1_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE2_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE3_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE4_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE5_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- } +-}; +- + /* set register offset */ + #define SR(reg_name)\ + .reg_name = mm ## reg_name +@@ -510,28 +465,18 @@ static const struct dce_mem_input_mask mi_masks = { + + static struct mem_input *dce100_mem_input_create( + struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offset) ++ uint32_t inst) + { +- struct dce110_mem_input *mem_input110 = +- dm_alloc(sizeof(struct dce110_mem_input)); ++ struct dce_mem_input *dce_mi = dm_alloc(sizeof(struct dce_mem_input)); + +- if (!mem_input110) ++ if (!dce_mi) { ++ BREAK_TO_DEBUGGER(); + return NULL; +- +- if (dce110_mem_input_construct(mem_input110, ctx, inst, offset)) { +- struct mem_input *mi = &mem_input110->base; +- +- mi->regs = &mi_regs[inst]; +- mi->shifts = &mi_shifts; +- mi->masks = &mi_masks; +- mi->wa.single_head_rdreq_dmif_limit = 2; +- return mi; + } + +- BREAK_TO_DEBUGGER(); +- dm_free(mem_input110); +- return NULL; ++ dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks); ++ dce_mi->wa.single_head_rdreq_dmif_limit = 2; ++ return &dce_mi->base; + } + + static void dce100_transform_destroy(struct transform **xfm) +@@ -671,7 +616,7 @@ static void destruct(struct dce110_resource_pool *pool) + dce_ipp_destroy(&pool->base.ipps[i]); + + if (pool->base.mis[i] != NULL) { +- dm_free(TO_DCE110_MEM_INPUT(pool->base.mis[i])); ++ dm_free(TO_DCE_MEM_INPUT(pool->base.mis[i])); + pool->base.mis[i] = NULL; + } + +@@ -986,8 +931,7 @@ static bool construct( + goto res_create_fail; + } + +- pool->base.mis[i] = dce100_mem_input_create(ctx, i, +- &dce100_mi_reg_offsets[i]); ++ pool->base.mis[i] = dce100_mem_input_create(ctx, i); + if (pool->base.mis[i] == NULL) { + BREAK_TO_DEBUGGER(); + dm_error( +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/Makefile b/drivers/gpu/drm/amd/display/dc/dce110/Makefile +index c54bf03..98d956e 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dce110/Makefile +@@ -3,8 +3,7 @@ + # It provides the control and status of HW CRTC block. + + DCE110 = dce110_timing_generator.o \ +-dce110_compressor.o dce110_mem_input.o dce110_hw_sequencer.o \ +-dce110_resource.o \ ++dce110_compressor.o dce110_hw_sequencer.o dce110_resource.o \ + dce110_opp_regamma_v.o dce110_opp_csc_v.o dce110_timing_generator_v.o \ + dce110_mem_input_v.o dce110_opp_v.o dce110_transform_v.o + +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.c +deleted file mode 100644 +index 45e1a8d..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.c ++++ /dev/null +@@ -1,437 +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 +- * +- */ +-#include "dm_services.h" +- +-#include "dce/dce_11_0_d.h" +-#include "dce/dce_11_0_sh_mask.h" +-/* TODO: this needs to be looked at, used by Stella's workaround*/ +-#include "gmc/gmc_8_2_d.h" +-#include "gmc/gmc_8_2_sh_mask.h" +- +-#include "include/logger_interface.h" +- +-#include "dce110_mem_input.h" +- +-#define DCP_REG(reg) (reg + mem_input110->offsets.dcp) +-#define DMIF_REG(reg) (reg + mem_input110->offsets.dmif) +-#define PIPE_REG(reg) (reg + mem_input110->offsets.pipe) +- +-static void program_sec_addr( +- struct dce110_mem_input *mem_input110, +- PHYSICAL_ADDRESS_LOC address) +-{ +- uint32_t value = 0; +- uint32_t temp; +- +- /*high register MUST be programmed first*/ +- temp = address.high_part & +- GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_MASK; +- set_reg_field_value(value, temp, +- GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, +- GRPH_SECONDARY_SURFACE_ADDRESS_HIGH); +- dm_write_reg(mem_input110->base.ctx, +- DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH), value); +- +- value = 0; +- temp = address.low_part >> +- GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS__SHIFT; +- set_reg_field_value(value, temp, +- GRPH_SECONDARY_SURFACE_ADDRESS, +- GRPH_SECONDARY_SURFACE_ADDRESS); +- dm_write_reg(mem_input110->base.ctx, +- DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS), value); +-} +- +-static void program_pri_addr( +- struct dce110_mem_input *mem_input110, +- PHYSICAL_ADDRESS_LOC address) +-{ +- uint32_t value = 0; +- uint32_t temp; +- +- /*high register MUST be programmed first*/ +- temp = address.high_part & +- GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_MASK; +- set_reg_field_value(value, temp, +- GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, +- GRPH_PRIMARY_SURFACE_ADDRESS_HIGH); +- dm_write_reg(mem_input110->base.ctx, +- DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH), value); +- +- value = 0; +- temp = address.low_part >> +- GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS__SHIFT; +- set_reg_field_value(value, temp, +- GRPH_PRIMARY_SURFACE_ADDRESS, +- GRPH_PRIMARY_SURFACE_ADDRESS); +- dm_write_reg(mem_input110->base.ctx, +- DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS), value); +-} +- +-bool dce110_mem_input_is_flip_pending(struct mem_input *mem_input) +-{ +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); +- uint32_t value; +- +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_UPDATE)); +- +- if (get_reg_field_value(value, GRPH_UPDATE, +- GRPH_SURFACE_UPDATE_PENDING)) +- return true; +- +- mem_input->current_address = mem_input->request_address; +- return false; +-} +- +-bool dce110_mem_input_program_surface_flip_and_addr( +- struct mem_input *mem_input, +- const struct dc_plane_address *address, +- bool flip_immediate) +-{ +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); +- +- uint32_t value = 0; +- uint32_t value_old = 0; +- uint32_t lock_value = 0; +- +- lock_value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_UPDATE)); +- set_reg_field_value(lock_value, 1, GRPH_UPDATE, GRPH_UPDATE_LOCK); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_UPDATE), lock_value); +- +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_FLIP_CONTROL)); +- value_old = value; +- if (flip_immediate) { +- set_reg_field_value(value, 0, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_IMMEDIATE_EN); +- set_reg_field_value(value, 1, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_H_RETRACE_EN); +- } else { +- set_reg_field_value(value, 0, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_IMMEDIATE_EN); +- set_reg_field_value(value, 0, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_H_RETRACE_EN); +- } +- if (value != value_old) { +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_FLIP_CONTROL), value); +- } +- +- switch (address->type) { +- case PLN_ADDR_TYPE_GRAPHICS: +- if (address->grph.addr.quad_part == 0) +- break; +- program_pri_addr(mem_input110, address->grph.addr); +- break; +- case PLN_ADDR_TYPE_GRPH_STEREO: +- if (address->grph_stereo.left_addr.quad_part == 0 +- || address->grph_stereo.right_addr.quad_part == 0) +- break; +- program_pri_addr(mem_input110, address->grph_stereo.left_addr); +- program_sec_addr(mem_input110, address->grph_stereo.right_addr); +- break; +- default: +- /* not supported */ +- BREAK_TO_DEBUGGER(); +- break; +- } +- +- mem_input->request_address = *address; +- if (flip_immediate) +- mem_input->current_address = *address; +- +- lock_value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_UPDATE)); +- set_reg_field_value(lock_value, 0, GRPH_UPDATE, GRPH_UPDATE_LOCK); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_UPDATE), lock_value); +- +- return true; +-} +- +-static void program_urgency_watermark( +- const struct dc_context *ctx, +- const uint32_t offset, +- struct dce_watermarks marks_low, +- uint32_t total_dest_line_time_ns) +-{ +- /* register value */ +- uint32_t urgency_cntl = 0; +- uint32_t wm_mask_cntl = 0; +- +- uint32_t urgency_addr = offset + mmDPG_PIPE_URGENCY_CONTROL; +- uint32_t wm_addr = offset + mmDPG_WATERMARK_MASK_CONTROL; +- +- /*Write mask to enable reading/writing of watermark set A*/ +- wm_mask_cntl = dm_read_reg(ctx, wm_addr); +- set_reg_field_value(wm_mask_cntl, +- 1, +- DPG_WATERMARK_MASK_CONTROL, +- URGENCY_WATERMARK_MASK); +- dm_write_reg(ctx, wm_addr, wm_mask_cntl); +- +- urgency_cntl = dm_read_reg(ctx, urgency_addr); +- +- set_reg_field_value( +- urgency_cntl, +- marks_low.d_mark, +- DPG_PIPE_URGENCY_CONTROL, +- URGENCY_LOW_WATERMARK); +- +- set_reg_field_value( +- urgency_cntl, +- total_dest_line_time_ns, +- DPG_PIPE_URGENCY_CONTROL, +- URGENCY_HIGH_WATERMARK); +- dm_write_reg(ctx, urgency_addr, urgency_cntl); +- +- /*Write mask to enable reading/writing of watermark set B*/ +- wm_mask_cntl = dm_read_reg(ctx, wm_addr); +- set_reg_field_value(wm_mask_cntl, +- 2, +- DPG_WATERMARK_MASK_CONTROL, +- URGENCY_WATERMARK_MASK); +- dm_write_reg(ctx, wm_addr, wm_mask_cntl); +- +- urgency_cntl = dm_read_reg(ctx, urgency_addr); +- +- set_reg_field_value(urgency_cntl, +- marks_low.a_mark, +- DPG_PIPE_URGENCY_CONTROL, +- URGENCY_LOW_WATERMARK); +- +- set_reg_field_value(urgency_cntl, +- total_dest_line_time_ns, +- DPG_PIPE_URGENCY_CONTROL, +- URGENCY_HIGH_WATERMARK); +- dm_write_reg(ctx, urgency_addr, urgency_cntl); +-} +- +-static void program_stutter_watermark( +- const struct dc_context *ctx, +- const uint32_t offset, +- struct dce_watermarks marks) +-{ +- /* register value */ +- uint32_t stutter_cntl = 0; +- uint32_t wm_mask_cntl = 0; +- +- uint32_t stutter_addr = offset + mmDPG_PIPE_STUTTER_CONTROL; +- uint32_t wm_addr = offset + mmDPG_WATERMARK_MASK_CONTROL; +- +- /*Write mask to enable reading/writing of watermark set A*/ +- +- wm_mask_cntl = dm_read_reg(ctx, wm_addr); +- set_reg_field_value(wm_mask_cntl, +- 1, +- DPG_WATERMARK_MASK_CONTROL, +- STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK); +- dm_write_reg(ctx, wm_addr, wm_mask_cntl); +- +- stutter_cntl = dm_read_reg(ctx, stutter_addr); +- +- if (ctx->dc->debug.disable_stutter) { +- set_reg_field_value(stutter_cntl, +- 0, +- DPG_PIPE_STUTTER_CONTROL, +- STUTTER_ENABLE); +- } else { +- set_reg_field_value(stutter_cntl, +- 1, +- DPG_PIPE_STUTTER_CONTROL, +- STUTTER_ENABLE); +- } +- +- set_reg_field_value(stutter_cntl, +- 1, +- DPG_PIPE_STUTTER_CONTROL, +- STUTTER_IGNORE_FBC); +- +- /*Write watermark set A*/ +- set_reg_field_value(stutter_cntl, +- marks.d_mark, +- DPG_PIPE_STUTTER_CONTROL, +- STUTTER_EXIT_SELF_REFRESH_WATERMARK); +- dm_write_reg(ctx, stutter_addr, stutter_cntl); +- +- /*Write mask to enable reading/writing of watermark set B*/ +- wm_mask_cntl = dm_read_reg(ctx, wm_addr); +- set_reg_field_value(wm_mask_cntl, +- 2, +- DPG_WATERMARK_MASK_CONTROL, +- STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK); +- dm_write_reg(ctx, wm_addr, wm_mask_cntl); +- +- stutter_cntl = dm_read_reg(ctx, stutter_addr); +- +- /*Write watermark set B*/ +- set_reg_field_value(stutter_cntl, +- marks.a_mark, +- DPG_PIPE_STUTTER_CONTROL, +- STUTTER_EXIT_SELF_REFRESH_WATERMARK); +- dm_write_reg(ctx, stutter_addr, stutter_cntl); +-} +- +-static void program_nbp_watermark( +- const struct dc_context *ctx, +- const uint32_t offset, +- struct dce_watermarks marks) +-{ +- uint32_t value; +- uint32_t addr; +- /* Write mask to enable reading/writing of watermark set A */ +- addr = offset + mmDPG_WATERMARK_MASK_CONTROL; +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- 1, +- DPG_WATERMARK_MASK_CONTROL, +- NB_PSTATE_CHANGE_WATERMARK_MASK); +- dm_write_reg(ctx, addr, value); +- +- addr = offset + mmDPG_PIPE_NB_PSTATE_CHANGE_CONTROL; +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_ENABLE); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_URGENT_DURING_REQUEST); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST); +- dm_write_reg(ctx, addr, value); +- +- /* Write watermark set A */ +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- marks.d_mark, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_WATERMARK); +- dm_write_reg(ctx, addr, value); +- +- /* Write mask to enable reading/writing of watermark set B */ +- addr = offset + mmDPG_WATERMARK_MASK_CONTROL; +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- 2, +- DPG_WATERMARK_MASK_CONTROL, +- NB_PSTATE_CHANGE_WATERMARK_MASK); +- dm_write_reg(ctx, addr, value); +- +- addr = offset + mmDPG_PIPE_NB_PSTATE_CHANGE_CONTROL; +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_ENABLE); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_URGENT_DURING_REQUEST); +- set_reg_field_value( +- value, +- 1, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST); +- dm_write_reg(ctx, addr, value); +- +- /* Write watermark set B */ +- value = dm_read_reg(ctx, addr); +- set_reg_field_value( +- value, +- marks.a_mark, +- DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, +- NB_PSTATE_CHANGE_WATERMARK); +- dm_write_reg(ctx, addr, value); +-} +- +-void dce110_mem_input_program_display_marks( +- struct mem_input *mem_input, +- struct dce_watermarks nbp, +- struct dce_watermarks stutter, +- struct dce_watermarks urgent, +- uint32_t total_dest_line_time_ns) +-{ +- struct dce110_mem_input *bm_dce110 = TO_DCE110_MEM_INPUT(mem_input); +- +- program_urgency_watermark( +- mem_input->ctx, +- bm_dce110->offsets.dmif, +- urgent, +- total_dest_line_time_ns); +- +- program_nbp_watermark( +- mem_input->ctx, +- bm_dce110->offsets.dmif, +- nbp); +- +- program_stutter_watermark( +- mem_input->ctx, +- bm_dce110->offsets.dmif, +- stutter); +-} +- +-static struct mem_input_funcs dce110_mem_input_funcs = { +- .mem_input_program_display_marks = +- dce110_mem_input_program_display_marks, +- .allocate_mem_input = dce_mem_input_allocate_dmif, +- .free_mem_input = dce_mem_input_free_dmif, +- .mem_input_program_surface_flip_and_addr = +- dce110_mem_input_program_surface_flip_and_addr, +- .mem_input_program_pte_vm = +- dce_mem_input_program_pte_vm, +- .mem_input_program_surface_config = +- dce_mem_input_program_surface_config, +- .mem_input_is_flip_pending = +- dce110_mem_input_is_flip_pending, +- .mem_input_update_dchub = NULL +-}; +-/*****************************************/ +-/* Constructor, Destructor */ +-/*****************************************/ +- +-bool dce110_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets) +-{ +- /* supported stutter method +- * STUTTER_MODE_ENHANCED +- * STUTTER_MODE_QUAD_DMIF_BUFFER +- * STUTTER_MODE_WATERMARK_NBP_STATE +- */ +- mem_input110->base.funcs = &dce110_mem_input_funcs; +- mem_input110->base.ctx = ctx; +- +- mem_input110->base.inst = inst; +- +- mem_input110->offsets = *offsets; +- +- return true; +-} +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.h +deleted file mode 100644 +index 5f10f26..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input.h ++++ /dev/null +@@ -1,121 +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 __DC_MEM_INPUT_DCE110_H__ +-#define __DC_MEM_INPUT_DCE110_H__ +- +-#include "mem_input.h" +- +-#define TO_DCE110_MEM_INPUT(mi)\ +- container_of(mi, struct dce110_mem_input, base) +- +-struct dce110_mem_input_reg_offsets { +- uint32_t dcp; +- uint32_t dmif; +- uint32_t pipe; +-}; +- +-struct dce110_mem_input { +- struct mem_input base; +- struct dce110_mem_input_reg_offsets offsets; +-}; +- +-bool dce110_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets); +- +-/* +- * dce110_mem_input_program_display_marks +- * +- * This function will program nbp stutter and urgency watermarks to minimum +- * allowable values +- */ +-void dce110_mem_input_program_display_marks( +- struct mem_input *mem_input, +- struct dce_watermarks nbp, +- struct dce_watermarks stutter, +- struct dce_watermarks urgent, +- uint32_t total_dest_line_time_ns); +- +-/* +- * dce110_allocate_mem_input +- * +- * This function will allocate a dmif buffer and program required +- * pixel duration for pipe +- */ +-void dce110_allocate_mem_input( +- struct mem_input *mem_input, +- uint32_t h_total,/* for current stream */ +- uint32_t v_total,/* for current stream */ +- uint32_t pix_clk_khz,/* for current stream */ +- uint32_t total_stream_num); +- +-/* +- * dce110_free_mem_input +- * +- * This function will deallocate a dmif buffer from pipe +- */ +-void dce110_free_mem_input( +- struct mem_input *mem_input, +- uint32_t total_stream_num); +- +-/* +- * dce110_mem_input_program_surface_flip_and_addr +- * +- * This function programs hsync/vsync mode and surface address +- */ +-bool dce110_mem_input_program_surface_flip_and_addr( +- struct mem_input *mem_input, +- const struct dc_plane_address *address, +- bool flip_immediate); +- +-/* +- * dce110_mem_input_program_surface_config +- * +- * This function will program surface tiling, size, rotation and pixel format +- * to corresponding dcp registers. +- */ +-bool dce110_mem_input_program_surface_config( +- struct mem_input *mem_input, +- enum surface_pixel_format format, +- union dc_tiling_info *tiling_info, +- union plane_size *plane_size, +- enum dc_rotation_angle rotation, +- struct dc_plane_dcc_param *dcc, +- bool horizontal_mirror, +- bool visible); +- +-/* +- * dce110_mem_input_is_flip_pending +- * +- * This function will wait until the surface update-pending bit is cleared. +- * This is necessary when a flip immediate call is requested as we shouldn't +- * return until the flip has actually occurred. +- */ +-bool dce110_mem_input_is_flip_pending( +- struct mem_input *mem_input); +- +-#endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c +index 78dd3ae..9777a4d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c +@@ -33,29 +33,17 @@ + #include "include/logger_interface.h" + #include "inc/dce_calcs.h" + +-#include "dce110_mem_input.h" +- +-#define DCP_REG(reg) (reg + mem_input110->offsets.dcp) +-/*#define DMIF_REG(reg) (reg + mem_input110->offsets.dmif)*/ +-/*#define PIPE_REG(reg) (reg + mem_input110->offsets.pipe)*/ +- +-static const struct dce110_mem_input_reg_offsets dce110_mi_v_reg_offsets[] = { +- { +- .dcp = 0, +- .dmif = 0, +- .pipe = 0, +- } +-}; ++#include "dce/dce_mem_input.h" + + static void set_flip_control( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + bool immediate) + { + uint32_t value = 0; + + value = dm_read_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_FLIP_CONTROL)); ++ mmUNP_FLIP_CONTROL); + + set_reg_field_value(value, 1, + UNP_FLIP_CONTROL, +@@ -63,13 +51,13 @@ static void set_flip_control( + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_FLIP_CONTROL), ++ mmUNP_FLIP_CONTROL, + value); + } + + /* chroma part */ + static void program_pri_addr_c( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + PHYSICAL_ADDRESS_LOC address) + { + uint32_t value = 0; +@@ -84,7 +72,7 @@ UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C_MAS + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C), ++ mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C, + value); + + temp = 0; +@@ -98,13 +86,13 @@ UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C_MAS + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_C), ++ mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_C, + value); + } + + /* luma part */ + static void program_pri_addr_l( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + PHYSICAL_ADDRESS_LOC address) + { + uint32_t value = 0; +@@ -120,7 +108,7 @@ UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L_MAS + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L), ++ mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L, + value); + + temp = 0; +@@ -134,12 +122,12 @@ UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L_MAS + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_L), ++ mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_L, + value); + } + + static void program_addr( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + const struct dc_plane_address *addr) + { + switch (addr->type) { +@@ -162,19 +150,19 @@ static void program_addr( + } + } + +-static void enable(struct dce110_mem_input *mem_input110) ++static void enable(struct dce_mem_input *mem_input110) + { + uint32_t value = 0; + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_GRPH_ENABLE)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_GRPH_ENABLE); + set_reg_field_value(value, 1, UNP_GRPH_ENABLE, GRPH_ENABLE); + dm_write_reg(mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_ENABLE), ++ mmUNP_GRPH_ENABLE, + value); + } + + static void program_tiling( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + const union dc_tiling_info *info, + const enum surface_pixel_format pixel_format) + { +@@ -239,7 +227,7 @@ static void program_tiling( + } + + static void program_size_and_rotation( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + enum dc_rotation_angle rotation, + const union plane_size *plane_size) + { +@@ -277,7 +265,7 @@ static void program_size_and_rotation( + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PITCH_L), ++ mmUNP_GRPH_PITCH_L, + value); + + value = 0; +@@ -285,7 +273,7 @@ static void program_size_and_rotation( + UNP_GRPH_PITCH_C, GRPH_PITCH_C); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_PITCH_C), ++ mmUNP_GRPH_PITCH_C, + value); + + value = 0; +@@ -293,7 +281,7 @@ static void program_size_and_rotation( + UNP_GRPH_X_START_L, GRPH_X_START_L); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_X_START_L), ++ mmUNP_GRPH_X_START_L, + value); + + value = 0; +@@ -301,7 +289,7 @@ static void program_size_and_rotation( + UNP_GRPH_X_START_C, GRPH_X_START_C); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_X_START_C), ++ mmUNP_GRPH_X_START_C, + value); + + value = 0; +@@ -309,7 +297,7 @@ static void program_size_and_rotation( + UNP_GRPH_Y_START_L, GRPH_Y_START_L); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_Y_START_L), ++ mmUNP_GRPH_Y_START_L, + value); + + value = 0; +@@ -317,7 +305,7 @@ static void program_size_and_rotation( + UNP_GRPH_Y_START_C, GRPH_Y_START_C); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_Y_START_C), ++ mmUNP_GRPH_Y_START_C, + value); + + value = 0; +@@ -326,7 +314,7 @@ static void program_size_and_rotation( + UNP_GRPH_X_END_L, GRPH_X_END_L); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_X_END_L), ++ mmUNP_GRPH_X_END_L, + value); + + value = 0; +@@ -335,7 +323,7 @@ static void program_size_and_rotation( + UNP_GRPH_X_END_C, GRPH_X_END_C); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_X_END_C), ++ mmUNP_GRPH_X_END_C, + value); + + value = 0; +@@ -344,7 +332,7 @@ static void program_size_and_rotation( + UNP_GRPH_Y_END_L, GRPH_Y_END_L); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_Y_END_L), ++ mmUNP_GRPH_Y_END_L, + value); + + value = 0; +@@ -353,7 +341,7 @@ static void program_size_and_rotation( + UNP_GRPH_Y_END_C, GRPH_Y_END_C); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_Y_END_C), ++ mmUNP_GRPH_Y_END_C, + value); + + value = 0; +@@ -378,12 +366,12 @@ static void program_size_and_rotation( + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_HW_ROTATION), ++ mmUNP_HW_ROTATION, + value); + } + + static void program_pixel_format( +- struct dce110_mem_input *mem_input110, ++ struct dce_mem_input *mem_input110, + enum surface_pixel_format format) + { + if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) { +@@ -393,7 +381,7 @@ static void program_pixel_format( + + value = dm_read_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL)); ++ mmUNP_GRPH_CONTROL); + + switch (format) { + case SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS: +@@ -440,12 +428,12 @@ static void program_pixel_format( + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL), ++ mmUNP_GRPH_CONTROL, + value); + + value = dm_read_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL_EXP)); ++ mmUNP_GRPH_CONTROL_EXP); + + /* VIDEO FORMAT 0 */ + set_reg_field_value( +@@ -455,7 +443,7 @@ static void program_pixel_format( + VIDEO_FORMAT); + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL_EXP), ++ mmUNP_GRPH_CONTROL_EXP, + value); + + } else { +@@ -465,7 +453,7 @@ static void program_pixel_format( + + value = dm_read_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL_EXP)); ++ mmUNP_GRPH_CONTROL_EXP); + + switch (format) { + case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: +@@ -487,17 +475,17 @@ static void program_pixel_format( + + dm_write_reg( + mem_input110->base.ctx, +- DCP_REG(mmUNP_GRPH_CONTROL_EXP), ++ mmUNP_GRPH_CONTROL_EXP, + value); + } + } + +-bool dce110_mem_input_v_is_surface_pending(struct mem_input *mem_input) ++bool dce_mem_input_v_is_surface_pending(struct mem_input *mem_input) + { +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); ++ struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input); + uint32_t value; + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_GRPH_UPDATE)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_GRPH_UPDATE); + + if (get_reg_field_value(value, UNP_GRPH_UPDATE, + GRPH_SURFACE_UPDATE_PENDING)) +@@ -507,12 +495,12 @@ bool dce110_mem_input_v_is_surface_pending(struct mem_input *mem_input) + return false; + } + +-bool dce110_mem_input_v_program_surface_flip_and_addr( ++bool dce_mem_input_v_program_surface_flip_and_addr( + struct mem_input *mem_input, + const struct dc_plane_address *address, + bool flip_immediate) + { +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); ++ struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input); + + set_flip_control(mem_input110, flip_immediate); + program_addr(mem_input110, +@@ -584,13 +572,13 @@ static const unsigned int *get_dvmm_hw_setting( + } + } + +-void dce110_mem_input_v_program_pte_vm( ++void dce_mem_input_v_program_pte_vm( + struct mem_input *mem_input, + enum surface_pixel_format format, + union dc_tiling_info *tiling_info, + enum dc_rotation_angle rotation) + { +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); ++ struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input); + const unsigned int *pte = get_dvmm_hw_setting(tiling_info, format, false); + const unsigned int *pte_chroma = get_dvmm_hw_setting(tiling_info, format, true); + +@@ -628,36 +616,36 @@ void dce110_mem_input_v_program_pte_vm( + break; + } + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT); + /* TODO: un-hardcode requestlimit */ + set_reg_field_value(value, 0xff, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_L); + set_reg_field_value(value, 0xff, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_C); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT), value); ++ dm_write_reg(mem_input110->base.ctx, mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT, value); + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_CONTROL)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL); + set_reg_field_value(value, page_width, UNP_DVMM_PTE_CONTROL, DVMM_PAGE_WIDTH); + set_reg_field_value(value, page_height, UNP_DVMM_PTE_CONTROL, DVMM_PAGE_HEIGHT); + set_reg_field_value(value, min_pte_before_flip, UNP_DVMM_PTE_CONTROL, DVMM_MIN_PTE_BEFORE_FLIP); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_CONTROL), value); ++ dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL, value); + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_ARB_CONTROL)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL); + set_reg_field_value(value, pte[5], UNP_DVMM_PTE_ARB_CONTROL, DVMM_PTE_REQ_PER_CHUNK); + set_reg_field_value(value, 0xff, UNP_DVMM_PTE_ARB_CONTROL, DVMM_MAX_PTE_REQ_OUTSTANDING); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_ARB_CONTROL), value); ++ dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL, value); + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_CONTROL_C)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL_C); + set_reg_field_value(value, page_width_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_PAGE_WIDTH_C); + set_reg_field_value(value, page_height_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_PAGE_HEIGHT_C); + set_reg_field_value(value, min_pte_before_flip_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_MIN_PTE_BEFORE_FLIP_C); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_CONTROL_C), value); ++ dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL_C, value); + +- value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_ARB_CONTROL_C)); ++ value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL_C); + set_reg_field_value(value, pte_chroma[5], UNP_DVMM_PTE_ARB_CONTROL_C, DVMM_PTE_REQ_PER_CHUNK_C); + set_reg_field_value(value, 0xff, UNP_DVMM_PTE_ARB_CONTROL_C, DVMM_MAX_PTE_REQ_OUTSTANDING_C); +- dm_write_reg(mem_input110->base.ctx, DCP_REG(mmUNP_DVMM_PTE_ARB_CONTROL_C), value); ++ dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL_C, value); + } + +-void dce110_mem_input_v_program_surface_config( ++void dce_mem_input_v_program_surface_config( + struct mem_input *mem_input, + enum surface_pixel_format format, + union dc_tiling_info *tiling_info, +@@ -666,7 +654,7 @@ void dce110_mem_input_v_program_surface_config( + struct dc_plane_dcc_param *dcc, + bool horizotal_mirror) + { +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); ++ struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input); + + enable(mem_input110); + program_tiling(mem_input110, tiling_info, format); +@@ -943,7 +931,7 @@ static void program_nbp_watermark_c( + marks); + } + +-void dce110_mem_input_v_program_display_marks( ++void dce_mem_input_v_program_display_marks( + struct mem_input *mem_input, + struct dce_watermarks nbp, + struct dce_watermarks stutter, +@@ -965,7 +953,7 @@ void dce110_mem_input_v_program_display_marks( + + } + +-void dce110_mem_input_program_chroma_display_marks( ++void dce_mem_input_program_chroma_display_marks( + struct mem_input *mem_input, + struct dce_watermarks nbp, + struct dce_watermarks stutter, +@@ -1036,42 +1024,29 @@ void dce110_free_mem_input_v( + + static struct mem_input_funcs dce110_mem_input_v_funcs = { + .mem_input_program_display_marks = +- dce110_mem_input_v_program_display_marks, ++ dce_mem_input_v_program_display_marks, + .mem_input_program_chroma_display_marks = +- dce110_mem_input_program_chroma_display_marks, ++ dce_mem_input_program_chroma_display_marks, + .allocate_mem_input = dce110_allocate_mem_input_v, + .free_mem_input = dce110_free_mem_input_v, + .mem_input_program_surface_flip_and_addr = +- dce110_mem_input_v_program_surface_flip_and_addr, ++ dce_mem_input_v_program_surface_flip_and_addr, + .mem_input_program_pte_vm = +- dce110_mem_input_v_program_pte_vm, ++ dce_mem_input_v_program_pte_vm, + .mem_input_program_surface_config = +- dce110_mem_input_v_program_surface_config, ++ dce_mem_input_v_program_surface_config, + .mem_input_is_flip_pending = +- dce110_mem_input_v_is_surface_pending ++ dce_mem_input_v_is_surface_pending + }; + /*****************************************/ + /* Constructor, Destructor */ + /*****************************************/ + +-bool dce110_mem_input_v_construct( +- struct dce110_mem_input *mem_input110, ++void dce110_mem_input_v_construct( ++ struct dce_mem_input *dce_mi, + struct dc_context *ctx) + { +- mem_input110->base.funcs = &dce110_mem_input_v_funcs; +- mem_input110->base.ctx = ctx; +- +- mem_input110->base.inst = 0; +- +- mem_input110->offsets = dce110_mi_v_reg_offsets[0]; +- +- return true; ++ dce_mi->base.funcs = &dce110_mem_input_v_funcs; ++ dce_mi->base.ctx = ctx; + } + +-#if 0 +-void dce110_mem_input_v_destroy(struct mem_input **mem_input) +-{ +- dm_free(TO_DCE110_MEM_INPUT(*mem_input)); +- *mem_input = NULL; +-} +-#endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.h +index b2667ee..f01d4a6 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.h ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.h +@@ -26,70 +26,10 @@ + #define __DC_MEM_INPUT_V_DCE110_H__ + + #include "mem_input.h" +-#include "dce110_mem_input.h" ++#include "dce/dce_mem_input.h" + +-bool dce110_mem_input_v_construct( +- struct dce110_mem_input *mem_input110, ++void dce110_mem_input_v_construct( ++ struct dce_mem_input *dce_mi, + struct dc_context *ctx); + +-/* +- * This function will program nbp stutter and urgency watermarks to minimum +- * allowable values +- */ +-void dce110_mem_input_v_program_display_marks( +- struct mem_input *mem_input, +- struct dce_watermarks nbp, +- struct dce_watermarks stutter, +- struct dce_watermarks urgent, +- uint32_t total_dest_line_time_ns); +- +-/* +- * This function will allocate a dmif buffer and program required +- * pixel duration for pipe +- */ +-void dce110_allocate_mem_v_input( +- struct mem_input *mem_input, +- uint32_t h_total,/* for current stream */ +- uint32_t v_total,/* for current stream */ +- uint32_t pix_clk_khz,/* for current stream */ +- uint32_t total_stream_num); +- +-/* +- * This function will deallocate a dmif buffer from pipe +- */ +-void dce110_free_mem_v_input( +- struct mem_input *mem_input, +- uint32_t total_stream_num); +- +-/* +- * This function programs hsync/vsync mode and surface address +- */ +-bool dce110_mem_input_v_program_surface_flip_and_addr( +- struct mem_input *mem_input, +- const struct dc_plane_address *address, +- bool flip_immediate); +- +-/* +- * dce110_mem_input_v_program_scatter_gather +- * +- * This function will program scatter gather registers. +- */ +-bool dce110_mem_input_v_program_pte_vm( +- struct mem_input *mem_input, +- enum surface_pixel_format format, +- union dc_tiling_info *tiling_info, +- enum dc_rotation_angle rotation); +- +-/* +- * This function will program surface tiling, size, rotation and pixel format +- * to corresponding dcp registers. +- */ +-bool dce110_mem_input_v_program_surface_config( +- struct mem_input *mem_input, +- enum surface_pixel_format format, +- union dc_tiling_info *tiling_info, +- union plane_size *plane_size, +- enum dc_rotation_angle rotation, +- bool visible); +- + #endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +index 041d119..3ed5b94 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +@@ -38,7 +38,7 @@ + #include "dce110/dce110_timing_generator_v.h" + #include "dce/dce_link_encoder.h" + #include "dce/dce_stream_encoder.h" +-#include "dce110/dce110_mem_input.h" ++#include "dce/dce_mem_input.h" + #include "dce110/dce110_mem_input_v.h" + #include "dce/dce_ipp.h" + #include "dce/dce_transform.h" +@@ -133,30 +133,6 @@ static const struct dce110_timing_generator_offsets dce110_tg_offsets[] = { + } + }; + +-static const struct dce110_mem_input_reg_offsets dce110_mi_reg_offsets[] = { +- { +- .dcp = (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE0_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE1_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE2_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- } +-}; +- + /* set register offset */ + #define SR(reg_name)\ + .reg_name = mm ## reg_name +@@ -520,30 +496,21 @@ static const struct dce_mem_input_mask mi_masks = { + .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK + }; + ++ + static struct mem_input *dce110_mem_input_create( + struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offset) ++ uint32_t inst) + { +- struct dce110_mem_input *mem_input110 = +- dm_alloc(sizeof(struct dce110_mem_input)); ++ struct dce_mem_input *dce_mi = dm_alloc(sizeof(struct dce_mem_input)); + +- if (!mem_input110) ++ if (!dce_mi) { ++ BREAK_TO_DEBUGGER(); + return NULL; +- +- if (dce110_mem_input_construct(mem_input110, ctx, inst, offset)) { +- struct mem_input *mi = &mem_input110->base; +- +- mi->regs = &mi_regs[inst]; +- mi->shifts = &mi_shifts; +- mi->masks = &mi_masks; +- mi->wa.single_head_rdreq_dmif_limit = 3; +- return mi; + } + +- BREAK_TO_DEBUGGER(); +- dm_free(mem_input110); +- return NULL; ++ dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks); ++ dce_mi->wa.single_head_rdreq_dmif_limit = 3; ++ return &dce_mi->base; + } + + static void dce110_transform_destroy(struct transform **xfm) +@@ -698,7 +665,7 @@ static void destruct(struct dce110_resource_pool *pool) + dce_ipp_destroy(&pool->base.ipps[i]); + + if (pool->base.mis[i] != NULL) { +- dm_free(TO_DCE110_MEM_INPUT(pool->base.mis[i])); ++ dm_free(TO_DCE_MEM_INPUT(pool->base.mis[i])); + pool->base.mis[i] = NULL; + } + +@@ -1132,7 +1099,7 @@ static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool) + { + struct dce110_timing_generator *dce110_tgv = dm_alloc(sizeof (*dce110_tgv)); + struct dce_transform *dce110_xfmv = dm_alloc(sizeof (*dce110_xfmv)); +- struct dce110_mem_input *dce110_miv = dm_alloc(sizeof (*dce110_miv)); ++ struct dce_mem_input *dce110_miv = dm_alloc(sizeof (*dce110_miv)); + struct dce110_opp *dce110_oppv = dm_alloc(sizeof (*dce110_oppv)); + + if ((dce110_tgv == NULL) || +@@ -1345,8 +1312,7 @@ static bool construct( + goto res_create_fail; + } + +- pool->base.mis[i] = dce110_mem_input_create(ctx, i, +- &dce110_mi_reg_offsets[i]); ++ pool->base.mis[i] = dce110_mem_input_create(ctx, i); + if (pool->base.mis[i] == NULL) { + BREAK_TO_DEBUGGER(); + dm_error( +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/Makefile b/drivers/gpu/drm/amd/display/dc/dce112/Makefile +index 2d536fbc..265ac43 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce112/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dce112/Makefile +@@ -3,7 +3,7 @@ + # It provides the control and status of HW CRTC block. + + DCE112 = dce112_compressor.o dce112_hw_sequencer.o \ +-dce112_resource.o dce112_mem_input.o ++dce112_resource.o + + AMD_DAL_DCE112 = $(addprefix $(AMDDALPATH)/dc/dce112/,$(DCE112)) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.c +deleted file mode 100644 +index c29007d..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.c ++++ /dev/null +@@ -1,54 +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 +- * +- */ +-#include "dm_services.h" +-#include "dce112_mem_input.h" +- +- +-#include "dce/dce_11_2_d.h" +-#include "dce/dce_11_2_sh_mask.h" +- +- +-#define DCP_REG(reg) (reg + mem_input110->offsets.dcp) +-#define DMIF_REG(reg) (reg + mem_input110->offsets.dmif) +-#define PIPE_REG(reg) (reg + mem_input110->offsets.pipe) +- +-/*****************************************/ +-/* Constructor, Destructor */ +-/*****************************************/ +- +-bool dce112_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets) +-{ +- if (!dce110_mem_input_construct(mem_input110, ctx, inst, offsets)) +- return false; +- +- mem_input110->base.funcs->mem_input_program_display_marks = +- dce_mem_input_program_display_marks; +- +- return true; +-} +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.h +deleted file mode 100644 +index de2aaf0..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_mem_input.h ++++ /dev/null +@@ -1,38 +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 __DC_MEM_INPUT_DCE112_H__ +-#define __DC_MEM_INPUT_DCE112_H__ +- +-#include "mem_input.h" +-#include "dce110/dce110_mem_input.h" +- +-bool dce112_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets); +- +- +-#endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +index 0ed2616..f405d6e 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +@@ -32,9 +32,10 @@ + #include "include/irq_service_interface.h" + #include "dce110/dce110_resource.h" + #include "dce110/dce110_timing_generator.h" +-#include "dce112/dce112_mem_input.h" + + #include "irq/dce110/irq_service_dce110.h" ++ ++#include "dce/dce_mem_input.h" + #include "dce/dce_transform.h" + #include "dce/dce_link_encoder.h" + #include "dce/dce_stream_encoder.h" +@@ -132,51 +133,6 @@ static const struct dce110_timing_generator_offsets dce112_tg_offsets[] = { + } + }; + +-static const struct dce110_mem_input_reg_offsets dce112_mi_reg_offsets[] = { +- { +- .dcp = (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE0_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE1_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE2_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE3_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE4_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE5_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- } +-}; +- + /* set register offset */ + #define SR(reg_name)\ + .reg_name = mm ## reg_name +@@ -541,27 +497,17 @@ static const struct dce_mem_input_mask mi_masks = { + + static struct mem_input *dce112_mem_input_create( + struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offset) ++ uint32_t inst) + { +- struct dce110_mem_input *mem_input110 = +- dm_alloc(sizeof(struct dce110_mem_input)); ++ struct dce_mem_input *dce_mi = dm_alloc(sizeof(struct dce_mem_input)); + +- if (!mem_input110) ++ if (!dce_mi) { ++ BREAK_TO_DEBUGGER(); + return NULL; +- +- if (dce112_mem_input_construct(mem_input110, ctx, inst, offset)) { +- struct mem_input *mi = &mem_input110->base; +- +- mi->regs = &mi_regs[inst]; +- mi->shifts = &mi_shifts; +- mi->masks = &mi_masks; +- return mi; + } + +- BREAK_TO_DEBUGGER(); +- dm_free(mem_input110); +- return NULL; ++ dce112_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks); ++ return &dce_mi->base; + } + + static void dce112_transform_destroy(struct transform **xfm) +@@ -705,7 +651,7 @@ static void destruct(struct dce110_resource_pool *pool) + dce_ipp_destroy(&pool->base.ipps[i]); + + if (pool->base.mis[i] != NULL) { +- dm_free(TO_DCE110_MEM_INPUT(pool->base.mis[i])); ++ dm_free(TO_DCE_MEM_INPUT(pool->base.mis[i])); + pool->base.mis[i] = NULL; + } + +@@ -1347,10 +1293,7 @@ static bool construct( + goto res_create_fail; + } + +- pool->base.mis[i] = dce112_mem_input_create( +- ctx, +- i, +- &dce112_mi_reg_offsets[i]); ++ pool->base.mis[i] = dce112_mem_input_create(ctx, i); + if (pool->base.mis[i] == NULL) { + BREAK_TO_DEBUGGER(); + dm_error( +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/Makefile b/drivers/gpu/drm/amd/display/dc/dce120/Makefile +index 826c12e..1779b96 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce120/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dce120/Makefile +@@ -4,7 +4,7 @@ + + + DCE120 = dce120_resource.o dce120_timing_generator.o \ +-dce120_mem_input.o dce120_hw_sequencer.o ++dce120_hw_sequencer.o + + AMD_DAL_DCE120 = $(addprefix $(AMDDALPATH)/dc/dce120/,$(DCE120)) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.c +deleted file mode 100644 +index c067721..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.c ++++ /dev/null +@@ -1,340 +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 +- * +- */ +-#include "dm_services.h" +-#include "dce120_mem_input.h" +- +- +-#include "vega10/DC/dce_12_0_offset.h" +-#include "vega10/DC/dce_12_0_sh_mask.h" +-#include "vega10/soc15ip.h" +- +-#define GENERAL_REG_UPDATE_N(reg_name, n, ...) \ +- generic_reg_update_soc15(mem_input110->base.ctx, 0, reg_name, n, __VA_ARGS__) +- +-#define GENERAL_REG_UPDATE(reg, field, val) \ +- GENERAL_REG_UPDATE_N(reg, 1, FD(reg##__##field), val) +- +-#define GENERAL_REG_UPDATE_2(reg, field1, val1, field2, val2) \ +- GENERAL_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +- +- +-#define DCP_REG_UPDATE_N(reg_name, n, ...) \ +- generic_reg_update_soc15(mem_input110->base.ctx, mem_input110->offsets.dcp, reg_name, n, __VA_ARGS__) +- +-#define DCP_REG_SET_N(reg_name, n, ...) \ +- generic_reg_set_soc15(mem_input110->base.ctx, mem_input110->offsets.dcp, reg_name, n, __VA_ARGS__) +- +-#define DCP_REG_UPDATE(reg, field, val) \ +- DCP_REG_UPDATE_N(reg, 1, FD(reg##__##field), val) +- +-#define DCP_REG_UPDATE_2(reg, field1, val1, field2, val2) \ +- DCP_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define DCP_REG_UPDATE_3(reg, field1, val1, field2, val2, field3, val3) \ +- DCP_REG_UPDATE_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +-#define DCP_REG_SET(reg, field, val) \ +- DCP_REG_SET_N(reg, 1, FD(reg##__##field), val) +- +-#define DCP_REG_SET_2(reg, field1, val1, field2, val2) \ +- DCP_REG_SET_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define DCP_REG_SET_3(reg, field1, val1, field2, val2, field3, val3) \ +- DCP_REG_SET_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +- +- +-#define DMIF_REG_UPDATE_N(reg_name, n, ...) \ +- generic_reg_update_soc15(mem_input110->base.ctx, mem_input110->offsets.dmif, reg_name, n, __VA_ARGS__) +- +-#define DMIF_REG_SET_N(reg_name, n, ...) \ +- generic_reg_set_soc15(mem_input110->base.ctx, mem_input110->offsets.dmif, reg_name, n, __VA_ARGS__) +- +-#define DMIF_REG_UPDATE(reg, field, val) \ +- DMIF_REG_UPDATE_N(reg, 1, FD(reg##__##field), val) +- +-#define DMIF_REG_UPDATE_2(reg, field1, val1, field2, val2) \ +- DMIF_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define DMIF_REG_UPDATE_3(reg, field1, val1, field2, val2, field3, val3) \ +- DMIF_REG_UPDATE_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +-#define DMIF_REG_SET(reg, field, val) \ +- DMIF_REG_SET_N(reg, 1, FD(reg##__##field), val) +- +-#define DMIF_REG_SET_2(reg, field1, val1, field2, val2) \ +- DMIF_REG_SET_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define DMIF_REG_SET_3(reg, field1, val1, field2, val2, field3, val3) \ +- DMIF_REG_SET_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +- +- +-#define PIPE_REG_UPDATE_N(reg_name, n, ...) \ +- generic_reg_update_soc15(mem_input110->base.ctx, mem_input110->offsets.pipe, reg_name, n, __VA_ARGS__) +- +-#define PIPE_REG_SET_N(reg_name, n, ...) \ +- generic_reg_set_soc15(mem_input110->base.ctx, mem_input110->offsets.pipe, reg_name, n, __VA_ARGS__) +- +-#define PIPE_REG_UPDATE(reg, field, val) \ +- PIPE_REG_UPDATE_N(reg, 1, FD(reg##__##field), val) +- +-#define PIPE_REG_UPDATE_2(reg, field1, val1, field2, val2) \ +- PIPE_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define PIPE_REG_UPDATE_3(reg, field1, val1, field2, val2, field3, val3) \ +- PIPE_REG_UPDATE_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +-#define PIPE_REG_SET(reg, field, val) \ +- PIPE_REG_SET_N(reg, 1, FD(reg##__##field), val) +- +-#define PIPE_REG_SET_2(reg, field1, val1, field2, val2) \ +- PIPE_REG_SET_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) +- +-#define PIPE_REG_SET_3(reg, field1, val1, field2, val2, field3, val3) \ +- PIPE_REG_SET_N(reg, 3, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) +- +- +- +-static void program_sec_addr( +- struct dce110_mem_input *mem_input110, +- PHYSICAL_ADDRESS_LOC address) +-{ +- uint32_t temp; +- +- /*high register MUST be programmed first*/ +- temp = address.high_part & +- DCP0_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_MASK; +- +- DCP_REG_SET( +- DCP0_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, +- GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, +- temp); +- +- temp = address.low_part >> +- DCP0_GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS__SHIFT; +- +- DCP_REG_SET_2( +- DCP0_GRPH_SECONDARY_SURFACE_ADDRESS, +- GRPH_SECONDARY_SURFACE_ADDRESS, temp, +- GRPH_SECONDARY_DFQ_ENABLE, 0); +-} +- +-static void program_pri_addr( +- struct dce110_mem_input *mem_input110, +- PHYSICAL_ADDRESS_LOC address) +-{ +- uint32_t temp; +- +- /*high register MUST be programmed first*/ +- temp = address.high_part & +- DCP0_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_MASK; +- +- DCP_REG_SET( +- DCP0_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, +- GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, +- temp); +- +- temp = address.low_part >> +- DCP0_GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS__SHIFT; +- +- DCP_REG_SET( +- DCP0_GRPH_PRIMARY_SURFACE_ADDRESS, +- GRPH_PRIMARY_SURFACE_ADDRESS, +- temp); +-} +- +- +-static bool mem_input_is_flip_pending(struct mem_input *mem_input) +-{ +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); +- uint32_t value; +- +- value = dm_read_reg_soc15(mem_input110->base.ctx, +- mmDCP0_GRPH_UPDATE, mem_input110->offsets.dcp); +- +- if (get_reg_field_value(value, DCP0_GRPH_UPDATE, +- GRPH_SURFACE_UPDATE_PENDING)) +- return true; +- +- mem_input->current_address = mem_input->request_address; +- return false; +-} +- +-static bool mem_input_program_surface_flip_and_addr( +- struct mem_input *mem_input, +- const struct dc_plane_address *address, +- bool flip_immediate) +-{ +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); +- +- /* TODO: Figure out if two modes are needed: +- * non-XDMA Mode: GRPH_SURFACE_UPDATE_IMMEDIATE_EN = 1 +- * XDMA Mode: GRPH_SURFACE_UPDATE_H_RETRACE_EN = 1 +- */ +- DCP_REG_UPDATE(DCP0_GRPH_UPDATE, +- GRPH_UPDATE_LOCK, 1); +- +- if (flip_immediate) { +- DCP_REG_UPDATE_2( +- DCP0_GRPH_FLIP_CONTROL, +- GRPH_SURFACE_UPDATE_IMMEDIATE_EN, 0, +- GRPH_SURFACE_UPDATE_H_RETRACE_EN, 1); +- } else { +- DCP_REG_UPDATE_2( +- DCP0_GRPH_FLIP_CONTROL, +- GRPH_SURFACE_UPDATE_IMMEDIATE_EN, 0, +- GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0); +- } +- +- switch (address->type) { +- case PLN_ADDR_TYPE_GRAPHICS: +- if (address->grph.addr.quad_part == 0) +- break; +- program_pri_addr(mem_input110, address->grph.addr); +- break; +- case PLN_ADDR_TYPE_GRPH_STEREO: +- if (address->grph_stereo.left_addr.quad_part == 0 +- || address->grph_stereo.right_addr.quad_part == 0) +- break; +- program_pri_addr(mem_input110, address->grph_stereo.left_addr); +- program_sec_addr(mem_input110, address->grph_stereo.right_addr); +- break; +- default: +- /* not supported */ +- BREAK_TO_DEBUGGER(); +- break; +- } +- +- mem_input->request_address = *address; +- +- if (flip_immediate) +- mem_input->current_address = *address; +- +- DCP_REG_UPDATE(DCP0_GRPH_UPDATE, +- GRPH_UPDATE_LOCK, 0); +- +- return true; +-} +- +-static void mem_input_update_dchub(struct mem_input *mi, +- struct dchub_init_data *dh_data) +-{ +- struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mi); +- /* TODO: port code from dal2 */ +- switch (dh_data->fb_mode) { +- case FRAME_BUFFER_MODE_ZFB_ONLY: +- /*For ZFB case need to put DCHUB FB BASE and TOP upside down to indicate ZFB mode*/ +- GENERAL_REG_UPDATE_2( +- DCHUB_FB_LOCATION, +- FB_TOP, 0, +- FB_BASE, 0x0FFFF); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BASE, +- AGP_BASE, dh_data->zfb_phys_addr_base >> 22); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BOT, +- AGP_BOT, dh_data->zfb_mc_base_addr >> 22); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_TOP, +- AGP_TOP, (dh_data->zfb_mc_base_addr + dh_data->zfb_size_in_byte - 1) >> 22); +- break; +- case FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL: +- /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BASE, +- AGP_BASE, dh_data->zfb_phys_addr_base >> 22); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BOT, +- AGP_BOT, dh_data->zfb_mc_base_addr >> 22); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_TOP, +- AGP_TOP, (dh_data->zfb_mc_base_addr + dh_data->zfb_size_in_byte - 1) >> 22); +- break; +- case FRAME_BUFFER_MODE_LOCAL_ONLY: +- /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BASE, +- AGP_BASE, 0); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_BOT, +- AGP_BOT, 0x03FFFF); +- +- GENERAL_REG_UPDATE( +- DCHUB_AGP_TOP, +- AGP_TOP, 0); +- break; +- default: +- break; +- } +- +- dh_data->dchub_initialzied = true; +- dh_data->dchub_info_valid = false; +-} +- +-static struct mem_input_funcs dce120_mem_input_funcs = { +- .mem_input_program_display_marks = dce_mem_input_program_display_marks, +- .allocate_mem_input = dce_mem_input_allocate_dmif, +- .free_mem_input = dce_mem_input_free_dmif, +- .mem_input_program_surface_flip_and_addr = +- mem_input_program_surface_flip_and_addr, +- .mem_input_program_pte_vm = dce_mem_input_program_pte_vm, +- .mem_input_program_surface_config = +- dce_mem_input_program_surface_config, +- .mem_input_is_flip_pending = mem_input_is_flip_pending, +- .mem_input_update_dchub = mem_input_update_dchub +-}; +- +-/*****************************************/ +-/* Constructor, Destructor */ +-/*****************************************/ +- +-bool dce120_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets) +-{ +- /* supported stutter method +- * STUTTER_MODE_ENHANCED +- * STUTTER_MODE_QUAD_DMIF_BUFFER +- * STUTTER_MODE_WATERMARK_NBP_STATE +- */ +- +- if (!dce110_mem_input_construct(mem_input110, ctx, inst, offsets)) +- return false; +- +- mem_input110->base.funcs = &dce120_mem_input_funcs; +- mem_input110->offsets = *offsets; +- +- return true; +-} +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.h +deleted file mode 100644 +index 379fd72..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_mem_input.h ++++ /dev/null +@@ -1,37 +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 __DC_MEM_INPUT_DCE120_H__ +-#define __DC_MEM_INPUT_DCE120_H__ +- +-#include "mem_input.h" +-#include "dce110/dce110_mem_input.h" +- +-bool dce120_mem_input_construct( +- struct dce110_mem_input *mem_input110, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets); +- +-#endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +index b13abb02..1276dab 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +@@ -41,8 +41,7 @@ + #include "dce/dce_clock_source.h" + #include "dce/dce_clocks.h" + #include "dce/dce_ipp.h" +-#include "dce110/dce110_mem_input.h" +-#include "dce120/dce120_mem_input.h" ++#include "dce/dce_mem_input.h" + + #include "dce110/dce110_hw_sequencer.h" + #include "dce120/dce120_hw_sequencer.h" +@@ -376,51 +375,6 @@ struct output_pixel_processor *dce120_opp_create( + return NULL; + } + +-static const struct dce110_mem_input_reg_offsets dce120_mi_reg_offsets[] = { +- { +- .dcp = (mmDCP0_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE0_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP1_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE1_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP2_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE2_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP3_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE3_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP4_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE4_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP5_GRPH_CONTROL - mmDCP0_GRPH_CONTROL), +- .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL +- - mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE5_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- } +-}; +- + static const struct bios_registers bios_regs = { + .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6 + NBIO_BASE(mmBIOS_SCRATCH_6_BASE_IDX) + }; +@@ -518,7 +472,7 @@ static void destruct(struct dce110_resource_pool *pool) + dce_ipp_destroy(&pool->base.ipps[i]); + + if (pool->base.mis[i] != NULL) { +- dm_free(TO_DCE110_MEM_INPUT(pool->base.mis[i])); ++ dm_free(TO_DCE_MEM_INPUT(pool->base.mis[i])); + pool->base.mis[i] = NULL; + } + +@@ -708,27 +662,17 @@ static const struct dce_mem_input_mask mi_masks = { + + static struct mem_input *dce120_mem_input_create( + struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offset) ++ uint32_t inst) + { +- struct dce110_mem_input *mem_input110 = +- dm_alloc(sizeof(struct dce110_mem_input)); ++ struct dce_mem_input *dce_mi = dm_alloc(sizeof(struct dce_mem_input)); + +- if (!mem_input110) ++ if (!dce_mi) { ++ BREAK_TO_DEBUGGER(); + return NULL; +- +- if (dce120_mem_input_construct(mem_input110, ctx, inst, offset)) { +- struct mem_input *mi = &mem_input110->base; +- +- mi->regs = &mi_regs[inst]; +- mi->shifts = &mi_shifts; +- mi->masks = &mi_masks; +- return mi; + } + +- BREAK_TO_DEBUGGER(); +- dm_free(mem_input110); +- return NULL; ++ dce112_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks); ++ return &dce_mi->base; + } + + static struct transform *dce120_transform_create( +@@ -1007,8 +951,7 @@ static bool construct( + goto controller_create_fail; + } + +- pool->base.mis[i] = dce120_mem_input_create(ctx, +- i, &dce120_mi_reg_offsets[i]); ++ pool->base.mis[i] = dce120_mem_input_create(ctx, i); + + if (pool->base.mis[i] == NULL) { + BREAK_TO_DEBUGGER(); +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/Makefile b/drivers/gpu/drm/amd/display/dc/dce80/Makefile +index 1d54d5f..c110589 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce80/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dce80/Makefile +@@ -2,8 +2,7 @@ + # Makefile for the 'controller' sub-component of DAL. + # It provides the control and status of HW CRTC block. + +-DCE80 = dce80_timing_generator.o \ +- dce80_compressor.o dce80_mem_input.o dce80_hw_sequencer.o \ ++DCE80 = dce80_timing_generator.o dce80_compressor.o dce80_hw_sequencer.o \ + dce80_resource.o + + AMD_DAL_DCE80 = $(addprefix $(AMDDALPATH)/dc/dce80/,$(DCE80)) +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.c +deleted file mode 100644 +index 933e3d8..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.c ++++ /dev/null +@@ -1,83 +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 +- * +- */ +-#include "dm_services.h" +- +-#include "dce/dce_8_0_d.h" +-#include "dce/dce_8_0_sh_mask.h" +-/* TODO: this needs to be looked at, used by Stella's workaround*/ +-#include "gmc/gmc_7_1_d.h" +-#include "gmc/gmc_7_1_sh_mask.h" +- +-#include "include/logger_interface.h" +-#include "inc/dce_calcs.h" +- +-#include "../dce110/dce110_mem_input.h" +-#include "dce80_mem_input.h" +- +-#define MAX_WATERMARK 0xFFFF +-#define SAFE_NBP_MARK 0x7FFF +- +-#define DCP_REG(reg) (reg + mem_input80->offsets.dcp) +-#define DMIF_REG(reg) (reg + mem_input80->offsets.dmif) +-#define PIPE_REG(reg) (reg + mem_input80->offsets.pipe) +- +-static struct mem_input_funcs dce80_mem_input_funcs = { +- .mem_input_program_display_marks = +- dce110_mem_input_program_display_marks, +- .allocate_mem_input = dce_mem_input_allocate_dmif, +- .free_mem_input = dce_mem_input_free_dmif, +- .mem_input_program_surface_flip_and_addr = +- dce110_mem_input_program_surface_flip_and_addr, +- .mem_input_program_surface_config = +- dce_mem_input_program_surface_config, +- .mem_input_is_flip_pending = +- dce110_mem_input_is_flip_pending, +- .mem_input_update_dchub = NULL +-}; +- +-/*****************************************/ +-/* Constructor, Destructor */ +-/*****************************************/ +- +-bool dce80_mem_input_construct( +- struct dce110_mem_input *mem_input80, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets) +-{ +- /* supported stutter method +- * STUTTER_MODE_ENHANCED +- * STUTTER_MODE_QUAD_DMIF_BUFFER +- */ +- mem_input80->base.funcs = &dce80_mem_input_funcs; +- mem_input80->base.ctx = ctx; +- +- mem_input80->base.inst = inst; +- +- mem_input80->offsets = *offsets; +- +- return true; +-} +- +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.h +deleted file mode 100644 +index 357b9e2..0000000 +--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_mem_input.h ++++ /dev/null +@@ -1,36 +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 __DC_MEM_INPUT_DCE80_H__ +-#define __DC_MEM_INPUT_DCE80_H__ +- +-#include "mem_input.h" +- +-bool dce80_mem_input_construct( +- struct dce110_mem_input *mem_input80, +- struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets); +- +-#endif +diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +index 5735914..095e437 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +@@ -35,12 +35,12 @@ + #include "include/irq_service_interface.h" + #include "irq/dce80/irq_service_dce80.h" + #include "dce110/dce110_timing_generator.h" +-#include "dce110/dce110_mem_input.h" + #include "dce110/dce110_resource.h" + #include "dce80/dce80_timing_generator.h" ++#include "dce/dce_mem_input.h" + #include "dce/dce_link_encoder.h" + #include "dce/dce_stream_encoder.h" +-#include "dce80/dce80_mem_input.h" ++#include "dce/dce_mem_input.h" + #include "dce/dce_ipp.h" + #include "dce/dce_transform.h" + #include "dce/dce_opp.h" +@@ -141,51 +141,6 @@ static const struct dce110_timing_generator_offsets dce80_tg_offsets[] = { + } + }; + +-static const struct dce110_mem_input_reg_offsets dce80_mi_reg_offsets[] = { +- { +- .dcp = (mmGRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE0_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE1_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE2_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE3_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE4_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- }, +- { +- .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL), +- .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL +- - mmDPG_WATERMARK_MASK_CONTROL), +- .pipe = (mmPIPE5_DMIF_BUFFER_CONTROL +- - mmPIPE0_DMIF_BUFFER_CONTROL), +- } +-}; +- + /* set register offset */ + #define SR(reg_name)\ + .reg_name = mm ## reg_name +@@ -541,28 +496,18 @@ static const struct dce_mem_input_mask mi_masks = { + + static struct mem_input *dce80_mem_input_create( + struct dc_context *ctx, +- uint32_t inst, +- const struct dce110_mem_input_reg_offsets *offsets) ++ uint32_t inst) + { +- struct dce110_mem_input *mem_input80 = +- dm_alloc(sizeof(struct dce110_mem_input)); ++ struct dce_mem_input *dce_mi = dm_alloc(sizeof(struct dce_mem_input)); + +- if (!mem_input80) ++ if (!dce_mi) { ++ BREAK_TO_DEBUGGER(); + return NULL; +- +- if (dce80_mem_input_construct(mem_input80, ctx, inst, offsets)) { +- struct mem_input *mi = &mem_input80->base; +- +- mi->regs = &mi_regs[inst]; +- mi->shifts = &mi_shifts; +- mi->masks = &mi_masks; +- mi->wa.single_head_rdreq_dmif_limit = 2; +- return mi; + } + +- BREAK_TO_DEBUGGER(); +- dm_free(mem_input80); +- return NULL; ++ dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks); ++ dce_mi->wa.single_head_rdreq_dmif_limit = 2; ++ return &dce_mi->base; + } + + static void dce80_transform_destroy(struct transform **xfm) +@@ -684,7 +629,7 @@ static void destruct(struct dce110_resource_pool *pool) + dce_ipp_destroy(&pool->base.ipps[i]); + + if (pool->base.mis[i] != NULL) { +- dm_free(TO_DCE110_MEM_INPUT(pool->base.mis[i])); ++ dm_free(TO_DCE_MEM_INPUT(pool->base.mis[i])); + pool->base.mis[i] = NULL; + } + +@@ -1000,8 +945,7 @@ static bool construct( + goto res_create_fail; + } + +- pool->base.mis[i] = dce80_mem_input_create(ctx, i, +- &dce80_mi_reg_offsets[i]); ++ pool->base.mis[i] = dce80_mem_input_create(ctx, i); + if (pool->base.mis[i] == NULL) { + BREAK_TO_DEBUGGER(); + dm_error("DC: failed to create memory input!\n"); +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h +index 79fbc60..bd0dfeb 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h +@@ -28,8 +28,6 @@ + #include "dc.h" + #include "include/grph_object_id.h" + +-#include "dce/dce_mem_input.h" /* temporary */ +- + #if defined(CONFIG_DRM_AMD_DC_DCN1_0) + #include "dml/display_mode_structs.h" + +@@ -51,7 +49,6 @@ struct dcn_watermark_set { + struct dcn_watermarks c; + struct dcn_watermarks d; + }; +- + #endif + + struct dce_watermarks { +@@ -74,11 +71,6 @@ struct mem_input { + struct dc_plane_address current_address; + uint32_t inst; + struct stutter_modes stutter_mode; +- +- const struct dce_mem_input_registers *regs; +- const struct dce_mem_input_shift *shifts; +- const struct dce_mem_input_mask *masks; +- struct dce_mem_input_wa wa; + }; + + struct mem_input_funcs { +-- +2.7.4 + |