1*4882a593Smuzhiyun // SPDX-License-Identifier: MIT
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright © 2018 Intel Corporation
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Author: Gaurav K Singh <gaurav.k.singh@intel.com>
6*4882a593Smuzhiyun * Manasi Navare <manasi.d.navare@intel.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include "i915_drv.h"
10*4882a593Smuzhiyun #include "intel_display_types.h"
11*4882a593Smuzhiyun #include "intel_dsi.h"
12*4882a593Smuzhiyun #include "intel_vdsc.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun enum ROW_INDEX_BPP {
15*4882a593Smuzhiyun ROW_INDEX_6BPP = 0,
16*4882a593Smuzhiyun ROW_INDEX_8BPP,
17*4882a593Smuzhiyun ROW_INDEX_10BPP,
18*4882a593Smuzhiyun ROW_INDEX_12BPP,
19*4882a593Smuzhiyun ROW_INDEX_15BPP,
20*4882a593Smuzhiyun MAX_ROW_INDEX
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun enum COLUMN_INDEX_BPC {
24*4882a593Smuzhiyun COLUMN_INDEX_8BPC = 0,
25*4882a593Smuzhiyun COLUMN_INDEX_10BPC,
26*4882a593Smuzhiyun COLUMN_INDEX_12BPC,
27*4882a593Smuzhiyun COLUMN_INDEX_14BPC,
28*4882a593Smuzhiyun COLUMN_INDEX_16BPC,
29*4882a593Smuzhiyun MAX_COLUMN_INDEX
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* From DSC_v1.11 spec, rc_parameter_Set syntax element typically constant */
33*4882a593Smuzhiyun static const u16 rc_buf_thresh[] = {
34*4882a593Smuzhiyun 896, 1792, 2688, 3584, 4480, 5376, 6272, 6720, 7168, 7616,
35*4882a593Smuzhiyun 7744, 7872, 8000, 8064
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun struct rc_parameters {
39*4882a593Smuzhiyun u16 initial_xmit_delay;
40*4882a593Smuzhiyun u8 first_line_bpg_offset;
41*4882a593Smuzhiyun u16 initial_offset;
42*4882a593Smuzhiyun u8 flatness_min_qp;
43*4882a593Smuzhiyun u8 flatness_max_qp;
44*4882a593Smuzhiyun u8 rc_quant_incr_limit0;
45*4882a593Smuzhiyun u8 rc_quant_incr_limit1;
46*4882a593Smuzhiyun struct drm_dsc_rc_range_parameters rc_range_params[DSC_NUM_BUF_RANGES];
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun * Selected Rate Control Related Parameter Recommended Values
51*4882a593Smuzhiyun * from DSC_v1.11 spec & C Model release: DSC_model_20161212
52*4882a593Smuzhiyun */
53*4882a593Smuzhiyun static const struct rc_parameters rc_parameters[][MAX_COLUMN_INDEX] = {
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun /* 6BPP/8BPC */
56*4882a593Smuzhiyun { 768, 15, 6144, 3, 13, 11, 11, {
57*4882a593Smuzhiyun { 0, 4, 0 }, { 1, 6, -2 }, { 3, 8, -2 }, { 4, 8, -4 },
58*4882a593Smuzhiyun { 5, 9, -6 }, { 5, 9, -6 }, { 6, 9, -6 }, { 6, 10, -8 },
59*4882a593Smuzhiyun { 7, 11, -8 }, { 8, 12, -10 }, { 9, 12, -10 }, { 10, 12, -12 },
60*4882a593Smuzhiyun { 10, 12, -12 }, { 11, 12, -12 }, { 13, 14, -12 }
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun },
63*4882a593Smuzhiyun /* 6BPP/10BPC */
64*4882a593Smuzhiyun { 768, 15, 6144, 7, 17, 15, 15, {
65*4882a593Smuzhiyun { 0, 8, 0 }, { 3, 10, -2 }, { 7, 12, -2 }, { 8, 12, -4 },
66*4882a593Smuzhiyun { 9, 13, -6 }, { 9, 13, -6 }, { 10, 13, -6 }, { 10, 14, -8 },
67*4882a593Smuzhiyun { 11, 15, -8 }, { 12, 16, -10 }, { 13, 16, -10 },
68*4882a593Smuzhiyun { 14, 16, -12 }, { 14, 16, -12 }, { 15, 16, -12 },
69*4882a593Smuzhiyun { 17, 18, -12 }
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun },
72*4882a593Smuzhiyun /* 6BPP/12BPC */
73*4882a593Smuzhiyun { 768, 15, 6144, 11, 21, 19, 19, {
74*4882a593Smuzhiyun { 0, 12, 0 }, { 5, 14, -2 }, { 11, 16, -2 }, { 12, 16, -4 },
75*4882a593Smuzhiyun { 13, 17, -6 }, { 13, 17, -6 }, { 14, 17, -6 }, { 14, 18, -8 },
76*4882a593Smuzhiyun { 15, 19, -8 }, { 16, 20, -10 }, { 17, 20, -10 },
77*4882a593Smuzhiyun { 18, 20, -12 }, { 18, 20, -12 }, { 19, 20, -12 },
78*4882a593Smuzhiyun { 21, 22, -12 }
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun },
81*4882a593Smuzhiyun /* 6BPP/14BPC */
82*4882a593Smuzhiyun { 768, 15, 6144, 15, 25, 23, 27, {
83*4882a593Smuzhiyun { 0, 16, 0 }, { 7, 18, -2 }, { 15, 20, -2 }, { 16, 20, -4 },
84*4882a593Smuzhiyun { 17, 21, -6 }, { 17, 21, -6 }, { 18, 21, -6 }, { 18, 22, -8 },
85*4882a593Smuzhiyun { 19, 23, -8 }, { 20, 24, -10 }, { 21, 24, -10 },
86*4882a593Smuzhiyun { 22, 24, -12 }, { 22, 24, -12 }, { 23, 24, -12 },
87*4882a593Smuzhiyun { 25, 26, -12 }
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun },
90*4882a593Smuzhiyun /* 6BPP/16BPC */
91*4882a593Smuzhiyun { 768, 15, 6144, 19, 29, 27, 27, {
92*4882a593Smuzhiyun { 0, 20, 0 }, { 9, 22, -2 }, { 19, 24, -2 }, { 20, 24, -4 },
93*4882a593Smuzhiyun { 21, 25, -6 }, { 21, 25, -6 }, { 22, 25, -6 }, { 22, 26, -8 },
94*4882a593Smuzhiyun { 23, 27, -8 }, { 24, 28, -10 }, { 25, 28, -10 },
95*4882a593Smuzhiyun { 26, 28, -12 }, { 26, 28, -12 }, { 27, 28, -12 },
96*4882a593Smuzhiyun { 29, 30, -12 }
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun },
99*4882a593Smuzhiyun },
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun /* 8BPP/8BPC */
102*4882a593Smuzhiyun { 512, 12, 6144, 3, 12, 11, 11, {
103*4882a593Smuzhiyun { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
104*4882a593Smuzhiyun { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
105*4882a593Smuzhiyun { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 }, { 5, 12, -12 },
106*4882a593Smuzhiyun { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun },
109*4882a593Smuzhiyun /* 8BPP/10BPC */
110*4882a593Smuzhiyun { 512, 12, 6144, 7, 16, 15, 15, {
111*4882a593Smuzhiyun { 0, 4, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
112*4882a593Smuzhiyun { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
113*4882a593Smuzhiyun { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
114*4882a593Smuzhiyun { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun },
117*4882a593Smuzhiyun /* 8BPP/12BPC */
118*4882a593Smuzhiyun { 512, 12, 6144, 11, 20, 19, 19, {
119*4882a593Smuzhiyun { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
120*4882a593Smuzhiyun { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
121*4882a593Smuzhiyun { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
122*4882a593Smuzhiyun { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
123*4882a593Smuzhiyun { 21, 23, -12 }
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun },
126*4882a593Smuzhiyun /* 8BPP/14BPC */
127*4882a593Smuzhiyun { 512, 12, 6144, 15, 24, 23, 23, {
128*4882a593Smuzhiyun { 0, 12, 0 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
129*4882a593Smuzhiyun { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
130*4882a593Smuzhiyun { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
131*4882a593Smuzhiyun { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
132*4882a593Smuzhiyun { 24, 25, -12 }
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun },
135*4882a593Smuzhiyun /* 8BPP/16BPC */
136*4882a593Smuzhiyun { 512, 12, 6144, 19, 28, 27, 27, {
137*4882a593Smuzhiyun { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
138*4882a593Smuzhiyun { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
139*4882a593Smuzhiyun { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
140*4882a593Smuzhiyun { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
141*4882a593Smuzhiyun { 28, 29, -12 }
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun },
144*4882a593Smuzhiyun },
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun /* 10BPP/8BPC */
147*4882a593Smuzhiyun { 410, 15, 5632, 3, 12, 11, 11, {
148*4882a593Smuzhiyun { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
149*4882a593Smuzhiyun { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
150*4882a593Smuzhiyun { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
151*4882a593Smuzhiyun { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun },
154*4882a593Smuzhiyun /* 10BPP/10BPC */
155*4882a593Smuzhiyun { 410, 15, 5632, 7, 16, 15, 15, {
156*4882a593Smuzhiyun { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
157*4882a593Smuzhiyun { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
158*4882a593Smuzhiyun { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
159*4882a593Smuzhiyun { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun },
162*4882a593Smuzhiyun /* 10BPP/12BPC */
163*4882a593Smuzhiyun { 410, 15, 5632, 11, 20, 19, 19, {
164*4882a593Smuzhiyun { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
165*4882a593Smuzhiyun { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
166*4882a593Smuzhiyun { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
167*4882a593Smuzhiyun { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
168*4882a593Smuzhiyun { 19, 20, -12 }
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun },
171*4882a593Smuzhiyun /* 10BPP/14BPC */
172*4882a593Smuzhiyun { 410, 15, 5632, 15, 24, 23, 23, {
173*4882a593Smuzhiyun { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
174*4882a593Smuzhiyun { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
175*4882a593Smuzhiyun { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
176*4882a593Smuzhiyun { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
177*4882a593Smuzhiyun { 23, 24, -12 }
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun },
180*4882a593Smuzhiyun /* 10BPP/16BPC */
181*4882a593Smuzhiyun { 410, 15, 5632, 19, 28, 27, 27, {
182*4882a593Smuzhiyun { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
183*4882a593Smuzhiyun { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
184*4882a593Smuzhiyun { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
185*4882a593Smuzhiyun { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
186*4882a593Smuzhiyun { 27, 28, -12 }
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun },
189*4882a593Smuzhiyun },
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun /* 12BPP/8BPC */
192*4882a593Smuzhiyun { 341, 15, 2048, 3, 12, 11, 11, {
193*4882a593Smuzhiyun { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
194*4882a593Smuzhiyun { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
195*4882a593Smuzhiyun { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 },
196*4882a593Smuzhiyun { 5, 12, -12 }, { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun },
199*4882a593Smuzhiyun /* 12BPP/10BPC */
200*4882a593Smuzhiyun { 341, 15, 2048, 7, 16, 15, 15, {
201*4882a593Smuzhiyun { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
202*4882a593Smuzhiyun { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
203*4882a593Smuzhiyun { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
204*4882a593Smuzhiyun { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun },
207*4882a593Smuzhiyun /* 12BPP/12BPC */
208*4882a593Smuzhiyun { 341, 15, 2048, 11, 20, 19, 19, {
209*4882a593Smuzhiyun { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
210*4882a593Smuzhiyun { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
211*4882a593Smuzhiyun { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
212*4882a593Smuzhiyun { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
213*4882a593Smuzhiyun { 21, 23, -12 }
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun },
216*4882a593Smuzhiyun /* 12BPP/14BPC */
217*4882a593Smuzhiyun { 341, 15, 2048, 15, 24, 23, 23, {
218*4882a593Smuzhiyun { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
219*4882a593Smuzhiyun { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
220*4882a593Smuzhiyun { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
221*4882a593Smuzhiyun { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
222*4882a593Smuzhiyun { 22, 23, -12 }
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun },
225*4882a593Smuzhiyun /* 12BPP/16BPC */
226*4882a593Smuzhiyun { 341, 15, 2048, 19, 28, 27, 27, {
227*4882a593Smuzhiyun { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
228*4882a593Smuzhiyun { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
229*4882a593Smuzhiyun { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
230*4882a593Smuzhiyun { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
231*4882a593Smuzhiyun { 26, 27, -12 }
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun },
234*4882a593Smuzhiyun },
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun /* 15BPP/8BPC */
237*4882a593Smuzhiyun { 273, 15, 2048, 3, 12, 11, 11, {
238*4882a593Smuzhiyun { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
239*4882a593Smuzhiyun { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
240*4882a593Smuzhiyun { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
241*4882a593Smuzhiyun { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun },
244*4882a593Smuzhiyun /* 15BPP/10BPC */
245*4882a593Smuzhiyun { 273, 15, 2048, 7, 16, 15, 15, {
246*4882a593Smuzhiyun { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
247*4882a593Smuzhiyun { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
248*4882a593Smuzhiyun { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
249*4882a593Smuzhiyun { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun },
252*4882a593Smuzhiyun /* 15BPP/12BPC */
253*4882a593Smuzhiyun { 273, 15, 2048, 11, 20, 19, 19, {
254*4882a593Smuzhiyun { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
255*4882a593Smuzhiyun { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
256*4882a593Smuzhiyun { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
257*4882a593Smuzhiyun { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
258*4882a593Smuzhiyun { 16, 17, -12 }
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun },
261*4882a593Smuzhiyun /* 15BPP/14BPC */
262*4882a593Smuzhiyun { 273, 15, 2048, 15, 24, 23, 23, {
263*4882a593Smuzhiyun { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
264*4882a593Smuzhiyun { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
265*4882a593Smuzhiyun { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
266*4882a593Smuzhiyun { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
267*4882a593Smuzhiyun { 20, 21, -12 }
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun },
270*4882a593Smuzhiyun /* 15BPP/16BPC */
271*4882a593Smuzhiyun { 273, 15, 2048, 19, 28, 27, 27, {
272*4882a593Smuzhiyun { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
273*4882a593Smuzhiyun { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
274*4882a593Smuzhiyun { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
275*4882a593Smuzhiyun { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
276*4882a593Smuzhiyun { 24, 25, -12 }
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun
get_row_index_for_rc_params(u16 compressed_bpp)283*4882a593Smuzhiyun static int get_row_index_for_rc_params(u16 compressed_bpp)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun switch (compressed_bpp) {
286*4882a593Smuzhiyun case 6:
287*4882a593Smuzhiyun return ROW_INDEX_6BPP;
288*4882a593Smuzhiyun case 8:
289*4882a593Smuzhiyun return ROW_INDEX_8BPP;
290*4882a593Smuzhiyun case 10:
291*4882a593Smuzhiyun return ROW_INDEX_10BPP;
292*4882a593Smuzhiyun case 12:
293*4882a593Smuzhiyun return ROW_INDEX_12BPP;
294*4882a593Smuzhiyun case 15:
295*4882a593Smuzhiyun return ROW_INDEX_15BPP;
296*4882a593Smuzhiyun default:
297*4882a593Smuzhiyun return -EINVAL;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
get_column_index_for_rc_params(u8 bits_per_component)301*4882a593Smuzhiyun static int get_column_index_for_rc_params(u8 bits_per_component)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun switch (bits_per_component) {
304*4882a593Smuzhiyun case 8:
305*4882a593Smuzhiyun return COLUMN_INDEX_8BPC;
306*4882a593Smuzhiyun case 10:
307*4882a593Smuzhiyun return COLUMN_INDEX_10BPC;
308*4882a593Smuzhiyun case 12:
309*4882a593Smuzhiyun return COLUMN_INDEX_12BPC;
310*4882a593Smuzhiyun case 14:
311*4882a593Smuzhiyun return COLUMN_INDEX_14BPC;
312*4882a593Smuzhiyun case 16:
313*4882a593Smuzhiyun return COLUMN_INDEX_16BPC;
314*4882a593Smuzhiyun default:
315*4882a593Smuzhiyun return -EINVAL;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun
get_rc_params(u16 compressed_bpp,u8 bits_per_component)319*4882a593Smuzhiyun static const struct rc_parameters *get_rc_params(u16 compressed_bpp,
320*4882a593Smuzhiyun u8 bits_per_component)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun int row_index, column_index;
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun row_index = get_row_index_for_rc_params(compressed_bpp);
325*4882a593Smuzhiyun if (row_index < 0)
326*4882a593Smuzhiyun return NULL;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun column_index = get_column_index_for_rc_params(bits_per_component);
329*4882a593Smuzhiyun if (column_index < 0)
330*4882a593Smuzhiyun return NULL;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun return &rc_parameters[row_index][column_index];
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
intel_dsc_source_support(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)335*4882a593Smuzhiyun bool intel_dsc_source_support(struct intel_encoder *encoder,
336*4882a593Smuzhiyun const struct intel_crtc_state *crtc_state)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
339*4882a593Smuzhiyun struct drm_i915_private *i915 = to_i915(encoder->base.dev);
340*4882a593Smuzhiyun enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
341*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun if (!INTEL_INFO(i915)->display.has_dsc)
344*4882a593Smuzhiyun return false;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun /* On TGL, DSC is supported on all Pipes */
347*4882a593Smuzhiyun if (INTEL_GEN(i915) >= 12)
348*4882a593Smuzhiyun return true;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun if (INTEL_GEN(i915) >= 10 &&
351*4882a593Smuzhiyun (pipe != PIPE_A ||
352*4882a593Smuzhiyun (cpu_transcoder == TRANSCODER_EDP ||
353*4882a593Smuzhiyun cpu_transcoder == TRANSCODER_DSI_0 ||
354*4882a593Smuzhiyun cpu_transcoder == TRANSCODER_DSI_1)))
355*4882a593Smuzhiyun return true;
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun return false;
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
is_pipe_dsc(const struct intel_crtc_state * crtc_state)360*4882a593Smuzhiyun static bool is_pipe_dsc(const struct intel_crtc_state *crtc_state)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
363*4882a593Smuzhiyun const struct drm_i915_private *i915 = to_i915(crtc->base.dev);
364*4882a593Smuzhiyun enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun if (INTEL_GEN(i915) >= 12)
367*4882a593Smuzhiyun return true;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun if (cpu_transcoder == TRANSCODER_EDP ||
370*4882a593Smuzhiyun cpu_transcoder == TRANSCODER_DSI_0 ||
371*4882a593Smuzhiyun cpu_transcoder == TRANSCODER_DSI_1)
372*4882a593Smuzhiyun return false;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun /* There's no pipe A DSC engine on ICL */
375*4882a593Smuzhiyun drm_WARN_ON(&i915->drm, crtc->pipe == PIPE_A);
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun return true;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
intel_dsc_compute_params(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config)380*4882a593Smuzhiyun int intel_dsc_compute_params(struct intel_encoder *encoder,
381*4882a593Smuzhiyun struct intel_crtc_state *pipe_config)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun struct drm_dsc_config *vdsc_cfg = &pipe_config->dsc.config;
384*4882a593Smuzhiyun u16 compressed_bpp = pipe_config->dsc.compressed_bpp;
385*4882a593Smuzhiyun const struct rc_parameters *rc_params;
386*4882a593Smuzhiyun u8 i = 0;
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun vdsc_cfg->pic_width = pipe_config->hw.adjusted_mode.crtc_hdisplay;
389*4882a593Smuzhiyun vdsc_cfg->pic_height = pipe_config->hw.adjusted_mode.crtc_vdisplay;
390*4882a593Smuzhiyun vdsc_cfg->slice_width = DIV_ROUND_UP(vdsc_cfg->pic_width,
391*4882a593Smuzhiyun pipe_config->dsc.slice_count);
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun /* Gen 11 does not support YCbCr */
394*4882a593Smuzhiyun vdsc_cfg->simple_422 = false;
395*4882a593Smuzhiyun /* Gen 11 does not support VBR */
396*4882a593Smuzhiyun vdsc_cfg->vbr_enable = false;
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun /* Gen 11 only supports integral values of bpp */
399*4882a593Smuzhiyun vdsc_cfg->bits_per_pixel = compressed_bpp << 4;
400*4882a593Smuzhiyun vdsc_cfg->bits_per_component = pipe_config->pipe_bpp / 3;
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++) {
403*4882a593Smuzhiyun /*
404*4882a593Smuzhiyun * six 0s are appended to the lsb of each threshold value
405*4882a593Smuzhiyun * internally in h/w.
406*4882a593Smuzhiyun * Only 8 bits are allowed for programming RcBufThreshold
407*4882a593Smuzhiyun */
408*4882a593Smuzhiyun vdsc_cfg->rc_buf_thresh[i] = rc_buf_thresh[i] >> 6;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun /*
412*4882a593Smuzhiyun * For 6bpp, RC Buffer threshold 12 and 13 need a different value
413*4882a593Smuzhiyun * as per C Model
414*4882a593Smuzhiyun */
415*4882a593Smuzhiyun if (compressed_bpp == 6) {
416*4882a593Smuzhiyun vdsc_cfg->rc_buf_thresh[12] = 0x7C;
417*4882a593Smuzhiyun vdsc_cfg->rc_buf_thresh[13] = 0x7D;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun rc_params = get_rc_params(compressed_bpp, vdsc_cfg->bits_per_component);
421*4882a593Smuzhiyun if (!rc_params)
422*4882a593Smuzhiyun return -EINVAL;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun vdsc_cfg->first_line_bpg_offset = rc_params->first_line_bpg_offset;
425*4882a593Smuzhiyun vdsc_cfg->initial_xmit_delay = rc_params->initial_xmit_delay;
426*4882a593Smuzhiyun vdsc_cfg->initial_offset = rc_params->initial_offset;
427*4882a593Smuzhiyun vdsc_cfg->flatness_min_qp = rc_params->flatness_min_qp;
428*4882a593Smuzhiyun vdsc_cfg->flatness_max_qp = rc_params->flatness_max_qp;
429*4882a593Smuzhiyun vdsc_cfg->rc_quant_incr_limit0 = rc_params->rc_quant_incr_limit0;
430*4882a593Smuzhiyun vdsc_cfg->rc_quant_incr_limit1 = rc_params->rc_quant_incr_limit1;
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
433*4882a593Smuzhiyun vdsc_cfg->rc_range_params[i].range_min_qp =
434*4882a593Smuzhiyun rc_params->rc_range_params[i].range_min_qp;
435*4882a593Smuzhiyun vdsc_cfg->rc_range_params[i].range_max_qp =
436*4882a593Smuzhiyun rc_params->rc_range_params[i].range_max_qp;
437*4882a593Smuzhiyun /*
438*4882a593Smuzhiyun * Range BPG Offset uses 2's complement and is only a 6 bits. So
439*4882a593Smuzhiyun * mask it to get only 6 bits.
440*4882a593Smuzhiyun */
441*4882a593Smuzhiyun vdsc_cfg->rc_range_params[i].range_bpg_offset =
442*4882a593Smuzhiyun rc_params->rc_range_params[i].range_bpg_offset &
443*4882a593Smuzhiyun DSC_RANGE_BPG_OFFSET_MASK;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /*
447*4882a593Smuzhiyun * BitsPerComponent value determines mux_word_size:
448*4882a593Smuzhiyun * When BitsPerComponent is 12bpc, muxWordSize will be equal to 64 bits
449*4882a593Smuzhiyun * When BitsPerComponent is 8 or 10bpc, muxWordSize will be equal to
450*4882a593Smuzhiyun * 48 bits
451*4882a593Smuzhiyun */
452*4882a593Smuzhiyun if (vdsc_cfg->bits_per_component == 8 ||
453*4882a593Smuzhiyun vdsc_cfg->bits_per_component == 10)
454*4882a593Smuzhiyun vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC;
455*4882a593Smuzhiyun else if (vdsc_cfg->bits_per_component == 12)
456*4882a593Smuzhiyun vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun /* RC_MODEL_SIZE is a constant across all configurations */
459*4882a593Smuzhiyun vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
460*4882a593Smuzhiyun /* InitialScaleValue is a 6 bit value with 3 fractional bits (U3.3) */
461*4882a593Smuzhiyun vdsc_cfg->initial_scale_value = (vdsc_cfg->rc_model_size << 3) /
462*4882a593Smuzhiyun (vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun return 0;
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun enum intel_display_power_domain
intel_dsc_power_domain(const struct intel_crtc_state * crtc_state)468*4882a593Smuzhiyun intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
471*4882a593Smuzhiyun struct drm_i915_private *i915 = to_i915(crtc->base.dev);
472*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun /*
475*4882a593Smuzhiyun * VDSC/joining uses a separate power well, PW2, and requires
476*4882a593Smuzhiyun * POWER_DOMAIN_TRANSCODER_VDSC_PW2 power domain in two cases:
477*4882a593Smuzhiyun *
478*4882a593Smuzhiyun * - ICL eDP/DSI transcoder
479*4882a593Smuzhiyun * - Gen12+ (except RKL) pipe A
480*4882a593Smuzhiyun *
481*4882a593Smuzhiyun * For any other pipe, VDSC/joining uses the power well associated with
482*4882a593Smuzhiyun * the pipe in use. Hence another reference on the pipe power domain
483*4882a593Smuzhiyun * will suffice. (Except no VDSC/joining on ICL pipe A.)
484*4882a593Smuzhiyun */
485*4882a593Smuzhiyun if (INTEL_GEN(i915) >= 12 && !IS_ROCKETLAKE(i915) && pipe == PIPE_A)
486*4882a593Smuzhiyun return POWER_DOMAIN_TRANSCODER_VDSC_PW2;
487*4882a593Smuzhiyun else if (is_pipe_dsc(crtc_state))
488*4882a593Smuzhiyun return POWER_DOMAIN_PIPE(pipe);
489*4882a593Smuzhiyun else
490*4882a593Smuzhiyun return POWER_DOMAIN_TRANSCODER_VDSC_PW2;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
intel_dsc_pps_configure(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)493*4882a593Smuzhiyun static void intel_dsc_pps_configure(struct intel_encoder *encoder,
494*4882a593Smuzhiyun const struct intel_crtc_state *crtc_state)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
497*4882a593Smuzhiyun struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
498*4882a593Smuzhiyun const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
499*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
500*4882a593Smuzhiyun u32 pps_val = 0;
501*4882a593Smuzhiyun u32 rc_buf_thresh_dword[4];
502*4882a593Smuzhiyun u32 rc_range_params_dword[8];
503*4882a593Smuzhiyun u8 num_vdsc_instances = (crtc_state->dsc.dsc_split) ? 2 : 1;
504*4882a593Smuzhiyun int i = 0;
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_0 registers */
507*4882a593Smuzhiyun pps_val = DSC_VER_MAJ | vdsc_cfg->dsc_version_minor <<
508*4882a593Smuzhiyun DSC_VER_MIN_SHIFT |
509*4882a593Smuzhiyun vdsc_cfg->bits_per_component << DSC_BPC_SHIFT |
510*4882a593Smuzhiyun vdsc_cfg->line_buf_depth << DSC_LINE_BUF_DEPTH_SHIFT;
511*4882a593Smuzhiyun if (vdsc_cfg->block_pred_enable)
512*4882a593Smuzhiyun pps_val |= DSC_BLOCK_PREDICTION;
513*4882a593Smuzhiyun if (vdsc_cfg->convert_rgb)
514*4882a593Smuzhiyun pps_val |= DSC_COLOR_SPACE_CONVERSION;
515*4882a593Smuzhiyun if (vdsc_cfg->simple_422)
516*4882a593Smuzhiyun pps_val |= DSC_422_ENABLE;
517*4882a593Smuzhiyun if (vdsc_cfg->vbr_enable)
518*4882a593Smuzhiyun pps_val |= DSC_VBR_ENABLE;
519*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS0 = 0x%08x\n", pps_val);
520*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
521*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_0,
522*4882a593Smuzhiyun pps_val);
523*4882a593Smuzhiyun /*
524*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
525*4882a593Smuzhiyun * VDSC
526*4882a593Smuzhiyun */
527*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
528*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_0,
529*4882a593Smuzhiyun pps_val);
530*4882a593Smuzhiyun } else {
531*4882a593Smuzhiyun intel_de_write(dev_priv,
532*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_0(pipe),
533*4882a593Smuzhiyun pps_val);
534*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
535*4882a593Smuzhiyun intel_de_write(dev_priv,
536*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_0(pipe),
537*4882a593Smuzhiyun pps_val);
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_1 registers */
541*4882a593Smuzhiyun pps_val = 0;
542*4882a593Smuzhiyun pps_val |= DSC_BPP(vdsc_cfg->bits_per_pixel);
543*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS1 = 0x%08x\n", pps_val);
544*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
545*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_1,
546*4882a593Smuzhiyun pps_val);
547*4882a593Smuzhiyun /*
548*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
549*4882a593Smuzhiyun * VDSC
550*4882a593Smuzhiyun */
551*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
552*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_1,
553*4882a593Smuzhiyun pps_val);
554*4882a593Smuzhiyun } else {
555*4882a593Smuzhiyun intel_de_write(dev_priv,
556*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_1(pipe),
557*4882a593Smuzhiyun pps_val);
558*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
559*4882a593Smuzhiyun intel_de_write(dev_priv,
560*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_1(pipe),
561*4882a593Smuzhiyun pps_val);
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_2 registers */
565*4882a593Smuzhiyun pps_val = 0;
566*4882a593Smuzhiyun pps_val |= DSC_PIC_HEIGHT(vdsc_cfg->pic_height) |
567*4882a593Smuzhiyun DSC_PIC_WIDTH(vdsc_cfg->pic_width / num_vdsc_instances);
568*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS2 = 0x%08x\n", pps_val);
569*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
570*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_2,
571*4882a593Smuzhiyun pps_val);
572*4882a593Smuzhiyun /*
573*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
574*4882a593Smuzhiyun * VDSC
575*4882a593Smuzhiyun */
576*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
577*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_2,
578*4882a593Smuzhiyun pps_val);
579*4882a593Smuzhiyun } else {
580*4882a593Smuzhiyun intel_de_write(dev_priv,
581*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_2(pipe),
582*4882a593Smuzhiyun pps_val);
583*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
584*4882a593Smuzhiyun intel_de_write(dev_priv,
585*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_2(pipe),
586*4882a593Smuzhiyun pps_val);
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_3 registers */
590*4882a593Smuzhiyun pps_val = 0;
591*4882a593Smuzhiyun pps_val |= DSC_SLICE_HEIGHT(vdsc_cfg->slice_height) |
592*4882a593Smuzhiyun DSC_SLICE_WIDTH(vdsc_cfg->slice_width);
593*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS3 = 0x%08x\n", pps_val);
594*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
595*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_3,
596*4882a593Smuzhiyun pps_val);
597*4882a593Smuzhiyun /*
598*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
599*4882a593Smuzhiyun * VDSC
600*4882a593Smuzhiyun */
601*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
602*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_3,
603*4882a593Smuzhiyun pps_val);
604*4882a593Smuzhiyun } else {
605*4882a593Smuzhiyun intel_de_write(dev_priv,
606*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_3(pipe),
607*4882a593Smuzhiyun pps_val);
608*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
609*4882a593Smuzhiyun intel_de_write(dev_priv,
610*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_3(pipe),
611*4882a593Smuzhiyun pps_val);
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_4 registers */
615*4882a593Smuzhiyun pps_val = 0;
616*4882a593Smuzhiyun pps_val |= DSC_INITIAL_XMIT_DELAY(vdsc_cfg->initial_xmit_delay) |
617*4882a593Smuzhiyun DSC_INITIAL_DEC_DELAY(vdsc_cfg->initial_dec_delay);
618*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS4 = 0x%08x\n", pps_val);
619*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
620*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_4,
621*4882a593Smuzhiyun pps_val);
622*4882a593Smuzhiyun /*
623*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
624*4882a593Smuzhiyun * VDSC
625*4882a593Smuzhiyun */
626*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
627*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_4,
628*4882a593Smuzhiyun pps_val);
629*4882a593Smuzhiyun } else {
630*4882a593Smuzhiyun intel_de_write(dev_priv,
631*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_4(pipe),
632*4882a593Smuzhiyun pps_val);
633*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
634*4882a593Smuzhiyun intel_de_write(dev_priv,
635*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_4(pipe),
636*4882a593Smuzhiyun pps_val);
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_5 registers */
640*4882a593Smuzhiyun pps_val = 0;
641*4882a593Smuzhiyun pps_val |= DSC_SCALE_INC_INT(vdsc_cfg->scale_increment_interval) |
642*4882a593Smuzhiyun DSC_SCALE_DEC_INT(vdsc_cfg->scale_decrement_interval);
643*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS5 = 0x%08x\n", pps_val);
644*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
645*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_5,
646*4882a593Smuzhiyun pps_val);
647*4882a593Smuzhiyun /*
648*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
649*4882a593Smuzhiyun * VDSC
650*4882a593Smuzhiyun */
651*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
652*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_5,
653*4882a593Smuzhiyun pps_val);
654*4882a593Smuzhiyun } else {
655*4882a593Smuzhiyun intel_de_write(dev_priv,
656*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_5(pipe),
657*4882a593Smuzhiyun pps_val);
658*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
659*4882a593Smuzhiyun intel_de_write(dev_priv,
660*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_5(pipe),
661*4882a593Smuzhiyun pps_val);
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_6 registers */
665*4882a593Smuzhiyun pps_val = 0;
666*4882a593Smuzhiyun pps_val |= DSC_INITIAL_SCALE_VALUE(vdsc_cfg->initial_scale_value) |
667*4882a593Smuzhiyun DSC_FIRST_LINE_BPG_OFFSET(vdsc_cfg->first_line_bpg_offset) |
668*4882a593Smuzhiyun DSC_FLATNESS_MIN_QP(vdsc_cfg->flatness_min_qp) |
669*4882a593Smuzhiyun DSC_FLATNESS_MAX_QP(vdsc_cfg->flatness_max_qp);
670*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS6 = 0x%08x\n", pps_val);
671*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
672*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_6,
673*4882a593Smuzhiyun pps_val);
674*4882a593Smuzhiyun /*
675*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
676*4882a593Smuzhiyun * VDSC
677*4882a593Smuzhiyun */
678*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
679*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_6,
680*4882a593Smuzhiyun pps_val);
681*4882a593Smuzhiyun } else {
682*4882a593Smuzhiyun intel_de_write(dev_priv,
683*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_6(pipe),
684*4882a593Smuzhiyun pps_val);
685*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
686*4882a593Smuzhiyun intel_de_write(dev_priv,
687*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_6(pipe),
688*4882a593Smuzhiyun pps_val);
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_7 registers */
692*4882a593Smuzhiyun pps_val = 0;
693*4882a593Smuzhiyun pps_val |= DSC_SLICE_BPG_OFFSET(vdsc_cfg->slice_bpg_offset) |
694*4882a593Smuzhiyun DSC_NFL_BPG_OFFSET(vdsc_cfg->nfl_bpg_offset);
695*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS7 = 0x%08x\n", pps_val);
696*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
697*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_7,
698*4882a593Smuzhiyun pps_val);
699*4882a593Smuzhiyun /*
700*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
701*4882a593Smuzhiyun * VDSC
702*4882a593Smuzhiyun */
703*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
704*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_7,
705*4882a593Smuzhiyun pps_val);
706*4882a593Smuzhiyun } else {
707*4882a593Smuzhiyun intel_de_write(dev_priv,
708*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_7(pipe),
709*4882a593Smuzhiyun pps_val);
710*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
711*4882a593Smuzhiyun intel_de_write(dev_priv,
712*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_7(pipe),
713*4882a593Smuzhiyun pps_val);
714*4882a593Smuzhiyun }
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_8 registers */
717*4882a593Smuzhiyun pps_val = 0;
718*4882a593Smuzhiyun pps_val |= DSC_FINAL_OFFSET(vdsc_cfg->final_offset) |
719*4882a593Smuzhiyun DSC_INITIAL_OFFSET(vdsc_cfg->initial_offset);
720*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS8 = 0x%08x\n", pps_val);
721*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
722*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_8,
723*4882a593Smuzhiyun pps_val);
724*4882a593Smuzhiyun /*
725*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
726*4882a593Smuzhiyun * VDSC
727*4882a593Smuzhiyun */
728*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
729*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_8,
730*4882a593Smuzhiyun pps_val);
731*4882a593Smuzhiyun } else {
732*4882a593Smuzhiyun intel_de_write(dev_priv,
733*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_8(pipe),
734*4882a593Smuzhiyun pps_val);
735*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
736*4882a593Smuzhiyun intel_de_write(dev_priv,
737*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_8(pipe),
738*4882a593Smuzhiyun pps_val);
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_9 registers */
742*4882a593Smuzhiyun pps_val = 0;
743*4882a593Smuzhiyun pps_val |= DSC_RC_MODEL_SIZE(DSC_RC_MODEL_SIZE_CONST) |
744*4882a593Smuzhiyun DSC_RC_EDGE_FACTOR(DSC_RC_EDGE_FACTOR_CONST);
745*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS9 = 0x%08x\n", pps_val);
746*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
747*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_9,
748*4882a593Smuzhiyun pps_val);
749*4882a593Smuzhiyun /*
750*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
751*4882a593Smuzhiyun * VDSC
752*4882a593Smuzhiyun */
753*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
754*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_PICTURE_PARAMETER_SET_9,
755*4882a593Smuzhiyun pps_val);
756*4882a593Smuzhiyun } else {
757*4882a593Smuzhiyun intel_de_write(dev_priv,
758*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_9(pipe),
759*4882a593Smuzhiyun pps_val);
760*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
761*4882a593Smuzhiyun intel_de_write(dev_priv,
762*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_9(pipe),
763*4882a593Smuzhiyun pps_val);
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun /* Populate PICTURE_PARAMETER_SET_10 registers */
767*4882a593Smuzhiyun pps_val = 0;
768*4882a593Smuzhiyun pps_val |= DSC_RC_QUANT_INC_LIMIT0(vdsc_cfg->rc_quant_incr_limit0) |
769*4882a593Smuzhiyun DSC_RC_QUANT_INC_LIMIT1(vdsc_cfg->rc_quant_incr_limit1) |
770*4882a593Smuzhiyun DSC_RC_TARGET_OFF_HIGH(DSC_RC_TGT_OFFSET_HI_CONST) |
771*4882a593Smuzhiyun DSC_RC_TARGET_OFF_LOW(DSC_RC_TGT_OFFSET_LO_CONST);
772*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS10 = 0x%08x\n", pps_val);
773*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
774*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_10,
775*4882a593Smuzhiyun pps_val);
776*4882a593Smuzhiyun /*
777*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
778*4882a593Smuzhiyun * VDSC
779*4882a593Smuzhiyun */
780*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
781*4882a593Smuzhiyun intel_de_write(dev_priv,
782*4882a593Smuzhiyun DSCC_PICTURE_PARAMETER_SET_10, pps_val);
783*4882a593Smuzhiyun } else {
784*4882a593Smuzhiyun intel_de_write(dev_priv,
785*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_10(pipe),
786*4882a593Smuzhiyun pps_val);
787*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
788*4882a593Smuzhiyun intel_de_write(dev_priv,
789*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_10(pipe),
790*4882a593Smuzhiyun pps_val);
791*4882a593Smuzhiyun }
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /* Populate Picture parameter set 16 */
794*4882a593Smuzhiyun pps_val = 0;
795*4882a593Smuzhiyun pps_val |= DSC_SLICE_CHUNK_SIZE(vdsc_cfg->slice_chunk_size) |
796*4882a593Smuzhiyun DSC_SLICE_PER_LINE((vdsc_cfg->pic_width / num_vdsc_instances) /
797*4882a593Smuzhiyun vdsc_cfg->slice_width) |
798*4882a593Smuzhiyun DSC_SLICE_ROW_PER_FRAME(vdsc_cfg->pic_height /
799*4882a593Smuzhiyun vdsc_cfg->slice_height);
800*4882a593Smuzhiyun drm_info(&dev_priv->drm, "PPS16 = 0x%08x\n", pps_val);
801*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
802*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_16,
803*4882a593Smuzhiyun pps_val);
804*4882a593Smuzhiyun /*
805*4882a593Smuzhiyun * If 2 VDSC instances are needed, configure PPS for second
806*4882a593Smuzhiyun * VDSC
807*4882a593Smuzhiyun */
808*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
809*4882a593Smuzhiyun intel_de_write(dev_priv,
810*4882a593Smuzhiyun DSCC_PICTURE_PARAMETER_SET_16, pps_val);
811*4882a593Smuzhiyun } else {
812*4882a593Smuzhiyun intel_de_write(dev_priv,
813*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_16(pipe),
814*4882a593Smuzhiyun pps_val);
815*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split)
816*4882a593Smuzhiyun intel_de_write(dev_priv,
817*4882a593Smuzhiyun ICL_DSC1_PICTURE_PARAMETER_SET_16(pipe),
818*4882a593Smuzhiyun pps_val);
819*4882a593Smuzhiyun }
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun /* Populate the RC_BUF_THRESH registers */
822*4882a593Smuzhiyun memset(rc_buf_thresh_dword, 0, sizeof(rc_buf_thresh_dword));
823*4882a593Smuzhiyun for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++) {
824*4882a593Smuzhiyun rc_buf_thresh_dword[i / 4] |=
825*4882a593Smuzhiyun (u32)(vdsc_cfg->rc_buf_thresh[i] <<
826*4882a593Smuzhiyun BITS_PER_BYTE * (i % 4));
827*4882a593Smuzhiyun drm_info(&dev_priv->drm, " RC_BUF_THRESH%d = 0x%08x\n", i,
828*4882a593Smuzhiyun rc_buf_thresh_dword[i / 4]);
829*4882a593Smuzhiyun }
830*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
831*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_BUF_THRESH_0,
832*4882a593Smuzhiyun rc_buf_thresh_dword[0]);
833*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_BUF_THRESH_0_UDW,
834*4882a593Smuzhiyun rc_buf_thresh_dword[1]);
835*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_BUF_THRESH_1,
836*4882a593Smuzhiyun rc_buf_thresh_dword[2]);
837*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_BUF_THRESH_1_UDW,
838*4882a593Smuzhiyun rc_buf_thresh_dword[3]);
839*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split) {
840*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_BUF_THRESH_0,
841*4882a593Smuzhiyun rc_buf_thresh_dword[0]);
842*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_BUF_THRESH_0_UDW,
843*4882a593Smuzhiyun rc_buf_thresh_dword[1]);
844*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_BUF_THRESH_1,
845*4882a593Smuzhiyun rc_buf_thresh_dword[2]);
846*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_BUF_THRESH_1_UDW,
847*4882a593Smuzhiyun rc_buf_thresh_dword[3]);
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun } else {
850*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_BUF_THRESH_0(pipe),
851*4882a593Smuzhiyun rc_buf_thresh_dword[0]);
852*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_BUF_THRESH_0_UDW(pipe),
853*4882a593Smuzhiyun rc_buf_thresh_dword[1]);
854*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_BUF_THRESH_1(pipe),
855*4882a593Smuzhiyun rc_buf_thresh_dword[2]);
856*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_BUF_THRESH_1_UDW(pipe),
857*4882a593Smuzhiyun rc_buf_thresh_dword[3]);
858*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split) {
859*4882a593Smuzhiyun intel_de_write(dev_priv,
860*4882a593Smuzhiyun ICL_DSC1_RC_BUF_THRESH_0(pipe),
861*4882a593Smuzhiyun rc_buf_thresh_dword[0]);
862*4882a593Smuzhiyun intel_de_write(dev_priv,
863*4882a593Smuzhiyun ICL_DSC1_RC_BUF_THRESH_0_UDW(pipe),
864*4882a593Smuzhiyun rc_buf_thresh_dword[1]);
865*4882a593Smuzhiyun intel_de_write(dev_priv,
866*4882a593Smuzhiyun ICL_DSC1_RC_BUF_THRESH_1(pipe),
867*4882a593Smuzhiyun rc_buf_thresh_dword[2]);
868*4882a593Smuzhiyun intel_de_write(dev_priv,
869*4882a593Smuzhiyun ICL_DSC1_RC_BUF_THRESH_1_UDW(pipe),
870*4882a593Smuzhiyun rc_buf_thresh_dword[3]);
871*4882a593Smuzhiyun }
872*4882a593Smuzhiyun }
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun /* Populate the RC_RANGE_PARAMETERS registers */
875*4882a593Smuzhiyun memset(rc_range_params_dword, 0, sizeof(rc_range_params_dword));
876*4882a593Smuzhiyun for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
877*4882a593Smuzhiyun rc_range_params_dword[i / 2] |=
878*4882a593Smuzhiyun (u32)(((vdsc_cfg->rc_range_params[i].range_bpg_offset <<
879*4882a593Smuzhiyun RC_BPG_OFFSET_SHIFT) |
880*4882a593Smuzhiyun (vdsc_cfg->rc_range_params[i].range_max_qp <<
881*4882a593Smuzhiyun RC_MAX_QP_SHIFT) |
882*4882a593Smuzhiyun (vdsc_cfg->rc_range_params[i].range_min_qp <<
883*4882a593Smuzhiyun RC_MIN_QP_SHIFT)) << 16 * (i % 2));
884*4882a593Smuzhiyun drm_info(&dev_priv->drm, " RC_RANGE_PARAM_%d = 0x%08x\n", i,
885*4882a593Smuzhiyun rc_range_params_dword[i / 2]);
886*4882a593Smuzhiyun }
887*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
888*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_0,
889*4882a593Smuzhiyun rc_range_params_dword[0]);
890*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_0_UDW,
891*4882a593Smuzhiyun rc_range_params_dword[1]);
892*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_1,
893*4882a593Smuzhiyun rc_range_params_dword[2]);
894*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_1_UDW,
895*4882a593Smuzhiyun rc_range_params_dword[3]);
896*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_2,
897*4882a593Smuzhiyun rc_range_params_dword[4]);
898*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_2_UDW,
899*4882a593Smuzhiyun rc_range_params_dword[5]);
900*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_3,
901*4882a593Smuzhiyun rc_range_params_dword[6]);
902*4882a593Smuzhiyun intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_3_UDW,
903*4882a593Smuzhiyun rc_range_params_dword[7]);
904*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split) {
905*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_RANGE_PARAMETERS_0,
906*4882a593Smuzhiyun rc_range_params_dword[0]);
907*4882a593Smuzhiyun intel_de_write(dev_priv,
908*4882a593Smuzhiyun DSCC_RC_RANGE_PARAMETERS_0_UDW,
909*4882a593Smuzhiyun rc_range_params_dword[1]);
910*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_RANGE_PARAMETERS_1,
911*4882a593Smuzhiyun rc_range_params_dword[2]);
912*4882a593Smuzhiyun intel_de_write(dev_priv,
913*4882a593Smuzhiyun DSCC_RC_RANGE_PARAMETERS_1_UDW,
914*4882a593Smuzhiyun rc_range_params_dword[3]);
915*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_RANGE_PARAMETERS_2,
916*4882a593Smuzhiyun rc_range_params_dword[4]);
917*4882a593Smuzhiyun intel_de_write(dev_priv,
918*4882a593Smuzhiyun DSCC_RC_RANGE_PARAMETERS_2_UDW,
919*4882a593Smuzhiyun rc_range_params_dword[5]);
920*4882a593Smuzhiyun intel_de_write(dev_priv, DSCC_RC_RANGE_PARAMETERS_3,
921*4882a593Smuzhiyun rc_range_params_dword[6]);
922*4882a593Smuzhiyun intel_de_write(dev_priv,
923*4882a593Smuzhiyun DSCC_RC_RANGE_PARAMETERS_3_UDW,
924*4882a593Smuzhiyun rc_range_params_dword[7]);
925*4882a593Smuzhiyun }
926*4882a593Smuzhiyun } else {
927*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_RANGE_PARAMETERS_0(pipe),
928*4882a593Smuzhiyun rc_range_params_dword[0]);
929*4882a593Smuzhiyun intel_de_write(dev_priv,
930*4882a593Smuzhiyun ICL_DSC0_RC_RANGE_PARAMETERS_0_UDW(pipe),
931*4882a593Smuzhiyun rc_range_params_dword[1]);
932*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_RANGE_PARAMETERS_1(pipe),
933*4882a593Smuzhiyun rc_range_params_dword[2]);
934*4882a593Smuzhiyun intel_de_write(dev_priv,
935*4882a593Smuzhiyun ICL_DSC0_RC_RANGE_PARAMETERS_1_UDW(pipe),
936*4882a593Smuzhiyun rc_range_params_dword[3]);
937*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_RANGE_PARAMETERS_2(pipe),
938*4882a593Smuzhiyun rc_range_params_dword[4]);
939*4882a593Smuzhiyun intel_de_write(dev_priv,
940*4882a593Smuzhiyun ICL_DSC0_RC_RANGE_PARAMETERS_2_UDW(pipe),
941*4882a593Smuzhiyun rc_range_params_dword[5]);
942*4882a593Smuzhiyun intel_de_write(dev_priv, ICL_DSC0_RC_RANGE_PARAMETERS_3(pipe),
943*4882a593Smuzhiyun rc_range_params_dword[6]);
944*4882a593Smuzhiyun intel_de_write(dev_priv,
945*4882a593Smuzhiyun ICL_DSC0_RC_RANGE_PARAMETERS_3_UDW(pipe),
946*4882a593Smuzhiyun rc_range_params_dword[7]);
947*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split) {
948*4882a593Smuzhiyun intel_de_write(dev_priv,
949*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_0(pipe),
950*4882a593Smuzhiyun rc_range_params_dword[0]);
951*4882a593Smuzhiyun intel_de_write(dev_priv,
952*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_0_UDW(pipe),
953*4882a593Smuzhiyun rc_range_params_dword[1]);
954*4882a593Smuzhiyun intel_de_write(dev_priv,
955*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_1(pipe),
956*4882a593Smuzhiyun rc_range_params_dword[2]);
957*4882a593Smuzhiyun intel_de_write(dev_priv,
958*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_1_UDW(pipe),
959*4882a593Smuzhiyun rc_range_params_dword[3]);
960*4882a593Smuzhiyun intel_de_write(dev_priv,
961*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_2(pipe),
962*4882a593Smuzhiyun rc_range_params_dword[4]);
963*4882a593Smuzhiyun intel_de_write(dev_priv,
964*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_2_UDW(pipe),
965*4882a593Smuzhiyun rc_range_params_dword[5]);
966*4882a593Smuzhiyun intel_de_write(dev_priv,
967*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_3(pipe),
968*4882a593Smuzhiyun rc_range_params_dword[6]);
969*4882a593Smuzhiyun intel_de_write(dev_priv,
970*4882a593Smuzhiyun ICL_DSC1_RC_RANGE_PARAMETERS_3_UDW(pipe),
971*4882a593Smuzhiyun rc_range_params_dword[7]);
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun }
975*4882a593Smuzhiyun
intel_dsc_get_config(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state)976*4882a593Smuzhiyun void intel_dsc_get_config(struct intel_encoder *encoder,
977*4882a593Smuzhiyun struct intel_crtc_state *crtc_state)
978*4882a593Smuzhiyun {
979*4882a593Smuzhiyun struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
980*4882a593Smuzhiyun struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
981*4882a593Smuzhiyun struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
982*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
983*4882a593Smuzhiyun enum intel_display_power_domain power_domain;
984*4882a593Smuzhiyun intel_wakeref_t wakeref;
985*4882a593Smuzhiyun u32 dss_ctl1, dss_ctl2, val;
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun if (!intel_dsc_source_support(encoder, crtc_state))
988*4882a593Smuzhiyun return;
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun power_domain = intel_dsc_power_domain(crtc_state);
991*4882a593Smuzhiyun
992*4882a593Smuzhiyun wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
993*4882a593Smuzhiyun if (!wakeref)
994*4882a593Smuzhiyun return;
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
997*4882a593Smuzhiyun dss_ctl1 = intel_de_read(dev_priv, DSS_CTL1);
998*4882a593Smuzhiyun dss_ctl2 = intel_de_read(dev_priv, DSS_CTL2);
999*4882a593Smuzhiyun } else {
1000*4882a593Smuzhiyun dss_ctl1 = intel_de_read(dev_priv, ICL_PIPE_DSS_CTL1(pipe));
1001*4882a593Smuzhiyun dss_ctl2 = intel_de_read(dev_priv, ICL_PIPE_DSS_CTL2(pipe));
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun crtc_state->dsc.compression_enable = dss_ctl2 & LEFT_BRANCH_VDSC_ENABLE;
1005*4882a593Smuzhiyun if (!crtc_state->dsc.compression_enable)
1006*4882a593Smuzhiyun goto out;
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun crtc_state->dsc.dsc_split = (dss_ctl2 & RIGHT_BRANCH_VDSC_ENABLE) &&
1009*4882a593Smuzhiyun (dss_ctl1 & JOINER_ENABLE);
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun /* FIXME: add more state readout as needed */
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun /* PPS1 */
1014*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state))
1015*4882a593Smuzhiyun val = intel_de_read(dev_priv, DSCA_PICTURE_PARAMETER_SET_1);
1016*4882a593Smuzhiyun else
1017*4882a593Smuzhiyun val = intel_de_read(dev_priv,
1018*4882a593Smuzhiyun ICL_DSC0_PICTURE_PARAMETER_SET_1(pipe));
1019*4882a593Smuzhiyun vdsc_cfg->bits_per_pixel = val;
1020*4882a593Smuzhiyun crtc_state->dsc.compressed_bpp = vdsc_cfg->bits_per_pixel >> 4;
1021*4882a593Smuzhiyun out:
1022*4882a593Smuzhiyun intel_display_power_put(dev_priv, power_domain, wakeref);
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun
intel_dsc_dsi_pps_write(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)1025*4882a593Smuzhiyun static void intel_dsc_dsi_pps_write(struct intel_encoder *encoder,
1026*4882a593Smuzhiyun const struct intel_crtc_state *crtc_state)
1027*4882a593Smuzhiyun {
1028*4882a593Smuzhiyun const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
1029*4882a593Smuzhiyun struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
1030*4882a593Smuzhiyun struct mipi_dsi_device *dsi;
1031*4882a593Smuzhiyun struct drm_dsc_picture_parameter_set pps;
1032*4882a593Smuzhiyun enum port port;
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun drm_dsc_pps_payload_pack(&pps, vdsc_cfg);
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun for_each_dsi_port(port, intel_dsi->ports) {
1037*4882a593Smuzhiyun dsi = intel_dsi->dsi_hosts[port]->device;
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun mipi_dsi_picture_parameter_set(dsi, &pps);
1040*4882a593Smuzhiyun mipi_dsi_compression_mode(dsi, true);
1041*4882a593Smuzhiyun }
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun
intel_dsc_dp_pps_write(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)1044*4882a593Smuzhiyun static void intel_dsc_dp_pps_write(struct intel_encoder *encoder,
1045*4882a593Smuzhiyun const struct intel_crtc_state *crtc_state)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1048*4882a593Smuzhiyun struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1049*4882a593Smuzhiyun const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
1050*4882a593Smuzhiyun struct drm_dsc_pps_infoframe dp_dsc_pps_sdp;
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun /* Prepare DP SDP PPS header as per DP 1.4 spec, Table 2-123 */
1053*4882a593Smuzhiyun drm_dsc_dp_pps_header_init(&dp_dsc_pps_sdp.pps_header);
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun /* Fill the PPS payload bytes as per DSC spec 1.2 Table 4-1 */
1056*4882a593Smuzhiyun drm_dsc_pps_payload_pack(&dp_dsc_pps_sdp.pps_payload, vdsc_cfg);
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun dig_port->write_infoframe(encoder, crtc_state,
1059*4882a593Smuzhiyun DP_SDP_PPS, &dp_dsc_pps_sdp,
1060*4882a593Smuzhiyun sizeof(dp_dsc_pps_sdp));
1061*4882a593Smuzhiyun }
1062*4882a593Smuzhiyun
intel_dsc_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)1063*4882a593Smuzhiyun void intel_dsc_enable(struct intel_encoder *encoder,
1064*4882a593Smuzhiyun const struct intel_crtc_state *crtc_state)
1065*4882a593Smuzhiyun {
1066*4882a593Smuzhiyun struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1067*4882a593Smuzhiyun struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1068*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
1069*4882a593Smuzhiyun i915_reg_t dss_ctl1_reg, dss_ctl2_reg;
1070*4882a593Smuzhiyun u32 dss_ctl1_val = 0;
1071*4882a593Smuzhiyun u32 dss_ctl2_val = 0;
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun if (!crtc_state->dsc.compression_enable)
1074*4882a593Smuzhiyun return;
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun /* Enable Power wells for VDSC/joining */
1077*4882a593Smuzhiyun intel_display_power_get(dev_priv,
1078*4882a593Smuzhiyun intel_dsc_power_domain(crtc_state));
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun intel_dsc_pps_configure(encoder, crtc_state);
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun if (encoder->type == INTEL_OUTPUT_DSI)
1083*4882a593Smuzhiyun intel_dsc_dsi_pps_write(encoder, crtc_state);
1084*4882a593Smuzhiyun else
1085*4882a593Smuzhiyun intel_dsc_dp_pps_write(encoder, crtc_state);
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun if (!is_pipe_dsc(crtc_state)) {
1088*4882a593Smuzhiyun dss_ctl1_reg = DSS_CTL1;
1089*4882a593Smuzhiyun dss_ctl2_reg = DSS_CTL2;
1090*4882a593Smuzhiyun } else {
1091*4882a593Smuzhiyun dss_ctl1_reg = ICL_PIPE_DSS_CTL1(pipe);
1092*4882a593Smuzhiyun dss_ctl2_reg = ICL_PIPE_DSS_CTL2(pipe);
1093*4882a593Smuzhiyun }
1094*4882a593Smuzhiyun dss_ctl2_val |= LEFT_BRANCH_VDSC_ENABLE;
1095*4882a593Smuzhiyun if (crtc_state->dsc.dsc_split) {
1096*4882a593Smuzhiyun dss_ctl2_val |= RIGHT_BRANCH_VDSC_ENABLE;
1097*4882a593Smuzhiyun dss_ctl1_val |= JOINER_ENABLE;
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun intel_de_write(dev_priv, dss_ctl1_reg, dss_ctl1_val);
1100*4882a593Smuzhiyun intel_de_write(dev_priv, dss_ctl2_reg, dss_ctl2_val);
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun
intel_dsc_disable(const struct intel_crtc_state * old_crtc_state)1103*4882a593Smuzhiyun void intel_dsc_disable(const struct intel_crtc_state *old_crtc_state)
1104*4882a593Smuzhiyun {
1105*4882a593Smuzhiyun struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
1106*4882a593Smuzhiyun struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1107*4882a593Smuzhiyun enum pipe pipe = crtc->pipe;
1108*4882a593Smuzhiyun i915_reg_t dss_ctl1_reg, dss_ctl2_reg;
1109*4882a593Smuzhiyun u32 dss_ctl1_val = 0, dss_ctl2_val = 0;
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun if (!old_crtc_state->dsc.compression_enable)
1112*4882a593Smuzhiyun return;
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun if (!is_pipe_dsc(old_crtc_state)) {
1115*4882a593Smuzhiyun dss_ctl1_reg = DSS_CTL1;
1116*4882a593Smuzhiyun dss_ctl2_reg = DSS_CTL2;
1117*4882a593Smuzhiyun } else {
1118*4882a593Smuzhiyun dss_ctl1_reg = ICL_PIPE_DSS_CTL1(pipe);
1119*4882a593Smuzhiyun dss_ctl2_reg = ICL_PIPE_DSS_CTL2(pipe);
1120*4882a593Smuzhiyun }
1121*4882a593Smuzhiyun dss_ctl1_val = intel_de_read(dev_priv, dss_ctl1_reg);
1122*4882a593Smuzhiyun if (dss_ctl1_val & JOINER_ENABLE)
1123*4882a593Smuzhiyun dss_ctl1_val &= ~JOINER_ENABLE;
1124*4882a593Smuzhiyun intel_de_write(dev_priv, dss_ctl1_reg, dss_ctl1_val);
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun dss_ctl2_val = intel_de_read(dev_priv, dss_ctl2_reg);
1127*4882a593Smuzhiyun if (dss_ctl2_val & LEFT_BRANCH_VDSC_ENABLE ||
1128*4882a593Smuzhiyun dss_ctl2_val & RIGHT_BRANCH_VDSC_ENABLE)
1129*4882a593Smuzhiyun dss_ctl2_val &= ~(LEFT_BRANCH_VDSC_ENABLE |
1130*4882a593Smuzhiyun RIGHT_BRANCH_VDSC_ENABLE);
1131*4882a593Smuzhiyun intel_de_write(dev_priv, dss_ctl2_reg, dss_ctl2_val);
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun /* Disable Power wells for VDSC/joining */
1134*4882a593Smuzhiyun intel_display_power_put_unchecked(dev_priv,
1135*4882a593Smuzhiyun intel_dsc_power_domain(old_crtc_state));
1136*4882a593Smuzhiyun }
1137