Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+34
+32
drivers/gpu/drm/i915/display/intel_bios.c
··· 2481 2481 } 2482 2482 } 2483 2483 2484 + static u32 edp_rate_override_mask(int rate) 2485 + { 2486 + switch (rate) { 2487 + case 2000000: return BDB_263_VBT_EDP_LINK_RATE_20; 2488 + case 1350000: return BDB_263_VBT_EDP_LINK_RATE_13_5; 2489 + case 1000000: return BDB_263_VBT_EDP_LINK_RATE_10; 2490 + case 810000: return BDB_263_VBT_EDP_LINK_RATE_8_1; 2491 + case 675000: return BDB_263_VBT_EDP_LINK_RATE_6_75; 2492 + case 540000: return BDB_263_VBT_EDP_LINK_RATE_5_4; 2493 + case 432000: return BDB_263_VBT_EDP_LINK_RATE_4_32; 2494 + case 324000: return BDB_263_VBT_EDP_LINK_RATE_3_24; 2495 + case 270000: return BDB_263_VBT_EDP_LINK_RATE_2_7; 2496 + case 243000: return BDB_263_VBT_EDP_LINK_RATE_2_43; 2497 + case 216000: return BDB_263_VBT_EDP_LINK_RATE_2_16; 2498 + case 162000: return BDB_263_VBT_EDP_LINK_RATE_1_62; 2499 + default: return 0; 2500 + } 2501 + } 2502 + 2484 2503 int intel_bios_dp_max_link_rate(const struct intel_bios_encoder_data *devdata) 2485 2504 { 2486 2505 if (!devdata || devdata->display->vbt.version < 216) ··· 2517 2498 return 0; 2518 2499 2519 2500 return devdata->child.dp_max_lane_count + 1; 2501 + } 2502 + 2503 + bool 2504 + intel_bios_encoder_reject_edp_rate(const struct intel_bios_encoder_data *devdata, 2505 + int rate) 2506 + { 2507 + if (!devdata || devdata->display->vbt.version < 263) 2508 + return false; 2509 + 2510 + if (devdata->child.edp_data_rate_override == BDB_263_VBT_EDP_RATES_MASK) 2511 + return false; 2512 + 2513 + return devdata->child.edp_data_rate_override & edp_rate_override_mask(rate); 2520 2514 } 2521 2515 2522 2516 static void sanitize_device_type(struct intel_bios_encoder_data *devdata,
+2
drivers/gpu/drm/i915/display/intel_bios.h
··· 85 85 bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata); 86 86 bool intel_bios_encoder_hpd_invert(const struct intel_bios_encoder_data *devdata); 87 87 enum port intel_bios_encoder_port(const struct intel_bios_encoder_data *devdata); 88 + bool intel_bios_encoder_reject_edp_rate(const struct intel_bios_encoder_data *devdata, 89 + int rate); 88 90 enum aux_ch intel_bios_dp_aux_ch(const struct intel_bios_encoder_data *devdata); 89 91 int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata); 90 92 int intel_bios_dp_max_lane_count(const struct intel_bios_encoder_data *devdata);