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
Cc: keir@xen.org, ian.campbell@citrix.com, tim@xen.org,
	jbeulich@suse.com, ian.jackson@citrix.com,
	julien.grall@linaro.com
Subject: Re: [XEN/ARM PATCH v1 1/1] Unbreak Arndale XEN boot
Date: Thu, 11 Sep 2014 11:49:38 -0700	[thread overview]
Message-ID: <5411EEC2.7050108@linaro.org> (raw)
In-Reply-To: <1410456310-31415-1-git-send-email-suriyan.r@gmail.com>

Hello Suriyan,

My email address is @linaro.org not @linaro.com. I nearly miss this 
patch because of this.

Depending if Ian apply his patch (see the conversation on 
"Odroid-XU..."), I would update the title and the message.

On 11/09/14 10:25, Suriyan Ramasami wrote:
> diff --git a/xen/arch/arm/platforms/exynos5.c b/xen/arch/arm/platforms/exynos5.c
> index bc9ae15..334650c 100644
> --- a/xen/arch/arm/platforms/exynos5.c
> +++ b/xen/arch/arm/platforms/exynos5.c
> @@ -28,6 +28,9 @@
>   #include <asm/platform.h>
>   #include <asm/io.h>
>
> +/* This corresponds to CONFIG_NR_CPUS in linux config */
> +#define EXYNOS_CONFIG_NR_CPUS       0x08
> +
>   #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)
> @@ -42,8 +45,6 @@ static int exynos5_init_time(void)
>       u64 mct_base_addr;
>       u64 size;
>
> -    BUILD_BUG_ON(EXYNOS5_MCT_G_TCON >= PAGE_SIZE);
> -
>       node = dt_find_compatible_node(NULL, NULL, "samsung,exynos4210-mct");
>       if ( !node )
>       {
> @@ -61,7 +62,14 @@ static int exynos5_init_time(void)
>       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 ( size <= EXYNOS5_MCT_G_TCON )

Honestly, I don't think this check is very useful. The device tree 
should always contains valid size.

> +    {
> +        dprintk(XENLOG_ERR, "EXYNOS5_MCT_G_TCON: %d is >= size\n",
> +                EXYNOS5_MCT_G_TCON);
> +        return -EINVAL;
> +    }
> +
> +    mct = ioremap_attr(mct_base_addr, size, PAGE_HYPERVISOR_NOCACHE);
>       if ( !mct )
>       {
>           dprintk(XENLOG_ERR, "Unable to map MCT\n");
> @@ -91,14 +99,36 @@ static int exynos5250_specific_mapping(struct domain *d)
>       return 0;
>   }
>
> -static int __init exynos5_smp_init(void)
> +static int exynos_smp_init_getbaseandoffset(u64 *sysram_addr,
> +                                            u64 *sysram_offset)
>   {

This function contains nearly twice the same code. Except the compatible 
string and the offset which differs, everything is the same.

I would do smth like:

node = dt_find_compatible_node(NULL, NULL, "samsung,secure-firmare");
if ( !node )
{
    compatible = "samsung,exynos4210-sysram";
    *sysram_offset = 0;
}
else
{
    compatible "samsung,exynos4210-sysram-ns";
    *sysram_offset = 0x1c;
}

node = dt_find_compatible_node(NULL, NULL, compatible);
if ( !node )
....

[..]

> +static int __init exynos5_smp_init(void)
> +{
> +    void __iomem *sysram;
> +    u64 sysram_addr;
> +    u64 sysram_offset;
> +    int rc;
> +
> +    rc = exynos_smp_init_getbaseandoffset(&sysram_addr, &sysram_offset);
> +    if ( rc )
> +        return rc;
>
> -    sysram = ioremap_nocache(sysram_ns_base_addr, PAGE_SIZE);
> +    dprintk(XENLOG_INFO, "sysram_addr: %016llx offset: %016llx\n",
> +            sysram_addr, sysram_offset);
> +
> +    if ( sysram_offset >= PAGE_SIZE )
> +    {
> +        dprintk(XENLOG_ERR, "sysram_offset is >= PAGE_SIZE\n");
> +        return -EINVAL;
> +    }

As the previous check for the MCT. I don't think it's useful. Also why 
don't do get the size from the device tree?

> +
> +    sysram = ioremap_nocache(sysram_addr, PAGE_SIZE);
>       if ( !sysram )
>       {
>           dprintk(XENLOG_ERR, "Unable to map exynos5 MMIO\n");
> @@ -125,7 +176,7 @@ static int __init exynos5_smp_init(void)
>
>       printk("Set SYSRAM to %"PRIpaddr" (%p)\n",
>              __pa(init_secondary), init_secondary);
> -    writel(__pa(init_secondary), sysram + 0x1c);
> +    writel(__pa(init_secondary), sysram + sysram_offset);
>
>       iounmap(sysram);
>
> @@ -134,14 +185,14 @@ static int __init exynos5_smp_init(void)
>
>   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;
> +    return __raw_readl(power + EXYNOS_ARM_CORE0_CONFIG +
> +                       EXYNOS_ARM_CORE_STATUS(cpu)) & S5P_CORE_LOCAL_PWR_EN;

Linux has the EXYNOS_ARM_CORE0_CONFIG included in the macro 
EXYNOS_CORE_CONFIGURATION. I would do the same here.

[..]

> -    power = ioremap_nocache(power_base_addr +
> -                            EXYNOS_ARM_CORE0_CONFIG, PAGE_SIZE);
> +    if ( size <= EXYNOS_ARM_CORE0_CONFIG +
> +                 EXYNOS_ARM_CORE_STATUS(EXYNOS_CONFIG_NR_CPUS) )
> +    {
> +        dprintk(XENLOG_ERR, "CORE registers fall outside of pmu range.\n");
> +        return -EINVAL;
> +    }
> +

Same remark as before for the check.

[..]

> -    pmu = ioremap_nocache(power_base_addr, PAGE_SIZE);
> +    if ( size <= EXYNOS5_SWRESET )
> +    {
> +        dprintk(XENLOG_ERR, "EXYNOS5_SWRESET: %d is >= size\n",
> +                EXYNOS5_SWRESET);
> +        return;
> +    }
> +

Same here too.

Regards,

-- 
Julien Grall

  reply	other threads:[~2014-09-11 18:49 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-11 17:25 [XEN/ARM PATCH v1 1/1] Unbreak Arndale XEN boot Suriyan Ramasami
2014-09-11 18:49 ` Julien Grall [this message]
2014-09-11 21:01   ` Suriyan Ramasami
2014-09-12 10:08     ` Ian Campbell
2014-09-12 17:50       ` Suriyan Ramasami
2014-09-12 18:39         ` Julien Grall
2014-09-12 18:47           ` Suriyan Ramasami
2014-09-12 18:58     ` Julien Grall
2014-09-12 19:34       ` Suriyan Ramasami
2014-09-12 21:03         ` Suriyan Ramasami
2014-09-12 21:07           ` 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=5411EEC2.7050108@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).