[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [RFC 27/29] xen/arm: Add platform specific code for the exynos5



On Mon, 2013-04-29 at 00:02 +0100, Julien Grall wrote:
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> ---
>  xen/arch/arm/platforms/Makefile         |    1 +
>  xen/arch/arm/platforms/exynos5.c        |  105 
> +++++++++++++++++++++++++++++++
>  xen/include/asm-arm/platforms/exynos5.h |   40 ++++++++++++
>  3 files changed, 146 insertions(+)
>  create mode 100644 xen/arch/arm/platforms/exynos5.c
>  create mode 100644 xen/include/asm-arm/platforms/exynos5.h
> 
> diff --git a/xen/arch/arm/platforms/Makefile b/xen/arch/arm/platforms/Makefile
> index 4313e95..ff2b65b 100644
> --- a/xen/arch/arm/platforms/Makefile
> +++ b/xen/arch/arm/platforms/Makefile
> @@ -1 +1,2 @@
>  obj-y += vexpress.o
> +obj-y += exynos5.o
> diff --git a/xen/arch/arm/platforms/exynos5.c 
> b/xen/arch/arm/platforms/exynos5.c
> new file mode 100644
> index 0000000..01e12b7
> --- /dev/null
> +++ b/xen/arch/arm/platforms/exynos5.c
> @@ -0,0 +1,105 @@
> +/*
> + * xen/arch/arm/platforms/exynos5.c
> + *
> + * Exynos5 specific settings
> + *
> + * Julien Grall <julien.grall@xxxxxxxxxx>
> + * Copyright (c) 2013 Linaro Limited.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <asm/p2m.h>
> +#include <xen/config.h>
> +#include <xen/device_tree.h>
> +#include <xen/domain_page.h>
> +#include <xen/mm.h>
> +#include <asm/platforms/exynos5.h>
> +#include <asm/platform.h>
> +
> +static int exynos5_init_time(void)
> +{
> +    uint32_t reg;
> +
> +    // enable timer on exynos5 arndale board
> +    // should probably be done by u-boot

/* */ please.

> +    reg = platform_read_register(EXYNOS5_MCT_G_TCON);
> +    platform_write_register(EXYNOS5_MCT_G_TCON, reg | 
> EXYNOS5_MCT_G_TCON_START);
> +
> +    return 0;
> +}
> +
> +/* Additionnal mapping for dom0 (Not in the DTS) */

"Additional mappings"

> +static int exynos5_specific_mapping(struct domain *d)
> +{
> +    paddr_t ma = 0;
> +    uint32_t *dst;
> +    int res;
> +
> +    /*
> +     * Set temporary guest traps with 0xe14fff7c which is hvc(0xfffc)
> +     * a hyp panic!
> +     * TODO: Find why:
> +     *  1) Xen abort directly after local_abort_enable when
> +     *  the p2m_populate_ram is not here.

It will actually be aborting here somewhere but that abort can't be
delivered until the point aborts are enabled. My patch "xen: arm: enable
aborts on all physical processors." will enable aborts much earlier so
you might get a better indication of exactly where it goes wrong.

> +     *  2) Linux doesn't start without this trick

Ouch. I presume it doesn't actually end up calling hvc 0xfffc? Does it
work if you just map/unmap without writing anything?

What does Linux do without the trick? Touches address 0x0 perhaps? Would
anything be mapped there on a real Exynos?

I had a weird one running on the v8 foundation model where I had to add
a NOP hypercall to Linux's head.S before a certain point -- I wonder if
this is related?

It'll be a missing flush or barrier of course, the question is where ;-)

> +     */
> +    p2m_populate_ram(d, 0x0, 0x1000 - 1);
> +
> +    res = gvirt_to_maddr(0, &ma);
> +    if ( res )
> +    {
> +        printk(XENLOG_ERR "Unable to translate guest address\n");
> +        return -EFAULT;
> +    }
> +
> +    dst = map_domain_page(ma >> PAGE_SHIFT);
> +    dst[2] = 0xe14fff7c;
> +    unmap_domain_page(dst);
> +
> +    /* Map the chip ID */
> +    map_mmio_regions(d, EXYNOS5_PA_CHIPID, EXYNOS5_PA_CHIPID + PAGE_SIZE - 1,
> +                     EXYNOS5_PA_CHIPID);
> +
> +    /* Map the PWM region */
> +    map_mmio_regions(d, EXYNOS5_PA_TIMER,
> +                     EXYNOS5_PA_TIMER + (PAGE_SIZE * 2) - 1,
> +                     EXYNOS5_PA_TIMER);
> +
> +    return 0;
> +}
> +
> +static void exynos5_reset(void)
> +{
> +    platform_write_register(EXYNOS5_SWRESET, 1);
> +}
> +
> +static const char const *exynos5_dt_compat[] __initdata =
> +{
> +    "samsung,exynos5250",
> +    NULL
> +};
> +
> +PLATFORM_START(exynos5, "SAMSUNG EXYNOS5")
> +    .compatible = exynos5_dt_compat,
> +    .init_time = exynos5_init_time,
> +    .specific_mapping = exynos5_specific_mapping,
> +    .reset = exynos5_reset,
> +PLATFORM_END
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/xen/include/asm-arm/platforms/exynos5.h 
> b/xen/include/asm-arm/platforms/exynos5.h
> new file mode 100644
> index 0000000..d77623c
> --- /dev/null
> +++ b/xen/include/asm-arm/platforms/exynos5.h
> @@ -0,0 +1,40 @@
> +#ifndef __ASM_ARM_PLATFORMS_EXYNOS5_H
> +#define __ASM_ASM_PLATFORMS_EXYSNO5_H
> +
> +#define EXYNOS5_MCT_BASE            0x101c0000
> +#define EXYNOS5_MCTREG(x)           (EXYNOS5_MCT_BASE + (x))
> +#define EXYNOS5_MCT_G_TCON               EXYNOS5_MCTREG(0x240)
> +#define EXYNOS5_MCT_G_TCON_START     (1 << 8)
> +
> +#define EXYNOS5_PA_CHIPID           0x10000000
> +#define EXYNOS5_PA_TIMER            0x12dd0000
> +/* Base address of system controller */
> +#define EXYNOS5_PA_PMU              0x10040000
> +
> +#define EXYNOS5_SWRESET             (EXYNOS5_PA_PMU + 0x0400)
> +
> +#define S5P_PA_SYSRAM   0x02020000
> +
> +/* Constants below is only used in assembly because the DTS is not yet 
> parsed */
> +#ifdef __ASSEMBLY__
> +
> +/* GIC Base Address */
> +#define EXYNOS5_GIC_BASE_ADDRESS    0x10480000
> +
> +/* Timer's frequency */
> +#define EXYNOS5_TIMER_FREQUENCY     (24 * 1000 * 1000) /* 24 MHz */
> +
> +/* Arndale machine ID */
> +#define MACH_TYPE_SMDK5250          3774
> +
> +#endif /* __ASSEMBLY__ */
> +
> +#endif /* __ASM_ARM_PLATFORMS_EXYNOS5_H */
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.