]> Git Repo - J-linux.git/blob - drivers/gpu/drm/amd/display/dc/dc_spl_translate.c
Merge tag 'kvmarm-fixes-6.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[J-linux.git] / drivers / gpu / drm / amd / display / dc / dc_spl_translate.c
1 // SPDX-License-Identifier: MIT
2 //
3 // Copyright 2024 Advanced Micro Devices, Inc.
4
5 #include "dc_spl_translate.h"
6 #include "spl/dc_spl_types.h"
7 #include "dcn20/dcn20_dpp.h"
8 #include "dcn32/dcn32_dpp.h"
9 #include "dcn401/dcn401_dpp.h"
10
11 static struct spl_funcs dcn2_spl_funcs = {
12         .spl_calc_lb_num_partitions = dscl2_spl_calc_lb_num_partitions,
13 };
14 static struct spl_funcs dcn32_spl_funcs = {
15         .spl_calc_lb_num_partitions = dscl32_spl_calc_lb_num_partitions,
16 };
17 static struct spl_funcs dcn401_spl_funcs = {
18         .spl_calc_lb_num_partitions = dscl401_spl_calc_lb_num_partitions,
19 };
20 static void populate_splrect_from_rect(struct spl_rect *spl_rect, const struct rect *rect)
21 {
22         spl_rect->x = rect->x;
23         spl_rect->y = rect->y;
24         spl_rect->width = rect->width;
25         spl_rect->height = rect->height;
26 }
27 static void populate_rect_from_splrect(struct rect *rect, const struct spl_rect *spl_rect)
28 {
29         rect->x = spl_rect->x;
30         rect->y = spl_rect->y;
31         rect->width = spl_rect->width;
32         rect->height = spl_rect->height;
33 }
34 static void populate_spltaps_from_taps(struct spl_taps *spl_scaling_quality,
35                 const struct scaling_taps *scaling_quality)
36 {
37         spl_scaling_quality->h_taps_c = scaling_quality->h_taps_c;
38         spl_scaling_quality->h_taps = scaling_quality->h_taps;
39         spl_scaling_quality->v_taps_c = scaling_quality->v_taps_c;
40         spl_scaling_quality->v_taps = scaling_quality->v_taps;
41 }
42 static void populate_taps_from_spltaps(struct scaling_taps *scaling_quality,
43                 const struct spl_taps *spl_scaling_quality)
44 {
45         scaling_quality->h_taps_c = spl_scaling_quality->h_taps_c + 1;
46         scaling_quality->h_taps = spl_scaling_quality->h_taps + 1;
47         scaling_quality->v_taps_c = spl_scaling_quality->v_taps_c + 1;
48         scaling_quality->v_taps = spl_scaling_quality->v_taps + 1;
49 }
50 static void populate_ratios_from_splratios(struct scaling_ratios *ratios,
51                 const struct ratio *spl_ratios)
52 {
53         ratios->horz = dc_fixpt_from_ux_dy(spl_ratios->h_scale_ratio >> 5, 3, 19);
54         ratios->vert = dc_fixpt_from_ux_dy(spl_ratios->v_scale_ratio >> 5, 3, 19);
55         ratios->horz_c = dc_fixpt_from_ux_dy(spl_ratios->h_scale_ratio_c >> 5, 3, 19);
56         ratios->vert_c = dc_fixpt_from_ux_dy(spl_ratios->v_scale_ratio_c >> 5, 3, 19);
57 }
58 static void populate_inits_from_splinits(struct scl_inits *inits,
59                 const struct init *spl_inits)
60 {
61         inits->h = dc_fixpt_from_int_dy(spl_inits->h_filter_init_int, spl_inits->h_filter_init_frac >> 5, 0, 19);
62         inits->v = dc_fixpt_from_int_dy(spl_inits->v_filter_init_int, spl_inits->v_filter_init_frac >> 5, 0, 19);
63         inits->h_c = dc_fixpt_from_int_dy(spl_inits->h_filter_init_int_c, spl_inits->h_filter_init_frac_c >> 5, 0, 19);
64         inits->v_c = dc_fixpt_from_int_dy(spl_inits->v_filter_init_int_c, spl_inits->v_filter_init_frac_c >> 5, 0, 19);
65 }
66 /// @brief Translate SPL input parameters from pipe context
67 /// @param pipe_ctx
68 /// @param spl_in
69 void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_in *spl_in)
70 {
71         const struct dc_plane_state *plane_state = pipe_ctx->plane_state;
72         const struct dc_stream_state *stream = pipe_ctx->stream;
73         struct rect odm_slice_src = resource_get_odm_slice_src_rect(pipe_ctx);
74
75         // Assign the function to calculate the number of partitions in the line buffer
76         // This is used to determine the vtap support
77         switch (plane_state->ctx->dce_version)  {
78         case DCN_VERSION_2_0:
79                 spl_in->funcs = &dcn2_spl_funcs;
80                 break;
81         case DCN_VERSION_3_2:
82                 spl_in->funcs = &dcn32_spl_funcs;
83                 break;
84         case DCN_VERSION_4_01:
85                 spl_in->funcs = &dcn401_spl_funcs;
86                 break;
87         default:
88                 spl_in->funcs = &dcn2_spl_funcs;
89         }
90         // Make format field from spl_in point to plane_res scl_data format
91         spl_in->basic_in.format = (enum spl_pixel_format)pipe_ctx->plane_res.scl_data.format;
92         // Make view_format from basic_out point to view_format from stream
93         spl_in->basic_out.view_format = (enum spl_view_3d)stream->view_format;
94         // Populate spl input basic input clip rect from plane state clip rect
95         populate_splrect_from_rect(&spl_in->basic_in.clip_rect, &plane_state->clip_rect);
96         // Populate spl input basic out src rect from stream src rect
97         populate_splrect_from_rect(&spl_in->basic_out.src_rect, &stream->src);
98         // Populate spl input basic out dst rect from stream dst rect
99         populate_splrect_from_rect(&spl_in->basic_out.dst_rect, &stream->dst);
100         // Make spl input basic input info rotation field point to plane state rotation
101         spl_in->basic_in.rotation = (enum spl_rotation_angle)plane_state->rotation;
102         // Populate spl input basic input src rect from plane state src rect
103         populate_splrect_from_rect(&spl_in->basic_in.src_rect, &plane_state->src_rect);
104         // Populate spl input basic input dst rect from plane state dst rect
105         populate_splrect_from_rect(&spl_in->basic_in.dst_rect, &plane_state->dst_rect);
106         // Make spl input basic input info horiz mirror field point to plane state horz mirror
107         spl_in->basic_in.horizontal_mirror = plane_state->horizontal_mirror;
108
109         // Calculate horizontal splits and split index
110         spl_in->basic_in.mpc_combine_h = resource_get_mpc_slice_count(pipe_ctx);
111
112         if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE)
113                 spl_in->basic_in.mpc_combine_v = 0;
114         else
115                 spl_in->basic_in.mpc_combine_v = resource_get_mpc_slice_index(pipe_ctx);
116
117         populate_splrect_from_rect(&spl_in->basic_out.odm_slice_rect, &odm_slice_src);
118         spl_in->basic_out.odm_combine_factor = 0;
119         spl_in->odm_slice_index = resource_get_odm_slice_index(pipe_ctx);
120         // Make spl input basic out info output_size width point to stream h active
121         spl_in->basic_out.output_size.width =
122                 stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right;
123         // Make spl input basic out info output_size height point to v active
124         spl_in->basic_out.output_size.height =
125                 stream->timing.v_addressable + stream->timing.v_border_bottom + stream->timing.v_border_top;
126         spl_in->basic_out.max_downscale_src_width =
127                         pipe_ctx->stream->ctx->dc->debug.max_downscale_src_width;
128         spl_in->basic_out.always_scale = pipe_ctx->stream->ctx->dc->debug.always_scale;
129         // Make spl input basic output info alpha_en field point to plane res scl_data lb_params alpha_en
130         spl_in->basic_out.alpha_en = pipe_ctx->plane_res.scl_data.lb_params.alpha_en;
131         spl_in->basic_out.use_two_pixels_per_container = pipe_ctx->stream_res.tg->funcs->is_two_pixels_per_container(&stream->timing);
132         // Make spl input basic input info scaling quality field point to plane state scaling_quality
133         populate_spltaps_from_taps(&spl_in->scaling_quality, &plane_state->scaling_quality);
134         // Translate edge adaptive scaler preference
135         spl_in->prefer_easf = pipe_ctx->stream->ctx->dc->config.prefer_easf;
136         spl_in->disable_easf = false;
137         if (pipe_ctx->stream->ctx->dc->debug.force_easf == 1)
138                 spl_in->prefer_easf = false;
139         else if (pipe_ctx->stream->ctx->dc->debug.force_easf == 2)
140                 spl_in->disable_easf = true;
141         /* Translate adaptive sharpening preference */
142         unsigned int sharpness_setting = pipe_ctx->stream->ctx->dc->debug.force_sharpness;
143         unsigned int force_sharpness_level = pipe_ctx->stream->ctx->dc->debug.force_sharpness_level;
144         if (sharpness_setting == SHARPNESS_HW_OFF)
145                 spl_in->adaptive_sharpness.enable = false;
146         else if (sharpness_setting == SHARPNESS_ZERO) {
147                 spl_in->adaptive_sharpness.enable = true;
148                 spl_in->adaptive_sharpness.sharpness_level = 0;
149         } else if (sharpness_setting == SHARPNESS_CUSTOM) {
150                 spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_min = 0;
151                 spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_max = 1750;
152                 spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_mid = 750;
153                 spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_min = 0;
154                 spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_max = 3500;
155                 spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_mid = 1500;
156                 spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_min = 0;
157                 spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_max = 2750;
158                 spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_mid = 1500;
159
160                 if (force_sharpness_level > 0) {
161                         if (force_sharpness_level > 10)
162                                 force_sharpness_level = 10;
163                         spl_in->adaptive_sharpness.enable = true;
164                         spl_in->adaptive_sharpness.sharpness_level = force_sharpness_level;
165                 } else if (!plane_state->adaptive_sharpness_en) {
166                         spl_in->adaptive_sharpness.enable = false;
167                         spl_in->adaptive_sharpness.sharpness_level = 0;
168                 } else {
169                         spl_in->adaptive_sharpness.enable = true;
170                         spl_in->adaptive_sharpness.sharpness_level = plane_state->sharpness_level;
171                 }
172         }
173         // Translate linear light scaling preference
174         if (pipe_ctx->stream->ctx->dc->debug.force_lls > 0)
175                 spl_in->lls_pref = pipe_ctx->stream->ctx->dc->debug.force_lls;
176         else
177                 spl_in->lls_pref = plane_state->linear_light_scaling;
178         /* Translate chroma subsampling offset ( cositing ) */
179         if (pipe_ctx->stream->ctx->dc->debug.force_cositing)
180                 spl_in->basic_in.cositing = pipe_ctx->stream->ctx->dc->debug.force_cositing - 1;
181         else
182                 spl_in->basic_in.cositing = plane_state->cositing;
183         /* Translate transfer function */
184         spl_in->basic_in.tf_type = (enum spl_transfer_func_type) plane_state->in_transfer_func.type;
185         spl_in->basic_in.tf_predefined_type = (enum spl_transfer_func_predefined) plane_state->in_transfer_func.tf;
186
187         spl_in->h_active = pipe_ctx->plane_res.scl_data.h_active;
188         spl_in->v_active = pipe_ctx->plane_res.scl_data.v_active;
189
190         spl_in->debug.sharpen_policy = (enum sharpen_policy)pipe_ctx->stream->ctx->dc->debug.sharpen_policy;
191         spl_in->debug.scale_to_sharpness_policy =
192                 (enum scale_to_sharpness_policy)pipe_ctx->stream->ctx->dc->debug.scale_to_sharpness_policy;
193
194         /* Check if it is stream is in fullscreen and if its HDR.
195          * Use this to determine sharpness levels
196          */
197         spl_in->is_fullscreen = dm_helpers_is_fullscreen(pipe_ctx->stream->ctx, pipe_ctx->stream);
198         spl_in->is_hdr_on = dm_helpers_is_hdr_on(pipe_ctx->stream->ctx, pipe_ctx->stream);
199         spl_in->sdr_white_level_nits = plane_state->sdr_white_level_nits;
200 }
201
202 /// @brief Translate SPL output parameters to pipe context
203 /// @param pipe_ctx
204 /// @param spl_out
205 void translate_SPL_out_params_to_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_out *spl_out)
206 {
207         // Make scaler data recout point to spl output field recout
208         populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.recout, &spl_out->dscl_prog_data->recout);
209         // Make scaler data ratios point to spl output field ratios
210         populate_ratios_from_splratios(&pipe_ctx->plane_res.scl_data.ratios, &spl_out->dscl_prog_data->ratios);
211         // Make scaler data viewport point to spl output field viewport
212         populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.viewport, &spl_out->dscl_prog_data->viewport);
213         // Make scaler data viewport_c point to spl output field viewport_c
214         populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.viewport_c, &spl_out->dscl_prog_data->viewport_c);
215         // Make scaler data taps point to spl output field scaling taps
216         populate_taps_from_spltaps(&pipe_ctx->plane_res.scl_data.taps, &spl_out->dscl_prog_data->taps);
217         // Make scaler data init point to spl output field init
218         populate_inits_from_splinits(&pipe_ctx->plane_res.scl_data.inits, &spl_out->dscl_prog_data->init);
219 }
This page took 0.03883 seconds and 4 git commands to generate.