mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
drm/i915: add opregion function to notify bios of adapter power state
Notifying the bios lets it enter power saving states. Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
9c4b0a6831
commit
ecbc5cf340
2 changed files with 34 additions and 0 deletions
|
@ -2197,6 +2197,8 @@ extern void intel_opregion_fini(struct drm_device *dev);
|
||||||
extern void intel_opregion_asle_intr(struct drm_device *dev);
|
extern void intel_opregion_asle_intr(struct drm_device *dev);
|
||||||
extern int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
|
extern int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
|
||||||
bool enable);
|
bool enable);
|
||||||
|
extern int intel_opregion_notify_adapter(struct drm_device *dev,
|
||||||
|
pci_power_t state);
|
||||||
#else
|
#else
|
||||||
static inline void intel_opregion_init(struct drm_device *dev) { return; }
|
static inline void intel_opregion_init(struct drm_device *dev) { return; }
|
||||||
static inline void intel_opregion_fini(struct drm_device *dev) { return; }
|
static inline void intel_opregion_fini(struct drm_device *dev) { return; }
|
||||||
|
@ -2206,6 +2208,11 @@ intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, bool enable)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static inline int
|
||||||
|
intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* intel_acpi.c */
|
/* intel_acpi.c */
|
||||||
|
|
|
@ -342,6 +342,33 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
|
||||||
return swsci(dev, SWSCI_SBCB_DISPLAY_POWER_STATE, parm, NULL);
|
return swsci(dev, SWSCI_SBCB_DISPLAY_POWER_STATE, parm, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
pci_power_t pci_power_state;
|
||||||
|
u32 parm;
|
||||||
|
} power_state_map[] = {
|
||||||
|
{ PCI_D0, 0x00 },
|
||||||
|
{ PCI_D1, 0x01 },
|
||||||
|
{ PCI_D2, 0x02 },
|
||||||
|
{ PCI_D3hot, 0x04 },
|
||||||
|
{ PCI_D3cold, 0x04 },
|
||||||
|
};
|
||||||
|
|
||||||
|
int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!HAS_DDI(dev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(power_state_map); i++) {
|
||||||
|
if (state == power_state_map[i].pci_power_state)
|
||||||
|
return swsci(dev, SWSCI_SBCB_ADAPTER_POWER_STATE,
|
||||||
|
power_state_map[i].parm, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
Loading…
Reference in a new issue