1*b2660d1eSTakashi Iwai // SPDX-License-Identifier: GPL-2.0-or-later 2*b2660d1eSTakashi Iwai /* 3*b2660d1eSTakashi Iwai * hdac_i915.c - routines for sync between HD-A core and i915 display driver 4*b2660d1eSTakashi Iwai */ 5*b2660d1eSTakashi Iwai 6*b2660d1eSTakashi Iwai #include <linux/init.h> 7*b2660d1eSTakashi Iwai #include <linux/module.h> 8*b2660d1eSTakashi Iwai #include <linux/pci.h> 9*b2660d1eSTakashi Iwai #include <sound/core.h> 10*b2660d1eSTakashi Iwai #include <sound/hdaudio.h> 11*b2660d1eSTakashi Iwai #include <sound/hda_i915.h> 12*b2660d1eSTakashi Iwai #include <sound/hda_register.h> 13*b2660d1eSTakashi Iwai #include <video/nomodeset.h> 14*b2660d1eSTakashi Iwai 15*b2660d1eSTakashi Iwai static int gpu_bind = -1; 16*b2660d1eSTakashi Iwai module_param(gpu_bind, int, 0644); 17*b2660d1eSTakashi Iwai MODULE_PARM_DESC(gpu_bind, "Whether to bind sound component to GPU " 18*b2660d1eSTakashi Iwai "(1=always, 0=never, -1=on nomodeset(default))"); 19*b2660d1eSTakashi Iwai 20*b2660d1eSTakashi Iwai /** 21*b2660d1eSTakashi Iwai * snd_hdac_i915_set_bclk - Reprogram BCLK for HSW/BDW 22*b2660d1eSTakashi Iwai * @bus: HDA core bus 23*b2660d1eSTakashi Iwai * 24*b2660d1eSTakashi Iwai * Intel HSW/BDW display HDA controller is in GPU. Both its power and link BCLK 25*b2660d1eSTakashi Iwai * depends on GPU. Two Extended Mode registers EM4 (M value) and EM5 (N Value) 26*b2660d1eSTakashi Iwai * are used to convert CDClk (Core Display Clock) to 24MHz BCLK: 27*b2660d1eSTakashi Iwai * BCLK = CDCLK * M / N 28*b2660d1eSTakashi Iwai * The values will be lost when the display power well is disabled and need to 29*b2660d1eSTakashi Iwai * be restored to avoid abnormal playback speed. 30*b2660d1eSTakashi Iwai * 31*b2660d1eSTakashi Iwai * Call this function at initializing and changing power well, as well as 32*b2660d1eSTakashi Iwai * at ELD notifier for the hotplug. 33*b2660d1eSTakashi Iwai */ 34*b2660d1eSTakashi Iwai void snd_hdac_i915_set_bclk(struct hdac_bus *bus) 35*b2660d1eSTakashi Iwai { 36*b2660d1eSTakashi Iwai struct drm_audio_component *acomp = bus->audio_component; 37*b2660d1eSTakashi Iwai struct pci_dev *pci = to_pci_dev(bus->dev); 38*b2660d1eSTakashi Iwai int cdclk_freq; 39*b2660d1eSTakashi Iwai unsigned int bclk_m, bclk_n; 40*b2660d1eSTakashi Iwai 41*b2660d1eSTakashi Iwai if (!acomp || !acomp->ops || !acomp->ops->get_cdclk_freq) 42*b2660d1eSTakashi Iwai return; /* only for i915 binding */ 43*b2660d1eSTakashi Iwai if (!HDA_CONTROLLER_IS_HSW(pci)) 44*b2660d1eSTakashi Iwai return; /* only HSW/BDW */ 45*b2660d1eSTakashi Iwai 46*b2660d1eSTakashi Iwai cdclk_freq = acomp->ops->get_cdclk_freq(acomp->dev); 47*b2660d1eSTakashi Iwai switch (cdclk_freq) { 48*b2660d1eSTakashi Iwai case 337500: 49*b2660d1eSTakashi Iwai bclk_m = 16; 50*b2660d1eSTakashi Iwai bclk_n = 225; 51*b2660d1eSTakashi Iwai break; 52*b2660d1eSTakashi Iwai 53*b2660d1eSTakashi Iwai case 450000: 54*b2660d1eSTakashi Iwai default: /* default CDCLK 450MHz */ 55*b2660d1eSTakashi Iwai bclk_m = 4; 56*b2660d1eSTakashi Iwai bclk_n = 75; 57*b2660d1eSTakashi Iwai break; 58*b2660d1eSTakashi Iwai 59*b2660d1eSTakashi Iwai case 540000: 60*b2660d1eSTakashi Iwai bclk_m = 4; 61*b2660d1eSTakashi Iwai bclk_n = 90; 62*b2660d1eSTakashi Iwai break; 63*b2660d1eSTakashi Iwai 64*b2660d1eSTakashi Iwai case 675000: 65*b2660d1eSTakashi Iwai bclk_m = 8; 66*b2660d1eSTakashi Iwai bclk_n = 225; 67*b2660d1eSTakashi Iwai break; 68*b2660d1eSTakashi Iwai } 69*b2660d1eSTakashi Iwai 70*b2660d1eSTakashi Iwai snd_hdac_chip_writew(bus, HSW_EM4, bclk_m); 71*b2660d1eSTakashi Iwai snd_hdac_chip_writew(bus, HSW_EM5, bclk_n); 72*b2660d1eSTakashi Iwai } 73*b2660d1eSTakashi Iwai EXPORT_SYMBOL_GPL(snd_hdac_i915_set_bclk); 74*b2660d1eSTakashi Iwai 75*b2660d1eSTakashi Iwai /* returns true if the devices can be connected for audio */ 76*b2660d1eSTakashi Iwai static bool connectivity_check(struct pci_dev *i915, struct pci_dev *hdac) 77*b2660d1eSTakashi Iwai { 78*b2660d1eSTakashi Iwai struct pci_bus *bus_a = i915->bus, *bus_b = hdac->bus; 79*b2660d1eSTakashi Iwai 80*b2660d1eSTakashi Iwai /* directly connected on the same bus */ 81*b2660d1eSTakashi Iwai if (bus_a == bus_b) 82*b2660d1eSTakashi Iwai return true; 83*b2660d1eSTakashi Iwai 84*b2660d1eSTakashi Iwai bus_a = bus_a->parent; 85*b2660d1eSTakashi Iwai bus_b = bus_b->parent; 86*b2660d1eSTakashi Iwai 87*b2660d1eSTakashi Iwai /* connected via parent bus (may be NULL!) */ 88*b2660d1eSTakashi Iwai if (bus_a == bus_b) 89*b2660d1eSTakashi Iwai return true; 90*b2660d1eSTakashi Iwai 91*b2660d1eSTakashi Iwai if (!bus_a || !bus_b) 92*b2660d1eSTakashi Iwai return false; 93*b2660d1eSTakashi Iwai 94*b2660d1eSTakashi Iwai /* 95*b2660d1eSTakashi Iwai * on i915 discrete GPUs with embedded HDA audio, the two 96*b2660d1eSTakashi Iwai * devices are connected via 2nd level PCI bridge 97*b2660d1eSTakashi Iwai */ 98*b2660d1eSTakashi Iwai bus_a = bus_a->parent; 99*b2660d1eSTakashi Iwai bus_b = bus_b->parent; 100*b2660d1eSTakashi Iwai if (bus_a && bus_a == bus_b) 101*b2660d1eSTakashi Iwai return true; 102*b2660d1eSTakashi Iwai 103*b2660d1eSTakashi Iwai return false; 104*b2660d1eSTakashi Iwai } 105*b2660d1eSTakashi Iwai 106*b2660d1eSTakashi Iwai static int i915_component_master_match(struct device *dev, int subcomponent, 107*b2660d1eSTakashi Iwai void *data) 108*b2660d1eSTakashi Iwai { 109*b2660d1eSTakashi Iwai struct pci_dev *hdac_pci, *i915_pci; 110*b2660d1eSTakashi Iwai struct hdac_bus *bus = data; 111*b2660d1eSTakashi Iwai 112*b2660d1eSTakashi Iwai if (!dev_is_pci(dev)) 113*b2660d1eSTakashi Iwai return 0; 114*b2660d1eSTakashi Iwai 115*b2660d1eSTakashi Iwai hdac_pci = to_pci_dev(bus->dev); 116*b2660d1eSTakashi Iwai i915_pci = to_pci_dev(dev); 117*b2660d1eSTakashi Iwai 118*b2660d1eSTakashi Iwai if ((!strcmp(dev->driver->name, "i915") || 119*b2660d1eSTakashi Iwai !strcmp(dev->driver->name, "xe")) && 120*b2660d1eSTakashi Iwai subcomponent == I915_COMPONENT_AUDIO && 121*b2660d1eSTakashi Iwai connectivity_check(i915_pci, hdac_pci)) 122*b2660d1eSTakashi Iwai return 1; 123*b2660d1eSTakashi Iwai 124*b2660d1eSTakashi Iwai return 0; 125*b2660d1eSTakashi Iwai } 126*b2660d1eSTakashi Iwai 127*b2660d1eSTakashi Iwai /* check whether Intel graphics is present and reachable */ 128*b2660d1eSTakashi Iwai static int i915_gfx_present(struct pci_dev *hdac_pci) 129*b2660d1eSTakashi Iwai { 130*b2660d1eSTakashi Iwai /* List of known platforms with no i915 support. */ 131*b2660d1eSTakashi Iwai static const struct pci_device_id denylist[] = { 132*b2660d1eSTakashi Iwai /* CNL */ 133*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a40), 0x030000, 0xff0000 }, 134*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a41), 0x030000, 0xff0000 }, 135*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a42), 0x030000, 0xff0000 }, 136*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a44), 0x030000, 0xff0000 }, 137*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a49), 0x030000, 0xff0000 }, 138*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a4a), 0x030000, 0xff0000 }, 139*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a4c), 0x030000, 0xff0000 }, 140*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a50), 0x030000, 0xff0000 }, 141*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a51), 0x030000, 0xff0000 }, 142*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a52), 0x030000, 0xff0000 }, 143*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a54), 0x030000, 0xff0000 }, 144*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a59), 0x030000, 0xff0000 }, 145*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a5a), 0x030000, 0xff0000 }, 146*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a5c), 0x030000, 0xff0000 }, 147*b2660d1eSTakashi Iwai /* LKF */ 148*b2660d1eSTakashi Iwai { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9840), 0x030000, 0xff0000 }, 149*b2660d1eSTakashi Iwai {} 150*b2660d1eSTakashi Iwai }; 151*b2660d1eSTakashi Iwai struct pci_dev *display_dev = NULL; 152*b2660d1eSTakashi Iwai 153*b2660d1eSTakashi Iwai if (!gpu_bind || (gpu_bind < 0 && video_firmware_drivers_only())) 154*b2660d1eSTakashi Iwai return false; 155*b2660d1eSTakashi Iwai 156*b2660d1eSTakashi Iwai for_each_pci_dev(display_dev) { 157*b2660d1eSTakashi Iwai if (display_dev->vendor != PCI_VENDOR_ID_INTEL || 158*b2660d1eSTakashi Iwai (display_dev->class >> 16) != PCI_BASE_CLASS_DISPLAY) 159*b2660d1eSTakashi Iwai continue; 160*b2660d1eSTakashi Iwai 161*b2660d1eSTakashi Iwai if (pci_match_id(denylist, display_dev)) 162*b2660d1eSTakashi Iwai continue; 163*b2660d1eSTakashi Iwai 164*b2660d1eSTakashi Iwai if (connectivity_check(display_dev, hdac_pci)) { 165*b2660d1eSTakashi Iwai pci_dev_put(display_dev); 166*b2660d1eSTakashi Iwai return true; 167*b2660d1eSTakashi Iwai } 168*b2660d1eSTakashi Iwai } 169*b2660d1eSTakashi Iwai 170*b2660d1eSTakashi Iwai return false; 171*b2660d1eSTakashi Iwai } 172*b2660d1eSTakashi Iwai 173*b2660d1eSTakashi Iwai /** 174*b2660d1eSTakashi Iwai * snd_hdac_i915_init - Initialize i915 audio component 175*b2660d1eSTakashi Iwai * @bus: HDA core bus 176*b2660d1eSTakashi Iwai * 177*b2660d1eSTakashi Iwai * This function is supposed to be used only by a HD-audio controller 178*b2660d1eSTakashi Iwai * driver that needs the interaction with i915 graphics. 179*b2660d1eSTakashi Iwai * 180*b2660d1eSTakashi Iwai * This function initializes and sets up the audio component to communicate 181*b2660d1eSTakashi Iwai * with i915 graphics driver. 182*b2660d1eSTakashi Iwai * 183*b2660d1eSTakashi Iwai * Returns zero for success or a negative error code. 184*b2660d1eSTakashi Iwai */ 185*b2660d1eSTakashi Iwai int snd_hdac_i915_init(struct hdac_bus *bus) 186*b2660d1eSTakashi Iwai { 187*b2660d1eSTakashi Iwai struct drm_audio_component *acomp; 188*b2660d1eSTakashi Iwai int err; 189*b2660d1eSTakashi Iwai 190*b2660d1eSTakashi Iwai if (!i915_gfx_present(to_pci_dev(bus->dev))) 191*b2660d1eSTakashi Iwai return -ENODEV; 192*b2660d1eSTakashi Iwai 193*b2660d1eSTakashi Iwai err = snd_hdac_acomp_init(bus, NULL, 194*b2660d1eSTakashi Iwai i915_component_master_match, 195*b2660d1eSTakashi Iwai sizeof(struct i915_audio_component) - sizeof(*acomp)); 196*b2660d1eSTakashi Iwai if (err < 0) 197*b2660d1eSTakashi Iwai return err; 198*b2660d1eSTakashi Iwai acomp = bus->audio_component; 199*b2660d1eSTakashi Iwai if (!acomp) 200*b2660d1eSTakashi Iwai return -ENODEV; 201*b2660d1eSTakashi Iwai if (!acomp->ops) { 202*b2660d1eSTakashi Iwai snd_hdac_acomp_exit(bus); 203*b2660d1eSTakashi Iwai return dev_err_probe(bus->dev, -EPROBE_DEFER, 204*b2660d1eSTakashi Iwai "couldn't bind with audio component\n"); 205*b2660d1eSTakashi Iwai } 206*b2660d1eSTakashi Iwai return 0; 207*b2660d1eSTakashi Iwai } 208*b2660d1eSTakashi Iwai EXPORT_SYMBOL_GPL(snd_hdac_i915_init); 209