@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

Reply via email to