File Index
Files and directories
Sign in
FILE

clk_mgr.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c C
  1/*
  2 * Copyright 2012-16 Advanced Micro Devices, Inc.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 20 * OTHER DEALINGS IN THE SOFTWARE.
 21 *
 22 * Authors: AMD
 23 *
 24 */
 25
 26#include "dal_asic_id.h"
 27#include "dc_types.h"
 28#include "dccg.h"
 29#include "clk_mgr_internal.h"
 30#include "dc_state_priv.h"
 31#include "link_service.h"
 32
 33#include "dce100/dce_clk_mgr.h"
 34#include "dce110/dce110_clk_mgr.h"
 35#include "dce112/dce112_clk_mgr.h"
 36#include "dce120/dce120_clk_mgr.h"
 37#include "dce60/dce60_clk_mgr.h"
 38#include "dcn10/rv1_clk_mgr.h"
 39#include "dcn10/rv2_clk_mgr.h"
 40#include "dcn20/dcn20_clk_mgr.h"
 41#include "dcn21/rn_clk_mgr.h"
 42#include "dcn201/dcn201_clk_mgr.h"
 43#include "dcn30/dcn30_clk_mgr.h"
 44#include "dcn301/vg_clk_mgr.h"
 45#include "dcn31/dcn31_clk_mgr.h"
 46#include "dcn314/dcn314_clk_mgr.h"
 47#include "dcn315/dcn315_clk_mgr.h"
 48#include "dcn316/dcn316_clk_mgr.h"
 49#include "dcn32/dcn32_clk_mgr.h"
 50#include "dcn35/dcn35_clk_mgr.h"
 51#include "dcn401/dcn401_clk_mgr.h"
 52
 53int clk_mgr_helper_get_active_display_cnt(
 54		struct dc *dc,
 55		struct dc_state *context)
 56{
 57	int i, display_count;
 58
 59	display_count = 0;
 60	for (i = 0; i < context->stream_count; i++) {
 61		const struct dc_stream_state *stream = context->streams[i];
 62		const struct dc_stream_status *stream_status = &context->stream_status[i];
 63
 64		/* Don't count SubVP phantom pipes as part of active
 65		 * display count
 66		 */
 67		if (dc_state_get_stream_subvp_type(context, stream) == SUBVP_PHANTOM)
 68			continue;
 69
 70		if (!stream->dpms_off || dc->is_switch_in_progress_dest || (stream_status && stream_status->plane_count))
 71			display_count++;
 72	}
 73
 74	return display_count;
 75}
 76
 77int clk_mgr_helper_get_active_plane_cnt(
 78		struct dc *dc,
 79		struct dc_state *context)
 80{
 81	int i, total_plane_count;
 82
 83	total_plane_count = 0;
 84	for (i = 0; i < context->stream_count; i++) {
 85		const struct dc_stream_status stream_status = context->stream_status[i];
 86
 87		/*
 88		 * Sum up plane_count for all streams ( active and virtual ).
 89		 */
 90		total_plane_count += stream_status.plane_count;
 91	}
 92
 93	return total_plane_count;
 94}
 95
 96void clk_mgr_exit_optimized_pwr_state(const struct dc *dc, struct clk_mgr *clk_mgr)
 97{
 98	struct dc_link *edp_links[MAX_NUM_EDP];
 99	struct dc_link *edp_link = NULL;
100	int edp_num;
101	unsigned int panel_inst;
102
103	dc_get_edp_links(dc, edp_links, &edp_num);
104	if (dc->hwss.exit_optimized_pwr_state)
105		dc->hwss.exit_optimized_pwr_state(dc, dc->current_state);
106
107	if (edp_num) {
108		for (panel_inst = 0; panel_inst < edp_num; panel_inst++) {
109			bool allow_active = false;
110
111			edp_link = edp_links[panel_inst];
112			if (!edp_link->psr_settings.psr_feature_enabled)
113				continue;
114			clk_mgr->psr_allow_active_cache = edp_link->psr_settings.psr_allow_active;
115			dc->link_srv->edp_set_psr_allow_active(edp_link, &allow_active, false, false, NULL);
116			dc->link_srv->edp_set_replay_allow_active(edp_link, &allow_active, false, false, NULL);
117		}
118	}
119
120}
121
122void clk_mgr_optimize_pwr_state(const struct dc *dc, struct clk_mgr *clk_mgr)
123{
124	struct dc_link *edp_links[MAX_NUM_EDP];
125	struct dc_link *edp_link = NULL;
126	int edp_num;
127	unsigned int panel_inst;
128
129	dc_get_edp_links(dc, edp_links, &edp_num);
130	if (edp_num) {
131		for (panel_inst = 0; panel_inst < edp_num; panel_inst++) {
132			edp_link = edp_links[panel_inst];
133			if (!edp_link->psr_settings.psr_feature_enabled)
134				continue;
135			dc->link_srv->edp_set_psr_allow_active(edp_link,
136					&clk_mgr->psr_allow_active_cache, false, false, NULL);
137			dc->link_srv->edp_set_replay_allow_active(edp_link,
138					&clk_mgr->psr_allow_active_cache, false, false, NULL);
139		}
140	}
141
142	if (dc->hwss.optimize_pwr_state)
143		dc->hwss.optimize_pwr_state(dc, dc->current_state);
144
145}
146
147struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pp_smu, struct dccg *dccg)
148{
149	struct hw_asic_id asic_id = ctx->asic_id;
150
151	switch (asic_id.chip_family) {
152#if defined(CONFIG_DRM_AMD_DC_SI)
153	case FAMILY_SI: {
154		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
155
156		if (clk_mgr == NULL) {
157			BREAK_TO_DEBUGGER();
158			return NULL;
159		}
160		dce60_clk_mgr_construct(ctx, clk_mgr);
161		return &clk_mgr->base;
162	}
163#endif
164	case FAMILY_CI:
165	case FAMILY_KV: {
166		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
167
168		if (clk_mgr == NULL) {
169			BREAK_TO_DEBUGGER();
170			return NULL;
171		}
172		dce_clk_mgr_construct(ctx, clk_mgr);
173		return &clk_mgr->base;
174	}
175	case FAMILY_CZ: {
176		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
177
178		if (clk_mgr == NULL) {
179			BREAK_TO_DEBUGGER();
180			return NULL;
181		}
182		dce110_clk_mgr_construct(ctx, clk_mgr);
183		return &clk_mgr->base;
184	}
185	case FAMILY_VI: {
186		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
187
188		if (clk_mgr == NULL) {
189			BREAK_TO_DEBUGGER();
190			return NULL;
191		}
192		if (ASIC_REV_IS_TONGA_P(asic_id.hw_internal_rev) ||
193				ASIC_REV_IS_FIJI_P(asic_id.hw_internal_rev)) {
194			dce_clk_mgr_construct(ctx, clk_mgr);
195			return &clk_mgr->base;
196		}
197		if (ASIC_REV_IS_POLARIS10_P(asic_id.hw_internal_rev) ||
198				ASIC_REV_IS_POLARIS11_M(asic_id.hw_internal_rev) ||
199				ASIC_REV_IS_POLARIS12_V(asic_id.hw_internal_rev)) {
200			dce112_clk_mgr_construct(ctx, clk_mgr);
201			return &clk_mgr->base;
202		}
203		if (ASIC_REV_IS_VEGAM(asic_id.hw_internal_rev)) {
204			dce112_clk_mgr_construct(ctx, clk_mgr);
205			return &clk_mgr->base;
206		}
207		return &clk_mgr->base;
208	}
209	case FAMILY_AI: {
210		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
211
212		if (clk_mgr == NULL) {
213			BREAK_TO_DEBUGGER();
214			return NULL;
215		}
216		if (ASICREV_IS_VEGA20_P(asic_id.hw_internal_rev))
217			dce121_clk_mgr_construct(ctx, clk_mgr);
218		else
219			dce120_clk_mgr_construct(ctx, clk_mgr);
220		return &clk_mgr->base;
221	}
222#if defined(CONFIG_DRM_AMD_DC_FP)
223	case FAMILY_RV: {
224		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
225
226		if (clk_mgr == NULL) {
227			BREAK_TO_DEBUGGER();
228			return NULL;
229		}
230
231		if (ASICREV_IS_RENOIR(asic_id.hw_internal_rev)) {
232			rn_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
233			return &clk_mgr->base;
234		}
235
236		if (ASICREV_IS_GREEN_SARDINE(asic_id.hw_internal_rev)) {
237			rn_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
238			return &clk_mgr->base;
239		}
240		if (ASICREV_IS_RAVEN2(asic_id.hw_internal_rev)) {
241			rv2_clk_mgr_construct(ctx, clk_mgr, pp_smu);
242			return &clk_mgr->base;
243		}
244		if (ASICREV_IS_RAVEN(asic_id.hw_internal_rev) ||
245				ASICREV_IS_PICASSO(asic_id.hw_internal_rev)) {
246			rv1_clk_mgr_construct(ctx, clk_mgr, pp_smu);
247			return &clk_mgr->base;
248		}
249		return &clk_mgr->base;
250	}
251	case FAMILY_NV: {
252		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
253
254		if (clk_mgr == NULL) {
255			BREAK_TO_DEBUGGER();
256			return NULL;
257		}
258		if (ctx->dce_version == DCN_VERSION_2_01) {
259			dcn201_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
260			return &clk_mgr->base;
261		}
262		if (ASICREV_IS_SIENNA_CICHLID_P(asic_id.hw_internal_rev)) {
263			dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
264			return &clk_mgr->base;
265		}
266		if (ASICREV_IS_DIMGREY_CAVEFISH_P(asic_id.hw_internal_rev)) {
267			dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
268			return &clk_mgr->base;
269		}
270		if (ASICREV_IS_BEIGE_GOBY_P(asic_id.hw_internal_rev)) {
271			dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
272			return &clk_mgr->base;
273		}
274		dcn20_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
275		return &clk_mgr->base;
276	}
277	case FAMILY_VGH:
278		if (ASICREV_IS_VANGOGH(asic_id.hw_internal_rev)) {
279			struct clk_mgr_vgh *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
280
281			if (clk_mgr == NULL) {
282				BREAK_TO_DEBUGGER();
283				return NULL;
284			}
285			vg_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
286			return &clk_mgr->base.base;
287		}
288		break;
289
290	case FAMILY_YELLOW_CARP: {
291		struct clk_mgr_dcn31 *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
292
293		if (clk_mgr == NULL) {
294			BREAK_TO_DEBUGGER();
295			return NULL;
296		}
297
298		dcn31_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
299		return &clk_mgr->base.base;
300	}
301		break;
302	case AMDGPU_FAMILY_GC_10_3_6: {
303		struct clk_mgr_dcn315 *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
304
305		if (clk_mgr == NULL) {
306			BREAK_TO_DEBUGGER();
307			return NULL;
308		}
309
310		dcn315_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
311		return &clk_mgr->base.base;
312	}
313		break;
314	case AMDGPU_FAMILY_GC_10_3_7: {
315		struct clk_mgr_dcn316 *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
316
317		if (clk_mgr == NULL) {
318			BREAK_TO_DEBUGGER();
319			return NULL;
320		}
321
322		dcn316_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
323		return &clk_mgr->base.base;
324	}
325		break;
326	case AMDGPU_FAMILY_GC_11_0_0: {
327		struct clk_mgr_internal *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
328
329		if (clk_mgr == NULL) {
330			BREAK_TO_DEBUGGER();
331			return NULL;
332		}
333		dcn32_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
334		return &clk_mgr->base;
335	}
336
337	case AMDGPU_FAMILY_GC_11_0_1: {
338		struct clk_mgr_dcn314 *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
339
340		if (clk_mgr == NULL) {
341			BREAK_TO_DEBUGGER();
342			return NULL;
343		}
344
345		dcn314_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
346		return &clk_mgr->base.base;
347	}
348	break;
349
350	case AMDGPU_FAMILY_GC_11_5_0: {
351		struct clk_mgr_dcn35 *clk_mgr = kzalloc(sizeof(*clk_mgr), GFP_KERNEL);
352
353		if (clk_mgr == NULL) {
354			BREAK_TO_DEBUGGER();
355			return NULL;
356		}
357		if (ctx->dce_version == DCN_VERSION_3_51)
358			dcn351_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
359		else
360			dcn35_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
361
362		return &clk_mgr->base.base;
363	}
364	break;
365
366	case AMDGPU_FAMILY_GC_12_0_0: {
367		struct clk_mgr_internal *clk_mgr = dcn401_clk_mgr_construct(ctx, dccg);
368
369		if (clk_mgr == NULL) {
370			BREAK_TO_DEBUGGER();
371			return NULL;
372		}
373
374		return &clk_mgr->base;
375	}
376	break;
377#endif	/* CONFIG_DRM_AMD_DC_FP */
378	default:
379		ASSERT(0); /* Unknown Asic */
380		break;
381	}
382
383	return NULL;
384}
385
386void dc_destroy_clk_mgr(struct clk_mgr *clk_mgr_base)
387{
388	struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
389
390#ifdef CONFIG_DRM_AMD_DC_FP
391	switch (clk_mgr_base->ctx->asic_id.chip_family) {
392	case FAMILY_NV:
393		if (ASICREV_IS_SIENNA_CICHLID_P(clk_mgr_base->ctx->asic_id.hw_internal_rev)) {
394			dcn3_clk_mgr_destroy(clk_mgr);
395		} else if (ASICREV_IS_DIMGREY_CAVEFISH_P(clk_mgr_base->ctx->asic_id.hw_internal_rev)) {
396			dcn3_clk_mgr_destroy(clk_mgr);
397		}
398		if (ASICREV_IS_BEIGE_GOBY_P(clk_mgr_base->ctx->asic_id.hw_internal_rev)) {
399			dcn3_clk_mgr_destroy(clk_mgr);
400		}
401		break;
402
403	case FAMILY_VGH:
404		if (ASICREV_IS_VANGOGH(clk_mgr_base->ctx->asic_id.hw_internal_rev))
405			vg_clk_mgr_destroy(clk_mgr);
406		break;
407
408	case FAMILY_YELLOW_CARP:
409		dcn31_clk_mgr_destroy(clk_mgr);
410		break;
411
412	case AMDGPU_FAMILY_GC_10_3_6:
413		dcn315_clk_mgr_destroy(clk_mgr);
414		break;
415
416	case AMDGPU_FAMILY_GC_10_3_7:
417		dcn316_clk_mgr_destroy(clk_mgr);
418		break;
419
420	case AMDGPU_FAMILY_GC_11_0_0:
421		dcn32_clk_mgr_destroy(clk_mgr);
422		break;
423
424	case AMDGPU_FAMILY_GC_11_0_1:
425		dcn314_clk_mgr_destroy(clk_mgr);
426		break;
427
428	case AMDGPU_FAMILY_GC_11_5_0:
429		dcn35_clk_mgr_destroy(clk_mgr);
430		break;
431	case AMDGPU_FAMILY_GC_12_0_0:
432		dcn401_clk_mgr_destroy(clk_mgr);
433		break;
434
435	default:
436		break;
437	}
438#endif /* CONFIG_DRM_AMD_DC_FP */
439
440	kfree(clk_mgr);
441}
442
~/ Read-only file preview.