Commit 3987e35d authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/i915/display: convert high level power interfaces to struct intel_display



Going forward, struct intel_display is the main device data structure
for display. Convert the high level interfaces (init, cleanup, suspend,
resume, etc.) of intel_display_power.c over to it. The actual power
get/put etc. are left for follow-up.

Cc: Imre Deak <imre.deak@intel.com>
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/e1761b0fe5081bf6ca21cca3430befe254f61b32.1732808222.git.jani.nikula@intel.com
parent 31f58252
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -226,13 +226,13 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
		goto cleanup_bios;

	/* FIXME: completely on the wrong abstraction layer */
	ret = intel_power_domains_init(i915);
	ret = intel_power_domains_init(display);
	if (ret < 0)
		goto cleanup_vga;

	intel_pmdemand_init_early(i915);

	intel_power_domains_init_hw(i915, false);
	intel_power_domains_init_hw(display, false);

	if (!HAS_DISPLAY(i915))
		return 0;
@@ -274,7 +274,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)

cleanup_vga_client_pw_domain_dmc:
	intel_dmc_fini(display);
	intel_power_domains_driver_remove(i915);
	intel_power_domains_driver_remove(display);
cleanup_vga:
	intel_vga_unregister(display);
cleanup_bios:
@@ -627,7 +627,7 @@ void intel_display_driver_remove_nogem(struct drm_i915_private *i915)

	intel_dmc_fini(display);

	intel_power_domains_driver_remove(i915);
	intel_power_domains_driver_remove(display);

	intel_vga_unregister(display);

+1 −2
Original line number Diff line number Diff line
@@ -1423,7 +1423,6 @@ static void intel_display_vblank_dc_work(struct work_struct *work)
{
	struct intel_display *display =
		container_of(work, typeof(*display), irq.vblank_dc_work);
	struct drm_i915_private *i915 = to_i915(display->drm);
	int vblank_wa_num_pipes = READ_ONCE(display->irq.vblank_wa_num_pipes);

	/*
@@ -1432,7 +1431,7 @@ static void intel_display_vblank_dc_work(struct work_struct *work)
	 * PSR code. If DC3CO is taken into use we need take that into account
	 * here as well.
	 */
	intel_display_power_set_target_dc_state(i915, vblank_wa_num_pipes ? DC_STATE_DISABLE :
	intel_display_power_set_target_dc_state(display, vblank_wa_num_pipes ? DC_STATE_DISABLE :
						DC_STATE_EN_UPTO_DC6);
}

+35 −43
Original line number Diff line number Diff line
@@ -281,17 +281,16 @@ sanitize_target_dc_state(struct intel_display *display,

/**
 * intel_display_power_set_target_dc_state - Set target dc state.
 * @dev_priv: i915 device
 * @display: display device
 * @state: state which needs to be set as target_dc_state.
 *
 * This function set the "DC off" power well target_dc_state,
 * based upon this target_dc_stste, "DC off" power well will
 * enable desired DC state.
 */
void intel_display_power_set_target_dc_state(struct drm_i915_private *dev_priv,
void intel_display_power_set_target_dc_state(struct intel_display *display,
					     u32 state)
{
	struct intel_display *display = &dev_priv->display;
	struct i915_power_well *power_well;
	bool dc_off_enabled;
	struct i915_power_domains *power_domains = &display->power.domains;
@@ -998,14 +997,13 @@ static u32 get_allowed_dc_mask(struct intel_display *display, int enable_dc)

/**
 * intel_power_domains_init - initializes the power domain structures
 * @dev_priv: i915 device instance
 * @display: display device instance
 *
 * Initializes the power domain structures for @dev_priv depending upon the
 * supported platform.
 */
int intel_power_domains_init(struct drm_i915_private *dev_priv)
int intel_power_domains_init(struct intel_display *display)
{
	struct intel_display *display = &dev_priv->display;
	struct i915_power_domains *power_domains = &display->power.domains;

	display->params.disable_power_well =
@@ -1026,14 +1024,12 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)

/**
 * intel_power_domains_cleanup - clean up power domains resources
 * @dev_priv: i915 device instance
 * @display: display device instance
 *
 * Release any resources acquired by intel_power_domains_init()
 */
void intel_power_domains_cleanup(struct drm_i915_private *dev_priv)
void intel_power_domains_cleanup(struct intel_display *display)
{
	struct intel_display *display = &dev_priv->display;

	intel_display_power_map_cleanup(&display->power.domains);
}

@@ -1917,7 +1913,7 @@ static void intel_power_domains_verify_state(struct intel_display *display);

/**
 * intel_power_domains_init_hw - initialize hardware power domain state
 * @i915: i915 device instance
 * @display: display device instance
 * @resume: Called from resume code paths or not
 *
 * This function initializes the hardware power domain state and enables all
@@ -1931,9 +1927,9 @@ static void intel_power_domains_verify_state(struct intel_display *display);
 * intel_power_domains_enable()) and must be paired with
 * intel_power_domains_driver_remove().
 */
void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
void intel_power_domains_init_hw(struct intel_display *display, bool resume)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct i915_power_domains *power_domains = &display->power.domains;

	power_domains->initializing = true;
@@ -1985,7 +1981,7 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)

/**
 * intel_power_domains_driver_remove - deinitialize hw power domain state
 * @i915: i915 device instance
 * @display: display device instance
 *
 * De-initializes the display power domain HW state. It also ensures that the
 * device stays powered up so that the driver can be reloaded.
@@ -1994,9 +1990,9 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
 * intel_power_domains_disable()) and must be paired with
 * intel_power_domains_init_hw().
 */
void intel_power_domains_driver_remove(struct drm_i915_private *i915)
void intel_power_domains_driver_remove(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	intel_wakeref_t wakeref __maybe_unused =
		fetch_and_zero(&display->power.domains.init_wakeref);

@@ -2015,7 +2011,7 @@ void intel_power_domains_driver_remove(struct drm_i915_private *i915)

/**
 * intel_power_domains_sanitize_state - sanitize power domains state
 * @i915: i915 device instance
 * @display: display device instance
 *
 * Sanitize the power domains state during driver loading and system resume.
 * The function will disable all display power wells that BIOS has enabled
@@ -2023,9 +2019,8 @@ void intel_power_domains_driver_remove(struct drm_i915_private *i915)
 * on it by the time this function is called, after the state of all the
 * pipe, encoder, etc. HW resources have been sanitized).
 */
void intel_power_domains_sanitize_state(struct drm_i915_private *i915)
void intel_power_domains_sanitize_state(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct i915_power_domains *power_domains = &display->power.domains;
	struct i915_power_well *power_well;

@@ -2047,7 +2042,7 @@ void intel_power_domains_sanitize_state(struct drm_i915_private *i915)

/**
 * intel_power_domains_enable - enable toggling of display power wells
 * @i915: i915 device instance
 * @display: display device instance
 *
 * Enable the ondemand enabling/disabling of the display power wells. Note that
 * power wells not belonging to POWER_DOMAIN_INIT are allowed to be toggled
@@ -2057,9 +2052,9 @@ void intel_power_domains_sanitize_state(struct drm_i915_private *i915)
 * of display HW readout (which will acquire the power references reflecting
 * the current HW state).
 */
void intel_power_domains_enable(struct drm_i915_private *i915)
void intel_power_domains_enable(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	intel_wakeref_t wakeref __maybe_unused =
		fetch_and_zero(&display->power.domains.init_wakeref);

@@ -2069,14 +2064,14 @@ void intel_power_domains_enable(struct drm_i915_private *i915)

/**
 * intel_power_domains_disable - disable toggling of display power wells
 * @i915: i915 device instance
 * @display: display device instance
 *
 * Disable the ondemand enabling/disabling of the display power wells. See
 * intel_power_domains_enable() for which power wells this call controls.
 */
void intel_power_domains_disable(struct drm_i915_private *i915)
void intel_power_domains_disable(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct i915_power_domains *power_domains = &display->power.domains;

	drm_WARN_ON(display->drm, power_domains->init_wakeref);
@@ -2088,7 +2083,7 @@ void intel_power_domains_disable(struct drm_i915_private *i915)

/**
 * intel_power_domains_suspend - suspend power domain state
 * @i915: i915 device instance
 * @display: display device instance
 * @s2idle: specifies whether we go to idle, or deeper sleep
 *
 * This function prepares the hardware power domain state before entering
@@ -2097,9 +2092,9 @@ void intel_power_domains_disable(struct drm_i915_private *i915)
 * It must be called with power domains already disabled (after a call to
 * intel_power_domains_disable()) and paired with intel_power_domains_resume().
 */
void intel_power_domains_suspend(struct drm_i915_private *i915, bool s2idle)
void intel_power_domains_suspend(struct intel_display *display, bool s2idle)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct i915_power_domains *power_domains = &display->power.domains;
	intel_wakeref_t wakeref __maybe_unused =
		fetch_and_zero(&power_domains->init_wakeref);
@@ -2143,7 +2138,7 @@ void intel_power_domains_suspend(struct drm_i915_private *i915, bool s2idle)

/**
 * intel_power_domains_resume - resume power domain state
 * @i915: i915 device instance
 * @display: display device instance
 *
 * This function resume the hardware power domain state during system resume.
 *
@@ -2151,13 +2146,13 @@ void intel_power_domains_suspend(struct drm_i915_private *i915, bool s2idle)
 * intel_power_domains_enable()) and must be paired with
 * intel_power_domains_suspend().
 */
void intel_power_domains_resume(struct drm_i915_private *i915)
void intel_power_domains_resume(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct i915_power_domains *power_domains = &display->power.domains;

	if (power_domains->display_core_suspended) {
		intel_power_domains_init_hw(i915, true);
		intel_power_domains_init_hw(display, true);
		power_domains->display_core_suspended = false;
	} else {
		drm_WARN_ON(display->drm, power_domains->init_wakeref);
@@ -2258,11 +2253,11 @@ static void intel_power_domains_verify_state(struct intel_display *display)

#endif

void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle)
void intel_display_power_suspend_late(struct intel_display *display, bool s2idle)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);

	intel_power_domains_suspend(i915, s2idle);
	intel_power_domains_suspend(display, s2idle);

	if (DISPLAY_VER(display) >= 11 || display->platform.geminilake ||
	    display->platform.broxton) {
@@ -2276,9 +2271,9 @@ void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle
		intel_de_rmw(i915, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, SBCLK_RUN_REFCLK_DIS);
}

void intel_display_power_resume_early(struct drm_i915_private *i915)
void intel_display_power_resume_early(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct drm_i915_private *i915 = to_i915(display->drm);

	if (DISPLAY_VER(display) >= 11 || display->platform.geminilake ||
	    display->platform.broxton) {
@@ -2292,13 +2287,11 @@ void intel_display_power_resume_early(struct drm_i915_private *i915)
	if (INTEL_PCH_TYPE(i915) >= PCH_CNP && INTEL_PCH_TYPE(i915) < PCH_DG1)
		intel_de_rmw(i915, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, 0);

	intel_power_domains_resume(i915);
	intel_power_domains_resume(display);
}

void intel_display_power_suspend(struct drm_i915_private *i915)
void intel_display_power_suspend(struct intel_display *display)
{
	struct intel_display *display = &i915->display;

	if (DISPLAY_VER(display) >= 11) {
		icl_display_core_uninit(display);
		bxt_enable_dc9(display);
@@ -2310,9 +2303,8 @@ void intel_display_power_suspend(struct drm_i915_private *i915)
	}
}

void intel_display_power_resume(struct drm_i915_private *i915)
void intel_display_power_resume(struct intel_display *display)
{
	struct intel_display *display = &i915->display;
	struct i915_power_domains *power_domains = &display->power.domains;

	if (DISPLAY_VER(display) >= 11) {
+16 −15
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ enum aux_ch;
enum port;
struct drm_i915_private;
struct i915_power_well;
struct intel_display;
struct intel_encoder;
struct seq_file;

@@ -166,21 +167,21 @@ struct intel_display_power_domain_set {
	for ((__domain) = 0; (__domain) < POWER_DOMAIN_NUM; (__domain)++)	\
		for_each_if(test_bit((__domain), (__mask)->bits))

int intel_power_domains_init(struct drm_i915_private *dev_priv);
void intel_power_domains_cleanup(struct drm_i915_private *dev_priv);
void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
void intel_power_domains_driver_remove(struct drm_i915_private *dev_priv);
void intel_power_domains_enable(struct drm_i915_private *dev_priv);
void intel_power_domains_disable(struct drm_i915_private *dev_priv);
void intel_power_domains_suspend(struct drm_i915_private *dev_priv, bool s2idle);
void intel_power_domains_resume(struct drm_i915_private *dev_priv);
void intel_power_domains_sanitize_state(struct drm_i915_private *dev_priv);

void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle);
void intel_display_power_resume_early(struct drm_i915_private *i915);
void intel_display_power_suspend(struct drm_i915_private *i915);
void intel_display_power_resume(struct drm_i915_private *i915);
void intel_display_power_set_target_dc_state(struct drm_i915_private *dev_priv,
int intel_power_domains_init(struct intel_display *display);
void intel_power_domains_cleanup(struct intel_display *display);
void intel_power_domains_init_hw(struct intel_display *display, bool resume);
void intel_power_domains_driver_remove(struct intel_display *display);
void intel_power_domains_enable(struct intel_display *display);
void intel_power_domains_disable(struct intel_display *display);
void intel_power_domains_suspend(struct intel_display *display, bool s2idle);
void intel_power_domains_resume(struct intel_display *display);
void intel_power_domains_sanitize_state(struct intel_display *display);

void intel_display_power_suspend_late(struct intel_display *display, bool s2idle);
void intel_display_power_resume_early(struct intel_display *display);
void intel_display_power_suspend(struct intel_display *display);
void intel_display_power_resume(struct intel_display *display);
void intel_display_power_set_target_dc_state(struct intel_display *display,
					     u32 state);

bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
+1 −1
Original line number Diff line number Diff line
@@ -1024,5 +1024,5 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915,

	intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);

	intel_power_domains_sanitize_state(i915);
	intel_power_domains_sanitize_state(display);
}
Loading