aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch')
-rw-r--r--common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch1433
1 files changed, 0 insertions, 1433 deletions
diff --git a/common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch b/common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch
deleted file mode 100644
index 7e4c61d8..00000000
--- a/common/recipes-kernel/linux/files/0773-drm-amd-dal-Create-transform-for-underlay-pipe.patch
+++ /dev/null
@@ -1,1433 +0,0 @@
-From 0caa42dd0f4b24160cda117448794f3fef427b32 Mon Sep 17 00:00:00 2001
-From: Eric Yang <eric.yang2@amd.com>
-Date: Wed, 3 Feb 2016 15:02:13 -0500
-Subject: [PATCH 0773/1110] drm/amd/dal: Create transform for underlay pipe
-
-Signed-off-by: Eric Yang <eric.yang2@amd.com>
-Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
----
- drivers/gpu/drm/amd/dal/dc/dce110/Makefile | 4 +-
- .../amd/dal/dc/dce110/dce110_transform_bit_depth.c | 115 ++++
- .../drm/amd/dal/dc/dce110/dce110_transform_sclv.c | 531 ----------------
- .../gpu/drm/amd/dal/dc/dce110/dce110_transform_v.c | 674 +++++++++++++++++++++
- .../gpu/drm/amd/dal/dc/dce110/dce110_transform_v.h | 44 ++
- 5 files changed, 835 insertions(+), 533 deletions(-)
- delete mode 100644 drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_sclv.c
- create mode 100644 drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.c
- create mode 100644 drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.h
-
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/Makefile b/drivers/gpu/drm/amd/dal/dc/dce110/Makefile
-index ae9d2de..2d0007b 100644
---- a/drivers/gpu/drm/amd/dal/dc/dce110/Makefile
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/Makefile
-@@ -5,8 +5,8 @@
- DCE110 = dce110_ipp.o dce110_ipp_cursor.o \
- dce110_ipp_gamma.o dce110_link_encoder.o dce110_opp.o \
- dce110_opp_formatter.o dce110_opp_regamma.o dce110_stream_encoder.o \
--dce110_timing_generator.o dce110_transform.o dce110_transform_gamut.o \
--dce110_transform_scl.o dce110_transform_sclv.o dce110_opp_csc.o\
-+dce110_timing_generator.o dce110_transform.o dce110_transform_v.o \
-+dce110_transform_gamut.o dce110_transform_scl.o dce110_opp_csc.o\
- dce110_compressor.o dce110_mem_input.o dce110_hw_sequencer.o \
- dce110_resource.o dce110_transform_bit_depth.o dce110_clock_source.o
-
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
-index fb5ef6d..70dedbc 100644
---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
-@@ -30,6 +30,7 @@
- #include "dce/dce_11_0_sh_mask.h"
-
- #include "dce110_transform.h"
-+#include "dce110_transform_v.h"
- #include "opp.h"
- #include "include/logger_interface.h"
- #include "include/fixed32_32.h"
-@@ -849,3 +850,117 @@ bool dce110_transform_power_up_line_buffer(struct transform *xfm)
- return true;
- }
-
-+/* Underlay pipe functions*/
-+
-+bool dce110_transform_v_get_current_pixel_storage_depth(
-+ struct transform *xfm,
-+ enum lb_pixel_depth *depth)
-+{
-+ uint32_t value = 0;
-+
-+ if (depth == NULL)
-+ return false;
-+
-+ value = dm_read_reg(
-+ xfm->ctx,
-+ mmLBV_DATA_FORMAT);
-+
-+ switch (get_reg_field_value(value, LBV_DATA_FORMAT, PIXEL_DEPTH)) {
-+ case 0:
-+ *depth = LB_PIXEL_DEPTH_30BPP;
-+ break;
-+ case 1:
-+ *depth = LB_PIXEL_DEPTH_24BPP;
-+ break;
-+ case 2:
-+ *depth = LB_PIXEL_DEPTH_18BPP;
-+ break;
-+ case 3:
-+ *depth = LB_PIXEL_DEPTH_36BPP;
-+ break;
-+ default:
-+ dal_logger_write(xfm->ctx->logger,
-+ LOG_MAJOR_WARNING,
-+ LOG_MINOR_COMPONENT_GPU,
-+ "%s: Invalid LB pixel depth",
-+ __func__);
-+ *depth = LB_PIXEL_DEPTH_30BPP;
-+ break;
-+ }
-+ return true;
-+
-+}
-+
-+bool dce110_transform_v_set_pixel_storage_depth(
-+ struct transform *xfm,
-+ enum lb_pixel_depth depth,
-+ const struct bit_depth_reduction_params *bit_depth_params)
-+{
-+ struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
-+ bool ret = true;
-+ uint32_t value;
-+ enum dc_color_depth color_depth;
-+
-+ value = dm_read_reg(
-+ xfm->ctx,
-+ LB_REG(mmLBV_DATA_FORMAT));
-+ switch (depth) {
-+ case LB_PIXEL_DEPTH_18BPP:
-+ color_depth = COLOR_DEPTH_666;
-+ set_reg_field_value(value, 2, LBV_DATA_FORMAT, PIXEL_DEPTH);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_EXPAN_MODE);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_REDUCE_MODE);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, DITHER_EN);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, DOWNSCALE_PREFETCH_EN);
-+ break;
-+ case LB_PIXEL_DEPTH_24BPP:
-+ color_depth = COLOR_DEPTH_888;
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_DEPTH);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_EXPAN_MODE);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_REDUCE_MODE);
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, DITHER_EN);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, DOWNSCALE_PREFETCH_EN);
-+ break;
-+ case LB_PIXEL_DEPTH_30BPP:
-+ color_depth = COLOR_DEPTH_101010;
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, PIXEL_DEPTH);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_EXPAN_MODE);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, PIXEL_REDUCE_MODE);
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, DITHER_EN);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, DOWNSCALE_PREFETCH_EN);
-+ break;
-+ case LB_PIXEL_DEPTH_36BPP:
-+ color_depth = COLOR_DEPTH_121212;
-+ set_reg_field_value(value, 3, LBV_DATA_FORMAT, PIXEL_DEPTH);
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, PIXEL_EXPAN_MODE);
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, PIXEL_REDUCE_MODE);
-+ set_reg_field_value(value, 0, LBV_DATA_FORMAT, DITHER_EN);
-+ set_reg_field_value(value, 1, LBV_DATA_FORMAT, DOWNSCALE_PREFETCH_EN);
-+ break;
-+ default:
-+ ret = false;
-+ break;
-+ }
-+
-+ if (ret == true) {
-+ set_denormalization(xfm110, color_depth);
-+ ret = program_bit_depth_reduction(xfm110, color_depth,
-+ bit_depth_params);
-+
-+ set_reg_field_value(value, 0, LB_DATA_FORMAT, ALPHA_EN);
-+ dm_write_reg(
-+ xfm->ctx, LB_REG(mmLB_DATA_FORMAT), value);
-+ if (!(xfm110->lb_pixel_depth_supported & depth)) {
-+ /*we should use unsupported capabilities
-+ * unless it is required by w/a*/
-+ dal_logger_write(xfm->ctx->logger,
-+ LOG_MAJOR_WARNING,
-+ LOG_MINOR_COMPONENT_GPU,
-+ "%s: Capability not supported",
-+ __func__);
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_sclv.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_sclv.c
-deleted file mode 100644
-index 1968296..0000000
---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_sclv.c
-+++ /dev/null
-@@ -1,531 +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"
--
--#include "dce110_transform.h"
--
--#define NOT_IMPLEMENTED() DAL_LOGGER_NOT_IMPL(LOG_MINOR_COMPONENT_CONTROLLER,\
-- "TRANSFORM SCALER:%s()\n", __func__)
--
--/*
--*****************************************************************************
--* Function: calculateViewport
--*
--* @brief
--* Calculates all of the data required to set the viewport
--*
--* @param [in] pData: scaler settings data
--* @param [out] pLumaVp: luma viewport information
--* @param [out] pChromaVp: chroma viewport information
--* @param [out] srcResCx2: source chroma resolution times 2 - for multi-taps
--*
--*****************************************************************************
--*/
--static void calculate_viewport(
-- const struct scaler_data *scl_data,
-- struct rect *luma_viewport,
-- struct rect *chroma_viewport)
--{
-- /*Do not set chroma vp for rgb444 pixel format*/
-- luma_viewport->x = scl_data->viewport.x - scl_data->viewport.x % 2;
-- luma_viewport->y = scl_data->viewport.y - scl_data->viewport.y % 2;
-- luma_viewport->width =
-- scl_data->viewport.width - scl_data->viewport.width % 2;
-- luma_viewport->height =
-- scl_data->viewport.height - scl_data->viewport.height % 2;
--
--
-- if (scl_data->dal_pixel_format == PIXEL_FORMAT_422BPP16) {
-- luma_viewport->width += luma_viewport->width % 2;
--
-- chroma_viewport->x = luma_viewport->x / 2;
-- chroma_viewport->width = luma_viewport->width / 2;
-- } else if (scl_data->dal_pixel_format == PIXEL_FORMAT_420BPP12) {
-- luma_viewport->height += luma_viewport->height % 2;
-- luma_viewport->width += luma_viewport->width % 2;
-- /*for 420 video chroma is 1/4 the area of luma, scaled
-- *vertically and horizontally
-- */
-- chroma_viewport->x = luma_viewport->x / 2;
-- chroma_viewport->y = luma_viewport->y / 2;
-- chroma_viewport->height = luma_viewport->height / 2;
-- chroma_viewport->width = luma_viewport->width / 2;
-- }
--}
--
--
--static void program_viewport(
-- struct dce110_transform *xfm110,
-- struct rect *luma_view_port,
-- struct rect *chroma_view_port)
--{
-- struct dc_context *ctx = xfm110->base.ctx;
-- uint32_t value = 0;
-- uint32_t addr = 0;
--
-- if (luma_view_port->width != 0 && luma_view_port->height != 0) {
-- addr = mmSCLV_VIEWPORT_START;
-- value = 0;
-- set_reg_field_value(
-- value,
-- luma_view_port->x,
-- SCLV_VIEWPORT_START,
-- VIEWPORT_X_START);
-- set_reg_field_value(
-- value,
-- luma_view_port->y,
-- SCLV_VIEWPORT_START,
-- VIEWPORT_Y_START);
-- dm_write_reg(ctx, addr, value);
--
-- addr = mmSCLV_VIEWPORT_SIZE;
-- value = 0;
-- set_reg_field_value(
-- value,
-- luma_view_port->height,
-- SCLV_VIEWPORT_SIZE,
-- VIEWPORT_HEIGHT);
-- set_reg_field_value(
-- value,
-- luma_view_port->width,
-- SCLV_VIEWPORT_SIZE,
-- VIEWPORT_WIDTH);
-- dm_write_reg(ctx, addr, value);
-- }
--
-- if (chroma_view_port->width != 0 && chroma_view_port->height != 0) {
-- addr = mmSCLV_VIEWPORT_START_C;
-- value = 0;
-- set_reg_field_value(
-- value,
-- chroma_view_port->x,
-- SCLV_VIEWPORT_START_C,
-- VIEWPORT_X_START_C);
-- set_reg_field_value(
-- value,
-- chroma_view_port->y,
-- SCLV_VIEWPORT_START_C,
-- VIEWPORT_Y_START_C);
-- dm_write_reg(ctx, addr, value);
--
-- addr = mmSCLV_VIEWPORT_SIZE_C;
-- value = 0;
-- set_reg_field_value(
-- value,
-- chroma_view_port->height,
-- SCLV_VIEWPORT_SIZE_C,
-- VIEWPORT_HEIGHT_C);
-- set_reg_field_value(
-- value,
-- chroma_view_port->width,
-- SCLV_VIEWPORT_SIZE_C,
-- VIEWPORT_WIDTH_C);
-- dm_write_reg(ctx, addr, value);
-- }
-- /* TODO: add stereo support */
--}
--
--
--/* Until and For MPO video play story, to reduce time for implementation,
-- * below limits are applied for now: 2_TAPS only
-- * Use auto-calculated filter values
-- * Following routines will be empty for now:
-- *
-- * programSclRatiosInits -- calcualate scaler ratio manually
-- * calculateInits --- calcualate scaler ratio manually
-- * programFilter -- multi-taps
-- * GetOptimalNumberOfTaps -- will hard coded to 2 TAPS
-- * GetNextLowerNumberOfTaps -- will hard coded to 2TAPS
-- * validateRequestedScaleRatio - used by GetOptimalNumberOfTaps internally
-- */
--
--/**
--* Function:
--* void setup_scaling_configuration
--*
--* Purpose: setup scaling mode : bypass, RGb, YCbCr and nummber of taps
--* Input: data
--*
--* Output:
-- void
--*/
--static bool setup_scaling_configuration(
-- struct dce110_transform *xfm110,
-- const struct scaler_data *data)
--{
-- bool is_scaling_needed = false;
-- struct dc_context *ctx = xfm110->base.ctx;
-- uint32_t value = 0;
--
-- if (data->taps.h_taps + data->taps.v_taps > 2) {
-- set_reg_field_value(value, 1, SCLV_MODE, SCL_MODE);
-- set_reg_field_value(value, 1, SCLV_MODE, SCL_PSCL_EN);
-- is_scaling_needed = true;
-- } else {
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE);
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN);
-- }
--
-- if (data->taps.h_taps_c + data->taps.v_taps_c > 2) {
-- set_reg_field_value(value, 1, SCLV_MODE, SCL_MODE_C);
-- set_reg_field_value(value, 1, SCLV_MODE, SCL_PSCL_EN_C);
-- is_scaling_needed = true;
-- } else if (data->dal_pixel_format != PIXEL_FORMAT_420BPP12 &&
-- data->dal_pixel_format != PIXEL_FORMAT_422BPP16) {
-- set_reg_field_value(
-- value,
-- get_reg_field_value(value, SCLV_MODE, SCL_MODE),
-- SCLV_MODE,
-- SCL_MODE_C);
-- set_reg_field_value(
-- value,
-- get_reg_field_value(value, SCLV_MODE, SCL_PSCL_EN),
-- SCLV_MODE,
-- SCL_PSCL_EN_C);
-- } else {
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE_C);
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN_C);
-- }
-- dm_write_reg(ctx, mmSCLV_MODE, value);
--
-- {
-- value = dm_read_reg(ctx, mmSCLV_TAP_CONTROL);
--
-- set_reg_field_value(value, data->taps.h_taps - 1,
-- SCLV_TAP_CONTROL, SCL_H_NUM_OF_TAPS);
--
-- set_reg_field_value(value, data->taps.v_taps - 1,
-- SCLV_TAP_CONTROL, SCL_V_NUM_OF_TAPS);
--
-- set_reg_field_value(value, data->taps.h_taps_c - 1,
-- SCLV_TAP_CONTROL, SCL_H_NUM_OF_TAPS_C);
--
-- set_reg_field_value(value, data->taps.v_taps_c - 1,
-- SCLV_TAP_CONTROL, SCL_V_NUM_OF_TAPS_C);
--
-- dm_write_reg(ctx, mmSCLV_TAP_CONTROL, value);
-- }
--
-- {
-- /* we can ignore this register because we are ok with hw
-- * default 0 -- change to 1 according to dal2 code*/
-- value = dm_read_reg(ctx, mmSCLV_CONTROL);
-- /* 0 - Replaced out of bound pixels with black pixel
-- * (or any other required color) */
-- set_reg_field_value(value, 1, SCLV_CONTROL, SCL_BOUNDARY_MODE);
--
-- /* 1 - Replaced out of bound pixels with the edge pixel. */
-- dm_write_reg(ctx, mmSCLV_CONTROL, value);
-- }
--
-- return is_scaling_needed;
--}
--
--/**
--* Function:
--* void program_overscan
--*
--* Purpose: Programs overscan border
--* Input: overscan
--*
--* Output:
-- void
--*/
--static void program_overscan(
-- struct dce110_transform *xfm110,
-- const struct overscan_info *overscan)
--{
-- uint32_t overscan_left_right = 0;
-- uint32_t overscan_top_bottom = 0;
--
-- set_reg_field_value(overscan_left_right, overscan->left,
-- SCLV_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_LEFT);
--
-- set_reg_field_value(overscan_left_right, overscan->right,
-- SCLV_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_RIGHT);
--
-- set_reg_field_value(overscan_top_bottom, overscan->top,
-- SCLV_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_TOP);
--
-- set_reg_field_value(overscan_top_bottom, overscan->bottom,
-- SCLV_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_BOTTOM);
--
-- dm_write_reg(xfm110->base.ctx,
-- mmSCLV_EXT_OVERSCAN_LEFT_RIGHT,
-- overscan_left_right);
--
-- dm_write_reg(xfm110->base.ctx,
-- mmSCLV_EXT_OVERSCAN_TOP_BOTTOM,
-- overscan_top_bottom);
--}
--/*
--static void setup_auto_scaling(struct dce110_transform *xfm110)
--{
-- uint32_t value = 0;
-- set_reg_field_value(value, 1, SCLV_AUTOMATIC_MODE_CONTROL,
-- SCL_V_CALC_AUTO_RATIO_EN);
-- set_reg_field_value(value, 1, SCLV_AUTOMATIC_MODE_CONTROL,
-- SCL_H_CALC_AUTO_RATIO_EN);
-- dal_write_reg(xfm->ctx,
-- xfm->regs[IDX_SCL_AUTOMATIC_MODE_CONTROL],
-- value);
--}
--*/
--
--static void program_two_taps_filter_horz(
-- struct dce110_transform *xfm110,
-- bool hardcode_coff)
--{
-- uint32_t value = 0;
--
-- if (hardcode_coff)
-- set_reg_field_value(
-- value,
-- 1,
-- SCLV_HORZ_FILTER_CONTROL,
-- SCL_H_2TAP_HARDCODE_COEF_EN);
--
-- dm_write_reg(xfm110->base.ctx,
-- mmSCLV_HORZ_FILTER_CONTROL,
-- value);
--}
--
--static void program_two_taps_filter_vert(
-- struct dce110_transform *xfm110,
-- bool hardcode_coff)
--{
-- uint32_t value = 0;
--
-- if (hardcode_coff)
-- set_reg_field_value(value, 1, SCLV_VERT_FILTER_CONTROL,
-- SCL_V_2TAP_HARDCODE_COEF_EN);
--
-- dm_write_reg(xfm110->base.ctx,
-- mmSCLV_VERT_FILTER_CONTROL,
-- value);
--}
--
--static void set_coeff_update_complete(
-- struct dce110_transform *xfm110)
--{
-- /*TODO: Until now, only scaler bypass, up-scaler 2 -TAPS coeff auto
-- * calculation are implemented. Coefficient RAM is not used
-- * Do not check this flag yet
-- */
--
-- /*uint32_t value;
-- uint32_t addr = xfm->regs[IDX_SCL_UPDATE];
--
-- value = dal_read_reg(xfm->ctx, addr);
-- set_reg_field_value(value, 0,
-- SCL_UPDATE, SCL_COEF_UPDATE_COMPLETE);
-- dal_write_reg(xfm->ctx, addr, value);*/
--}
--
--static bool program_multi_taps_filter(
-- struct dce110_transform *xfm110,
-- const struct scaler_data *data,
-- bool horizontal)
--{
-- struct dc_context *ctx = xfm110->base.ctx;
--
-- NOT_IMPLEMENTED();
-- return false;
--}
--
--static void calculate_inits(
-- struct dce110_transform *xfm110,
-- const struct scaler_data *data,
-- struct sclv_ratios_inits *inits,
-- struct rect *luma_viewport,
-- struct rect *chroma_viewport)
--{
-- if (data->dal_pixel_format == PIXEL_FORMAT_420BPP12 ||
-- data->dal_pixel_format == PIXEL_FORMAT_422BPP16)
-- inits->chroma_enable = true;
--
-- /* TODO: implement rest of this function properly */
-- if (inits->chroma_enable) {
-- inits->h_int_scale_ratio_luma = 0x1000000;
-- inits->v_int_scale_ratio_luma = 0x1000000;
-- inits->h_int_scale_ratio_chroma = 0x800000;
-- inits->v_int_scale_ratio_chroma = 0x800000;
-- }
--}
--
--static void program_scl_ratios_inits(
-- struct dce110_transform *xfm110,
-- struct sclv_ratios_inits *inits)
--{
-- struct dc_context *ctx = xfm110->base.ctx;
-- uint32_t addr = mmSCLV_HORZ_FILTER_SCALE_RATIO;
-- uint32_t value = dm_read_reg(ctx, addr);
--
-- set_reg_field_value(
-- value,
-- inits->h_int_scale_ratio_luma,
-- SCLV_HORZ_FILTER_SCALE_RATIO,
-- SCL_H_SCALE_RATIO);
-- dm_write_reg(ctx, addr, value);
--
-- addr = mmSCLV_VERT_FILTER_SCALE_RATIO;
-- value = dm_read_reg(ctx, addr);
-- set_reg_field_value(
-- value,
-- inits->v_int_scale_ratio_luma,
-- SCLV_VERT_FILTER_SCALE_RATIO,
-- SCL_V_SCALE_RATIO);
-- dm_write_reg(ctx, addr, value);
--
-- addr = mmSCLV_HORZ_FILTER_SCALE_RATIO_C;
-- value = dm_read_reg(ctx, addr);
-- set_reg_field_value(
-- value,
-- inits->h_int_scale_ratio_chroma,
-- SCLV_HORZ_FILTER_SCALE_RATIO_C,
-- SCL_H_SCALE_RATIO_C);
-- dm_write_reg(ctx, addr, value);
--
-- addr = mmSCLV_VERT_FILTER_SCALE_RATIO_C;
-- value = dm_read_reg(ctx, addr);
-- set_reg_field_value(
-- value,
-- inits->v_int_scale_ratio_chroma,
-- SCLV_VERT_FILTER_SCALE_RATIO_C,
-- SCL_V_SCALE_RATIO_C);
-- dm_write_reg(ctx, addr, value);
--}
--
--void dce110_transform_underlay_set_scalerv_bypass(struct transform *xfm)
--{
-- uint32_t addr = mmSCLV_MODE;
-- uint32_t value = dm_read_reg(xfm->ctx, addr);
--
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE);
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE_C);
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN);
-- set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN_C);
-- dm_write_reg(xfm->ctx, addr, value);
--}
--
--bool dce110_transform_underlay_is_scaling_enabled(struct transform *xfm)
--{
-- uint32_t value = dm_read_reg(xfm->ctx, mmSCLV_MODE);
-- uint8_t scl_mode = get_reg_field_value(value, SCLV_MODE, SCL_MODE);
--
-- return scl_mode == 0;
--}
--
--/* TODO: sync this one with DAL2 */
--bool dce110_transform_underlay_set_scaler(
-- struct transform *xfm,
-- const struct scaler_data *data)
--{
-- struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
-- bool is_scaling_required;
-- struct rect luma_viewport = {0};
-- struct rect chroma_viewport = {0};
-- struct dc_context *ctx = xfm->ctx;
--
-- /* 1. Lock Scaler TODO: enable?*/
-- /*set_scaler_update_lock(xfm, true);*/
--
-- /* 2. Calculate viewport, viewport programming should happen after init
-- * calculations as they may require an adjustment in the viewport.
-- */
--
-- calculate_viewport(data, &luma_viewport, &chroma_viewport);
--
-- /* 3. Program overscan */
-- program_overscan(xfm110, &data->overscan);
--
-- /* 4. Program taps and configuration */
-- is_scaling_required = setup_scaling_configuration(xfm110, data);
--
-- if (is_scaling_required) {
-- /* 5. Calculate and program ratio, filter initialization */
--
-- struct sclv_ratios_inits inits = { 0 };
--
-- calculate_inits(
-- xfm110,
-- data,
-- &inits,
-- &luma_viewport,
-- &chroma_viewport);
--
-- program_scl_ratios_inits(xfm110, &inits);
--
-- /*scaler coeff of 2-TAPS use hardware auto calculated value*/
--
-- /* 6. Program vertical filters */
-- if (data->taps.v_taps > 2) {
-- program_two_taps_filter_vert(xfm110, false);
--
-- if (!program_multi_taps_filter(xfm110, data, false)) {
-- dal_logger_write(ctx->logger,
-- LOG_MAJOR_DCP,
-- LOG_MINOR_DCP_SCALER,
-- "Failed vertical taps programming\n");
-- return false;
-- }
-- } else
-- program_two_taps_filter_vert(xfm110, true);
--
-- /* 7. Program horizontal filters */
-- if (data->taps.h_taps > 2) {
-- program_two_taps_filter_horz(xfm110, false);
--
-- if (!program_multi_taps_filter(xfm110, data, true)) {
-- dal_logger_write(ctx->logger,
-- LOG_MAJOR_DCP,
-- LOG_MINOR_DCP_SCALER,
-- "Failed horizontal taps programming\n");
-- return false;
-- }
-- } else
-- program_two_taps_filter_horz(xfm110, true);
-- }
--
-- /* 8. Program the viewport */
-- if (data->flags.bits.SHOULD_PROGRAM_VIEWPORT)
-- program_viewport(xfm110, &luma_viewport, &chroma_viewport);
--
-- /* 9. Unlock the Scaler TODO: enable?*/
-- /* Every call to "set_scaler_update_lock(xfm, TRUE)"
-- * must have a corresponding call to
-- * "set_scaler_update_lock(xfm, FALSE)" */
-- /*set_scaler_update_lock(xfm, false);*/
--
-- /* TODO: investigate purpose/need of SHOULD_UNLOCK */
-- if (data->flags.bits.SHOULD_UNLOCK == false)
-- set_coeff_update_complete(xfm110);
--
-- return true;
--}
--
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.c
-new file mode 100644
-index 0000000..a7c62e0
---- /dev/null
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.c
-@@ -0,0 +1,674 @@
-+/*
-+ * 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 "dc_types.h"
-+#include "core_types.h"
-+
-+#include "dce110_transform.h"
-+#include "dce110_transform_v.h"
-+
-+#include "dce/dce_11_0_d.h"
-+#include "dce/dce_11_0_sh_mask.h"
-+
-+#define NOT_IMPLEMENTED() DAL_LOGGER_NOT_IMPL(LOG_MINOR_COMPONENT_CONTROLLER,\
-+ "TRANSFORM SCALER:%s()\n", __func__)
-+#define LB_TOTAL_NUMBER_OF_ENTRIES 1712
-+/*
-+*****************************************************************************
-+* Function: calculateViewport
-+*
-+* @brief
-+* Calculates all of the data required to set the viewport
-+*
-+* @param [in] pData: scaler settings data
-+* @param [out] pLumaVp: luma viewport information
-+* @param [out] pChromaVp: chroma viewport information
-+* @param [out] srcResCx2: source chroma resolution times 2 - for multi-taps
-+*
-+*****************************************************************************
-+*/
-+static void calculate_viewport(
-+ const struct scaler_data *scl_data,
-+ struct rect *luma_viewport,
-+ struct rect *chroma_viewport)
-+{
-+ /*Do not set chroma vp for rgb444 pixel format*/
-+ luma_viewport->x = scl_data->viewport.x - scl_data->viewport.x % 2;
-+ luma_viewport->y = scl_data->viewport.y - scl_data->viewport.y % 2;
-+ luma_viewport->width =
-+ scl_data->viewport.width - scl_data->viewport.width % 2;
-+ luma_viewport->height =
-+ scl_data->viewport.height - scl_data->viewport.height % 2;
-+
-+
-+ if (scl_data->dal_pixel_format == PIXEL_FORMAT_422BPP16) {
-+ luma_viewport->width += luma_viewport->width % 2;
-+
-+ chroma_viewport->x = luma_viewport->x / 2;
-+ chroma_viewport->width = luma_viewport->width / 2;
-+ } else if (scl_data->dal_pixel_format == PIXEL_FORMAT_420BPP12) {
-+ luma_viewport->height += luma_viewport->height % 2;
-+ luma_viewport->width += luma_viewport->width % 2;
-+ /*for 420 video chroma is 1/4 the area of luma, scaled
-+ *vertically and horizontally
-+ */
-+ chroma_viewport->x = luma_viewport->x / 2;
-+ chroma_viewport->y = luma_viewport->y / 2;
-+ chroma_viewport->height = luma_viewport->height / 2;
-+ chroma_viewport->width = luma_viewport->width / 2;
-+ }
-+}
-+
-+
-+static void program_viewport(
-+ struct dce110_transform *xfm110,
-+ struct rect *luma_view_port,
-+ struct rect *chroma_view_port)
-+{
-+ struct dc_context *ctx = xfm110->base.ctx;
-+ uint32_t value = 0;
-+ uint32_t addr = 0;
-+
-+ if (luma_view_port->width != 0 && luma_view_port->height != 0) {
-+ addr = mmSCLV_VIEWPORT_START;
-+ value = 0;
-+ set_reg_field_value(
-+ value,
-+ luma_view_port->x,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_X_START);
-+ set_reg_field_value(
-+ value,
-+ luma_view_port->y,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_Y_START);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_VIEWPORT_SIZE;
-+ value = 0;
-+ set_reg_field_value(
-+ value,
-+ luma_view_port->height,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_HEIGHT);
-+ set_reg_field_value(
-+ value,
-+ luma_view_port->width,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_WIDTH);
-+ dm_write_reg(ctx, addr, value);
-+ }
-+
-+ if (chroma_view_port->width != 0 && chroma_view_port->height != 0) {
-+ addr = mmSCLV_VIEWPORT_START_C;
-+ value = 0;
-+ set_reg_field_value(
-+ value,
-+ chroma_view_port->x,
-+ SCLV_VIEWPORT_START_C,
-+ VIEWPORT_X_START_C);
-+ set_reg_field_value(
-+ value,
-+ chroma_view_port->y,
-+ SCLV_VIEWPORT_START_C,
-+ VIEWPORT_Y_START_C);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_VIEWPORT_SIZE_C;
-+ value = 0;
-+ set_reg_field_value(
-+ value,
-+ chroma_view_port->height,
-+ SCLV_VIEWPORT_SIZE_C,
-+ VIEWPORT_HEIGHT_C);
-+ set_reg_field_value(
-+ value,
-+ chroma_view_port->width,
-+ SCLV_VIEWPORT_SIZE_C,
-+ VIEWPORT_WIDTH_C);
-+ dm_write_reg(ctx, addr, value);
-+ }
-+ /* TODO: add stereo support */
-+}
-+
-+
-+/*
-+ * Until and For MPO video play story, to reduce time for implementation,
-+ * below limits are applied for now: 2_TAPS only
-+ * Use auto-calculated filter values
-+ * Following routines will be empty for now:
-+ *
-+ * programSclRatiosInits -- calcualate scaler ratio manually
-+ * calculateInits --- calcualate scaler ratio manually
-+ * programFilter -- multi-taps
-+ * GetOptimalNumberOfTaps -- will hard coded to 2 TAPS
-+ * GetNextLowerNumberOfTaps -- will hard coded to 2TAPS
-+ * validateRequestedScaleRatio - used by GetOptimalNumberOfTaps internally
-+ */
-+
-+/*
-+ * Function:
-+ * void setup_scaling_configuration
-+ *
-+ * Purpose: setup scaling mode : bypass, RGb, YCbCr and nummber of taps
-+ * Input: data
-+ *
-+ * Output:
-+ * void
-+ */
-+static bool setup_scaling_configuration(
-+ struct dce110_transform *xfm110,
-+ const struct scaler_data *data)
-+{
-+ bool is_scaling_needed = false;
-+ struct dc_context *ctx = xfm110->base.ctx;
-+ uint32_t value = 0;
-+
-+ if (data->taps.h_taps + data->taps.v_taps > 2) {
-+ set_reg_field_value(value, 1, SCLV_MODE, SCL_MODE);
-+ set_reg_field_value(value, 1, SCLV_MODE, SCL_PSCL_EN);
-+ is_scaling_needed = true;
-+ } else {
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE);
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN);
-+ }
-+
-+ if (data->taps.h_taps_c + data->taps.v_taps_c > 2) {
-+ set_reg_field_value(value, 1, SCLV_MODE, SCL_MODE_C);
-+ set_reg_field_value(value, 1, SCLV_MODE, SCL_PSCL_EN_C);
-+ is_scaling_needed = true;
-+ } else if (data->dal_pixel_format != PIXEL_FORMAT_420BPP12 &&
-+ data->dal_pixel_format != PIXEL_FORMAT_422BPP16) {
-+ set_reg_field_value(
-+ value,
-+ get_reg_field_value(value, SCLV_MODE, SCL_MODE),
-+ SCLV_MODE,
-+ SCL_MODE_C);
-+ set_reg_field_value(
-+ value,
-+ get_reg_field_value(value, SCLV_MODE, SCL_PSCL_EN),
-+ SCLV_MODE,
-+ SCL_PSCL_EN_C);
-+ } else {
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE_C);
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN_C);
-+ }
-+ dm_write_reg(ctx, mmSCLV_MODE, value);
-+
-+ {
-+ value = dm_read_reg(ctx, mmSCLV_TAP_CONTROL);
-+
-+ set_reg_field_value(value, data->taps.h_taps - 1,
-+ SCLV_TAP_CONTROL, SCL_H_NUM_OF_TAPS);
-+
-+ set_reg_field_value(value, data->taps.v_taps - 1,
-+ SCLV_TAP_CONTROL, SCL_V_NUM_OF_TAPS);
-+
-+ set_reg_field_value(value, data->taps.h_taps_c - 1,
-+ SCLV_TAP_CONTROL, SCL_H_NUM_OF_TAPS_C);
-+
-+ set_reg_field_value(value, data->taps.v_taps_c - 1,
-+ SCLV_TAP_CONTROL, SCL_V_NUM_OF_TAPS_C);
-+
-+ dm_write_reg(ctx, mmSCLV_TAP_CONTROL, value);
-+ }
-+
-+ {
-+ /*
-+ * we can ignore this register because we are ok with hw
-+ * default 0 -- change to 1 according to dal2 code
-+ */
-+ value = dm_read_reg(ctx, mmSCLV_CONTROL);
-+ /*
-+ * 0 - Replaced out of bound pixels with black pixel
-+ * (or any other required color)
-+ */
-+ set_reg_field_value(value, 1, SCLV_CONTROL, SCL_BOUNDARY_MODE);
-+
-+ /* 1 - Replaced out of bound pixels with the edge pixel. */
-+ dm_write_reg(ctx, mmSCLV_CONTROL, value);
-+ }
-+
-+ return is_scaling_needed;
-+}
-+
-+/**
-+* Function:
-+* void program_overscan
-+*
-+* Purpose: Programs overscan border
-+* Input: overscan
-+*
-+* Output:
-+ void
-+*/
-+static void program_overscan(
-+ struct dce110_transform *xfm110,
-+ const struct overscan_info *overscan)
-+{
-+ uint32_t overscan_left_right = 0;
-+ uint32_t overscan_top_bottom = 0;
-+
-+ set_reg_field_value(overscan_left_right, overscan->left,
-+ SCLV_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_LEFT);
-+
-+ set_reg_field_value(overscan_left_right, overscan->right,
-+ SCLV_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_RIGHT);
-+
-+ set_reg_field_value(overscan_top_bottom, overscan->top,
-+ SCLV_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_TOP);
-+
-+ set_reg_field_value(overscan_top_bottom, overscan->bottom,
-+ SCLV_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_BOTTOM);
-+
-+ dm_write_reg(xfm110->base.ctx,
-+ mmSCLV_EXT_OVERSCAN_LEFT_RIGHT,
-+ overscan_left_right);
-+
-+ dm_write_reg(xfm110->base.ctx,
-+ mmSCLV_EXT_OVERSCAN_TOP_BOTTOM,
-+ overscan_top_bottom);
-+}
-+
-+static void program_two_taps_filter_horz(
-+ struct dce110_transform *xfm110,
-+ bool hardcode_coff)
-+{
-+ uint32_t value = 0;
-+
-+ if (hardcode_coff)
-+ set_reg_field_value(
-+ value,
-+ 1,
-+ SCLV_HORZ_FILTER_CONTROL,
-+ SCL_H_2TAP_HARDCODE_COEF_EN);
-+
-+ dm_write_reg(xfm110->base.ctx,
-+ mmSCLV_HORZ_FILTER_CONTROL,
-+ value);
-+}
-+
-+static void program_two_taps_filter_vert(
-+ struct dce110_transform *xfm110,
-+ bool hardcode_coff)
-+{
-+ uint32_t value = 0;
-+
-+ if (hardcode_coff)
-+ set_reg_field_value(value, 1, SCLV_VERT_FILTER_CONTROL,
-+ SCL_V_2TAP_HARDCODE_COEF_EN);
-+
-+ dm_write_reg(xfm110->base.ctx,
-+ mmSCLV_VERT_FILTER_CONTROL,
-+ value);
-+}
-+
-+static void set_coeff_update_complete(
-+ struct dce110_transform *xfm110)
-+{
-+ /*TODO: Until now, only scaler bypass, up-scaler 2 -TAPS coeff auto
-+ * calculation are implemented. Coefficient RAM is not used
-+ * Do not check this flag yet
-+ */
-+
-+ /*uint32_t value;
-+ uint32_t addr = xfm->regs[IDX_SCL_UPDATE];
-+
-+ value = dal_read_reg(xfm->ctx, addr);
-+ set_reg_field_value(value, 0,
-+ SCL_UPDATE, SCL_COEF_UPDATE_COMPLETE);
-+ dal_write_reg(xfm->ctx, addr, value);*/
-+}
-+
-+static bool program_multi_taps_filter(
-+ struct dce110_transform *xfm110,
-+ const struct scaler_data *data,
-+ bool horizontal)
-+{
-+ struct dc_context *ctx = xfm110->base.ctx;
-+
-+ NOT_IMPLEMENTED();
-+ return false;
-+}
-+
-+static void calculate_inits(
-+ struct dce110_transform *xfm110,
-+ const struct scaler_data *data,
-+ struct sclv_ratios_inits *inits,
-+ struct rect *luma_viewport,
-+ struct rect *chroma_viewport)
-+{
-+ if (data->dal_pixel_format == PIXEL_FORMAT_420BPP12 ||
-+ data->dal_pixel_format == PIXEL_FORMAT_422BPP16)
-+ inits->chroma_enable = true;
-+
-+ /* TODO: implement rest of this function properly */
-+ if (inits->chroma_enable) {
-+ inits->h_int_scale_ratio_luma = 0x1000000;
-+ inits->v_int_scale_ratio_luma = 0x1000000;
-+ inits->h_int_scale_ratio_chroma = 0x800000;
-+ inits->v_int_scale_ratio_chroma = 0x800000;
-+ }
-+}
-+
-+static void program_scl_ratios_inits(
-+ struct dce110_transform *xfm110,
-+ struct sclv_ratios_inits *inits)
-+{
-+ struct dc_context *ctx = xfm110->base.ctx;
-+ uint32_t addr = mmSCLV_HORZ_FILTER_SCALE_RATIO;
-+ uint32_t value = dm_read_reg(ctx, addr);
-+
-+ set_reg_field_value(
-+ value,
-+ inits->h_int_scale_ratio_luma,
-+ SCLV_HORZ_FILTER_SCALE_RATIO,
-+ SCL_H_SCALE_RATIO);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_VERT_FILTER_SCALE_RATIO;
-+ value = dm_read_reg(ctx, addr);
-+ set_reg_field_value(
-+ value,
-+ inits->v_int_scale_ratio_luma,
-+ SCLV_VERT_FILTER_SCALE_RATIO,
-+ SCL_V_SCALE_RATIO);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_HORZ_FILTER_SCALE_RATIO_C;
-+ value = dm_read_reg(ctx, addr);
-+ set_reg_field_value(
-+ value,
-+ inits->h_int_scale_ratio_chroma,
-+ SCLV_HORZ_FILTER_SCALE_RATIO_C,
-+ SCL_H_SCALE_RATIO_C);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_VERT_FILTER_SCALE_RATIO_C;
-+ value = dm_read_reg(ctx, addr);
-+ set_reg_field_value(
-+ value,
-+ inits->v_int_scale_ratio_chroma,
-+ SCLV_VERT_FILTER_SCALE_RATIO_C,
-+ SCL_V_SCALE_RATIO_C);
-+ dm_write_reg(ctx, addr, value);
-+}
-+
-+static void dce110_transform_v_set_scalerv_bypass(struct transform *xfm)
-+{
-+ uint32_t addr = mmSCLV_MODE;
-+ uint32_t value = dm_read_reg(xfm->ctx, addr);
-+
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE);
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_MODE_C);
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN);
-+ set_reg_field_value(value, 0, SCLV_MODE, SCL_PSCL_EN_C);
-+ dm_write_reg(xfm->ctx, addr, value);
-+}
-+
-+/* TODO: sync this one with DAL2 */
-+static bool dce110_transform_v_set_scaler(
-+ struct transform *xfm,
-+ const struct scaler_data *data)
-+{
-+ struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
-+ bool is_scaling_required;
-+ struct rect luma_viewport = {0};
-+ struct rect chroma_viewport = {0};
-+ struct dc_context *ctx = xfm->ctx;
-+
-+ /* 1. Lock Scaler TODO: enable?*/
-+ /*set_scaler_update_lock(xfm, true);*/
-+
-+ /* 2. Calculate viewport, viewport programming should happen after init
-+ * calculations as they may require an adjustment in the viewport.
-+ */
-+
-+ calculate_viewport(data, &luma_viewport, &chroma_viewport);
-+
-+ /* 3. Program overscan */
-+ program_overscan(xfm110, &data->overscan);
-+
-+ /* 4. Program taps and configuration */
-+ is_scaling_required = setup_scaling_configuration(xfm110, data);
-+
-+ if (is_scaling_required) {
-+ /* 5. Calculate and program ratio, filter initialization */
-+
-+ struct sclv_ratios_inits inits = { 0 };
-+
-+ calculate_inits(
-+ xfm110,
-+ data,
-+ &inits,
-+ &luma_viewport,
-+ &chroma_viewport);
-+
-+ program_scl_ratios_inits(xfm110, &inits);
-+
-+ /*scaler coeff of 2-TAPS use hardware auto calculated value*/
-+
-+ /* 6. Program vertical filters */
-+ if (data->taps.v_taps > 2) {
-+ program_two_taps_filter_vert(xfm110, false);
-+
-+ if (!program_multi_taps_filter(xfm110, data, false)) {
-+ dal_logger_write(ctx->logger,
-+ LOG_MAJOR_DCP,
-+ LOG_MINOR_DCP_SCALER,
-+ "Failed vertical taps programming\n");
-+ return false;
-+ }
-+ } else
-+ program_two_taps_filter_vert(xfm110, true);
-+
-+ /* 7. Program horizontal filters */
-+ if (data->taps.h_taps > 2) {
-+ program_two_taps_filter_horz(xfm110, false);
-+
-+ if (!program_multi_taps_filter(xfm110, data, true)) {
-+ dal_logger_write(ctx->logger,
-+ LOG_MAJOR_DCP,
-+ LOG_MINOR_DCP_SCALER,
-+ "Failed horizontal taps programming\n");
-+ return false;
-+ }
-+ } else
-+ program_two_taps_filter_horz(xfm110, true);
-+ }
-+
-+ /* 8. Program the viewport */
-+ if (data->flags.bits.SHOULD_PROGRAM_VIEWPORT)
-+ program_viewport(xfm110, &luma_viewport, &chroma_viewport);
-+
-+ /* 9. Unlock the Scaler TODO: enable?
-+ * Every call to "set_scaler_update_lock(xfm, TRUE)"
-+ * must have a corresponding call to
-+ * "set_scaler_update_lock(xfm, FALSE)" */
-+
-+ /*set_scaler_update_lock(xfm, false);*/
-+
-+ /* TODO: investigate purpose/need of SHOULD_UNLOCK */
-+ if (data->flags.bits.SHOULD_UNLOCK == false)
-+ set_coeff_update_complete(xfm110);
-+
-+ return true;
-+}
-+
-+static bool dce110_transform_v_power_up_line_buffer(struct transform *xfm)
-+{
-+ struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
-+ uint32_t value;
-+
-+ value = dm_read_reg(xfm110->base.ctx, mmLBV_MEMORY_CTRL);
-+
-+ /*Use all three pieces of memory always*/
-+ set_reg_field_value(value, 0, LBV_MEMORY_CTRL, LB_MEMORY_CONFIG);
-+ /*hard coded number DCE11 1712(0x6B0) Partitions: 720/960/1712*/
-+ set_reg_field_value(value, LB_TOTAL_NUMBER_OF_ENTRIES, LBV_MEMORY_CTRL,
-+ LB_MEMORY_SIZE);
-+
-+ dm_write_reg(xfm110->base.ctx, mmLBV_MEMORY_CTRL, value);
-+
-+ return true;
-+}
-+
-+static void get_viewport(
-+ struct dce110_transform *xfm110,
-+ struct rect *current_view_port)
-+{
-+ uint32_t value_start;
-+ uint32_t value_size;
-+
-+ if (current_view_port == NULL)
-+ return;
-+
-+ value_start = dm_read_reg(xfm110->base.ctx, mmSCLV_VIEWPORT_START);
-+ value_size = dm_read_reg(xfm110->base.ctx, mmSCLV_VIEWPORT_SIZE);
-+
-+ current_view_port->x = get_reg_field_value(
-+ value_start,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_X_START);
-+ current_view_port->y = get_reg_field_value(
-+ value_start,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_Y_START);
-+ current_view_port->height = get_reg_field_value(
-+ value_size,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_HEIGHT);
-+ current_view_port->width = get_reg_field_value(
-+ value_size,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_WIDTH);
-+}
-+
-+static void program_luma_viewport(
-+ struct dce110_transform *xfm110,
-+ const struct rect *view_port)
-+{
-+ struct dc_context *ctx = xfm110->base.ctx;
-+ uint32_t value = 0;
-+ uint32_t addr = 0;
-+
-+ addr = mmSCLV_VIEWPORT_START;
-+ value = dm_read_reg(ctx, addr);
-+ set_reg_field_value(
-+ value,
-+ view_port->x,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_X_START);
-+ set_reg_field_value(
-+ value,
-+ view_port->y,
-+ SCLV_VIEWPORT_START,
-+ VIEWPORT_Y_START);
-+ dm_write_reg(ctx, addr, value);
-+
-+ addr = mmSCLV_VIEWPORT_SIZE;
-+ value = dm_read_reg(ctx, addr);
-+ set_reg_field_value(
-+ value,
-+ view_port->height,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_HEIGHT);
-+ set_reg_field_value(
-+ value,
-+ view_port->width,
-+ SCLV_VIEWPORT_SIZE,
-+ VIEWPORT_WIDTH);
-+ dm_write_reg(ctx, addr, value);
-+
-+ /* TODO: add stereo support */
-+}
-+
-+static bool dce110_transform_v_update_viewport(
-+ struct transform *xfm,
-+ const struct rect *view_port,
-+ bool is_fbc_attached)
-+{
-+ struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
-+ bool program_req = false;
-+ struct rect current_view_port;
-+
-+ if (view_port == NULL)
-+ return program_req;
-+
-+ get_viewport(xfm110, &current_view_port);
-+
-+ if (current_view_port.x != view_port->x ||
-+ current_view_port.y != view_port->y ||
-+ current_view_port.height != view_port->height ||
-+ current_view_port.width != view_port->width)
-+ program_req = true;
-+
-+ if (program_req) {
-+ /*underlay viewport is programmed with scaler
-+ *program_viewport function pointer is not exposed*/
-+ program_luma_viewport(xfm110, view_port);
-+ }
-+
-+ return program_req;
-+}
-+
-+static struct transform_funcs dce110_transform_v_funcs = {
-+ .transform_power_up =
-+ dce110_transform_v_power_up_line_buffer,
-+ .transform_set_scaler =
-+ dce110_transform_v_set_scaler,
-+ .transform_set_scaler_bypass =
-+ dce110_transform_v_set_scalerv_bypass,
-+ .transform_update_viewport =
-+ dce110_transform_v_update_viewport,
-+ .transform_set_scaler_filter =
-+ dce110_transform_set_scaler_filter,
-+ .transform_set_gamut_remap =
-+ dce110_transform_set_gamut_remap,
-+ .transform_set_pixel_storage_depth =
-+ dce110_transform_v_set_pixel_storage_depth,
-+ .transform_get_current_pixel_storage_depth =
-+ dce110_transform_v_get_current_pixel_storage_depth
-+};
-+/*****************************************/
-+/* Constructor, Destructor */
-+/*****************************************/
-+
-+bool dce110_transform_v_construct(
-+ struct dce110_transform *xfm110,
-+ struct dc_context *ctx)
-+{
-+ xfm110->base.ctx = ctx;
-+
-+ xfm110->base.funcs = &dce110_transform_v_funcs;
-+
-+ xfm110->lb_pixel_depth_supported =
-+ LB_PIXEL_DEPTH_18BPP |
-+ LB_PIXEL_DEPTH_24BPP |
-+ LB_PIXEL_DEPTH_30BPP;
-+
-+ return true;
-+}
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.h
-new file mode 100644
-index 0000000..b51bd78
---- /dev/null
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_v.h
-@@ -0,0 +1,44 @@
-+/* Copyright 2012-15 Advanced Micro Devices, Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: AMD
-+ *
-+ */
-+
-+#ifndef __DAL_TRANSFORM_V_DCE110_H__
-+#define __DAL_TRANSFORM_V_DCE110_H__
-+
-+#include "inc/transform.h"
-+#include "include/grph_csc_types.h"
-+
-+bool dce110_transform_v_construct(
-+ struct dce110_transform *xfm110,
-+ struct dc_context *ctx);
-+
-+bool dce110_transform_v_get_current_pixel_storage_depth(
-+ struct transform *xfm,
-+ enum lb_pixel_depth *depth);
-+
-+bool dce110_transform_v_set_pixel_storage_depth(
-+ struct transform *xfm,
-+ enum lb_pixel_depth depth,
-+ const struct bit_depth_reduction_params *bit_depth_params);
-+
-+#endif
---
-2.7.4
-