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)
274 struct intel_opregion *opregion = display->opregion; in check_swsci_function()
279 return -ENODEV; in check_swsci_function()
281 swsci = opregion->swsci; in check_swsci_function()
283 return -ENODEV; in check_swsci_function()
292 if ((opregion->swsci_sbcb_sub_functions & in check_swsci_function()
294 return -EINVAL; in check_swsci_function()
296 if ((opregion->swsci_gbda_sub_functions & in check_swsci_function()
298 return -EINVAL; in check_swsci_function()
308 struct pci_dev *pdev = to_pci_dev(display->drm->dev); in swsci()
317 swsci = display->opregion->swsci; in swsci()
320 dslp = swsci->dslp; in swsci()
333 scic = swsci->scic; in swsci()
335 drm_dbg(display->drm, "SWSCI request already in progress\n"); in swsci()
336 return -EBUSY; in swsci()
341 swsci->parm = parm; in swsci()
342 swsci->scic = scic; in swsci()
357 #define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0) in swsci()
359 drm_dbg(display->drm, "SWSCI request timed out\n"); in swsci()
360 return -ETIMEDOUT; in swsci()
368 drm_dbg(display->drm, "SWSCI request error %u\n", scic); in swsci()
369 return -EIO; in swsci()
373 *parm_out = swsci->parm; in swsci()
403 if (encoder->type == INTEL_OUTPUT_DSI) in intel_opregion_notify_encoder()
406 port = encoder->port; in intel_opregion_notify_encoder()
416 * The port numbering and mapping here is bizarre. The now-obsolete in intel_opregion_notify_encoder()
423 drm_dbg_kms(display->drm, in intel_opregion_notify_encoder()
425 encoder->base.base.id, encoder->base.name, in intel_opregion_notify_encoder()
426 port_name(encoder->port), port); in intel_opregion_notify_encoder()
427 return -EINVAL; in intel_opregion_notify_encoder()
433 switch (encoder->type) { in intel_opregion_notify_encoder()
448 drm_WARN_ONCE(display->drm, 1, in intel_opregion_notify_encoder()
450 encoder->type); in intel_opregion_notify_encoder()
451 return -EINVAL; in intel_opregion_notify_encoder()
484 return -EINVAL; in intel_opregion_notify_adapter()
491 struct opregion_asle *asle = display->opregion->asle; in asle_set_backlight()
493 drm_dbg(display->drm, "bclp = 0x%08x\n", bclp); in asle_set_backlight()
496 drm_dbg_kms(display->drm, in asle_set_backlight()
508 drm_modeset_lock(&display->drm->mode_config.connection_mutex, NULL); in asle_set_backlight()
514 drm_dbg_kms(display->drm, "updating opregion backlight %d/255\n", in asle_set_backlight()
516 drm_connector_list_iter_begin(display->drm, &conn_iter); in asle_set_backlight()
518 intel_backlight_set_acpi(connector->base.state, bclp, 255); in asle_set_backlight()
520 asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID; in asle_set_backlight()
522 drm_modeset_unlock(&display->drm->mode_config.connection_mutex); in asle_set_backlight()
531 range, 0xffff indicates above sensor range. 1-0xfffe are valid */ in asle_set_als_illum()
532 drm_dbg(display->drm, "Illum is not supported\n"); in asle_set_als_illum()
538 drm_dbg(display->drm, "PWM freq is not supported\n"); in asle_set_pwm_freq()
546 drm_dbg(display->drm, "Pfit is not supported\n"); in asle_set_pfit()
552 drm_dbg(display->drm, "SROT is not supported\n"); in asle_set_supported_rotation_angles()
559 drm_dbg(display->drm, in asle_set_button_array()
562 drm_dbg(display->drm, in asle_set_button_array()
565 drm_dbg(display->drm, in asle_set_button_array()
568 drm_dbg(display->drm, in asle_set_button_array()
571 drm_dbg(display->drm, in asle_set_button_array()
574 drm_dbg(display->drm, in asle_set_button_array()
583 drm_dbg(display->drm, in asle_set_convertible()
586 drm_dbg(display->drm, in asle_set_convertible()
595 drm_dbg(display->drm, "Docking is not supported (docked)\n"); in asle_set_docking()
597 drm_dbg(display->drm, in asle_set_docking()
605 drm_dbg(display->drm, "ISCT is not supported\n"); in asle_isct_state()
613 struct intel_display *display = opregion->display; in asle_work()
614 struct opregion_asle *asle = opregion->asle; in asle_work()
621 aslc_req = asle->aslc; in asle_work()
624 drm_dbg(display->drm, in asle_work()
630 aslc_stat |= asle_set_als_illum(display, asle->alsi); in asle_work()
633 aslc_stat |= asle_set_backlight(display, asle->bclp); in asle_work()
636 aslc_stat |= asle_set_pfit(display, asle->pfit); in asle_work()
639 aslc_stat |= asle_set_pwm_freq(display, asle->pfmb); in asle_work()
643 asle->srot); in asle_work()
646 aslc_stat |= asle_set_button_array(display, asle->iuer); in asle_work()
649 aslc_stat |= asle_set_convertible(display, asle->iuer); in asle_work()
652 aslc_stat |= asle_set_docking(display, asle->iuer); in asle_work()
657 asle->aslc = aslc_stat; in asle_work()
662 return display->opregion && display->opregion->asle; in intel_opregion_asle_present()
667 struct drm_i915_private *i915 = to_i915(display->drm); in intel_opregion_asle_intr()
668 struct intel_opregion *opregion = display->opregion; in intel_opregion_asle_intr()
670 if (opregion && opregion->asle) in intel_opregion_asle_intr()
671 queue_work(i915->unordered_wq, &opregion->asle_work); in intel_opregion_asle_intr()
692 if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) in intel_opregion_video_event()
695 acpi = opregion->acpi; in intel_opregion_video_event()
697 if (event->type == 0x80 && ((acpi->cevt & 1) == 0)) in intel_opregion_video_event()
700 acpi->csts = 0; in intel_opregion_video_event()
713 if (i < ARRAY_SIZE(opregion->acpi->didl)) { in set_did()
714 opregion->acpi->didl[i] = val; in set_did()
716 i -= ARRAY_SIZE(opregion->acpi->didl); in set_did()
718 if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2))) in set_did()
721 opregion->acpi->did2[i] = val; in set_did()
727 struct intel_opregion *opregion = display->opregion; in intel_didl_outputs()
739 max_outputs = ARRAY_SIZE(opregion->acpi->didl) + in intel_didl_outputs()
740 ARRAY_SIZE(opregion->acpi->did2); in intel_didl_outputs()
744 drm_connector_list_iter_begin(display->drm, &conn_iter); in intel_didl_outputs()
747 set_did(opregion, i, connector->acpi_device_id); in intel_didl_outputs()
752 drm_dbg_kms(display->drm, "%d outputs detected\n", i); in intel_didl_outputs()
755 drm_err(display->drm, in intel_didl_outputs()
766 struct intel_opregion *opregion = display->opregion; in intel_setup_cadls()
781 drm_connector_list_iter_begin(display->drm, &conn_iter); in intel_setup_cadls()
783 if (i >= ARRAY_SIZE(opregion->acpi->cadl)) in intel_setup_cadls()
785 opregion->acpi->cadl[i++] = connector->acpi_device_id; in intel_setup_cadls()
790 if (i < ARRAY_SIZE(opregion->acpi->cadl)) in intel_setup_cadls()
791 opregion->acpi->cadl[i] = 0; in intel_setup_cadls()
796 struct intel_opregion *opregion = display->opregion; in swsci_setup()
800 /* Sub-function code 0 is okay, let's allow them. */ in swsci_setup()
801 opregion->swsci_gbda_sub_functions = 1; in swsci_setup()
802 opregion->swsci_sbcb_sub_functions = 1; in swsci_setup()
806 /* make the bits match the sub-function codes */ in swsci_setup()
808 opregion->swsci_gbda_sub_functions |= tmp; in swsci_setup()
817 /* here, the bits already match sub-function codes */ in swsci_setup()
818 opregion->swsci_sbcb_sub_functions |= tmp; in swsci_setup()
828 /* make the bits match the sub-function codes */ in swsci_setup()
835 u32 req = opregion->swsci_sbcb_sub_functions; in swsci_setup()
837 drm_dbg(display->drm, in swsci_setup()
841 /* opregion->swsci_sbcb_sub_functions &= tmp; */ in swsci_setup()
843 opregion->swsci_sbcb_sub_functions |= tmp; in swsci_setup()
847 drm_dbg(display->drm, in swsci_setup()
849 opregion->swsci_gbda_sub_functions, in swsci_setup()
850 opregion->swsci_sbcb_sub_functions); in swsci_setup()
856 "VBIOS ROM for %s\n", id->ident); in intel_no_opregion_vbt_callback()
875 struct pci_dev *pdev = to_pci_dev(display->drm->dev); in intel_opregion_setup()
890 drm_dbg(display->drm, "graphic opregion physical addr: 0x%x\n", in intel_opregion_setup()
893 drm_dbg(display->drm, "ACPI OpRegion not supported!\n"); in intel_opregion_setup()
894 return -ENOTSUPP; in intel_opregion_setup()
899 return -ENOMEM; in intel_opregion_setup()
901 opregion->display = display; in intel_opregion_setup()
902 display->opregion = opregion; in intel_opregion_setup()
904 INIT_WORK(&opregion->asle_work, asle_work); in intel_opregion_setup()
908 err = -ENOMEM; in intel_opregion_setup()
915 drm_dbg(display->drm, "opregion signature mismatch\n"); in intel_opregion_setup()
916 err = -EINVAL; in intel_opregion_setup()
919 opregion->header = base; in intel_opregion_setup()
921 drm_dbg(display->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(display->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(display->drm, "SWSCI Mailbox #2 present for opregion v3.x, ignoring\n"); in intel_opregion_setup()
946 drm_dbg(display->drm, "SWSCI Mailbox #2 present for opregion v2.x\n"); in intel_opregion_setup()
947 drm_dbg(display->drm, "SWSCI supported\n"); in intel_opregion_setup()
948 opregion->swsci = base + OPREGION_SWSCI_OFFSET; in intel_opregion_setup()
954 drm_dbg(display->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(display->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(display->drm, "Mailbox #2 for backlight present\n"); in intel_opregion_setup()
972 if (opregion->header->over.major >= 2 && opregion->asle && in intel_opregion_setup()
973 opregion->asle->rvda && opregion->asle->rvds) { in intel_opregion_setup()
974 resource_size_t rvda = opregion->asle->rvda; in intel_opregion_setup()
982 if (opregion->header->over.major > 2 || in intel_opregion_setup()
983 opregion->header->over.minor >= 1) { in intel_opregion_setup()
984 drm_WARN_ON(display->drm, rvda < OPREGION_SIZE); in intel_opregion_setup()
989 opregion->rvda = memremap(rvda, opregion->asle->rvds, in intel_opregion_setup()
992 vbt = opregion->rvda; in intel_opregion_setup()
993 vbt_size = opregion->asle->rvds; in intel_opregion_setup()
995 drm_dbg_kms(display->drm, in intel_opregion_setup()
997 opregion->vbt = vbt; in intel_opregion_setup()
998 opregion->vbt_size = vbt_size; in intel_opregion_setup()
1001 drm_dbg_kms(display->drm, in intel_opregion_setup()
1003 memunmap(opregion->rvda); in intel_opregion_setup()
1004 opregion->rvda = NULL; in intel_opregion_setup()
1010 * The VBT specification says that if the ASLE ext mailbox is not used in intel_opregion_setup()
1018 vbt_size -= OPREGION_VBT_OFFSET; in intel_opregion_setup()
1020 drm_dbg_kms(display->drm, in intel_opregion_setup()
1021 "Found valid VBT in ACPI OpRegion (Mailbox #4)\n"); in intel_opregion_setup()
1022 opregion->vbt = vbt; in intel_opregion_setup()
1023 opregion->vbt_size = vbt_size; in intel_opregion_setup()
1025 drm_dbg_kms(display->drm, in intel_opregion_setup()
1026 "Invalid VBT in ACPI OpRegion (Mailbox #4)\n"); in intel_opregion_setup()
1036 display->opregion = NULL; in intel_opregion_setup()
1043 DRM_INFO("Using panel type from OpRegion on %s\n", id->ident); in intel_use_opregion_panel_type_callback()
1070 drm_dbg_kms(display->drm, in intel_opregion_get_panel_type()
1072 return -EINVAL; in intel_opregion_get_panel_type()
1077 drm_dbg_kms(display->drm, "No panel type in OpRegion\n"); in intel_opregion_get_panel_type()
1078 return -ENODEV; in intel_opregion_get_panel_type()
1087 drm_dbg_kms(display->drm, in intel_opregion_get_panel_type()
1088 "Ignoring OpRegion panel type (%d)\n", ret - 1); in intel_opregion_get_panel_type()
1089 return -ENODEV; in intel_opregion_get_panel_type()
1092 return ret - 1; in intel_opregion_get_panel_type()
1096 * intel_opregion_get_edid - Fetch EDID from ACPI OpRegion mailbox #5
1099 * This reads the ACPI Opregion mailbox #5 to extract the EDID that is passed
1109 struct intel_opregion *opregion = display->opregion; in intel_opregion_get_edid()
1114 if (!opregion || !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(display->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5)\n"); in intel_opregion_get_edid()
1137 struct intel_opregion *opregion = display->opregion; in intel_opregion_vbt_present()
1139 if (!opregion || !opregion->vbt) in intel_opregion_vbt_present()
1147 struct intel_opregion *opregion = display->opregion; in intel_opregion_get_vbt()
1149 if (!opregion || !opregion->vbt) in intel_opregion_get_vbt()
1153 *size = opregion->vbt_size; in intel_opregion_get_vbt()
1155 return kmemdup(opregion->vbt, opregion->vbt_size, GFP_KERNEL); in intel_opregion_get_vbt()
1160 struct intel_opregion *opregion = display->opregion; in intel_opregion_headless_sku()
1166 header = opregion->header; in intel_opregion_headless_sku()
1168 if (!header || header->over.major < 2 || in intel_opregion_headless_sku()
1169 (header->over.major == 2 && header->over.minor < 3)) in intel_opregion_headless_sku()
1172 return opregion->header->pcon & PCON_HEADLESS_SKU; in intel_opregion_headless_sku()
1177 struct intel_opregion *opregion = display->opregion; in intel_opregion_register()
1182 if (opregion->acpi) { in intel_opregion_register()
1183 opregion->acpi_notifier.notifier_call = in intel_opregion_register()
1185 register_acpi_notifier(&opregion->acpi_notifier); in intel_opregion_register()
1193 struct intel_opregion *opregion = display->opregion; in intel_opregion_resume_display()
1195 if (opregion->acpi) { in intel_opregion_resume_display()
1204 opregion->acpi->csts = 0; in intel_opregion_resume_display()
1205 opregion->acpi->drdy = 1; in intel_opregion_resume_display()
1208 if (opregion->asle) { in intel_opregion_resume_display()
1209 opregion->asle->tche = ASLE_TCHE_BLC_EN; in intel_opregion_resume_display()
1210 opregion->asle->ardy = ASLE_ARDY_READY; in intel_opregion_resume_display()
1219 struct intel_opregion *opregion = display->opregion; in intel_opregion_resume()
1232 struct intel_opregion *opregion = display->opregion; in intel_opregion_suspend_display()
1234 if (opregion->asle) in intel_opregion_suspend_display()
1235 opregion->asle->ardy = ASLE_ARDY_NOT_READY; in intel_opregion_suspend_display()
1237 cancel_work_sync(&opregion->asle_work); in intel_opregion_suspend_display()
1239 if (opregion->acpi) in intel_opregion_suspend_display()
1240 opregion->acpi->drdy = 0; in intel_opregion_suspend_display()
1245 struct intel_opregion *opregion = display->opregion; in intel_opregion_suspend()
1258 struct intel_opregion *opregion = display->opregion; in intel_opregion_unregister()
1265 if (opregion->acpi_notifier.notifier_call) { in intel_opregion_unregister()
1266 unregister_acpi_notifier(&opregion->acpi_notifier); in intel_opregion_unregister()
1267 opregion->acpi_notifier.notifier_call = NULL; in intel_opregion_unregister()
1273 struct intel_opregion *opregion = display->opregion; in intel_opregion_cleanup()
1278 memunmap(opregion->header); in intel_opregion_cleanup()
1279 if (opregion->rvda) in intel_opregion_cleanup()
1280 memunmap(opregion->rvda); in intel_opregion_cleanup()
1282 display->opregion = NULL; in intel_opregion_cleanup()
1287 struct intel_display *display = m->private; in intel_opregion_show()
1288 struct intel_opregion *opregion = display->opregion; in intel_opregion_show()
1291 seq_write(m, opregion->header, OPREGION_SIZE); in intel_opregion_show()
1300 struct drm_minor *minor = display->drm->primary; in intel_opregion_debugfs_register()
1302 debugfs_create_file("i915_opregion", 0444, minor->debugfs_root, in intel_opregion_debugfs_register()