[linux-yocto] [PATCH 17/17] arch/powerpc: Reset Updates for Axxia
Bruce Ashfield
bruce.ashfield at windriver.com
Tue Jul 8 10:23:19 PDT 2014
On 14-07-08 10:22 AM, Charlie Paul wrote:
> From: John Jacques <john.jacques at lsi.com>
Can we get something here ? What exactly is the new behaviour ? What has
changed ?
Bruce
>
> Signed-off-by: John Jacques <john.jacques at lsi.com>
> ---
> arch/powerpc/sysdev/ppc4xx_soc.c | 73 +++++++++++++++++++++++++++++++++++++-
> 1 file changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/sysdev/ppc4xx_soc.c b/arch/powerpc/sysdev/ppc4xx_soc.c
> index 0debcc3..5505f46 100644
> --- a/arch/powerpc/sysdev/ppc4xx_soc.c
> +++ b/arch/powerpc/sysdev/ppc4xx_soc.c
> @@ -24,6 +24,9 @@
> #include <asm/dcr.h>
> #include <asm/dcr-regs.h>
> #include <asm/reg.h>
> +#ifdef CONFIG_ACP
> +#include <asm/mpic.h>
> +#endif
>
> static u32 dcrbase_l2c;
>
> @@ -60,7 +63,7 @@ static irqreturn_t l2c_error_handler(int irq, void *dev)
> }
>
> /* Clear parity errors */
> - if (sr & (L2C_SR_CPE | L2C_SR_TPE)){
> + if (sr & (L2C_SR_CPE | L2C_SR_TPE)) {
> mtdcr(dcrbase_l2c + DCRN_L2C0_ADDR, 0);
> mtdcr(dcrbase_l2c + DCRN_L2C0_CMD, L2C_CMD_CCP | L2C_CMD_CTE);
> } else {
> @@ -190,6 +193,45 @@ static int __init ppc4xx_l2c_probe(void)
> }
> arch_initcall(ppc4xx_l2c_probe);
>
> +#ifdef CONFIG_ACP
> +
> +/*
> + * Issue a "core" reset.
> + */
> +
> +void
> +acp_jump_to_boot_loader(void *input)
> +{
> + mpic_teardown_this_cpu(0);
> + /* This is only valid in the "core" reset case, so 0x10000000. */
> + mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | 0x10000000);
> +
> + while (1)
> + ; /* Just in case the jump fails. */
> +}
> +
> +/*
> + * Get all other cores to run "acp_jump_to_boot_loader()" then go
> + * there as well.
> + */
> +
> +void
> +acp_reset_cores(void)
> +{
> + int cpu;
> +
> + for_each_possible_cpu(cpu) {
> + if (cpu != smp_processor_id())
> + smp_call_function_single(cpu, acp_jump_to_boot_loader,
> + NULL, 0);
> + }
> +
> + acp_jump_to_boot_loader(NULL);
> +}
> +
> +
> +#endif
> +
> /*
> * Apply a system reset. Alternatively a board specific value may be
> * provided via the "reset-type" property in the cpu node.
> @@ -214,7 +256,36 @@ void ppc4xx_reset_system(char *cmd)
> reset_type = prop[0] << 28;
> }
>
> +#ifdef CONFIG_ACP
> + if (DBCR0_RST_CORE == reset_type) {
> + acp_reset_cores();
> + } else {
> + /*
> + In this case, reset_type is either chip or system.
> +
> + On the AXM3500 (PVR=0x7ff520c1), writing to DBCR0
> + will occasionally stall the system. As a
> + work-around, write to the system control register.
> + */
> +
> + u32 pvr_value;
> +
> + asm volatile ("mfpvr %0" : "=r"(pvr_value));
> +
> + if (0x7ff520c1 == pvr_value) {
> + u32 value;
> +
> + value = mfdcrx(0xd0a);
> + value |= 0xab;
> + mtdcrx(0xd0a, value);
> + mtdcrx(0xe00, 1);
> + } else {
> + mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | reset_type);
> + }
> + }
> +#else
> mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | reset_type);
> +#endif
>
> while (1)
> ; /* Just in case the reset doesn't work */
>
More information about the linux-yocto
mailing list