[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