Re: snd_hda_codec_cirrus kernel oops

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hey Takashi,

On 19-05-2023 09:12, Takashi Iwai wrote:
On Thu, 18 May 2023 17:11:53 +0200,
Olliver Schinagl wrote:

Hey Takashi,

On 18-05-2023 16:27, Takashi Iwai wrote:
On Thu, 18 May 2023 16:24:02 +0200,
Olliver Schinagl wrote:

Hey Takashi,

I've applied the patch you've listed below. Is there some 'fool-proof'
way to produce _any_ output however? I've stopped pulse/pipe audio,
and only use aplay + alsamixer. Back to basics as they say. For aplay,
I use -D sysdefault:CARD=PCH (which was listed as a cirrus card with
-L).

Alsamixer was used to ensure all volumes are open.

Without anything running, I was able to use hdajackretask to apply
settings. But then, what to put. I get that I have to figure out, what
is routed where (i'll try to find the schematic for the macbook pro
12,1), but hence my question, is there some way to produce something?
In hdajackretask I've enabled all pins, overriden them all, and set
them all to the same configuration. 'Internal, internal, speaker,
other-analog, green, not-present, 1, front'. I figured, by setting up
verything to the internal speaker, I must get sound out of something,
but alas.

I also have a Macbook pro from 1 or 2 generations earlier, 11,2 afaik,
where the sound still does work. I've used the same config
hdajackretask showed was in use there, but (obviously?) that didn't
work.

So I'm a bit grasping at straws. Trying _every_ combination is a bit much?

It's the hard part.  I'd try to copy the pin config of the existing
models at first, then try shooting one pin by one if it doesn't work.

Ok, so no easy way :) I did try copying things, but didn't get sound either.

I did find the schematics for the 2013 and 2014 models of the macbook;
no luck yet on the 2015 (mine). But all 3 have the same model number
(A1502), and looking at the schematic (not even sure if it is just a
new revision, or actually for the different boards) they seem more or
less identical. Especially on the audio part. The nice thing is it
tells me what pins things are connected to :) But again, might not be
a perfect match to my board (crosses fingers).

What is interesting, the schematics [0] actually list the HDA configuration.

CODEC OUTPUT SIGNAL PATHS

FUNCTION   VOLUME    CONVERTER  PIN COMPLEX  MUTE CONTROL

HP/HS OUT  0x02 (2)  0x02 (2)   0x10 (16)    N/A
TWEETERS   0x03 (3)  0x03 (3)   0x12 (18)    CODEC GPIO0
SUB        0x04 (4)  0x04 (4)   0x13 (19)    CODEC GPIO0
SPDIF OUT  N/A       0x0e (14)  0x21 (33)    N/A

DMIC 1               0x09 (9)   0x1c (18)
DMIC 2               0x09 (9)   0x1c (18)

HEADSET MIC          0x07 (7)   0x18 (24)

OTHER CODEC GPIO LINES
LEFT SPEAKER ID      GPIO2 INPUT             HIGH = FG, LOW = MERRY
RIGHT SPEAKER ID     GPIO3 INPUT             HIGH = FG, LOW = MERRY
DFET CONTROL         GPIO4 OUTPUT            HIGH = DFETs OPEN

Granted, that should yield the same infomration I can copy from the
other one, but I'm trying to understand what this would mean. Function
is obvious, aswell as the pin-complex, it's what hdajackretasks calls
pin ID. But the rest is a bit iffy. E.g. what would the volume column
indicate? What about the 'converter'? And the GPIO's? Are the's GPIO's
of the codec? Maybe my confusion mostly comes as I'm not sure how to
relate those fields to hdajackretask.

It's a good information.
It corresponds to spec->gpio_eapd_speaker, and GPIO2 would be the bit
0x04, GPIO3 would be 0x08, so it should be set to 0x0c.  The headphone
has no GPIO assignment, so spec->gpio_eapd_headphone=0.

But subwoofers seem to have the GPIO controls as well, and the gpio
bit 0x01 should be set.  For that, we'll need to modify cs_automute()
function.  But let's investigate this later.

FWIW, the GPIO bits can be flipped on the fly, too.  Use hda-verb for
setting SET_GPIO_MASK, SET_GPIO_DIRECTION and SET_GPIO_DATA.

Thanks for that explanation! Great news. I don't know how; but I managed to 'fix' the bios. Strange yeah. I wanted to create an uefi boot image as that's something arch's mkinitcpio appearantly supports. So I used efiboomgr to add an additional entry.

After a reboot, I regained the apple logo at boot (which was gone for ages), but also the boot chime returned. And for sure, in Linux also sound is working again normally. I have no idea how or why this works, but it does.

For reference, this is what 6.3.x now shows:

[ 15.642288] snd_hda_codec_cirrus hdaudioC1D0: autoconfig for CS4208: line_outs=2 (0x12/0x13/0x0/0x0/0x0) type:speaker [ 15.642296] snd_hda_codec_cirrus hdaudioC1D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0) [ 15.642299] snd_hda_codec_cirrus hdaudioC1D0: hp_outs=1 (0x10/0x0/0x0/0x0/0x0)
[   15.642301] snd_hda_codec_cirrus hdaudioC1D0:    mono: mono_out=0x0
[   15.642303] snd_hda_codec_cirrus hdaudioC1D0:    dig-out=0x21/0x0
[   15.642305] snd_hda_codec_cirrus hdaudioC1D0:    inputs:
[   15.642307] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x1c
[   15.642309] snd_hda_codec_cirrus hdaudioC1D0:      Mic=0x18
[ 15.735257] snd_hda_intel 0000:00:03.0: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])

And hdajackretask (without unconnected pins):
Pin ID: 0x10 [Green Headphone]
Jack; External; Headphone; Combination;
Green; Present; 2; Front;

Pin ID: 0x12 [Internal Speaker]
<blank>; Internal; Speaker; Unknown;
Unknown; Not present; 1; Back;

Pin ID: 0x13 [Internal Speaker]
<blank>; Internal; Speaker; Unknown;
Unknown; Not present; 1; Back;

Pin ID: 0x18 [Pink Mic]
Jack; External; Microphone; Combination;
Pink; Present; 4; Front;

Pin ID: 0x1c [Internal Mic]
<blank>; Internal; Microphone; Other Digital;
Unknown; Not present; <blank>; Front

Pin ID: 0x21 [White SPDIF Out]
Jack; External; SPIDF Out; Combination;
White; Present; 3; Front;

The blank connectivity options are a bit off, as is the blank channel group on the internal mic.

So curious on those ...

Anyway, leaving this here for any future in case it is needed again.

Olliver


Takashi


Olliver

[0]:
https://www.alisaler.com/macbook-pro-retina-13-a1502-x304-mlb-820-4924-schematic/



Takashi


Olliver

On 16-05-2023 20:31, Takashi Iwai wrote:
On Tue, 16 May 2023 18:49:55 +0200,
Olliver Schinagl wrote:

Hey Takashi,

[   90.497004] CPU: 3 PID: 343 Comm: modprobe Not tainted
6.3.1-arch2-1 #1 4c16b0b90f71a940c7f1bb2eb00cdd9db2a83452
[   90.497008] Hardware name: Apple
Inc. MacBookPro12,1/Mac-E43C1C25D4880AD6, BIOS 481.0.0.0.0 01/12/2023
[   90.497010] RIP: 0010:get_line_out_pfx+0x2dd/0x3e0
[snd_hda_codec_generic]

Can you try to decode which line does it hit?
This was the arch 'vendor' kernel, so not easily? I could have tried
though I suppose :)

Instead, I just applied your patch and tried that instead.


Also, as a blind shot, does the patch below work around the bug?
[   16.593760] 0x000000000000-0x000000800000 : "BIOS"
[   16.603877] snd_hda_codec_cirrus hdaudioC1D0: autoconfig for
CS4208: line_outs=5 (0x11/0x12/0x13/0x14/0x1d) type:speaker
[   16.603885] snd_hda_codec_cirrus hdaudioC1D0:    speaker_outs=0
(0x0/0x0/0x0/0x0/0x0)
[   16.603888] snd_hda_codec_cirrus hdaudioC1D0:    hp_outs=1
(0x10/0x0/0x0/0x0/0x0)
[   16.603890] snd_hda_codec_cirrus hdaudioC1D0:    mono: mono_out=0x0
[   16.603892] snd_hda_codec_cirrus hdaudioC1D0:    dig-out=0x1e/0x21
[   16.603894] snd_hda_codec_cirrus hdaudioC1D0:    inputs:
[   16.603895] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x16
[   16.603897] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x15
[   16.603899] snd_hda_codec_cirrus hdaudioC1D0:      Mic=0x18
[   16.603900] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x19
[   16.603902] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x1a
[   16.603904] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x1b
[   16.603919] snd_hda_codec_cirrus hdaudioC1D0:      Internal Mic=0x1c
[   16.603921] snd_hda_codec_cirrus hdaudioC1D0:      Line=0x17
[   16.603922] snd_hda_codec_cirrus hdaudioC1D0:    dig-in=0x22
[   16.605152] snd_hda_codec_cirrus hdaudioC1D0: Too many channels in
get_line_out_pfx: 4
[   16.605215] snd_hda_codec_cirrus hdaudioC1D0: Too many channels in
get_line_out_pfx: 4

the good thing, you fixed the oops; the bad thing, it's no working,
but hopefully this helps you gain more insight?

Below is a bit better patch for fixing the Oops.

But, judging from the output above, I guess it won't help completely,
because the pin configuration looks broken; e.g. it reports too many
"Internal Mic" pins (which must be only one usually).

That said, the actual breakage (except for kernel Oops) is the pin
config set by BIOS.  Maybe it doesn't set up things properly *at all*
You'll need to correct it by providing the full pin config with a
quirk table.  And for that, you'll need to figure out the pins via
trial-and-error, for example, with the help of hdajackretask.


thanks,

Takashi

-- 8< --
From: Takashi Iwai <tiwai@xxxxxxx>
Subject: [PATCH] ALSA: hda: Fix Oops by 9.1 surround channel names

get_line_out_pfx() may trigger an Oops by overflowing the static array
with more than 8 channels.  This was reported for MacBookPro 12,1 with
Cirrus codec.

As a workaround, extend for the 9.1 channels and also fix the
potential Oops by unifying the code paths accessing the same array
with the proper size check.

Reported-by: Olliver Schinagl <oliver@xxxxxxxxxxx>
Cc: <stable@xxxxxxxxxxxxxxx>
Link: https://lore.kernel.org/r/64d95eb0-dbdb-cff8-a8b1-988dc22b24cd@xxxxxxxxxxx
Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
---
    sound/pci/hda/hda_generic.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index fc114e522480..dbf7aa88e0e3 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -1155,8 +1155,8 @@ static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
    	return path && path->ctls[ctl_type];
    }
    -static const char * const channel_name[4] = {
-	"Front", "Surround", "CLFE", "Side"
+static const char * const channel_name[] = {
+	"Front", "Surround", "CLFE", "Side", "Back",
    };
      /* give some appropriate ctl name prefix for the given line out
channel */
@@ -1182,7 +1182,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
      	/* multi-io channels */
    	if (ch >= cfg->line_outs)
-		return channel_name[ch];
+		goto fixed_name;
      	switch (cfg->line_out_type) {
    	case AUTO_PIN_SPEAKER_OUT:
@@ -1234,6 +1234,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
    	if (cfg->line_outs == 1 && !spec->multi_ios)
    		return "Line Out";
    + fixed_name:
    	if (ch >= ARRAY_SIZE(channel_name)) {
    		snd_BUG();
    		return "PCM";





[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux