14562236bSHarry Wentland /*
24562236bSHarry Wentland  * Copyright 2012-16 Advanced Micro Devices, Inc.
34562236bSHarry Wentland  *
44562236bSHarry Wentland  * Permission is hereby granted, free of charge, to any person obtaining a
54562236bSHarry Wentland  * copy of this software and associated documentation files (the "Software"),
64562236bSHarry Wentland  * to deal in the Software without restriction, including without limitation
74562236bSHarry Wentland  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84562236bSHarry Wentland  * and/or sell copies of the Software, and to permit persons to whom the
94562236bSHarry Wentland  * Software is furnished to do so, subject to the following conditions:
104562236bSHarry Wentland  *
114562236bSHarry Wentland  * The above copyright notice and this permission notice shall be included in
124562236bSHarry Wentland  * all copies or substantial portions of the Software.
134562236bSHarry Wentland  *
144562236bSHarry Wentland  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154562236bSHarry Wentland  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164562236bSHarry Wentland  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
174562236bSHarry Wentland  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
184562236bSHarry Wentland  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194562236bSHarry Wentland  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204562236bSHarry Wentland  * OTHER DEALINGS IN THE SOFTWARE.
214562236bSHarry Wentland  *
224562236bSHarry Wentland  * Authors: AMD
234562236bSHarry Wentland  *
244562236bSHarry Wentland  */
254562236bSHarry Wentland #include "dm_services.h"
264562236bSHarry Wentland 
274562236bSHarry Wentland #include "dce/dce_11_0_d.h"
284562236bSHarry Wentland #include "dce/dce_11_0_sh_mask.h"
294562236bSHarry Wentland /* TODO: this needs to be looked at, used by Stella's workaround*/
304562236bSHarry Wentland #include "gmc/gmc_8_2_d.h"
314562236bSHarry Wentland #include "gmc/gmc_8_2_sh_mask.h"
324562236bSHarry Wentland 
334562236bSHarry Wentland #include "include/logger_interface.h"
345e141de4SHarry Wentland #include "inc/dce_calcs.h"
354562236bSHarry Wentland 
36c3489214SDmytro Laktyushkin #include "dce/dce_mem_input.h"
3767bb3193SLee Jones #include "dce110_mem_input_v.h"
384562236bSHarry Wentland 
set_flip_control(struct dce_mem_input * mem_input110,bool immediate)394562236bSHarry Wentland static void set_flip_control(
40c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
414562236bSHarry Wentland 	bool immediate)
424562236bSHarry Wentland {
434562236bSHarry Wentland 	uint32_t value = 0;
444562236bSHarry Wentland 
454562236bSHarry Wentland 	value = dm_read_reg(
464562236bSHarry Wentland 			mem_input110->base.ctx,
47c3489214SDmytro Laktyushkin 			mmUNP_FLIP_CONTROL);
484562236bSHarry Wentland 
494562236bSHarry Wentland 	set_reg_field_value(value, 1,
504562236bSHarry Wentland 			UNP_FLIP_CONTROL,
514562236bSHarry Wentland 			GRPH_SURFACE_UPDATE_PENDING_MODE);
524562236bSHarry Wentland 
534562236bSHarry Wentland 	dm_write_reg(
544562236bSHarry Wentland 			mem_input110->base.ctx,
55c3489214SDmytro Laktyushkin 			mmUNP_FLIP_CONTROL,
564562236bSHarry Wentland 			value);
574562236bSHarry Wentland }
584562236bSHarry Wentland 
594562236bSHarry Wentland /* chroma part */
program_pri_addr_c(struct dce_mem_input * mem_input110,PHYSICAL_ADDRESS_LOC address)604562236bSHarry Wentland static void program_pri_addr_c(
61c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
624562236bSHarry Wentland 	PHYSICAL_ADDRESS_LOC address)
634562236bSHarry Wentland {
644562236bSHarry Wentland 	uint32_t value = 0;
654562236bSHarry Wentland 	uint32_t temp = 0;
664562236bSHarry Wentland 	/*high register MUST be programmed first*/
674562236bSHarry Wentland 	temp = address.high_part &
684562236bSHarry Wentland UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C_MASK;
694562236bSHarry Wentland 
704562236bSHarry Wentland 	set_reg_field_value(value, temp,
714562236bSHarry Wentland 		UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C,
724562236bSHarry Wentland 		GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C);
734562236bSHarry Wentland 
744562236bSHarry Wentland 	dm_write_reg(
754562236bSHarry Wentland 		mem_input110->base.ctx,
76c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C,
774562236bSHarry Wentland 		value);
784562236bSHarry Wentland 
794562236bSHarry Wentland 	temp = 0;
804562236bSHarry Wentland 	value = 0;
814562236bSHarry Wentland 	temp = address.low_part >>
824562236bSHarry Wentland 	UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C__GRPH_PRIMARY_SURFACE_ADDRESS_C__SHIFT;
834562236bSHarry Wentland 
844562236bSHarry Wentland 	set_reg_field_value(value, temp,
854562236bSHarry Wentland 		UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C,
864562236bSHarry Wentland 		GRPH_PRIMARY_SURFACE_ADDRESS_C);
874562236bSHarry Wentland 
884562236bSHarry Wentland 	dm_write_reg(
894562236bSHarry Wentland 		mem_input110->base.ctx,
90c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_C,
914562236bSHarry Wentland 		value);
924562236bSHarry Wentland }
934562236bSHarry Wentland 
944562236bSHarry Wentland /* luma part */
program_pri_addr_l(struct dce_mem_input * mem_input110,PHYSICAL_ADDRESS_LOC address)954562236bSHarry Wentland static void program_pri_addr_l(
96c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
974562236bSHarry Wentland 	PHYSICAL_ADDRESS_LOC address)
984562236bSHarry Wentland {
994562236bSHarry Wentland 	uint32_t value = 0;
1004562236bSHarry Wentland 	uint32_t temp = 0;
1014562236bSHarry Wentland 
1024562236bSHarry Wentland 	/*high register MUST be programmed first*/
1034562236bSHarry Wentland 	temp = address.high_part &
1044562236bSHarry Wentland UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L_MASK;
1054562236bSHarry Wentland 
1064562236bSHarry Wentland 	set_reg_field_value(value, temp,
1074562236bSHarry Wentland 		UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L,
1084562236bSHarry Wentland 		GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L);
1094562236bSHarry Wentland 
1104562236bSHarry Wentland 	dm_write_reg(
1114562236bSHarry Wentland 		mem_input110->base.ctx,
112c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L,
1134562236bSHarry Wentland 		value);
1144562236bSHarry Wentland 
1154562236bSHarry Wentland 	temp = 0;
1164562236bSHarry Wentland 	value = 0;
1174562236bSHarry Wentland 	temp = address.low_part >>
1184562236bSHarry Wentland 	UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L__GRPH_PRIMARY_SURFACE_ADDRESS_L__SHIFT;
1194562236bSHarry Wentland 
1204562236bSHarry Wentland 	set_reg_field_value(value, temp,
1214562236bSHarry Wentland 		UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L,
1224562236bSHarry Wentland 		GRPH_PRIMARY_SURFACE_ADDRESS_L);
1234562236bSHarry Wentland 
1244562236bSHarry Wentland 	dm_write_reg(
1254562236bSHarry Wentland 		mem_input110->base.ctx,
126c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_L,
1274562236bSHarry Wentland 		value);
1284562236bSHarry Wentland }
1294562236bSHarry Wentland 
program_addr(struct dce_mem_input * mem_input110,const struct dc_plane_address * addr)1304562236bSHarry Wentland static void program_addr(
131c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
1324562236bSHarry Wentland 	const struct dc_plane_address *addr)
1334562236bSHarry Wentland {
1344562236bSHarry Wentland 	switch (addr->type) {
1354562236bSHarry Wentland 	case PLN_ADDR_TYPE_GRAPHICS:
1364562236bSHarry Wentland 		program_pri_addr_l(
1374562236bSHarry Wentland 			mem_input110,
1384562236bSHarry Wentland 			addr->grph.addr);
1394562236bSHarry Wentland 		break;
1404562236bSHarry Wentland 	case PLN_ADDR_TYPE_VIDEO_PROGRESSIVE:
1414562236bSHarry Wentland 		program_pri_addr_c(
1424562236bSHarry Wentland 			mem_input110,
1434562236bSHarry Wentland 			addr->video_progressive.chroma_addr);
1440a1c73ecSShirish S 		program_pri_addr_l(
1450a1c73ecSShirish S 			mem_input110,
1460a1c73ecSShirish S 			addr->video_progressive.luma_addr);
1474562236bSHarry Wentland 		break;
1484562236bSHarry Wentland 	default:
1494562236bSHarry Wentland 		/* not supported */
1504562236bSHarry Wentland 		BREAK_TO_DEBUGGER();
1514562236bSHarry Wentland 	}
1524562236bSHarry Wentland }
1534562236bSHarry Wentland 
enable(struct dce_mem_input * mem_input110)154c3489214SDmytro Laktyushkin static void enable(struct dce_mem_input *mem_input110)
1554562236bSHarry Wentland {
1564562236bSHarry Wentland 	uint32_t value = 0;
1574562236bSHarry Wentland 
158c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_GRPH_ENABLE);
1594562236bSHarry Wentland 	set_reg_field_value(value, 1, UNP_GRPH_ENABLE, GRPH_ENABLE);
1604562236bSHarry Wentland 	dm_write_reg(mem_input110->base.ctx,
161c3489214SDmytro Laktyushkin 		mmUNP_GRPH_ENABLE,
1624562236bSHarry Wentland 		value);
1634562236bSHarry Wentland }
1644562236bSHarry Wentland 
program_tiling(struct dce_mem_input * mem_input110,const union dc_tiling_info * info,const enum surface_pixel_format pixel_format)1654562236bSHarry Wentland static void program_tiling(
166c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
1674562236bSHarry Wentland 	const union dc_tiling_info *info,
1684562236bSHarry Wentland 	const enum surface_pixel_format pixel_format)
1694562236bSHarry Wentland {
1704562236bSHarry Wentland 	uint32_t value = 0;
1714562236bSHarry Wentland 
1724562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.num_banks,
1734562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_NUM_BANKS);
1744562236bSHarry Wentland 
1754562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.bank_width,
1764562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_BANK_WIDTH_L);
1774562236bSHarry Wentland 
1784562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.bank_height,
1794562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_BANK_HEIGHT_L);
1804562236bSHarry Wentland 
1814562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_aspect,
1824562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_MACRO_TILE_ASPECT_L);
1834562236bSHarry Wentland 
1844562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_split,
1854562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_TILE_SPLIT_L);
1864562236bSHarry Wentland 
1874562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_mode,
1884562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_MICRO_TILE_MODE_L);
1894562236bSHarry Wentland 
1904562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.pipe_config,
1914562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_PIPE_CONFIG);
1924562236bSHarry Wentland 
1934562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.array_mode,
1944562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_ARRAY_MODE);
1954562236bSHarry Wentland 
1964562236bSHarry Wentland 	set_reg_field_value(value, 1,
1974562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_COLOR_EXPANSION_MODE);
1984562236bSHarry Wentland 
1994562236bSHarry Wentland 	set_reg_field_value(value, 0,
2004562236bSHarry Wentland 		UNP_GRPH_CONTROL, GRPH_Z);
2014562236bSHarry Wentland 
2024562236bSHarry Wentland 	dm_write_reg(
2034562236bSHarry Wentland 		mem_input110->base.ctx,
2044562236bSHarry Wentland 		mmUNP_GRPH_CONTROL,
2054562236bSHarry Wentland 		value);
2064562236bSHarry Wentland 
2074562236bSHarry Wentland 	value = 0;
2084562236bSHarry Wentland 
2094562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.bank_width_c,
2104562236bSHarry Wentland 		UNP_GRPH_CONTROL_C, GRPH_BANK_WIDTH_C);
2114562236bSHarry Wentland 
2124562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.bank_height_c,
2134562236bSHarry Wentland 		UNP_GRPH_CONTROL_C, GRPH_BANK_HEIGHT_C);
2144562236bSHarry Wentland 
2154562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_aspect_c,
2164562236bSHarry Wentland 		UNP_GRPH_CONTROL_C, GRPH_MACRO_TILE_ASPECT_C);
2174562236bSHarry Wentland 
2184562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_split_c,
2194562236bSHarry Wentland 		UNP_GRPH_CONTROL_C, GRPH_TILE_SPLIT_C);
2204562236bSHarry Wentland 
2214562236bSHarry Wentland 	set_reg_field_value(value, info->gfx8.tile_mode_c,
2224562236bSHarry Wentland 		UNP_GRPH_CONTROL_C, GRPH_MICRO_TILE_MODE_C);
2234562236bSHarry Wentland 
2244562236bSHarry Wentland 	dm_write_reg(
2254562236bSHarry Wentland 		mem_input110->base.ctx,
2264562236bSHarry Wentland 		mmUNP_GRPH_CONTROL_C,
2274562236bSHarry Wentland 		value);
2284562236bSHarry Wentland }
2294562236bSHarry Wentland 
program_size_and_rotation(struct dce_mem_input * mem_input110,enum dc_rotation_angle rotation,const struct plane_size * plane_size)2304562236bSHarry Wentland static void program_size_and_rotation(
231c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
2324562236bSHarry Wentland 	enum dc_rotation_angle rotation,
23312e2b2d4SDmytro Laktyushkin 	const struct plane_size *plane_size)
2344562236bSHarry Wentland {
2354562236bSHarry Wentland 	uint32_t value = 0;
23612e2b2d4SDmytro Laktyushkin 	struct plane_size local_size = *plane_size;
2374562236bSHarry Wentland 
2384562236bSHarry Wentland 	if (rotation == ROTATION_ANGLE_90 ||
2394562236bSHarry Wentland 		rotation == ROTATION_ANGLE_270) {
2404562236bSHarry Wentland 
24112e2b2d4SDmytro Laktyushkin 		swap(local_size.surface_size.x,
24212e2b2d4SDmytro Laktyushkin 		     local_size.surface_size.y);
24312e2b2d4SDmytro Laktyushkin 		swap(local_size.surface_size.width,
24412e2b2d4SDmytro Laktyushkin 		     local_size.surface_size.height);
24512e2b2d4SDmytro Laktyushkin 		swap(local_size.chroma_size.x,
24612e2b2d4SDmytro Laktyushkin 		     local_size.chroma_size.y);
24712e2b2d4SDmytro Laktyushkin 		swap(local_size.chroma_size.width,
24812e2b2d4SDmytro Laktyushkin 		     local_size.chroma_size.height);
2494562236bSHarry Wentland 	}
2504562236bSHarry Wentland 
2514562236bSHarry Wentland 	value = 0;
25212e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.surface_pitch,
2534562236bSHarry Wentland 			UNP_GRPH_PITCH_L, GRPH_PITCH_L);
2544562236bSHarry Wentland 
2554562236bSHarry Wentland 	dm_write_reg(
2564562236bSHarry Wentland 		mem_input110->base.ctx,
257c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PITCH_L,
2584562236bSHarry Wentland 		value);
2594562236bSHarry Wentland 
2604562236bSHarry Wentland 	value = 0;
26112e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.chroma_pitch,
2624562236bSHarry Wentland 			UNP_GRPH_PITCH_C, GRPH_PITCH_C);
2634562236bSHarry Wentland 	dm_write_reg(
2644562236bSHarry Wentland 		mem_input110->base.ctx,
265c3489214SDmytro Laktyushkin 		mmUNP_GRPH_PITCH_C,
2664562236bSHarry Wentland 		value);
2674562236bSHarry Wentland 
2684562236bSHarry Wentland 	value = 0;
2694562236bSHarry Wentland 	set_reg_field_value(value, 0,
2704562236bSHarry Wentland 			UNP_GRPH_X_START_L, GRPH_X_START_L);
2714562236bSHarry Wentland 	dm_write_reg(
2724562236bSHarry Wentland 		mem_input110->base.ctx,
273c3489214SDmytro Laktyushkin 		mmUNP_GRPH_X_START_L,
2744562236bSHarry Wentland 		value);
2754562236bSHarry Wentland 
2764562236bSHarry Wentland 	value = 0;
2774562236bSHarry Wentland 	set_reg_field_value(value, 0,
2784562236bSHarry Wentland 			UNP_GRPH_X_START_C, GRPH_X_START_C);
2794562236bSHarry Wentland 	dm_write_reg(
2804562236bSHarry Wentland 		mem_input110->base.ctx,
281c3489214SDmytro Laktyushkin 		mmUNP_GRPH_X_START_C,
2824562236bSHarry Wentland 		value);
2834562236bSHarry Wentland 
2844562236bSHarry Wentland 	value = 0;
2854562236bSHarry Wentland 	set_reg_field_value(value, 0,
2864562236bSHarry Wentland 			UNP_GRPH_Y_START_L, GRPH_Y_START_L);
2874562236bSHarry Wentland 	dm_write_reg(
2884562236bSHarry Wentland 		mem_input110->base.ctx,
289c3489214SDmytro Laktyushkin 		mmUNP_GRPH_Y_START_L,
2904562236bSHarry Wentland 		value);
2914562236bSHarry Wentland 
2924562236bSHarry Wentland 	value = 0;
2934562236bSHarry Wentland 	set_reg_field_value(value, 0,
2944562236bSHarry Wentland 			UNP_GRPH_Y_START_C, GRPH_Y_START_C);
2954562236bSHarry Wentland 	dm_write_reg(
2964562236bSHarry Wentland 		mem_input110->base.ctx,
297c3489214SDmytro Laktyushkin 		mmUNP_GRPH_Y_START_C,
2984562236bSHarry Wentland 		value);
2994562236bSHarry Wentland 
3004562236bSHarry Wentland 	value = 0;
30112e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.surface_size.x +
30212e2b2d4SDmytro Laktyushkin 			local_size.surface_size.width,
3034562236bSHarry Wentland 			UNP_GRPH_X_END_L, GRPH_X_END_L);
3044562236bSHarry Wentland 	dm_write_reg(
3054562236bSHarry Wentland 		mem_input110->base.ctx,
306c3489214SDmytro Laktyushkin 		mmUNP_GRPH_X_END_L,
3074562236bSHarry Wentland 		value);
3084562236bSHarry Wentland 
3094562236bSHarry Wentland 	value = 0;
31012e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.chroma_size.x +
31112e2b2d4SDmytro Laktyushkin 			local_size.chroma_size.width,
3124562236bSHarry Wentland 			UNP_GRPH_X_END_C, GRPH_X_END_C);
3134562236bSHarry Wentland 	dm_write_reg(
3144562236bSHarry Wentland 		mem_input110->base.ctx,
315c3489214SDmytro Laktyushkin 		mmUNP_GRPH_X_END_C,
3164562236bSHarry Wentland 		value);
3174562236bSHarry Wentland 
3184562236bSHarry Wentland 	value = 0;
31912e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.surface_size.y +
32012e2b2d4SDmytro Laktyushkin 			local_size.surface_size.height,
3214562236bSHarry Wentland 			UNP_GRPH_Y_END_L, GRPH_Y_END_L);
3224562236bSHarry Wentland 	dm_write_reg(
3234562236bSHarry Wentland 		mem_input110->base.ctx,
324c3489214SDmytro Laktyushkin 		mmUNP_GRPH_Y_END_L,
3254562236bSHarry Wentland 		value);
3264562236bSHarry Wentland 
3274562236bSHarry Wentland 	value = 0;
32812e2b2d4SDmytro Laktyushkin 	set_reg_field_value(value, local_size.chroma_size.y +
32912e2b2d4SDmytro Laktyushkin 			local_size.chroma_size.height,
3304562236bSHarry Wentland 			UNP_GRPH_Y_END_C, GRPH_Y_END_C);
3314562236bSHarry Wentland 	dm_write_reg(
3324562236bSHarry Wentland 		mem_input110->base.ctx,
333c3489214SDmytro Laktyushkin 		mmUNP_GRPH_Y_END_C,
3344562236bSHarry Wentland 		value);
3354562236bSHarry Wentland 
3364562236bSHarry Wentland 	value = 0;
3374562236bSHarry Wentland 	switch (rotation) {
3384562236bSHarry Wentland 	case ROTATION_ANGLE_90:
3394562236bSHarry Wentland 		set_reg_field_value(value, 3,
3404562236bSHarry Wentland 			UNP_HW_ROTATION, ROTATION_ANGLE);
3414562236bSHarry Wentland 		break;
3424562236bSHarry Wentland 	case ROTATION_ANGLE_180:
3434562236bSHarry Wentland 		set_reg_field_value(value, 2,
3444562236bSHarry Wentland 			UNP_HW_ROTATION, ROTATION_ANGLE);
3454562236bSHarry Wentland 		break;
3464562236bSHarry Wentland 	case ROTATION_ANGLE_270:
3474562236bSHarry Wentland 		set_reg_field_value(value, 1,
3484562236bSHarry Wentland 			UNP_HW_ROTATION, ROTATION_ANGLE);
3494562236bSHarry Wentland 		break;
3504562236bSHarry Wentland 	default:
3514562236bSHarry Wentland 		set_reg_field_value(value, 0,
3524562236bSHarry Wentland 			UNP_HW_ROTATION, ROTATION_ANGLE);
3534562236bSHarry Wentland 		break;
3544562236bSHarry Wentland 	}
3554562236bSHarry Wentland 
3564562236bSHarry Wentland 	dm_write_reg(
3574562236bSHarry Wentland 		mem_input110->base.ctx,
358c3489214SDmytro Laktyushkin 		mmUNP_HW_ROTATION,
3594562236bSHarry Wentland 		value);
3604562236bSHarry Wentland }
3614562236bSHarry Wentland 
program_pixel_format(struct dce_mem_input * mem_input110,enum surface_pixel_format format)3624562236bSHarry Wentland static void program_pixel_format(
363c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110,
3644562236bSHarry Wentland 	enum surface_pixel_format format)
3654562236bSHarry Wentland {
3664562236bSHarry Wentland 	if (format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
3674562236bSHarry Wentland 		uint32_t value;
3684562236bSHarry Wentland 		uint8_t grph_depth;
3694562236bSHarry Wentland 		uint8_t grph_format;
3704562236bSHarry Wentland 
3714562236bSHarry Wentland 		value =	dm_read_reg(
3724562236bSHarry Wentland 				mem_input110->base.ctx,
373c3489214SDmytro Laktyushkin 				mmUNP_GRPH_CONTROL);
3744562236bSHarry Wentland 
3754562236bSHarry Wentland 		switch (format) {
3764562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_PALETA_256_COLORS:
3774562236bSHarry Wentland 			grph_depth = 0;
3784562236bSHarry Wentland 			grph_format = 0;
3794562236bSHarry Wentland 			break;
3804562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
3814562236bSHarry Wentland 			grph_depth = 1;
3824562236bSHarry Wentland 			grph_format = 1;
3834562236bSHarry Wentland 			break;
3844562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
3858693049aSTony Cheng 		case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
3864562236bSHarry Wentland 			grph_depth = 2;
3874562236bSHarry Wentland 			grph_format = 0;
3884562236bSHarry Wentland 			break;
3894562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
3904562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
3914562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
3924562236bSHarry Wentland 			grph_depth = 2;
3934562236bSHarry Wentland 			grph_format = 1;
3944562236bSHarry Wentland 			break;
3954562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
396*050cd3d6SMario Kleiner 		case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
3974562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
3984562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
3994562236bSHarry Wentland 			grph_depth = 3;
4004562236bSHarry Wentland 			grph_format = 0;
4014562236bSHarry Wentland 			break;
4024562236bSHarry Wentland 		default:
4034562236bSHarry Wentland 			grph_depth = 2;
4044562236bSHarry Wentland 			grph_format = 0;
4054562236bSHarry Wentland 			break;
4064562236bSHarry Wentland 		}
4074562236bSHarry Wentland 
4084562236bSHarry Wentland 		set_reg_field_value(
4094562236bSHarry Wentland 				value,
4104562236bSHarry Wentland 				grph_depth,
4114562236bSHarry Wentland 				UNP_GRPH_CONTROL,
4124562236bSHarry Wentland 				GRPH_DEPTH);
4134562236bSHarry Wentland 		set_reg_field_value(
4144562236bSHarry Wentland 				value,
4154562236bSHarry Wentland 				grph_format,
4164562236bSHarry Wentland 				UNP_GRPH_CONTROL,
4174562236bSHarry Wentland 				GRPH_FORMAT);
4184562236bSHarry Wentland 
4194562236bSHarry Wentland 		dm_write_reg(
4204562236bSHarry Wentland 				mem_input110->base.ctx,
421c3489214SDmytro Laktyushkin 				mmUNP_GRPH_CONTROL,
4224562236bSHarry Wentland 				value);
4234562236bSHarry Wentland 
4244562236bSHarry Wentland 		value =	dm_read_reg(
4254562236bSHarry Wentland 				mem_input110->base.ctx,
426c3489214SDmytro Laktyushkin 				mmUNP_GRPH_CONTROL_EXP);
4274562236bSHarry Wentland 
4284562236bSHarry Wentland 		/* VIDEO FORMAT 0 */
4294562236bSHarry Wentland 		set_reg_field_value(
4304562236bSHarry Wentland 				value,
4314562236bSHarry Wentland 				0,
4324562236bSHarry Wentland 				UNP_GRPH_CONTROL_EXP,
4334562236bSHarry Wentland 				VIDEO_FORMAT);
4344562236bSHarry Wentland 		dm_write_reg(
4354562236bSHarry Wentland 				mem_input110->base.ctx,
436c3489214SDmytro Laktyushkin 				mmUNP_GRPH_CONTROL_EXP,
4374562236bSHarry Wentland 				value);
4384562236bSHarry Wentland 
4394562236bSHarry Wentland 	} else {
4404562236bSHarry Wentland 		/* Video 422 and 420 needs UNP_GRPH_CONTROL_EXP programmed */
4414562236bSHarry Wentland 		uint32_t value;
4424562236bSHarry Wentland 		uint8_t video_format;
4434562236bSHarry Wentland 
4444562236bSHarry Wentland 		value =	dm_read_reg(
4454562236bSHarry Wentland 				mem_input110->base.ctx,
446c3489214SDmytro Laktyushkin 				mmUNP_GRPH_CONTROL_EXP);
4474562236bSHarry Wentland 
4484562236bSHarry Wentland 		switch (format) {
4494562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
4504562236bSHarry Wentland 			video_format = 2;
4514562236bSHarry Wentland 			break;
4524562236bSHarry Wentland 		case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb:
4534562236bSHarry Wentland 			video_format = 3;
4544562236bSHarry Wentland 			break;
4554562236bSHarry Wentland 		default:
4564562236bSHarry Wentland 			video_format = 0;
4574562236bSHarry Wentland 			break;
4584562236bSHarry Wentland 		}
4594562236bSHarry Wentland 
4604562236bSHarry Wentland 		set_reg_field_value(
4614562236bSHarry Wentland 			value,
4624562236bSHarry Wentland 			video_format,
4634562236bSHarry Wentland 			UNP_GRPH_CONTROL_EXP,
4644562236bSHarry Wentland 			VIDEO_FORMAT);
4654562236bSHarry Wentland 
4664562236bSHarry Wentland 		dm_write_reg(
4674562236bSHarry Wentland 			mem_input110->base.ctx,
468c3489214SDmytro Laktyushkin 			mmUNP_GRPH_CONTROL_EXP,
4694562236bSHarry Wentland 			value);
4704562236bSHarry Wentland 	}
4714562236bSHarry Wentland }
4724562236bSHarry Wentland 
dce_mem_input_v_is_surface_pending(struct mem_input * mem_input)473a41bf9b8SLee Jones static bool dce_mem_input_v_is_surface_pending(struct mem_input *mem_input)
4744562236bSHarry Wentland {
475c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input);
4764562236bSHarry Wentland 	uint32_t value;
4774562236bSHarry Wentland 
478c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_GRPH_UPDATE);
4794562236bSHarry Wentland 
4804562236bSHarry Wentland 	if (get_reg_field_value(value, UNP_GRPH_UPDATE,
4814562236bSHarry Wentland 			GRPH_SURFACE_UPDATE_PENDING))
4824562236bSHarry Wentland 		return true;
4834562236bSHarry Wentland 
4844562236bSHarry Wentland 	mem_input->current_address = mem_input->request_address;
4854562236bSHarry Wentland 	return false;
4864562236bSHarry Wentland }
4874562236bSHarry Wentland 
dce_mem_input_v_program_surface_flip_and_addr(struct mem_input * mem_input,const struct dc_plane_address * address,bool flip_immediate)488a41bf9b8SLee Jones static bool dce_mem_input_v_program_surface_flip_and_addr(
4894562236bSHarry Wentland 	struct mem_input *mem_input,
4904562236bSHarry Wentland 	const struct dc_plane_address *address,
4914562236bSHarry Wentland 	bool flip_immediate)
4924562236bSHarry Wentland {
493c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input);
4944562236bSHarry Wentland 
4954562236bSHarry Wentland 	set_flip_control(mem_input110, flip_immediate);
4964562236bSHarry Wentland 	program_addr(mem_input110,
4974562236bSHarry Wentland 		address);
4984562236bSHarry Wentland 
4994562236bSHarry Wentland 	mem_input->request_address = *address;
5004562236bSHarry Wentland 
5014562236bSHarry Wentland 	return true;
5024562236bSHarry Wentland }
5034562236bSHarry Wentland 
5044562236bSHarry Wentland /* Scatter Gather param tables */
5054562236bSHarry Wentland static const unsigned int dvmm_Hw_Setting_2DTiling[4][9] = {
5064562236bSHarry Wentland 		{  8, 64, 64,  8,  8, 1, 4, 0, 0},
5074562236bSHarry Wentland 		{ 16, 64, 32,  8, 16, 1, 8, 0, 0},
5084562236bSHarry Wentland 		{ 32, 32, 32, 16, 16, 1, 8, 0, 0},
5094562236bSHarry Wentland 		{ 64,  8, 32, 16, 16, 1, 8, 0, 0}, /* fake */
5104562236bSHarry Wentland };
5114562236bSHarry Wentland 
5124562236bSHarry Wentland static const unsigned int dvmm_Hw_Setting_1DTiling[4][9] = {
5134562236bSHarry Wentland 		{  8, 512, 8, 1, 0, 1, 0, 0, 0},  /* 0 for invalid */
5144562236bSHarry Wentland 		{ 16, 256, 8, 2, 0, 1, 0, 0, 0},
5154562236bSHarry Wentland 		{ 32, 128, 8, 4, 0, 1, 0, 0, 0},
5164562236bSHarry Wentland 		{ 64,  64, 8, 4, 0, 1, 0, 0, 0}, /* fake */
5174562236bSHarry Wentland };
5184562236bSHarry Wentland 
5194562236bSHarry Wentland static const unsigned int dvmm_Hw_Setting_Linear[4][9] = {
5204562236bSHarry Wentland 		{  8, 4096, 1, 8, 0, 1, 0, 0, 0},
5214562236bSHarry Wentland 		{ 16, 2048, 1, 8, 0, 1, 0, 0, 0},
5224562236bSHarry Wentland 		{ 32, 1024, 1, 8, 0, 1, 0, 0, 0},
5234562236bSHarry Wentland 		{ 64,  512, 1, 8, 0, 1, 0, 0, 0}, /* new for 64bpp from HW */
5244562236bSHarry Wentland };
5254562236bSHarry Wentland 
5264562236bSHarry Wentland /* Helper to get table entry from surface info */
get_dvmm_hw_setting(union dc_tiling_info * tiling_info,enum surface_pixel_format format,bool chroma)5274562236bSHarry Wentland static const unsigned int *get_dvmm_hw_setting(
5284562236bSHarry Wentland 		union dc_tiling_info *tiling_info,
5294562236bSHarry Wentland 		enum surface_pixel_format format,
5304562236bSHarry Wentland 		bool chroma)
5314562236bSHarry Wentland {
5324562236bSHarry Wentland 	enum bits_per_pixel {
5334562236bSHarry Wentland 		bpp_8 = 0,
5344562236bSHarry Wentland 		bpp_16,
5354562236bSHarry Wentland 		bpp_32,
5364562236bSHarry Wentland 		bpp_64
5374562236bSHarry Wentland 	} bpp;
5384562236bSHarry Wentland 
5394562236bSHarry Wentland 	if (format >= SURFACE_PIXEL_FORMAT_INVALID)
5404562236bSHarry Wentland 		bpp = bpp_32;
5414562236bSHarry Wentland 	else if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
5424562236bSHarry Wentland 		bpp = chroma ? bpp_16 : bpp_8;
5434562236bSHarry Wentland 	else
5444562236bSHarry Wentland 		bpp = bpp_8;
5454562236bSHarry Wentland 
5464562236bSHarry Wentland 	switch (tiling_info->gfx8.array_mode) {
5474562236bSHarry Wentland 	case DC_ARRAY_1D_TILED_THIN1:
5484562236bSHarry Wentland 	case DC_ARRAY_1D_TILED_THICK:
5494562236bSHarry Wentland 	case DC_ARRAY_PRT_TILED_THIN1:
5504562236bSHarry Wentland 		return dvmm_Hw_Setting_1DTiling[bpp];
5514562236bSHarry Wentland 	case DC_ARRAY_2D_TILED_THIN1:
5524562236bSHarry Wentland 	case DC_ARRAY_2D_TILED_THICK:
5534562236bSHarry Wentland 	case DC_ARRAY_2D_TILED_X_THICK:
5544562236bSHarry Wentland 	case DC_ARRAY_PRT_2D_TILED_THIN1:
5554562236bSHarry Wentland 	case DC_ARRAY_PRT_2D_TILED_THICK:
5564562236bSHarry Wentland 		return dvmm_Hw_Setting_2DTiling[bpp];
5574562236bSHarry Wentland 	case DC_ARRAY_LINEAR_GENERAL:
5584562236bSHarry Wentland 	case DC_ARRAY_LINEAR_ALLIGNED:
5594562236bSHarry Wentland 		return dvmm_Hw_Setting_Linear[bpp];
5604562236bSHarry Wentland 	default:
5614562236bSHarry Wentland 		return dvmm_Hw_Setting_2DTiling[bpp];
5624562236bSHarry Wentland 	}
5634562236bSHarry Wentland }
5644562236bSHarry Wentland 
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)565a41bf9b8SLee Jones static void dce_mem_input_v_program_pte_vm(
5664562236bSHarry Wentland 		struct mem_input *mem_input,
5674562236bSHarry Wentland 		enum surface_pixel_format format,
5684562236bSHarry Wentland 		union dc_tiling_info *tiling_info,
5694562236bSHarry Wentland 		enum dc_rotation_angle rotation)
5704562236bSHarry Wentland {
571c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input);
5724562236bSHarry Wentland 	const unsigned int *pte = get_dvmm_hw_setting(tiling_info, format, false);
5734562236bSHarry Wentland 	const unsigned int *pte_chroma = get_dvmm_hw_setting(tiling_info, format, true);
5744562236bSHarry Wentland 
5754562236bSHarry Wentland 	unsigned int page_width = 0;
5764562236bSHarry Wentland 	unsigned int page_height = 0;
5774562236bSHarry Wentland 	unsigned int page_width_chroma = 0;
5784562236bSHarry Wentland 	unsigned int page_height_chroma = 0;
5794562236bSHarry Wentland 	unsigned int temp_page_width = pte[1];
5804562236bSHarry Wentland 	unsigned int temp_page_height = pte[2];
5814562236bSHarry Wentland 	unsigned int min_pte_before_flip = 0;
5824562236bSHarry Wentland 	unsigned int min_pte_before_flip_chroma = 0;
5834562236bSHarry Wentland 	uint32_t value = 0;
5844562236bSHarry Wentland 
5854562236bSHarry Wentland 	while ((temp_page_width >>= 1) != 0)
5864562236bSHarry Wentland 		page_width++;
5874562236bSHarry Wentland 	while ((temp_page_height >>= 1) != 0)
5884562236bSHarry Wentland 		page_height++;
5894562236bSHarry Wentland 
5904562236bSHarry Wentland 	temp_page_width = pte_chroma[1];
5914562236bSHarry Wentland 	temp_page_height = pte_chroma[2];
5924562236bSHarry Wentland 	while ((temp_page_width >>= 1) != 0)
5934562236bSHarry Wentland 		page_width_chroma++;
5944562236bSHarry Wentland 	while ((temp_page_height >>= 1) != 0)
5954562236bSHarry Wentland 		page_height_chroma++;
5964562236bSHarry Wentland 
5974562236bSHarry Wentland 	switch (rotation) {
5984562236bSHarry Wentland 	case ROTATION_ANGLE_90:
5994562236bSHarry Wentland 	case ROTATION_ANGLE_270:
6004562236bSHarry Wentland 		min_pte_before_flip = pte[4];
6014562236bSHarry Wentland 		min_pte_before_flip_chroma = pte_chroma[4];
6024562236bSHarry Wentland 		break;
6034562236bSHarry Wentland 	default:
6044562236bSHarry Wentland 		min_pte_before_flip = pte[3];
6054562236bSHarry Wentland 		min_pte_before_flip_chroma = pte_chroma[3];
6064562236bSHarry Wentland 		break;
6074562236bSHarry Wentland 	}
6084562236bSHarry Wentland 
609c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT);
6104562236bSHarry Wentland 	/* TODO: un-hardcode requestlimit */
6114562236bSHarry Wentland 	set_reg_field_value(value, 0xff, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_L);
6124562236bSHarry Wentland 	set_reg_field_value(value, 0xff, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT, UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_C);
613c3489214SDmytro Laktyushkin 	dm_write_reg(mem_input110->base.ctx, mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT, value);
6144562236bSHarry Wentland 
615c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL);
6164562236bSHarry Wentland 	set_reg_field_value(value, page_width, UNP_DVMM_PTE_CONTROL, DVMM_PAGE_WIDTH);
6174562236bSHarry Wentland 	set_reg_field_value(value, page_height, UNP_DVMM_PTE_CONTROL, DVMM_PAGE_HEIGHT);
6184562236bSHarry Wentland 	set_reg_field_value(value, min_pte_before_flip, UNP_DVMM_PTE_CONTROL, DVMM_MIN_PTE_BEFORE_FLIP);
619c3489214SDmytro Laktyushkin 	dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL, value);
6204562236bSHarry Wentland 
621c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL);
6224562236bSHarry Wentland 	set_reg_field_value(value, pte[5], UNP_DVMM_PTE_ARB_CONTROL, DVMM_PTE_REQ_PER_CHUNK);
6234562236bSHarry Wentland 	set_reg_field_value(value, 0xff, UNP_DVMM_PTE_ARB_CONTROL, DVMM_MAX_PTE_REQ_OUTSTANDING);
624c3489214SDmytro Laktyushkin 	dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL, value);
6254562236bSHarry Wentland 
626c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL_C);
6274562236bSHarry Wentland 	set_reg_field_value(value, page_width_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_PAGE_WIDTH_C);
6284562236bSHarry Wentland 	set_reg_field_value(value, page_height_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_PAGE_HEIGHT_C);
6294562236bSHarry Wentland 	set_reg_field_value(value, min_pte_before_flip_chroma, UNP_DVMM_PTE_CONTROL_C, DVMM_MIN_PTE_BEFORE_FLIP_C);
630c3489214SDmytro Laktyushkin 	dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_CONTROL_C, value);
6314562236bSHarry Wentland 
632c3489214SDmytro Laktyushkin 	value = dm_read_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL_C);
6334562236bSHarry Wentland 	set_reg_field_value(value, pte_chroma[5], UNP_DVMM_PTE_ARB_CONTROL_C, DVMM_PTE_REQ_PER_CHUNK_C);
6344562236bSHarry Wentland 	set_reg_field_value(value, 0xff, UNP_DVMM_PTE_ARB_CONTROL_C, DVMM_MAX_PTE_REQ_OUTSTANDING_C);
635c3489214SDmytro Laktyushkin 	dm_write_reg(mem_input110->base.ctx, mmUNP_DVMM_PTE_ARB_CONTROL_C, value);
6364562236bSHarry Wentland }
6374562236bSHarry Wentland 
dce_mem_input_v_program_surface_config(struct mem_input * mem_input,enum surface_pixel_format format,union dc_tiling_info * tiling_info,struct plane_size * plane_size,enum dc_rotation_angle rotation,struct dc_plane_dcc_param * dcc,bool horizotal_mirror)638a41bf9b8SLee Jones static void dce_mem_input_v_program_surface_config(
6394562236bSHarry Wentland 	struct mem_input *mem_input,
6404562236bSHarry Wentland 	enum surface_pixel_format format,
6414562236bSHarry Wentland 	union dc_tiling_info *tiling_info,
64212e2b2d4SDmytro Laktyushkin 	struct plane_size *plane_size,
6434562236bSHarry Wentland 	enum dc_rotation_angle rotation,
6444562236bSHarry Wentland 	struct dc_plane_dcc_param *dcc,
6454b28b76bSDmytro Laktyushkin 	bool horizotal_mirror)
6464562236bSHarry Wentland {
647c3489214SDmytro Laktyushkin 	struct dce_mem_input *mem_input110 = TO_DCE_MEM_INPUT(mem_input);
6484562236bSHarry Wentland 
6494562236bSHarry Wentland 	enable(mem_input110);
6504562236bSHarry Wentland 	program_tiling(mem_input110, tiling_info, format);
6514562236bSHarry Wentland 	program_size_and_rotation(mem_input110, rotation, plane_size);
6524562236bSHarry Wentland 	program_pixel_format(mem_input110, format);
6534562236bSHarry Wentland }
6544562236bSHarry Wentland 
program_urgency_watermark(const struct dc_context * ctx,const uint32_t urgency_addr,const uint32_t wm_addr,struct dce_watermarks marks_low,uint32_t total_dest_line_time_ns)6554562236bSHarry Wentland static void program_urgency_watermark(
6564562236bSHarry Wentland 	const struct dc_context *ctx,
6574562236bSHarry Wentland 	const uint32_t urgency_addr,
6584562236bSHarry Wentland 	const uint32_t wm_addr,
6599037d802SDmytro Laktyushkin 	struct dce_watermarks marks_low,
6604562236bSHarry Wentland 	uint32_t total_dest_line_time_ns)
6614562236bSHarry Wentland {
6624562236bSHarry Wentland 	/* register value */
6634562236bSHarry Wentland 	uint32_t urgency_cntl = 0;
6644562236bSHarry Wentland 	uint32_t wm_mask_cntl = 0;
6654562236bSHarry Wentland 
6664562236bSHarry Wentland 	/*Write mask to enable reading/writing of watermark set A*/
6674562236bSHarry Wentland 	wm_mask_cntl = dm_read_reg(ctx, wm_addr);
6684562236bSHarry Wentland 	set_reg_field_value(wm_mask_cntl,
6694562236bSHarry Wentland 			1,
6704562236bSHarry Wentland 			DPGV0_WATERMARK_MASK_CONTROL,
6714562236bSHarry Wentland 			URGENCY_WATERMARK_MASK);
6724562236bSHarry Wentland 	dm_write_reg(ctx, wm_addr, wm_mask_cntl);
6734562236bSHarry Wentland 
6744562236bSHarry Wentland 	urgency_cntl = dm_read_reg(ctx, urgency_addr);
6754562236bSHarry Wentland 
6764562236bSHarry Wentland 	set_reg_field_value(
6774562236bSHarry Wentland 		urgency_cntl,
6784562236bSHarry Wentland 		marks_low.a_mark,
6794562236bSHarry Wentland 		DPGV0_PIPE_URGENCY_CONTROL,
6804562236bSHarry Wentland 		URGENCY_LOW_WATERMARK);
6814562236bSHarry Wentland 
6824562236bSHarry Wentland 	set_reg_field_value(
6834562236bSHarry Wentland 		urgency_cntl,
6844562236bSHarry Wentland 		total_dest_line_time_ns,
6854562236bSHarry Wentland 		DPGV0_PIPE_URGENCY_CONTROL,
6864562236bSHarry Wentland 		URGENCY_HIGH_WATERMARK);
6874562236bSHarry Wentland 	dm_write_reg(ctx, urgency_addr, urgency_cntl);
6884562236bSHarry Wentland 
6894562236bSHarry Wentland 	/*Write mask to enable reading/writing of watermark set B*/
6904562236bSHarry Wentland 	wm_mask_cntl = dm_read_reg(ctx, wm_addr);
6914562236bSHarry Wentland 	set_reg_field_value(wm_mask_cntl,
6924562236bSHarry Wentland 			2,
6934562236bSHarry Wentland 			DPGV0_WATERMARK_MASK_CONTROL,
6944562236bSHarry Wentland 			URGENCY_WATERMARK_MASK);
6954562236bSHarry Wentland 	dm_write_reg(ctx, wm_addr, wm_mask_cntl);
6964562236bSHarry Wentland 
6974562236bSHarry Wentland 	urgency_cntl = dm_read_reg(ctx, urgency_addr);
6984562236bSHarry Wentland 
6994562236bSHarry Wentland 	set_reg_field_value(urgency_cntl,
7004562236bSHarry Wentland 		marks_low.b_mark,
7014562236bSHarry Wentland 		DPGV0_PIPE_URGENCY_CONTROL,
7024562236bSHarry Wentland 		URGENCY_LOW_WATERMARK);
7034562236bSHarry Wentland 
7044562236bSHarry Wentland 	set_reg_field_value(urgency_cntl,
7054562236bSHarry Wentland 		total_dest_line_time_ns,
7064562236bSHarry Wentland 		DPGV0_PIPE_URGENCY_CONTROL,
7074562236bSHarry Wentland 		URGENCY_HIGH_WATERMARK);
7084562236bSHarry Wentland 
7094562236bSHarry Wentland 	dm_write_reg(ctx, urgency_addr, urgency_cntl);
7104562236bSHarry Wentland }
7114562236bSHarry Wentland 
program_urgency_watermark_l(const struct dc_context * ctx,struct dce_watermarks marks_low,uint32_t total_dest_line_time_ns)7124562236bSHarry Wentland static void program_urgency_watermark_l(
7134562236bSHarry Wentland 	const struct dc_context *ctx,
7149037d802SDmytro Laktyushkin 	struct dce_watermarks marks_low,
7154562236bSHarry Wentland 	uint32_t total_dest_line_time_ns)
7164562236bSHarry Wentland {
7174562236bSHarry Wentland 	program_urgency_watermark(
7184562236bSHarry Wentland 		ctx,
7194562236bSHarry Wentland 		mmDPGV0_PIPE_URGENCY_CONTROL,
7204562236bSHarry Wentland 		mmDPGV0_WATERMARK_MASK_CONTROL,
7214562236bSHarry Wentland 		marks_low,
7224562236bSHarry Wentland 		total_dest_line_time_ns);
7234562236bSHarry Wentland }
7244562236bSHarry Wentland 
program_urgency_watermark_c(const struct dc_context * ctx,struct dce_watermarks marks_low,uint32_t total_dest_line_time_ns)7254562236bSHarry Wentland static void program_urgency_watermark_c(
7264562236bSHarry Wentland 	const struct dc_context *ctx,
7279037d802SDmytro Laktyushkin 	struct dce_watermarks marks_low,
7284562236bSHarry Wentland 	uint32_t total_dest_line_time_ns)
7294562236bSHarry Wentland {
7304562236bSHarry Wentland 	program_urgency_watermark(
7314562236bSHarry Wentland 		ctx,
7324562236bSHarry Wentland 		mmDPGV1_PIPE_URGENCY_CONTROL,
7334562236bSHarry Wentland 		mmDPGV1_WATERMARK_MASK_CONTROL,
7344562236bSHarry Wentland 		marks_low,
7354562236bSHarry Wentland 		total_dest_line_time_ns);
7364562236bSHarry Wentland }
7374562236bSHarry Wentland 
program_stutter_watermark(const struct dc_context * ctx,const uint32_t stutter_addr,const uint32_t wm_addr,struct dce_watermarks marks)7384562236bSHarry Wentland static void program_stutter_watermark(
7394562236bSHarry Wentland 	const struct dc_context *ctx,
7404562236bSHarry Wentland 	const uint32_t stutter_addr,
7414562236bSHarry Wentland 	const uint32_t wm_addr,
7429037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
7434562236bSHarry Wentland {
7444562236bSHarry Wentland 	/* register value */
7454562236bSHarry Wentland 	uint32_t stutter_cntl = 0;
7464562236bSHarry Wentland 	uint32_t wm_mask_cntl = 0;
7474562236bSHarry Wentland 
7484562236bSHarry Wentland 	/*Write mask to enable reading/writing of watermark set A*/
7494562236bSHarry Wentland 
7504562236bSHarry Wentland 	wm_mask_cntl = dm_read_reg(ctx, wm_addr);
7514562236bSHarry Wentland 	set_reg_field_value(wm_mask_cntl,
7524562236bSHarry Wentland 		1,
7534562236bSHarry Wentland 		DPGV0_WATERMARK_MASK_CONTROL,
7544562236bSHarry Wentland 		STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK);
7554562236bSHarry Wentland 	dm_write_reg(ctx, wm_addr, wm_mask_cntl);
7564562236bSHarry Wentland 
7574562236bSHarry Wentland 	stutter_cntl = dm_read_reg(ctx, stutter_addr);
7584562236bSHarry Wentland 
7594562236bSHarry Wentland 	if (ctx->dc->debug.disable_stutter) {
7604562236bSHarry Wentland 		set_reg_field_value(stutter_cntl,
7614562236bSHarry Wentland 			0,
7624562236bSHarry Wentland 			DPGV0_PIPE_STUTTER_CONTROL,
7634562236bSHarry Wentland 			STUTTER_ENABLE);
7644562236bSHarry Wentland 	} else {
7654562236bSHarry Wentland 		set_reg_field_value(stutter_cntl,
7664562236bSHarry Wentland 			1,
7674562236bSHarry Wentland 			DPGV0_PIPE_STUTTER_CONTROL,
7684562236bSHarry Wentland 			STUTTER_ENABLE);
7694562236bSHarry Wentland 	}
7704562236bSHarry Wentland 
7714562236bSHarry Wentland 	set_reg_field_value(stutter_cntl,
7724562236bSHarry Wentland 		1,
7734562236bSHarry Wentland 		DPGV0_PIPE_STUTTER_CONTROL,
7744562236bSHarry Wentland 		STUTTER_IGNORE_FBC);
7754562236bSHarry Wentland 
7764562236bSHarry Wentland 	/*Write watermark set A*/
7774562236bSHarry Wentland 	set_reg_field_value(stutter_cntl,
7784562236bSHarry Wentland 		marks.a_mark,
7794562236bSHarry Wentland 		DPGV0_PIPE_STUTTER_CONTROL,
7804562236bSHarry Wentland 		STUTTER_EXIT_SELF_REFRESH_WATERMARK);
7814562236bSHarry Wentland 	dm_write_reg(ctx, stutter_addr, stutter_cntl);
7824562236bSHarry Wentland 
7834562236bSHarry Wentland 	/*Write mask to enable reading/writing of watermark set B*/
7844562236bSHarry Wentland 	wm_mask_cntl = dm_read_reg(ctx, wm_addr);
7854562236bSHarry Wentland 	set_reg_field_value(wm_mask_cntl,
7864562236bSHarry Wentland 		2,
7874562236bSHarry Wentland 		DPGV0_WATERMARK_MASK_CONTROL,
7884562236bSHarry Wentland 		STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK);
7894562236bSHarry Wentland 	dm_write_reg(ctx, wm_addr, wm_mask_cntl);
7904562236bSHarry Wentland 
7914562236bSHarry Wentland 	stutter_cntl = dm_read_reg(ctx, stutter_addr);
7924562236bSHarry Wentland 	/*Write watermark set B*/
7934562236bSHarry Wentland 	set_reg_field_value(stutter_cntl,
7944562236bSHarry Wentland 		marks.b_mark,
7954562236bSHarry Wentland 		DPGV0_PIPE_STUTTER_CONTROL,
7964562236bSHarry Wentland 		STUTTER_EXIT_SELF_REFRESH_WATERMARK);
7974562236bSHarry Wentland 	dm_write_reg(ctx, stutter_addr, stutter_cntl);
7984562236bSHarry Wentland }
7994562236bSHarry Wentland 
program_stutter_watermark_l(const struct dc_context * ctx,struct dce_watermarks marks)8004562236bSHarry Wentland static void program_stutter_watermark_l(
8014562236bSHarry Wentland 	const struct dc_context *ctx,
8029037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
8034562236bSHarry Wentland {
8044562236bSHarry Wentland 	program_stutter_watermark(ctx,
8054562236bSHarry Wentland 			mmDPGV0_PIPE_STUTTER_CONTROL,
8064562236bSHarry Wentland 			mmDPGV0_WATERMARK_MASK_CONTROL,
8074562236bSHarry Wentland 			marks);
8084562236bSHarry Wentland }
8094562236bSHarry Wentland 
program_stutter_watermark_c(const struct dc_context * ctx,struct dce_watermarks marks)8104562236bSHarry Wentland static void program_stutter_watermark_c(
8114562236bSHarry Wentland 	const struct dc_context *ctx,
8129037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
8134562236bSHarry Wentland {
8144562236bSHarry Wentland 	program_stutter_watermark(ctx,
8154562236bSHarry Wentland 			mmDPGV1_PIPE_STUTTER_CONTROL,
8164562236bSHarry Wentland 			mmDPGV1_WATERMARK_MASK_CONTROL,
8174562236bSHarry Wentland 			marks);
8184562236bSHarry Wentland }
8194562236bSHarry Wentland 
program_nbp_watermark(const struct dc_context * ctx,const uint32_t wm_mask_ctrl_addr,const uint32_t nbp_pstate_ctrl_addr,struct dce_watermarks marks)8204562236bSHarry Wentland static void program_nbp_watermark(
8214562236bSHarry Wentland 	const struct dc_context *ctx,
8224562236bSHarry Wentland 	const uint32_t wm_mask_ctrl_addr,
8234562236bSHarry Wentland 	const uint32_t nbp_pstate_ctrl_addr,
8249037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
8254562236bSHarry Wentland {
8264562236bSHarry Wentland 	uint32_t value;
8274562236bSHarry Wentland 
8284562236bSHarry Wentland 	/* Write mask to enable reading/writing of watermark set A */
8294562236bSHarry Wentland 
8304562236bSHarry Wentland 	value = dm_read_reg(ctx, wm_mask_ctrl_addr);
8314562236bSHarry Wentland 
8324562236bSHarry Wentland 	set_reg_field_value(
8334562236bSHarry Wentland 		value,
8344562236bSHarry Wentland 		1,
8354562236bSHarry Wentland 		DPGV0_WATERMARK_MASK_CONTROL,
8364562236bSHarry Wentland 		NB_PSTATE_CHANGE_WATERMARK_MASK);
8374562236bSHarry Wentland 	dm_write_reg(ctx, wm_mask_ctrl_addr, value);
8384562236bSHarry Wentland 
8394562236bSHarry Wentland 	value = dm_read_reg(ctx, nbp_pstate_ctrl_addr);
8404562236bSHarry Wentland 
8414562236bSHarry Wentland 	set_reg_field_value(
8424562236bSHarry Wentland 		value,
8434562236bSHarry Wentland 		1,
8444562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8454562236bSHarry Wentland 		NB_PSTATE_CHANGE_ENABLE);
8464562236bSHarry Wentland 	set_reg_field_value(
8474562236bSHarry Wentland 		value,
8484562236bSHarry Wentland 		1,
8494562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8504562236bSHarry Wentland 		NB_PSTATE_CHANGE_URGENT_DURING_REQUEST);
8514562236bSHarry Wentland 	set_reg_field_value(
8524562236bSHarry Wentland 		value,
8534562236bSHarry Wentland 		1,
8544562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8554562236bSHarry Wentland 		NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST);
8564562236bSHarry Wentland 	dm_write_reg(ctx, nbp_pstate_ctrl_addr, value);
8574562236bSHarry Wentland 
8584562236bSHarry Wentland 	/* Write watermark set A */
8594562236bSHarry Wentland 	value = dm_read_reg(ctx, nbp_pstate_ctrl_addr);
8604562236bSHarry Wentland 	set_reg_field_value(
8614562236bSHarry Wentland 		value,
8624562236bSHarry Wentland 		marks.a_mark,
8634562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8644562236bSHarry Wentland 		NB_PSTATE_CHANGE_WATERMARK);
8654562236bSHarry Wentland 	dm_write_reg(ctx, nbp_pstate_ctrl_addr, value);
8664562236bSHarry Wentland 
8674562236bSHarry Wentland 	/* Write mask to enable reading/writing of watermark set B */
8684562236bSHarry Wentland 	value = dm_read_reg(ctx, wm_mask_ctrl_addr);
8694562236bSHarry Wentland 	set_reg_field_value(
8704562236bSHarry Wentland 		value,
8714562236bSHarry Wentland 		2,
8724562236bSHarry Wentland 		DPGV0_WATERMARK_MASK_CONTROL,
8734562236bSHarry Wentland 		NB_PSTATE_CHANGE_WATERMARK_MASK);
8744562236bSHarry Wentland 	dm_write_reg(ctx, wm_mask_ctrl_addr, value);
8754562236bSHarry Wentland 
8764562236bSHarry Wentland 	value = dm_read_reg(ctx, nbp_pstate_ctrl_addr);
8774562236bSHarry Wentland 	set_reg_field_value(
8784562236bSHarry Wentland 		value,
8794562236bSHarry Wentland 		1,
8804562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8814562236bSHarry Wentland 		NB_PSTATE_CHANGE_ENABLE);
8824562236bSHarry Wentland 	set_reg_field_value(
8834562236bSHarry Wentland 		value,
8844562236bSHarry Wentland 		1,
8854562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8864562236bSHarry Wentland 		NB_PSTATE_CHANGE_URGENT_DURING_REQUEST);
8874562236bSHarry Wentland 	set_reg_field_value(
8884562236bSHarry Wentland 		value,
8894562236bSHarry Wentland 		1,
8904562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
8914562236bSHarry Wentland 		NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST);
8924562236bSHarry Wentland 	dm_write_reg(ctx, nbp_pstate_ctrl_addr, value);
8934562236bSHarry Wentland 
8944562236bSHarry Wentland 	/* Write watermark set B */
8954562236bSHarry Wentland 	value = dm_read_reg(ctx, nbp_pstate_ctrl_addr);
8964562236bSHarry Wentland 	set_reg_field_value(
8974562236bSHarry Wentland 		value,
8984562236bSHarry Wentland 		marks.b_mark,
8994562236bSHarry Wentland 		DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
9004562236bSHarry Wentland 		NB_PSTATE_CHANGE_WATERMARK);
9014562236bSHarry Wentland 	dm_write_reg(ctx, nbp_pstate_ctrl_addr, value);
9024562236bSHarry Wentland }
9034562236bSHarry Wentland 
program_nbp_watermark_l(const struct dc_context * ctx,struct dce_watermarks marks)9044562236bSHarry Wentland static void program_nbp_watermark_l(
9054562236bSHarry Wentland 	const struct dc_context *ctx,
9069037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
9074562236bSHarry Wentland {
9084562236bSHarry Wentland 	program_nbp_watermark(ctx,
9094562236bSHarry Wentland 			mmDPGV0_WATERMARK_MASK_CONTROL,
9104562236bSHarry Wentland 			mmDPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL,
9114562236bSHarry Wentland 			marks);
9124562236bSHarry Wentland }
9134562236bSHarry Wentland 
program_nbp_watermark_c(const struct dc_context * ctx,struct dce_watermarks marks)9144562236bSHarry Wentland static void program_nbp_watermark_c(
9154562236bSHarry Wentland 	const struct dc_context *ctx,
9169037d802SDmytro Laktyushkin 	struct dce_watermarks marks)
9174562236bSHarry Wentland {
9184562236bSHarry Wentland 	program_nbp_watermark(ctx,
9194562236bSHarry Wentland 			mmDPGV1_WATERMARK_MASK_CONTROL,
9204562236bSHarry Wentland 			mmDPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL,
9214562236bSHarry Wentland 			marks);
9224562236bSHarry Wentland }
9234562236bSHarry Wentland 
dce_mem_input_v_program_display_marks(struct mem_input * mem_input,struct dce_watermarks nbp,struct dce_watermarks stutter,struct dce_watermarks stutter_enter,struct dce_watermarks urgent,uint32_t total_dest_line_time_ns)924a41bf9b8SLee Jones static void dce_mem_input_v_program_display_marks(
9254562236bSHarry Wentland 	struct mem_input *mem_input,
9269037d802SDmytro Laktyushkin 	struct dce_watermarks nbp,
9279037d802SDmytro Laktyushkin 	struct dce_watermarks stutter,
9283722c794SMikita Lipski 	struct dce_watermarks stutter_enter,
9299037d802SDmytro Laktyushkin 	struct dce_watermarks urgent,
9304562236bSHarry Wentland 	uint32_t total_dest_line_time_ns)
9314562236bSHarry Wentland {
9324562236bSHarry Wentland 	program_urgency_watermark_l(
9334562236bSHarry Wentland 		mem_input->ctx,
9344562236bSHarry Wentland 		urgent,
9354562236bSHarry Wentland 		total_dest_line_time_ns);
9364562236bSHarry Wentland 
9374562236bSHarry Wentland 	program_nbp_watermark_l(
9384562236bSHarry Wentland 		mem_input->ctx,
9394562236bSHarry Wentland 		nbp);
9404562236bSHarry Wentland 
9414562236bSHarry Wentland 	program_stutter_watermark_l(
9424562236bSHarry Wentland 		mem_input->ctx,
9434562236bSHarry Wentland 		stutter);
9444562236bSHarry Wentland 
9454562236bSHarry Wentland }
9464562236bSHarry Wentland 
dce_mem_input_program_chroma_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)947a41bf9b8SLee Jones static void dce_mem_input_program_chroma_display_marks(
9484562236bSHarry Wentland 	struct mem_input *mem_input,
9499037d802SDmytro Laktyushkin 	struct dce_watermarks nbp,
9509037d802SDmytro Laktyushkin 	struct dce_watermarks stutter,
9519037d802SDmytro Laktyushkin 	struct dce_watermarks urgent,
9524562236bSHarry Wentland 	uint32_t total_dest_line_time_ns)
9534562236bSHarry Wentland {
9544562236bSHarry Wentland 	program_urgency_watermark_c(
9554562236bSHarry Wentland 		mem_input->ctx,
9564562236bSHarry Wentland 		urgent,
9574562236bSHarry Wentland 		total_dest_line_time_ns);
9584562236bSHarry Wentland 
9594562236bSHarry Wentland 	program_nbp_watermark_c(
9604562236bSHarry Wentland 		mem_input->ctx,
9614562236bSHarry Wentland 		nbp);
9624562236bSHarry Wentland 
9634562236bSHarry Wentland 	program_stutter_watermark_c(
9644562236bSHarry Wentland 		mem_input->ctx,
9654562236bSHarry Wentland 		stutter);
9664562236bSHarry Wentland }
9674562236bSHarry Wentland 
dce110_allocate_mem_input_v(struct mem_input * mi,uint32_t h_total,uint32_t v_total,uint32_t pix_clk_khz,uint32_t total_stream_num)968a41bf9b8SLee Jones static void dce110_allocate_mem_input_v(
9694562236bSHarry Wentland 	struct mem_input *mi,
9704562236bSHarry Wentland 	uint32_t h_total,/* for current stream */
9714562236bSHarry Wentland 	uint32_t v_total,/* for current stream */
9724562236bSHarry Wentland 	uint32_t pix_clk_khz,/* for current stream */
9734562236bSHarry Wentland 	uint32_t total_stream_num)
9744562236bSHarry Wentland {
9754562236bSHarry Wentland 	uint32_t addr;
9764562236bSHarry Wentland 	uint32_t value;
9774562236bSHarry Wentland 	uint32_t pix_dur;
9784562236bSHarry Wentland 	if (pix_clk_khz != 0) {
9794562236bSHarry Wentland 		addr = mmDPGV0_PIPE_ARBITRATION_CONTROL1;
9804562236bSHarry Wentland 		value = dm_read_reg(mi->ctx, addr);
9814562236bSHarry Wentland 		pix_dur = 1000000000ULL / pix_clk_khz;
9824562236bSHarry Wentland 		set_reg_field_value(
9834562236bSHarry Wentland 			value,
9844562236bSHarry Wentland 			pix_dur,
9854562236bSHarry Wentland 			DPGV0_PIPE_ARBITRATION_CONTROL1,
9864562236bSHarry Wentland 			PIXEL_DURATION);
9874562236bSHarry Wentland 		dm_write_reg(mi->ctx, addr, value);
9884562236bSHarry Wentland 
9894562236bSHarry Wentland 		addr = mmDPGV1_PIPE_ARBITRATION_CONTROL1;
9904562236bSHarry Wentland 		value = dm_read_reg(mi->ctx, addr);
9914562236bSHarry Wentland 		pix_dur = 1000000000ULL / pix_clk_khz;
9924562236bSHarry Wentland 		set_reg_field_value(
9934562236bSHarry Wentland 			value,
9944562236bSHarry Wentland 			pix_dur,
9954562236bSHarry Wentland 			DPGV1_PIPE_ARBITRATION_CONTROL1,
9964562236bSHarry Wentland 			PIXEL_DURATION);
9974562236bSHarry Wentland 		dm_write_reg(mi->ctx, addr, value);
9984562236bSHarry Wentland 
9994562236bSHarry Wentland 		addr = mmDPGV0_PIPE_ARBITRATION_CONTROL2;
10004562236bSHarry Wentland 		value = 0x4000800;
10014562236bSHarry Wentland 		dm_write_reg(mi->ctx, addr, value);
10024562236bSHarry Wentland 
10034562236bSHarry Wentland 		addr = mmDPGV1_PIPE_ARBITRATION_CONTROL2;
10044562236bSHarry Wentland 		value = 0x4000800;
10054562236bSHarry Wentland 		dm_write_reg(mi->ctx, addr, value);
10064562236bSHarry Wentland 	}
10074562236bSHarry Wentland 
10084562236bSHarry Wentland }
10094562236bSHarry Wentland 
dce110_free_mem_input_v(struct mem_input * mi,uint32_t total_stream_num)1010a41bf9b8SLee Jones static void dce110_free_mem_input_v(
10114562236bSHarry Wentland 	struct mem_input *mi,
10124562236bSHarry Wentland 	uint32_t total_stream_num)
10134562236bSHarry Wentland {
10144562236bSHarry Wentland }
10154562236bSHarry Wentland 
1016a14cc842SChristian König static const struct mem_input_funcs dce110_mem_input_v_funcs = {
10174562236bSHarry Wentland 	.mem_input_program_display_marks =
1018c3489214SDmytro Laktyushkin 			dce_mem_input_v_program_display_marks,
10194562236bSHarry Wentland 	.mem_input_program_chroma_display_marks =
1020c3489214SDmytro Laktyushkin 			dce_mem_input_program_chroma_display_marks,
10214562236bSHarry Wentland 	.allocate_mem_input = dce110_allocate_mem_input_v,
10224562236bSHarry Wentland 	.free_mem_input = dce110_free_mem_input_v,
10234562236bSHarry Wentland 	.mem_input_program_surface_flip_and_addr =
1024c3489214SDmytro Laktyushkin 			dce_mem_input_v_program_surface_flip_and_addr,
10254562236bSHarry Wentland 	.mem_input_program_pte_vm =
1026c3489214SDmytro Laktyushkin 			dce_mem_input_v_program_pte_vm,
10274562236bSHarry Wentland 	.mem_input_program_surface_config =
1028c3489214SDmytro Laktyushkin 			dce_mem_input_v_program_surface_config,
10294562236bSHarry Wentland 	.mem_input_is_flip_pending =
1030c3489214SDmytro Laktyushkin 			dce_mem_input_v_is_surface_pending
10314562236bSHarry Wentland };
10324562236bSHarry Wentland /*****************************************/
10334562236bSHarry Wentland /* Constructor, Destructor               */
10344562236bSHarry Wentland /*****************************************/
10354562236bSHarry Wentland 
dce110_mem_input_v_construct(struct dce_mem_input * dce_mi,struct dc_context * ctx)1036c3489214SDmytro Laktyushkin void dce110_mem_input_v_construct(
1037c3489214SDmytro Laktyushkin 	struct dce_mem_input *dce_mi,
10384562236bSHarry Wentland 	struct dc_context *ctx)
10394562236bSHarry Wentland {
1040c3489214SDmytro Laktyushkin 	dce_mi->base.funcs = &dce110_mem_input_v_funcs;
1041c3489214SDmytro Laktyushkin 	dce_mi->base.ctx = ctx;
10424562236bSHarry Wentland }
10434562236bSHarry Wentland 
1044