* [PATCH] mmc: rtsx_pci: add quirk to disable MMC_CAP_AGGRESSIVE_PM for RTS525A
@ 2026-01-03 20:42 Matthew Schwartz
2026-01-05 0:46 ` Matthew Schwartz
0 siblings, 1 reply; 2+ messages in thread
From: Matthew Schwartz @ 2026-01-03 20:42 UTC (permalink / raw)
To: Ulf Hansson, Arnd Bergmann, Ricky Wu, Greg Kroah-Hartman
Cc: linux-mmc, linux-kernel, Matthew Schwartz
Using MMC_CAP_AGGRESSIVE_PM on RTS525A card readers causes game
performance issues when the card reader comes back from idle into active
use. This can be observed in Hades II when loading new sections of the
game or menu after the card reader puts itself into idle, and presents
as a 1-2 second hang.
Add EXTRA_CAPS_NO_AGGRESSIVE_PM quirk to allow cardreader drivers to
opt-out of aggressive PM, and set it for RTS525A.
Closes: https://lore.kernel.org/linux-mmc/ff9a7c20-f465-4afa-bf29-708d4a52974a@linux.dev/
Signed-off-by: Matthew Schwartz <matthew.schwartz@linux.dev>
---
drivers/misc/cardreader/rts5249.c | 3 +++
drivers/mmc/host/rtsx_pci_sdmmc.c | 4 ++--
include/linux/rtsx_pci.h | 1 +
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/misc/cardreader/rts5249.c b/drivers/misc/cardreader/rts5249.c
index 38aefd8db452..87d576a03e68 100644
--- a/drivers/misc/cardreader/rts5249.c
+++ b/drivers/misc/cardreader/rts5249.c
@@ -78,6 +78,9 @@ static void rtsx_base_fetch_vendor_settings(struct rtsx_pcr *pcr)
if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A))
pcr->rtd3_en = rtsx_reg_to_rtd3_uhsii(reg);
+ if (CHK_PCI_PID(pcr, PID_525A))
+ pcr->extra_caps |= EXTRA_CAPS_NO_AGGRESSIVE_PM;
+
if (rtsx_check_mmc_support(reg))
pcr->extra_caps |= EXTRA_CAPS_NO_MMC;
pcr->sd30_drive_sel_3v3 = rtsx_reg_to_sd30_drive_sel_3v3(reg);
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
index dc2587ff8519..5d3599ee06bf 100644
--- a/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -1456,8 +1456,8 @@ static void realtek_init_host(struct realtek_pci_sdmmc *host)
mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
- if (pcr->rtd3_en)
- mmc->caps = mmc->caps | MMC_CAP_AGGRESSIVE_PM;
+ if (pcr->rtd3_en && !(pcr->extra_caps & EXTRA_CAPS_NO_AGGRESSIVE_PM))
+ mmc->caps |= MMC_CAP_AGGRESSIVE_PM;
mmc->caps2 = MMC_CAP2_NO_PRESCAN_POWERUP | MMC_CAP2_FULL_PWR_CYCLE |
MMC_CAP2_NO_SDIO;
mmc->max_current_330 = 400;
diff --git a/include/linux/rtsx_pci.h b/include/linux/rtsx_pci.h
index 3c5689356004..f6122349c00e 100644
--- a/include/linux/rtsx_pci.h
+++ b/include/linux/rtsx_pci.h
@@ -1230,6 +1230,7 @@ struct rtsx_pcr {
#define EXTRA_CAPS_MMC_8BIT (1 << 5)
#define EXTRA_CAPS_NO_MMC (1 << 7)
#define EXTRA_CAPS_SD_EXPRESS (1 << 8)
+#define EXTRA_CAPS_NO_AGGRESSIVE_PM (1 << 9)
u32 extra_caps;
#define IC_VER_A 0
--
2.52.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] mmc: rtsx_pci: add quirk to disable MMC_CAP_AGGRESSIVE_PM for RTS525A
2026-01-03 20:42 [PATCH] mmc: rtsx_pci: add quirk to disable MMC_CAP_AGGRESSIVE_PM for RTS525A Matthew Schwartz
@ 2026-01-05 0:46 ` Matthew Schwartz
0 siblings, 0 replies; 2+ messages in thread
From: Matthew Schwartz @ 2026-01-05 0:46 UTC (permalink / raw)
To: Ulf Hansson, Arnd Bergmann, Ricky Wu, Greg Kroah-Hartman
Cc: linux-mmc, linux-kernel
On 1/3/26 12:42 PM, Matthew Schwartz wrote:
> Using MMC_CAP_AGGRESSIVE_PM on RTS525A card readers causes game
> performance issues when the card reader comes back from idle into active
> use. This can be observed in Hades II when loading new sections of the
> game or menu after the card reader puts itself into idle, and presents
> as a 1-2 second hang.
>
> Add EXTRA_CAPS_NO_AGGRESSIVE_PM quirk to allow cardreader drivers to
> opt-out of aggressive PM, and set it for RTS525A.
Bit of an update: I dug up an old laptop that has a Realtek RTS5261 PCI card reader, and that has the exact same issue under identical circumstances.
It might make more sense to skip the quirking and just make no MMC_CAP_AGGRESSIVE_PM the default in rtsx_pci_sdmmc unless another solution can be found.
Matt
>
> Closes: https://lore.kernel.org/linux-mmc/ff9a7c20-f465-4afa-bf29-708d4a52974a@linux.dev/
> Signed-off-by: Matthew Schwartz <matthew.schwartz@linux.dev>
> ---
> drivers/misc/cardreader/rts5249.c | 3 +++
> drivers/mmc/host/rtsx_pci_sdmmc.c | 4 ++--
> include/linux/rtsx_pci.h | 1 +
> 3 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/misc/cardreader/rts5249.c b/drivers/misc/cardreader/rts5249.c
> index 38aefd8db452..87d576a03e68 100644
> --- a/drivers/misc/cardreader/rts5249.c
> +++ b/drivers/misc/cardreader/rts5249.c
> @@ -78,6 +78,9 @@ static void rtsx_base_fetch_vendor_settings(struct rtsx_pcr *pcr)
> if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A))
> pcr->rtd3_en = rtsx_reg_to_rtd3_uhsii(reg);
>
> + if (CHK_PCI_PID(pcr, PID_525A))
> + pcr->extra_caps |= EXTRA_CAPS_NO_AGGRESSIVE_PM;
> +
> if (rtsx_check_mmc_support(reg))
> pcr->extra_caps |= EXTRA_CAPS_NO_MMC;
> pcr->sd30_drive_sel_3v3 = rtsx_reg_to_sd30_drive_sel_3v3(reg);
> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
> index dc2587ff8519..5d3599ee06bf 100644
> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c
> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
> @@ -1456,8 +1456,8 @@ static void realtek_init_host(struct realtek_pci_sdmmc *host)
> mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
> MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
> MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
> - if (pcr->rtd3_en)
> - mmc->caps = mmc->caps | MMC_CAP_AGGRESSIVE_PM;
> + if (pcr->rtd3_en && !(pcr->extra_caps & EXTRA_CAPS_NO_AGGRESSIVE_PM))
> + mmc->caps |= MMC_CAP_AGGRESSIVE_PM;
> mmc->caps2 = MMC_CAP2_NO_PRESCAN_POWERUP | MMC_CAP2_FULL_PWR_CYCLE |
> MMC_CAP2_NO_SDIO;
> mmc->max_current_330 = 400;
> diff --git a/include/linux/rtsx_pci.h b/include/linux/rtsx_pci.h
> index 3c5689356004..f6122349c00e 100644
> --- a/include/linux/rtsx_pci.h
> +++ b/include/linux/rtsx_pci.h
> @@ -1230,6 +1230,7 @@ struct rtsx_pcr {
> #define EXTRA_CAPS_MMC_8BIT (1 << 5)
> #define EXTRA_CAPS_NO_MMC (1 << 7)
> #define EXTRA_CAPS_SD_EXPRESS (1 << 8)
> +#define EXTRA_CAPS_NO_AGGRESSIVE_PM (1 << 9)
> u32 extra_caps;
>
> #define IC_VER_A 0
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-01-05 0:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-03 20:42 [PATCH] mmc: rtsx_pci: add quirk to disable MMC_CAP_AGGRESSIVE_PM for RTS525A Matthew Schwartz
2026-01-05 0:46 ` Matthew Schwartz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®