xref: /linux/drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
17966f319SQingqing Zhuo /* SPDX-License-Identifier: MIT */
27966f319SQingqing Zhuo /*
37966f319SQingqing Zhuo  * Copyright 2023 Advanced Micro Devices, Inc.
47966f319SQingqing Zhuo  *
57966f319SQingqing Zhuo  * Permission is hereby granted, free of charge, to any person obtaining a
67966f319SQingqing Zhuo  * copy of this software and associated documentation files (the "Software"),
77966f319SQingqing Zhuo  * to deal in the Software without restriction, including without limitation
87966f319SQingqing Zhuo  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
97966f319SQingqing Zhuo  * and/or sell copies of the Software, and to permit persons to whom the
107966f319SQingqing Zhuo  * Software is furnished to do so, subject to the following conditions:
117966f319SQingqing Zhuo  *
127966f319SQingqing Zhuo  * The above copyright notice and this permission notice shall be included in
137966f319SQingqing Zhuo  * all copies or substantial portions of the Software.
147966f319SQingqing Zhuo  *
157966f319SQingqing Zhuo  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167966f319SQingqing Zhuo  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177966f319SQingqing Zhuo  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187966f319SQingqing Zhuo  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
197966f319SQingqing Zhuo  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
207966f319SQingqing Zhuo  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
217966f319SQingqing Zhuo  * OTHER DEALINGS IN THE SOFTWARE.
227966f319SQingqing Zhuo  *
23d30a584cSStylon Wang  * Authors: AMD
24d30a584cSStylon Wang  *
257966f319SQingqing Zhuo  */
267966f319SQingqing Zhuo 
277966f319SQingqing Zhuo #include "dml2_policy.h"
287966f319SQingqing Zhuo 
get_optimal_ntuple(const struct soc_bounding_box_st * socbb,struct soc_state_bounding_box_st * entry)297966f319SQingqing Zhuo static void get_optimal_ntuple(
307966f319SQingqing Zhuo 	const struct soc_bounding_box_st *socbb,
317966f319SQingqing Zhuo 	struct soc_state_bounding_box_st *entry)
327966f319SQingqing Zhuo {
337966f319SQingqing Zhuo 	if (entry->dcfclk_mhz > 0) {
347966f319SQingqing Zhuo 		float bw_on_sdp = (float)(entry->dcfclk_mhz * socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_sdp_bw_after_urgent / 100));
357966f319SQingqing Zhuo 
367966f319SQingqing Zhuo 		entry->fabricclk_mhz = bw_on_sdp / (socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_fabric_bw_after_urgent / 100));
377966f319SQingqing Zhuo 		entry->dram_speed_mts = bw_on_sdp / (socbb->num_chans *
387966f319SQingqing Zhuo 			socbb->dram_channel_width_bytes * ((float)socbb->pct_ideal_dram_bw_after_urgent_pixel_only / 100));
397966f319SQingqing Zhuo 	} else if (entry->fabricclk_mhz > 0) {
407966f319SQingqing Zhuo 		float bw_on_fabric = (float)(entry->fabricclk_mhz * socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_fabric_bw_after_urgent / 100));
417966f319SQingqing Zhuo 
427966f319SQingqing Zhuo 		entry->dcfclk_mhz = bw_on_fabric / (socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_sdp_bw_after_urgent / 100));
437966f319SQingqing Zhuo 		entry->dram_speed_mts = bw_on_fabric / (socbb->num_chans *
447966f319SQingqing Zhuo 			socbb->dram_channel_width_bytes * ((float)socbb->pct_ideal_dram_bw_after_urgent_pixel_only / 100));
457966f319SQingqing Zhuo 	} else if (entry->dram_speed_mts > 0) {
467966f319SQingqing Zhuo 		float bw_on_dram = (float)(entry->dram_speed_mts * socbb->num_chans *
477966f319SQingqing Zhuo 			socbb->dram_channel_width_bytes * ((float)socbb->pct_ideal_dram_bw_after_urgent_pixel_only / 100));
487966f319SQingqing Zhuo 
497966f319SQingqing Zhuo 		entry->fabricclk_mhz = bw_on_dram / (socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_fabric_bw_after_urgent / 100));
507966f319SQingqing Zhuo 		entry->dcfclk_mhz = bw_on_dram / (socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_sdp_bw_after_urgent / 100));
517966f319SQingqing Zhuo 	}
527966f319SQingqing Zhuo }
537966f319SQingqing Zhuo 
calculate_net_bw_in_mbytes_sec(const struct soc_bounding_box_st * socbb,struct soc_state_bounding_box_st * entry)547966f319SQingqing Zhuo static float calculate_net_bw_in_mbytes_sec(const struct soc_bounding_box_st *socbb,
557966f319SQingqing Zhuo 	struct soc_state_bounding_box_st *entry)
567966f319SQingqing Zhuo {
577966f319SQingqing Zhuo 	float memory_bw_mbytes_sec = (float)(entry->dram_speed_mts *  socbb->num_chans *
587966f319SQingqing Zhuo 		socbb->dram_channel_width_bytes * ((float)socbb->pct_ideal_dram_bw_after_urgent_pixel_only / 100));
597966f319SQingqing Zhuo 
607966f319SQingqing Zhuo 	float fabric_bw_mbytes_sec = (float)(entry->fabricclk_mhz * socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_fabric_bw_after_urgent / 100));
617966f319SQingqing Zhuo 
627966f319SQingqing Zhuo 	float sdp_bw_mbytes_sec = (float)(entry->dcfclk_mhz * socbb->return_bus_width_bytes * ((float)socbb->pct_ideal_sdp_bw_after_urgent / 100));
637966f319SQingqing Zhuo 
647966f319SQingqing Zhuo 	float limiting_bw_mbytes_sec = memory_bw_mbytes_sec;
657966f319SQingqing Zhuo 
667966f319SQingqing Zhuo 	if (fabric_bw_mbytes_sec < limiting_bw_mbytes_sec)
677966f319SQingqing Zhuo 		limiting_bw_mbytes_sec = fabric_bw_mbytes_sec;
687966f319SQingqing Zhuo 
697966f319SQingqing Zhuo 	if (sdp_bw_mbytes_sec < limiting_bw_mbytes_sec)
707966f319SQingqing Zhuo 		limiting_bw_mbytes_sec = sdp_bw_mbytes_sec;
717966f319SQingqing Zhuo 
727966f319SQingqing Zhuo 	return limiting_bw_mbytes_sec;
737966f319SQingqing Zhuo }
747966f319SQingqing Zhuo 
insert_entry_into_table_sorted(const struct soc_bounding_box_st * socbb,struct soc_states_st * table,struct soc_state_bounding_box_st * entry)757966f319SQingqing Zhuo static void insert_entry_into_table_sorted(const struct soc_bounding_box_st *socbb,
767966f319SQingqing Zhuo 	struct soc_states_st *table,
777966f319SQingqing Zhuo 	struct soc_state_bounding_box_st *entry)
787966f319SQingqing Zhuo {
797966f319SQingqing Zhuo 	int index = 0;
807966f319SQingqing Zhuo 	int i = 0;
817966f319SQingqing Zhuo 	float net_bw_of_new_state = 0;
827966f319SQingqing Zhuo 
837966f319SQingqing Zhuo 	get_optimal_ntuple(socbb, entry);
847966f319SQingqing Zhuo 
857966f319SQingqing Zhuo 	if (table->num_states == 0) {
867966f319SQingqing Zhuo 		index = 0;
877966f319SQingqing Zhuo 	} else {
887966f319SQingqing Zhuo 		net_bw_of_new_state = calculate_net_bw_in_mbytes_sec(socbb, entry);
897966f319SQingqing Zhuo 		while (net_bw_of_new_state > calculate_net_bw_in_mbytes_sec(socbb, &table->state_array[index])) {
907966f319SQingqing Zhuo 			index++;
917966f319SQingqing Zhuo 			if (index >= (int) table->num_states)
927966f319SQingqing Zhuo 				break;
937966f319SQingqing Zhuo 		}
947966f319SQingqing Zhuo 
957966f319SQingqing Zhuo 		for (i = table->num_states; i > index; i--) {
967966f319SQingqing Zhuo 			table->state_array[i] = table->state_array[i - 1];
977966f319SQingqing Zhuo 		}
987966f319SQingqing Zhuo 		//ASSERT(index < MAX_CLK_TABLE_SIZE);
997966f319SQingqing Zhuo 	}
1007966f319SQingqing Zhuo 
1017966f319SQingqing Zhuo 	table->state_array[index] = *entry;
1027966f319SQingqing Zhuo 	table->state_array[index].dcfclk_mhz = (int)entry->dcfclk_mhz;
1037966f319SQingqing Zhuo 	table->state_array[index].fabricclk_mhz = (int)entry->fabricclk_mhz;
1047966f319SQingqing Zhuo 	table->state_array[index].dram_speed_mts = (int)entry->dram_speed_mts;
1057966f319SQingqing Zhuo 	table->num_states++;
1067966f319SQingqing Zhuo }
1077966f319SQingqing Zhuo 
remove_entry_from_table_at_index(struct soc_states_st * table,unsigned int index)1087966f319SQingqing Zhuo static void remove_entry_from_table_at_index(struct soc_states_st *table,
1097966f319SQingqing Zhuo 	unsigned int index)
1107966f319SQingqing Zhuo {
1117966f319SQingqing Zhuo 	int i;
1127966f319SQingqing Zhuo 
1137966f319SQingqing Zhuo 	if (table->num_states == 0)
1147966f319SQingqing Zhuo 		return;
1157966f319SQingqing Zhuo 
1167966f319SQingqing Zhuo 	for (i = index; i < (int) table->num_states - 1; i++) {
1177966f319SQingqing Zhuo 		table->state_array[i] = table->state_array[i + 1];
1187966f319SQingqing Zhuo 	}
1197966f319SQingqing Zhuo 	memset(&table->state_array[--table->num_states], 0, sizeof(struct soc_state_bounding_box_st));
1207966f319SQingqing Zhuo }
1217966f319SQingqing Zhuo 
dml2_policy_build_synthetic_soc_states(struct dml2_policy_build_synthetic_soc_states_scratch * s,struct dml2_policy_build_synthetic_soc_states_params * p)1227966f319SQingqing Zhuo int dml2_policy_build_synthetic_soc_states(struct dml2_policy_build_synthetic_soc_states_scratch *s,
1237966f319SQingqing Zhuo 	struct dml2_policy_build_synthetic_soc_states_params *p)
1247966f319SQingqing Zhuo {
1257966f319SQingqing Zhuo 	int i, j;
1267966f319SQingqing Zhuo 	unsigned int min_fclk_mhz = p->in_states->state_array[0].fabricclk_mhz;
1277966f319SQingqing Zhuo 	unsigned int min_dcfclk_mhz = p->in_states->state_array[0].dcfclk_mhz;
1287966f319SQingqing Zhuo 	unsigned int min_socclk_mhz = p->in_states->state_array[0].socclk_mhz;
1297966f319SQingqing Zhuo 
1307966f319SQingqing Zhuo 	int max_dcfclk_mhz = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0,
1317966f319SQingqing Zhuo 		max_phyclk_mhz = 0, max_dtbclk_mhz = 0, max_fclk_mhz = 0,
1327966f319SQingqing Zhuo 		max_uclk_mhz = 0, max_socclk_mhz = 0;
1337966f319SQingqing Zhuo 
1347966f319SQingqing Zhuo 	int num_uclk_dpms = 0, num_fclk_dpms = 0;
1357966f319SQingqing Zhuo 
1367966f319SQingqing Zhuo 	for (i = 0; i < __DML_MAX_STATE_ARRAY_SIZE__; i++) {
1377966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dcfclk_mhz > max_dcfclk_mhz)
1387966f319SQingqing Zhuo 			max_dcfclk_mhz = (int) p->in_states->state_array[i].dcfclk_mhz;
1397966f319SQingqing Zhuo 		if (p->in_states->state_array[i].fabricclk_mhz > max_fclk_mhz)
1407966f319SQingqing Zhuo 			max_fclk_mhz = (int) p->in_states->state_array[i].fabricclk_mhz;
1417966f319SQingqing Zhuo 		if (p->in_states->state_array[i].socclk_mhz > max_socclk_mhz)
1427966f319SQingqing Zhuo 			max_socclk_mhz = (int) p->in_states->state_array[i].socclk_mhz;
1437966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dram_speed_mts > max_uclk_mhz)
1447966f319SQingqing Zhuo 			max_uclk_mhz = (int) p->in_states->state_array[i].dram_speed_mts;
1457966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dispclk_mhz > max_dispclk_mhz)
1467966f319SQingqing Zhuo 			max_dispclk_mhz = (int) p->in_states->state_array[i].dispclk_mhz;
1477966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dppclk_mhz > max_dppclk_mhz)
1487966f319SQingqing Zhuo 			max_dppclk_mhz = (int) p->in_states->state_array[i].dppclk_mhz;
1497966f319SQingqing Zhuo 		if (p->in_states->state_array[i].phyclk_mhz > max_phyclk_mhz)
1507966f319SQingqing Zhuo 			max_phyclk_mhz = (int)p->in_states->state_array[i].phyclk_mhz;
1517966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dtbclk_mhz > max_dtbclk_mhz)
1527966f319SQingqing Zhuo 			max_dtbclk_mhz = (int)p->in_states->state_array[i].dtbclk_mhz;
1537966f319SQingqing Zhuo 
1547966f319SQingqing Zhuo 		if (p->in_states->state_array[i].fabricclk_mhz > 0)
1557966f319SQingqing Zhuo 			num_fclk_dpms++;
1567966f319SQingqing Zhuo 		if (p->in_states->state_array[i].dram_speed_mts > 0)
1577966f319SQingqing Zhuo 			num_uclk_dpms++;
1587966f319SQingqing Zhuo 	}
1597966f319SQingqing Zhuo 
1607966f319SQingqing Zhuo 	if (!max_dcfclk_mhz || !max_dispclk_mhz || !max_dppclk_mhz || !max_phyclk_mhz || !max_dtbclk_mhz)
1617966f319SQingqing Zhuo 		return -1;
1627966f319SQingqing Zhuo 
1637966f319SQingqing Zhuo 	p->out_states->num_states = 0;
1647966f319SQingqing Zhuo 
1657966f319SQingqing Zhuo 	s->entry = p->in_states->state_array[0];
1667966f319SQingqing Zhuo 
1677966f319SQingqing Zhuo 	s->entry.dispclk_mhz = max_dispclk_mhz;
1687966f319SQingqing Zhuo 	s->entry.dppclk_mhz = max_dppclk_mhz;
1697966f319SQingqing Zhuo 	s->entry.dtbclk_mhz = max_dtbclk_mhz;
1707966f319SQingqing Zhuo 	s->entry.phyclk_mhz = max_phyclk_mhz;
1717966f319SQingqing Zhuo 
1727966f319SQingqing Zhuo 	s->entry.dscclk_mhz = max_dispclk_mhz / 3;
1737966f319SQingqing Zhuo 	s->entry.phyclk_mhz = max_phyclk_mhz;
1747966f319SQingqing Zhuo 	s->entry.dtbclk_mhz = max_dtbclk_mhz;
1757966f319SQingqing Zhuo 
1767966f319SQingqing Zhuo 	// Insert all the DCFCLK STAs first
1777966f319SQingqing Zhuo 	for (i = 0; i < p->num_dcfclk_stas; i++) {
1787966f319SQingqing Zhuo 		s->entry.dcfclk_mhz = p->dcfclk_stas_mhz[i];
1797966f319SQingqing Zhuo 		s->entry.fabricclk_mhz = 0;
1807966f319SQingqing Zhuo 		s->entry.dram_speed_mts = 0;
1817966f319SQingqing Zhuo 		if (i > 0)
1827966f319SQingqing Zhuo 			s->entry.socclk_mhz = max_socclk_mhz;
1837966f319SQingqing Zhuo 
1847966f319SQingqing Zhuo 		insert_entry_into_table_sorted(p->in_bbox, p->out_states, &s->entry);
1857966f319SQingqing Zhuo 	}
1867966f319SQingqing Zhuo 
1877966f319SQingqing Zhuo 	// Insert the UCLK DPMS
1887966f319SQingqing Zhuo 	for (i = 0; i < num_uclk_dpms; i++) {
1897966f319SQingqing Zhuo 		s->entry.dcfclk_mhz = 0;
1907966f319SQingqing Zhuo 		s->entry.fabricclk_mhz = 0;
1917966f319SQingqing Zhuo 		s->entry.dram_speed_mts = p->in_states->state_array[i].dram_speed_mts;
1927966f319SQingqing Zhuo 		if (i == 0) {
1937966f319SQingqing Zhuo 			s->entry.socclk_mhz = min_socclk_mhz;
1947966f319SQingqing Zhuo 		} else {
1957966f319SQingqing Zhuo 			s->entry.socclk_mhz = max_socclk_mhz;
1967966f319SQingqing Zhuo 		}
1977966f319SQingqing Zhuo 
1987966f319SQingqing Zhuo 		insert_entry_into_table_sorted(p->in_bbox, p->out_states, &s->entry);
1997966f319SQingqing Zhuo 	}
2007966f319SQingqing Zhuo 
2017966f319SQingqing Zhuo 	// Insert FCLK DPMs (if present)
2027966f319SQingqing Zhuo 	if (num_fclk_dpms > 2) {
2037966f319SQingqing Zhuo 		for (i = 0; i < num_fclk_dpms; i++) {
2047966f319SQingqing Zhuo 			s->entry.dcfclk_mhz = 0;
2057966f319SQingqing Zhuo 			s->entry.fabricclk_mhz = p->in_states->state_array[i].fabricclk_mhz;
2067966f319SQingqing Zhuo 			s->entry.dram_speed_mts = 0;
2077966f319SQingqing Zhuo 
2087966f319SQingqing Zhuo 		insert_entry_into_table_sorted(p->in_bbox, p->out_states, &s->entry);
2097966f319SQingqing Zhuo 		}
2107966f319SQingqing Zhuo 	}
2117966f319SQingqing Zhuo 	// Add max FCLK
2127966f319SQingqing Zhuo 	else {
2137966f319SQingqing Zhuo 		s->entry.dcfclk_mhz = 0;
2147966f319SQingqing Zhuo 		s->entry.fabricclk_mhz = p->in_states->state_array[num_fclk_dpms - 1].fabricclk_mhz;
2157966f319SQingqing Zhuo 		s->entry.dram_speed_mts = 0;
2167966f319SQingqing Zhuo 
2177966f319SQingqing Zhuo 		insert_entry_into_table_sorted(p->in_bbox, p->out_states, &s->entry);
2187966f319SQingqing Zhuo 	}
2197966f319SQingqing Zhuo 
2207966f319SQingqing Zhuo 	// Remove states that require higher clocks than are supported
2217966f319SQingqing Zhuo 	for (i = p->out_states->num_states - 1; i >= 0; i--) {
2227966f319SQingqing Zhuo 		if (p->out_states->state_array[i].dcfclk_mhz > max_dcfclk_mhz ||
2237966f319SQingqing Zhuo 			p->out_states->state_array[i].fabricclk_mhz > max_fclk_mhz ||
2247966f319SQingqing Zhuo 			p->out_states->state_array[i].dram_speed_mts > max_uclk_mhz)
2257966f319SQingqing Zhuo 			remove_entry_from_table_at_index(p->out_states, i);
2267966f319SQingqing Zhuo 	}
2277966f319SQingqing Zhuo 
2287966f319SQingqing Zhuo 	// At this point, the table contains all "points of interest" based on
2297966f319SQingqing Zhuo 	// DPMs from PMFW, and STAs. Table is sorted by BW, and all clock
2307966f319SQingqing Zhuo 	// ratios (by derate, are exact).
2317966f319SQingqing Zhuo 
2327966f319SQingqing Zhuo 	// Round up UCLK to DPMs
2337966f319SQingqing Zhuo 	for (i = p->out_states->num_states - 1; i >= 0; i--) {
2347966f319SQingqing Zhuo 		for (j = 0; j < num_uclk_dpms; j++) {
2357966f319SQingqing Zhuo 			if (p->in_states->state_array[j].dram_speed_mts >= p->out_states->state_array[i].dram_speed_mts) {
2367966f319SQingqing Zhuo 				p->out_states->state_array[i].dram_speed_mts = p->in_states->state_array[j].dram_speed_mts;
2377966f319SQingqing Zhuo 				break;
2387966f319SQingqing Zhuo 			}
2397966f319SQingqing Zhuo 		}
2407966f319SQingqing Zhuo 	}
2417966f319SQingqing Zhuo 
2427966f319SQingqing Zhuo 	// If FCLK is coarse grained, round up to next DPMs
2437966f319SQingqing Zhuo 	if (num_fclk_dpms > 2) {
2447966f319SQingqing Zhuo 		for (i = p->out_states->num_states - 1; i >= 0; i--) {
2457966f319SQingqing Zhuo 			for (j = 0; j < num_fclk_dpms; j++) {
2467966f319SQingqing Zhuo 				if (p->in_states->state_array[j].fabricclk_mhz >= p->out_states->state_array[i].fabricclk_mhz) {
2477966f319SQingqing Zhuo 					p->out_states->state_array[i].fabricclk_mhz = p->in_states->state_array[j].fabricclk_mhz;
2487966f319SQingqing Zhuo 					break;
2497966f319SQingqing Zhuo 				}
2507966f319SQingqing Zhuo 			}
2517966f319SQingqing Zhuo 		}
2527966f319SQingqing Zhuo 	}
2537966f319SQingqing Zhuo 
2547966f319SQingqing Zhuo 	// Clamp to min FCLK/DCFCLK
2557966f319SQingqing Zhuo 	for (i = p->out_states->num_states - 1; i >= 0; i--) {
2567966f319SQingqing Zhuo 		if (p->out_states->state_array[i].fabricclk_mhz < min_fclk_mhz) {
2577966f319SQingqing Zhuo 			p->out_states->state_array[i].fabricclk_mhz = min_fclk_mhz;
2587966f319SQingqing Zhuo 		}
2597966f319SQingqing Zhuo 		if (p->out_states->state_array[i].dcfclk_mhz < min_dcfclk_mhz) {
2607966f319SQingqing Zhuo 			p->out_states->state_array[i].dcfclk_mhz = min_dcfclk_mhz;
2617966f319SQingqing Zhuo 		}
2627966f319SQingqing Zhuo 	}
2637966f319SQingqing Zhuo 
2647966f319SQingqing Zhuo 	// Remove duplicate states, note duplicate states are always neighbouring since table is sorted.
2657966f319SQingqing Zhuo 	i = 0;
2667966f319SQingqing Zhuo 	while (i < (int) p->out_states->num_states - 1) {
2677966f319SQingqing Zhuo 		if (p->out_states->state_array[i].dcfclk_mhz == p->out_states->state_array[i + 1].dcfclk_mhz &&
2687966f319SQingqing Zhuo 			p->out_states->state_array[i].fabricclk_mhz == p->out_states->state_array[i + 1].fabricclk_mhz &&
2697966f319SQingqing Zhuo 			p->out_states->state_array[i].dram_speed_mts == p->out_states->state_array[i + 1].dram_speed_mts)
2707966f319SQingqing Zhuo 			remove_entry_from_table_at_index(p->out_states, i);
2717966f319SQingqing Zhuo 	else
2727966f319SQingqing Zhuo 		i++;
2737966f319SQingqing Zhuo 	}
2747966f319SQingqing Zhuo 
2757966f319SQingqing Zhuo 	return 0;
2767966f319SQingqing Zhuo }
2777966f319SQingqing Zhuo 
build_unoptimized_policy_settings(enum dml_project_id project,struct dml_mode_eval_policy_st * policy)2787966f319SQingqing Zhuo void build_unoptimized_policy_settings(enum dml_project_id project, struct dml_mode_eval_policy_st *policy)
2797966f319SQingqing Zhuo {
2807966f319SQingqing Zhuo 	for (int i = 0; i < __DML_NUM_PLANES__; i++) {
2817966f319SQingqing Zhuo 		policy->MPCCombineUse[i] = dml_mpc_as_needed_for_voltage; // TOREVIEW: Is this still needed?  When is MPCC useful for pstate given CRB?
2827966f319SQingqing Zhuo 		policy->ODMUse[i] = dml_odm_use_policy_combine_as_needed;
2837966f319SQingqing Zhuo 		policy->ImmediateFlipRequirement[i] = dml_immediate_flip_required;
2847966f319SQingqing Zhuo 		policy->AllowForPStateChangeOrStutterInVBlank[i] = dml_prefetch_support_uclk_fclk_and_stutter_if_possible;
2857966f319SQingqing Zhuo 	}
2867966f319SQingqing Zhuo 
2877966f319SQingqing Zhuo 	/* Change the default policy initializations as per spreadsheet. We might need to
2887966f319SQingqing Zhuo 	 * review and change them later on as per Jun's earlier comments.
2897966f319SQingqing Zhuo 	 */
2907966f319SQingqing Zhuo 	policy->UseUnboundedRequesting = dml_unbounded_requesting_enable;
2917966f319SQingqing Zhuo 	policy->UseMinimumRequiredDCFCLK = false;
2927966f319SQingqing Zhuo 	policy->DRAMClockChangeRequirementFinal = true; // TOREVIEW: What does this mean?
2937966f319SQingqing Zhuo 	policy->FCLKChangeRequirementFinal = true; // TOREVIEW: What does this mean?
2947966f319SQingqing Zhuo 	policy->USRRetrainingRequiredFinal = true;
2957966f319SQingqing Zhuo 	policy->EnhancedPrefetchScheduleAccelerationFinal = true; // TOREVIEW: What does this mean?
2967966f319SQingqing Zhuo 	policy->NomDETInKByteOverrideEnable = false;
2977966f319SQingqing Zhuo 	policy->NomDETInKByteOverrideValue = 0;
2987966f319SQingqing Zhuo 	policy->DCCProgrammingAssumesScanDirectionUnknownFinal = true;
2997966f319SQingqing Zhuo 	policy->SynchronizeTimingsFinal = true;
3007966f319SQingqing Zhuo 	policy->SynchronizeDRRDisplaysForUCLKPStateChangeFinal = true;
3017966f319SQingqing Zhuo 	policy->AssumeModeSupportAtMaxPwrStateEvenDRAMClockChangeNotSupported = true; // TOREVIEW: What does this mean?
3027966f319SQingqing Zhuo 	policy->AssumeModeSupportAtMaxPwrStateEvenFClockChangeNotSupported = true; // TOREVIEW: What does this mean?
303115009d1SQingqing Zhuo 	if (project == dml_project_dcn35 ||
304*8cb06693SWayne Lin 		project == dml_project_dcn36 ||
305115009d1SQingqing Zhuo 		project == dml_project_dcn351) {
306115009d1SQingqing Zhuo 		policy->DCCProgrammingAssumesScanDirectionUnknownFinal = false;
3071b6063a5SOvidiu Bunea 		policy->EnhancedPrefetchScheduleAccelerationFinal = 0;
308115009d1SQingqing Zhuo 		policy->AllowForPStateChangeOrStutterInVBlankFinal = dml_prefetch_support_uclk_fclk_and_stutter_if_possible; /*new*/
309115009d1SQingqing Zhuo 		policy->UseOnlyMaxPrefetchModes = 1;
310115009d1SQingqing Zhuo 	}
3117966f319SQingqing Zhuo }
312