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

Takashi Iwai tiwai at suse.de
Fri Jun 8 08:52:39 PDT 2012


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?

> Probably unrelated: in both cases I'm unable to lower the screen brightness from
> highest value. Without your patches it appears a warning:
> 
>   ACPI Warning: _BQC returned an invalid level (20120320/video-472)

Hmm, I see no relation between this and the HDMI audio part.
It's of course possible that some non-working state gives
side-effects...


thanks,

Takashi

---
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
index eb4f64f..5b3c7d1 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
@@ -304,8 +304,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;
 }
 
@@ -321,6 +319,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;
@@ -334,11 +334,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;
 }
@@ -384,8 +384,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);
 		}
@@ -394,10 +395,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;
 	}


More information about the dri-devel mailing list