186b6a203SDmytro Laktyushkin /*
286b6a203SDmytro Laktyushkin  * Copyright 2017 Advanced Micro Devices, Inc.
386b6a203SDmytro Laktyushkin  *
486b6a203SDmytro Laktyushkin  * Permission is hereby granted, free of charge, to any person obtaining a
586b6a203SDmytro Laktyushkin  * copy of this software and associated documentation files (the "Software"),
686b6a203SDmytro Laktyushkin  * to deal in the Software without restriction, including without limitation
786b6a203SDmytro Laktyushkin  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
886b6a203SDmytro Laktyushkin  * and/or sell copies of the Software, and to permit persons to whom the
986b6a203SDmytro Laktyushkin  * Software is furnished to do so, subject to the following conditions:
1086b6a203SDmytro Laktyushkin  *
1186b6a203SDmytro Laktyushkin  * The above copyright notice and this permission notice shall be included in
1286b6a203SDmytro Laktyushkin  * all copies or substantial portions of the Software.
1386b6a203SDmytro Laktyushkin  *
1486b6a203SDmytro Laktyushkin  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1586b6a203SDmytro Laktyushkin  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1686b6a203SDmytro Laktyushkin  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1786b6a203SDmytro Laktyushkin  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1886b6a203SDmytro Laktyushkin  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1986b6a203SDmytro Laktyushkin  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2086b6a203SDmytro Laktyushkin  * OTHER DEALINGS IN THE SOFTWARE.
2186b6a203SDmytro Laktyushkin  *
2286b6a203SDmytro Laktyushkin  * Authors: AMD
2386b6a203SDmytro Laktyushkin  *
2486b6a203SDmytro Laktyushkin  */
2586b6a203SDmytro Laktyushkin 
2686b6a203SDmytro Laktyushkin #include "dce_ipp.h"
2786b6a203SDmytro Laktyushkin #include "reg_helper.h"
2886b6a203SDmytro Laktyushkin #include "dm_services.h"
2986b6a203SDmytro Laktyushkin 
3086b6a203SDmytro Laktyushkin #define REG(reg) \
3186b6a203SDmytro Laktyushkin 	(ipp_dce->regs->reg)
3286b6a203SDmytro Laktyushkin 
3386b6a203SDmytro Laktyushkin #undef FN
3486b6a203SDmytro Laktyushkin #define FN(reg_name, field_name) \
3586b6a203SDmytro Laktyushkin 	ipp_dce->ipp_shift->field_name, ipp_dce->ipp_mask->field_name
3686b6a203SDmytro Laktyushkin 
3786b6a203SDmytro Laktyushkin #define CTX \
3886b6a203SDmytro Laktyushkin 	ipp_dce->base.ctx
3986b6a203SDmytro Laktyushkin 
40b87d78d6SYue Hin Lau 
dce_ipp_cursor_set_position(struct input_pixel_processor * ipp,const struct dc_cursor_position * position,const struct dc_cursor_mi_param * param)4186b6a203SDmytro Laktyushkin static void dce_ipp_cursor_set_position(
4286b6a203SDmytro Laktyushkin 	struct input_pixel_processor *ipp,
4386b6a203SDmytro Laktyushkin 	const struct dc_cursor_position *position,
4486b6a203SDmytro Laktyushkin 	const struct dc_cursor_mi_param *param)
4586b6a203SDmytro Laktyushkin {
4686b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
4786b6a203SDmytro Laktyushkin 
4886b6a203SDmytro Laktyushkin 	/* lock cursor registers */
4986b6a203SDmytro Laktyushkin 	REG_UPDATE(CUR_UPDATE, CURSOR_UPDATE_LOCK, true);
5086b6a203SDmytro Laktyushkin 
5186b6a203SDmytro Laktyushkin 	/* Flag passed in structure differentiates cursor enable/disable. */
5286b6a203SDmytro Laktyushkin 	/* Update if it differs from cached state. */
5386b6a203SDmytro Laktyushkin 	REG_UPDATE(CUR_CONTROL, CURSOR_EN, position->enable);
5486b6a203SDmytro Laktyushkin 
5586b6a203SDmytro Laktyushkin 	REG_SET_2(CUR_POSITION, 0,
5686b6a203SDmytro Laktyushkin 		CURSOR_X_POSITION, position->x,
5786b6a203SDmytro Laktyushkin 		CURSOR_Y_POSITION, position->y);
5886b6a203SDmytro Laktyushkin 
5986b6a203SDmytro Laktyushkin 	REG_SET_2(CUR_HOT_SPOT, 0,
6086b6a203SDmytro Laktyushkin 		CURSOR_HOT_SPOT_X, position->x_hotspot,
6186b6a203SDmytro Laktyushkin 		CURSOR_HOT_SPOT_Y, position->y_hotspot);
6286b6a203SDmytro Laktyushkin 
6386b6a203SDmytro Laktyushkin 	/* unlock cursor registers */
6486b6a203SDmytro Laktyushkin 	REG_UPDATE(CUR_UPDATE, CURSOR_UPDATE_LOCK, false);
6586b6a203SDmytro Laktyushkin }
6686b6a203SDmytro Laktyushkin 
dce_ipp_cursor_set_attributes(struct input_pixel_processor * ipp,const struct dc_cursor_attributes * attributes)6786b6a203SDmytro Laktyushkin static void dce_ipp_cursor_set_attributes(
6886b6a203SDmytro Laktyushkin 	struct input_pixel_processor *ipp,
6986b6a203SDmytro Laktyushkin 	const struct dc_cursor_attributes *attributes)
7086b6a203SDmytro Laktyushkin {
7186b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
7286b6a203SDmytro Laktyushkin 	int mode;
7386b6a203SDmytro Laktyushkin 
7486b6a203SDmytro Laktyushkin 	/* Lock cursor registers */
7586b6a203SDmytro Laktyushkin 	REG_UPDATE(CUR_UPDATE, CURSOR_UPDATE_LOCK, true);
7686b6a203SDmytro Laktyushkin 
7786b6a203SDmytro Laktyushkin 	/* Program cursor control */
7886b6a203SDmytro Laktyushkin 	switch (attributes->color_format) {
7986b6a203SDmytro Laktyushkin 	case CURSOR_MODE_MONO:
8086b6a203SDmytro Laktyushkin 		mode = 0;
8186b6a203SDmytro Laktyushkin 		break;
8286b6a203SDmytro Laktyushkin 	case CURSOR_MODE_COLOR_1BIT_AND:
8386b6a203SDmytro Laktyushkin 		mode = 1;
8486b6a203SDmytro Laktyushkin 		break;
8586b6a203SDmytro Laktyushkin 	case CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA:
8686b6a203SDmytro Laktyushkin 		mode = 2;
8786b6a203SDmytro Laktyushkin 		break;
8886b6a203SDmytro Laktyushkin 	case CURSOR_MODE_COLOR_UN_PRE_MULTIPLIED_ALPHA:
8986b6a203SDmytro Laktyushkin 		mode = 3;
9086b6a203SDmytro Laktyushkin 		break;
9186b6a203SDmytro Laktyushkin 	default:
9286b6a203SDmytro Laktyushkin 		BREAK_TO_DEBUGGER(); /* unsupported */
9386b6a203SDmytro Laktyushkin 		mode = 0;
9486b6a203SDmytro Laktyushkin 	}
9586b6a203SDmytro Laktyushkin 
9686b6a203SDmytro Laktyushkin 	REG_UPDATE_3(CUR_CONTROL,
9786b6a203SDmytro Laktyushkin 		CURSOR_MODE, mode,
9886b6a203SDmytro Laktyushkin 		CURSOR_2X_MAGNIFY, attributes->attribute_flags.bits.ENABLE_MAGNIFICATION,
9986b6a203SDmytro Laktyushkin 		CUR_INV_TRANS_CLAMP, attributes->attribute_flags.bits.INVERSE_TRANSPARENT_CLAMPING);
10086b6a203SDmytro Laktyushkin 
10186b6a203SDmytro Laktyushkin 	if (attributes->color_format == CURSOR_MODE_MONO) {
10286b6a203SDmytro Laktyushkin 		REG_SET_3(CUR_COLOR1, 0,
10386b6a203SDmytro Laktyushkin 			CUR_COLOR1_BLUE, 0,
10486b6a203SDmytro Laktyushkin 			CUR_COLOR1_GREEN, 0,
10586b6a203SDmytro Laktyushkin 			CUR_COLOR1_RED, 0);
10686b6a203SDmytro Laktyushkin 
10786b6a203SDmytro Laktyushkin 		REG_SET_3(CUR_COLOR2, 0,
10886b6a203SDmytro Laktyushkin 			CUR_COLOR2_BLUE, 0xff,
10986b6a203SDmytro Laktyushkin 			CUR_COLOR2_GREEN, 0xff,
11086b6a203SDmytro Laktyushkin 			CUR_COLOR2_RED, 0xff);
11186b6a203SDmytro Laktyushkin 	}
11286b6a203SDmytro Laktyushkin 
11386b6a203SDmytro Laktyushkin 	/*
11486b6a203SDmytro Laktyushkin 	 * Program cursor size -- NOTE: HW spec specifies that HW register
11586b6a203SDmytro Laktyushkin 	 * stores size as (height - 1, width - 1)
11686b6a203SDmytro Laktyushkin 	 */
11786b6a203SDmytro Laktyushkin 	REG_SET_2(CUR_SIZE, 0,
11886b6a203SDmytro Laktyushkin 		CURSOR_WIDTH, attributes->width-1,
11986b6a203SDmytro Laktyushkin 		CURSOR_HEIGHT, attributes->height-1);
12086b6a203SDmytro Laktyushkin 
12186b6a203SDmytro Laktyushkin 	/* Program cursor surface address */
12286b6a203SDmytro Laktyushkin 	/* SURFACE_ADDRESS_HIGH: Higher order bits (39:32) of hardware cursor
12386b6a203SDmytro Laktyushkin 	 * surface base address in byte. It is 4K byte aligned.
12486b6a203SDmytro Laktyushkin 	 * The correct way to program cursor surface address is to first write
12586b6a203SDmytro Laktyushkin 	 * to CUR_SURFACE_ADDRESS_HIGH, and then write to CUR_SURFACE_ADDRESS
12686b6a203SDmytro Laktyushkin 	 */
12786b6a203SDmytro Laktyushkin 	REG_SET(CUR_SURFACE_ADDRESS_HIGH, 0,
12886b6a203SDmytro Laktyushkin 		CURSOR_SURFACE_ADDRESS_HIGH, attributes->address.high_part);
12986b6a203SDmytro Laktyushkin 
13086b6a203SDmytro Laktyushkin 	REG_SET(CUR_SURFACE_ADDRESS, 0,
13186b6a203SDmytro Laktyushkin 		CURSOR_SURFACE_ADDRESS, attributes->address.low_part);
13286b6a203SDmytro Laktyushkin 
13386b6a203SDmytro Laktyushkin 	/* Unlock Cursor registers. */
13486b6a203SDmytro Laktyushkin 	REG_UPDATE(CUR_UPDATE, CURSOR_UPDATE_LOCK, false);
13586b6a203SDmytro Laktyushkin }
13686b6a203SDmytro Laktyushkin 
137b87d78d6SYue Hin Lau 
dce_ipp_program_prescale(struct input_pixel_processor * ipp,struct ipp_prescale_params * params)138bd1be8e8SHarry Wentland static void dce_ipp_program_prescale(struct input_pixel_processor *ipp,
13986b6a203SDmytro Laktyushkin 				     struct ipp_prescale_params *params)
14086b6a203SDmytro Laktyushkin {
14186b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
14286b6a203SDmytro Laktyushkin 
14386b6a203SDmytro Laktyushkin 	/* set to bypass mode first before change */
14486b6a203SDmytro Laktyushkin 	REG_UPDATE(PRESCALE_GRPH_CONTROL,
145bd1be8e8SHarry Wentland 		   GRPH_PRESCALE_BYPASS, 1);
14686b6a203SDmytro Laktyushkin 
14786b6a203SDmytro Laktyushkin 	REG_SET_2(PRESCALE_VALUES_GRPH_R, 0,
14886b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_SCALE_R, params->scale,
14986b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_BIAS_R, params->bias);
15086b6a203SDmytro Laktyushkin 
15186b6a203SDmytro Laktyushkin 	REG_SET_2(PRESCALE_VALUES_GRPH_G, 0,
15286b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_SCALE_G, params->scale,
15386b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_BIAS_G, params->bias);
15486b6a203SDmytro Laktyushkin 
15586b6a203SDmytro Laktyushkin 	REG_SET_2(PRESCALE_VALUES_GRPH_B, 0,
15686b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_SCALE_B, params->scale,
15786b6a203SDmytro Laktyushkin 		  GRPH_PRESCALE_BIAS_B, params->bias);
15886b6a203SDmytro Laktyushkin 
15986b6a203SDmytro Laktyushkin 	if (params->mode != IPP_PRESCALE_MODE_BYPASS) {
16086b6a203SDmytro Laktyushkin 		REG_UPDATE(PRESCALE_GRPH_CONTROL,
16186b6a203SDmytro Laktyushkin 			   GRPH_PRESCALE_BYPASS, 0);
16286b6a203SDmytro Laktyushkin 
16386b6a203SDmytro Laktyushkin 		/* If prescale is in use, then legacy lut should be bypassed */
16486b6a203SDmytro Laktyushkin 		REG_UPDATE(INPUT_GAMMA_CONTROL,
16586b6a203SDmytro Laktyushkin 			   GRPH_INPUT_GAMMA_MODE, 1);
16686b6a203SDmytro Laktyushkin 	}
16786b6a203SDmytro Laktyushkin }
16886b6a203SDmytro Laktyushkin 
dce_ipp_program_input_lut(struct input_pixel_processor * ipp,const struct dc_gamma * gamma)16986b6a203SDmytro Laktyushkin static void dce_ipp_program_input_lut(
17086b6a203SDmytro Laktyushkin 	struct input_pixel_processor *ipp,
17186b6a203SDmytro Laktyushkin 	const struct dc_gamma *gamma)
17286b6a203SDmytro Laktyushkin {
17386b6a203SDmytro Laktyushkin 	int i;
17486b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
17586b6a203SDmytro Laktyushkin 
17686b6a203SDmytro Laktyushkin 	/* power on LUT memory */
177e6303950SDmytro Laktyushkin 	if (REG(DCFE_MEM_PWR_CTRL))
17886b6a203SDmytro Laktyushkin 		REG_SET(DCFE_MEM_PWR_CTRL, 0, DCP_LUT_MEM_PWR_DIS, 1);
17986b6a203SDmytro Laktyushkin 
18086b6a203SDmytro Laktyushkin 	/* enable all */
18186b6a203SDmytro Laktyushkin 	REG_SET(DC_LUT_WRITE_EN_MASK, 0, DC_LUT_WRITE_EN_MASK, 0x7);
18286b6a203SDmytro Laktyushkin 
18386b6a203SDmytro Laktyushkin 	/* 256 entry mode */
18486b6a203SDmytro Laktyushkin 	REG_UPDATE(DC_LUT_RW_MODE, DC_LUT_RW_MODE, 0);
18586b6a203SDmytro Laktyushkin 
18686b6a203SDmytro Laktyushkin 	/* LUT-256, unsigned, integer, new u0.12 format */
18786b6a203SDmytro Laktyushkin 	REG_SET_3(DC_LUT_CONTROL, 0,
18886b6a203SDmytro Laktyushkin 		DC_LUT_DATA_R_FORMAT, 3,
18986b6a203SDmytro Laktyushkin 		DC_LUT_DATA_G_FORMAT, 3,
19086b6a203SDmytro Laktyushkin 		DC_LUT_DATA_B_FORMAT, 3);
19186b6a203SDmytro Laktyushkin 
19286b6a203SDmytro Laktyushkin 	/* start from index 0 */
19386b6a203SDmytro Laktyushkin 	REG_SET(DC_LUT_RW_INDEX, 0,
19486b6a203SDmytro Laktyushkin 		DC_LUT_RW_INDEX, 0);
19586b6a203SDmytro Laktyushkin 
196d66cf5f5SAnthony Koo 	for (i = 0; i < gamma->num_entries; i++) {
197d66cf5f5SAnthony Koo 		REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
198eb0e5154SDmytro Laktyushkin 				dc_fixpt_round(
199d66cf5f5SAnthony Koo 					gamma->entries.red[i]));
200d66cf5f5SAnthony Koo 		REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
201eb0e5154SDmytro Laktyushkin 				dc_fixpt_round(
202d66cf5f5SAnthony Koo 					gamma->entries.green[i]));
203d66cf5f5SAnthony Koo 		REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
204eb0e5154SDmytro Laktyushkin 				dc_fixpt_round(
205d66cf5f5SAnthony Koo 					gamma->entries.blue[i]));
20686b6a203SDmytro Laktyushkin 	}
20786b6a203SDmytro Laktyushkin 
20886b6a203SDmytro Laktyushkin 	/* power off LUT memory */
209e6303950SDmytro Laktyushkin 	if (REG(DCFE_MEM_PWR_CTRL))
21086b6a203SDmytro Laktyushkin 		REG_SET(DCFE_MEM_PWR_CTRL, 0, DCP_LUT_MEM_PWR_DIS, 0);
21186b6a203SDmytro Laktyushkin 
21286b6a203SDmytro Laktyushkin 	/* bypass prescale, enable legacy LUT */
21386b6a203SDmytro Laktyushkin 	REG_UPDATE(PRESCALE_GRPH_CONTROL, GRPH_PRESCALE_BYPASS, 1);
21486b6a203SDmytro Laktyushkin 	REG_UPDATE(INPUT_GAMMA_CONTROL, GRPH_INPUT_GAMMA_MODE, 0);
21586b6a203SDmytro Laktyushkin }
21686b6a203SDmytro Laktyushkin 
dce_ipp_set_degamma(struct input_pixel_processor * ipp,enum ipp_degamma_mode mode)21786b6a203SDmytro Laktyushkin static void dce_ipp_set_degamma(
21886b6a203SDmytro Laktyushkin 	struct input_pixel_processor *ipp,
21986b6a203SDmytro Laktyushkin 	enum ipp_degamma_mode mode)
22086b6a203SDmytro Laktyushkin {
22186b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
22286b6a203SDmytro Laktyushkin 	uint32_t degamma_type = (mode == IPP_DEGAMMA_MODE_HW_sRGB) ? 1 : 0;
22386b6a203SDmytro Laktyushkin 
224bd1be8e8SHarry Wentland 	ASSERT(mode == IPP_DEGAMMA_MODE_BYPASS || mode == IPP_DEGAMMA_MODE_HW_sRGB);
22586b6a203SDmytro Laktyushkin 
22686b6a203SDmytro Laktyushkin 	REG_SET_3(DEGAMMA_CONTROL, 0,
22786b6a203SDmytro Laktyushkin 		  GRPH_DEGAMMA_MODE, degamma_type,
22886b6a203SDmytro Laktyushkin 		  CURSOR_DEGAMMA_MODE, degamma_type,
22986b6a203SDmytro Laktyushkin 		  CURSOR2_DEGAMMA_MODE, degamma_type);
23086b6a203SDmytro Laktyushkin }
23186b6a203SDmytro Laktyushkin 
23289571d7cSMauro Rossi #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_ipp_set_degamma(struct input_pixel_processor * ipp,enum ipp_degamma_mode mode)23389571d7cSMauro Rossi static void dce60_ipp_set_degamma(
23489571d7cSMauro Rossi 	struct input_pixel_processor *ipp,
23589571d7cSMauro Rossi 	enum ipp_degamma_mode mode)
23689571d7cSMauro Rossi {
23789571d7cSMauro Rossi 	struct dce_ipp *ipp_dce = TO_DCE_IPP(ipp);
23889571d7cSMauro Rossi 	uint32_t degamma_type = (mode == IPP_DEGAMMA_MODE_HW_sRGB) ? 1 : 0;
23989571d7cSMauro Rossi 
24089571d7cSMauro Rossi 	ASSERT(mode == IPP_DEGAMMA_MODE_BYPASS || mode == IPP_DEGAMMA_MODE_HW_sRGB);
24189571d7cSMauro Rossi 	/* DCE6 does not have CURSOR2_DEGAMMA_MODE bit in DEGAMMA_CONTROL reg */
24289571d7cSMauro Rossi 	REG_SET_2(DEGAMMA_CONTROL, 0,
24389571d7cSMauro Rossi 		  GRPH_DEGAMMA_MODE, degamma_type,
24489571d7cSMauro Rossi 		  CURSOR_DEGAMMA_MODE, degamma_type);
24589571d7cSMauro Rossi }
24689571d7cSMauro Rossi #endif
24789571d7cSMauro Rossi 
24886b6a203SDmytro Laktyushkin static const struct ipp_funcs dce_ipp_funcs = {
24986b6a203SDmytro Laktyushkin 	.ipp_cursor_set_attributes = dce_ipp_cursor_set_attributes,
25086b6a203SDmytro Laktyushkin 	.ipp_cursor_set_position = dce_ipp_cursor_set_position,
25186b6a203SDmytro Laktyushkin 	.ipp_program_prescale = dce_ipp_program_prescale,
25286b6a203SDmytro Laktyushkin 	.ipp_program_input_lut = dce_ipp_program_input_lut,
25386b6a203SDmytro Laktyushkin 	.ipp_set_degamma = dce_ipp_set_degamma
25486b6a203SDmytro Laktyushkin };
25586b6a203SDmytro Laktyushkin 
25689571d7cSMauro Rossi #if defined(CONFIG_DRM_AMD_DC_SI)
25789571d7cSMauro Rossi static const struct ipp_funcs dce60_ipp_funcs = {
25889571d7cSMauro Rossi 	.ipp_cursor_set_attributes = dce_ipp_cursor_set_attributes,
25989571d7cSMauro Rossi 	.ipp_cursor_set_position = dce_ipp_cursor_set_position,
26089571d7cSMauro Rossi 	.ipp_program_prescale = dce_ipp_program_prescale,
26189571d7cSMauro Rossi 	.ipp_program_input_lut = dce_ipp_program_input_lut,
26289571d7cSMauro Rossi 	.ipp_set_degamma = dce60_ipp_set_degamma
26389571d7cSMauro Rossi };
26489571d7cSMauro Rossi #endif
26589571d7cSMauro Rossi 
26689571d7cSMauro Rossi 
26786b6a203SDmytro Laktyushkin /*****************************************/
26886b6a203SDmytro Laktyushkin /* Constructor, Destructor               */
26986b6a203SDmytro Laktyushkin /*****************************************/
27086b6a203SDmytro Laktyushkin 
dce_ipp_construct(struct dce_ipp * ipp_dce,struct dc_context * ctx,int inst,const struct dce_ipp_registers * regs,const struct dce_ipp_shift * ipp_shift,const struct dce_ipp_mask * ipp_mask)27186b6a203SDmytro Laktyushkin void dce_ipp_construct(
27286b6a203SDmytro Laktyushkin 	struct dce_ipp *ipp_dce,
27386b6a203SDmytro Laktyushkin 	struct dc_context *ctx,
27486b6a203SDmytro Laktyushkin 	int inst,
27586b6a203SDmytro Laktyushkin 	const struct dce_ipp_registers *regs,
27686b6a203SDmytro Laktyushkin 	const struct dce_ipp_shift *ipp_shift,
27786b6a203SDmytro Laktyushkin 	const struct dce_ipp_mask *ipp_mask)
27886b6a203SDmytro Laktyushkin {
27986b6a203SDmytro Laktyushkin 	ipp_dce->base.ctx = ctx;
28086b6a203SDmytro Laktyushkin 	ipp_dce->base.inst = inst;
28186b6a203SDmytro Laktyushkin 	ipp_dce->base.funcs = &dce_ipp_funcs;
28286b6a203SDmytro Laktyushkin 
28386b6a203SDmytro Laktyushkin 	ipp_dce->regs = regs;
28486b6a203SDmytro Laktyushkin 	ipp_dce->ipp_shift = ipp_shift;
28586b6a203SDmytro Laktyushkin 	ipp_dce->ipp_mask = ipp_mask;
28686b6a203SDmytro Laktyushkin }
287e6303950SDmytro Laktyushkin 
28889571d7cSMauro Rossi #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_ipp_construct(struct dce_ipp * ipp_dce,struct dc_context * ctx,int inst,const struct dce_ipp_registers * regs,const struct dce_ipp_shift * ipp_shift,const struct dce_ipp_mask * ipp_mask)28989571d7cSMauro Rossi void dce60_ipp_construct(
29089571d7cSMauro Rossi 	struct dce_ipp *ipp_dce,
29189571d7cSMauro Rossi 	struct dc_context *ctx,
29289571d7cSMauro Rossi 	int inst,
29389571d7cSMauro Rossi 	const struct dce_ipp_registers *regs,
29489571d7cSMauro Rossi 	const struct dce_ipp_shift *ipp_shift,
29589571d7cSMauro Rossi 	const struct dce_ipp_mask *ipp_mask)
29689571d7cSMauro Rossi {
29789571d7cSMauro Rossi 	ipp_dce->base.ctx = ctx;
29889571d7cSMauro Rossi 	ipp_dce->base.inst = inst;
29989571d7cSMauro Rossi 	ipp_dce->base.funcs = &dce60_ipp_funcs;
30089571d7cSMauro Rossi 
30189571d7cSMauro Rossi 	ipp_dce->regs = regs;
30289571d7cSMauro Rossi 	ipp_dce->ipp_shift = ipp_shift;
30389571d7cSMauro Rossi 	ipp_dce->ipp_mask = ipp_mask;
30489571d7cSMauro Rossi }
30589571d7cSMauro Rossi #endif
30689571d7cSMauro Rossi 
dce_ipp_destroy(struct input_pixel_processor ** ipp)307e6303950SDmytro Laktyushkin void dce_ipp_destroy(struct input_pixel_processor **ipp)
308e6303950SDmytro Laktyushkin {
3092004f45eSHarry Wentland 	kfree(TO_DCE_IPP(*ipp));
310e6303950SDmytro Laktyushkin 	*ipp = NULL;
311e6303950SDmytro Laktyushkin }
312