Hi, Julien. On Fri, Jan 16, 2015 at 4:08 PM, Julien Grall <julien.gr...@linaro.org> wrote: > Hi Iurii, > > On 16/01/15 12:50, Iurii Konovalenko wrote: >> From: Iurii Konovalenko <iurii.konovale...@globallogic.com> >> >> Signed-off-by: Iurii Konovalenko <iurii.konovale...@globallogic.com> >> --- >> 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.
No problem, will move all defines to shmobile.c. > > [..] > >> +#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> > Yes, sure. Will fix it. > >> + >> +u32 shmobile_read_mode_pins(void) > > static OK, will add it. > >> +{ >> + static uint32_t mode; > > Why the static here? Sorry, migrated here as static from Linux kernel. Will fix it. > >> + >> + void __iomem *modemr = ioremap_nocache(SHMOBILE_MODEMR, 4); > > Missing a blank here between the variable declaration and the code. OK > >> + 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. I used xen/arch/arm/platforms/omap5.c file as a reference. In that file this function has no such attribute. But I agree with you and will add this attribute. > >> +{ >> + 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 > */ > OK, will fix it. >> + * 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 > { > OK, will fix it. >> + 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 > OK, will use this API. >> + 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 > { > OK, will fix it. >> + /* 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) Agree, I will use writel/readl API > - Linux is update CNTFRQ > > Is there any reason that this code diverge? > Linux kernel 3.14-ltsi, which I used as a reference, use CNTFID0 in file arch/arm/mach-shmobile/setup-rcar-gen2.c: iowrite32(freq, base + CNTFID0); >> + >> + iounmap(tmu); >> + >> + return 0; >> +} >> + >> +static int __init shmobile_smp_init(void) >> +{ >> + void __iomem *p; > > Missing blank line here. > OK, will fix it. >> + /* 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. > OK, will use this API. > Regards, > > -- > Julien Grall Thanks a lot for valuable advices. Best regards. Iurii Konovalenko | Senior Software Engineer GlobalLogic P +3.8044.492.9695 M +38.099.932.2909 S yufuntik
_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel