@John Hoff John, great work!
> Now what? I am not sure what to do with any of this data.... Now the hard part. Here's what I think is going on: The windows driver running in the VM controls the audio codec. How? According to section 4.4 of the Intel HDA Spec [1], the driver writes to a circular buffer known as the Command Output Ring Buffer (CORB). The HDA controller, which is implemented by the hardware manufacturer and shipped as firmware in the chipset, takes commands from the CORB and sends them to the codec. Qemu provides the memory for the VM. That means qemu can see every time the VM writes to memory. That's a lot of writes! We only care about the subset of writes to the memory region allocated for the HDA controller, which is what we get when we specify "vfio_region_write" event tracing. My laptop has this HDA controller 00:1f.3 Multimedia audio controller [0401]: Intel Corporation Cannon Point-LP High Definition Audio Controller [8086:9dc8] (rev 11) so when I see qemu output a trace line that looks like 3064@1591386653.159507:vfio_region_write (0000:00:1f.3:region0+0xe, 0x7fff, 2) I know that the driver wrote to the HDA controller memory because the pci device id "1f.3" matches the HDA controller. We can decode the rest of the line by looking at the qemu source code [2]. 0xe is the memory offset at which the driver wrote, 0x7fff is the data, and 2 is the size of the data in bytes. Which vfio_region_write events are CORB writes? The answer requires an understanding of the CORB protocol. The CORB has a fixed size which may be up to 256 entries. That means that all CORB writes are made to memory within a CORBSIZE range of addresses. After the driver writes an HDA verb to the CORB, the driver writes a value from 0x0 to 0xff to the CORB Write Pointer (CORBWP) register which tells the HDA controller the last valid CORB entry offset so the HDA controller knows how far to read before stopping and waiting for more data. Enter QemuHDADump (QHDAD). QHDAD is a program that someone wrote and published on github which attempts to parse vfio_region_write lines from qemu to determine the CORB address and record all HDA verbs written to the CORB. The author of QHDAD has his/her own hardware and did not test it on my laptop or your laptop so it is likely buggy and therefore may not produce a good recording of verbs. We don't have to use QHDAD; we just need some way to parse CORB writes from vfio_region_write events. Because the speaker sound works on Windows that means that if we send the verbs in the recording to the HDA controller using snd_hda_intel we may be able to get the speakers work on Linux. Once we demonstrate that the speakers function after passing all the verbs in the recording we need to minimize the verbs if we want any hope of our patch being included in the kernel. Many of the verbs will be "getters" instead of "setters" which we can delete. After that it may be a tedious trial-and- error process to see which of the remaining verbs we can delete. The verb encodings are specified in the Intel HDA Spec which can help us guess what can be deleted. The end goal is a patch which looks like this one [3]. [1] https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf [2] https://github.com/qemu/qemu/blob/master/hw/vfio/trace-events [3] https://github.com/torvalds/linux/commit/a2ef03fe617a8365fb7794531b11ba587509a9b9 -- You received this bug notification because you are a member of Kernel Packages, which is subscribed to linux in Ubuntu. https://bugs.launchpad.net/bugs/1851518 Title: [950SBE/951SBE, Realtek ALC298, Speaker, Internal] No sound on internal speakers, very very quiet on headphones Status in linux package in Ubuntu: Confirmed Bug description: I've been googling this issue for 10's of hours and tried many things. Relase of Ubuntu: 19.10 Expected outcome: Music plays on the internal speakers and headphones. Actual outcome: I can barely hear audio using headphones with volume turned up to 150%. Absolutely nothing comes out of the speakers. (The speakers sound great under Windows 10.) Complete alsa-info output is attached, but here are some snippets: !!DMI Information !!--------------- Manufacturer: SAMSUNG ELECTRONICS CO., LTD. Product Name: 950SBE/951SBE Product Version: P06RES Firmware Version: P06RES.075.190529.SP Board Vendor: SAMSUNG ELECTRONICS CO., LTD. Board Name: NP950SBE-K01US !!Kernel Information !!------------------ Kernel release: 5.3.0-19-generic Operating System: GNU/Linux Architecture: x86_64 Processor: x86_64 SMP Enabled: Yes !!ALSA Version !!------------ Driver version: k5.3.0-19-generic Library version: 1.1.9 Utilities version: 1.1.9 !!Loaded ALSA modules !!------------------- snd_hda_intel !!Sound Servers on this system !!---------------------------- Pulseaudio: Installed - Yes (/usr/bin/pulseaudio) Running - Yes !!Soundcards recognised by ALSA !!----------------------------- 0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0x604b118000 irq 177 !!PCI Soundcards installed in the system !!-------------------------------------- 00:1f.3 Multimedia audio controller: Intel Corporation Cannon Point-LP High Definition Audio Controller (rev 11) !!Advanced information - PCI Vendor/Device/Subsystem ID's !!------------------------------------------------------- 00:1f.3 0401: 8086:9dc8 (rev 11) DeviceName: Onboard - Sound !!HDA-Intel Codec information !!--------------------------- --startcollapse-- Codec: Realtek ALC298 Address: 0 AFG Function Id: 0x1 (unsol 1) Vendor Id: 0x10ec0298 Subsystem Id: 0x144dc812 Revision Id: 0x100103 No Modem Function Group found Default PCM: rates [0x60]: 44100 48000 bits [0xe]: 16 20 24 formats [0x1]: PCM Default Amp-In caps: N/A Default Amp-Out caps: N/A State of AFG node 0x01: Power states: D0 D1 D2 D3 D3cold CLKSTOP EPSS Power: setting=D0, actual=D0 GPIO: io=8, o=0, i=0, unsolicited=1, wake=0 IO[0]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[1]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[2]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[3]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[4]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[5]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[6]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[7]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 Node 0x02 [Audio Output] wcaps 0x41d: Stereo Amp-Out Control: name="Headphone Playback Volume", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Device: name="ALC298 Analog", type="Audio", device=0 Amp-Out caps: ofs=0x7f, nsteps=0x7f, stepsize=0x01, mute=0 Amp-Out vals: [0x00 0x00] Converter: stream=1, channel=0 PCM: rates [0x60]: 44100 48000 bits [0xe]: 16 20 24 formats [0x1]: PCM Power states: D0 D1 D2 D3 EPSS Power: setting=D0, actual=D0 Node 0x03 [Audio Output] wcaps 0x41d: Stereo Amp-Out Control: name="Speaker Playback Volume", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Amp-Out caps: ofs=0x7f, nsteps=0x7f, stepsize=0x01, mute=0 Amp-Out vals: [0x7f 0x7f] Converter: stream=1, channel=0 ProblemType: Bug DistroRelease: Ubuntu 19.10 Package: alsa-base 1.0.25+dfsg-0ubuntu5 ProcVersionSignature: Ubuntu 5.3.0-19.20-generic 5.3.1 Uname: Linux 5.3.0-19-generic x86_64 ApportVersion: 2.20.11-0ubuntu8.2 Architecture: amd64 AudioDevicesInUse: USER PID ACCESS COMMAND /dev/snd/controlC0: martin 1383 F.... pulseaudio CurrentDesktop: ubuntu:GNOME Date: Wed Nov 6 06:20:08 2019 InstallationDate: Installed on 2019-11-03 (3 days ago) InstallationMedia: Ubuntu 19.10 "Eoan Ermine" - Release amd64 (20191017) PackageArchitecture: all ProcEnviron: TERM=xterm-256color PATH=(custom, no user) XDG_RUNTIME_DIR=<set> LANG=en_US.UTF-8 SHELL=/bin/bash SourcePackage: alsa-driver Symptom: audio Symptom_AlsaPlaybackTest: ALSA playback test through plughw:PCH failed Symptom_Card: Built-in Audio - HDA Intel PCH Symptom_DevicesInUse: USER PID ACCESS COMMAND /dev/snd/controlC0: martin 1383 F.... pulseaudio Symptom_Jack: Speaker, Internal Symptom_Type: No sound at all Title: [950SBE/951SBE, Realtek ALC298, Speaker, Internal] No sound at all UpgradeStatus: No upgrade log present (probably fresh install) dmi.bios.date: 05/29/2019 dmi.bios.vendor: American Megatrends Inc. dmi.bios.version: P06RES.075.190529.SP dmi.board.asset.tag: No Asset Tag dmi.board.name: NP950SBE-K01US dmi.board.vendor: SAMSUNG ELECTRONICS CO., LTD. dmi.board.version: SGL9849A0Q-C01-G003-S0001+10.0.17763 dmi.chassis.asset.tag: No Asset Tag dmi.chassis.type: 31 dmi.chassis.vendor: SAMSUNG ELECTRONICS CO., LTD. dmi.chassis.version: N/A dmi.modalias: dmi:bvnAmericanMegatrendsInc.:bvrP06RES.075.190529.SP:bd05/29/2019:svnSAMSUNGELECTRONICSCO.,LTD.:pn950SBE/951SBE:pvrP06RES:rvnSAMSUNGELECTRONICSCO.,LTD.:rnNP950SBE-K01US:rvrSGL9849A0Q-C01-G003-S0001+10.0.17763:cvnSAMSUNGELECTRONICSCO.,LTD.:ct31:cvrN/A: dmi.product.family: Notebook 9 Series dmi.product.name: 950SBE/951SBE dmi.product.sku: SCAI-A5A5-A5A5-A5A5-PRES dmi.product.version: P06RES dmi.sys.vendor: SAMSUNG ELECTRONICS CO., LTD. mtime.conffile..etc.modprobe.d.alsa-base.conf: 2019-11-05T23:13:55.854413 To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1851518/+subscriptions -- Mailing list: https://launchpad.net/~kernel-packages Post to : kernel-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~kernel-packages More help : https://help.launchpad.net/ListHelp