[U-Boot] i.MX6 freeze when running Linux FSL 3.10.9-1.0.0-alpha AND U-Boot 2013.10
Otavio Salvador
otavio at ossystems.com.br
Tue Nov 26 16:59:36 CET 2013
On Tue, Nov 26, 2013 at 12:39 PM, Eric Bénard <eric at eukrea.com> wrote:
> Hi Otavio,
>
> Le Tue, 26 Nov 2013 12:32:45 -0200,
> Otavio Salvador <otavio at ossystems.com.br> a écrit :
>
>> Hello,
>>
>> last days I've been trying to isolate the hung cause of a customer
>> board, and also SabreSD board, when using the Freescale's Linux fork
>> of 3.10.9 with 2013.10 U-Boot.
>>
>> The below patch makes it work fine but it does not seem to be possible
>> to upstream this fix, that way. How you guys thing this could be
>> properly integrated into U-Boot to not break other boards?
>>
>> diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
>> index a390296..08f3eda 100644
>> --- a/arch/arm/cpu/armv7/mx6/soc.c
>> +++ b/arch/arm/cpu/armv7/mx6/soc.c
>> @@ -131,6 +131,34 @@ static void imx_set_wdog_powerdown(bool enable)
>> writew(enable, &wdog2->wmcr);
>> }
>>
>> +static void imx_set_vddpu_power_down(void)
>> +{
>> + struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
>> + u32 val;
>> +
>> + /* need to power down xPU in GPC before turn off PU LDO */
>> + val = readl(GPC_BASE_ADDR + 0x260);
>> + writel(val | 0x1, GPC_BASE_ADDR + 0x260);
>> +
>> + val = readl(GPC_BASE_ADDR + 0x0);
>> + writel(val | 0x1, GPC_BASE_ADDR + 0x0);
>> + while (readl(GPC_BASE_ADDR + 0x0) & 0x1)
>> + ;
>> +
>> + /* disable VDDPU */
>> + val = 0x3e00;
>> + writel(val, &anatop->reg_core_clr);
>> +}
>> +
>> +static void imx_set_pcie_phy_power_down(void)
>> +{
>> + u32 val;
>> +
>> + val = readl(IOMUXC_BASE_ADDR + 0x4);
>> + val |= 0x1 << 18;
>> + writel(val, IOMUXC_BASE_ADDR + 0x4);
>> +}
>> +
>> int arch_cpu_init(void)
>> {
>> init_aips();
>> @@ -139,6 +167,9 @@ int arch_cpu_init(void)
>>
>> imx_set_wdog_powerdown(false); /* Disable PDE bit of WMCR register */
>>
>> + imx_set_pcie_phy_power_down();
>> + imx_set_vddpu_power_down();
>> +
>> #ifdef CONFIG_APBH_DMA
>> /* Start APBH DMA */
>> mxs_dma_init();
>> diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c
>> index 0cd2538..5cac1a9 100644
>> --- a/arch/arm/imx-common/cpu.c
>> +++ b/arch/arm/imx-common/cpu.c
>> @@ -171,9 +171,21 @@ u32 get_ahb_clk(void)
>> return get_periph_clk() / (ahb_podf + 1);
>> }
>>
>> +static void set_anatop_bypass(void)
>> +{
>> + struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
>> + u32 reg = readl(&anatop->reg_core);
>> +
>> + /* bypass VDDARM/VDDSOC */
>> + reg = reg | (0x1F << 18) | 0x1F;
>> + writel(reg, &anatop->reg_core);
>> +}
>> +
>> #if defined(CONFIG_VIDEO_IPUV3)
>> void arch_preboot_os(void)
>> {
>> + set_anatop_bypass();
>> +
>> /* disable video before launching O/S */
>> ipuv3_fb_shutdown();
>> }
>>
> isn't the last change (enabling bypass) sufficient to fix the problem
> or do you also need the 2 power_down before ?
It does indeed. I did a full test cycle from cold boot and also from
inside system reboot and it works.
So:
diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c
index 0cd2538..5cac1a9 100644
--- a/arch/arm/imx-common/cpu.c
+++ b/arch/arm/imx-common/cpu.c
@@ -171,9 +171,21 @@ u32 get_ahb_clk(void)
return get_periph_clk() / (ahb_podf + 1);
}
+static void set_anatop_bypass(void)
+{
+ struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
+ u32 reg = readl(&anatop->reg_core);
+
+ /* bypass VDDARM/VDDSOC */
+ reg = reg | (0x1F << 18) | 0x1F;
+ writel(reg, &anatop->reg_core);
+}
+
#if defined(CONFIG_VIDEO_IPUV3)
void arch_preboot_os(void)
{
+ set_anatop_bypass();
+
/* disable video before launching O/S */
ipuv3_fb_shutdown();
}
is the needed patch.
> Do you also get the kernel freeze without changing anything in
> u-boot when you disable cpufreq in the kernel ?
The FSL kernel does not build without cpufreq so I didn't try.
--
Otavio Salvador O.S. Systems
http://www.ossystems.com.br http://code.ossystems.com.br
Mobile: +55 (53) 9981-7854 Mobile: +1 (347) 903-9750
More information about the U-Boot
mailing list