Hi Love, On Thu, 2024-03-14 at 12:15 +0530, Love Kumar wrote: > 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@ff160000: 0 > Loading Environment from <NULL>... OK > In: dcc > Out: dcc > Err: dcc > ZynqMP> mmc list > sdhci@ff160000: 0 > ZynqMP> mmc dev 0 0 > arasan_sdhci sdhci@ff160000: Error setting Input Tap Delay > sdhci_set_clock: Error while setting tap delay > sdhci_send_command: Timeout for status update: 00000000 00000001 > ZynqMP>
Thank you for testing this. It looks like the zynqmp-mini-emmc0 device lacks the power-domain node and doesn't have a sd node id. The code before my change would have ignored the unknown node id, applied settings for sdhci1 instead of sdhci0 and returned without an error. Maybe there's a different way to find out which sdhci we want to operate on? Can you try setting the node id in device tree? Something like this: diff --git a/arch/arm/dts/zynqmp-mini-emmc0.dts b/arch/arm/dts/zynqmp-mini-emmc0.dts index 02e80bd85e1..87c4a1b6ad0 100644 --- a/arch/arm/dts/zynqmp-mini-emmc0.dts +++ b/arch/arm/dts/zynqmp-mini-emmc0.dts @@ -7,6 +7,8 @@ * Siva Durga Prasad Paladugu <[email protected]> */ +#include <dt-bindings/power/xlnx-zynqmp-power.h> + /dts-v1/; / { @@ -41,6 +43,12 @@ clock-frequency = <200000000>; }; + firmware { + zynqmp_firmware: zynqmp-firmware { + #power-domain-cells = <1>; + }; + }; + amba: amba { compatible = "simple-bus"; #address-cells = <2>; @@ -56,6 +64,7 @@ reg = <0x0 0xff160000 0x0 0x1000>; clock-names = "clk_xin", "clk_ahb"; clocks = <&clk_xin &clk_xin>; + power-domains = <&zynqmp_firmware PD_SD_0>; }; }; }; Thanks, Steffen > > Regards, > Love Kumar > > On 23/02/24 7:36 pm, Steffen Dirkwinkel wrote: > > From: Steffen Dirkwinkel <[email protected]> > > > > 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 <[email protected]> > > --- > > > > 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,

