All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: Suriyan Ramasami <suriyan.r@gmail.com>, xen-devel@lists.xen.org
Cc: stefano.stabellini@citrix.com
Subject: Re: [PATCH v1 1/1] XEN/ARM: Add Odroid-XU3/XU4 support
Date: Mon, 8 Feb 2016 15:27:39 +0000	[thread overview]
Message-ID: <1454945259.26508.93.camel@citrix.com> (raw)
In-Reply-To: <1454867060-28207-1-git-send-email-suriyan.r@gmail.com>

On Sun, 2016-02-07 at 09:44 -0800, Suriyan Ramasami wrote:
> The Odroid-XU3/XU4 from hardkernel is an Exynos 5422 based board.
> Code from mcpm-exynos.c and mcpm-platsmp.c from the Linux kernel
> has been used to get all the 8 cores from the 2 clusters powered
> on.
> The Linux DTS for these odroid uses "samsung,exynos5800" as
> the machine compatible string. Hence, the same is used herein.
> 
> Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>
> ---
>  xen/arch/arm/platforms/exynos5.c | 94
> +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 93 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/platforms/exynos5.c
> b/xen/arch/arm/platforms/exynos5.c
> index bf4964d..60ceb2b 100644
> --- a/xen/arch/arm/platforms/exynos5.c
> +++ b/xen/arch/arm/platforms/exynos5.c
> @@ -37,6 +37,15 @@ static bool_t secure_firmware;
>  
>  #define SMC_CMD_CPU1BOOT            (-4)
>  
> +#define EXYNOS5800_CPUS_PER_CLUSTER 4
> +#define EXYNOS5800_NR_CLUSTERS      2
> +
> +#define EXYNOS5420_KFC_CORE_RESET0  BIT(8)
> +#define EXYNOS5420_KFC_ETM_RESET0   BIT(20)
> +
> +#define EXYNOS5420_KFC_CORE_RESET(_nr) \
> +        ((EXYNOS5420_KFC_CORE_RESET0 | EXYNOS5420_KFC_ETM_RESET0) <<
> (_nr))
> +
>  static int exynos5_init_time(void)
>  {
>      uint32_t reg;
> @@ -163,6 +172,84 @@ static void exynos_cpu_power_up(void __iomem *power,
> int cpu)
>                   power + EXYNOS_ARM_CORE_CONFIG(cpu));
>  }
>  
> +static void cpu_to_pcpu(int cpu, int *pcpu, int *pcluster)
> +{
> +   int mpidr;
> +
> +   mpidr = cpu_logical_map(cpu);
> +   *pcpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
> +   *pcluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
> +}
> +
> +static int exynos5800_cpu_power_up(void __iomem *power, int cpu)
> +{
> +    int timeout;
> +    int pcpu, pcluster;
> +    unsigned int cpunr;
> +
> +    cpu_to_pcpu(cpu, &pcpu, &pcluster);
> +    cpunr = pcpu + (pcluster * EXYNOS5800_CPUS_PER_CLUSTER);
> +    dprintk(XENLOG_DEBUG, "cpu: %d pcpu: %d, cluster: %d cpunr: %d\n",
> +            cpu, pcpu, pcluster, cpunr);
> +
> +
> +    if ( !exynos_cpu_power_state(power, cpunr) )
> +    {
> +        exynos_cpu_power_up(power, cpunr);
> +        timeout = 10;
> +
> +        /* wait max 10 ms until cpu is on */
> +        while ( exynos_cpu_power_state(power, cpunr) !=
> S5P_CORE_LOCAL_PWR_EN )
> +        {
> +            if ( timeout-- == 0 )
> +                break;
> +
> +            mdelay(1);
> +        }
> +
> +        if ( timeout == 0 )
> +        {
> +            dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
> +            return -ETIMEDOUT;
> +        }

Up to here this is the same as exynos5_cpu_power_up.

I think either of these two approaches would be acceptable to reduce the
duplication either:

move the above into a common helper called from both here and
exynos5_cpu_power_up

or

move the remainder of this function into a exynos5800_cluster_reset (or
would it be better await_reset?) function and call that from exynos5_cpu_up
after the call to exynos5_cpu_power_up when the compat string matches.

I think I have a light preference for the second option.


> +
> +        /*
> +         * This assumes the cluster number of the big cores(Cortex A15)
> +         * is 0 and the Little cores(Cortex A7) is 1.
> +         * When the system was booted from the Little core,
> +         * they should be reset during power up cpu.
> +         */
> +        if (pcluster &&
> +            pcluster == MPIDR_AFFINITY_LEVEL(cpu_logical_map(0), 1)) {
> +            /*
> +             * Before we reset the Little cores, we should wait
> +             * the SPARE2 register is set to 1 because the init
> +             * codes of the iROM will set the register after
> +             * initialization.

If you have a reference (e.g. a URL) for this that would be useful to
include (but don't worry if there isn't one).

> +            */
> +
> +            /* wait max 10ms for the spare register to be set to 1 */
> +            timeout = 10;
> +            while ( !__raw_readl(power + S5P_PMU_SPARE2) )
> +            {
> +                if ( timeout-- == 0 )
> +                    break;
> +
> +                mdelay(1);
> +            }
> +
> +            if ( timeout == 0 )
> +            {
> +                dprintk(XENLOG_ERR, "CPU%d SPARE2 register wait
> failed\n", cpu);
> +                return -ETIMEDOUT;
> +            }
> +            __raw_writel(EXYNOS5420_KFC_CORE_RESET(cpu), power +
> EXYNOS5_SWRESET);
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>  static int exynos5_cpu_power_up(void __iomem *power, int cpu)
>  {
>      unsigned int timeout;
> @@ -240,7 +327,10 @@ static int exynos5_cpu_up(int cpu)
>          return -EFAULT;
>      }
>  
> -    rc = exynos5_cpu_power_up(power, cpu);
> +    if ( dt_machine_is_compatible("samsung,exynos5800") )
> +        rc = exynos5800_cpu_power_up(power, cpu);
> +    else
> +        rc = exynos5_cpu_power_up(power, cpu);
>      if ( rc )
>      {
>          iounmap(power);
> @@ -298,6 +388,7 @@ static const char * const exynos5250_dt_compat[]
> __initconst =
>  static const char * const exynos5_dt_compat[] __initconst =
>  {
>      "samsung,exynos5410",
> +    "samsung,exynos5800",
>      NULL
>  };
>  
> @@ -318,6 +409,7 @@ PLATFORM_START(exynos5, "SAMSUNG EXYNOS5")
>      .cpu_up = exynos5_cpu_up,
>      .reset = exynos5_reset,
>      .blacklist_dev = exynos5_blacklist_dev,
> +
>  PLATFORM_END
>  
>  /*
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

  reply	other threads:[~2016-02-08 15:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-07 17:44 [PATCH v1 1/1] XEN/ARM: Add Odroid-XU3/XU4 support Suriyan Ramasami
2016-02-08 15:27 ` Ian Campbell [this message]
2016-02-08 16:54   ` Suriyan Ramasami

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1454945259.26508.93.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=stefano.stabellini@citrix.com \
    --cc=suriyan.r@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.