Skip to content

Commit c51e431

Browse files
jasontaotiwai
authored andcommitted
ALSA: hda: Glenfly: add HD Audio PCI IDs and HDMI Codec Vendor IDs.
Add a set of HD Audio PCI IDS, and the HDMI codec vendor IDs for Glenfly Gpus. - In default_bdl_pos_adj, set bdl to 128 as Glenfly Gpus have hardware limitation, need to increase hdac interrupt interval. - In azx_first_init, enable polling mode for Glenfly Gpu. When the codec complete the command, it sends interrupt and writes response entries to memory, howerver, the write requests sometimes are not actually synchronized to memory when driver handle hdac interrupt on Glenfly Gpus. If the RIRB status is not updated in the interrupt handler, azx_rirb_get_response keeps trying to recevie a response from rirb until 1s timeout. Enabling polling mode for Glenfly Gpu can fix the issue. - In patch_gf_hdmi, set Glenlfy Gpu Codec's no_sticky_stream as it need driver to do actual clean-ups for the linked codec when switch from one codec to another. Signed-off-by: jasontao <[email protected]> Signed-off-by: Reaper Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent baa6584 commit c51e431

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

sound/pci/hda/hda_intel.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ enum {
227227
AZX_DRIVER_ATI,
228228
AZX_DRIVER_ATIHDMI,
229229
AZX_DRIVER_ATIHDMI_NS,
230+
AZX_DRIVER_GFHDMI,
230231
AZX_DRIVER_VIA,
231232
AZX_DRIVER_SIS,
232233
AZX_DRIVER_ULI,
@@ -349,6 +350,7 @@ static const char * const driver_short_names[] = {
349350
[AZX_DRIVER_ATI] = "HDA ATI SB",
350351
[AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
351352
[AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
353+
[AZX_DRIVER_GFHDMI] = "HDA GF HDMI",
352354
[AZX_DRIVER_VIA] = "HDA VIA VT82xx",
353355
[AZX_DRIVER_SIS] = "HDA SIS966",
354356
[AZX_DRIVER_ULI] = "HDA ULI M5461",
@@ -1743,6 +1745,12 @@ static int default_bdl_pos_adj(struct azx *chip)
17431745
}
17441746

17451747
switch (chip->driver_type) {
1748+
/*
1749+
* increase the bdl size for Glenfly Gpus for hardware
1750+
* limitation on hdac interrupt interval
1751+
*/
1752+
case AZX_DRIVER_GFHDMI:
1753+
return 128;
17461754
case AZX_DRIVER_ICH:
17471755
case AZX_DRIVER_PCH:
17481756
return 1;
@@ -1858,6 +1866,12 @@ static int azx_first_init(struct azx *chip)
18581866
pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
18591867
}
18601868
#endif
1869+
/*
1870+
* Fix response write request not synced to memory when handle
1871+
* hdac interrupt on Glenfly Gpus
1872+
*/
1873+
if (chip->driver_type == AZX_DRIVER_GFHDMI)
1874+
bus->polling_mode = 1;
18611875

18621876
err = pcim_iomap_regions(pci, 1 << 0, "ICH HD audio");
18631877
if (err < 0)
@@ -1959,6 +1973,7 @@ static int azx_first_init(struct azx *chip)
19591973
chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
19601974
chip->capture_streams = ATIHDMI_NUM_CAPTURE;
19611975
break;
1976+
case AZX_DRIVER_GFHDMI:
19621977
case AZX_DRIVER_GENERIC:
19631978
default:
19641979
chip->playback_streams = ICH6_NUM_PLAYBACK;
@@ -2727,6 +2742,12 @@ static const struct pci_device_id azx_ids[] = {
27272742
{ PCI_DEVICE(0x1002, 0xab38),
27282743
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
27292744
AZX_DCAPS_PM_RUNTIME },
2745+
/* GLENFLY */
2746+
{ PCI_DEVICE(0x6766, PCI_ANY_ID),
2747+
.class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
2748+
.class_mask = 0xffffff,
2749+
.driver_data = AZX_DRIVER_GFHDMI | AZX_DCAPS_POSFIX_LPIB |
2750+
AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
27302751
/* VIA VT8251/VT8237A */
27312752
{ PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },
27322753
/* VIA GFX VT7122/VX900 */

sound/pci/hda/patch_hdmi.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4474,6 +4474,22 @@ static int patch_via_hdmi(struct hda_codec *codec)
44744474
return patch_simple_hdmi(codec, VIAHDMI_CVT_NID, VIAHDMI_PIN_NID);
44754475
}
44764476

4477+
static int patch_gf_hdmi(struct hda_codec *codec)
4478+
{
4479+
int err;
4480+
4481+
err = patch_generic_hdmi(codec);
4482+
if (err)
4483+
return err;
4484+
4485+
/*
4486+
* Glenfly GPUs have two codecs, stream switches from one codec to
4487+
* another, need to do actual clean-ups in codec_cleanup_stream
4488+
*/
4489+
codec->no_sticky_stream = 1;
4490+
return 0;
4491+
}
4492+
44774493
/*
44784494
* patch entries
44794495
*/
@@ -4564,6 +4580,12 @@ HDA_CODEC_ENTRY(0x10de009f, "GPU 9f HDMI/DP", patch_nvhdmi),
45644580
HDA_CODEC_ENTRY(0x10de00a0, "GPU a0 HDMI/DP", patch_nvhdmi),
45654581
HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch),
45664582
HDA_CODEC_ENTRY(0x10de8067, "MCP67/68 HDMI", patch_nvhdmi_2ch),
4583+
HDA_CODEC_ENTRY(0x67663d82, "Arise 82 HDMI/DP", patch_gf_hdmi),
4584+
HDA_CODEC_ENTRY(0x67663d83, "Arise 83 HDMI/DP", patch_gf_hdmi),
4585+
HDA_CODEC_ENTRY(0x67663d84, "Arise 84 HDMI/DP", patch_gf_hdmi),
4586+
HDA_CODEC_ENTRY(0x67663d85, "Arise 85 HDMI/DP", patch_gf_hdmi),
4587+
HDA_CODEC_ENTRY(0x67663d86, "Arise 86 HDMI/DP", patch_gf_hdmi),
4588+
HDA_CODEC_ENTRY(0x67663d87, "Arise 87 HDMI/DP", patch_gf_hdmi),
45674589
HDA_CODEC_ENTRY(0x11069f80, "VX900 HDMI/DP", patch_via_hdmi),
45684590
HDA_CODEC_ENTRY(0x11069f81, "VX900 HDMI/DP", patch_via_hdmi),
45694591
HDA_CODEC_ENTRY(0x11069f84, "VX11 HDMI/DP", patch_generic_hdmi),

0 commit comments

Comments
 (0)