Message ID | 20240808031444.9619-1-semen.protsenko@linaro.org |
---|---|
Headers | show |
Series | mmc: dw_mmc: Enable eMMC on E850-96 board | expand |
Hi Minkyu, What do you think about this series? It's been pending for a while now, so may I ask you to take care of it? Thanks! On Wed, Aug 7, 2024 at 10:14 PM Sam Protsenko <semen.protsenko@linaro.org> wrote: > > Bring 64-bit support to dw_mmc core and Exynos dw_mmc drivers, and > enable it on E850-96 board. Additionally do some related cleanups and > device tree updates. > > 64-bit version of DesignWare MMC can be often found on modern ARM64 > chips. It's different from its older 32-bit version (which is already > implemented in U-Boot): some new registers were added, existing > register addresses are changed, DMA descriptor table is different, etc. > Next Exynos chips are known to have 64-bit DW MMC block: > > - Exynos3475 > - Exynos5433 > - Exynos7420 > - Exynos7570 > - Exynos7580 > - Exynos7870 > - Exynos7872 > - Exynos7880 > - Exynos7885 > - Exynos7890 > - Exynos850 (Exynos3830) > > Exynos DW MMC driver was updated too: ARM64 Exynos chips implement their > clock drivers using CCF framework, pinmux configuration is done at > startup in DM capable pinctrl drivers, device tree properties were > changed w.r.t. their upstream (Linux kernel) counterparts. CLKSEL > register address is also different on 64-bit Exynos platforms. > > The patch series was tested on E850-96 board by running mainline Linux > kernel with Debian rootfs from eMMC ("boot" partition) with these > commands: > > 8<-------------------------------------------------------------------->8 > env set fdtaddr 0x8a000000 > env set bootaddr 0x94000000 > env set boot_kerneladdr 0x94000800 > part start mmc 0 boot boot_start > part size mmc 0 boot boot_size > mmc read $bootaddr $boot_start $boot_size > abootimg addr $bootaddr > abootimg get dtb --index=0 dtb_start dtb_size > cp.b $dtb_start $fdtaddr $dtb_size > fdt addr $fdtaddr 0x100000 > cp.b $boot_kerneladdr $loadaddr 2aaaa00 > env set bootargs console=ttySAC0,115200n8 printk.devkmsg=on \ > root=/dev/mmcblk0p12 rootwait rw > booti $loadaddr - $fdtaddr > 8<-------------------------------------------------------------------->8 > > For E850-96 eMMC to function properly in DDR mode, the pending patch [1] > has to be applied. Otherwise it won't be possible for exynos_dw_mmc > driver to change CIU clock rate from 200 MHz up to 400 MHz, and MMC will > fall back to SDR mode, which makes eMMC throughput twice as slower. With > patch [1] applied, 'mmc info' reports this: > > Bus Speed: 52000000 > Mode: MMC DDR52 (52MHz) > > and 'clk dump' shows CIU clock rate to be ~400 MHz (after first mmc > operation, e.g. 'part start' or 'mmc read'): > > 399750000 gout_mmc_embd_sdclkin > > Which makes sense, because dw_mmc requests to set CCLKIN = 52 MHz (with > DDR/8-bit mode), and exynos_dw_mmc tries to set CIU clock rate to: > > SDCLKIN = 2 * ciu_div * CCLKIN = 2 * 4 * 52 MHz = 416 MHz, > > and the closest possible value the clock driver can set is 399.75 MHz, > which works just fine. > > For Exynos4 and Exynos5 (ARM32) boards, this patch series was only build > tested (manually and with buildman). The build is clean (no errors or > warnings), but I don't have any Exynos4/Exynos5 boards at my disposal, > so I can't actually verify MMC operation there. > > Changes in v5: > - Added missing bus-width property to sdhci2 node (SD card) in > exynos4412-odroid.dts (patch 14/38) > > Changes in v4: > - Rebased all patches on top of the most recent master; patches that > were affected by recent changes: 08/38, 13/38, 37/38 > > Changes in v3: > - Rebased all patches on top of the most recent master, which in turn > dropped next patches: > - [PATCH v2 1/40] mmc: dw_mmc: Remove common.h > - [PATCH v2 33/40] mmc: exynos_dw_mmc: Remove common.h > > Changes in v2: > - Rebased on top of the most recent U-Boot/master > - Added pending R-b tags from the mailing list > - Addressed the comment from Quentin about CONFIG_IS_ENABLED() not > playing nice in SPL case: > 1. Dropped [PATCH 35/42] > ("mmc: exynos_dw_mmc: Use CONFIG_IS_ENABLED() to check config > options") > 2. Dropped [PATCH 14/42] > ("mmc: dw_mmc: Use CONFIG_IS_ENABLED() to check config options") > 3. Got rid of all other CONFIG_IS_ENABLED() changes (used #ifdef for > now) > - Addressed the comment from Quentin about incorrect logic for divider > update in [PATCH 06/40] > - Guarded exynos_dwmmc_of_to_plat() with #ifded CONFIG_DM_MMC in > [PATCH 22/40] > - Added list of Exynos chips implementing 64-bit IDMAC descriptor (in > [PATCH 00/40]) > > [1] https://lists.denx.de/pipermail/u-boot/2024-March/547719.html > > Sam Protsenko (38): > mmc: dw_mmc: Remove unused version field from struct dwmci_host > mmc: dw_mmc: Move struct idmac to dw_mmc.c > mmc: dw_mmc: Extract waiting for data busy into a separate routine > mmc: dw_mmc: Extract FIFO init into a separate routine > mmc: dw_mmc: Extract divider update to a separate function > mmc: dw_mmc: Extract FIFO data transfer into a separate routine > mmc: dw_mmc: Extract DMA transfer handling code into a separate > routine > mmc: dw_mmc: Extract setting the DMA descriptor into a separate > routine > mmc: dw_mmc: Improve 32-bit IDMAC descriptor namings > mmc: dw_mmc: Add support for 64-bit IDMAC > mmc: dw_mmc: Replace fifoth_val property with fifo-depth > mmc: dw_mmc: Fix kernel-doc comments in dwmmc.h > mmc: dw_mmc: Improve coding style > arm: dts: exynos: Add upstream DW MMC properties to all Exynos dts > dt-bindings: exynos: Update bindings doc for DW MMC controller > arm: exynos: Add header guard for dwmmc.h > mmc: exynos_dw_mmc: Fix obtaining the base address of controller > mmc: exynos_dw_mmc: Fix getting private data in > exynos_dwmci_board_init() > mmc: exynos_dw_mmc: Don't call pinmux functions on ARM64 chips > mmc: exynos_dw_mmc: Obtain and use CIU clock via CCF API > mmc: exynos_dw_mmc: Use .of_to_plat for device tree parsing > mmc: exynos_dw_mmc: Convert to use livetree API > mmc: exynos_dw_mmc: Read upstream SDR timing properties > mmc: exynos_dw_mmc: Abstract CLKSEL register > mmc: exynos_dw_mmc: Refactor fixed CIU clock divider > mmc: exynos_dw_mmc: Read common bus-width property > mmc: exynos_dw_mmc: Read common clock-frequency property > mmc: exynos_dw_mmc: Move quirks from struct dwmci_host to chip data > mmc: exynos_dw_mmc: Read and use DDR timing when available > mmc: exynos_dw_mmc: Set requested freq in get_mmc_clk() callback > mmc: exynos_dw_mmc: Add support for ARM64 Exynos chips > mmc: exynos_dw_mmc: Pull all init code into probe function > mmc: exynos_dw_mmc: Don't call dwmci_setup_cfg() after add_dwmci() > mmc: exynos_dw_mmc: Use dev->name as driver's displayed name > mmc: exynos_dw_mmc: Improve coding style > arm: dts: exynos: Remove outdated DW MMC properties in all Exynos dts > configs: e850-96: Enable MMC > doc: samsung: Mention enabled eMMC in E850-96 board doc > > arch/arm/dts/exynos4210-origen.dts | 3 +- > arch/arm/dts/exynos4210-trats.dts | 6 +- > arch/arm/dts/exynos4210-universal_c210.dts | 6 +- > arch/arm/dts/exynos4412-odroid.dts | 15 +- > arch/arm/dts/exynos4412-trats2.dts | 20 +- > arch/arm/dts/exynos5250-arndale.dts | 10 +- > arch/arm/dts/exynos5250-smdk5250.dts | 13 +- > arch/arm/dts/exynos5250-snow.dts | 13 +- > arch/arm/dts/exynos5250-spring.dts | 7 +- > arch/arm/dts/exynos5420-smdk5420.dts | 13 +- > arch/arm/dts/exynos5422-odroidxu3.dts | 4 +- > arch/arm/dts/exynos54xx.dtsi | 13 +- > arch/arm/mach-exynos/include/mach/dwmmc.h | 40 +- > configs/e850-96_defconfig | 10 +- > doc/board/samsung/e850-96.rst | 5 +- > doc/device-tree-bindings/exynos/dwmmc.txt | 46 +- > drivers/mmc/ca_dw_mmc.c | 2 +- > drivers/mmc/dw_mmc.c | 547 +++++++++++++-------- > drivers/mmc/exynos_dw_mmc.c | 357 +++++++++----- > drivers/mmc/ftsdc010_mci.h | 1 - > drivers/mmc/hi6220_dw_mmc.c | 7 +- > drivers/mmc/nexell_dw_mmc.c | 5 +- > drivers/mmc/rockchip_dw_mmc.c | 5 +- > drivers/mmc/s5p_sdhci.c | 2 +- > drivers/mmc/snps_dw_mmc.c | 6 +- > drivers/mmc/socfpga_dw_mmc.c | 4 +- > include/dwmmc.h | 242 +++++---- > 27 files changed, 869 insertions(+), 533 deletions(-) > > -- > 2.39.2 >
Hi, 2024년 8월 14일 (수) 10:15, Sam Protsenko <semen.protsenko@linaro.org>님이 작성: > Hi Minkyu, > > What do you think about this series? It's been pending for a while > now, so may I ask you to take care of it? > > Thanks! > > On Wed, Aug 7, 2024 at 10:14 PM Sam Protsenko > <semen.protsenko@linaro.org> wrote: > > > > Bring 64-bit support to dw_mmc core and Exynos dw_mmc drivers, and > > enable it on E850-96 board. Additionally do some related cleanups and > > device tree updates. > > > > 64-bit version of DesignWare MMC can be often found on modern ARM64 > > chips. It's different from its older 32-bit version (which is already > > implemented in U-Boot): some new registers were added, existing > > register addresses are changed, DMA descriptor table is different, etc. > > Next Exynos chips are known to have 64-bit DW MMC block: > > > > - Exynos3475 > > - Exynos5433 > > - Exynos7420 > > - Exynos7570 > > - Exynos7580 > > - Exynos7870 > > - Exynos7872 > > - Exynos7880 > > - Exynos7885 > > - Exynos7890 > > - Exynos850 (Exynos3830) > > > > Exynos DW MMC driver was updated too: ARM64 Exynos chips implement their > > clock drivers using CCF framework, pinmux configuration is done at > > startup in DM capable pinctrl drivers, device tree properties were > > changed w.r.t. their upstream (Linux kernel) counterparts. CLKSEL > > register address is also different on 64-bit Exynos platforms. > > > > The patch series was tested on E850-96 board by running mainline Linux > > kernel with Debian rootfs from eMMC ("boot" partition) with these > > commands: > > > > 8<-------------------------------------------------------------------->8 > > env set fdtaddr 0x8a000000 > > env set bootaddr 0x94000000 > > env set boot_kerneladdr 0x94000800 > > part start mmc 0 boot boot_start > > part size mmc 0 boot boot_size > > mmc read $bootaddr $boot_start $boot_size > > abootimg addr $bootaddr > > abootimg get dtb --index=0 dtb_start dtb_size > > cp.b $dtb_start $fdtaddr $dtb_size > > fdt addr $fdtaddr 0x100000 > > cp.b $boot_kerneladdr $loadaddr 2aaaa00 > > env set bootargs console=ttySAC0,115200n8 printk.devkmsg=on \ > > root=/dev/mmcblk0p12 rootwait rw > > booti $loadaddr - $fdtaddr > > 8<-------------------------------------------------------------------->8 > > > > For E850-96 eMMC to function properly in DDR mode, the pending patch [1] > > has to be applied. Otherwise it won't be possible for exynos_dw_mmc > > driver to change CIU clock rate from 200 MHz up to 400 MHz, and MMC will > > fall back to SDR mode, which makes eMMC throughput twice as slower. With > > patch [1] applied, 'mmc info' reports this: > > > > Bus Speed: 52000000 > > Mode: MMC DDR52 (52MHz) > > > > and 'clk dump' shows CIU clock rate to be ~400 MHz (after first mmc > > operation, e.g. 'part start' or 'mmc read'): > > > > 399750000 gout_mmc_embd_sdclkin > > > > Which makes sense, because dw_mmc requests to set CCLKIN = 52 MHz (with > > DDR/8-bit mode), and exynos_dw_mmc tries to set CIU clock rate to: > > > > SDCLKIN = 2 * ciu_div * CCLKIN = 2 * 4 * 52 MHz = 416 MHz, > > > > and the closest possible value the clock driver can set is 399.75 MHz, > > which works just fine. > > > > For Exynos4 and Exynos5 (ARM32) boards, this patch series was only build > > tested (manually and with buildman). The build is clean (no errors or > > warnings), but I don't have any Exynos4/Exynos5 boards at my disposal, > > so I can't actually verify MMC operation there. > > > > Changes in v5: > > - Added missing bus-width property to sdhci2 node (SD card) in > > exynos4412-odroid.dts (patch 14/38) > > > > Changes in v4: > > - Rebased all patches on top of the most recent master; patches that > > were affected by recent changes: 08/38, 13/38, 37/38 > > > > Changes in v3: > > - Rebased all patches on top of the most recent master, which in turn > > dropped next patches: > > - [PATCH v2 1/40] mmc: dw_mmc: Remove common.h > > - [PATCH v2 33/40] mmc: exynos_dw_mmc: Remove common.h > > > > Changes in v2: > > - Rebased on top of the most recent U-Boot/master > > - Added pending R-b tags from the mailing list > > - Addressed the comment from Quentin about CONFIG_IS_ENABLED() not > > playing nice in SPL case: > > 1. Dropped [PATCH 35/42] > > ("mmc: exynos_dw_mmc: Use CONFIG_IS_ENABLED() to check config > > options") > > 2. Dropped [PATCH 14/42] > > ("mmc: dw_mmc: Use CONFIG_IS_ENABLED() to check config options") > > 3. Got rid of all other CONFIG_IS_ENABLED() changes (used #ifdef for > > now) > > - Addressed the comment from Quentin about incorrect logic for divider > > update in [PATCH 06/40] > > - Guarded exynos_dwmmc_of_to_plat() with #ifded CONFIG_DM_MMC in > > [PATCH 22/40] > > - Added list of Exynos chips implementing 64-bit IDMAC descriptor (in > > [PATCH 00/40]) > > > > [1] https://lists.denx.de/pipermail/u-boot/2024-March/547719.html > > > > Sam Protsenko (38): > > mmc: dw_mmc: Remove unused version field from struct dwmci_host > > mmc: dw_mmc: Move struct idmac to dw_mmc.c > > mmc: dw_mmc: Extract waiting for data busy into a separate routine > > mmc: dw_mmc: Extract FIFO init into a separate routine > > mmc: dw_mmc: Extract divider update to a separate function > > mmc: dw_mmc: Extract FIFO data transfer into a separate routine > > mmc: dw_mmc: Extract DMA transfer handling code into a separate > > routine > > mmc: dw_mmc: Extract setting the DMA descriptor into a separate > > routine > > mmc: dw_mmc: Improve 32-bit IDMAC descriptor namings > > mmc: dw_mmc: Add support for 64-bit IDMAC > > mmc: dw_mmc: Replace fifoth_val property with fifo-depth > > mmc: dw_mmc: Fix kernel-doc comments in dwmmc.h > > mmc: dw_mmc: Improve coding style > > arm: dts: exynos: Add upstream DW MMC properties to all Exynos dts > > dt-bindings: exynos: Update bindings doc for DW MMC controller > > arm: exynos: Add header guard for dwmmc.h > > mmc: exynos_dw_mmc: Fix obtaining the base address of controller > > mmc: exynos_dw_mmc: Fix getting private data in > > exynos_dwmci_board_init() > > mmc: exynos_dw_mmc: Don't call pinmux functions on ARM64 chips > > mmc: exynos_dw_mmc: Obtain and use CIU clock via CCF API > > mmc: exynos_dw_mmc: Use .of_to_plat for device tree parsing > > mmc: exynos_dw_mmc: Convert to use livetree API > > mmc: exynos_dw_mmc: Read upstream SDR timing properties > > mmc: exynos_dw_mmc: Abstract CLKSEL register > > mmc: exynos_dw_mmc: Refactor fixed CIU clock divider > > mmc: exynos_dw_mmc: Read common bus-width property > > mmc: exynos_dw_mmc: Read common clock-frequency property > > mmc: exynos_dw_mmc: Move quirks from struct dwmci_host to chip data > > mmc: exynos_dw_mmc: Read and use DDR timing when available > > mmc: exynos_dw_mmc: Set requested freq in get_mmc_clk() callback > > mmc: exynos_dw_mmc: Add support for ARM64 Exynos chips > > mmc: exynos_dw_mmc: Pull all init code into probe function > > mmc: exynos_dw_mmc: Don't call dwmci_setup_cfg() after add_dwmci() > > mmc: exynos_dw_mmc: Use dev->name as driver's displayed name > > mmc: exynos_dw_mmc: Improve coding style > > arm: dts: exynos: Remove outdated DW MMC properties in all Exynos dts > > configs: e850-96: Enable MMC > > doc: samsung: Mention enabled eMMC in E850-96 board doc > > > > arch/arm/dts/exynos4210-origen.dts | 3 +- > > arch/arm/dts/exynos4210-trats.dts | 6 +- > > arch/arm/dts/exynos4210-universal_c210.dts | 6 +- > > arch/arm/dts/exynos4412-odroid.dts | 15 +- > > arch/arm/dts/exynos4412-trats2.dts | 20 +- > > arch/arm/dts/exynos5250-arndale.dts | 10 +- > > arch/arm/dts/exynos5250-smdk5250.dts | 13 +- > > arch/arm/dts/exynos5250-snow.dts | 13 +- > > arch/arm/dts/exynos5250-spring.dts | 7 +- > > arch/arm/dts/exynos5420-smdk5420.dts | 13 +- > > arch/arm/dts/exynos5422-odroidxu3.dts | 4 +- > > arch/arm/dts/exynos54xx.dtsi | 13 +- > > arch/arm/mach-exynos/include/mach/dwmmc.h | 40 +- > > configs/e850-96_defconfig | 10 +- > > doc/board/samsung/e850-96.rst | 5 +- > > doc/device-tree-bindings/exynos/dwmmc.txt | 46 +- > > drivers/mmc/ca_dw_mmc.c | 2 +- > > drivers/mmc/dw_mmc.c | 547 +++++++++++++-------- > > drivers/mmc/exynos_dw_mmc.c | 357 +++++++++----- > > drivers/mmc/ftsdc010_mci.h | 1 - > > drivers/mmc/hi6220_dw_mmc.c | 7 +- > > drivers/mmc/nexell_dw_mmc.c | 5 +- > > drivers/mmc/rockchip_dw_mmc.c | 5 +- > > drivers/mmc/s5p_sdhci.c | 2 +- > > drivers/mmc/snps_dw_mmc.c | 6 +- > > drivers/mmc/socfpga_dw_mmc.c | 4 +- > > include/dwmmc.h | 242 +++++---- > > 27 files changed, 869 insertions(+), 533 deletions(-) > > > > -- > > 2.39.2 > > applied to u-boot-samsung. Thanks. Minkyu Kang.
On Mon, Aug 19, 2024 at 8:45 PM Minkyu Kang <promsoft@gmail.com> wrote: > > Hi, > > 2024년 8월 14일 (수) 10:15, Sam Protsenko <semen.protsenko@linaro.org>님이 작성: >> >> Hi Minkyu, >> >> What do you think about this series? It's been pending for a while >> now, so may I ask you to take care of it? >> > > applied to u-boot-samsung. > Thank you for handling this, Minkyu! Is there any chance this series can be merged in 2024.10, or is it too late in the cycle? > Thanks. > Minkyu Kang.
On Tue, Aug 20, 2024 at 02:48:59PM -0500, Sam Protsenko wrote: > On Mon, Aug 19, 2024 at 8:45 PM Minkyu Kang <promsoft@gmail.com> wrote: > > > > Hi, > > > > 2024년 8월 14일 (수) 10:15, Sam Protsenko <semen.protsenko@linaro.org>님이 작성: > >> > >> Hi Minkyu, > >> > >> What do you think about this series? It's been pending for a while > >> now, so may I ask you to take care of it? > >> > > > > applied to u-boot-samsung. > > > > Thank you for handling this, Minkyu! Is there any chance this series > can be merged in 2024.10, or is it too late in the cycle? At this point I would like to see this for -next and not master, sorry.
On Tue, Aug 20, 2024 at 3:16 PM Tom Rini <trini@konsulko.com> wrote: > > On Tue, Aug 20, 2024 at 02:48:59PM -0500, Sam Protsenko wrote: > > On Mon, Aug 19, 2024 at 8:45 PM Minkyu Kang <promsoft@gmail.com> wrote: > > > > > > Hi, > > > > > > 2024년 8월 14일 (수) 10:15, Sam Protsenko <semen.protsenko@linaro.org>님이 작성: > > >> > > >> Hi Minkyu, > > >> > > >> What do you think about this series? It's been pending for a while > > >> now, so may I ask you to take care of it? > > >> > > > > > > applied to u-boot-samsung. > > > > > > > Thank you for handling this, Minkyu! Is there any chance this series > > can be merged in 2024.10, or is it too late in the cycle? > > At this point I would like to see this for -next and not master, sorry. > Makes sense, being at -rc3 doesn't leave us much room for testing it. I'm just glad this series is finally applied :) I also hope that my clock propagation patch [1] can be taken for -next, it's been kinda ignored for a long time now. Although MMC series will be functional on E850-96 in SDR mode as is, applying [1] would make it work in DDR, which is definitely better. Thanks! [1] https://lists.denx.de/pipermail/u-boot/2024-March/547719.html > -- > Tom