From: Greg Kroah-Hartman Date: Mon, 8 Jan 2024 12:30:35 +0000 (+0100) Subject: 6.6-stable patches X-Git-Tag: v4.14.336~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8bfa64402153e07285bcf199e823a9a912c57afa;p=thirdparty%2Fkernel%2Fstable-queue.git 6.6-stable patches added patches: alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch alsa-hda-tas2781-do-not-use-regcache.patch alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch alsa-hda-tas2781-remove-sound-controls-in-unbind.patch cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch --- diff --git a/queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch b/queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch new file mode 100644 index 00000000000..27e290d37c7 --- /dev/null +++ b/queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch @@ -0,0 +1,34 @@ +From 13a5b21197587a3d9cac9e1a00de9b91526a55e4 Mon Sep 17 00:00:00 2001 +From: Aabish Malik +Date: Fri, 29 Dec 2023 22:33:54 +0530 +Subject: ALSA: hda/realtek: enable SND_PCI_QUIRK for hp pavilion 14-ec1xxx series + +From: Aabish Malik + +commit 13a5b21197587a3d9cac9e1a00de9b91526a55e4 upstream. + +The HP Pavilion 14 ec1xxx series uses the HP mainboard 8A0F with the +ALC287 codec. +The mute led can be enabled using the already existing +ALC287_FIXUP_HP_GPIO_LED quirk. +Tested on an HP Pavilion ec1003AU + +Signed-off-by: Aabish Malik +Cc: +Link: https://lore.kernel.org/r/20231229170352.742261-3-aabishmalik3337@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -9791,6 +9791,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), ++ SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), + SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), + SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), diff --git a/queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch b/queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch new file mode 100644 index 00000000000..5ab382532b5 --- /dev/null +++ b/queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch @@ -0,0 +1,32 @@ +From b6ce6e6c79e4ec650887f1fe391a70e54972001a Mon Sep 17 00:00:00 2001 +From: Siddhesh Dharme +Date: Thu, 4 Jan 2024 11:37:36 +0530 +Subject: ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP ProBook 440 G6 + +From: Siddhesh Dharme + +commit b6ce6e6c79e4ec650887f1fe391a70e54972001a upstream. + +LEDs in 'HP ProBook 440 G6' laptop are controlled by ALC236 codec. +Enable already existing quirk 'ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF' +to fix mute and mic-mute LEDs. + +Signed-off-by: Siddhesh Dharme +Cc: +Link: https://lore.kernel.org/r/20240104060736.5149-1-siddheshdharme18@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -9709,6 +9709,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN), + SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), + SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360), ++ SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT), + SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT), + SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), diff --git a/queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch b/queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch new file mode 100644 index 00000000000..e67f52662ab --- /dev/null +++ b/queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch @@ -0,0 +1,36 @@ +From 18a434f32fa61b3fda8ddcd9a63d5274569c6a41 Mon Sep 17 00:00:00 2001 +From: Andy Chi +Date: Tue, 2 Jan 2024 10:49:15 +0800 +Subject: ALSA: hda/realtek: fix mute/micmute LEDs for a HP ZBook + +From: Andy Chi + +commit 18a434f32fa61b3fda8ddcd9a63d5274569c6a41 upstream. + +There is a HP ZBook which using ALC236 codec and need the +ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF quirk to make mute LED +and micmute LED work. + +[ confirmed that the new entries are for new models that have no + proper name, so the strings are left as "HP" which will be updated + eventually later -- tiwai ] + +Signed-off-by: Andy Chi +Cc: +Link: https://lore.kernel.org/r/20240102024916.19093-1-andy.chi@canonical.com +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -9836,6 +9836,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), ++ SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), diff --git a/queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch b/queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch new file mode 100644 index 00000000000..ba39f188d75 --- /dev/null +++ b/queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch @@ -0,0 +1,106 @@ +From 6dad45f4d28977bd1948973107cf325d431e5b7e Mon Sep 17 00:00:00 2001 +From: Gergo Koteles +Date: Fri, 22 Dec 2023 00:48:56 +0100 +Subject: ALSA: hda/tas2781: do not use regcache + +From: Gergo Koteles + +commit 6dad45f4d28977bd1948973107cf325d431e5b7e upstream. + +There are two problems with using regcache in this module. + +The amplifier has 3 addressing levels (BOOK, PAGE, REG). The firmware +contains blocks that must be written to BOOK 0x8C. The regcache doesn't +know anything about BOOK, so regcache_sync writes invalid values to the +actual BOOK. + +The module handles 2 or more separate amplifiers. The amplifiers have +different register values, and the module uses only one regmap/regcache +for all the amplifiers. The regcache_sync only writes the last amplifier +used. + +The module successfully restores all the written register values (RC +profile, program, configuration, calibration) without regcache. + +Remove regcache functions and set regmap cache_type to REGCACHE_NONE. + +Link: https://lore.kernel.org/r/21a183b5a08cb23b193af78d4b1114cc59419272.1701906455.git.soyer@irl.hu/ + +Fixes: 5be27f1e3ec9 ("ALSA: hda/tas2781: Add tas2781 HDA driver") +Acked-by: Mark Brown +CC: stable@vger.kernel.org +Signed-off-by: Gergo Koteles +Link: https://lore.kernel.org/r/491aeed0e2eecc3b704ec856f815db21bad3ba0e.1703202126.git.soyer@irl.hu +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/tas2781_hda_i2c.c | 17 +---------------- + sound/soc/codecs/tas2781-comlib.c | 2 +- + 2 files changed, 2 insertions(+), 17 deletions(-) + +--- a/sound/pci/hda/tas2781_hda_i2c.c ++++ b/sound/pci/hda/tas2781_hda_i2c.c +@@ -717,8 +717,6 @@ static int tas2781_runtime_suspend(struc + tas_priv->tasdevice[i].cur_conf = -1; + } + +- regcache_cache_only(tas_priv->regmap, true); +- regcache_mark_dirty(tas_priv->regmap); + + mutex_unlock(&tas_priv->codec_lock); + +@@ -730,20 +728,11 @@ static int tas2781_runtime_resume(struct + struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); + unsigned long calib_data_sz = + tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE; +- int ret; + + dev_dbg(tas_priv->dev, "Runtime Resume\n"); + + mutex_lock(&tas_priv->codec_lock); + +- regcache_cache_only(tas_priv->regmap, false); +- ret = regcache_sync(tas_priv->regmap); +- if (ret) { +- dev_err(tas_priv->dev, +- "Failed to restore register cache: %d\n", ret); +- goto out; +- } +- + tasdevice_prmg_load(tas_priv, tas_priv->cur_prog); + + /* If calibrated data occurs error, dsp will still works with default +@@ -752,10 +741,9 @@ static int tas2781_runtime_resume(struct + if (tas_priv->cali_data.total_sz > calib_data_sz) + tas2781_apply_calib(tas_priv); + +-out: + mutex_unlock(&tas_priv->codec_lock); + +- return ret; ++ return 0; + } + + static int tas2781_system_suspend(struct device *dev) +@@ -770,10 +758,7 @@ static int tas2781_system_suspend(struct + return ret; + + /* Shutdown chip before system suspend */ +- regcache_cache_only(tas_priv->regmap, false); + tasdevice_tuning_switch(tas_priv, 1); +- regcache_cache_only(tas_priv->regmap, true); +- regcache_mark_dirty(tas_priv->regmap); + + /* + * Reset GPIO may be shared, so cannot reset here. +--- a/sound/soc/codecs/tas2781-comlib.c ++++ b/sound/soc/codecs/tas2781-comlib.c +@@ -39,7 +39,7 @@ static const struct regmap_range_cfg tas + static const struct regmap_config tasdevice_regmap = { + .reg_bits = 8, + .val_bits = 8, +- .cache_type = REGCACHE_RBTREE, ++ .cache_type = REGCACHE_NONE, + .ranges = tasdevice_ranges, + .num_ranges = ARRAY_SIZE(tasdevice_ranges), + .max_register = 256 * 128, diff --git a/queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch b/queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch new file mode 100644 index 00000000000..e9cb239afdd --- /dev/null +++ b/queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch @@ -0,0 +1,65 @@ +From e7aa105657f7f62f54a493480588895cc8a9a1a7 Mon Sep 17 00:00:00 2001 +From: Gergo Koteles +Date: Fri, 22 Dec 2023 01:34:47 +0100 +Subject: ALSA: hda/tas2781: move set_drv_data outside tasdevice_init + +From: Gergo Koteles + +commit e7aa105657f7f62f54a493480588895cc8a9a1a7 upstream. + +allow driver specific driver data in tas2781-hda-i2c and tas2781-i2c + +Fixes: ef3bcde75d06 ("ASoC: tas2781: Add tas2781 driver") +CC: stable@vger.kernel.org +Signed-off-by: Gergo Koteles +Link: https://lore.kernel.org/r/1398bd8bf3e935b1595a99128320e4a1913e210a.1703204848.git.soyer@irl.hu +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/tas2781_hda_i2c.c | 2 ++ + sound/soc/codecs/tas2781-comlib.c | 2 -- + sound/soc/codecs/tas2781-i2c.c | 2 ++ + 3 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c +index 54d135405788..6d11bced78f0 100644 +--- a/sound/pci/hda/tas2781_hda_i2c.c ++++ b/sound/pci/hda/tas2781_hda_i2c.c +@@ -659,6 +659,8 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt) + if (!tas_priv) + return -ENOMEM; + ++ dev_set_drvdata(&clt->dev, tas_priv); ++ + tas_priv->irq_info.irq = clt->irq; + ret = tas2781_read_acpi(tas_priv, device_name); + if (ret) +diff --git a/sound/soc/codecs/tas2781-comlib.c b/sound/soc/codecs/tas2781-comlib.c +index 933cd008e9f5..00e35169ae49 100644 +--- a/sound/soc/codecs/tas2781-comlib.c ++++ b/sound/soc/codecs/tas2781-comlib.c +@@ -316,8 +316,6 @@ int tasdevice_init(struct tasdevice_priv *tas_priv) + tas_priv->tasdevice[i].cur_conf = -1; + } + +- dev_set_drvdata(tas_priv->dev, tas_priv); +- + mutex_init(&tas_priv->codec_lock); + + out: +diff --git a/sound/soc/codecs/tas2781-i2c.c b/sound/soc/codecs/tas2781-i2c.c +index 55cd5e3c23a5..917b1c15f71d 100644 +--- a/sound/soc/codecs/tas2781-i2c.c ++++ b/sound/soc/codecs/tas2781-i2c.c +@@ -689,6 +689,8 @@ static int tasdevice_i2c_probe(struct i2c_client *i2c) + if (!tas_priv) + return -ENOMEM; + ++ dev_set_drvdata(&i2c->dev, tas_priv); ++ + if (ACPI_HANDLE(&i2c->dev)) { + acpi_id = acpi_match_device(i2c->dev.driver->acpi_match_table, + &i2c->dev); +-- +2.43.0 + diff --git a/queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch b/queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch new file mode 100644 index 00000000000..b2a34a1beae --- /dev/null +++ b/queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch @@ -0,0 +1,474 @@ +From 4e7914eb1dae377b8e6de59c96b0653aacb47646 Mon Sep 17 00:00:00 2001 +From: Gergo Koteles +Date: Fri, 22 Dec 2023 01:34:48 +0100 +Subject: ALSA: hda/tas2781: remove sound controls in unbind + +From: Gergo Koteles + +commit 4e7914eb1dae377b8e6de59c96b0653aacb47646 upstream. + +Remove sound controls in hda_unbind to make +module loadable after module unload. + +Add a driver specific struct (tas2781_hda) to store +the controls. + +This patch depends on patch: +ALSA: hda/tas2781: do not use regcache + +Fixes: 5be27f1e3ec9 ("ALSA: hda/tas2781: Add tas2781 HDA driver") +CC: stable@vger.kernel.org +Signed-off-by: Gergo Koteles +Link: https://lore.kernel.org/r/362aa3e2f81b9259a3e5222f576bec5debfc5e88.1703204848.git.soyer@irl.hu +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/pci/hda/tas2781_hda_i2c.c | 223 +++++++++++++++++++------------- + 1 file changed, 130 insertions(+), 93 deletions(-) + +diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c +index 6d11bced78f0..dfe281b57aa6 100644 +--- a/sound/pci/hda/tas2781_hda_i2c.c ++++ b/sound/pci/hda/tas2781_hda_i2c.c +@@ -65,6 +65,15 @@ enum calib_data { + CALIB_MAX + }; + ++struct tas2781_hda { ++ struct device *dev; ++ struct tasdevice_priv *priv; ++ struct snd_kcontrol *dsp_prog_ctl; ++ struct snd_kcontrol *dsp_conf_ctl; ++ struct snd_kcontrol *prof_ctl; ++ struct snd_kcontrol *snd_ctls[3]; ++}; ++ + static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data) + { + struct tasdevice_priv *tas_priv = data; +@@ -125,26 +134,26 @@ static int tas2781_read_acpi(struct tasdevice_priv *p, const char *hid) + + static void tas2781_hda_playback_hook(struct device *dev, int action) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + +- dev_dbg(tas_priv->dev, "%s: action = %d\n", __func__, action); ++ dev_dbg(tas_hda->dev, "%s: action = %d\n", __func__, action); + switch (action) { + case HDA_GEN_PCM_ACT_OPEN: + pm_runtime_get_sync(dev); +- mutex_lock(&tas_priv->codec_lock); +- tasdevice_tuning_switch(tas_priv, 0); +- mutex_unlock(&tas_priv->codec_lock); ++ mutex_lock(&tas_hda->priv->codec_lock); ++ tasdevice_tuning_switch(tas_hda->priv, 0); ++ mutex_unlock(&tas_hda->priv->codec_lock); + break; + case HDA_GEN_PCM_ACT_CLOSE: +- mutex_lock(&tas_priv->codec_lock); +- tasdevice_tuning_switch(tas_priv, 1); +- mutex_unlock(&tas_priv->codec_lock); ++ mutex_lock(&tas_hda->priv->codec_lock); ++ tasdevice_tuning_switch(tas_hda->priv, 1); ++ mutex_unlock(&tas_hda->priv->codec_lock); + + pm_runtime_mark_last_busy(dev); + pm_runtime_put_autosuspend(dev); + break; + default: +- dev_dbg(tas_priv->dev, "Playback action not supported: %d\n", ++ dev_dbg(tas_hda->dev, "Playback action not supported: %d\n", + action); + break; + } +@@ -477,9 +486,28 @@ static int tas2781_save_calibration(struct tasdevice_priv *tas_priv) + return 0; + } + ++static void tas2781_hda_remove_controls(struct tas2781_hda *tas_hda) ++{ ++ struct hda_codec *codec = tas_hda->priv->codec; ++ ++ if (tas_hda->dsp_prog_ctl) ++ snd_ctl_remove(codec->card, tas_hda->dsp_prog_ctl); ++ ++ if (tas_hda->dsp_conf_ctl) ++ snd_ctl_remove(codec->card, tas_hda->dsp_conf_ctl); ++ ++ for (int i = ARRAY_SIZE(tas_hda->snd_ctls) - 1; i >= 0; i--) ++ if (tas_hda->snd_ctls[i]) ++ snd_ctl_remove(codec->card, tas_hda->snd_ctls[i]); ++ ++ if (tas_hda->prof_ctl) ++ snd_ctl_remove(codec->card, tas_hda->prof_ctl); ++} ++ + static void tasdev_fw_ready(const struct firmware *fmw, void *context) + { + struct tasdevice_priv *tas_priv = context; ++ struct tas2781_hda *tas_hda = dev_get_drvdata(tas_priv->dev); + struct hda_codec *codec = tas_priv->codec; + int i, ret; + +@@ -490,8 +518,8 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context) + if (ret) + goto out; + +- ret = snd_ctl_add(codec->card, +- snd_ctl_new1(&tas2781_prof_ctrl, tas_priv)); ++ tas_hda->prof_ctl = snd_ctl_new1(&tas2781_prof_ctrl, tas_priv); ++ ret = snd_ctl_add(codec->card, tas_hda->prof_ctl); + if (ret) { + dev_err(tas_priv->dev, + "Failed to add KControl %s = %d\n", +@@ -500,8 +528,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context) + } + + for (i = 0; i < ARRAY_SIZE(tas2781_snd_controls); i++) { +- ret = snd_ctl_add(codec->card, +- snd_ctl_new1(&tas2781_snd_controls[i], tas_priv)); ++ tas_hda->snd_ctls[i] = snd_ctl_new1(&tas2781_snd_controls[i], ++ tas_priv); ++ ret = snd_ctl_add(codec->card, tas_hda->snd_ctls[i]); + if (ret) { + dev_err(tas_priv->dev, + "Failed to add KControl %s = %d\n", +@@ -523,8 +552,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context) + goto out; + } + +- ret = snd_ctl_add(codec->card, +- snd_ctl_new1(&tas2781_dsp_prog_ctrl, tas_priv)); ++ tas_hda->dsp_prog_ctl = snd_ctl_new1(&tas2781_dsp_prog_ctrl, ++ tas_priv); ++ ret = snd_ctl_add(codec->card, tas_hda->dsp_prog_ctl); + if (ret) { + dev_err(tas_priv->dev, + "Failed to add KControl %s = %d\n", +@@ -532,8 +562,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context) + goto out; + } + +- ret = snd_ctl_add(codec->card, +- snd_ctl_new1(&tas2781_dsp_conf_ctrl, tas_priv)); ++ tas_hda->dsp_conf_ctl = snd_ctl_new1(&tas2781_dsp_conf_ctrl, ++ tas_priv); ++ ret = snd_ctl_add(codec->card, tas_hda->dsp_conf_ctl); + if (ret) { + dev_err(tas_priv->dev, + "Failed to add KControl %s = %d\n", +@@ -554,27 +585,27 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context) + tas2781_save_calibration(tas_priv); + + out: +- mutex_unlock(&tas_priv->codec_lock); ++ mutex_unlock(&tas_hda->priv->codec_lock); + if (fmw) + release_firmware(fmw); +- pm_runtime_mark_last_busy(tas_priv->dev); +- pm_runtime_put_autosuspend(tas_priv->dev); ++ pm_runtime_mark_last_busy(tas_hda->dev); ++ pm_runtime_put_autosuspend(tas_hda->dev); + } + + static int tas2781_hda_bind(struct device *dev, struct device *master, + void *master_data) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + struct hda_component *comps = master_data; + struct hda_codec *codec; + unsigned int subid; + int ret; + +- if (!comps || tas_priv->index < 0 || +- tas_priv->index >= HDA_MAX_COMPONENTS) ++ if (!comps || tas_hda->priv->index < 0 || ++ tas_hda->priv->index >= HDA_MAX_COMPONENTS) + return -EINVAL; + +- comps = &comps[tas_priv->index]; ++ comps = &comps[tas_hda->priv->index]; + if (comps->dev) + return -EBUSY; + +@@ -583,10 +614,10 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, + + switch (subid) { + case 0x17aa: +- tas_priv->catlog_id = LENOVO; ++ tas_hda->priv->catlog_id = LENOVO; + break; + default: +- tas_priv->catlog_id = OTHERS; ++ tas_hda->priv->catlog_id = OTHERS; + break; + } + +@@ -596,7 +627,7 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, + + strscpy(comps->name, dev_name(dev), sizeof(comps->name)); + +- ret = tascodec_init(tas_priv, codec, tasdev_fw_ready); ++ ret = tascodec_init(tas_hda->priv, codec, tasdev_fw_ready); + if (!ret) + comps->playback_hook = tas2781_hda_playback_hook; + +@@ -609,9 +640,9 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, + static void tas2781_hda_unbind(struct device *dev, + struct device *master, void *master_data) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + struct hda_component *comps = master_data; +- comps = &comps[tas_priv->index]; ++ comps = &comps[tas_hda->priv->index]; + + if (comps->dev == dev) { + comps->dev = NULL; +@@ -619,10 +650,12 @@ static void tas2781_hda_unbind(struct device *dev, + comps->playback_hook = NULL; + } + +- tasdevice_config_info_remove(tas_priv); +- tasdevice_dsp_remove(tas_priv); ++ tas2781_hda_remove_controls(tas_hda); + +- tas_priv->fw_state = TASDEVICE_DSP_FW_PENDING; ++ tasdevice_config_info_remove(tas_hda->priv); ++ tasdevice_dsp_remove(tas_hda->priv); ++ ++ tas_hda->priv->fw_state = TASDEVICE_DSP_FW_PENDING; + } + + static const struct component_ops tas2781_hda_comp_ops = { +@@ -632,21 +665,21 @@ static const struct component_ops tas2781_hda_comp_ops = { + + static void tas2781_hda_remove(struct device *dev) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + +- pm_runtime_get_sync(tas_priv->dev); +- pm_runtime_disable(tas_priv->dev); ++ pm_runtime_get_sync(tas_hda->dev); ++ pm_runtime_disable(tas_hda->dev); + +- component_del(tas_priv->dev, &tas2781_hda_comp_ops); ++ component_del(tas_hda->dev, &tas2781_hda_comp_ops); + +- pm_runtime_put_noidle(tas_priv->dev); ++ pm_runtime_put_noidle(tas_hda->dev); + +- tasdevice_remove(tas_priv); ++ tasdevice_remove(tas_hda->priv); + } + + static int tas2781_hda_i2c_probe(struct i2c_client *clt) + { +- struct tasdevice_priv *tas_priv; ++ struct tas2781_hda *tas_hda; + const char *device_name; + int ret; + +@@ -655,37 +688,42 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt) + else + return -ENODEV; + +- tas_priv = tasdevice_kzalloc(clt); +- if (!tas_priv) ++ tas_hda = devm_kzalloc(&clt->dev, sizeof(*tas_hda), GFP_KERNEL); ++ if (!tas_hda) + return -ENOMEM; + +- dev_set_drvdata(&clt->dev, tas_priv); ++ dev_set_drvdata(&clt->dev, tas_hda); ++ tas_hda->dev = &clt->dev; + +- tas_priv->irq_info.irq = clt->irq; +- ret = tas2781_read_acpi(tas_priv, device_name); ++ tas_hda->priv = tasdevice_kzalloc(clt); ++ if (!tas_hda->priv) ++ return -ENOMEM; ++ ++ tas_hda->priv->irq_info.irq = clt->irq; ++ ret = tas2781_read_acpi(tas_hda->priv, device_name); + if (ret) +- return dev_err_probe(tas_priv->dev, ret, ++ return dev_err_probe(tas_hda->dev, ret, + "Platform not supported\n"); + +- ret = tasdevice_init(tas_priv); ++ ret = tasdevice_init(tas_hda->priv); + if (ret) + goto err; + +- pm_runtime_set_autosuspend_delay(tas_priv->dev, 3000); +- pm_runtime_use_autosuspend(tas_priv->dev); +- pm_runtime_mark_last_busy(tas_priv->dev); +- pm_runtime_set_active(tas_priv->dev); +- pm_runtime_get_noresume(tas_priv->dev); +- pm_runtime_enable(tas_priv->dev); ++ pm_runtime_set_autosuspend_delay(tas_hda->dev, 3000); ++ pm_runtime_use_autosuspend(tas_hda->dev); ++ pm_runtime_mark_last_busy(tas_hda->dev); ++ pm_runtime_set_active(tas_hda->dev); ++ pm_runtime_get_noresume(tas_hda->dev); ++ pm_runtime_enable(tas_hda->dev); + +- pm_runtime_put_autosuspend(tas_priv->dev); ++ pm_runtime_put_autosuspend(tas_hda->dev); + +- tas2781_reset(tas_priv); ++ tas2781_reset(tas_hda->priv); + +- ret = component_add(tas_priv->dev, &tas2781_hda_comp_ops); ++ ret = component_add(tas_hda->dev, &tas2781_hda_comp_ops); + if (ret) { +- dev_err(tas_priv->dev, "Register component failed: %d\n", ret); +- pm_runtime_disable(tas_priv->dev); ++ dev_err(tas_hda->dev, "Register component failed: %d\n", ret); ++ pm_runtime_disable(tas_hda->dev); + } + + err: +@@ -701,66 +739,65 @@ static void tas2781_hda_i2c_remove(struct i2c_client *clt) + + static int tas2781_runtime_suspend(struct device *dev) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + int i; + +- dev_dbg(tas_priv->dev, "Runtime Suspend\n"); ++ dev_dbg(tas_hda->dev, "Runtime Suspend\n"); + +- mutex_lock(&tas_priv->codec_lock); ++ mutex_lock(&tas_hda->priv->codec_lock); + +- if (tas_priv->playback_started) { +- tasdevice_tuning_switch(tas_priv, 1); +- tas_priv->playback_started = false; ++ if (tas_hda->priv->playback_started) { ++ tasdevice_tuning_switch(tas_hda->priv, 1); ++ tas_hda->priv->playback_started = false; + } + +- for (i = 0; i < tas_priv->ndev; i++) { +- tas_priv->tasdevice[i].cur_book = -1; +- tas_priv->tasdevice[i].cur_prog = -1; +- tas_priv->tasdevice[i].cur_conf = -1; ++ for (i = 0; i < tas_hda->priv->ndev; i++) { ++ tas_hda->priv->tasdevice[i].cur_book = -1; ++ tas_hda->priv->tasdevice[i].cur_prog = -1; ++ tas_hda->priv->tasdevice[i].cur_conf = -1; + } + +- +- mutex_unlock(&tas_priv->codec_lock); ++ mutex_unlock(&tas_hda->priv->codec_lock); + + return 0; + } + + static int tas2781_runtime_resume(struct device *dev) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + unsigned long calib_data_sz = +- tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE; ++ tas_hda->priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE; + +- dev_dbg(tas_priv->dev, "Runtime Resume\n"); ++ dev_dbg(tas_hda->dev, "Runtime Resume\n"); + +- mutex_lock(&tas_priv->codec_lock); ++ mutex_lock(&tas_hda->priv->codec_lock); + +- tasdevice_prmg_load(tas_priv, tas_priv->cur_prog); ++ tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog); + + /* If calibrated data occurs error, dsp will still works with default + * calibrated data inside algo. + */ +- if (tas_priv->cali_data.total_sz > calib_data_sz) +- tas2781_apply_calib(tas_priv); ++ if (tas_hda->priv->cali_data.total_sz > calib_data_sz) ++ tas2781_apply_calib(tas_hda->priv); + +- mutex_unlock(&tas_priv->codec_lock); ++ mutex_unlock(&tas_hda->priv->codec_lock); + + return 0; + } + + static int tas2781_system_suspend(struct device *dev) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + int ret; + +- dev_dbg(tas_priv->dev, "System Suspend\n"); ++ dev_dbg(tas_hda->priv->dev, "System Suspend\n"); + + ret = pm_runtime_force_suspend(dev); + if (ret) + return ret; + + /* Shutdown chip before system suspend */ +- tasdevice_tuning_switch(tas_priv, 1); ++ tasdevice_tuning_switch(tas_hda->priv, 1); + + /* + * Reset GPIO may be shared, so cannot reset here. +@@ -771,33 +808,33 @@ static int tas2781_system_suspend(struct device *dev) + + static int tas2781_system_resume(struct device *dev) + { +- struct tasdevice_priv *tas_priv = dev_get_drvdata(dev); ++ struct tas2781_hda *tas_hda = dev_get_drvdata(dev); + unsigned long calib_data_sz = +- tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE; ++ tas_hda->priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE; + int i, ret; + +- dev_dbg(tas_priv->dev, "System Resume\n"); ++ dev_info(tas_hda->priv->dev, "System Resume\n"); + + ret = pm_runtime_force_resume(dev); + if (ret) + return ret; + +- mutex_lock(&tas_priv->codec_lock); ++ mutex_lock(&tas_hda->priv->codec_lock); + +- for (i = 0; i < tas_priv->ndev; i++) { +- tas_priv->tasdevice[i].cur_book = -1; +- tas_priv->tasdevice[i].cur_prog = -1; +- tas_priv->tasdevice[i].cur_conf = -1; ++ for (i = 0; i < tas_hda->priv->ndev; i++) { ++ tas_hda->priv->tasdevice[i].cur_book = -1; ++ tas_hda->priv->tasdevice[i].cur_prog = -1; ++ tas_hda->priv->tasdevice[i].cur_conf = -1; + } +- tas2781_reset(tas_priv); +- tasdevice_prmg_load(tas_priv, tas_priv->cur_prog); ++ tas2781_reset(tas_hda->priv); ++ tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog); + + /* If calibrated data occurs error, dsp will still work with default + * calibrated data inside algo. + */ +- if (tas_priv->cali_data.total_sz > calib_data_sz) +- tas2781_apply_calib(tas_priv); +- mutex_unlock(&tas_priv->codec_lock); ++ if (tas_hda->priv->cali_data.total_sz > calib_data_sz) ++ tas2781_apply_calib(tas_hda->priv); ++ mutex_unlock(&tas_hda->priv->codec_lock); + + return 0; + } +-- +2.43.0 + diff --git a/queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch b/queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch new file mode 100644 index 00000000000..c3f559b445a --- /dev/null +++ b/queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch @@ -0,0 +1,64 @@ +From 7257bcf3bdc785eabc4eef1f329a59815b032508 Mon Sep 17 00:00:00 2001 +From: Shyam Prasad N +Date: Fri, 29 Dec 2023 11:16:15 +0000 +Subject: cifs: cifs_chan_is_iface_active should be called with chan_lock held + +From: Shyam Prasad N + +commit 7257bcf3bdc785eabc4eef1f329a59815b032508 upstream. + +cifs_chan_is_iface_active checks the channels of a session to see +if the associated iface is active. This should always happen +with chan_lock held. However, these two callers of this function +were missing this locking. + +This change makes sure the function calls are protected with +proper locking. + +Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary") +Fixes: fa1d0508bdd4 ("cifs: account for primary channel in the interface list") +Cc: stable@vger.kernel.org +Signed-off-by: Shyam Prasad N +Signed-off-by: Steve French +Signed-off-by: Greg Kroah-Hartman +--- + fs/smb/client/connect.c | 7 +++++-- + fs/smb/client/smb2ops.c | 7 ++++++- + 2 files changed, 11 insertions(+), 3 deletions(-) + +--- a/fs/smb/client/connect.c ++++ b/fs/smb/client/connect.c +@@ -209,10 +209,13 @@ cifs_mark_tcp_ses_conns_for_reconnect(st + spin_lock(&cifs_tcp_ses_lock); + list_for_each_entry_safe(ses, nses, &pserver->smb_ses_list, smb_ses_list) { + /* check if iface is still active */ +- if (!cifs_chan_is_iface_active(ses, server)) ++ spin_lock(&ses->chan_lock); ++ if (!cifs_chan_is_iface_active(ses, server)) { ++ spin_unlock(&ses->chan_lock); + cifs_chan_update_iface(ses, server); ++ spin_lock(&ses->chan_lock); ++ } + +- spin_lock(&ses->chan_lock); + if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) { + spin_unlock(&ses->chan_lock); + continue; +--- a/fs/smb/client/smb2ops.c ++++ b/fs/smb/client/smb2ops.c +@@ -782,9 +782,14 @@ SMB3_request_interfaces(const unsigned i + goto out; + + /* check if iface is still active */ ++ spin_lock(&ses->chan_lock); + pserver = ses->chans[0].server; +- if (pserver && !cifs_chan_is_iface_active(ses, pserver)) ++ if (pserver && !cifs_chan_is_iface_active(ses, pserver)) { ++ spin_unlock(&ses->chan_lock); + cifs_chan_update_iface(ses, pserver); ++ spin_lock(&ses->chan_lock); ++ } ++ spin_unlock(&ses->chan_lock); + + out: + kfree(out_buf); diff --git a/queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch b/queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch new file mode 100644 index 00000000000..f91b0b79dfc --- /dev/null +++ b/queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch @@ -0,0 +1,96 @@ +From 09eeb0723f219fbd96d8865bf9b935e03ee2ec22 Mon Sep 17 00:00:00 2001 +From: Shyam Prasad N +Date: Fri, 29 Dec 2023 11:16:16 +0000 +Subject: cifs: do not depend on release_iface for maintaining iface_list + +From: Shyam Prasad N + +commit 09eeb0723f219fbd96d8865bf9b935e03ee2ec22 upstream. + +parse_server_interfaces should be in complete charge of maintaining +the iface_list linked list. Today, iface entries are removed +from the list only when the last refcount is dropped. +i.e. in release_iface. However, this can result in undercounting +of refcount if the server stops advertising interfaces (which +Azure SMB server does). + +This change puts parse_server_interfaces in full charge of +maintaining the iface_list. So if an empty list is returned +by the server, the entries in the list will immediately be +removed. This way, a following call to the same function will +not find entries in the list. + +Fixes: aa45dadd34e4 ("cifs: change iface_list from array to sorted linked list") +Cc: stable@vger.kernel.org +Signed-off-by: Shyam Prasad N +Signed-off-by: Steve French +Signed-off-by: Greg Kroah-Hartman +--- + fs/smb/client/cifsglob.h | 1 - + fs/smb/client/smb2ops.c | 27 +++++++++++++++++---------- + 2 files changed, 17 insertions(+), 11 deletions(-) + +--- a/fs/smb/client/cifsglob.h ++++ b/fs/smb/client/cifsglob.h +@@ -993,7 +993,6 @@ release_iface(struct kref *ref) + struct cifs_server_iface *iface = container_of(ref, + struct cifs_server_iface, + refcount); +- list_del_init(&iface->iface_head); + kfree(iface); + } + +--- a/fs/smb/client/smb2ops.c ++++ b/fs/smb/client/smb2ops.c +@@ -593,16 +593,12 @@ parse_server_interfaces(struct network_i + } + + /* +- * Go through iface_list and do kref_put to remove +- * any unused ifaces. ifaces in use will be removed +- * when the last user calls a kref_put on it ++ * Go through iface_list and mark them as inactive + */ + list_for_each_entry_safe(iface, niface, &ses->iface_list, +- iface_head) { ++ iface_head) + iface->is_active = 0; +- kref_put(&iface->refcount, release_iface); +- ses->iface_count--; +- } ++ + spin_unlock(&ses->iface_lock); + + /* +@@ -676,10 +672,7 @@ parse_server_interfaces(struct network_i + iface_head) { + ret = iface_cmp(iface, &tmp_iface); + if (!ret) { +- /* just get a ref so that it doesn't get picked/freed */ + iface->is_active = 1; +- kref_get(&iface->refcount); +- ses->iface_count++; + spin_unlock(&ses->iface_lock); + goto next_iface; + } else if (ret < 0) { +@@ -746,6 +739,20 @@ next_iface: + } + + out: ++ /* ++ * Go through the list again and put the inactive entries ++ */ ++ spin_lock(&ses->iface_lock); ++ list_for_each_entry_safe(iface, niface, &ses->iface_list, ++ iface_head) { ++ if (!iface->is_active) { ++ list_del(&iface->iface_head); ++ kref_put(&iface->refcount, release_iface); ++ ses->iface_count--; ++ } ++ } ++ spin_unlock(&ses->iface_lock); ++ + return rc; + } + diff --git a/queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch b/queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch new file mode 100644 index 00000000000..d9b7c11366b --- /dev/null +++ b/queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch @@ -0,0 +1,39 @@ +From 9cdef4f720376ef0fb0febce1ed2377c19e531f9 Mon Sep 17 00:00:00 2001 +From: Wayne Lin +Date: Mon, 4 Dec 2023 10:09:33 +0800 +Subject: drm/amd/display: pbn_div need be updated for hotplug event + +From: Wayne Lin + +commit 9cdef4f720376ef0fb0febce1ed2377c19e531f9 upstream. + +link_rate sometime will be changed when DP MST connector hotplug, so +pbn_div also need be updated; otherwise, it will mismatch with +link_rate, causes no output in external monitor. + +This is a backport to 6.7 and older. + +Cc: stable@vger.kernel.org +Tested-by: Daniel Wheeler +Reviewed-by: Jerry Zuo +Acked-by: Rodrigo Siqueira +Signed-off-by: Wade Wang +Signed-off-by: Wayne Lin +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -6868,8 +6868,7 @@ static int dm_encoder_helper_atomic_chec + if (IS_ERR(mst_state)) + return PTR_ERR(mst_state); + +- if (!mst_state->pbn_div) +- mst_state->pbn_div = dm_mst_get_pbn_divider(aconnector->mst_root->dc_link); ++ mst_state->pbn_div = dm_mst_get_pbn_divider(aconnector->mst_root->dc_link); + + if (!state->duplicated) { + int max_bpc = conn_state->max_requested_bpc; diff --git a/queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch b/queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch new file mode 100644 index 00000000000..09ad1424065 --- /dev/null +++ b/queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch @@ -0,0 +1,116 @@ +From 11f9eb899ecc8c02b769cf8d2532ba12786a7af7 Mon Sep 17 00:00:00 2001 +From: Jocelyn Falempe +Date: Thu, 14 Dec 2023 17:38:06 +0100 +Subject: drm/mgag200: Fix gamma lut not initialized for G200ER, G200EV, G200SE + +From: Jocelyn Falempe + +commit 11f9eb899ecc8c02b769cf8d2532ba12786a7af7 upstream. + +When mgag200 switched from simple KMS to regular atomic helpers, +the initialization of the gamma settings was lost. +This leads to a black screen, if the bios/uefi doesn't use the same +pixel color depth. +This has been fixed with commit ad81e23426a6 ("drm/mgag200: Fix gamma +lut not initialized.") for most G200, but G200ER, G200EV, G200SE use +their own version of crtc_helper_atomic_enable() and need to be fixed +too. + +Fixes: 1baf9127c482 ("drm/mgag200: Replace simple-KMS with regular atomic helpers") +Cc: #v6.1+ +Reported-by: Roger Sewell +Suggested-by: Roger Sewell +Signed-off-by: Jocelyn Falempe +Reviewed-by: Thomas Zimmermann +Link: https://patchwork.freedesktop.org/patch/msgid/20231214163849.359691-1-jfalempe@redhat.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/mgag200/mgag200_drv.h | 5 +++++ + drivers/gpu/drm/mgag200/mgag200_g200er.c | 5 +++++ + drivers/gpu/drm/mgag200/mgag200_g200ev.c | 5 +++++ + drivers/gpu/drm/mgag200/mgag200_g200se.c | 5 +++++ + drivers/gpu/drm/mgag200/mgag200_mode.c | 10 +++++----- + 5 files changed, 25 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/mgag200/mgag200_drv.h ++++ b/drivers/gpu/drm/mgag200/mgag200_drv.h +@@ -392,6 +392,11 @@ void mgag200_primary_plane_helper_atomic + .destroy = drm_plane_cleanup, \ + DRM_GEM_SHADOW_PLANE_FUNCS + ++void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, const struct drm_format_info *format); ++void mgag200_crtc_set_gamma(struct mga_device *mdev, ++ const struct drm_format_info *format, ++ struct drm_color_lut *lut); ++ + enum drm_mode_status mgag200_crtc_helper_mode_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode); + int mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); +--- a/drivers/gpu/drm/mgag200/mgag200_g200er.c ++++ b/drivers/gpu/drm/mgag200/mgag200_g200er.c +@@ -202,6 +202,11 @@ static void mgag200_g200er_crtc_helper_a + + mgag200_g200er_reset_tagfifo(mdev); + ++ if (crtc_state->gamma_lut) ++ mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); ++ else ++ mgag200_crtc_set_gamma_linear(mdev, format); ++ + mgag200_enable_display(mdev); + + if (funcs->enable_vidrst) +--- a/drivers/gpu/drm/mgag200/mgag200_g200ev.c ++++ b/drivers/gpu/drm/mgag200/mgag200_g200ev.c +@@ -203,6 +203,11 @@ static void mgag200_g200ev_crtc_helper_a + + mgag200_g200ev_set_hiprilvl(mdev); + ++ if (crtc_state->gamma_lut) ++ mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); ++ else ++ mgag200_crtc_set_gamma_linear(mdev, format); ++ + mgag200_enable_display(mdev); + + if (funcs->enable_vidrst) +--- a/drivers/gpu/drm/mgag200/mgag200_g200se.c ++++ b/drivers/gpu/drm/mgag200/mgag200_g200se.c +@@ -334,6 +334,11 @@ static void mgag200_g200se_crtc_helper_a + + mgag200_g200se_set_hiprilvl(mdev, adjusted_mode, format); + ++ if (crtc_state->gamma_lut) ++ mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); ++ else ++ mgag200_crtc_set_gamma_linear(mdev, format); ++ + mgag200_enable_display(mdev); + + if (funcs->enable_vidrst) +--- a/drivers/gpu/drm/mgag200/mgag200_mode.c ++++ b/drivers/gpu/drm/mgag200/mgag200_mode.c +@@ -28,8 +28,8 @@ + * This file contains setup code for the CRTC. + */ + +-static void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, +- const struct drm_format_info *format) ++void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, ++ const struct drm_format_info *format) + { + int i; + +@@ -65,9 +65,9 @@ static void mgag200_crtc_set_gamma_linea + } + } + +-static void mgag200_crtc_set_gamma(struct mga_device *mdev, +- const struct drm_format_info *format, +- struct drm_color_lut *lut) ++void mgag200_crtc_set_gamma(struct mga_device *mdev, ++ const struct drm_format_info *format, ++ struct drm_color_lut *lut) + { + int i; + diff --git a/queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch b/queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch new file mode 100644 index 00000000000..ee6c8964ea5 --- /dev/null +++ b/queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch @@ -0,0 +1,74 @@ +From 971079464001c6856186ca137778e534d983174a Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 4 Jan 2024 16:15:17 +0100 +Subject: KVM: x86/pmu: fix masking logic for MSR_CORE_PERF_GLOBAL_CTRL + +From: Paolo Bonzini + +commit 971079464001c6856186ca137778e534d983174a upstream. + +When commit c59a1f106f5c ("KVM: x86/pmu: Add IA32_PEBS_ENABLE +MSR emulation for extended PEBS") switched the initialization of +cpuc->guest_switch_msrs to use compound literals, it screwed up +the boolean logic: + ++ u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable; +... +- arr[0].guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask; +- arr[0].guest &= ~(cpuc->pebs_enabled & x86_pmu.pebs_capable); ++ .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask), + +Before the patch, the value of arr[0].guest would have been intel_ctrl & +~cpuc->intel_ctrl_host_mask & ~pebs_mask. The intent is to always treat +PEBS events as host-only because, while the guest runs, there is no way +to tell the processor about the virtual address where to put PEBS records +intended for the host. + +Unfortunately, the new expression can be expanded to + + (intel_ctrl & ~cpuc->intel_ctrl_host_mask) | (intel_ctrl & ~pebs_mask) + +which makes no sense; it includes any bit that isn't *both* marked as +exclude_guest and using PEBS. So, reinstate the old logic. Another +way to write it could be "intel_ctrl & ~(cpuc->intel_ctrl_host_mask | +pebs_mask)", presumably the intention of the author of the faulty. +However, I personally find the repeated application of A AND NOT B to +be a bit more readable. + +This shows up as guest failures when running concurrent long-running +perf workloads on the host, and was reported to happen with rcutorture. +All guests on a given host would die simultaneously with something like an +instruction fault or a segmentation violation. + +Reported-by: Paul E. McKenney +Analyzed-by: Sean Christopherson +Tested-by: Paul E. McKenney +Cc: stable@vger.kernel.org +Fixes: c59a1f106f5c ("KVM: x86/pmu: Add IA32_PEBS_ENABLE MSR emulation for extended PEBS") +Signed-off-by: Paolo Bonzini +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/events/intel/core.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/arch/x86/events/intel/core.c ++++ b/arch/x86/events/intel/core.c +@@ -4062,12 +4062,17 @@ static struct perf_guest_switch_msr *int + u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable; + int global_ctrl, pebs_enable; + ++ /* ++ * In addition to obeying exclude_guest/exclude_host, remove bits being ++ * used for PEBS when running a guest, because PEBS writes to virtual ++ * addresses (not physical addresses). ++ */ + *nr = 0; + global_ctrl = (*nr)++; + arr[global_ctrl] = (struct perf_guest_switch_msr){ + .msr = MSR_CORE_PERF_GLOBAL_CTRL, + .host = intel_ctrl & ~cpuc->intel_ctrl_guest_mask, +- .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask), ++ .guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask & ~pebs_mask, + }; + + if (!x86_pmu.pebs) diff --git a/queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch b/queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch new file mode 100644 index 00000000000..bc6014ba33e --- /dev/null +++ b/queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch @@ -0,0 +1,72 @@ +From 4c0288299fd09ee7c6fbe2f57421f314d8c981db Mon Sep 17 00:00:00 2001 +From: Paolo Abeni +Date: Tue, 26 Dec 2023 13:10:18 +0100 +Subject: mptcp: prevent tcp diag from closing listener subflows + +From: Paolo Abeni + +commit 4c0288299fd09ee7c6fbe2f57421f314d8c981db upstream. + +The MPTCP protocol does not expect that any other entity could change +the first subflow status when such socket is listening. +Unfortunately the TCP diag interface allows aborting any TCP socket, +including MPTCP listeners subflows. As reported by syzbot, that trigger +a WARN() and could lead to later bigger trouble. + +The MPTCP protocol needs to do some MPTCP-level cleanup actions to +properly shutdown the listener. To keep the fix simple, prevent +entirely the diag interface from stopping such listeners. + +We could refine the diag callback in a later, larger patch targeting +net-next. + +Fixes: 57fc0f1ceaa4 ("mptcp: ensure listener is unhashed before updating the sk status") +Cc: stable@vger.kernel.org +Reported-by: +Closes: https://lore.kernel.org/netdev/0000000000004f4579060c68431b@google.com/ +Signed-off-by: Paolo Abeni +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts +Link: https://lore.kernel.org/r/20231226-upstream-net-20231226-mptcp-prevent-warn-v1-2-1404dcc431ea@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/subflow.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/net/mptcp/subflow.c ++++ b/net/mptcp/subflow.c +@@ -1974,6 +1974,17 @@ static void tcp_release_cb_override(stru + tcp_release_cb(ssk); + } + ++static int tcp_abort_override(struct sock *ssk, int err) ++{ ++ /* closing a listener subflow requires a great deal of care. ++ * keep it simple and just prevent such operation ++ */ ++ if (inet_sk_state_load(ssk) == TCP_LISTEN) ++ return -EINVAL; ++ ++ return tcp_abort(ssk, err); ++} ++ + static struct tcp_ulp_ops subflow_ulp_ops __read_mostly = { + .name = "mptcp", + .owner = THIS_MODULE, +@@ -2018,6 +2029,7 @@ void __init mptcp_subflow_init(void) + + tcp_prot_override = tcp_prot; + tcp_prot_override.release_cb = tcp_release_cb_override; ++ tcp_prot_override.diag_destroy = tcp_abort_override; + + #if IS_ENABLED(CONFIG_MPTCP_IPV6) + /* In struct mptcp_subflow_request_sock, we assume the TCP request sock +@@ -2054,6 +2066,7 @@ void __init mptcp_subflow_init(void) + + tcpv6_prot_override = tcpv6_prot; + tcpv6_prot_override.release_cb = tcp_release_cb_override; ++ tcpv6_prot_override.diag_destroy = tcp_abort_override; + #endif + + mptcp_diag_subflow_init(&subflow_ulp_ops); diff --git a/queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch b/queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch new file mode 100644 index 00000000000..71fbb86e4d0 --- /dev/null +++ b/queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch @@ -0,0 +1,103 @@ +From f93e71aea6c60ebff8adbd8941e678302d377869 Mon Sep 17 00:00:00 2001 +From: Bjorn Helgaas +Date: Mon, 1 Jan 2024 12:08:18 -0600 +Subject: Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()" + +From: Bjorn Helgaas + +commit f93e71aea6c60ebff8adbd8941e678302d377869 upstream. + +This reverts commit 08d0cc5f34265d1a1e3031f319f594bd1970976c. + +Michael reported that when attempting to resume from suspend to RAM on ASUS +mini PC PN51-BB757MDE1 (DMI model: MINIPC PN51-E1), 08d0cc5f3426 +("PCI/ASPM: Remove pcie_aspm_pm_state_change()") caused a 12-second delay +with no output, followed by a reboot. + +Workarounds include: + + - Reverting 08d0cc5f3426 ("PCI/ASPM: Remove pcie_aspm_pm_state_change()") + - Booting with "pcie_aspm=off" + - Booting with "pcie_aspm.policy=performance" + - "echo 0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/link/l1_aspm" + before suspending + - Connecting a USB flash drive + +Link: https://lore.kernel.org/r/20240102232550.1751655-1-helgaas@kernel.org +Fixes: 08d0cc5f3426 ("PCI/ASPM: Remove pcie_aspm_pm_state_change()") +Reported-by: Michael Schaller +Link: https://lore.kernel.org/r/76c61361-b8b4-435f-a9f1-32b716763d62@5challer.de +Signed-off-by: Bjorn Helgaas +Cc: +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pci/pci.c | 6 ++++++ + drivers/pci/pci.h | 2 ++ + drivers/pci/pcie/aspm.c | 19 +++++++++++++++++++ + 3 files changed, 27 insertions(+) + +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -1335,6 +1335,9 @@ static int pci_set_full_power_state(stru + pci_restore_bars(dev); + } + ++ if (dev->bus->self) ++ pcie_aspm_pm_state_change(dev->bus->self); ++ + return 0; + } + +@@ -1429,6 +1432,9 @@ static int pci_set_low_power_state(struc + pci_power_name(dev->current_state), + pci_power_name(state)); + ++ if (dev->bus->self) ++ pcie_aspm_pm_state_change(dev->bus->self); ++ + return 0; + } + +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -566,10 +566,12 @@ int pcie_retrain_link(struct pci_dev *pd + #ifdef CONFIG_PCIEASPM + void pcie_aspm_init_link_state(struct pci_dev *pdev); + void pcie_aspm_exit_link_state(struct pci_dev *pdev); ++void pcie_aspm_pm_state_change(struct pci_dev *pdev); + void pcie_aspm_powersave_config_link(struct pci_dev *pdev); + #else + static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { } + static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { } ++static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { } + static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { } + #endif + +--- a/drivers/pci/pcie/aspm.c ++++ b/drivers/pci/pcie/aspm.c +@@ -1001,6 +1001,25 @@ void pcie_aspm_exit_link_state(struct pc + up_read(&pci_bus_sem); + } + ++/* @pdev: the root port or switch downstream port */ ++void pcie_aspm_pm_state_change(struct pci_dev *pdev) ++{ ++ struct pcie_link_state *link = pdev->link_state; ++ ++ if (aspm_disabled || !link) ++ return; ++ /* ++ * Devices changed PM state, we should recheck if latency ++ * meets all functions' requirement ++ */ ++ down_read(&pci_bus_sem); ++ mutex_lock(&aspm_lock); ++ pcie_update_aspm_capable(link->root); ++ pcie_config_aspm_path(link); ++ mutex_unlock(&aspm_lock); ++ up_read(&pci_bus_sem); ++} ++ + void pcie_aspm_powersave_config_link(struct pci_dev *pdev) + { + struct pcie_link_state *link = pdev->link_state; diff --git a/queue-6.6/series b/queue-6.6/series index 513ba449a4a..5a68b6e9455 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -1,4 +1,17 @@ keys-dns-fix-missing-size-check-of-v1-server-list-header.patch +alsa-hda-tas2781-do-not-use-regcache.patch +alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch +alsa-hda-tas2781-remove-sound-controls-in-unbind.patch +alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch +alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch +alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch +drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch +mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch +revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch +drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch +cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch +cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch +kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch accel-qaic-fix-gem-import-path-code.patch accel-qaic-implement-quirk-for-soc_hw_version.patch wifi-iwlwifi-pcie-don-t-synchronize-irqs-from-irq.patch