xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <ian.campbell@citrix.com>
Cc: stefano.stabellini@citrix.com, xen-devel@lists.xen.org
Subject: Re: [PATCH 1/4] arm: disable distributor delivery on boot CPU only
Date: Mon, 6 Aug 2012 12:55:16 +0100	[thread overview]
Message-ID: <20120806115516.GA68290@ocelot.phlegethon.org> (raw)
In-Reply-To: <1344252900-26148-1-git-send-email-ian.campbell@citrix.com>

At 11:34 +0000 on 06 Aug (1344252897), Ian Campbell wrote:
> The secondary processors do not call enter_hyp_mode until the boot CPU
> has brought most of the system up, including enabling delivery via the
> distributor. This means that bringing up secondary CPUs unexpectedly
> disables the GICD again, meaning we get no further interrupts on any
> CPU.
> 
> It's not clear that the distributor actually needs to be disabled to
> modify the group registers but it seems reasonable that the bringup
> code should make sure the GICD is disabled even if not doing the
> transition to hyp mode, so move this to the main flow of head.S and
> only do it on the boot processor.
> 
> For completeness also disable the GICC (CPU interface) on all CPUs
> too.

I think that having interrupts disabled is something we can rely on the
bootloader/firmware handling for us, so this should all stay in
mode_switch.S for now, and avoid leaking GIC_* magic constants into
head.S.  (Unless you fancy writing a DT parser in assembler :))

Tim.

> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> ---
>  xen/arch/arm/head.S        |   14 ++++++++++++++
>  xen/arch/arm/mode_switch.S |   14 +++++++++-----
>  2 files changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/xen/arch/arm/head.S b/xen/arch/arm/head.S
> index cdbe011..a69bf72 100644
> --- a/xen/arch/arm/head.S
> +++ b/xen/arch/arm/head.S
> @@ -67,6 +67,12 @@ start:
>  	add   r8, r10                /* r8 := paddr(DTB) */
>  #endif
>  
> +	/* Disable interrupt delivery at the GIC's CPU interface */
> +	mov   r0, #GIC_BASE_ADDRESS
> +	add   r0, r0, #GIC_CR_OFFSET
> +	mov   r1, #0
> +	str   r1, [r0]
> +
>  	/* Are we the boot CPU? */
>  	mov   r12, #0                /* r12 := CPU ID */
>  	mrc   CP32(r0, MPIDR)
> @@ -85,8 +91,16 @@ start:
>  	ldr   r1, [r0]               /* Which CPU is being booted? */
>  	teq   r1, r12                /* Is it us? */
>  	bne   1b
> +	b     secondary_cpu
>  
>  boot_cpu:
> +	/* Setup which only needs to be done once, on the boot CPU */
> +	mov   r0, #GIC_BASE_ADDRESS
> +	add   r0, r0, #GIC_DR_OFFSET
> +	mov   r1, #0
> +	str   r1, [r0]               /* Disable delivery in the distributor */
> +
> +secondary_cpu:
>  #ifdef EARLY_UART_ADDRESS
>  	ldr   r11, =EARLY_UART_ADDRESS  /* r11 := UART base address */
>  	teq   r12, #0                   /* CPU 0 sets up the UART too */
> diff --git a/xen/arch/arm/mode_switch.S b/xen/arch/arm/mode_switch.S
> index f5549d7..9211d26 100644
> --- a/xen/arch/arm/mode_switch.S
> +++ b/xen/arch/arm/mode_switch.S
> @@ -49,13 +49,17 @@ enter_hyp_mode:
>  	/* Continuing ugliness: Set up the GIC so NS state owns interrupts */
>  	mov   r0, #GIC_BASE_ADDRESS
>  	add   r0, r0, #GIC_DR_OFFSET
> -	mov   r1, #0
> -	str   r1, [r0]               /* Disable delivery in the distributor */
>  	add   r0, r0, #0x80          /* GICD_IGROUP0 */
> -	mov   r2, #0xffffffff        /* All interrupts to group 1 */
> +	mov   r2, #0xffffffff        /* Interrupts 0-31 (SGI&PPI) to group 1 */
> +	/* The remaining interrupts are Shared Periphal Interrupts and so
> +	 * need reconfiguring only once, on the boot CPU */
>  	str   r2, [r0]
> -	str   r2, [r0, #4]
> -	str   r2, [r0, #8]
> +	teq   r12, #0
> +	bne   skip_spi
> +	str   r2, [r0, #4]           /* Interrupts 32-63 (SPI) to group 1 */
> +	str   r2, [r0, #8]           /* Interrupts 64-95 (SPI) to group 1 */
> +skip_spi:
> +	
>  	/* Must drop priority mask below 0x80 before entering NS state */
>  	mov   r0, #GIC_BASE_ADDRESS
>  	add   r0, r0, #GIC_CR_OFFSET
> -- 
> 1.7.9.1
> 

  reply	other threads:[~2012-08-06 11:55 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-06 11:34 [PATCH 0/4] arm: SMP interrupt handling fixes Ian Campbell
2012-08-06 11:34 ` [PATCH 1/4] arm: disable distributor delivery on boot CPU only Ian Campbell
2012-08-06 11:55   ` Tim Deegan [this message]
2012-08-06 11:56     ` Ian Campbell
2012-08-06 13:45       ` Ian Campbell
2012-08-07  9:42         ` Tim Deegan
2012-08-09  9:10           ` Ian Campbell
2012-08-09 11:26             ` Tim Deegan
2012-08-09 11:37               ` Ian Campbell
2012-08-06 11:34 ` [PATCH 2/4] arm: don't bother setting up vtimer, vgic etc on idle CPUs Ian Campbell
2012-08-06 11:34 ` [PATCH 3/4] arm/vtimer: convert result to ticks when reading CNTPCT register Ian Campbell
2012-08-06 13:46   ` Ian Campbell
2012-08-06 11:35 ` [PATCH 4/4] arm: Use per-CPU irq_desc for PPIs and SGIs Ian Campbell

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=20120806115516.GA68290@ocelot.phlegethon.org \
    --to=tim@xen.org \
    --cc=ian.campbell@citrix.com \
    --cc=stefano.stabellini@citrix.com \
    --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).