On Thu, Apr 15, 2021 at 03:24:56PM +0200, Ivo Sbalzarini wrote: > Thanks a lot! > > I also got the sound working on this machine now. As far as I > can tell, both speakers work and Dolby Atmos works, too, thanks > to the awesome quirk by Joshua Stein (jcs@). > > I’m not sure I did everything right here, though it works. > Below is the diff. > > cheers, > - ivo > > > Index: azalia.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/azalia.c,v > retrieving revision 1.259 > diff -u -p -r1.259 azalia.c > --- azalia.c 25 Oct 2020 07:22:06 -0000 1.259 > +++ azalia.c 15 Apr 2021 13:18:07 -0000 > @@ -490,7 +490,8 @@ azalia_configure_pci(azalia_t *az) > > const struct pci_matchid azalia_pci_devices[] = { > { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_200SERIES_U_HDA }, > - { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_300SERIES_U_HDA } > + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_300SERIES_U_HDA }, > + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_400SERIES_CAVS } > }; > > int > Index: azalia_codec.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/azalia_codec.c,v > retrieving revision 1.183 > diff -u -p -r1.183 azalia_codec.c > --- azalia_codec.c 16 Jan 2021 07:02:39 -0000 1.183 > +++ azalia_codec.c 15 Apr 2021 13:18:07 -0000 > @@ -162,9 +162,16 @@ azalia_codec_init_vtbl(codec_t *this) > break; > case 0x10ec0285: > this->name = "Realtek ALC285"; > - if (this->subid == 0x229217aa) /* Thinkpad X1 Carbon > 7 */ > - this->qrks |= AZ_QRK_ROUTE_SPKR2_DAC | > - AZ_QRK_WID_CLOSE_PCBEEP; > + if (PCI_VENDOR(this->subid) == PCI_VENDOR_LENOVO) { > + if (this->subid == 0x22c017aa) { /* Thinkpad X1 Extreme > 3 */ > + this->name = "Realtek ALC3286"; > + this->qrks |= AZ_QRK_DOLBY_ATMOS | > + AZ_QRK_ROUTE_SPKR2_DAC; > + } > + else if (this->subid == 0x229217aa) /* Thinkpad X1 Carbon > 7 */ > + this->qrks |= AZ_QRK_ROUTE_SPKR2_DAC | > + AZ_QRK_WID_CLOSE_PCBEEP; > + } > break; > case 0x10ec0287: > this->name = "Realtek ALC287"; > > >
Thanks for looking at this. Few comments: - the "PCI_VENDOR(this->subid) == PCI_VENDOR_LENOVO" compares the 16 lower bits of the subid. It's not necessary because below we compare the full 32 bits. - the "name" field is the codec name; it is identified by the "vid" field, so it shouldn't depend on the device subid. - style: indentation is (8 char) TAB, see style(9). With above tweaks, I ended up this diff. Could you confirm it still makes audio work? Index: azalia.c =================================================================== RCS file: /cvs/src/sys/dev/pci/azalia.c,v retrieving revision 1.259 diff -u -p -u -p -r1.259 azalia.c --- azalia.c 25 Oct 2020 07:22:06 -0000 1.259 +++ azalia.c 19 Apr 2021 15:37:32 -0000 @@ -490,7 +490,8 @@ azalia_configure_pci(azalia_t *az) const struct pci_matchid azalia_pci_devices[] = { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_200SERIES_U_HDA }, - { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_300SERIES_U_HDA } + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_300SERIES_U_HDA }, + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_400SERIES_CAVS } }; int Index: azalia_codec.c =================================================================== RCS file: /cvs/src/sys/dev/pci/azalia_codec.c,v retrieving revision 1.183 diff -u -p -u -p -r1.183 azalia_codec.c --- azalia_codec.c 16 Jan 2021 07:02:39 -0000 1.183 +++ azalia_codec.c 19 Apr 2021 15:37:32 -0000 @@ -162,9 +162,15 @@ azalia_codec_init_vtbl(codec_t *this) break; case 0x10ec0285: this->name = "Realtek ALC285"; - if (this->subid == 0x229217aa) /* Thinkpad X1 Carbon 7 */ + if (this->subid == 0x229217aa) { + /* Thinkpad X1 Carbon 7 */ this->qrks |= AZ_QRK_ROUTE_SPKR2_DAC | AZ_QRK_WID_CLOSE_PCBEEP; + } else if (this->subid == 0x22c017aa) { + /* Thinkpad X1 Extreme 3 */ + this->qrks |= AZ_QRK_DOLBY_ATMOS | + AZ_QRK_ROUTE_SPKR2_DAC; + } break; case 0x10ec0287: this->name = "Realtek ALC287";