Based on all information in this thread, I’ve been able to construct a systemd solution to get the HDMI Audio device exposed on my Skylake laptop with a GTX1060 running in “Discrete Graphics” (not Hybrid) mode on Ubuntu 17.10:
/etc/systemd/system/fix-hdmi-audio.service
[Unit]
Description=nVidia HDMI Audio Fixer
Before=systemd-logind.service display-manager.service
After=module-init-tools.service
[Service]
Type=oneshot
ExecStart=/root/fix-hdmi-audio.sh
[Install]
WantedBy=multi-user.target
/root/fix-hdmi-audio.sh
#!/bin/sh
setpci -s 01:00.0 0x488.l=0x2000000:0x2000000
rmmod nvidia-uvm nvidia-drm nvidia-modeset nvidia
sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove'
sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:01.0/rescan'
modprobe nvidia nvidia-modeset nvidia-drm nvidia-uvm
And then execute the following commands (as root) to make it do this at boot:
chmod +x /root/fix-hdmi-audio.sh
systemctl enable fix-hdmi-audio.service
After each reboot, I now see the HDMI audio device on my laptop:
fludizz@tongerlo:~$ lspci | grep "PCIe Controller\|NVIDIA"
00:01.0 PCI bridge: Intel Corporation Skylake PCIe Controller (x16) (rev 07)
01:00.0 VGA compatible controller: NVIDIA Corporation GP106M [GeForce GTX 1060 Mobile] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1)
fludizz@tongerlo:~$ aplay -l | grep NVidia
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]