Lines Matching +full:sub +full:- +full:mailbox

9  * distribute, sub license, and/or sell copies of the Software, and to
20 * NON-INFRINGEMENT. IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE
52 #define MBOX_ACPI BIT(0) /* Mailbox #1 */
53 #define MBOX_SWSCI BIT(1) /* Mailbox #2 (obsolete from v2.x) */
54 #define MBOX_ASLE BIT(2) /* Mailbox #3 */
55 #define MBOX_ASLE_EXT BIT(4) /* Mailbox #5 */
56 #define MBOX_BACKLIGHT BIT(5) /* Mailbox #2 (valid from v3.x) */
79 /* OpRegion mailbox #1: public ACPI methods */
89 u32 aslp; /* ASL sleep time-out */
103 /* OpRegion mailbox #2: SWSCI */
107 u32 dslp; /* driver sleep time-out */
111 /* OpRegion mailbox #3: ASLE */
138 /* OpRegion mailbox #5: ASLE ext */
218 #define SWSCI_FUNCTION_CODE(main, sub) \ argument
220 (sub) << SWSCI_SCIC_SUB_FUNCTION_SHIFT)
255 struct opregion_swsci *swsci = i915->display.opregion.swsci; in check_swsci_function()
259 return -ENODEV; in check_swsci_function()
268 if ((i915->display.opregion.swsci_sbcb_sub_functions & in check_swsci_function()
270 return -EINVAL; in check_swsci_function()
272 if ((i915->display.opregion.swsci_gbda_sub_functions & in check_swsci_function()
274 return -EINVAL; in check_swsci_function()
283 struct opregion_swsci *swsci = dev_priv->display.opregion.swsci; in swsci()
284 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev); in swsci()
294 dslp = swsci->dslp; in swsci()
307 scic = swsci->scic; in swsci()
309 drm_dbg(&dev_priv->drm, "SWSCI request already in progress\n"); in swsci()
310 return -EBUSY; in swsci()
315 swsci->parm = parm; in swsci()
316 swsci->scic = scic; in swsci()
331 #define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0) in swsci()
333 drm_dbg(&dev_priv->drm, "SWSCI request timed out\n"); in swsci()
334 return -ETIMEDOUT; in swsci()
342 drm_dbg(&dev_priv->drm, "SWSCI request error %u\n", scic); in swsci()
343 return -EIO; in swsci()
347 *parm_out = swsci->parm; in swsci()
362 struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); in intel_opregion_notify_encoder()
377 if (intel_encoder->type == INTEL_OUTPUT_DSI) in intel_opregion_notify_encoder()
380 port = intel_encoder->port; in intel_opregion_notify_encoder()
390 * The port numbering and mapping here is bizarre. The now-obsolete in intel_opregion_notify_encoder()
397 drm_dbg_kms(&dev_priv->drm, in intel_opregion_notify_encoder()
399 intel_encoder->base.base.id, intel_encoder->base.name, in intel_opregion_notify_encoder()
400 port_name(intel_encoder->port), port); in intel_opregion_notify_encoder()
401 return -EINVAL; in intel_opregion_notify_encoder()
407 switch (intel_encoder->type) { in intel_opregion_notify_encoder()
422 drm_WARN_ONCE(&dev_priv->drm, 1, in intel_opregion_notify_encoder()
424 intel_encoder->type); in intel_opregion_notify_encoder()
425 return -EINVAL; in intel_opregion_notify_encoder()
458 return -EINVAL; in intel_opregion_notify_adapter()
465 struct opregion_asle *asle = dev_priv->display.opregion.asle; in asle_set_backlight()
467 drm_dbg(&dev_priv->drm, "bclp = 0x%08x\n", bclp); in asle_set_backlight()
470 drm_dbg_kms(&dev_priv->drm, in asle_set_backlight()
482 drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, NULL); in asle_set_backlight()
488 drm_dbg_kms(&dev_priv->drm, "updating opregion backlight %d/255\n", in asle_set_backlight()
490 drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); in asle_set_backlight()
492 intel_backlight_set_acpi(connector->base.state, bclp, 255); in asle_set_backlight()
494 asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID; in asle_set_backlight()
496 drm_modeset_unlock(&dev_priv->drm.mode_config.connection_mutex); in asle_set_backlight()
505 range, 0xffff indicates above sensor range. 1-0xfffe are valid */ in asle_set_als_illum()
506 drm_dbg(&dev_priv->drm, "Illum is not supported\n"); in asle_set_als_illum()
512 drm_dbg(&dev_priv->drm, "PWM freq is not supported\n"); in asle_set_pwm_freq()
520 drm_dbg(&dev_priv->drm, "Pfit is not supported\n"); in asle_set_pfit()
526 drm_dbg(&dev_priv->drm, "SROT is not supported\n"); in asle_set_supported_rotation_angles()
533 drm_dbg(&dev_priv->drm, in asle_set_button_array()
536 drm_dbg(&dev_priv->drm, in asle_set_button_array()
539 drm_dbg(&dev_priv->drm, in asle_set_button_array()
542 drm_dbg(&dev_priv->drm, in asle_set_button_array()
545 drm_dbg(&dev_priv->drm, in asle_set_button_array()
548 drm_dbg(&dev_priv->drm, in asle_set_button_array()
557 drm_dbg(&dev_priv->drm, in asle_set_convertible()
560 drm_dbg(&dev_priv->drm, in asle_set_convertible()
569 drm_dbg(&dev_priv->drm, "Docking is not supported (docked)\n"); in asle_set_docking()
571 drm_dbg(&dev_priv->drm, in asle_set_docking()
579 drm_dbg(&dev_priv->drm, "ISCT is not supported\n"); in asle_isct_state()
589 struct opregion_asle *asle = dev_priv->display.opregion.asle; in asle_work()
596 aslc_req = asle->aslc; in asle_work()
599 drm_dbg(&dev_priv->drm, in asle_work()
605 aslc_stat |= asle_set_als_illum(dev_priv, asle->alsi); in asle_work()
608 aslc_stat |= asle_set_backlight(dev_priv, asle->bclp); in asle_work()
611 aslc_stat |= asle_set_pfit(dev_priv, asle->pfit); in asle_work()
614 aslc_stat |= asle_set_pwm_freq(dev_priv, asle->pfmb); in asle_work()
618 asle->srot); in asle_work()
621 aslc_stat |= asle_set_button_array(dev_priv, asle->iuer); in asle_work()
624 aslc_stat |= asle_set_convertible(dev_priv, asle->iuer); in asle_work()
627 aslc_stat |= asle_set_docking(dev_priv, asle->iuer); in asle_work()
632 asle->aslc = aslc_stat; in asle_work()
637 if (dev_priv->display.opregion.asle) in intel_opregion_asle_intr()
638 queue_work(dev_priv->unordered_wq, in intel_opregion_asle_intr()
639 &dev_priv->display.opregion.asle_work); in intel_opregion_asle_intr()
660 if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) in intel_opregion_video_event()
663 acpi = opregion->acpi; in intel_opregion_video_event()
665 if (event->type == 0x80 && ((acpi->cevt & 1) == 0)) in intel_opregion_video_event()
668 acpi->csts = 0; in intel_opregion_video_event()
681 if (i < ARRAY_SIZE(opregion->acpi->didl)) { in set_did()
682 opregion->acpi->didl[i] = val; in set_did()
684 i -= ARRAY_SIZE(opregion->acpi->didl); in set_did()
686 if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2))) in set_did()
689 opregion->acpi->did2[i] = val; in set_did()
695 struct intel_opregion *opregion = &dev_priv->display.opregion; in intel_didl_outputs()
707 max_outputs = ARRAY_SIZE(opregion->acpi->didl) + in intel_didl_outputs()
708 ARRAY_SIZE(opregion->acpi->did2); in intel_didl_outputs()
712 drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); in intel_didl_outputs()
715 set_did(opregion, i, connector->acpi_device_id); in intel_didl_outputs()
720 drm_dbg_kms(&dev_priv->drm, "%d outputs detected\n", i); in intel_didl_outputs()
723 drm_err(&dev_priv->drm, in intel_didl_outputs()
734 struct intel_opregion *opregion = &dev_priv->display.opregion; in intel_setup_cadls()
749 drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); in intel_setup_cadls()
751 if (i >= ARRAY_SIZE(opregion->acpi->cadl)) in intel_setup_cadls()
753 opregion->acpi->cadl[i++] = connector->acpi_device_id; in intel_setup_cadls()
758 if (i < ARRAY_SIZE(opregion->acpi->cadl)) in intel_setup_cadls()
759 opregion->acpi->cadl[i] = 0; in intel_setup_cadls()
764 struct intel_opregion *opregion = &dev_priv->display.opregion; in swsci_setup()
768 /* Sub-function code 0 is okay, let's allow them. */ in swsci_setup()
769 opregion->swsci_gbda_sub_functions = 1; in swsci_setup()
770 opregion->swsci_sbcb_sub_functions = 1; in swsci_setup()
774 /* make the bits match the sub-function codes */ in swsci_setup()
776 opregion->swsci_gbda_sub_functions |= tmp; in swsci_setup()
785 /* here, the bits already match sub-function codes */ in swsci_setup()
786 opregion->swsci_sbcb_sub_functions |= tmp; in swsci_setup()
796 /* make the bits match the sub-function codes */ in swsci_setup()
803 u32 req = opregion->swsci_sbcb_sub_functions; in swsci_setup()
805 drm_dbg(&dev_priv->drm, in swsci_setup()
809 /* opregion->swsci_sbcb_sub_functions &= tmp; */ in swsci_setup()
811 opregion->swsci_sbcb_sub_functions |= tmp; in swsci_setup()
815 drm_dbg(&dev_priv->drm, in swsci_setup()
817 opregion->swsci_gbda_sub_functions, in swsci_setup()
818 opregion->swsci_sbcb_sub_functions); in swsci_setup()
824 "VBIOS ROM for %s\n", id->ident); in intel_no_opregion_vbt_callback()
842 struct intel_opregion *opregion = &dev_priv->display.opregion; in intel_load_vbt_firmware()
844 const char *name = dev_priv->display.params.vbt_firmware; in intel_load_vbt_firmware()
848 return -ENOENT; in intel_load_vbt_firmware()
850 ret = request_firmware(&fw, name, dev_priv->drm.dev); in intel_load_vbt_firmware()
852 drm_err(&dev_priv->drm, in intel_load_vbt_firmware()
858 if (intel_bios_is_valid_vbt(fw->data, fw->size)) { in intel_load_vbt_firmware()
859 opregion->vbt_firmware = kmemdup(fw->data, fw->size, GFP_KERNEL); in intel_load_vbt_firmware()
860 if (opregion->vbt_firmware) { in intel_load_vbt_firmware()
861 drm_dbg_kms(&dev_priv->drm, in intel_load_vbt_firmware()
863 opregion->vbt = opregion->vbt_firmware; in intel_load_vbt_firmware()
864 opregion->vbt_size = fw->size; in intel_load_vbt_firmware()
867 ret = -ENOMEM; in intel_load_vbt_firmware()
870 drm_dbg_kms(&dev_priv->drm, "Invalid VBT firmware \"%s\"\n", in intel_load_vbt_firmware()
872 ret = -EINVAL; in intel_load_vbt_firmware()
882 struct intel_opregion *opregion = &dev_priv->display.opregion; in intel_opregion_setup()
883 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev); in intel_opregion_setup()
898 drm_dbg(&dev_priv->drm, "graphic opregion physical addr: 0x%x\n", in intel_opregion_setup()
901 drm_dbg(&dev_priv->drm, "ACPI OpRegion not supported!\n"); in intel_opregion_setup()
902 return -ENOTSUPP; in intel_opregion_setup()
905 INIT_WORK(&opregion->asle_work, asle_work); in intel_opregion_setup()
909 return -ENOMEM; in intel_opregion_setup()
914 drm_dbg(&dev_priv->drm, "opregion signature mismatch\n"); in intel_opregion_setup()
915 err = -EINVAL; in intel_opregion_setup()
918 opregion->header = base; in intel_opregion_setup()
919 opregion->lid_state = base + ACPI_CLID; in intel_opregion_setup()
921 drm_dbg(&dev_priv->drm, "ACPI OpRegion version %u.%u.%u\n", in intel_opregion_setup()
922 opregion->header->over.major, in intel_opregion_setup()
923 opregion->header->over.minor, in intel_opregion_setup()
924 opregion->header->over.revision); in intel_opregion_setup()
926 mboxes = opregion->header->mboxes; in intel_opregion_setup()
928 drm_dbg(&dev_priv->drm, "Public ACPI methods supported\n"); in intel_opregion_setup()
929 opregion->acpi = base + OPREGION_ACPI_OFFSET; in intel_opregion_setup()
936 opregion->acpi->chpd = 1; in intel_opregion_setup()
940 u8 major = opregion->header->over.major; in intel_opregion_setup()
943 drm_err(&dev_priv->drm, "SWSCI Mailbox #2 present for opregion v3.x, ignoring\n"); in intel_opregion_setup()
946 drm_dbg(&dev_priv->drm, "SWSCI Mailbox #2 present for opregion v2.x\n"); in intel_opregion_setup()
947 drm_dbg(&dev_priv->drm, "SWSCI supported\n"); in intel_opregion_setup()
948 opregion->swsci = base + OPREGION_SWSCI_OFFSET; in intel_opregion_setup()
954 drm_dbg(&dev_priv->drm, "ASLE supported\n"); in intel_opregion_setup()
955 opregion->asle = base + OPREGION_ASLE_OFFSET; in intel_opregion_setup()
957 opregion->asle->ardy = ASLE_ARDY_NOT_READY; in intel_opregion_setup()
961 drm_dbg(&dev_priv->drm, "ASLE extension supported\n"); in intel_opregion_setup()
962 opregion->asle_ext = base + OPREGION_ASLE_EXT_OFFSET; in intel_opregion_setup()
966 drm_dbg(&dev_priv->drm, "Mailbox #2 for backlight present\n"); in intel_opregion_setup()
975 if (opregion->header->over.major >= 2 && opregion->asle && in intel_opregion_setup()
976 opregion->asle->rvda && opregion->asle->rvds) { in intel_opregion_setup()
977 resource_size_t rvda = opregion->asle->rvda; in intel_opregion_setup()
985 if (opregion->header->over.major > 2 || in intel_opregion_setup()
986 opregion->header->over.minor >= 1) { in intel_opregion_setup()
987 drm_WARN_ON(&dev_priv->drm, rvda < OPREGION_SIZE); in intel_opregion_setup()
992 opregion->rvda = memremap(rvda, opregion->asle->rvds, in intel_opregion_setup()
995 vbt = opregion->rvda; in intel_opregion_setup()
996 vbt_size = opregion->asle->rvds; in intel_opregion_setup()
998 drm_dbg_kms(&dev_priv->drm, in intel_opregion_setup()
1000 opregion->vbt = vbt; in intel_opregion_setup()
1001 opregion->vbt_size = vbt_size; in intel_opregion_setup()
1004 drm_dbg_kms(&dev_priv->drm, in intel_opregion_setup()
1006 memunmap(opregion->rvda); in intel_opregion_setup()
1007 opregion->rvda = NULL; in intel_opregion_setup()
1013 * The VBT specification says that if the ASLE ext mailbox is not used in intel_opregion_setup()
1021 vbt_size -= OPREGION_VBT_OFFSET; in intel_opregion_setup()
1023 drm_dbg_kms(&dev_priv->drm, in intel_opregion_setup()
1024 "Found valid VBT in ACPI OpRegion (Mailbox #4)\n"); in intel_opregion_setup()
1025 opregion->vbt = vbt; in intel_opregion_setup()
1026 opregion->vbt_size = vbt_size; in intel_opregion_setup()
1028 drm_dbg_kms(&dev_priv->drm, in intel_opregion_setup()
1029 "Invalid VBT in ACPI OpRegion (Mailbox #4)\n"); in intel_opregion_setup()
1042 DRM_INFO("Using panel type from OpRegion on %s\n", id->ident); in intel_use_opregion_panel_type_callback()
1069 drm_dbg_kms(&dev_priv->drm, in intel_opregion_get_panel_type()
1071 return -EINVAL; in intel_opregion_get_panel_type()
1076 drm_dbg_kms(&dev_priv->drm, "No panel type in OpRegion\n"); in intel_opregion_get_panel_type()
1077 return -ENODEV; in intel_opregion_get_panel_type()
1086 drm_dbg_kms(&dev_priv->drm, in intel_opregion_get_panel_type()
1087 "Ignoring OpRegion panel type (%d)\n", ret - 1); in intel_opregion_get_panel_type()
1088 return -ENODEV; in intel_opregion_get_panel_type()
1091 return ret - 1; in intel_opregion_get_panel_type()
1095 * intel_opregion_get_edid - Fetch EDID from ACPI OpRegion mailbox #5
1098 * This reads the ACPI Opregion mailbox #5 to extract the EDID that is passed
1107 struct drm_connector *connector = &intel_connector->base; in intel_opregion_get_edid()
1108 struct drm_i915_private *i915 = to_i915(connector->dev); in intel_opregion_get_edid()
1109 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_get_edid()
1114 if (!opregion->asle_ext) in intel_opregion_get_edid()
1117 edid = opregion->asle_ext->bddc; in intel_opregion_get_edid()
1119 /* Validity corresponds to number of 128-byte blocks */ in intel_opregion_get_edid()
1120 len = (opregion->asle_ext->phed & ASLE_PHED_EDID_VALID_MASK) * 128; in intel_opregion_get_edid()
1127 drm_dbg_kms(&i915->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5)\n"); in intel_opregion_get_edid()
1137 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_headless_sku()
1138 struct opregion_header *header = opregion->header; in intel_opregion_headless_sku()
1140 if (!header || header->over.major < 2 || in intel_opregion_headless_sku()
1141 (header->over.major == 2 && header->over.minor < 3)) in intel_opregion_headless_sku()
1144 return opregion->header->pcon & PCON_HEADLESS_SKU; in intel_opregion_headless_sku()
1149 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_register()
1151 if (!opregion->header) in intel_opregion_register()
1154 if (opregion->acpi) { in intel_opregion_register()
1155 opregion->acpi_notifier.notifier_call = in intel_opregion_register()
1157 register_acpi_notifier(&opregion->acpi_notifier); in intel_opregion_register()
1165 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_resume_display()
1167 if (opregion->acpi) { in intel_opregion_resume_display()
1176 opregion->acpi->csts = 0; in intel_opregion_resume_display()
1177 opregion->acpi->drdy = 1; in intel_opregion_resume_display()
1180 if (opregion->asle) { in intel_opregion_resume_display()
1181 opregion->asle->tche = ASLE_TCHE_BLC_EN; in intel_opregion_resume_display()
1182 opregion->asle->ardy = ASLE_ARDY_READY; in intel_opregion_resume_display()
1191 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_resume()
1193 if (!opregion->header) in intel_opregion_resume()
1204 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_suspend_display()
1206 if (opregion->asle) in intel_opregion_suspend_display()
1207 opregion->asle->ardy = ASLE_ARDY_NOT_READY; in intel_opregion_suspend_display()
1209 cancel_work_sync(&i915->display.opregion.asle_work); in intel_opregion_suspend_display()
1211 if (opregion->acpi) in intel_opregion_suspend_display()
1212 opregion->acpi->drdy = 0; in intel_opregion_suspend_display()
1217 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_suspend()
1219 if (!opregion->header) in intel_opregion_suspend()
1230 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_unregister()
1234 if (!opregion->header) in intel_opregion_unregister()
1237 if (opregion->acpi_notifier.notifier_call) { in intel_opregion_unregister()
1238 unregister_acpi_notifier(&opregion->acpi_notifier); in intel_opregion_unregister()
1239 opregion->acpi_notifier.notifier_call = NULL; in intel_opregion_unregister()
1245 struct intel_opregion *opregion = &i915->display.opregion; in intel_opregion_cleanup()
1247 if (!opregion->header) in intel_opregion_cleanup()
1251 memunmap(opregion->header); in intel_opregion_cleanup()
1252 if (opregion->rvda) { in intel_opregion_cleanup()
1253 memunmap(opregion->rvda); in intel_opregion_cleanup()
1254 opregion->rvda = NULL; in intel_opregion_cleanup()
1256 if (opregion->vbt_firmware) { in intel_opregion_cleanup()
1257 kfree(opregion->vbt_firmware); in intel_opregion_cleanup()
1258 opregion->vbt_firmware = NULL; in intel_opregion_cleanup()
1260 opregion->header = NULL; in intel_opregion_cleanup()
1261 opregion->acpi = NULL; in intel_opregion_cleanup()
1262 opregion->swsci = NULL; in intel_opregion_cleanup()
1263 opregion->asle = NULL; in intel_opregion_cleanup()
1264 opregion->asle_ext = NULL; in intel_opregion_cleanup()
1265 opregion->vbt = NULL; in intel_opregion_cleanup()
1266 opregion->lid_state = NULL; in intel_opregion_cleanup()