[PATCH 0/2] HD-audio HDMI regression fixes with VGA-switcheroo

Takashi Iwai tiwai at suse.de
Fri Jun 8 23:51:23 PDT 2012


At Fri, 08 Jun 2012 22:17:29 +0200,
Jörg-Volker Peetz wrote:
> 
> Takashi Iwai wrote, on 06/08/12 17:52:
> > At Fri, 08 Jun 2012 17:45:17 +0200,
> > Jörg-Volker Peetz wrote:
> >>
> >> Hello Takashi,
> >>
> >> Takashi Iwai wrote, on 06/08/12 15:03:
> >>> At Fri, 08 Jun 2012 13:26:57 +0200,
> >>> Jörg-Volker Peetz wrote:
> >>>>
> >>>> Takashi Iwai wrote, on 06/07/12 12:15:
> >>>>> Hi,
> >>>>>
> >>>>> this is a series of patches to fix the regressions of HD-audio HDMI
> >>>>> on D-GPUs in 3.5-rc1 due to the support of VGA-switcheroo audio clients.
> >>>>>
> >>>>> The first patch adds a new helper function to vga-switcheroo and the
> >>>>> second just uses that instead of an open code.
> >>>>>
> >>>>> Dave, if the first patch is OK, I'm going to apply it though sound tree.
> >>>>> Let me know if any problem is found.
> >>>>>
> >>>>> Joerg, could you check whether this doesn't break your setup, too?
> >>>>>
> >>>>>
> >>>>> thanks,
> >>>>>
> >>>>> Takashi
> >>>>
> >>>> Hello Takashi,
> >>>>
> >>>> I applied both your patches on 3.5-rc1. With this kernel I made three tests.
> >>>> 1) After booting I switched off the discrete GPU via vga_switcheroo.
> >>>>    Then ca. 210 times the message
> >>>>
> >>>>      hda-intel: spurious response 0x0:0x0, last cmd=0x170503
> >>>>
> >>>>    appears on the console and in the logs.
> >>>>    Starting X and using the built-in USB web-cam work, as well as sound with
> >>>>    mplayer2 works.
> >>>>
> >>>> 2) After booting I switched to the discrete GPU via
> >>>>
> >>>>      echo -n DDIS > /sys/kernel/debugfs/vgaswitcheroo/switch
> >>>>
> >>>>    Then I started X via startx. The desktop screen appears but the system
> >>>>    freezes. No reaction on keyboard or touchpad input. The computer is not
> >>>>    reachable via ethernet wire.
> >>>
> >>> Hm, these issues aren't seen on 3.5-rc1 before my patches?
> >>> If so, we need to fix now.
> >>>
> >> No, these issues aren't seen on 3.5-rc1 without your patches. I'm able to start
> >> X with the discrete GPU in use, direct rendering and the built-in USB camera work.
> > 
> > OK, it means that the switching from the audio-ON to audio-OFF doesn't
> > work.  Could you try the patch below in additon?
> > 
> 
> Applying all your three patches on 3.5-rc1 makes the discrete GPU work on my
> system: after mounting debugfs and switching to "DDIS", I can start X and direct
> rendering, sound and built-in USB camera work.

Good to hear.
Dave, is it OK to apply the patch below through sound tree?


thanks,

Takashi

---
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] vga_switcheroo: Enable/disable audio clients at the right time

The audio clients have to be disabled before disabling the VGA and
switching.  Similarly, enabling the audio client should be done at
last.  Otherwise the audio-side operation stalls, eventually leading
to Oops or lockups.

Tested-by: Jörg-Volker Peetz <jvpeetz at web.de>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 drivers/gpu/vga/vga_switcheroo.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
index 38f9534..e24ad99 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
@@ -291,8 +291,6 @@ static int vga_switchto_stage1(struct vga_switcheroo_client *new_client)
 		vga_switchon(new_client);
 
 	vga_set_default_device(new_client->pdev);
-	set_audio_state(new_client->id, VGA_SWITCHEROO_ON);
-
 	return 0;
 }
 
@@ -308,6 +306,8 @@ static int vga_switchto_stage2(struct vga_switcheroo_client *new_client)
 
 	active->active = false;
 
+	set_audio_state(active->id, VGA_SWITCHEROO_OFF);
+
 	if (new_client->fb_info) {
 		struct fb_event event;
 		event.info = new_client->fb_info;
@@ -321,11 +321,11 @@ static int vga_switchto_stage2(struct vga_switcheroo_client *new_client)
 	if (new_client->ops->reprobe)
 		new_client->ops->reprobe(new_client->pdev);
 
-	set_audio_state(active->id, VGA_SWITCHEROO_OFF);
-
 	if (active->pwr_state == VGA_SWITCHEROO_ON)
 		vga_switchoff(active);
 
+	set_audio_state(new_client->id, VGA_SWITCHEROO_ON);
+
 	new_client->active = true;
 	return 0;
 }
@@ -371,8 +371,9 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
 	/* pwr off the device not in use */
 	if (strncmp(usercmd, "OFF", 3) == 0) {
 		list_for_each_entry(client, &vgasr_priv.clients, list) {
-			if (client->active)
+			if (client->active || client_is_audio(client))
 				continue;
+			set_audio_state(client->id, VGA_SWITCHEROO_OFF);
 			if (client->pwr_state == VGA_SWITCHEROO_ON)
 				vga_switchoff(client);
 		}
@@ -381,10 +382,11 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
 	/* pwr on the device not in use */
 	if (strncmp(usercmd, "ON", 2) == 0) {
 		list_for_each_entry(client, &vgasr_priv.clients, list) {
-			if (client->active)
+			if (client->active || client_is_audio(client))
 				continue;
 			if (client->pwr_state == VGA_SWITCHEROO_OFF)
 				vga_switchon(client);
+			set_audio_state(client->id, VGA_SWITCHEROO_ON);
 		}
 		goto out;
 	}
-- 
1.7.10.4



More information about the dri-devel mailing list