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: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://lore.kernel.org/r/20250821042653.269227-3-suraj.kandpal@intel.com
This commit is contained in:
Suraj Kandpal
2025-08-21 09:56:52 +05:30
parent 4d33c77cf2
commit 835a0d544d
2 changed files with 34 additions and 0 deletions

View File

@@ -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)
{

View File

@@ -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);