[PATCH 2/5] mmc: zynq-sdhci: refactor tapdelay settings
Love Kumar
love.kumar at amd.com
Thu Mar 14 07:45:52 CET 2024
Hi,
When we run in el3 for zynqmp board, we are seeing below issue with this
patch:
Model: ZynqMP MINI EMMC0
Board: Xilinx ZynqMP
DRAM: 512 MiB
EL Level: EL3
Secure Boot: not authenticated, not encrypted
Multiboot: 0
Core: 10 devices, 9 uclasses, devicetree: embed
MMC: sdhci at ff160000: 0
Loading Environment from <NULL>... OK
In: dcc
Out: dcc
Err: dcc
ZynqMP> mmc list
sdhci at ff160000: 0
ZynqMP> mmc dev 0 0
arasan_sdhci sdhci at ff160000: Error setting Input Tap Delay
sdhci_set_clock: Error while setting tap delay
sdhci_send_command: Timeout for status update: 00000000 00000001
ZynqMP>
Regards,
Love Kumar
On 23/02/24 7:36 pm, Steffen Dirkwinkel wrote:
> From: Steffen Dirkwinkel <s.dirkwinkel at beckhoff.com>
>
> Previously we were setting in tapdelay for SD1 every time even if SD0 was
> requested.
> The SD tapdelay settings are shifted by 16 bits between SD0 and SD1.
> We can use that to make our tapdelay setup simpler. This is also how it
> currently works in arm-trusted-firmware.
>
> Signed-off-by: Steffen Dirkwinkel <s.dirkwinkel at beckhoff.com>
> ---
>
> drivers/mmc/zynq_sdhci.c | 65 +++++++++++++++++-----------------------
> 1 file changed, 28 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
> index 935540d1719..d4845245b2a 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -42,14 +42,11 @@
> #define SD_OTAP_DLY 0xFF180318
> #define SD0_DLL_RST BIT(2)
> #define SD1_DLL_RST BIT(18)
> +#define SD1_TAP_OFFSET 16
> #define SD0_ITAPCHGWIN BIT(9)
> -#define SD1_ITAPCHGWIN BIT(25)
> #define SD0_ITAPDLYENA BIT(8)
> -#define SD1_ITAPDLYENA BIT(24)
> #define SD0_ITAPDLYSEL_MASK GENMASK(7, 0)
> -#define SD1_ITAPDLYSEL_MASK GENMASK(23, 16)
> #define SD0_OTAPDLYSEL_MASK GENMASK(5, 0)
> -#define SD1_OTAPDLYSEL_MASK GENMASK(21, 16)
>
> #define MIN_PHY_CLK_HZ 50000000
>
> @@ -275,44 +272,32 @@ static int arasan_sdhci_config_dll(struct sdhci_host *host, unsigned int clock,
> static inline int arasan_zynqmp_set_in_tapdelay(u32 node_id, u32 itap_delay)
> {
> int ret;
> + u32 shift;
>
> - if (IS_ENABLED(CONFIG_SPL_BUILD) || current_el() == 3) {
> - if (node_id == NODE_SD_0) {
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN,
> - SD0_ITAPCHGWIN);
> - if (ret)
> - return ret;
> -
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYENA,
> - SD0_ITAPDLYENA);
> - if (ret)
> - return ret;
> -
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYSEL_MASK,
> - itap_delay);
> - if (ret)
> - return ret;
> + if (node_id == NODE_SD_0)
> + shift = 0;
> + else if (node_id == NODE_SD_1)
> + shift = SD1_TAP_OFFSET;
> + else
> + return -EINVAL;
>
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN, 0);
> - if (ret)
> - return ret;
> - }
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN,
> - SD1_ITAPCHGWIN);
> + if (IS_ENABLED(CONFIG_SPL_BUILD) || current_el() == 3) {
> + ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN << shift,
> + SD0_ITAPCHGWIN << shift);
> if (ret)
> return ret;
>
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYENA,
> - SD1_ITAPDLYENA);
> + ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYENA << shift,
> + SD0_ITAPDLYENA << shift);
> if (ret)
> return ret;
>
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYSEL_MASK,
> - (itap_delay << 16));
> + ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYSEL_MASK << shift,
> + itap_delay << shift);
> if (ret)
> return ret;
>
> - ret = zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN, 0);
> + ret = zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN << shift, 0);
> if (ret)
> return ret;
> } else {
> @@ -326,14 +311,20 @@ static inline int arasan_zynqmp_set_in_tapdelay(u32 node_id, u32 itap_delay)
>
> static inline int arasan_zynqmp_set_out_tapdelay(u32 node_id, u32 otap_delay)
> {
> + u32 shift;
> +
> + if (node_id == NODE_SD_0)
> + shift = 0;
> + else if (node_id == NODE_SD_1)
> + shift = SD1_TAP_OFFSET;
> + else
> + return -EINVAL;
> +
> if (IS_ENABLED(CONFIG_SPL_BUILD) || current_el() == 3) {
> - if (node_id == NODE_SD_0)
> - return zynqmp_mmio_write(SD_OTAP_DLY,
> - SD0_OTAPDLYSEL_MASK,
> - otap_delay);
> + return zynqmp_mmio_write(SD_OTAP_DLY,
> + SD0_OTAPDLYSEL_MASK << shift,
> + otap_delay << shift);
>
> - return zynqmp_mmio_write(SD_OTAP_DLY, SD1_OTAPDLYSEL_MASK,
> - (otap_delay << 16));
> } else {
> return xilinx_pm_request(PM_IOCTL, node_id,
> IOCTL_SET_SD_TAPDELAY,
More information about the U-Boot
mailing list