drm/i915/opregion updates
Subsystems (2)
cover drm/i915/opregion updates
Hi all, here's a few updates to opregion. Patches 1-4 should be pretty trivial and not do anything drastic. Patch 5 starts using the extended DIDL, but I doubt it will make a huge difference anyway. It might prove to be useful prep stuff for adding more sense to our CADL handling.
BR,
Jani.
Jani Nikula (5):
drm/i915/opregion: use BUILD_BUG_ON to verify mailbox struct sizes drm/i915/opregion: add new opregion stuff drm/i915/opregion: prefer DRM logging functions over pr_warn and
dev_dbg
drm/i915/opregion: abstract didl and did2 getter and setter drm/i915/opregion: start using extended didl
drivers/gpu/drm/i915/intel_opregion.c | 104 +++++++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 26 deletions(-)
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 1/5 drm/i915/opregion: use BUILD_BUG_ON to verify mailbox struct sizes
--- drivers/gpu/drm/i915/intel_opregion.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/i915/intel_opregion.c +5 -0
@@ -864,6 +864,11 @@ int intel_opregion_setup(struct drm_device *dev)char buf[sizeof (OPREGION_SIGNATURE )];int err =0 ; +BUILD_BUG_ON (sizeof (struct opregion_header ) !=0x100 ); +BUILD_BUG_ON (sizeof (struct opregion_acpi ) !=0x100 ); +BUILD_BUG_ON (sizeof (struct opregion_swsci ) !=0x100 ); +BUILD_BUG_ON (sizeof (struct opregion_asle ) !=0x100 ); +pci_read_config_dword (dev->pdev,PCI_ASLS , &asls);DRM_DEBUG_DRIVER ("graphic opregion physical addr: 0x%x\n" , asls);if (asls ==0 ) {
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 2/5 drm/i915/opregion: add new opregion stuff
In reply to Jani NikulaInluding extended didl and cpdl fields
Present since opregion version 3.0.
--- drivers/gpu/drm/i915/intel_opregion.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_opregion.c +12 -3
@@ -53,6 +53,7 @@#define MBOX_ACPI (1<<0)#define MBOX_SWSCI (1<<1)#define MBOX_ASLE (1<<2) +#define MBOX_ASLE_EXT (1<<4)struct opregion_header {u8 signature[16 ];
@@ -62,7 +63,10 @@ struct opregion_header {u8 vbios_ver[16 ];u8 driver_ver[16 ];u32 mboxes; -u8 reserved[164 ]; +u32 driver_model; +u32 pcon; +u8 dver[32 ]; +u8 rsvd[124 ]; } __packed;/* OpRegion mailbox #1: public ACPI methods */
@@ -84,7 +88,9 @@ struct opregion_acpi {u32 evts;/* ASL supported events */ u32 cnot;/* current OS notification */ u32 nrdy;/* driver status */ -u8 rsvd2[60 ]; +u32 did2[7 ];/* extended supported display devices ID list */ +u32 cpd2[7 ];/* extended attached display devices list */ +u8 rsvd2[4 ]; } __packed;/* OpRegion mailbox #2: SWSCI */
@@ -113,7 +119,10 @@ struct opregion_asle {u32 pcft;/* power conservation features */ u32 srot;/* supported rotation angles */ u32 iuer;/* IUER events */ -u8 rsvd[86 ]; +u64 fdss; +u32 fdsp; +u32 stat; +u8 rsvd[70 ]; } __packed;/* Driver readiness indicator */
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 3/5 drm/i915/opregion: prefer DRM logging functions over pr_warn and dev_dbg
In reply to Jani NikulaConform to same style as the rest of the driver.
--- drivers/gpu/drm/i915/intel_opregion.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/intel_opregion.c +3 -7
@@ -25,8 +25,6 @@* */ -#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt -#include <linux/acpi.h> #include <acpi/video.h>
@@ -658,14 +656,13 @@ static void intel_didl_outputs(struct drm_device *dev) }if (!acpi_video_bus) { -pr_warn ("No ACPI video bus found\n" ); +DRM_ERROR ("No ACPI video bus found\n" );return ; }list_for_each_entry (acpi_cdev, &acpi_video_bus->children, node) {if (i >=8 ) { -dev_dbg (&dev->pdev->dev, -"More than 8 outputs detected via ACPI\n" ); +DRM_DEBUG_KMS ("More than 8 outputs detected via ACPI\n" );return ; } status =
@@ -691,8 +688,7 @@ blind_set:list_for_each_entry (connector, &dev->mode_config.connector_list, head) {int output_type =ACPI_OTHER_OUTPUT ;if (i >=8 ) { -dev_dbg (&dev->pdev->dev, -"More than 8 outputs in connector list\n" ); +DRM_DEBUG_KMS ("More than 8 outputs in connector list\n" );return ; }switch (connector->connector_type) {
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 4/5 drm/i915/opregion: abstract didl and did2 getter and setter
In reply to Jani NikulaMake it easier to handle the extended didl. No functional changes.
--- drivers/gpu/drm/i915/intel_opregion.c | 50 +++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 11 deletions(-)
drivers/gpu/drm/i915/intel_opregion.c +39 -11
@@ -628,6 +628,38 @@ static struct notifier_block intel_opregion_notifier = {* (version 3) */ +static u32 get_did (struct intel_opregion *opregion,int i) +{ +u32 did; + +if (i <ARRAY_SIZE (opregion->acpi->didl)) { + did =ioread32 (&opregion->acpi->didl[i]); + }else { + i -=ARRAY_SIZE (opregion->acpi->didl); + +if (WARN_ON (i >=ARRAY_SIZE (opregion->acpi->did2))) +return 0 ; + + did =ioread32 (&opregion->acpi->did2[i]); + } + +return did; +} + +static void set_did (struct intel_opregion *opregion,int i,u32 val) +{ +if (i <ARRAY_SIZE (opregion->acpi->didl)) { +iowrite32 (val, &opregion->acpi->didl[i]); + }else { + i -=ARRAY_SIZE (opregion->acpi->didl); + +if (WARN_ON (i >=ARRAY_SIZE (opregion->acpi->did2))) +return ; + +iowrite32 (val, &opregion->acpi->did2[i]); + } +} +static void intel_didl_outputs (struct drm_device *dev) {struct drm_i915_private *dev_priv = dev->dev_private;
@@ -665,22 +697,19 @@ static void intel_didl_outputs(struct drm_device *dev)DRM_DEBUG_KMS ("More than 8 outputs detected via ACPI\n" );return ; } - status = -acpi_evaluate_integer (acpi_cdev->handle,"_ADR" , -NULL , &device_id); + status =acpi_evaluate_integer (acpi_cdev->handle,"_ADR" , +NULL , &device_id);if (ACPI_SUCCESS (status)) {if (!device_id) goto blind_set; -iowrite32 ((u32)(device_id &0x0f0f ), - &opregion->acpi->didl[i]); - i++; +set_did (opregion, i++, (u32)(device_id &0x0f0f )); } } end:/* If fewer than 8 outputs, the list must be null terminated */ if (i <8 ) -iowrite32 (0 , &opregion->acpi->didl[i]); +set_did (opregion, i,0 );return ; blind_set:
@@ -713,9 +742,8 @@ blind_set: output_type =ACPI_LVDS_OUTPUT ;break ; } - temp =ioread32 (&opregion->acpi->didl[i]); -iowrite32 (temp | (1 <<31 ) | output_type | i, - &opregion->acpi->didl[i]); + temp =get_did (opregion, i); +set_did (opregion, i, temp | (1 <<31 ) | output_type | i); i++; } goto end;
@@ -735,7 +763,7 @@ static void intel_setup_cadls(struct drm_device *dev)* display switching hotkeys. Just like DIDL, CADL is NULL-terminated if * there are less than eight devices. */ do { - disp_id =ioread32 (&opregion->acpi->didl[i]); + disp_id =get_did (opregion, i);iowrite32 (disp_id, &opregion->acpi->cadl[i]); }while (++i <8 && disp_id !=0 ); }
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 5/5 drm/i915/opregion: start using extended didl
In reply to Jani NikulaAdding support for did2, or the extended support display devices ID list, increases the total to 15.
--- drivers/gpu/drm/i915/intel_opregion.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/intel_opregion.c +21 -7
@@ -669,7 +669,7 @@ static void intel_didl_outputs(struct drm_device *dev)struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus =NULL ;unsigned long long device_id;acpi_status status; -u32 temp; +u32 temp, max_outputs;int i =0 ; handle =ACPI_HANDLE (&dev->pdev->dev);
@@ -692,9 +692,20 @@ static void intel_didl_outputs(struct drm_device *dev)return ; } +/* +* In theory, did2, the extended didl, gets added at opregion version +* 3.0. In practice, however, we're supposed to set it for earlier +* versions as well, since a BIOS that doesn't understand did2 should +* not look at it anyway. Use a variable so we can tweak this if a need +* arises later. +*/ + max_outputs =ARRAY_SIZE (opregion->acpi->didl) + +ARRAY_SIZE (opregion->acpi->did2); +list_for_each_entry (acpi_cdev, &acpi_video_bus->children, node) { -if (i >=8 ) { -DRM_DEBUG_KMS ("More than 8 outputs detected via ACPI\n" ); +if (i >= max_outputs) { +DRM_DEBUG_KMS ("More than %u outputs detected via ACPI\n" , + max_outputs);return ; } status = acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
@@ -707,8 +718,10 @@ static void intel_didl_outputs(struct drm_device *dev) } end: -/* If fewer than 8 outputs, the list must be null terminated */ -if (i <8 ) +DRM_DEBUG_KMS ("%d outputs detected\n" , i); + +/* If fewer than max outputs, the list must be null terminated */ +if (i < max_outputs)set_did (opregion, i,0 );return ;
@@ -716,8 +729,9 @@ blind_set: i =0 ;list_for_each_entry (connector, &dev->mode_config.connector_list, head) {int output_type =ACPI_OTHER_OUTPUT ; -if (i >=8 ) { -DRM_DEBUG_KMS ("More than 8 outputs in connector list\n" ); +if (i >= max_outputs) { +DRM_DEBUG_KMS ("More than %u outputs in connector list\n" , + max_outputs);return ; }switch (connector->connector_type) {
Signature · 6 lines
2.1.3 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH 5/5] drm/i915/opregion: start using extended didl
-------------------------------------Summary-------------------------------------
Platform Delta drm-intel-nightly Series Applied
PNV 364/364 364/364
ILK +1-3 364/366 362/366
SNB 448/450 448/450 IVB 497/498 497/498 BYT 289/289 289/289 HSW 563/564 563/564 BDW 417/417 417/417 -------------------------------------Detailed------------------------------------- Platform Test drm-intel-nightly Series Applied *ILK igt_kms_setmode_invalid-clone-exclusive-crtc PASS(6, M26) DMESG_WARN(1, M26) *ILK igt_kms_flip_plain-flip-fb-recreate-interruptible DMESG_WARN(1, M26)PASS(4, M26) NSPT(1, M26) ILK igt_kms_flip_rcs-flip-vs-modeset NSPT(1, M26)PASS(5, M26) NSPT(1, M26) ILK igt_kms_flip_wf_vblank-ts-check DMESG_WARN(7, M26)PASS(26, M26M37) PASS(1, M26)
Note: You need to pay more attention to line start with '*'
_______________________________________________
Intel-gfx mailing list [email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx