From 8b15f2ac9c2eef4e05e3daafb27600f191fa36ce Mon Sep 17 00:00:00 2001
From: j1nx
Date: Sun, 27 Aug 2023 09:06:29 +0000
Subject: [PATCH] [RPI] Bump kernel and firmware to 6.1.47 Also include a
kernel patch to speed up mmc driver.
---
buildroot | 2 +-
...sdhci-fix-max-req-size-based-on-spec.patch | 101 ++++++++++++++++++
buildroot-external/configs/rpi4_64_defconfig | 4 +-
3 files changed, 104 insertions(+), 3 deletions(-)
create mode 100644 buildroot-external/board/ovos/raspberrypi/patches/kernel/0001-mmc-sdhci-fix-max-req-size-based-on-spec.patch
diff --git a/buildroot b/buildroot
index af24d335..5a65958d 160000
--- a/buildroot
+++ b/buildroot
@@ -1 +1 @@
-Subproject commit af24d3356004f9be28048800f32c7abbf93f80d1
+Subproject commit 5a65958d8312b68ae237d8e2ecc7cd44e715eb7f
diff --git a/buildroot-external/board/ovos/raspberrypi/patches/kernel/0001-mmc-sdhci-fix-max-req-size-based-on-spec.patch b/buildroot-external/board/ovos/raspberrypi/patches/kernel/0001-mmc-sdhci-fix-max-req-size-based-on-spec.patch
new file mode 100644
index 00000000..d01be00f
--- /dev/null
+++ b/buildroot-external/board/ovos/raspberrypi/patches/kernel/0001-mmc-sdhci-fix-max-req-size-based-on-spec.patch
@@ -0,0 +1,101 @@
+From 79e6ac0d94c3f60efbf9720b4df8f9313a689441 Mon Sep 17 00:00:00 2001
+From: CTCaer
+Date: Thu, 10 Aug 2023 21:00:51 +0100
+Subject: [PATCH] mmc: sdhci: fix max req size based on spec
+
+For almost 2 decades, the max allowed requests were limited to 512KB because of
+SDMA's max 512KiB boundary limit.
+
+ADMA2 and ADMA3 do not have such limits and were effectively made so any
+kind of block count would not impose interrupt and managing stress to the host.
+
+By limiting that to 512KiB, it effectively downgrades these DMA modes to SDMA.
+
+Fix that by actually following the spec:
+When ADMA is selected tuning mode is advised.
+On lesser modes 4MiB transfers is selected as max, so re-tuning if timer trigger
+or if requested by host interrupt, can be done in time.
+Otherwise, the only limit is the variable size of types used.
+In this implementation, 16MiB is used as maximum since tests showed that after
+that point, there are diminishing returns.
+
+Also 16MiB in worst case scenarios, when card is eMMC and its max speed is a
+generous 350MiB/s, will generate interrupts every 45ms on huge data transfers.
+
+A new `adma_get_req_limit` sdhci host function was also introduced, to let
+vendors override imposed limits by the generic implementation if needed.
+
+For example, on local tests with rigorous CPU/GPU burn-in tests and abrupt
+cut-offs to generate huge temperature changes (upwards/downwards) to the card,
+tested host was fine up to 128MB/s transfers on slow cards that used SDR104
+bus timing without re-tuning.
+In that case the 4MiB limit was overridden with a more than safe 8MiB value.
+
+In all testing cases and boards, that change brought the following:
+
+Depending on bus timing and eMMC/SD specs:
+* Max Read throughput increased by 2-20%
+* Max Write throughput increased by 50-200%
+Depending on CPU frequency and transfer sizes:
+* Reduced mmcqd cpu core usage by 4-50%
+
+Signed-off-by: CTCaer
+---
+ drivers/mmc/host/sdhci.c | 17 ++++++++++++-----
+ drivers/mmc/host/sdhci.h | 4 ++--
+ 2 files changed, 14 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
+index 84d0d7ac0ae65..518fbaa62e092 100644
+--- a/drivers/mmc/host/sdhci.c
++++ b/drivers/mmc/host/sdhci.c
+@@ -1095,7 +1095,7 @@ static void sdhci_initialize_data(struct sdhci_host *host,
+ WARN_ON(host->data);
+
+ /* Sanity checks */
+- BUG_ON(data->blksz * data->blocks > 524288);
++ BUG_ON(data->blksz * data->blocks > host->mmc->max_req_size);
+ BUG_ON(data->blksz > host->mmc->max_blk_size);
+ BUG_ON(data->blocks > 65535);
+
+@@ -4720,11 +4720,18 @@ int sdhci_setup_host(struct sdhci_host *host)
+
+ /*
+ * Maximum number of sectors in one transfer. Limited by SDMA boundary
+- * size (512KiB). Note some tuning modes impose a 4MiB limit, but this
+- * is less anyway.
++ * size and by tuning modes on ADMA. On tuning mode 3 16MiB is more than
++ * enough to cover big data transfers.
+ */
+- mmc->max_req_size = 524288;
+-
++ if (host->flags & SDHCI_USE_ADMA) {
++ if (host->tuning_mode != SDHCI_TUNING_MODE_3)
++ mmc->max_req_size = 4194304;
++ else
++ mmc->max_req_size = 16777216;
++ } else {
++ /* On PIO/SDMA use SDMA boundary size (512KiB). */
++ mmc->max_req_size = 524288;
++ }
+ /*
+ * Maximum number of segments. Depends on if the hardware
+ * can do scatter/gather or not.
+diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
+index 5ce7cdcc192fd..7c85aeee814d6 100644
+--- a/drivers/mmc/host/sdhci.h
++++ b/drivers/mmc/host/sdhci.h
+@@ -339,11 +339,11 @@ struct sdhci_adma2_64_desc {
+ #define ADMA2_END 0x2
+
+ /*
+- * Maximum segments assuming a 512KiB maximum requisition size and a minimum
++ * Maximum segments assuming a 16MiB maximum requisition size and a minimum
+ * 4KiB page size. Note this also allows enough for multiple descriptors in
+ * case of PAGE_SIZE >= 64KiB.
+ */
+-#define SDHCI_MAX_SEGS 128
++#define SDHCI_MAX_SEGS 4096
+
+ /* Allow for a a command request and a data request at the same time */
+ #define SDHCI_MAX_MRQS 2
diff --git a/buildroot-external/configs/rpi4_64_defconfig b/buildroot-external/configs/rpi4_64_defconfig
index d8bd85a0..46e4dc53 100644
--- a/buildroot-external/configs/rpi4_64_defconfig
+++ b/buildroot-external/configs/rpi4_64_defconfig
@@ -7,7 +7,7 @@ BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_DL_DIR="../../downloads"
BR2_OPTIMIZE_2=y
BR2_ENABLE_LTO=y
-BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL)/patches"
+BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL)/patches $(BR2_EXTERNAL)/board/ovos/raspberrypi/patches"
BR2_FORCE_HOST_BUILD=y
BR2_SSP_REGULAR=y
BR2_TARGET_GENERIC_HOSTNAME="OpenVoiceOS"
@@ -27,7 +27,7 @@ BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL)/board/ovos/raspberrypi/rpi4/post-i
BR2_ROOTFS_POST_SCRIPT_ARGS="--rpi4"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
-BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,9ed4f05ba2e2bcd9065831674e97b2b1283e866d)/linux-9ed4f05ba2e2bcd9065831674e97b2b1283e866d.tar.gz"
+BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,655fc658a15ae7a6f37103754adb39ba52a9a14e)/linux-655fc658a15ae7a6f37103754adb39ba52a9a14e.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="bcm2711"
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL)/kernel/ovos.config $(BR2_EXTERNAL)/kernel/device-drivers.config $(BR2_EXTERNAL)/kernel/docker.config $(BR2_EXTERNAL)/board/ovos/raspberrypi/kernel.config"
BR2_LINUX_KERNEL_LZ4=y