This tablet does not have dpio-common-bc powerwell init. i915 0000:00:02.0: [drm] *ERROR* timeout setting power well state 00000000 (fffff3ff) i915 0000:00:02.0: [drm] *ERROR* Display PHY 0 is not power up Signed-off-by: Qs315490 <qs315490@xxxxxxxxxxx> --- .../drm/i915/display/intel_display_driver.c | 4 ++-- .../drm/i915/display/intel_display_power.c | 21 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_quirks.c | 8 +++++++ drivers/gpu/drm/i915/display/intel_quirks.h | 1 + 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c index 50ec0c3c7..36338e12f 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -226,6 +226,8 @@ int intel_display_driver_probe_noirq(struct intel_display *display) if (ret) goto cleanup_bios; + intel_init_quirks(display); + /* FIXME: completely on the wrong abstraction layer */ ret = intel_power_domains_init(display); if (ret < 0) @@ -267,8 +269,6 @@ int intel_display_driver_probe_noirq(struct intel_display *display) if (ret) goto cleanup_vga_client_pw_domain_dmc; - intel_init_quirks(display); - intel_fbc_init(display); return 0; diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c index d3b8453a1..c589836cb 100644 --- a/drivers/gpu/drm/i915/display/intel_display_power.c +++ b/drivers/gpu/drm/i915/display/intel_display_power.c @@ -23,6 +23,7 @@ #include "intel_pcode.h" #include "intel_pmdemand.h" #include "intel_pps_regs.h" +#include "intel_quirks.h" #include "intel_snps_phy.h" #include "skl_watermark.h" #include "skl_watermark_regs.h" @@ -482,6 +483,12 @@ intel_display_power_grab_async_put_ref(struct intel_display *display, return ret; } +static const struct i915_power_well_instance * +i915_power_well_instance(const struct i915_power_well *power_well) +{ + return &power_well->desc->instances->list[power_well->instance_idx]; +} + static void __intel_display_power_get_domain(struct intel_display *display, enum intel_display_power_domain domain) @@ -493,7 +500,14 @@ __intel_display_power_get_domain(struct intel_display *display, return; for_each_power_domain_well(display, power_well, domain) + { + if (domain == POWER_DOMAIN_INIT && + intel_has_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT) && + i915_power_well_instance(power_well)->id == VLV_DISP_PW_DPIO_CMN_BC) + continue; + intel_power_well_get(display, power_well); + } power_domains->domain_use_count[domain]++; } @@ -589,7 +603,14 @@ __intel_display_power_put_domain(struct intel_display *display, power_domains->domain_use_count[domain]--; for_each_power_domain_well_reverse(display, power_well, domain) + { + if (domain == POWER_DOMAIN_INIT && + intel_has_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT) && + i915_power_well_instance(power_well)->id == VLV_DISP_PW_DPIO_CMN_BC) + continue; + intel_power_well_put(display, power_well); + } } static void __intel_display_power_put(struct intel_display *display, diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c index 8b30e9fd9..af2fa6b67 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.c +++ b/drivers/gpu/drm/i915/display/intel_quirks.c @@ -78,6 +78,12 @@ static void quirk_fw_sync_len(struct intel_dp *intel_dp) drm_info(display->drm, "Applying Fast Wake sync pulse count quirk\n"); } +static void quirk_no_vlv_disp_pw_dpio_cmn_bc_init(struct intel_display *display) +{ + intel_set_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT); + drm_info(display->drm, "Applying no dpio-common-bc powerwell init quirk\n"); +} + struct intel_quirk { int device; int subsystem_vendor; @@ -229,6 +235,8 @@ static struct intel_quirk intel_quirks[] = { { 0x3184, 0x1019, 0xa94d, quirk_increase_ddi_disabled_time }, /* HP Notebook - 14-r206nv */ { 0x0f31, 0x103c, 0x220f, quirk_invert_brightness }, + /* Xiaomi Pad 2 - xiaomi-latte */ + { 0x22b0, 0x1d72, 0x1502, quirk_no_vlv_disp_pw_dpio_cmn_bc_init }, }; static const struct intel_dpcd_quirk intel_dpcd_quirks[] = { diff --git a/drivers/gpu/drm/i915/display/intel_quirks.h b/drivers/gpu/drm/i915/display/intel_quirks.h index cafdebda7..6e7ea8c13 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.h +++ b/drivers/gpu/drm/i915/display/intel_quirks.h @@ -20,6 +20,7 @@ enum intel_quirk_id { QUIRK_LVDS_SSC_DISABLE, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK, QUIRK_FW_SYNC_LEN, + QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT, }; void intel_init_quirks(struct intel_display *display); -- 2.39.5