From 2fb9d3d5c3ea63d70fbd943b109094ba226d7a6d Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 27 Jan 2025 12:05:01 -0500 Subject: [PATCH] Fixes for 6.1 Signed-off-by: Sasha Levin --- ...c-samsung-add-missing-depends-on-i2c.patch | 49 +++++++++++ ...g-add-missing-selects-for-mfd_wm8994.patch | 48 +++++++++++ ...as_wm1811-map-missing-jack-kcontrols.patch | 83 +++++++++++++++++++ .../asoc-wm8994-add-depends-on-mfd-core.patch | 38 +++++++++ ...amd-display-use-hw-lock-mgr-for-psr1.patch | 43 ++++++++++ ...sunxi-nmi-add-missing-skip_wake-flag.patch | 44 ++++++++++ ...edundant-response-for-iscsi_uevent_g.patch | 53 ++++++++++++ .../seccomp-stub-for-config_seccomp.patch | 50 +++++++++++ queue-6.1/series | 8 ++ 9 files changed, 416 insertions(+) create mode 100644 queue-6.1/asoc-samsung-add-missing-depends-on-i2c.patch create mode 100644 queue-6.1/asoc-samsung-add-missing-selects-for-mfd_wm8994.patch create mode 100644 queue-6.1/asoc-samsung-midas_wm1811-map-missing-jack-kcontrols.patch create mode 100644 queue-6.1/asoc-wm8994-add-depends-on-mfd-core.patch create mode 100644 queue-6.1/drm-amd-display-use-hw-lock-mgr-for-psr1.patch create mode 100644 queue-6.1/irqchip-sunxi-nmi-add-missing-skip_wake-flag.patch create mode 100644 queue-6.1/scsi-iscsi-fix-redundant-response-for-iscsi_uevent_g.patch create mode 100644 queue-6.1/seccomp-stub-for-config_seccomp.patch create mode 100644 queue-6.1/series diff --git a/queue-6.1/asoc-samsung-add-missing-depends-on-i2c.patch b/queue-6.1/asoc-samsung-add-missing-depends-on-i2c.patch new file mode 100644 index 0000000000..3e67e60660 --- /dev/null +++ b/queue-6.1/asoc-samsung-add-missing-depends-on-i2c.patch @@ -0,0 +1,49 @@ +From 8a70a8039b87c2b4008fcdeb2a119f457ee83fc6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jan 2025 13:48:28 +0000 +Subject: ASoC: samsung: Add missing depends on I2C + +From: Charles Keepax + +[ Upstream commit 704dbe97a68153a84319ad63f526e12ba868b88e ] + +When switching to selects for MFD_WM8994 a dependency should have also +been added for I2C, as the dependency on MFD_WM8994 will not be +considered by the select. + +Fixes: fd55c6065bec ("ASoC: samsung: Add missing selects for MFD_WM8994") +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202501082020.2bpGGVTW-lkp@intel.com/ +Signed-off-by: Charles Keepax +Link: https://patch.msgid.link/20250108134828.246570-1-ckeepax@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/Kconfig | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig +index 6bf9fd720d4bf..a529852144f98 100644 +--- a/sound/soc/samsung/Kconfig ++++ b/sound/soc/samsung/Kconfig +@@ -220,7 +220,7 @@ config SND_SOC_SAMSUNG_TM2_WM5110 + + config SND_SOC_SAMSUNG_ARIES_WM8994 + tristate "SoC I2S Audio support for WM8994 on Aries" +- depends on SND_SOC_SAMSUNG && IIO && EXTCON ++ depends on SND_SOC_SAMSUNG && I2C && IIO && EXTCON + select SND_SOC_BT_SCO + select MFD_WM8994 + select SND_SOC_WM8994 +@@ -234,7 +234,7 @@ config SND_SOC_SAMSUNG_ARIES_WM8994 + + config SND_SOC_SAMSUNG_MIDAS_WM1811 + tristate "SoC I2S Audio support for Midas boards" +- depends on SND_SOC_SAMSUNG ++ depends on SND_SOC_SAMSUNG && I2C + select SND_SAMSUNG_I2S + select MFD_WM8994 + select SND_SOC_WM8994 +-- +2.39.5 + diff --git a/queue-6.1/asoc-samsung-add-missing-selects-for-mfd_wm8994.patch b/queue-6.1/asoc-samsung-add-missing-selects-for-mfd_wm8994.patch new file mode 100644 index 0000000000..2af1a78668 --- /dev/null +++ b/queue-6.1/asoc-samsung-add-missing-selects-for-mfd_wm8994.patch @@ -0,0 +1,48 @@ +From a80a4c9d23e07bd3c54cd23e5ee30446adfd3343 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jan 2025 10:41:34 +0000 +Subject: ASoC: samsung: Add missing selects for MFD_WM8994 + +From: Charles Keepax + +[ Upstream commit fd55c6065bec5268740e944a1800e6fad00974d9 ] + +Anything selecting SND_SOC_WM8994 should also select MFD_WM8994, as +SND_SOC_WM8994 does not automatically do so. Add the missing selects. + +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202501071530.UwIXs7OL-lkp@intel.com/ +Signed-off-by: Charles Keepax +Link: https://patch.msgid.link/20250107104134.12147-1-ckeepax@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/Kconfig | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig +index 2a61e620cd3b0..6bf9fd720d4bf 100644 +--- a/sound/soc/samsung/Kconfig ++++ b/sound/soc/samsung/Kconfig +@@ -220,8 +220,9 @@ config SND_SOC_SAMSUNG_TM2_WM5110 + + config SND_SOC_SAMSUNG_ARIES_WM8994 + tristate "SoC I2S Audio support for WM8994 on Aries" +- depends on SND_SOC_SAMSUNG && MFD_WM8994 && IIO && EXTCON ++ depends on SND_SOC_SAMSUNG && IIO && EXTCON + select SND_SOC_BT_SCO ++ select MFD_WM8994 + select SND_SOC_WM8994 + select SND_SAMSUNG_I2S + help +@@ -235,6 +236,7 @@ config SND_SOC_SAMSUNG_MIDAS_WM1811 + tristate "SoC I2S Audio support for Midas boards" + depends on SND_SOC_SAMSUNG + select SND_SAMSUNG_I2S ++ select MFD_WM8994 + select SND_SOC_WM8994 + help + Say Y if you want to add support for SoC audio on the Midas boards. +-- +2.39.5 + diff --git a/queue-6.1/asoc-samsung-midas_wm1811-map-missing-jack-kcontrols.patch b/queue-6.1/asoc-samsung-midas_wm1811-map-missing-jack-kcontrols.patch new file mode 100644 index 0000000000..46e51461cc --- /dev/null +++ b/queue-6.1/asoc-samsung-midas_wm1811-map-missing-jack-kcontrols.patch @@ -0,0 +1,83 @@ +From 7ab2cb5d0ae008a8b29a9b38d1bd4ce29ab6bfb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Aug 2023 20:57:37 +0300 +Subject: ASoC: samsung: midas_wm1811: Map missing jack kcontrols + +From: Alper Nebi Yasak + +[ Upstream commit d27224a45e5457ad89195d92decdd57596253428 ] + +This driver does not map jack pins to kcontrols that PulseAudio/PipeWire +need to handle jack detection events. The WM1811 codec used here seems +to support detecting Headphone and Headset Mic connections. Expose each +to userspace as a kcontrol and add the necessary widgets. + +Signed-off-by: Alper Nebi Yasak +Link: https://lore.kernel.org/r/20230802175737.263412-28-alpernebiyasak@gmail.com +Signed-off-by: Mark Brown +Stable-dep-of: 704dbe97a681 ("ASoC: samsung: Add missing depends on I2C") +Signed-off-by: Sasha Levin +--- + sound/soc/samsung/midas_wm1811.c | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +diff --git a/sound/soc/samsung/midas_wm1811.c b/sound/soc/samsung/midas_wm1811.c +index 6931b9a45b3e5..44b32f5cddcac 100644 +--- a/sound/soc/samsung/midas_wm1811.c ++++ b/sound/soc/samsung/midas_wm1811.c +@@ -38,6 +38,17 @@ struct midas_priv { + struct snd_soc_jack headset_jack; + }; + ++static struct snd_soc_jack_pin headset_jack_pins[] = { ++ { ++ .pin = "Headphone", ++ .mask = SND_JACK_HEADPHONE, ++ }, ++ { ++ .pin = "Headset Mic", ++ .mask = SND_JACK_MICROPHONE, ++ }, ++}; ++ + static int midas_start_fll1(struct snd_soc_pcm_runtime *rtd, unsigned int rate) + { + struct snd_soc_card *card = rtd->card; +@@ -246,6 +257,7 @@ static const struct snd_kcontrol_new midas_controls[] = { + SOC_DAPM_PIN_SWITCH("Main Mic"), + SOC_DAPM_PIN_SWITCH("Sub Mic"), + SOC_DAPM_PIN_SWITCH("Headset Mic"), ++ SOC_DAPM_PIN_SWITCH("Headphone"), + + SOC_DAPM_PIN_SWITCH("FM In"), + }; +@@ -261,6 +273,7 @@ static const struct snd_soc_dapm_widget midas_dapm_widgets[] = { + SND_SOC_DAPM_LINE("HDMI", NULL), + SND_SOC_DAPM_LINE("FM In", midas_fm_set), + ++ SND_SOC_DAPM_HP("Headphone", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Main Mic", midas_mic_bias), + SND_SOC_DAPM_MIC("Sub Mic", midas_submic_bias), +@@ -305,11 +318,13 @@ static int midas_late_probe(struct snd_soc_card *card) + return ret; + } + +- ret = snd_soc_card_jack_new(card, "Headset", +- SND_JACK_HEADSET | SND_JACK_MECHANICAL | +- SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | +- SND_JACK_BTN_3 | SND_JACK_BTN_4 | SND_JACK_BTN_5, +- &priv->headset_jack); ++ ret = snd_soc_card_jack_new_pins(card, "Headset", ++ SND_JACK_HEADSET | SND_JACK_MECHANICAL | ++ SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | ++ SND_JACK_BTN_3 | SND_JACK_BTN_4 | SND_JACK_BTN_5, ++ &priv->headset_jack, ++ headset_jack_pins, ++ ARRAY_SIZE(headset_jack_pins)); + if (ret) + return ret; + +-- +2.39.5 + diff --git a/queue-6.1/asoc-wm8994-add-depends-on-mfd-core.patch b/queue-6.1/asoc-wm8994-add-depends-on-mfd-core.patch new file mode 100644 index 0000000000..be62287c9c --- /dev/null +++ b/queue-6.1/asoc-wm8994-add-depends-on-mfd-core.patch @@ -0,0 +1,38 @@ +From 0e77864367b9f9adc0413c9b6c67c27d50c02f0d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Jan 2025 15:46:39 +0000 +Subject: ASoC: wm8994: Add depends on MFD core + +From: Charles Keepax + +[ Upstream commit 5ed01155cea69801f1f0c908954a56a5a3474bed ] + +The ASoC driver should not be used without the MFD component. This was +causing randconfig issues with regmap IRQ which is selected by the MFD +part of the wm8994 driver. + +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202501061337.R0DlBUoD-lkp@intel.com/ +Signed-off-by: Charles Keepax +Link: https://patch.msgid.link/20250106154639.3999553-1-ckeepax@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig +index 0904827e2f3db..627e9fc92f0b8 100644 +--- a/sound/soc/codecs/Kconfig ++++ b/sound/soc/codecs/Kconfig +@@ -1982,6 +1982,7 @@ config SND_SOC_WM8993 + + config SND_SOC_WM8994 + tristate ++ depends on MFD_WM8994 + + config SND_SOC_WM8995 + tristate +-- +2.39.5 + diff --git a/queue-6.1/drm-amd-display-use-hw-lock-mgr-for-psr1.patch b/queue-6.1/drm-amd-display-use-hw-lock-mgr-for-psr1.patch new file mode 100644 index 0000000000..64d871ab11 --- /dev/null +++ b/queue-6.1/drm-amd-display-use-hw-lock-mgr-for-psr1.patch @@ -0,0 +1,43 @@ +From 7d25969eabe5f8bdffe2d6106ebae9e27d1d8b8b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Oct 2024 17:13:07 +0800 +Subject: drm/amd/display: Use HW lock mgr for PSR1 + +From: Tom Chung + +[ Upstream commit b5c764d6ed556c4e81fbe3fd976da77ec450c08e ] + +[Why] +Without the dmub hw lock, it may cause the lock timeout issue +while do modeset on PSR1 eDP panel. + +[How] +Allow dmub hw lock for PSR1. + +Reviewed-by: Sun peng Li +Signed-off-by: Tom Chung +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +(cherry picked from commit a2b5a9956269f4c1a09537177f18ab0229fe79f7) +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c +index 3f32e9c3fbaf4..8d7b2eee8c7c3 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c +@@ -65,7 +65,8 @@ void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv, + + bool should_use_dmub_lock(struct dc_link *link) + { +- if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1) ++ if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 || ++ link->psr_settings.psr_version == DC_PSR_VERSION_1) + return true; + return false; + } +-- +2.39.5 + diff --git a/queue-6.1/irqchip-sunxi-nmi-add-missing-skip_wake-flag.patch b/queue-6.1/irqchip-sunxi-nmi-add-missing-skip_wake-flag.patch new file mode 100644 index 0000000000..f67802718d --- /dev/null +++ b/queue-6.1/irqchip-sunxi-nmi-add-missing-skip_wake-flag.patch @@ -0,0 +1,44 @@ +From 70e33774ae366df2fba1f9604fa59990cd777aee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 12 Jan 2025 13:34:02 +0100 +Subject: irqchip/sunxi-nmi: Add missing SKIP_WAKE flag + +From: Philippe Simons + +[ Upstream commit 3a748d483d80f066ca4b26abe45cdc0c367d13e9 ] + +Some boards with Allwinner SoCs connect the PMIC's IRQ pin to the SoC's NMI +pin instead of a normal GPIO. Since the power key is connected to the PMIC, +and people expect to wake up a suspended system via this key, the NMI IRQ +controller must stay alive when the system goes into suspend. + +Add the SKIP_WAKE flag to prevent the sunxi NMI controller from going to +sleep, so that the power key can wake up those systems. + +[ tglx: Fixed up coding style ] + +Signed-off-by: Philippe Simons +Signed-off-by: Thomas Gleixner +Link: https://lore.kernel.org/all/20250112123402.388520-1-simons.philippe@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/irqchip/irq-sunxi-nmi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/irqchip/irq-sunxi-nmi.c b/drivers/irqchip/irq-sunxi-nmi.c +index 21d49791f8552..83c7417611fa5 100644 +--- a/drivers/irqchip/irq-sunxi-nmi.c ++++ b/drivers/irqchip/irq-sunxi-nmi.c +@@ -187,7 +187,8 @@ static int __init sunxi_sc_nmi_irq_init(struct device_node *node, + gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; + gc->chip_types[0].chip.irq_eoi = irq_gc_ack_set_bit; + gc->chip_types[0].chip.irq_set_type = sunxi_sc_nmi_set_type; +- gc->chip_types[0].chip.flags = IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED; ++ gc->chip_types[0].chip.flags = IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED | ++ IRQCHIP_SKIP_SET_WAKE; + gc->chip_types[0].regs.ack = reg_offs->pend; + gc->chip_types[0].regs.mask = reg_offs->enable; + gc->chip_types[0].regs.type = reg_offs->ctrl; +-- +2.39.5 + diff --git a/queue-6.1/scsi-iscsi-fix-redundant-response-for-iscsi_uevent_g.patch b/queue-6.1/scsi-iscsi-fix-redundant-response-for-iscsi_uevent_g.patch new file mode 100644 index 0000000000..98ac1db019 --- /dev/null +++ b/queue-6.1/scsi-iscsi-fix-redundant-response-for-iscsi_uevent_g.patch @@ -0,0 +1,53 @@ +From 4c32af2cf6048a3fd8ad3106cef2a13fdb69ba97 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 Jan 2025 10:24:31 +0800 +Subject: scsi: iscsi: Fix redundant response for ISCSI_UEVENT_GET_HOST_STATS + request + +From: Xiang Zhang + +[ Upstream commit 63ca02221cc5aa0731fe2b0cc28158aaa4b84982 ] + +The ISCSI_UEVENT_GET_HOST_STATS request is already handled in +iscsi_get_host_stats(). This fix ensures that redundant responses are +skipped in iscsi_if_rx(). + + - On success: send reply and stats from iscsi_get_host_stats() + within if_recv_msg(). + + - On error: fall through. + +Signed-off-by: Xiang Zhang +Link: https://lore.kernel.org/r/20250107022432.65390-1-hawkxiang.cpp@gmail.com +Reviewed-by: Mike Christie +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/scsi_transport_iscsi.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index 49dbcd67579aa..687487ea4fd3b 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -4102,7 +4102,7 @@ iscsi_if_rx(struct sk_buff *skb) + } + do { + /* +- * special case for GET_STATS: ++ * special case for GET_STATS, GET_CHAP and GET_HOST_STATS: + * on success - sending reply and stats from + * inside of if_recv_msg(), + * on error - fall through. +@@ -4111,6 +4111,8 @@ iscsi_if_rx(struct sk_buff *skb) + break; + if (ev->type == ISCSI_UEVENT_GET_CHAP && !err) + break; ++ if (ev->type == ISCSI_UEVENT_GET_HOST_STATS && !err) ++ break; + err = iscsi_if_send_reply(portid, nlh->nlmsg_type, + ev, sizeof(*ev)); + if (err == -EAGAIN && --retries < 0) { +-- +2.39.5 + diff --git a/queue-6.1/seccomp-stub-for-config_seccomp.patch b/queue-6.1/seccomp-stub-for-config_seccomp.patch new file mode 100644 index 0000000000..a463033d55 --- /dev/null +++ b/queue-6.1/seccomp-stub-for-config_seccomp.patch @@ -0,0 +1,50 @@ +From 3c35a764dc5bf3552a287014e7a21d1115e0ee57 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Jan 2025 23:44:45 +0100 +Subject: seccomp: Stub for !CONFIG_SECCOMP + +From: Linus Walleij + +[ Upstream commit f90877dd7fb5085dd9abd6399daf63dd2969fc90 ] + +When using !CONFIG_SECCOMP with CONFIG_GENERIC_ENTRY, the +randconfig bots found the following snag: + + kernel/entry/common.c: In function 'syscall_trace_enter': +>> kernel/entry/common.c:52:23: error: implicit declaration + of function '__secure_computing' [-Wimplicit-function-declaration] + 52 | ret = __secure_computing(NULL); + | ^~~~~~~~~~~~~~~~~~ + +Since generic entry calls __secure_computing() unconditionally, +fix this by moving the stub out of the ifdef clause for +CONFIG_HAVE_ARCH_SECCOMP_FILTER so it's always available. + +Link: https://lore.kernel.org/oe-kbuild-all/202501061240.Fzk9qiFZ-lkp@intel.com/ +Signed-off-by: Linus Walleij +Link: https://lore.kernel.org/r/20250108-seccomp-stub-2-v2-1-74523d49420f@linaro.org +Signed-off-by: Kees Cook +Signed-off-by: Sasha Levin +--- + include/linux/seccomp.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/linux/seccomp.h b/include/linux/seccomp.h +index d31d76be49825..91ff537c62462 100644 +--- a/include/linux/seccomp.h ++++ b/include/linux/seccomp.h +@@ -69,10 +69,10 @@ struct seccomp_data; + + #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER + static inline int secure_computing(void) { return 0; } +-static inline int __secure_computing(const struct seccomp_data *sd) { return 0; } + #else + static inline void secure_computing_strict(int this_syscall) { return; } + #endif ++static inline int __secure_computing(const struct seccomp_data *sd) { return 0; } + + static inline long prctl_get_seccomp(void) + { +-- +2.39.5 + diff --git a/queue-6.1/series b/queue-6.1/series new file mode 100644 index 0000000000..06698ec20c --- /dev/null +++ b/queue-6.1/series @@ -0,0 +1,8 @@ +asoc-wm8994-add-depends-on-mfd-core.patch +asoc-samsung-add-missing-selects-for-mfd_wm8994.patch +seccomp-stub-for-config_seccomp.patch +scsi-iscsi-fix-redundant-response-for-iscsi_uevent_g.patch +drm-amd-display-use-hw-lock-mgr-for-psr1.patch +irqchip-sunxi-nmi-add-missing-skip_wake-flag.patch +asoc-samsung-midas_wm1811-map-missing-jack-kcontrols.patch +asoc-samsung-add-missing-depends-on-i2c.patch -- 2.47.3