xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Suriyan Ramasami <suriyan.r@gmail.com>,
	xen-devel@lists.xen.org, ian.campbell@citrix.com
Cc: ian.jackson@citrix.com, julien.grall@linaro.com, keir@xen.org,
	jbeulich@suse.com, tim@xen.org
Subject: Re: [XEN/ARM PATCH v6 1/1] Add OdroidXU board (Exynos 5410)
Date: Wed, 10 Sep 2014 14:08:13 -0700	[thread overview]
Message-ID: <5410BDBD.4010805@linaro.org> (raw)
In-Reply-To: <1409871443-15641-1-git-send-email-suriyan.r@gmail.com>

Hi all,

This patch breaks Xen boot on the Arndale.

It would have been nice to test this patch on the Arndale before pushing 
it on master... I was unable to do it because I was away.

I would prefer to keep a separate smp_init function with hardcoded value 
as long as someone as time to check if we can effectively use the new value.

Regards,

On 04/09/14 15:57, Suriyan Ramasami wrote:
>      XEN/ARM: Add support for the Odroid-XU board.
>
>      The Odroid-XU from hardkernel is an Exynos 5410 based board.
>      This patch adds support to the above said board.
>
> Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>
> ---
>
> Changes between versions as follows:
>     v6:
>         a. Folded all *_smp_init() functions into exynos5_smp_init()
>            Arndale now shall use exynos5_smp_init() as well getting rid
>            of S5P_PA_SYSRAM
>     v5:
>         a. Get MCT base address from DT.
>         b. Create function exynos5_get_pmu_base_addr() so it can be
>            used by exynos5_reset() and exynos5_cpu_up() functions.
>
>     v4:
>         a. Lots of Xen coding style changes.
>         b. Directly assign cpu_up_send_sgi for 5250.
>         c. S5P_PA_SYSRAM renamed to EXYNOS5250_PA_SYSRAM so it is clear
>            that newer platforms should use the device tree for information.
>         d. Use __raw_readl and _raw_writel instead of readl and writel
>         e. Leave function names consistent with what Linux uses so that it
>            avoids confusion and is easier to backport in the future.
>         f. Remove "samsung,exynos5422-pmu" as no such thing exists.
>         g. Use XENLOG_DEBUG instead of XENLOG_INFO for power_base_address.
>         h. iounmap(power) in the failure case.
>         i. As its generic, call the new platform exynos5.
>     v3:
>         a. Separate commit message and change log.
>         b. Define odroid-xu as a separate platform API.
>         c. Use mainline linux's way of retrieving sysram from DT.
>         d. Use mainline linux's way of bringing up secondary CPUs.
>         e. Keep the #defines in the local C file.
>         f. Bringing up newer Exynos platforms should be easier.
>
>     v2:
>         a. Set startup address in exynos5_smp_init() only once.
>         b. Turn on power to each core in exynos5_cpu_up().
>         c. Create single PLATFORM with smp_init, and cpu_up  which dispatches
>            to correct code.
>         d. Check return code of io_remap for power.
>         e. Use read* write* calls for MMIO mapped addresses.
>         f. Xen coding style changes.
>
>      v1: Add Odroid-XU board support
>
> ---
>   xen/arch/arm/platforms/exynos5.c        | 197 +++++++++++++++++++++++++++++---
>   xen/include/asm-arm/platforms/exynos5.h |   3 -
>   2 files changed, 184 insertions(+), 16 deletions(-)
>
> diff --git a/xen/arch/arm/platforms/exynos5.c b/xen/arch/arm/platforms/exynos5.c
> index b65c2c2..f3cbfce 100644
> --- a/xen/arch/arm/platforms/exynos5.c
> +++ b/xen/arch/arm/platforms/exynos5.c
> @@ -23,18 +23,45 @@
>   #include <xen/domain_page.h>
>   #include <xen/mm.h>
>   #include <xen/vmap.h>
> +#include <xen/delay.h>
>   #include <asm/platforms/exynos5.h>
>   #include <asm/platform.h>
>   #include <asm/io.h>
>
> +#define EXYNOS_ARM_CORE0_CONFIG     0x2000
> +#define EXYNOS_ARM_CORE_CONFIG(_nr) (0x80 * (_nr))
> +#define EXYNOS_ARM_CORE_STATUS(_nr) (EXYNOS_ARM_CORE_CONFIG(_nr) + 0x4)
> +#define S5P_CORE_LOCAL_PWR_EN       0x3
> +
>   static int exynos5_init_time(void)
>   {
>       uint32_t reg;
>       void __iomem *mct;
> +    int rc;
> +    struct dt_device_node *node;
> +    u64 mct_base_addr;
> +    u64 size;
>
>       BUILD_BUG_ON(EXYNOS5_MCT_G_TCON >= PAGE_SIZE);
>
> -    mct = ioremap_attr(EXYNOS5_MCT_BASE, PAGE_SIZE, PAGE_HYPERVISOR_NOCACHE);
> +    node = dt_find_compatible_node(NULL, NULL, "samsung,exynos4210-mct");
> +    if ( !node )
> +    {
> +        dprintk(XENLOG_ERR, "samsung,exynos4210-mct missing in DT\n");
> +        return -ENXIO;
> +    }
> +
> +    rc = dt_device_get_address(node, 0, &mct_base_addr, &size);
> +    if ( rc )
> +    {
> +        dprintk(XENLOG_ERR, "Error in \"samsung,exynos4210-mct\"\n");
> +        return -ENXIO;
> +    }
> +
> +    dprintk(XENLOG_INFO, "mct_base_addr: %016llx size: %016llx\n",
> +            mct_base_addr, size);
> +
> +    mct = ioremap_attr(mct_base_addr, PAGE_SIZE, PAGE_HYPERVISOR_NOCACHE);
>       if ( !mct )
>       {
>           dprintk(XENLOG_ERR, "Unable to map MCT\n");
> @@ -51,7 +78,7 @@ static int exynos5_init_time(void)
>   }
>
>   /* Additional mappings for dom0 (Not in the DTS) */
> -static int exynos5_specific_mapping(struct domain *d)
> +static int exynos5250_specific_mapping(struct domain *d)
>   {
>       /* Map the chip ID */
>       map_mmio_regions(d, paddr_to_pfn(EXYNOS5_PA_CHIPID), 1,
> @@ -67,8 +94,29 @@ static int exynos5_specific_mapping(struct domain *d)
>   static int __init exynos5_smp_init(void)
>   {
>       void __iomem *sysram;
> +    struct dt_device_node *node;
> +    u64 sysram_ns_base_addr;
> +    u64 size;
> +    int rc;
> +
> +    node = dt_find_compatible_node(NULL, NULL, "samsung,exynos4210-sysram-ns");
> +    if ( !node )
> +    {
> +        dprintk(XENLOG_ERR, "samsung,exynos4210-sysram-ns missing in DT\n");
> +        return -ENXIO;
> +    }
>
> -    sysram = ioremap_nocache(S5P_PA_SYSRAM, PAGE_SIZE);
> +    rc = dt_device_get_address(node, 0, &sysram_ns_base_addr, &size);
> +    if ( rc )
> +    {
> +        dprintk(XENLOG_ERR, "Error in \"samsung,exynos4210-sysram-ns\"\n");
> +        return -ENXIO;
> +    }
> +
> +    dprintk(XENLOG_INFO, "sysram_ns_base_addr: %016llx size: %016llx\n",
> +            sysram_ns_base_addr, size);
> +
> +    sysram = ioremap_nocache(sysram_ns_base_addr, PAGE_SIZE);
>       if ( !sysram )
>       {
>           dprintk(XENLOG_ERR, "Unable to map exynos5 MMIO\n");
> @@ -77,20 +125,127 @@ static int __init exynos5_smp_init(void)
>
>       printk("Set SYSRAM to %"PRIpaddr" (%p)\n",
>              __pa(init_secondary), init_secondary);
> -    writel(__pa(init_secondary), sysram);
> +    writel(__pa(init_secondary), sysram + 0x1c);
>
>       iounmap(sysram);
>
>       return 0;
>   }
>
> +static int exynos_cpu_power_state(void __iomem *power, int cpu)
> +{
> +    return __raw_readl(power + EXYNOS_ARM_CORE_STATUS(cpu)) &
> +                       S5P_CORE_LOCAL_PWR_EN;
> +}
> +
> +static void exynos_cpu_power_up(void __iomem *power, int cpu)
> +{
> +    __raw_writel(S5P_CORE_LOCAL_PWR_EN,
> +                 power + EXYNOS_ARM_CORE_CONFIG(cpu));
> +}
> +
> +static int exynos5_cpu_power_up(void __iomem *power, int cpu)
> +{
> +    unsigned int timeout;
> +
> +    if ( !exynos_cpu_power_state(power, cpu) )
> +    {
> +        exynos_cpu_power_up(power, cpu);
> +        timeout = 10;
> +
> +        /* wait max 10 ms until cpu is on */
> +        while ( exynos_cpu_power_state(power, cpu) != S5P_CORE_LOCAL_PWR_EN )
> +        {
> +            if ( timeout-- == 0 )
> +                break;
> +
> +            mdelay(1);
> +        }
> +
> +        if ( timeout == 0 )
> +        {
> +            dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
> +            return -ETIMEDOUT;
> +        }
> +    }
> +    return 0;
> +}
> +
> +static int exynos5_get_pmu_base_addr(u64 *power_base_addr) {
> +    u64 size;
> +    struct dt_device_node *node;
> +    int rc;
> +    static const struct dt_device_match exynos_dt_pmu_matches[] __initconst =
> +    {
> +        DT_MATCH_COMPATIBLE("samsung,exynos5250-pmu"),
> +        DT_MATCH_COMPATIBLE("samsung,exynos5410-pmu"),
> +        DT_MATCH_COMPATIBLE("samsung,exynos5420-pmu"),
> +        { /*sentinel*/ },
> +    };
> +
> +    node = dt_find_matching_node(NULL, exynos_dt_pmu_matches);
> +    if ( !node )
> +    {
> +        dprintk(XENLOG_ERR, "samsung,exynos5XXX-pmu missing in DT\n");
> +        return -ENXIO;
> +    }
> +
> +    rc = dt_device_get_address(node, 0, power_base_addr, &size);
> +    if ( rc )
> +    {
> +        dprintk(XENLOG_ERR, "Error in \"samsung,exynos5XXXX-pmu\"\n");
> +        return -ENXIO;
> +    }
> +
> +    dprintk(XENLOG_DEBUG, "power_base_addr: %016llx size: %016llx\n",
> +            *power_base_addr, size);
> +
> +    return 0;
> +}
> +
> +static int exynos5_cpu_up(int cpu)
> +{
> +    u64 power_base_addr;
> +    void __iomem *power;
> +    int rc;
> +
> +    rc = exynos5_get_pmu_base_addr(&power_base_addr);
> +    if ( rc )
> +        return rc;
> +
> +    power = ioremap_nocache(power_base_addr +
> +                            EXYNOS_ARM_CORE0_CONFIG, PAGE_SIZE);
> +    if ( !power )
> +    {
> +        dprintk(XENLOG_ERR, "Unable to map power MMIO\n");
> +        return -EFAULT;
> +    }
> +
> +    rc = exynos5_cpu_power_up(power, cpu);
> +    if ( rc )
> +    {
> +        iounmap(power);
> +        return -ETIMEDOUT;
> +    }
> +
> +    iounmap(power);
> +
> +    return cpu_up_send_sgi(cpu);
> +}
> +
>   static void exynos5_reset(void)
>   {
> +    u64 power_base_addr;
>       void __iomem *pmu;
> +    int rc;
>
>       BUILD_BUG_ON(EXYNOS5_SWRESET >= PAGE_SIZE);
>
> -    pmu = ioremap_nocache(EXYNOS5_PA_PMU, PAGE_SIZE);
> +    rc = exynos5_get_pmu_base_addr(&power_base_addr);
> +    if ( rc )
> +        return;
> +
> +    pmu = ioremap_nocache(power_base_addr, PAGE_SIZE);
>       if ( !pmu )
>       {
>           dprintk(XENLOG_ERR, "Unable to map PMU\n");
> @@ -98,15 +253,10 @@ static void exynos5_reset(void)
>       }
>
>       writel(1, pmu + EXYNOS5_SWRESET);
> +
>       iounmap(pmu);
>   }
>
> -static const char * const exynos5_dt_compat[] __initconst =
> -{
> -    "samsung,exynos5250",
> -    NULL
> -};
> -
>   static const struct dt_device_match exynos5_blacklist_dev[] __initconst =
>   {
>       /* Multi core Timer
> @@ -117,12 +267,33 @@ static const struct dt_device_match exynos5_blacklist_dev[] __initconst =
>       { /* sentinel */ },
>   };
>
> +static const char * const exynos5250_dt_compat[] __initconst =
> +{
> +    "samsung,exynos5250",
> +    NULL
> +};
> +
> +static const char * const exynos5_dt_compat[] __initconst =
> +{
> +    "samsung,exynos5410",
> +    NULL
> +};
> +
> +PLATFORM_START(exynos5250, "SAMSUNG EXYNOS5250")
> +    .compatible = exynos5250_dt_compat,
> +    .init_time = exynos5_init_time,
> +    .specific_mapping = exynos5250_specific_mapping,
> +    .smp_init = exynos5_smp_init,
> +    .cpu_up = cpu_up_send_sgi,
> +    .reset = exynos5_reset,
> +    .blacklist_dev = exynos5_blacklist_dev,
> +PLATFORM_END
> +
>   PLATFORM_START(exynos5, "SAMSUNG EXYNOS5")
>       .compatible = exynos5_dt_compat,
>       .init_time = exynos5_init_time,
> -    .specific_mapping = exynos5_specific_mapping,
>       .smp_init = exynos5_smp_init,
> -    .cpu_up = cpu_up_send_sgi,
> +    .cpu_up = exynos5_cpu_up,
>       .reset = exynos5_reset,
>       .blacklist_dev = exynos5_blacklist_dev,
>   PLATFORM_END
> diff --git a/xen/include/asm-arm/platforms/exynos5.h b/xen/include/asm-arm/platforms/exynos5.h
> index ea941e7..c88455a 100644
> --- a/xen/include/asm-arm/platforms/exynos5.h
> +++ b/xen/include/asm-arm/platforms/exynos5.h
> @@ -1,7 +1,6 @@
>   #ifndef __ASM_ARM_PLATFORMS_EXYNOS5_H
>   #define __ASM_ARM_PLATFORMS_EXYNOS5_H
>
> -#define EXYNOS5_MCT_BASE            0x101c0000
>   #define EXYNOS5_MCT_G_TCON          0x240       /* Relative to MCT_BASE */
>   #define EXYNOS5_MCT_G_TCON_START    (1 << 8)
>
> @@ -12,8 +11,6 @@
>
>   #define EXYNOS5_SWRESET             0x0400      /* Relative to PA_PMU */
>
> -#define S5P_PA_SYSRAM   0x02020000
> -
>   #endif /* __ASM_ARM_PLATFORMS_EXYNOS5_H */
>   /*
>    * Local variables:
>

-- 
Julien Grall

  parent reply	other threads:[~2014-09-10 21:08 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-04 22:57 [XEN/ARM PATCH v6 1/1] Add OdroidXU board (Exynos 5410) Suriyan Ramasami
2014-09-08 10:20 ` Ian Campbell
2014-09-08 17:26   ` Suriyan Ramasami
2014-09-09  9:15     ` Ian Campbell
2014-09-09 15:34       ` Suriyan Ramasami
2014-09-10 22:21     ` Julien Grall
2014-09-11  0:51       ` Suriyan Ramasami
2014-09-11  1:03         ` Julien Grall
2014-09-11  3:35           ` Suriyan Ramasami
2014-09-11 12:58             ` Ian Campbell
2014-09-11 13:30               ` Suriyan Ramasami
2014-09-11 13:35                 ` Ian Campbell
2014-09-11 18:36               ` Julien Grall
2014-09-12 10:19                 ` Ian Campbell
2014-09-10 14:07 ` Ian Campbell
2014-09-10 17:05   ` Suriyan Ramasami
2014-09-11  9:03     ` Ian Campbell
2014-09-10 21:08 ` Julien Grall [this message]
2014-09-11  8:53   ` Ian Campbell
2014-09-11 12:53     ` Ian Campbell
2014-09-11 18:27       ` Julien Grall
2014-09-12 10:21         ` Ian Campbell
2014-09-12 18:54           ` Julien Grall

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=5410BDBD.4010805@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@linaro.com \
    --cc=keir@xen.org \
    --cc=suriyan.r@gmail.com \
    --cc=tim@xen.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).