aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_opregion.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_opregion.c')
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c158
1 files changed, 94 insertions, 64 deletions
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index e034b4166d32..b8f106d9ecf8 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -773,70 +773,6 @@ static void intel_setup_cadls(struct drm_i915_private *dev_priv)
773 opregion->acpi->cadl[i] = 0; 773 opregion->acpi->cadl[i] = 0;
774} 774}
775 775
776void intel_opregion_register(struct drm_i915_private *dev_priv)
777{
778 struct intel_opregion *opregion = &dev_priv->opregion;
779
780 if (!opregion->header)
781 return;
782
783 if (opregion->acpi) {
784 intel_didl_outputs(dev_priv);
785 intel_setup_cadls(dev_priv);
786
787 /* Notify BIOS we are ready to handle ACPI video ext notifs.
788 * Right now, all the events are handled by the ACPI video module.
789 * We don't actually need to do anything with them. */
790 opregion->acpi->csts = 0;
791 opregion->acpi->drdy = 1;
792
793 opregion->acpi_notifier.notifier_call = intel_opregion_video_event;
794 register_acpi_notifier(&opregion->acpi_notifier);
795 }
796
797 if (opregion->asle) {
798 opregion->asle->tche = ASLE_TCHE_BLC_EN;
799 opregion->asle->ardy = ASLE_ARDY_READY;
800 }
801}
802
803void intel_opregion_unregister(struct drm_i915_private *dev_priv)
804{
805 struct intel_opregion *opregion = &dev_priv->opregion;
806
807 if (!opregion->header)
808 return;
809
810 if (opregion->asle)
811 opregion->asle->ardy = ASLE_ARDY_NOT_READY;
812
813 cancel_work_sync(&dev_priv->opregion.asle_work);
814
815 if (opregion->acpi) {
816 opregion->acpi->drdy = 0;
817
818 unregister_acpi_notifier(&opregion->acpi_notifier);
819 opregion->acpi_notifier.notifier_call = NULL;
820 }
821
822 /* just clear all opregion memory pointers now */
823 memunmap(opregion->header);
824 if (opregion->rvda) {
825 memunmap(opregion->rvda);
826 opregion->rvda = NULL;
827 }
828 if (opregion->vbt_firmware) {
829 kfree(opregion->vbt_firmware);
830 opregion->vbt_firmware = NULL;
831 }
832 opregion->header = NULL;
833 opregion->acpi = NULL;
834 opregion->swsci = NULL;
835 opregion->asle = NULL;
836 opregion->vbt = NULL;
837 opregion->lid_state = NULL;
838}
839
840static void swsci_setup(struct drm_i915_private *dev_priv) 776static void swsci_setup(struct drm_i915_private *dev_priv)
841{ 777{
842 struct intel_opregion *opregion = &dev_priv->opregion; 778 struct intel_opregion *opregion = &dev_priv->opregion;
@@ -1115,3 +1051,97 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
1115 1051
1116 return ret - 1; 1052 return ret - 1;
1117} 1053}
1054
1055void intel_opregion_register(struct drm_i915_private *i915)
1056{
1057 struct intel_opregion *opregion = &i915->opregion;
1058
1059 if (!opregion->header)
1060 return;
1061
1062 if (opregion->acpi) {
1063 opregion->acpi_notifier.notifier_call =
1064 intel_opregion_video_event;
1065 register_acpi_notifier(&opregion->acpi_notifier);
1066 }
1067
1068 intel_opregion_resume(i915);
1069}
1070
1071void intel_opregion_resume(struct drm_i915_private *i915)
1072{
1073 struct intel_opregion *opregion = &i915->opregion;
1074
1075 if (!opregion->header)
1076 return;
1077
1078 if (opregion->acpi) {
1079 intel_didl_outputs(i915);
1080 intel_setup_cadls(i915);
1081
1082 /*
1083 * Notify BIOS we are ready to handle ACPI video ext notifs.
1084 * Right now, all the events are handled by the ACPI video
1085 * module. We don't actually need to do anything with them.
1086 */
1087 opregion->acpi->csts = 0;
1088 opregion->acpi->drdy = 1;
1089 }
1090
1091 if (opregion->asle) {
1092 opregion->asle->tche = ASLE_TCHE_BLC_EN;
1093 opregion->asle->ardy = ASLE_ARDY_READY;
1094 }
1095
1096 intel_opregion_notify_adapter(i915, PCI_D0);
1097}
1098
1099void intel_opregion_suspend(struct drm_i915_private *i915, pci_power_t state)
1100{
1101 struct intel_opregion *opregion = &i915->opregion;
1102
1103 if (!opregion->header)
1104 return;
1105
1106 intel_opregion_notify_adapter(i915, state);
1107
1108 if (opregion->asle)
1109 opregion->asle->ardy = ASLE_ARDY_NOT_READY;
1110
1111 cancel_work_sync(&i915->opregion.asle_work);
1112
1113 if (opregion->acpi)
1114 opregion->acpi->drdy = 0;
1115}
1116
1117void intel_opregion_unregister(struct drm_i915_private *i915)
1118{
1119 struct intel_opregion *opregion = &i915->opregion;
1120
1121 intel_opregion_suspend(i915, PCI_D1);
1122
1123 if (!opregion->header)
1124 return;
1125
1126 if (opregion->acpi_notifier.notifier_call) {
1127 unregister_acpi_notifier(&opregion->acpi_notifier);
1128 opregion->acpi_notifier.notifier_call = NULL;
1129 }
1130
1131 /* just clear all opregion memory pointers now */
1132 memunmap(opregion->header);
1133 if (opregion->rvda) {
1134 memunmap(opregion->rvda);
1135 opregion->rvda = NULL;
1136 }
1137 if (opregion->vbt_firmware) {
1138 kfree(opregion->vbt_firmware);
1139 opregion->vbt_firmware = NULL;
1140 }
1141 opregion->header = NULL;
1142 opregion->acpi = NULL;
1143 opregion->swsci = NULL;
1144 opregion->asle = NULL;
1145 opregion->vbt = NULL;
1146 opregion->lid_state = NULL;
1147}