mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
- Fix power consumption at s2idle on DG2 (Anshuman)
- Fix documentation build warning (Jani) - Fix Display HPD (Imre) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmTnTrYACgkQ+mJfZA7r E8rxgQf/YgB/haPZF+eESWUjwp/TRW1NphcQEv3VtQhDayJZofQrL6ouZu+SSKyB yrAcQGQwJ831T2l7ms3LIzLvx7eDW5o1Q7fW1dTIhv6LHyI7rFufLXjb2Pv8cvdt zGBzPfcmmxVBpe3gDvJxbtP950yzRcwWgK1YVPpenlAs86R608THuq27Z6tW0Ztv in7IlN7FMB56ReepHOVYq+QfnnS7Goah64RLav7ioi/8xLY3SFLezEzGfRcz9ylM S5Qz+FWMqf0HhJGYtLyGKnUcLiWjH3Oz/mTwMEC0ChNfTirxZQ4P0BY6P2tgU0Ib h6u1DKOXWDaptcnGdFYqvXKKgSkihQ== =hKF2 -----END PGP SIGNATURE----- Merge tag 'drm-intel-fixes-2023-08-24' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes - Fix power consumption at s2idle on DG2 (Anshuman) - Fix documentation build warning (Jani) - Fix Display HPD (Imre) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZOdPRFSJpo0ErPX/@intel.com
This commit is contained in:
commit
59fe2029b9
@ -262,6 +262,26 @@ static bool drm_kms_helper_enable_hpd(struct drm_device *dev)
|
||||
}
|
||||
|
||||
#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
|
||||
static void reschedule_output_poll_work(struct drm_device *dev)
|
||||
{
|
||||
unsigned long delay = DRM_OUTPUT_POLL_PERIOD;
|
||||
|
||||
if (dev->mode_config.delayed_event)
|
||||
/*
|
||||
* FIXME:
|
||||
*
|
||||
* Use short (1s) delay to handle the initial delayed event.
|
||||
* This delay should not be needed, but Optimus/nouveau will
|
||||
* fail in a mysterious way if the delayed event is handled as
|
||||
* soon as possible like it is done in
|
||||
* drm_helper_probe_single_connector_modes() in case the poll
|
||||
* was enabled before.
|
||||
*/
|
||||
delay = HZ;
|
||||
|
||||
schedule_delayed_work(&dev->mode_config.output_poll_work, delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_kms_helper_poll_enable - re-enable output polling.
|
||||
* @dev: drm_device
|
||||
@ -279,37 +299,41 @@ static bool drm_kms_helper_enable_hpd(struct drm_device *dev)
|
||||
*/
|
||||
void drm_kms_helper_poll_enable(struct drm_device *dev)
|
||||
{
|
||||
bool poll = false;
|
||||
unsigned long delay = DRM_OUTPUT_POLL_PERIOD;
|
||||
|
||||
if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll ||
|
||||
dev->mode_config.poll_running)
|
||||
return;
|
||||
|
||||
poll = drm_kms_helper_enable_hpd(dev);
|
||||
|
||||
if (dev->mode_config.delayed_event) {
|
||||
/*
|
||||
* FIXME:
|
||||
*
|
||||
* Use short (1s) delay to handle the initial delayed event.
|
||||
* This delay should not be needed, but Optimus/nouveau will
|
||||
* fail in a mysterious way if the delayed event is handled as
|
||||
* soon as possible like it is done in
|
||||
* drm_helper_probe_single_connector_modes() in case the poll
|
||||
* was enabled before.
|
||||
*/
|
||||
poll = true;
|
||||
delay = HZ;
|
||||
}
|
||||
|
||||
if (poll)
|
||||
schedule_delayed_work(&dev->mode_config.output_poll_work, delay);
|
||||
if (drm_kms_helper_enable_hpd(dev) ||
|
||||
dev->mode_config.delayed_event)
|
||||
reschedule_output_poll_work(dev);
|
||||
|
||||
dev->mode_config.poll_running = true;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_kms_helper_poll_enable);
|
||||
|
||||
/**
|
||||
* drm_kms_helper_poll_reschedule - reschedule the output polling work
|
||||
* @dev: drm_device
|
||||
*
|
||||
* This function reschedules the output polling work, after polling for a
|
||||
* connector has been enabled.
|
||||
*
|
||||
* Drivers must call this helper after enabling polling for a connector by
|
||||
* setting %DRM_CONNECTOR_POLL_CONNECT / %DRM_CONNECTOR_POLL_DISCONNECT flags
|
||||
* in drm_connector::polled. Note that after disabling polling by clearing these
|
||||
* flags for a connector will stop the output polling work automatically if
|
||||
* the polling is disabled for all other connectors as well.
|
||||
*
|
||||
* The function can be called only after polling has been enabled by calling
|
||||
* drm_kms_helper_poll_init() / drm_kms_helper_poll_enable().
|
||||
*/
|
||||
void drm_kms_helper_poll_reschedule(struct drm_device *dev)
|
||||
{
|
||||
if (dev->mode_config.poll_running)
|
||||
reschedule_output_poll_work(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_kms_helper_poll_reschedule);
|
||||
|
||||
static enum drm_connector_status
|
||||
drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force)
|
||||
{
|
||||
|
@ -211,7 +211,7 @@ intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv)
|
||||
|
||||
/* Enable polling and queue hotplug re-enabling. */
|
||||
if (hpd_disabled) {
|
||||
drm_kms_helper_poll_enable(&dev_priv->drm);
|
||||
drm_kms_helper_poll_reschedule(&dev_priv->drm);
|
||||
mod_delayed_work(dev_priv->unordered_wq,
|
||||
&dev_priv->display.hotplug.reenable_work,
|
||||
msecs_to_jiffies(HPD_STORM_REENABLE_DELAY));
|
||||
@ -649,7 +649,7 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
if (enabled)
|
||||
drm_kms_helper_poll_enable(&dev_priv->drm);
|
||||
drm_kms_helper_poll_reschedule(&dev_priv->drm);
|
||||
|
||||
mutex_unlock(&dev_priv->drm.mode_config.mutex);
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
* The kernel driver is only responsible for loading the HuC firmware and
|
||||
* triggering its security authentication. This is done differently depending
|
||||
* on the platform:
|
||||
*
|
||||
* - older platforms (from Gen9 to most Gen12s): the load is performed via DMA
|
||||
* and the authentication via GuC
|
||||
* - DG2: load and authentication are both performed via GSC.
|
||||
@ -33,6 +34,7 @@
|
||||
* not-DG2 older platforms), while the authentication is done in 2-steps,
|
||||
* a first auth for clear-media workloads via GuC and a second one for all
|
||||
* workloads via GSC.
|
||||
*
|
||||
* On platforms where the GuC does the authentication, to correctly do so the
|
||||
* HuC binary must be loaded before the GuC one.
|
||||
* Loading the HuC is optional; however, not using the HuC might negatively
|
||||
|
@ -443,7 +443,6 @@ static int i915_pcode_init(struct drm_i915_private *i915)
|
||||
static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
|
||||
struct pci_dev *root_pdev;
|
||||
int ret;
|
||||
|
||||
if (i915_inject_probe_failure(dev_priv))
|
||||
@ -557,15 +556,6 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
|
||||
|
||||
intel_bw_init_hw(dev_priv);
|
||||
|
||||
/*
|
||||
* FIXME: Temporary hammer to avoid freezing the machine on our DGFX
|
||||
* This should be totally removed when we handle the pci states properly
|
||||
* on runtime PM and on s2idle cases.
|
||||
*/
|
||||
root_pdev = pcie_find_root_port(pdev);
|
||||
if (root_pdev)
|
||||
pci_d3cold_disable(root_pdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_opregion:
|
||||
@ -591,7 +581,6 @@ err_perf:
|
||||
static void i915_driver_hw_remove(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
|
||||
struct pci_dev *root_pdev;
|
||||
|
||||
i915_perf_fini(dev_priv);
|
||||
|
||||
@ -599,10 +588,6 @@ static void i915_driver_hw_remove(struct drm_i915_private *dev_priv)
|
||||
|
||||
if (pdev->msi_enabled)
|
||||
pci_disable_msi(pdev);
|
||||
|
||||
root_pdev = pcie_find_root_port(pdev);
|
||||
if (root_pdev)
|
||||
pci_d3cold_enable(root_pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1517,6 +1502,8 @@ static int intel_runtime_suspend(struct device *kdev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
|
||||
struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
|
||||
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
|
||||
struct pci_dev *root_pdev;
|
||||
struct intel_gt *gt;
|
||||
int ret, i;
|
||||
|
||||
@ -1568,6 +1555,15 @@ static int intel_runtime_suspend(struct device *kdev)
|
||||
drm_err(&dev_priv->drm,
|
||||
"Unclaimed access detected prior to suspending\n");
|
||||
|
||||
/*
|
||||
* FIXME: Temporary hammer to avoid freezing the machine on our DGFX
|
||||
* This should be totally removed when we handle the pci states properly
|
||||
* on runtime PM.
|
||||
*/
|
||||
root_pdev = pcie_find_root_port(pdev);
|
||||
if (root_pdev)
|
||||
pci_d3cold_disable(root_pdev);
|
||||
|
||||
rpm->suspended = true;
|
||||
|
||||
/*
|
||||
@ -1606,6 +1602,8 @@ static int intel_runtime_resume(struct device *kdev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
|
||||
struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
|
||||
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
|
||||
struct pci_dev *root_pdev;
|
||||
struct intel_gt *gt;
|
||||
int ret, i;
|
||||
|
||||
@ -1619,6 +1617,11 @@ static int intel_runtime_resume(struct device *kdev)
|
||||
|
||||
intel_opregion_notify_adapter(dev_priv, PCI_D0);
|
||||
rpm->suspended = false;
|
||||
|
||||
root_pdev = pcie_find_root_port(pdev);
|
||||
if (root_pdev)
|
||||
pci_d3cold_enable(root_pdev);
|
||||
|
||||
if (intel_uncore_unclaimed_mmio(&dev_priv->uncore))
|
||||
drm_dbg(&dev_priv->drm,
|
||||
"Unclaimed access during suspend, bios?\n");
|
||||
|
@ -25,6 +25,7 @@ void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector);
|
||||
|
||||
void drm_kms_helper_poll_disable(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_enable(struct drm_device *dev);
|
||||
void drm_kms_helper_poll_reschedule(struct drm_device *dev);
|
||||
bool drm_kms_helper_is_poll_worker(void);
|
||||
|
||||
enum drm_mode_status drm_crtc_helper_mode_valid_fixed(struct drm_crtc *crtc,
|
||||
|
Loading…
Reference in New Issue
Block a user