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