Commit 835a0d54 authored by Suraj Kandpal's avatar Suraj Kandpal
Browse files

drm/i915/bios: Add function to check if edp data override is needed



Add a function that helps identify if the rate provided needs to
be overridden. For this we need a function that compares the rate
provided and bitmask of rates provided in VBT.

--v2
-Rename functions [Jani]
-Return the mask instead of parsing it in function [Jani]
-Move the declaration in header [Jani]

--v3
-Change function name to depict what the function does [Ankit]

--v4
-Lets not use hweight [Ankit]

Signed-off-by: default avatarSuraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://lore.kernel.org/r/20250821042653.269227-3-suraj.kandpal@intel.com
parent 4d33c77c
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -2481,6 +2481,25 @@ static int parse_bdb_216_dp_max_link_rate(const int vbt_max_link_rate)
	}
}

static u32 edp_rate_override_mask(int rate)
{
	switch (rate) {
	case 2000000: return BDB_263_VBT_EDP_LINK_RATE_20;
	case 1350000: return BDB_263_VBT_EDP_LINK_RATE_13_5;
	case 1000000: return BDB_263_VBT_EDP_LINK_RATE_10;
	case 810000: return BDB_263_VBT_EDP_LINK_RATE_8_1;
	case 675000: return BDB_263_VBT_EDP_LINK_RATE_6_75;
	case 540000: return BDB_263_VBT_EDP_LINK_RATE_5_4;
	case 432000: return BDB_263_VBT_EDP_LINK_RATE_4_32;
	case 324000: return BDB_263_VBT_EDP_LINK_RATE_3_24;
	case 270000: return BDB_263_VBT_EDP_LINK_RATE_2_7;
	case 243000: return BDB_263_VBT_EDP_LINK_RATE_2_43;
	case 216000: return BDB_263_VBT_EDP_LINK_RATE_2_16;
	case 162000: return BDB_263_VBT_EDP_LINK_RATE_1_62;
	default: return 0;
	}
}

int intel_bios_dp_max_link_rate(const struct intel_bios_encoder_data *devdata)
{
	if (!devdata || devdata->display->vbt.version < 216)
@@ -2500,6 +2519,19 @@ int intel_bios_dp_max_lane_count(const struct intel_bios_encoder_data *devdata)
	return devdata->child.dp_max_lane_count + 1;
}

bool
intel_bios_encoder_reject_edp_rate(const struct intel_bios_encoder_data *devdata,
				   int rate)
{
	if (!devdata || devdata->display->vbt.version < 263)
		return false;

	if (devdata->child.edp_data_rate_override == BDB_263_VBT_EDP_RATES_MASK)
		return false;

	return devdata->child.edp_data_rate_override & edp_rate_override_mask(rate);
}

static void sanitize_device_type(struct intel_bios_encoder_data *devdata,
				 enum port port)
{
+2 −0
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata)
bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_hpd_invert(const struct intel_bios_encoder_data *devdata);
enum port intel_bios_encoder_port(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_reject_edp_rate(const struct intel_bios_encoder_data *devdata,
					int rate);
enum aux_ch intel_bios_dp_aux_ch(const struct intel_bios_encoder_data *devdata);
int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata);
int intel_bios_dp_max_lane_count(const struct intel_bios_encoder_data *devdata);