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

Re: [Xen-devel] [PATCH v1 3/3] xen/arm: Introduce support for Renesas R-Car Gen2 platform



Hi Iurii,

On 16/01/15 12:50, Iurii Konovalenko wrote:
> From: Iurii Konovalenko <iurii.konovalenko@xxxxxxxxxxxxxxx>
> 
> Signed-off-by: Iurii Konovalenko <iurii.konovalenko@xxxxxxxxxxxxxxx>
> ---
>  xen/arch/arm/platforms/Makefile          |   1 +
>  xen/arch/arm/platforms/shmobile.c        | 149 
> +++++++++++++++++++++++++++++++
>  xen/include/asm-arm/platforms/shmobile.h |  24 +++++

We are trying to avoid introduce new platform header. If you don't need
it in other files, please move the defines in the platform code.

[..]

> +#include <asm/p2m.h>
> +#include <xen/config.h>
> +#include <xen/device_tree.h>
> +#include <xen/domain_page.h>
> +#include <xen/mm.h>
> +#include <xen/vmap.h>
> +#include <asm/platforms/shmobile.h>
> +#include <asm/platform.h>
> +#include <asm/io.h>

The convention is to first include <xen/*.h> then <asm/*.h>.

Futhermore, I think most of the includes are not necessary here.

The following includes should be enough:

#include <xen/mm.h>
#include <xen/vmap.h>
#include <asm/platform.h>
#include <asm/io.h>


> +
> +u32 shmobile_read_mode_pins(void)

static

> +{
> +    static uint32_t mode;

Why the static here?

> +
> +    void __iomem *modemr = ioremap_nocache(SHMOBILE_MODEMR, 4);

Missing a blank here between the variable declaration and the code.

> +    if( !modemr )
> +    {
> +        dprintk( XENLOG_ERR, "Unable to map shmobile Mode MR\n");
> +        return 0;
> +    }
> +
> +    mode = readl_relaxed(modemr);
> +    iounmap(modemr);
> +
> +    return mode;
> +}
> +
> +static int shmobile_init_time(void)

I know the other platform code doesn't do it. But this function is only
call during Xen boot. So it should be __init.

> +{
> +    uint32_t freq;
> +    void __iomem *tmu;
> +    int extal_mhz = 0;
> +    uint32_t mode = shmobile_read_mode_pins();
> +
> +    /* At Linux boot time the Renesas R-Car Gen2 arch timer comes

The coding style for multiline comment block is:

/*
 * My comment
 * line 2
 */

> +     * up with the counter disabled. Moreover, it may also report
> +     * a potentially incorrect fixed 13 MHz frequency. To be
> +     * correct these registers need to be updated to use the
> +     * frequency EXTAL / 2 which can be determined by the MD pins.
> +     */
> +
> +    switch ( mode & (MD(14) | MD(13)) ) {

The coding style require the bracket to be on a separate line.


switch
{

> +    case 0:
> +        extal_mhz = 15;
> +        break;
> +    case MD(13):
> +        extal_mhz = 20;
> +        break;
> +    case MD(14):
> +        extal_mhz = 26;
> +        break;
> +    case MD(13) | MD(14):
> +        extal_mhz = 30;
> +        break;
> +    }
> +
> +    /* The arch timer frequency equals EXTAL / 2 */
> +    freq = extal_mhz * (1000000 / 2);
> +
> +    /* Remap "armgcnt address map" space */
> +    tmu = ioremap_attr(SHMOBILE_ARCH_TIMER_BASE, PAGE_SIZE, 
> +            PAGE_HYPERVISOR_NOCACHE);

ioremap_nocache

> +    if ( !tmu )
> +    {
> +        dprintk(XENLOG_ERR, "Unable to map TMU\n");
> +        return -ENOMEM;
> +    }
> +    /*
> +     * Update the timer if it is either not running, or is not at the
> +     * right frequency. The timer is only configurable in secure mode
> +     * so this avoids an abort if the loader started the timer and
> +     * entered the kernel in non-secure mode.
> +     */
> +
> +    if ( (readl_relaxed(tmu + SHMOBILE_ARCH_TIMER_CNTCR) & 1) == 0 ||
> +            readl_relaxed(tmu + SHMOBILE_ARCH_TIMER_CNTFID0) != freq ) {

if
{

> +        /* Update registers with correct frequency */
> +        writel_relaxed(freq, tmu + SHMOBILE_ARCH_TIMER_CNTFID0);
> +
> +        /* make sure arch timer is started by setting bit 0 of CNTCR */
> +        writel_relaxed(1, tmu + SHMOBILE_ARCH_TIMER_CNTCR);
> +    }

AFAIU, this code is based on the Linux version, right? If so some part
of the code differs from upstream:
        - Linux is using iowrite32 (i.e writel on Xen)
        - Linux is update CNTFRQ

Is there any reason that this code diverge?

> +
> +    iounmap(tmu);
> +
> +    return 0;
> +}
> +
> +static int __init shmobile_smp_init(void)
> +{
> +    void __iomem *p;

Missing blank line here.

> +    /* setup reset vectors */
> +    p = ioremap_nocache(SHMOBILE_RAM, 0x1000);
> +    if( !p )
> +    {
> +        dprintk( XENLOG_ERR, "Unable to map shmobile ICRAM\n");
> +        return -ENOMEM;
> +    }
> +
> +    writel_relaxed(__pa(init_secondary), p + SHMOBILE_SMP_START_OFFSET);
> +    iounmap(p);
> +
> +    asm("sev;");

This sev can be reordered by the compiler. We have a macro sev() which
should avoid this issue.

Regards,

-- 
Julien Grall

_______________________________________________
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®.