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