All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: ian.campbell@citrix.com, peter.huangpeng@huawei.com,
	xen-devel@lists.xen.org, julien.grall@citrix.com,
	stefano.stabellini@citrix.com, shannon.zhao@linaro.org,
	Shannon Zhao <zhaoshenglong@huawei.com>
Subject: Re: [PATCH v4 13/21] arm/gic-v2: Add ACPI boot support for GICv2
Date: Thu, 25 Feb 2016 14:59:44 +0000	[thread overview]
Message-ID: <alpine.DEB.2.02.1602251457360.4219@kaball.uk.xensource.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1602251449130.4219@kaball.uk.xensource.com>

On Thu, 25 Feb 2016, Stefano Stabellini wrote:
> On Thu, 25 Feb 2016, Shannon Zhao wrote:
> > On 2016/2/25 18:42, Stefano Stabellini wrote:
> > > On Thu, 25 Feb 2016, Shannon Zhao wrote:
> > >> On 2016/1/28 20:56, Stefano Stabellini wrote:
> > >>> On Sat, 23 Jan 2016, Shannon Zhao wrote:
> > >>>> From: Parth Dixit <parth.dixit@linaro.org>
> > >>>>
> > >>>> ACPI on Xen hypervisor uses MADT table for proper GIC initialization.
> > >>>> First get the GIC version from GIC Distributor. Then parse GIC related
> > >>>> subtables, collect CPU interface and distributor addresses and call
> > >>>> driver initialization function (which is hardware abstraction agnostic).
> > >>>> In a similar way, FDT initialize GICv2.
> > >>>>
> > >>>> Signed-off-by: Parth Dixit <parth.dixit@linaro.org>
> > >>>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> > >>>>
> > >>>> V4: use container_of and fix coding style
> > >>>> ---
> > >>>>  xen/arch/arm/gic-v2.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++-
> > >>>>  1 file changed, 119 insertions(+), 1 deletion(-)
> > >>>>
> > >>>> diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
> > >>>> index 668b863..7e46ee9 100644
> > >>>> --- a/xen/arch/arm/gic-v2.c
> > >>>> +++ b/xen/arch/arm/gic-v2.c
> > >>>> @@ -29,6 +29,8 @@
> > >>>>  #include <xen/device_tree.h>
> > >>>>  #include <xen/libfdt/libfdt.h>
> > >>>>  #include <xen/sizes.h>
> > >>>> +#include <xen/acpi.h>
> > >>>> +#include <acpi/actables.h>
> > >>>>  #include <asm/p2m.h>
> > >>>>  #include <asm/domain.h>
> > >>>>  #include <asm/platform.h>
> > >>>> @@ -36,6 +38,7 @@
> > >>>>  
> > >>>>  #include <asm/io.h>
> > >>>>  #include <asm/gic.h>
> > >>>> +#include <asm/acpi.h>
> > >>>>  
> > >>>>  /*
> > >>>>   * LR register definitions are GIC v2 specific.
> > >>>> @@ -681,11 +684,111 @@ static void __init gicv2_dt_init(void)
> > >>>>                 csize, vsize);
> > >>>>  }
> > >>>>  
> > >>>> +#ifdef CONFIG_ACPI
> > >>>> +static int __init
> > >>>> +gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
> > >>>> +                        const unsigned long end)
> > >>>> +{
> > >>>> +    static int cpu_base_assigned = 0;
> > >>>> +    struct acpi_madt_generic_interrupt *processor =
> > >>>> +               container_of(header, struct acpi_madt_generic_interrupt, header);
> > >>>> +
> > >>>> +    if ( BAD_MADT_ENTRY(processor, end) )
> > >>>> +        return -EINVAL;
> > >>>> +
> > >>>> +    /* Read from APIC table and fill up the GIC variables */
> > >>>> +    if ( cpu_base_assigned == 0 )
> > >>>> +    {
> > >>>> +        cbase = processor->base_address;
> > >>>> +        csize = SZ_8K;
> > >>>> +        hbase = processor->gich_base_address;
> > >>>> +        vbase = processor->gicv_base_address;
> > >>>> +        gicv2_info.maintenance_irq = processor->vgic_interrupt;
> > >>>> +
> > >>>> +        if( processor->flags & ACPI_MADT_VGIC_IRQ_MODE )
> > >>>
> > >>>             ^ if ( 
> > >>>
> > >>>
> > >>>> +            irq_set_type(gicv2_info.maintenance_irq, IRQ_TYPE_EDGE_BOTH);
> > >>>> +        else
> > >>>> +            irq_set_type(gicv2_info.maintenance_irq, IRQ_TYPE_LEVEL_MASK);
> > >>>> +
> > >>>> +        cpu_base_assigned = 1;
> > >>>> +    }
> > >>>> +    else
> > >>>> +    {
> > >>>> +        if ( cbase != processor->base_address
> > >>>> +             || hbase != processor->gich_base_address
> > >>>> +             || vbase != processor->gicv_base_address
> > >>>> +             || gicv2_info.maintenance_irq != processor->vgic_interrupt )
> > >>>> +        {
> > >>>> +            printk("GICv2: GICC entries are not same in MADT table\n");
> > >>>> +            return -EINVAL;
> > >>>> +        }
> > >>>> +    }
> > >>>> +
> > >>>> +    return 0;
> > >>>> +}
> > >>>> +
> > >>>> +static int __init
> > >>>> +gic_acpi_parse_madt_distributor(struct acpi_subtable_header *header,
> > >>>> +                                const unsigned long end)
> > >>>> +{
> > >>>> +    struct acpi_madt_generic_distributor *dist =
> > >>>> +             container_of(header, struct acpi_madt_generic_distributor, header);
> > >>>> +
> > >>>> +    if ( BAD_MADT_ENTRY(dist, end) )
> > >>>> +        return -EINVAL;
> > >>>> +
> > >>>> +    dbase = dist->base_address;
> > >>>> +
> > >>>> +    return 0;
> > >>>> +}
> > >>>> +
> > >>>> +static void __init gicv2_acpi_init(void)
> > >>>> +{
> > >>>> +    acpi_status status;
> > >>>> +    struct acpi_table_header *table;
> > >>>> +    int count;
> > >>>> +
> > >>>> +    status = acpi_get_table(ACPI_SIG_MADT, 0, &table);
> > >>>> +
> > >>>> +    if ( ACPI_FAILURE(status) )
> > >>>> +    {
> > >>>> +        const char *msg = acpi_format_exception(status);
> > >>>> +
> > >>>> +        panic("GICv2: Failed to get MADT table, %s", msg);
> > >>>> +    }
> > >>>> +
> > >>>> +    /* Collect CPU base addresses */
> > >>>> +    count = acpi_parse_entries(ACPI_SIG_MADT, sizeof(struct acpi_table_madt),
> > >>>> +                               gic_acpi_parse_madt_cpu, table,
> > >>>> +                               ACPI_MADT_TYPE_GENERIC_INTERRUPT, 0);
> > >>>> +    if ( count <= 0 )
> > >>>> +        panic("GICv2: No valid GICC entries exists");
> > >>>> +
> > >>>> +    /*
> > >>>> +     * Find distributor base address. We expect one distributor entry since
> > >>>> +     * ACPI 5.0 spec neither support multi-GIC instances nor GIC cascade.
> > >>>> +     */
> > >>>> +    count = acpi_parse_entries(ACPI_SIG_MADT, sizeof(struct acpi_table_madt),
> > >>>> +                               gic_acpi_parse_madt_distributor, table,
> > >>>> +                               ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR, 0);
> > >>>> +    if ( count <= 0 )
> > >>>> +        panic("GICv2: No valid GICD entries exists");
> > >>>> +}
> > >>>> +#else
> > >>>> +static void __init gicv2_acpi_init(void)
> > >>>> +{
> > >>>> +/* Should never reach here */
> > >>>> +}
> > >>>> +#endif
> > >>>
> > >>> With acpi_disabled becoming an #define constant, this #else should not
> > >>> be needed.
> > >>>
> > >> If I remove #else and define acpi_disabled as a constant as you
> > >> suggested, it has below compiling error on arm32.
> > >>
> > >> diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
> > >> index 9a9fcd5..28ec064 100644
> > >> --- a/xen/arch/arm/gic-v2.c
> > >> +++ b/xen/arch/arm/gic-v2.c
> > >> @@ -776,11 +776,6 @@ static void __init acpi_gicv2_init(void)
> > >>      if ( count <= 0 )
> > >>          panic("GICv2: No valid GICD entries exists");
> > >>  }
> > >> -#else
> > >> -static void __init acpi_gicv2_init(void)
> > >> -{
> > >> -/* Should never reach here */
> > >> -}
> > >>  #endif
> > >>
> > >> gic-v2.c: In function 'gicv2_init':
> > >> gic-v2.c:793:9: error: implicit declaration of function
> > >> 'acpi_gicv2_init' [-Werror=implicit-function-declaration]
> > >> gic-v2.c:793:9: error: nested extern declaration of 'acpi_gicv2_init'
> > >> [-Werror=nested-externs]
> > >> cc1: all warnings being treated as errors
> > > 
> > > Sorry, I should have been clearer. You still need to have a declaration
> > > of the function outside the #ifdef. Something like the following should
> > > work:
> > > 
> > >   static void acpi_gicv2_init(void);
> > > 
> > >   [...]
> > > 
> > >   #ifdef CONFIG_ACPI
> > >   static void __init acpi_gicv2_init(void)
> > >   {
> > >       /* do something */
> > >   }
> > >   #endif
> > > 
> > >   [...]
> > > 
> > >   if ( acpi_disabled )
> > >       gicv2_dt_init();
> > >   else
> > >       gicv2_acpi_init();
> > > 
> > > .
> > > 
> > I'm afraid it doesn't work. Still has below errors with the declaration:
> > 
> > gic-v2.c:687:13: error: 'gicv2_acpi_init' used but never defined [-Werror]
> > cc1: all warnings being treated as errors
> >
> > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
> > index 4b6c4c0..7b7e094 100644
> > --- a/xen/arch/arm/gic-v2.c
> > +++ b/xen/arch/arm/gic-v2.c
> > @@ -684,6 +684,8 @@ static void __init gicv2_dt_init(void)
> >                 csize, vsize);
> >  }
> > 
> > +static void gicv2_acpi_init(void);
> 
> It should be
> 
>    void gicv2_acpi_init(void);
> 
> without "static".

However I am starting to doubt that this is actually an good improvement
in terms of code quality. So I would be also OK with keeping things are
they are.

 
> >  #ifdef CONFIG_ACPI
> >  static int __init
> >  gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
> > @@ -774,11 +776,6 @@ static void __init gicv2_acpi_init(void)
> >      if ( count <= 0 )
> >          panic("GICv2: No valid GICD entries exists");
> >  }
> > -#else
> > -static void __init gicv2_acpi_init(void)
> > -{
> > -/* Should never reach here */
> > -}

but if you do that please make the stub function a single line:

  static void __init gicv2_acpi_init(void) { }


> >  #endif
> > 
> >  static int __init gicv2_init(void)

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

  reply	other threads:[~2016-02-25 14:59 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-23  9:19 [PATCH v4 00/21] Add ACPI support for Xen itself on ARM64 Shannon Zhao
2016-01-23  9:19 ` [PATCH v4 01/21] arm/acpi: Emulate io ports for arm Shannon Zhao
2016-01-27 12:52   ` Stefano Stabellini
2016-01-28 12:13     ` Shannon Zhao
2016-01-28 12:35       ` Stefano Stabellini
2016-01-23  9:19 ` [PATCH v4 02/21] arm/acpi: Add arm specific acpi header file Shannon Zhao
2016-01-23  9:19 ` [PATCH v4 03/21] arm/acpi: Add __acpi_map_table function for ARM Shannon Zhao
2016-01-23  9:19 ` [PATCH v4 04/21] arm/acpi: Move end_boot_allocator after acpi_boot_table_init Shannon Zhao
2016-01-27 14:53   ` Stefano Stabellini
2016-01-23  9:19 ` [PATCH v4 05/21] arm/acpi: Add basic ACPI initialization Shannon Zhao
2016-01-27 14:54   ` Stefano Stabellini
2016-01-28 10:33     ` Shannon Zhao
2016-01-28 10:44       ` Stefano Stabellini
2016-01-28 11:18         ` Shannon Zhao
2016-01-28 11:27           ` Stefano Stabellini
2016-01-28 11:53             ` Shannon Zhao
2016-01-28 12:38               ` Stefano Stabellini
2016-01-23  9:19 ` [PATCH v4 06/21] arm/acpi: Parse FADT table and get PSCI flags Shannon Zhao
2016-01-27 15:41   ` Stefano Stabellini
2016-02-23 12:13     ` Shannon Zhao
2016-02-23 14:37       ` Stefano Stabellini
2016-01-23  9:19 ` [PATCH v4 07/21] arm/acpi: Print GIC information when MADT is parsed Shannon Zhao
2016-01-25 14:49   ` Jan Beulich
2016-01-27 16:50   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 08/21] arm/acpi: Parse MADT to map logical cpu to MPIDR and get cpu_possible_map Shannon Zhao
2016-01-25 14:53   ` Jan Beulich
2016-01-28 10:40   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 09/21] arm/acpi: Add ACPI support for SMP initialization Shannon Zhao
2016-01-28 10:56   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 10/21] acpi/table: Introduce acpi_table_get_entry_madt to get specified entry Shannon Zhao
2016-01-25 15:02   ` Jan Beulich
2016-01-29  7:49     ` Shannon Zhao
2016-01-23  9:20 ` [PATCH v4 11/21] arm: Introduce a generic way to use a device from acpi Shannon Zhao
2016-01-28 12:45   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 12/21] arm/irq: Drop the DT prefix of the irq line type Shannon Zhao
2016-01-28 12:48   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 13/21] arm/gic-v2: Add ACPI boot support for GICv2 Shannon Zhao
2016-01-28 12:56   ` Stefano Stabellini
2016-02-25  8:32     ` Shannon Zhao
2016-02-25 10:42       ` Stefano Stabellini
2016-02-25 14:06         ` Shannon Zhao
2016-02-25 14:56           ` Stefano Stabellini
2016-02-25 14:59             ` Stefano Stabellini [this message]
2016-01-23  9:20 ` [PATCH v4 14/21] arm/gic-v3: Add ACPI boot support for GICv3 Shannon Zhao
2016-02-02 17:31   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 15/21] arm/gic: Add ACPI support for GIC preinit Shannon Zhao
2016-02-02 17:36   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 16/21] arm/irq: Add helper function for setting interrupt type Shannon Zhao
2016-01-23  9:20 ` [PATCH v4 17/21] arm/acpi: Parse GTDT to initialize timer Shannon Zhao
2016-02-02 17:45   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 18/21] arm/acpi: Add a new ACPI initialized function for UART Shannon Zhao
2016-01-25 15:04   ` Jan Beulich
2016-02-02 17:48   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 19/21] arm/acpi: Initialize serial port from ACPI SPCR table Shannon Zhao
2016-01-25 15:05   ` Jan Beulich
2016-01-28 12:33     ` Shannon Zhao
2016-01-28 12:59       ` Jan Beulich
2016-02-02 17:51   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 20/21] arm/fdt: Export device_tree_for_each_node Shannon Zhao
2016-02-02 18:01   ` Stefano Stabellini
2016-01-23  9:20 ` [PATCH v4 21/21] arm/acpi: Add acpi parameter to enable/disable acpi Shannon Zhao
2016-02-02 17:58   ` Stefano Stabellini

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=alpine.DEB.2.02.1602251457360.4219@kaball.uk.xensource.com \
    --to=stefano.stabellini@eu.citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=julien.grall@citrix.com \
    --cc=peter.huangpeng@huawei.com \
    --cc=shannon.zhao@linaro.org \
    --cc=stefano.stabellini@citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=zhaoshenglong@huawei.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.