174c06a32SQingqing Zhuo /* SPDX-License-Identifier: MIT */
274c06a32SQingqing Zhuo /*
374c06a32SQingqing Zhuo * Copyright 2023 Advanced Micro Devices, Inc.
474c06a32SQingqing Zhuo *
574c06a32SQingqing Zhuo * Permission is hereby granted, free of charge, to any person obtaining a
674c06a32SQingqing Zhuo * copy of this software and associated documentation files (the "Software"),
774c06a32SQingqing Zhuo * to deal in the Software without restriction, including without limitation
874c06a32SQingqing Zhuo * the rights to use, copy, modify, merge, publish, distribute, sublicense,
974c06a32SQingqing Zhuo * and/or sell copies of the Software, and to permit persons to whom the
1074c06a32SQingqing Zhuo * Software is furnished to do so, subject to the following conditions:
1174c06a32SQingqing Zhuo *
1274c06a32SQingqing Zhuo * The above copyright notice and this permission notice shall be included in
1374c06a32SQingqing Zhuo * all copies or substantial portions of the Software.
1474c06a32SQingqing Zhuo *
1574c06a32SQingqing Zhuo * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1674c06a32SQingqing Zhuo * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1774c06a32SQingqing Zhuo * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1874c06a32SQingqing Zhuo * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1974c06a32SQingqing Zhuo * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
2074c06a32SQingqing Zhuo * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2174c06a32SQingqing Zhuo * OTHER DEALINGS IN THE SOFTWARE.
2274c06a32SQingqing Zhuo *
2378964fcaSStylon Wang * Authors: AMD
2478964fcaSStylon Wang *
2574c06a32SQingqing Zhuo */
2674c06a32SQingqing Zhuo
2774c06a32SQingqing Zhuo #include "dcn35_hubp.h"
2874c06a32SQingqing Zhuo #include "reg_helper.h"
2974c06a32SQingqing Zhuo
3074c06a32SQingqing Zhuo #define REG(reg)\
3174c06a32SQingqing Zhuo hubp2->hubp_regs->reg
3274c06a32SQingqing Zhuo
3374c06a32SQingqing Zhuo #define CTX \
3474c06a32SQingqing Zhuo hubp2->base.ctx
3574c06a32SQingqing Zhuo
3674c06a32SQingqing Zhuo #undef FN
3774c06a32SQingqing Zhuo #define FN(reg_name, field_name) \
3874c06a32SQingqing Zhuo ((const struct dcn35_hubp2_shift *)hubp2->hubp_shift)->field_name, \
3974c06a32SQingqing Zhuo ((const struct dcn35_hubp2_mask *)hubp2->hubp_mask)->field_name
4074c06a32SQingqing Zhuo
hubp35_set_fgcg(struct hubp * hubp,bool enable)4174c06a32SQingqing Zhuo void hubp35_set_fgcg(struct hubp *hubp, bool enable)
4274c06a32SQingqing Zhuo {
4374c06a32SQingqing Zhuo struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
4474c06a32SQingqing Zhuo
4574c06a32SQingqing Zhuo REG_UPDATE(HUBP_CLK_CNTL, HUBP_FGCG_REP_DIS, !enable);
4674c06a32SQingqing Zhuo }
4774c06a32SQingqing Zhuo
hubp35_init(struct hubp * hubp)48*2739bd12SDmytro void hubp35_init(struct hubp *hubp)
4974c06a32SQingqing Zhuo {
5074c06a32SQingqing Zhuo hubp3_init(hubp);
5174c06a32SQingqing Zhuo
5274c06a32SQingqing Zhuo hubp35_set_fgcg(hubp, hubp->ctx->dc->debug.enable_fine_grain_clock_gating.bits.dchub);
5374c06a32SQingqing Zhuo
5474c06a32SQingqing Zhuo /*do nothing for now for dcn3.5 or later*/
5574c06a32SQingqing Zhuo }
56995dedb7SSung Joon Kim
hubp35_program_pixel_format(struct hubp * hubp,enum surface_pixel_format format)57995dedb7SSung Joon Kim void hubp35_program_pixel_format(
58995dedb7SSung Joon Kim struct hubp *hubp,
59995dedb7SSung Joon Kim enum surface_pixel_format format)
60995dedb7SSung Joon Kim {
61995dedb7SSung Joon Kim struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
62995dedb7SSung Joon Kim uint32_t green_bar = 1;
63995dedb7SSung Joon Kim uint32_t red_bar = 3;
64995dedb7SSung Joon Kim uint32_t blue_bar = 2;
65995dedb7SSung Joon Kim
66995dedb7SSung Joon Kim /* swap for ABGR format */
67995dedb7SSung Joon Kim if (format == SURFACE_PIXEL_FORMAT_GRPH_ABGR8888
68995dedb7SSung Joon Kim || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010
69995dedb7SSung Joon Kim || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS
70995dedb7SSung Joon Kim || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616
71995dedb7SSung Joon Kim || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) {
72995dedb7SSung Joon Kim red_bar = 2;
73995dedb7SSung Joon Kim blue_bar = 3;
74995dedb7SSung Joon Kim }
75995dedb7SSung Joon Kim
76995dedb7SSung Joon Kim REG_UPDATE_3(HUBPRET_CONTROL,
77995dedb7SSung Joon Kim CROSSBAR_SRC_Y_G, green_bar,
78995dedb7SSung Joon Kim CROSSBAR_SRC_CB_B, blue_bar,
79995dedb7SSung Joon Kim CROSSBAR_SRC_CR_R, red_bar);
80995dedb7SSung Joon Kim
81995dedb7SSung Joon Kim /* Mapping is same as ipp programming (cnvc) */
82995dedb7SSung Joon Kim
83995dedb7SSung Joon Kim switch (format) {
84995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
85995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
86995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 1);
87995dedb7SSung Joon Kim break;
88995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
89995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
90995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 3);
91995dedb7SSung Joon Kim break;
92995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
93995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
94995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
95995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 8);
96995dedb7SSung Joon Kim break;
97995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
98995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
99995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
100995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
101995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 10);
102995dedb7SSung Joon Kim break;
103995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
104995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: /* we use crossbar already */
105995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
106995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 26); /* ARGB16161616_UNORM */
107995dedb7SSung Joon Kim break;
108995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
109995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:/*we use crossbar already*/
110995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
111995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 24);
112995dedb7SSung Joon Kim break;
113995dedb7SSung Joon Kim
114995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
115995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
116995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 65);
117995dedb7SSung Joon Kim break;
118995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb:
119995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
120995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 64);
121995dedb7SSung Joon Kim break;
122995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
123995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
124995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 67);
125995dedb7SSung Joon Kim break;
126995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
127995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
128995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 66);
129995dedb7SSung Joon Kim break;
130995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_AYCrCb8888:
131995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
132995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 12);
133995dedb7SSung Joon Kim break;
134995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FIX:
135995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
136995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 112);
137995dedb7SSung Joon Kim break;
138995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FIX:
139995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
140995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 113);
141995dedb7SSung Joon Kim break;
142995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb2101010:
143995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
144995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 114);
145995dedb7SSung Joon Kim break;
146995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FLOAT:
147995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
148995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 118);
149995dedb7SSung Joon Kim break;
150995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FLOAT:
151995dedb7SSung Joon Kim REG_UPDATE(DCSURF_SURFACE_CONFIG,
152995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 119);
153995dedb7SSung Joon Kim break;
154995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_RGBE:
155995dedb7SSung Joon Kim REG_UPDATE_2(DCSURF_SURFACE_CONFIG,
156995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 116,
157995dedb7SSung Joon Kim ALPHA_PLANE_EN, 0);
158995dedb7SSung Joon Kim break;
159995dedb7SSung Joon Kim case SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA:
160995dedb7SSung Joon Kim REG_UPDATE_2(DCSURF_SURFACE_CONFIG,
161995dedb7SSung Joon Kim SURFACE_PIXEL_FORMAT, 116,
162995dedb7SSung Joon Kim ALPHA_PLANE_EN, 1);
163995dedb7SSung Joon Kim break;
164995dedb7SSung Joon Kim default:
165995dedb7SSung Joon Kim BREAK_TO_DEBUGGER();
166995dedb7SSung Joon Kim break;
167995dedb7SSung Joon Kim }
168995dedb7SSung Joon Kim
169995dedb7SSung Joon Kim /* don't see the need of program the xbar in DCN 1.0 */
170995dedb7SSung Joon Kim }
171995dedb7SSung Joon Kim
hubp35_program_surface_config(struct hubp * hubp,enum surface_pixel_format format,struct dc_tiling_info * tiling_info,struct plane_size * plane_size,enum dc_rotation_angle rotation,struct dc_plane_dcc_param * dcc,bool horizontal_mirror,unsigned int compat_level)172995dedb7SSung Joon Kim void hubp35_program_surface_config(
173995dedb7SSung Joon Kim struct hubp *hubp,
174995dedb7SSung Joon Kim enum surface_pixel_format format,
175080950cbSKarthi Kandasamy struct dc_tiling_info *tiling_info,
176995dedb7SSung Joon Kim struct plane_size *plane_size,
177995dedb7SSung Joon Kim enum dc_rotation_angle rotation,
178995dedb7SSung Joon Kim struct dc_plane_dcc_param *dcc,
179995dedb7SSung Joon Kim bool horizontal_mirror,
180995dedb7SSung Joon Kim unsigned int compat_level)
181995dedb7SSung Joon Kim {
182995dedb7SSung Joon Kim struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
183995dedb7SSung Joon Kim
184995dedb7SSung Joon Kim hubp3_dcc_control_sienna_cichlid(hubp, dcc);
185995dedb7SSung Joon Kim hubp3_program_tiling(hubp2, tiling_info, format);
186995dedb7SSung Joon Kim hubp2_program_size(hubp, format, plane_size, dcc);
187995dedb7SSung Joon Kim hubp2_program_rotation(hubp, rotation, horizontal_mirror);
188995dedb7SSung Joon Kim hubp35_program_pixel_format(hubp, format);
189995dedb7SSung Joon Kim }
190995dedb7SSung Joon Kim
191570867efSJinjie Ruan static struct hubp_funcs dcn35_hubp_funcs = {
19274c06a32SQingqing Zhuo .hubp_enable_tripleBuffer = hubp2_enable_triplebuffer,
19374c06a32SQingqing Zhuo .hubp_is_triplebuffer_enabled = hubp2_is_triplebuffer_enabled,
19474c06a32SQingqing Zhuo .hubp_program_surface_flip_and_addr = hubp3_program_surface_flip_and_addr,
195995dedb7SSung Joon Kim .hubp_program_surface_config = hubp35_program_surface_config,
19674c06a32SQingqing Zhuo .hubp_is_flip_pending = hubp2_is_flip_pending,
19774c06a32SQingqing Zhuo .hubp_setup = hubp3_setup,
19874c06a32SQingqing Zhuo .hubp_setup_interdependent = hubp2_setup_interdependent,
19974c06a32SQingqing Zhuo .hubp_set_vm_system_aperture_settings = hubp3_set_vm_system_aperture_settings,
20074c06a32SQingqing Zhuo .set_blank = hubp2_set_blank,
20174c06a32SQingqing Zhuo .dcc_control = hubp3_dcc_control,
20201130f52SAric Cyr .hubp_reset = hubp_reset,
20374c06a32SQingqing Zhuo .mem_program_viewport = min_set_viewport,
20474c06a32SQingqing Zhuo .set_cursor_attributes = hubp2_cursor_set_attributes,
20574c06a32SQingqing Zhuo .set_cursor_position = hubp2_cursor_set_position,
20674c06a32SQingqing Zhuo .hubp_clk_cntl = hubp2_clk_cntl,
20774c06a32SQingqing Zhuo .hubp_vtg_sel = hubp2_vtg_sel,
20874c06a32SQingqing Zhuo .dmdata_set_attributes = hubp3_dmdata_set_attributes,
20974c06a32SQingqing Zhuo .dmdata_load = hubp2_dmdata_load,
21074c06a32SQingqing Zhuo .dmdata_status_done = hubp2_dmdata_status_done,
21174c06a32SQingqing Zhuo .hubp_read_state = hubp3_read_state,
21274c06a32SQingqing Zhuo .hubp_clear_underflow = hubp2_clear_underflow,
21374c06a32SQingqing Zhuo .hubp_set_flip_control_surface_gsl = hubp2_set_flip_control_surface_gsl,
21474c06a32SQingqing Zhuo .hubp_init = hubp35_init,
21574c06a32SQingqing Zhuo .set_unbounded_requesting = hubp31_set_unbounded_requesting,
21674c06a32SQingqing Zhuo .hubp_soft_reset = hubp31_soft_reset,
21774c06a32SQingqing Zhuo .hubp_set_flip_int = hubp1_set_flip_int,
21874c06a32SQingqing Zhuo .hubp_in_blank = hubp1_in_blank,
21974c06a32SQingqing Zhuo .program_extended_blank = hubp31_program_extended_blank_value,
2201fa5c5a3SAlex Deucher .hubp_clear_tiling = hubp3_clear_tiling,
22174c06a32SQingqing Zhuo };
22274c06a32SQingqing Zhuo
hubp35_construct(struct dcn20_hubp * hubp2,struct dc_context * ctx,uint32_t inst,const struct dcn_hubp2_registers * hubp_regs,const struct dcn35_hubp2_shift * hubp_shift,const struct dcn35_hubp2_mask * hubp_mask)22374c06a32SQingqing Zhuo bool hubp35_construct(
22474c06a32SQingqing Zhuo struct dcn20_hubp *hubp2,
22574c06a32SQingqing Zhuo struct dc_context *ctx,
22674c06a32SQingqing Zhuo uint32_t inst,
22774c06a32SQingqing Zhuo const struct dcn_hubp2_registers *hubp_regs,
22874c06a32SQingqing Zhuo const struct dcn35_hubp2_shift *hubp_shift,
22974c06a32SQingqing Zhuo const struct dcn35_hubp2_mask *hubp_mask)
23074c06a32SQingqing Zhuo {
23174c06a32SQingqing Zhuo hubp2->base.funcs = &dcn35_hubp_funcs;
23274c06a32SQingqing Zhuo hubp2->base.ctx = ctx;
23374c06a32SQingqing Zhuo hubp2->hubp_regs = hubp_regs;
23474c06a32SQingqing Zhuo hubp2->hubp_shift = (const struct dcn_hubp2_shift *)hubp_shift;
23574c06a32SQingqing Zhuo hubp2->hubp_mask = (const struct dcn_hubp2_mask *)hubp_mask;
23674c06a32SQingqing Zhuo hubp2->base.inst = inst;
23774c06a32SQingqing Zhuo hubp2->base.opp_id = OPP_ID_INVALID;
23874c06a32SQingqing Zhuo hubp2->base.mpcc_id = 0xf;
23974c06a32SQingqing Zhuo
24074c06a32SQingqing Zhuo return true;
24174c06a32SQingqing Zhuo }
24274c06a32SQingqing Zhuo
24374c06a32SQingqing Zhuo
244