1fb4d8502Sjsg /*
2fb4d8502Sjsg * Copyright 2012-15 Advanced Micro Devices, Inc.
3fb4d8502Sjsg *
4fb4d8502Sjsg * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg *
11fb4d8502Sjsg * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg * all copies or substantial portions of the Software.
13fb4d8502Sjsg *
14fb4d8502Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17fb4d8502Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg *
22fb4d8502Sjsg * Authors: AMD
23fb4d8502Sjsg *
24fb4d8502Sjsg */
25fb4d8502Sjsg
26fb4d8502Sjsg #include "dm_services.h"
27fb4d8502Sjsg #include "basics/conversion.h"
28fb4d8502Sjsg
29fb4d8502Sjsg #include "dce_opp.h"
30fb4d8502Sjsg
31fb4d8502Sjsg #include "reg_helper.h"
32fb4d8502Sjsg
33fb4d8502Sjsg #define REG(reg)\
34fb4d8502Sjsg (opp110->regs->reg)
35fb4d8502Sjsg
36fb4d8502Sjsg #undef FN
37fb4d8502Sjsg #define FN(reg_name, field_name) \
38fb4d8502Sjsg opp110->opp_shift->field_name, opp110->opp_mask->field_name
39fb4d8502Sjsg
40fb4d8502Sjsg #define CTX \
41fb4d8502Sjsg opp110->base.ctx
42fb4d8502Sjsg
43fb4d8502Sjsg enum {
44fb4d8502Sjsg MAX_PWL_ENTRY = 128,
45fb4d8502Sjsg MAX_REGIONS_NUMBER = 16
46fb4d8502Sjsg };
47fb4d8502Sjsg
48fb4d8502Sjsg enum {
49fb4d8502Sjsg MAX_LUT_ENTRY = 256,
50fb4d8502Sjsg MAX_NUMBER_OF_ENTRIES = 256
51fb4d8502Sjsg };
52fb4d8502Sjsg
53fb4d8502Sjsg
54fb4d8502Sjsg enum {
55fb4d8502Sjsg OUTPUT_CSC_MATRIX_SIZE = 12
56fb4d8502Sjsg };
57fb4d8502Sjsg
58fb4d8502Sjsg
59fb4d8502Sjsg
60fb4d8502Sjsg
61fb4d8502Sjsg
62fb4d8502Sjsg
63fb4d8502Sjsg
64fb4d8502Sjsg
65fb4d8502Sjsg
66fb4d8502Sjsg
67fb4d8502Sjsg
68fb4d8502Sjsg
69fb4d8502Sjsg
70fb4d8502Sjsg
71fb4d8502Sjsg
72fb4d8502Sjsg
73fb4d8502Sjsg
74fb4d8502Sjsg
75fb4d8502Sjsg
76fb4d8502Sjsg
77fb4d8502Sjsg
78fb4d8502Sjsg
79fb4d8502Sjsg /*
80fb4d8502Sjsg *****************************************************************************
81fb4d8502Sjsg * Function: regamma_config_regions_and_segments
82fb4d8502Sjsg *
83fb4d8502Sjsg * build regamma curve by using predefined hw points
84fb4d8502Sjsg * uses interface parameters ,like EDID coeff.
85fb4d8502Sjsg *
86fb4d8502Sjsg * @param : parameters interface parameters
87fb4d8502Sjsg * @return void
88fb4d8502Sjsg *
89fb4d8502Sjsg * @note
90fb4d8502Sjsg *
91fb4d8502Sjsg * @see
92fb4d8502Sjsg *
93fb4d8502Sjsg *****************************************************************************
94fb4d8502Sjsg */
95fb4d8502Sjsg
96fb4d8502Sjsg
97fb4d8502Sjsg
98*5ca02815Sjsg /*
99fb4d8502Sjsg * set_truncation
100fb4d8502Sjsg * 1) set truncation depth: 0 for 18 bpp or 1 for 24 bpp
101fb4d8502Sjsg * 2) enable truncation
102fb4d8502Sjsg * 3) HW remove 12bit FMT support for DCE11 power saving reason.
103fb4d8502Sjsg */
set_truncation(struct dce110_opp * opp110,const struct bit_depth_reduction_params * params)104fb4d8502Sjsg static void set_truncation(
105fb4d8502Sjsg struct dce110_opp *opp110,
106fb4d8502Sjsg const struct bit_depth_reduction_params *params)
107fb4d8502Sjsg {
108fb4d8502Sjsg /*Disable truncation*/
109fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
110fb4d8502Sjsg FMT_TRUNCATE_EN, 0,
111fb4d8502Sjsg FMT_TRUNCATE_DEPTH, 0,
112fb4d8502Sjsg FMT_TRUNCATE_MODE, 0);
113fb4d8502Sjsg
114fb4d8502Sjsg
115fb4d8502Sjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
116fb4d8502Sjsg /* 8bpc trunc on YCbCr422*/
117fb4d8502Sjsg if (params->flags.TRUNCATE_DEPTH == 1)
118fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
119fb4d8502Sjsg FMT_TRUNCATE_EN, 1,
120fb4d8502Sjsg FMT_TRUNCATE_DEPTH, 1,
121fb4d8502Sjsg FMT_TRUNCATE_MODE, 0);
122fb4d8502Sjsg else if (params->flags.TRUNCATE_DEPTH == 2)
123fb4d8502Sjsg /* 10bpc trunc on YCbCr422*/
124fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
125fb4d8502Sjsg FMT_TRUNCATE_EN, 1,
126fb4d8502Sjsg FMT_TRUNCATE_DEPTH, 2,
127fb4d8502Sjsg FMT_TRUNCATE_MODE, 0);
128fb4d8502Sjsg return;
129fb4d8502Sjsg }
130fb4d8502Sjsg /* on other format-to do */
131fb4d8502Sjsg if (params->flags.TRUNCATE_ENABLED == 0)
132fb4d8502Sjsg return;
133fb4d8502Sjsg /*Set truncation depth and Enable truncation*/
134fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
135fb4d8502Sjsg FMT_TRUNCATE_EN, 1,
136fb4d8502Sjsg FMT_TRUNCATE_DEPTH,
137fb4d8502Sjsg params->flags.TRUNCATE_DEPTH,
138fb4d8502Sjsg FMT_TRUNCATE_MODE,
139fb4d8502Sjsg params->flags.TRUNCATE_MODE);
140fb4d8502Sjsg }
141fb4d8502Sjsg
142ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
143*5ca02815Sjsg /*
144ad8b1aafSjsg * dce60_set_truncation
145ad8b1aafSjsg * 1) set truncation depth: 0 for 18 bpp or 1 for 24 bpp
146ad8b1aafSjsg * 2) enable truncation
147ad8b1aafSjsg * 3) HW remove 12bit FMT support for DCE11 power saving reason.
148ad8b1aafSjsg */
dce60_set_truncation(struct dce110_opp * opp110,const struct bit_depth_reduction_params * params)149ad8b1aafSjsg static void dce60_set_truncation(
150ad8b1aafSjsg struct dce110_opp *opp110,
151ad8b1aafSjsg const struct bit_depth_reduction_params *params)
152ad8b1aafSjsg {
153ad8b1aafSjsg /* DCE6 has no FMT_TRUNCATE_MODE bit in FMT_BIT_DEPTH_CONTROL reg */
154ad8b1aafSjsg
155ad8b1aafSjsg /*Disable truncation*/
156ad8b1aafSjsg REG_UPDATE_2(FMT_BIT_DEPTH_CONTROL,
157ad8b1aafSjsg FMT_TRUNCATE_EN, 0,
158ad8b1aafSjsg FMT_TRUNCATE_DEPTH, 0);
159ad8b1aafSjsg
160ad8b1aafSjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
161ad8b1aafSjsg /* 8bpc trunc on YCbCr422*/
162ad8b1aafSjsg if (params->flags.TRUNCATE_DEPTH == 1)
163ad8b1aafSjsg REG_UPDATE_2(FMT_BIT_DEPTH_CONTROL,
164ad8b1aafSjsg FMT_TRUNCATE_EN, 1,
165ad8b1aafSjsg FMT_TRUNCATE_DEPTH, 1);
166ad8b1aafSjsg else if (params->flags.TRUNCATE_DEPTH == 2)
167ad8b1aafSjsg /* 10bpc trunc on YCbCr422*/
168ad8b1aafSjsg REG_UPDATE_2(FMT_BIT_DEPTH_CONTROL,
169ad8b1aafSjsg FMT_TRUNCATE_EN, 1,
170ad8b1aafSjsg FMT_TRUNCATE_DEPTH, 2);
171ad8b1aafSjsg return;
172ad8b1aafSjsg }
173ad8b1aafSjsg /* on other format-to do */
174ad8b1aafSjsg if (params->flags.TRUNCATE_ENABLED == 0)
175ad8b1aafSjsg return;
176ad8b1aafSjsg /*Set truncation depth and Enable truncation*/
177ad8b1aafSjsg REG_UPDATE_2(FMT_BIT_DEPTH_CONTROL,
178ad8b1aafSjsg FMT_TRUNCATE_EN, 1,
179ad8b1aafSjsg FMT_TRUNCATE_DEPTH,
180ad8b1aafSjsg params->flags.TRUNCATE_DEPTH);
181ad8b1aafSjsg }
182ad8b1aafSjsg #endif
183fb4d8502Sjsg
184*5ca02815Sjsg /*
185fb4d8502Sjsg * set_spatial_dither
186fb4d8502Sjsg * 1) set spatial dithering mode: pattern of seed
187fb4d8502Sjsg * 2) set spatial dithering depth: 0 for 18bpp or 1 for 24bpp
188fb4d8502Sjsg * 3) set random seed
189fb4d8502Sjsg * 4) set random mode
190fb4d8502Sjsg * lfsr is reset every frame or not reset
191fb4d8502Sjsg * RGB dithering method
192fb4d8502Sjsg * 0: RGB data are all dithered with x^28+x^3+1
193fb4d8502Sjsg * 1: R data is dithered with x^28+x^3+1
194fb4d8502Sjsg * G data is dithered with x^28+X^9+1
195fb4d8502Sjsg * B data is dithered with x^28+x^13+1
196fb4d8502Sjsg * enable high pass filter or not
197fb4d8502Sjsg * 5) enable spatical dithering
198fb4d8502Sjsg */
set_spatial_dither(struct dce110_opp * opp110,const struct bit_depth_reduction_params * params)199fb4d8502Sjsg static void set_spatial_dither(
200fb4d8502Sjsg struct dce110_opp *opp110,
201fb4d8502Sjsg const struct bit_depth_reduction_params *params)
202fb4d8502Sjsg {
203fb4d8502Sjsg /*Disable spatial (random) dithering*/
204fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
205fb4d8502Sjsg FMT_SPATIAL_DITHER_EN, 0,
206fb4d8502Sjsg FMT_SPATIAL_DITHER_DEPTH, 0,
207fb4d8502Sjsg FMT_SPATIAL_DITHER_MODE, 0);
208fb4d8502Sjsg
209fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
210fb4d8502Sjsg FMT_HIGHPASS_RANDOM_ENABLE, 0,
211fb4d8502Sjsg FMT_FRAME_RANDOM_ENABLE, 0,
212fb4d8502Sjsg FMT_RGB_RANDOM_ENABLE, 0);
213fb4d8502Sjsg
214fb4d8502Sjsg REG_UPDATE(FMT_BIT_DEPTH_CONTROL,
215fb4d8502Sjsg FMT_TEMPORAL_DITHER_EN, 0);
216fb4d8502Sjsg
217*5ca02815Sjsg if (params->flags.SPATIAL_DITHER_ENABLED == 0)
218fb4d8502Sjsg return;
219fb4d8502Sjsg
220fb4d8502Sjsg /* only use FRAME_COUNTER_MAX if frameRandom == 1*/
221fb4d8502Sjsg
222fb4d8502Sjsg if (opp110->opp_mask->FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX &&
223fb4d8502Sjsg opp110->opp_mask->FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP) {
224fb4d8502Sjsg if (params->flags.FRAME_RANDOM == 1) {
225fb4d8502Sjsg if (params->flags.SPATIAL_DITHER_DEPTH == 0 ||
226fb4d8502Sjsg params->flags.SPATIAL_DITHER_DEPTH == 1) {
227fb4d8502Sjsg REG_UPDATE_2(FMT_CONTROL,
228fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 15,
229fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 2);
230fb4d8502Sjsg } else if (params->flags.SPATIAL_DITHER_DEPTH == 2) {
231fb4d8502Sjsg REG_UPDATE_2(FMT_CONTROL,
232fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 3,
233fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 1);
234fb4d8502Sjsg } else
235fb4d8502Sjsg return;
236fb4d8502Sjsg } else {
237fb4d8502Sjsg REG_UPDATE_2(FMT_CONTROL,
238fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 0,
239fb4d8502Sjsg FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 0);
240fb4d8502Sjsg }
241fb4d8502Sjsg }
242fb4d8502Sjsg /* Set seed for random values for
243fb4d8502Sjsg * spatial dithering for R,G,B channels
244fb4d8502Sjsg */
245fb4d8502Sjsg REG_UPDATE(FMT_DITHER_RAND_R_SEED,
246fb4d8502Sjsg FMT_RAND_R_SEED, params->r_seed_value);
247fb4d8502Sjsg
248fb4d8502Sjsg REG_UPDATE(FMT_DITHER_RAND_G_SEED,
249fb4d8502Sjsg FMT_RAND_G_SEED, params->g_seed_value);
250fb4d8502Sjsg
251fb4d8502Sjsg REG_UPDATE(FMT_DITHER_RAND_B_SEED,
252fb4d8502Sjsg FMT_RAND_B_SEED, params->b_seed_value);
253fb4d8502Sjsg
254fb4d8502Sjsg /* FMT_OFFSET_R_Cr 31:16 0x0 Setting the zero
255fb4d8502Sjsg * offset for the R/Cr channel, lower 4LSB
256fb4d8502Sjsg * is forced to zeros. Typically set to 0
257fb4d8502Sjsg * RGB and 0x80000 YCbCr.
258fb4d8502Sjsg */
259fb4d8502Sjsg /* FMT_OFFSET_G_Y 31:16 0x0 Setting the zero
260fb4d8502Sjsg * offset for the G/Y channel, lower 4LSB is
261fb4d8502Sjsg * forced to zeros. Typically set to 0 RGB
262fb4d8502Sjsg * and 0x80000 YCbCr.
263fb4d8502Sjsg */
264fb4d8502Sjsg /* FMT_OFFSET_B_Cb 31:16 0x0 Setting the zero
265fb4d8502Sjsg * offset for the B/Cb channel, lower 4LSB is
266fb4d8502Sjsg * forced to zeros. Typically set to 0 RGB and
267fb4d8502Sjsg * 0x80000 YCbCr.
268fb4d8502Sjsg */
269fb4d8502Sjsg
270fb4d8502Sjsg /* Disable High pass filter
271fb4d8502Sjsg * Reset only at startup
272fb4d8502Sjsg * Set RGB data dithered with x^28+x^3+1
273fb4d8502Sjsg */
274fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
275fb4d8502Sjsg FMT_HIGHPASS_RANDOM_ENABLE, params->flags.HIGHPASS_RANDOM,
276fb4d8502Sjsg FMT_FRAME_RANDOM_ENABLE, params->flags.FRAME_RANDOM,
277fb4d8502Sjsg FMT_RGB_RANDOM_ENABLE, params->flags.RGB_RANDOM);
278fb4d8502Sjsg
279fb4d8502Sjsg /* Set spatial dithering bit depth
280fb4d8502Sjsg * Set spatial dithering mode
281fb4d8502Sjsg * (default is Seed patterrn AAAA...)
282fb4d8502Sjsg * Enable spatial dithering
283fb4d8502Sjsg */
284fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
285fb4d8502Sjsg FMT_SPATIAL_DITHER_DEPTH, params->flags.SPATIAL_DITHER_DEPTH,
286fb4d8502Sjsg FMT_SPATIAL_DITHER_MODE, params->flags.SPATIAL_DITHER_MODE,
287fb4d8502Sjsg FMT_SPATIAL_DITHER_EN, 1);
288fb4d8502Sjsg }
289fb4d8502Sjsg
290*5ca02815Sjsg /*
291fb4d8502Sjsg * SetTemporalDither (Frame Modulation)
292fb4d8502Sjsg * 1) set temporal dither depth
293fb4d8502Sjsg * 2) select pattern: from hard-coded pattern or programmable pattern
294fb4d8502Sjsg * 3) select optimized strips for BGR or RGB LCD sub-pixel
295fb4d8502Sjsg * 4) set s matrix
296fb4d8502Sjsg * 5) set t matrix
297fb4d8502Sjsg * 6) set grey level for 0.25, 0.5, 0.75
298fb4d8502Sjsg * 7) enable temporal dithering
299fb4d8502Sjsg */
300fb4d8502Sjsg
set_temporal_dither(struct dce110_opp * opp110,const struct bit_depth_reduction_params * params)301fb4d8502Sjsg static void set_temporal_dither(
302fb4d8502Sjsg struct dce110_opp *opp110,
303fb4d8502Sjsg const struct bit_depth_reduction_params *params)
304fb4d8502Sjsg {
305fb4d8502Sjsg /*Disable temporal (frame modulation) dithering first*/
306fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
307fb4d8502Sjsg FMT_TEMPORAL_DITHER_EN, 0,
308fb4d8502Sjsg FMT_TEMPORAL_DITHER_RESET, 0,
309fb4d8502Sjsg FMT_TEMPORAL_DITHER_OFFSET, 0);
310fb4d8502Sjsg
311fb4d8502Sjsg REG_UPDATE_2(FMT_BIT_DEPTH_CONTROL,
312fb4d8502Sjsg FMT_TEMPORAL_DITHER_DEPTH, 0,
313fb4d8502Sjsg FMT_TEMPORAL_LEVEL, 0);
314fb4d8502Sjsg
315fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
316fb4d8502Sjsg FMT_25FRC_SEL, 0,
317fb4d8502Sjsg FMT_50FRC_SEL, 0,
318fb4d8502Sjsg FMT_75FRC_SEL, 0);
319fb4d8502Sjsg
320fb4d8502Sjsg /* no 10bpc dither on DCE11*/
321fb4d8502Sjsg if (params->flags.FRAME_MODULATION_ENABLED == 0 ||
322fb4d8502Sjsg params->flags.FRAME_MODULATION_DEPTH == 2)
323fb4d8502Sjsg return;
324fb4d8502Sjsg
325fb4d8502Sjsg /* Set temporal dithering depth*/
326fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
327fb4d8502Sjsg FMT_TEMPORAL_DITHER_DEPTH, params->flags.FRAME_MODULATION_DEPTH,
328fb4d8502Sjsg FMT_TEMPORAL_DITHER_RESET, 0,
329fb4d8502Sjsg FMT_TEMPORAL_DITHER_OFFSET, 0);
330fb4d8502Sjsg
331fb4d8502Sjsg /*Select legacy pattern based on FRC and Temporal level*/
332fb4d8502Sjsg if (REG(FMT_TEMPORAL_DITHER_PATTERN_CONTROL)) {
333fb4d8502Sjsg REG_WRITE(FMT_TEMPORAL_DITHER_PATTERN_CONTROL, 0);
334fb4d8502Sjsg /*Set s matrix*/
335fb4d8502Sjsg REG_WRITE(FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX, 0);
336fb4d8502Sjsg /*Set t matrix*/
337fb4d8502Sjsg REG_WRITE(FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX, 0);
338fb4d8502Sjsg }
339fb4d8502Sjsg
340fb4d8502Sjsg /*Select patterns for 0.25, 0.5 and 0.75 grey level*/
341fb4d8502Sjsg REG_UPDATE(FMT_BIT_DEPTH_CONTROL,
342fb4d8502Sjsg FMT_TEMPORAL_LEVEL, params->flags.TEMPORAL_LEVEL);
343fb4d8502Sjsg
344fb4d8502Sjsg REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
345fb4d8502Sjsg FMT_25FRC_SEL, params->flags.FRC25,
346fb4d8502Sjsg FMT_50FRC_SEL, params->flags.FRC50,
347fb4d8502Sjsg FMT_75FRC_SEL, params->flags.FRC75);
348fb4d8502Sjsg
349fb4d8502Sjsg /*Enable bit reduction by temporal (frame modulation) dithering*/
350fb4d8502Sjsg REG_UPDATE(FMT_BIT_DEPTH_CONTROL,
351fb4d8502Sjsg FMT_TEMPORAL_DITHER_EN, 1);
352fb4d8502Sjsg }
353fb4d8502Sjsg
354*5ca02815Sjsg /*
355fb4d8502Sjsg * Set Clamping
356fb4d8502Sjsg * 1) Set clamping format based on bpc - 0 for 6bpc (No clamping)
357fb4d8502Sjsg * 1 for 8 bpc
358fb4d8502Sjsg * 2 for 10 bpc
359fb4d8502Sjsg * 3 for 12 bpc
360fb4d8502Sjsg * 7 for programable
361fb4d8502Sjsg * 2) Enable clamp if Limited range requested
362fb4d8502Sjsg */
dce110_opp_set_clamping(struct dce110_opp * opp110,const struct clamping_and_pixel_encoding_params * params)363fb4d8502Sjsg void dce110_opp_set_clamping(
364fb4d8502Sjsg struct dce110_opp *opp110,
365fb4d8502Sjsg const struct clamping_and_pixel_encoding_params *params)
366fb4d8502Sjsg {
367fb4d8502Sjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
368fb4d8502Sjsg FMT_CLAMP_DATA_EN, 0,
369fb4d8502Sjsg FMT_CLAMP_COLOR_FORMAT, 0);
370fb4d8502Sjsg
371fb4d8502Sjsg switch (params->clamping_level) {
372fb4d8502Sjsg case CLAMPING_FULL_RANGE:
373fb4d8502Sjsg break;
374fb4d8502Sjsg case CLAMPING_LIMITED_RANGE_8BPC:
375fb4d8502Sjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
376fb4d8502Sjsg FMT_CLAMP_DATA_EN, 1,
377fb4d8502Sjsg FMT_CLAMP_COLOR_FORMAT, 1);
378fb4d8502Sjsg break;
379fb4d8502Sjsg case CLAMPING_LIMITED_RANGE_10BPC:
380fb4d8502Sjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
381fb4d8502Sjsg FMT_CLAMP_DATA_EN, 1,
382fb4d8502Sjsg FMT_CLAMP_COLOR_FORMAT, 2);
383fb4d8502Sjsg break;
384fb4d8502Sjsg case CLAMPING_LIMITED_RANGE_12BPC:
385fb4d8502Sjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
386fb4d8502Sjsg FMT_CLAMP_DATA_EN, 1,
387fb4d8502Sjsg FMT_CLAMP_COLOR_FORMAT, 3);
388fb4d8502Sjsg break;
389fb4d8502Sjsg case CLAMPING_LIMITED_RANGE_PROGRAMMABLE:
390fb4d8502Sjsg /*Set clamp control*/
391fb4d8502Sjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
392fb4d8502Sjsg FMT_CLAMP_DATA_EN, 1,
393fb4d8502Sjsg FMT_CLAMP_COLOR_FORMAT, 7);
394fb4d8502Sjsg
395fb4d8502Sjsg /*set the defaults*/
396fb4d8502Sjsg REG_SET_2(FMT_CLAMP_COMPONENT_R, 0,
397fb4d8502Sjsg FMT_CLAMP_LOWER_R, 0x10,
398fb4d8502Sjsg FMT_CLAMP_UPPER_R, 0xFEF);
399fb4d8502Sjsg
400fb4d8502Sjsg REG_SET_2(FMT_CLAMP_COMPONENT_G, 0,
401fb4d8502Sjsg FMT_CLAMP_LOWER_G, 0x10,
402fb4d8502Sjsg FMT_CLAMP_UPPER_G, 0xFEF);
403fb4d8502Sjsg
404fb4d8502Sjsg REG_SET_2(FMT_CLAMP_COMPONENT_B, 0,
405fb4d8502Sjsg FMT_CLAMP_LOWER_B, 0x10,
406fb4d8502Sjsg FMT_CLAMP_UPPER_B, 0xFEF);
407fb4d8502Sjsg break;
408fb4d8502Sjsg default:
409fb4d8502Sjsg break;
410fb4d8502Sjsg }
411fb4d8502Sjsg }
412fb4d8502Sjsg
413ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
414*5ca02815Sjsg /*
415ad8b1aafSjsg * Set Clamping for DCE6 parts
416ad8b1aafSjsg * 1) Set clamping format based on bpc - 0 for 6bpc (No clamping)
417ad8b1aafSjsg * 1 for 8 bpc
418ad8b1aafSjsg * 2 for 10 bpc
419ad8b1aafSjsg * 3 for 12 bpc
420ad8b1aafSjsg * 7 for programable
421ad8b1aafSjsg * 2) Enable clamp if Limited range requested
422ad8b1aafSjsg */
dce60_opp_set_clamping(struct dce110_opp * opp110,const struct clamping_and_pixel_encoding_params * params)423*5ca02815Sjsg static void dce60_opp_set_clamping(
424ad8b1aafSjsg struct dce110_opp *opp110,
425ad8b1aafSjsg const struct clamping_and_pixel_encoding_params *params)
426ad8b1aafSjsg {
427ad8b1aafSjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
428ad8b1aafSjsg FMT_CLAMP_DATA_EN, 0,
429ad8b1aafSjsg FMT_CLAMP_COLOR_FORMAT, 0);
430ad8b1aafSjsg
431ad8b1aafSjsg switch (params->clamping_level) {
432ad8b1aafSjsg case CLAMPING_FULL_RANGE:
433ad8b1aafSjsg break;
434ad8b1aafSjsg case CLAMPING_LIMITED_RANGE_8BPC:
435ad8b1aafSjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
436ad8b1aafSjsg FMT_CLAMP_DATA_EN, 1,
437ad8b1aafSjsg FMT_CLAMP_COLOR_FORMAT, 1);
438ad8b1aafSjsg break;
439ad8b1aafSjsg case CLAMPING_LIMITED_RANGE_10BPC:
440ad8b1aafSjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
441ad8b1aafSjsg FMT_CLAMP_DATA_EN, 1,
442ad8b1aafSjsg FMT_CLAMP_COLOR_FORMAT, 2);
443ad8b1aafSjsg break;
444ad8b1aafSjsg case CLAMPING_LIMITED_RANGE_12BPC:
445ad8b1aafSjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
446ad8b1aafSjsg FMT_CLAMP_DATA_EN, 1,
447ad8b1aafSjsg FMT_CLAMP_COLOR_FORMAT, 3);
448ad8b1aafSjsg break;
449ad8b1aafSjsg case CLAMPING_LIMITED_RANGE_PROGRAMMABLE:
450ad8b1aafSjsg /*Set clamp control*/
451ad8b1aafSjsg REG_SET_2(FMT_CLAMP_CNTL, 0,
452ad8b1aafSjsg FMT_CLAMP_DATA_EN, 1,
453ad8b1aafSjsg FMT_CLAMP_COLOR_FORMAT, 7);
454ad8b1aafSjsg
455ad8b1aafSjsg /* DCE6 does have FMT_CLAMP_COMPONENT_{R,G,B} registers */
456ad8b1aafSjsg
457ad8b1aafSjsg break;
458ad8b1aafSjsg default:
459ad8b1aafSjsg break;
460ad8b1aafSjsg }
461ad8b1aafSjsg }
462ad8b1aafSjsg #endif
463ad8b1aafSjsg
464*5ca02815Sjsg /*
465fb4d8502Sjsg * set_pixel_encoding
466fb4d8502Sjsg *
467fb4d8502Sjsg * Set Pixel Encoding
468fb4d8502Sjsg * 0: RGB 4:4:4 or YCbCr 4:4:4 or YOnly
469fb4d8502Sjsg * 1: YCbCr 4:2:2
470fb4d8502Sjsg */
set_pixel_encoding(struct dce110_opp * opp110,const struct clamping_and_pixel_encoding_params * params)471fb4d8502Sjsg static void set_pixel_encoding(
472fb4d8502Sjsg struct dce110_opp *opp110,
473fb4d8502Sjsg const struct clamping_and_pixel_encoding_params *params)
474fb4d8502Sjsg {
475fb4d8502Sjsg if (opp110->opp_mask->FMT_CBCR_BIT_REDUCTION_BYPASS)
476fb4d8502Sjsg REG_UPDATE_3(FMT_CONTROL,
477fb4d8502Sjsg FMT_PIXEL_ENCODING, 0,
478fb4d8502Sjsg FMT_SUBSAMPLING_MODE, 0,
479fb4d8502Sjsg FMT_CBCR_BIT_REDUCTION_BYPASS, 0);
480fb4d8502Sjsg else
481fb4d8502Sjsg REG_UPDATE_2(FMT_CONTROL,
482fb4d8502Sjsg FMT_PIXEL_ENCODING, 0,
483fb4d8502Sjsg FMT_SUBSAMPLING_MODE, 0);
484fb4d8502Sjsg
485fb4d8502Sjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
486fb4d8502Sjsg REG_UPDATE_2(FMT_CONTROL,
487fb4d8502Sjsg FMT_PIXEL_ENCODING, 1,
488fb4d8502Sjsg FMT_SUBSAMPLING_ORDER, 0);
489fb4d8502Sjsg }
490fb4d8502Sjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR420) {
491fb4d8502Sjsg REG_UPDATE_3(FMT_CONTROL,
492fb4d8502Sjsg FMT_PIXEL_ENCODING, 2,
493fb4d8502Sjsg FMT_SUBSAMPLING_MODE, 2,
494fb4d8502Sjsg FMT_CBCR_BIT_REDUCTION_BYPASS, 1);
495fb4d8502Sjsg }
496fb4d8502Sjsg
497fb4d8502Sjsg }
498fb4d8502Sjsg
499ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
500*5ca02815Sjsg /*
501ad8b1aafSjsg * dce60_set_pixel_encoding
502ad8b1aafSjsg * DCE6 has no FMT_SUBSAMPLING_{MODE,ORDER} bits in FMT_CONTROL reg
503ad8b1aafSjsg * Set Pixel Encoding
504ad8b1aafSjsg * 0: RGB 4:4:4 or YCbCr 4:4:4 or YOnly
505ad8b1aafSjsg * 1: YCbCr 4:2:2
506ad8b1aafSjsg */
dce60_set_pixel_encoding(struct dce110_opp * opp110,const struct clamping_and_pixel_encoding_params * params)507ad8b1aafSjsg static void dce60_set_pixel_encoding(
508ad8b1aafSjsg struct dce110_opp *opp110,
509ad8b1aafSjsg const struct clamping_and_pixel_encoding_params *params)
510ad8b1aafSjsg {
511ad8b1aafSjsg if (opp110->opp_mask->FMT_CBCR_BIT_REDUCTION_BYPASS)
512ad8b1aafSjsg REG_UPDATE_2(FMT_CONTROL,
513ad8b1aafSjsg FMT_PIXEL_ENCODING, 0,
514ad8b1aafSjsg FMT_CBCR_BIT_REDUCTION_BYPASS, 0);
515ad8b1aafSjsg else
516ad8b1aafSjsg REG_UPDATE(FMT_CONTROL,
517ad8b1aafSjsg FMT_PIXEL_ENCODING, 0);
518ad8b1aafSjsg
519ad8b1aafSjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
520ad8b1aafSjsg REG_UPDATE(FMT_CONTROL,
521ad8b1aafSjsg FMT_PIXEL_ENCODING, 1);
522ad8b1aafSjsg }
523ad8b1aafSjsg if (params->pixel_encoding == PIXEL_ENCODING_YCBCR420) {
524ad8b1aafSjsg REG_UPDATE_2(FMT_CONTROL,
525ad8b1aafSjsg FMT_PIXEL_ENCODING, 2,
526ad8b1aafSjsg FMT_CBCR_BIT_REDUCTION_BYPASS, 1);
527ad8b1aafSjsg }
528ad8b1aafSjsg
529ad8b1aafSjsg }
530ad8b1aafSjsg #endif
531ad8b1aafSjsg
dce110_opp_program_bit_depth_reduction(struct output_pixel_processor * opp,const struct bit_depth_reduction_params * params)532fb4d8502Sjsg void dce110_opp_program_bit_depth_reduction(
533fb4d8502Sjsg struct output_pixel_processor *opp,
534fb4d8502Sjsg const struct bit_depth_reduction_params *params)
535fb4d8502Sjsg {
536fb4d8502Sjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
537fb4d8502Sjsg
538fb4d8502Sjsg set_truncation(opp110, params);
539fb4d8502Sjsg set_spatial_dither(opp110, params);
540fb4d8502Sjsg set_temporal_dither(opp110, params);
541fb4d8502Sjsg }
542fb4d8502Sjsg
543ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_opp_program_bit_depth_reduction(struct output_pixel_processor * opp,const struct bit_depth_reduction_params * params)544*5ca02815Sjsg static void dce60_opp_program_bit_depth_reduction(
545ad8b1aafSjsg struct output_pixel_processor *opp,
546ad8b1aafSjsg const struct bit_depth_reduction_params *params)
547ad8b1aafSjsg {
548ad8b1aafSjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
549ad8b1aafSjsg
550ad8b1aafSjsg dce60_set_truncation(opp110, params);
551ad8b1aafSjsg set_spatial_dither(opp110, params);
552ad8b1aafSjsg set_temporal_dither(opp110, params);
553ad8b1aafSjsg }
554ad8b1aafSjsg #endif
555ad8b1aafSjsg
dce110_opp_program_clamping_and_pixel_encoding(struct output_pixel_processor * opp,const struct clamping_and_pixel_encoding_params * params)556fb4d8502Sjsg void dce110_opp_program_clamping_and_pixel_encoding(
557fb4d8502Sjsg struct output_pixel_processor *opp,
558fb4d8502Sjsg const struct clamping_and_pixel_encoding_params *params)
559fb4d8502Sjsg {
560fb4d8502Sjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
561fb4d8502Sjsg
562fb4d8502Sjsg dce110_opp_set_clamping(opp110, params);
563fb4d8502Sjsg set_pixel_encoding(opp110, params);
564fb4d8502Sjsg }
565fb4d8502Sjsg
566ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_opp_program_clamping_and_pixel_encoding(struct output_pixel_processor * opp,const struct clamping_and_pixel_encoding_params * params)567*5ca02815Sjsg static void dce60_opp_program_clamping_and_pixel_encoding(
568ad8b1aafSjsg struct output_pixel_processor *opp,
569ad8b1aafSjsg const struct clamping_and_pixel_encoding_params *params)
570ad8b1aafSjsg {
571ad8b1aafSjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
572ad8b1aafSjsg
573ad8b1aafSjsg dce60_opp_set_clamping(opp110, params);
574ad8b1aafSjsg dce60_set_pixel_encoding(opp110, params);
575ad8b1aafSjsg }
576ad8b1aafSjsg #endif
577ad8b1aafSjsg
578ad8b1aafSjsg
program_formatter_420_memory(struct output_pixel_processor * opp)579fb4d8502Sjsg static void program_formatter_420_memory(struct output_pixel_processor *opp)
580fb4d8502Sjsg {
581fb4d8502Sjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
582fb4d8502Sjsg uint32_t fmt_mem_cntl_value;
583fb4d8502Sjsg
584fb4d8502Sjsg /* Program source select*/
585fb4d8502Sjsg /* Use HW default source select for FMT_MEMORYx_CONTROL */
586fb4d8502Sjsg /* Use that value for FMT_SRC_SELECT as well*/
587fb4d8502Sjsg REG_GET(CONTROL,
588fb4d8502Sjsg FMT420_MEM0_SOURCE_SEL, &fmt_mem_cntl_value);
589fb4d8502Sjsg
590fb4d8502Sjsg REG_UPDATE(FMT_CONTROL,
591fb4d8502Sjsg FMT_SRC_SELECT, fmt_mem_cntl_value);
592fb4d8502Sjsg
593fb4d8502Sjsg /* Turn on the memory */
594fb4d8502Sjsg REG_UPDATE(CONTROL,
595fb4d8502Sjsg FMT420_MEM0_PWR_FORCE, 0);
596fb4d8502Sjsg }
597fb4d8502Sjsg
dce110_opp_set_dyn_expansion(struct output_pixel_processor * opp,enum dc_color_space color_sp,enum dc_color_depth color_dpth,enum amd_signal_type signal)598fb4d8502Sjsg void dce110_opp_set_dyn_expansion(
599fb4d8502Sjsg struct output_pixel_processor *opp,
600fb4d8502Sjsg enum dc_color_space color_sp,
601fb4d8502Sjsg enum dc_color_depth color_dpth,
602fb4d8502Sjsg enum amd_signal_type signal)
603fb4d8502Sjsg {
604fb4d8502Sjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
605fb4d8502Sjsg
606fb4d8502Sjsg REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL,
607fb4d8502Sjsg FMT_DYNAMIC_EXP_EN, 0,
608fb4d8502Sjsg FMT_DYNAMIC_EXP_MODE, 0);
609fb4d8502Sjsg
610fb4d8502Sjsg /*00 - 10-bit -> 12-bit dynamic expansion*/
611fb4d8502Sjsg /*01 - 8-bit -> 12-bit dynamic expansion*/
612fb4d8502Sjsg if (signal == SIGNAL_TYPE_HDMI_TYPE_A ||
613fb4d8502Sjsg signal == SIGNAL_TYPE_DISPLAY_PORT ||
614fb4d8502Sjsg signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
615fb4d8502Sjsg switch (color_dpth) {
616fb4d8502Sjsg case COLOR_DEPTH_888:
617fb4d8502Sjsg REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL,
618fb4d8502Sjsg FMT_DYNAMIC_EXP_EN, 1,
619fb4d8502Sjsg FMT_DYNAMIC_EXP_MODE, 1);
620fb4d8502Sjsg break;
621fb4d8502Sjsg case COLOR_DEPTH_101010:
622fb4d8502Sjsg REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL,
623fb4d8502Sjsg FMT_DYNAMIC_EXP_EN, 1,
624fb4d8502Sjsg FMT_DYNAMIC_EXP_MODE, 0);
625fb4d8502Sjsg break;
626fb4d8502Sjsg case COLOR_DEPTH_121212:
627fb4d8502Sjsg REG_UPDATE_2(
628fb4d8502Sjsg FMT_DYNAMIC_EXP_CNTL,
629fb4d8502Sjsg FMT_DYNAMIC_EXP_EN, 1,/*otherwise last two bits are zero*/
630fb4d8502Sjsg FMT_DYNAMIC_EXP_MODE, 0);
631fb4d8502Sjsg break;
632fb4d8502Sjsg default:
633fb4d8502Sjsg break;
634fb4d8502Sjsg }
635fb4d8502Sjsg }
636fb4d8502Sjsg }
637fb4d8502Sjsg
program_formatter_reset_dig_resync_fifo(struct output_pixel_processor * opp)638fb4d8502Sjsg static void program_formatter_reset_dig_resync_fifo(struct output_pixel_processor *opp)
639fb4d8502Sjsg {
640fb4d8502Sjsg struct dce110_opp *opp110 = TO_DCE110_OPP(opp);
641fb4d8502Sjsg
642fb4d8502Sjsg /* clear previous phase lock status*/
643fb4d8502Sjsg REG_UPDATE(FMT_CONTROL,
644fb4d8502Sjsg FMT_420_PIXEL_PHASE_LOCKED_CLEAR, 1);
645fb4d8502Sjsg
646fb4d8502Sjsg /* poll until FMT_420_PIXEL_PHASE_LOCKED become 1*/
647fb4d8502Sjsg REG_WAIT(FMT_CONTROL, FMT_420_PIXEL_PHASE_LOCKED, 1, 10, 10);
648fb4d8502Sjsg
649fb4d8502Sjsg }
650fb4d8502Sjsg
dce110_opp_program_fmt(struct output_pixel_processor * opp,struct bit_depth_reduction_params * fmt_bit_depth,struct clamping_and_pixel_encoding_params * clamping)651fb4d8502Sjsg void dce110_opp_program_fmt(
652fb4d8502Sjsg struct output_pixel_processor *opp,
653fb4d8502Sjsg struct bit_depth_reduction_params *fmt_bit_depth,
654fb4d8502Sjsg struct clamping_and_pixel_encoding_params *clamping)
655fb4d8502Sjsg {
656fb4d8502Sjsg /* dithering is affected by <CrtcSourceSelect>, hence should be
657fb4d8502Sjsg * programmed afterwards */
658fb4d8502Sjsg
659fb4d8502Sjsg if (clamping->pixel_encoding == PIXEL_ENCODING_YCBCR420)
660fb4d8502Sjsg program_formatter_420_memory(opp);
661fb4d8502Sjsg
662fb4d8502Sjsg dce110_opp_program_bit_depth_reduction(
663fb4d8502Sjsg opp,
664fb4d8502Sjsg fmt_bit_depth);
665fb4d8502Sjsg
666fb4d8502Sjsg dce110_opp_program_clamping_and_pixel_encoding(
667fb4d8502Sjsg opp,
668fb4d8502Sjsg clamping);
669fb4d8502Sjsg
670fb4d8502Sjsg if (clamping->pixel_encoding == PIXEL_ENCODING_YCBCR420)
671fb4d8502Sjsg program_formatter_reset_dig_resync_fifo(opp);
672fb4d8502Sjsg
673fb4d8502Sjsg return;
674fb4d8502Sjsg }
675fb4d8502Sjsg
676ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_opp_program_fmt(struct output_pixel_processor * opp,struct bit_depth_reduction_params * fmt_bit_depth,struct clamping_and_pixel_encoding_params * clamping)677*5ca02815Sjsg static void dce60_opp_program_fmt(
678ad8b1aafSjsg struct output_pixel_processor *opp,
679ad8b1aafSjsg struct bit_depth_reduction_params *fmt_bit_depth,
680ad8b1aafSjsg struct clamping_and_pixel_encoding_params *clamping)
681ad8b1aafSjsg {
682ad8b1aafSjsg /* dithering is affected by <CrtcSourceSelect>, hence should be
683ad8b1aafSjsg * programmed afterwards */
684fb4d8502Sjsg
685ad8b1aafSjsg if (clamping->pixel_encoding == PIXEL_ENCODING_YCBCR420)
686ad8b1aafSjsg program_formatter_420_memory(opp);
687ad8b1aafSjsg
688ad8b1aafSjsg dce60_opp_program_bit_depth_reduction(
689ad8b1aafSjsg opp,
690ad8b1aafSjsg fmt_bit_depth);
691ad8b1aafSjsg
692ad8b1aafSjsg dce60_opp_program_clamping_and_pixel_encoding(
693ad8b1aafSjsg opp,
694ad8b1aafSjsg clamping);
695ad8b1aafSjsg
696ad8b1aafSjsg if (clamping->pixel_encoding == PIXEL_ENCODING_YCBCR420)
697ad8b1aafSjsg program_formatter_reset_dig_resync_fifo(opp);
698ad8b1aafSjsg
699ad8b1aafSjsg return;
700ad8b1aafSjsg }
701ad8b1aafSjsg #endif
702fb4d8502Sjsg
703fb4d8502Sjsg
704fb4d8502Sjsg
705fb4d8502Sjsg /*****************************************/
706fb4d8502Sjsg /* Constructor, Destructor */
707fb4d8502Sjsg /*****************************************/
708fb4d8502Sjsg
709fb4d8502Sjsg static const struct opp_funcs funcs = {
710fb4d8502Sjsg .opp_set_dyn_expansion = dce110_opp_set_dyn_expansion,
711fb4d8502Sjsg .opp_destroy = dce110_opp_destroy,
712fb4d8502Sjsg .opp_program_fmt = dce110_opp_program_fmt,
713fb4d8502Sjsg .opp_program_bit_depth_reduction = dce110_opp_program_bit_depth_reduction
714fb4d8502Sjsg };
715fb4d8502Sjsg
716ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
717ad8b1aafSjsg static const struct opp_funcs dce60_opp_funcs = {
718ad8b1aafSjsg .opp_set_dyn_expansion = dce110_opp_set_dyn_expansion,
719ad8b1aafSjsg .opp_destroy = dce110_opp_destroy,
720ad8b1aafSjsg .opp_program_fmt = dce60_opp_program_fmt,
721ad8b1aafSjsg .opp_program_bit_depth_reduction = dce60_opp_program_bit_depth_reduction
722ad8b1aafSjsg };
723ad8b1aafSjsg #endif
724ad8b1aafSjsg
dce110_opp_construct(struct dce110_opp * opp110,struct dc_context * ctx,uint32_t inst,const struct dce_opp_registers * regs,const struct dce_opp_shift * opp_shift,const struct dce_opp_mask * opp_mask)725fb4d8502Sjsg void dce110_opp_construct(struct dce110_opp *opp110,
726fb4d8502Sjsg struct dc_context *ctx,
727fb4d8502Sjsg uint32_t inst,
728fb4d8502Sjsg const struct dce_opp_registers *regs,
729fb4d8502Sjsg const struct dce_opp_shift *opp_shift,
730fb4d8502Sjsg const struct dce_opp_mask *opp_mask)
731fb4d8502Sjsg {
732fb4d8502Sjsg opp110->base.funcs = &funcs;
733fb4d8502Sjsg
734fb4d8502Sjsg opp110->base.ctx = ctx;
735fb4d8502Sjsg
736fb4d8502Sjsg opp110->base.inst = inst;
737fb4d8502Sjsg
738fb4d8502Sjsg opp110->regs = regs;
739fb4d8502Sjsg opp110->opp_shift = opp_shift;
740fb4d8502Sjsg opp110->opp_mask = opp_mask;
741fb4d8502Sjsg }
742fb4d8502Sjsg
743ad8b1aafSjsg #if defined(CONFIG_DRM_AMD_DC_SI)
dce60_opp_construct(struct dce110_opp * opp110,struct dc_context * ctx,uint32_t inst,const struct dce_opp_registers * regs,const struct dce_opp_shift * opp_shift,const struct dce_opp_mask * opp_mask)744ad8b1aafSjsg void dce60_opp_construct(struct dce110_opp *opp110,
745ad8b1aafSjsg struct dc_context *ctx,
746ad8b1aafSjsg uint32_t inst,
747ad8b1aafSjsg const struct dce_opp_registers *regs,
748ad8b1aafSjsg const struct dce_opp_shift *opp_shift,
749ad8b1aafSjsg const struct dce_opp_mask *opp_mask)
750ad8b1aafSjsg {
751ad8b1aafSjsg opp110->base.funcs = &dce60_opp_funcs;
752ad8b1aafSjsg
753ad8b1aafSjsg opp110->base.ctx = ctx;
754ad8b1aafSjsg
755ad8b1aafSjsg opp110->base.inst = inst;
756ad8b1aafSjsg
757ad8b1aafSjsg opp110->regs = regs;
758ad8b1aafSjsg opp110->opp_shift = opp_shift;
759ad8b1aafSjsg opp110->opp_mask = opp_mask;
760ad8b1aafSjsg }
761ad8b1aafSjsg #endif
762ad8b1aafSjsg
dce110_opp_destroy(struct output_pixel_processor ** opp)763fb4d8502Sjsg void dce110_opp_destroy(struct output_pixel_processor **opp)
764fb4d8502Sjsg {
765fb4d8502Sjsg if (*opp)
766fb4d8502Sjsg kfree(FROM_DCE11_OPP(*opp));
767fb4d8502Sjsg *opp = NULL;
768fb4d8502Sjsg }
769fb4d8502Sjsg
770