Skip to content

Commit

Permalink
drm/i915: skip display initialization when there is no display
Browse files Browse the repository at this point in the history
Display features should not be initialized or de-initialized when there
is no display. Skip modeset initialization, output setup, plane, crtc,
encoder, connector registration, display cdclk and rawclk
initialization, display core initialization, etc.

Skip the functionality at as high level as possible, and remove any
redundant checks. If the functionality is conditional to *other* display
checks, do not add more. If the un-initialization has checks for
initialization, do not add more.

We explicitly do not care about any GMCH/VLV/CHV code paths, as they've
always had and will have display.

Reviewed-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210408203150.237947-3-jose.souza@intel.com
  • Loading branch information
zehortigoza committed Apr 9, 2021
1 parent 61a60d7 commit 5df7bd1
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 20 deletions.
44 changes: 35 additions & 9 deletions drivers/gpu/drm/i915/display/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,9 @@ u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv,
struct intel_crtc *crtc;
struct intel_plane *plane;

if (!HAS_DISPLAY(dev_priv))
return 0;

/*
* We assume the primary plane for pipe A has
* the highest stride limits of them all,
Expand Down Expand Up @@ -3838,6 +3841,9 @@ int intel_display_suspend(struct drm_device *dev)
struct drm_atomic_state *state;
int ret;

if (!HAS_DISPLAY(dev_priv))
return 0;

state = drm_atomic_helper_suspend(dev);
ret = PTR_ERR_OR_ZERO(state);
if (ret)
Expand Down Expand Up @@ -11429,6 +11435,9 @@ static const struct drm_mode_config_funcs intel_mode_funcs = {
*/
void intel_init_display_hooks(struct drm_i915_private *dev_priv)
{
if (!HAS_DISPLAY(dev_priv))
return;

intel_init_cdclk_hooks(dev_priv);
intel_init_audio_hooks(dev_priv);

Expand Down Expand Up @@ -11471,8 +11480,12 @@ void intel_init_display_hooks(struct drm_i915_private *dev_priv)

void intel_modeset_init_hw(struct drm_i915_private *i915)
{
struct intel_cdclk_state *cdclk_state =
to_intel_cdclk_state(i915->cdclk.obj.state);
struct intel_cdclk_state *cdclk_state;

if (!HAS_DISPLAY(i915))
return;

cdclk_state = to_intel_cdclk_state(i915->cdclk.obj.state);

intel_update_cdclk(i915);
intel_dump_cdclk_config(&i915->cdclk.hw, "Current CDCLK");
Expand Down Expand Up @@ -11788,6 +11801,9 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
/* FIXME: completely on the wrong abstraction layer */
intel_power_domains_init_hw(i915, false);

if (!HAS_DISPLAY(i915))
return 0;

intel_csr_ucode_init(i915);

i915->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
Expand Down Expand Up @@ -11838,6 +11854,9 @@ int intel_modeset_init_nogem(struct drm_i915_private *i915)
struct intel_crtc *crtc;
int ret;

if (!HAS_DISPLAY(i915))
return 0;

intel_init_pm(i915);

intel_panel_sanitize_ssc(i915);
Expand All @@ -11850,13 +11869,11 @@ int intel_modeset_init_nogem(struct drm_i915_private *i915)
INTEL_NUM_PIPES(i915),
INTEL_NUM_PIPES(i915) > 1 ? "s" : "");

if (HAS_DISPLAY(i915)) {
for_each_pipe(i915, pipe) {
ret = intel_crtc_init(i915, pipe);
if (ret) {
intel_mode_config_cleanup(i915);
return ret;
}
for_each_pipe(i915, pipe) {
ret = intel_crtc_init(i915, pipe);
if (ret) {
intel_mode_config_cleanup(i915);
return ret;
}
}

Expand Down Expand Up @@ -12791,6 +12808,9 @@ void intel_display_resume(struct drm_device *dev)
struct drm_modeset_acquire_ctx ctx;
int ret;

if (!HAS_DISPLAY(dev_priv))
return;

dev_priv->modeset_restore_state = NULL;
if (state)
state->acquire_ctx = &ctx;
Expand Down Expand Up @@ -12840,6 +12860,9 @@ static void intel_hpd_poll_fini(struct drm_i915_private *i915)
/* part #1: call before irq uninstall */
void intel_modeset_driver_remove(struct drm_i915_private *i915)
{
if (!HAS_DISPLAY(i915))
return;

flush_workqueue(i915->flip_wq);
flush_workqueue(i915->modeset_wq);

Expand All @@ -12850,6 +12873,9 @@ void intel_modeset_driver_remove(struct drm_i915_private *i915)
/* part #2: call after irq uninstall */
void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915)
{
if (!HAS_DISPLAY(i915))
return;

/*
* Due to the hpd irq storm handling the hotplug work can re-arm the
* poll handlers. Hence disable polling after hpd handling is shut down.
Expand Down
36 changes: 36 additions & 0 deletions drivers/gpu/drm/i915/display/intel_display_power.c
Original file line number Diff line number Diff line change
Expand Up @@ -821,6 +821,9 @@ static void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv)
{
u32 val;

if (!HAS_DISPLAY(dev_priv))
return;

val = intel_de_read(dev_priv, DC_STATE_EN) & gen9_dc_mask(dev_priv);

drm_dbg_kms(&dev_priv->drm,
Expand Down Expand Up @@ -857,6 +860,9 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, u32 state)
u32 val;
u32 mask;

if (!HAS_DISPLAY(dev_priv))
return;

if (drm_WARN_ON_ONCE(&dev_priv->drm,
state & ~dev_priv->csr.allowed_dc_mask))
state &= dev_priv->csr.allowed_dc_mask;
Expand Down Expand Up @@ -1181,6 +1187,9 @@ static void gen9_disable_dc_states(struct drm_i915_private *dev_priv)

gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);

if (!HAS_DISPLAY(dev_priv))
return;

dev_priv->display.get_cdclk(dev_priv, &cdclk_config);
/* Can't read out voltage_level so can't use intel_cdclk_changed() */
drm_WARN_ON(&dev_priv->drm,
Expand Down Expand Up @@ -4533,6 +4542,9 @@ static u32 get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
int requested_dc;
int max_dc;

if (!HAS_DISPLAY(dev_priv))
return 0;

if (IS_DG1(dev_priv))
max_dc = 3;
else if (DISPLAY_VER(dev_priv) >= 12)
Expand Down Expand Up @@ -5126,6 +5138,9 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
/* enable PCH reset handshake */
intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));

if (!HAS_DISPLAY(dev_priv))
return;

/* enable PG1 and Misc I/O */
mutex_lock(&power_domains->lock);

Expand All @@ -5150,6 +5165,9 @@ static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
struct i915_power_domains *power_domains = &dev_priv->power_domains;
struct i915_power_well *well;

if (!HAS_DISPLAY(dev_priv))
return;

gen9_disable_dc_states(dev_priv);

gen9_dbuf_disable(dev_priv);
Expand Down Expand Up @@ -5190,6 +5208,9 @@ static void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume
*/
intel_pch_reset_handshake(dev_priv, false);

if (!HAS_DISPLAY(dev_priv))
return;

/* Enable PG1 */
mutex_lock(&power_domains->lock);

Expand All @@ -5211,6 +5232,9 @@ static void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
struct i915_power_domains *power_domains = &dev_priv->power_domains;
struct i915_power_well *well;

if (!HAS_DISPLAY(dev_priv))
return;

gen9_disable_dc_states(dev_priv);

gen9_dbuf_disable(dev_priv);
Expand Down Expand Up @@ -5244,6 +5268,9 @@ static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume
/* 1. Enable PCH Reset Handshake */
intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));

if (!HAS_DISPLAY(dev_priv))
return;

/* 2-3. */
intel_combo_phy_init(dev_priv);

Expand Down Expand Up @@ -5271,6 +5298,9 @@ static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
struct i915_power_domains *power_domains = &dev_priv->power_domains;
struct i915_power_well *well;

if (!HAS_DISPLAY(dev_priv))
return;

gen9_disable_dc_states(dev_priv);

/* 1. Disable all display engine functions -> aready done */
Expand Down Expand Up @@ -5385,6 +5415,9 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
/* 1. Enable PCH reset handshake. */
intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));

if (!HAS_DISPLAY(dev_priv))
return;

/* 2. Initialize all combo phys */
intel_combo_phy_init(dev_priv);

Expand Down Expand Up @@ -5429,6 +5462,9 @@ static void icl_display_core_uninit(struct drm_i915_private *dev_priv)
struct i915_power_domains *power_domains = &dev_priv->power_domains;
struct i915_power_well *well;

if (!HAS_DISPLAY(dev_priv))
return;

gen9_disable_dc_states(dev_priv);

/* 1. Disable all display engine functions -> aready done */
Expand Down
6 changes: 6 additions & 0 deletions drivers/gpu/drm/i915/display/intel_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -5430,6 +5430,9 @@ void intel_dp_mst_suspend(struct drm_i915_private *dev_priv)
{
struct intel_encoder *encoder;

if (!HAS_DISPLAY(dev_priv))
return;

for_each_intel_encoder(&dev_priv->drm, encoder) {
struct intel_dp *intel_dp;

Expand All @@ -5450,6 +5453,9 @@ void intel_dp_mst_resume(struct drm_i915_private *dev_priv)
{
struct intel_encoder *encoder;

if (!HAS_DISPLAY(dev_priv))
return;

for_each_intel_encoder(&dev_priv->drm, encoder) {
struct intel_dp *intel_dp;
int ret;
Expand Down
3 changes: 0 additions & 3 deletions drivers/gpu/drm/i915/display/intel_gmbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,9 +845,6 @@ int intel_gmbus_setup(struct drm_i915_private *dev_priv)
unsigned int pin;
int ret;

if (!HAS_DISPLAY(dev_priv))
return 0;

if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE;
else if (!HAS_GMCH(dev_priv))
Expand Down
12 changes: 12 additions & 0 deletions drivers/gpu/drm/i915/display/intel_hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,9 @@ void intel_hpd_init(struct drm_i915_private *dev_priv)
{
int i;

if (!HAS_DISPLAY(dev_priv))
return;

for_each_hpd_pin(i) {
dev_priv->hotplug.stats[i].count = 0;
dev_priv->hotplug.stats[i].state = HPD_ENABLED;
Expand Down Expand Up @@ -670,6 +673,9 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
*/
void intel_hpd_poll_enable(struct drm_i915_private *dev_priv)
{
if (!HAS_DISPLAY(dev_priv))
return;

WRITE_ONCE(dev_priv->hotplug.poll_enabled, true);

/*
Expand Down Expand Up @@ -702,6 +708,9 @@ void intel_hpd_poll_enable(struct drm_i915_private *dev_priv)
*/
void intel_hpd_poll_disable(struct drm_i915_private *dev_priv)
{
if (!HAS_DISPLAY(dev_priv))
return;

WRITE_ONCE(dev_priv->hotplug.poll_enabled, false);
schedule_work(&dev_priv->hotplug.poll_init_work);
}
Expand All @@ -718,6 +727,9 @@ void intel_hpd_init_work(struct drm_i915_private *dev_priv)

void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
{
if (!HAS_DISPLAY(dev_priv))
return;

spin_lock_irq(&dev_priv->irq_lock);

dev_priv->hotplug.long_port_mask = 0;
Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/i915/display/intel_pps.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,9 @@ void intel_pps_reset_all(struct drm_i915_private *dev_priv)
if (drm_WARN_ON(&dev_priv->drm, !IS_LP(dev_priv)))
return;

if (!HAS_DISPLAY(dev_priv))
return;

/*
* We can't grab pps_mutex here due to deadlock with power_domain
* mutex when power_domain functions are called while holding pps_mutex.
Expand Down Expand Up @@ -1376,7 +1379,7 @@ void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv)
int pps_num;
int pps_idx;

if (HAS_DDI(dev_priv))
if (!HAS_DISPLAY(dev_priv) || HAS_DDI(dev_priv))
return;
/*
* This w/a is needed at least on CPT/PPT, but to be sure apply it
Expand Down

0 comments on commit 5df7bd1

Please sign in to comment.