Hi,

See inline.

On Friday, July 24, 2015, Peter Maydell <peter.mayd...@linaro.org> wrote:

> On 24 July 2015 at 10:55, Pavel Fedin <p.fe...@samsung.com <javascript:;>>
> wrote:
> > From: Shlomo Pongratz <shlomo.pongr...@huawei.com <javascript:;>>
> >
> > This class is to be used by both software and KVM implementations of
> GICv3
> >
>
> > +++ b/include/hw/intc/arm_gicv3_common.h
> > @@ -0,0 +1,112 @@
> > +/*
> > + * ARM GIC support
> > + *
> > + * Copyright (c) 2012 Linaro Limited
> > + * Copyright (c) 2015 Huawei.
> > + * Written by Peter Maydell
> > + * Extended to 64 cores by Shlomo Pongratz
> > + *
> > + * 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.
> > + *
> > + * You should have received a copy of the GNU General Public License
> along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef HW_ARM_GICV3_COMMON_H
> > +#define HW_ARM_GICV3_COMMON_H
> > +
> > +#include "hw/sysbus.h"
> > +#include "hw/intc/arm_gic_common.h"
> > +
> > +/* Maximum number of possible interrupts, determined by the GIC
> architecture */
> > +#define GICV3_MAXIRQ 1020
>
> So how do LPIs work? They have IDs above 1023.
>

Currently I don't use LPI as the virt virtual machine doesn't use it. There
is no point to write something I can't test.

>
> > +#define GICV3_NCPU 64
>
> Where does '64' come from as a maximum limit?
>
The goal is 128 (the GIC500 limitation) but since the largest builtin is
uint64_t this will require the usage of bitfiled library. Therefore I
thought it should be delayed to future version after the logic part is
debugged.

>
> > +
> > +typedef struct gicv3_irq_state {
> > +    /* The enable bits are only banked for per-cpu interrupts.  */
> > +    uint64_t enabled;
> > +    uint64_t pending;
> > +    uint64_t active;
> > +    uint64_t level;
> > +    uint64_t group;
>
> Why are these uint64_t ?
>

These are bitfields. which were enlarged from 8 (old limit) to 64 (new
limit)

>
> > +    bool edge_trigger; /* true: edge-triggered, false: level-triggered
> */
> > +} gicv3_irq_state;
> > +
> > +typedef struct gicv3_sgi_state {
> > +    uint64_t pending[GICV3_NCPU];
> > +} gicv3_sgi_state;
> > +
> > +typedef struct GICv3State {
> > +    /*< private >*/
> > +    SysBusDevice parent_obj;
> > +    /*< public >*/
> > +
> > +    qemu_irq parent_irq[GICV3_NCPU];
> > +    qemu_irq parent_fiq[GICV3_NCPU];
> > +    /* GICD_CTLR; for a GIC with the security extensions the NS banked
> version
> > +     * of this register is just an alias of bit 1 of the S banked
> version.
> > +     */
> > +    uint32_t ctlr;
> > +    /* Sim GICC_CTLR; again, the NS banked version is just aliases of
> bits of
> > +     * the S banked register, so our state only needs to store the S
> version.
> > +     */
>
> "Sim" ?
>

Should be simulate as I only support system registers and not memory mapped
registers, but keeping this variable makes the code more close to GICv2
code.

>
> > +    uint32_t cpu_ctlr[GICV3_NCPU];
> > +    bool cpu_enabled[GICV3_NCPU];
> > +
> > +    gicv3_irq_state irq_state[GICV3_MAXIRQ];
> > +    uint64_t irq_target[GICV3_MAXIRQ];
> > +    uint8_t priority1[GIC_INTERNAL][GICV3_NCPU];
> > +    uint8_t priority2[GICV3_MAXIRQ - GIC_INTERNAL];
> > +    uint16_t last_active[GICV3_MAXIRQ][GICV3_NCPU];
> > +    /* For each SGI on the target CPU, we store 64 bits
> > +     * indicating which source CPUs have made this SGI
> > +     * pending on the target CPU. These correspond to
> > +     * the bytes in the GIC_SPENDSGIR* registers as
> > +     * read by the target CPU.
>
> This comment doesn't make any sense. You can't fit
> 64 bits into a byte, and GIC_SPENDSGIR<n> only hold
> 8 set-pending bits per SGI.
>
Correct, the comment is wrong and should be removed as spi_mending was
replaced by a structure.
The usage of a structure and not by a uint64_t vector is because there is
no serialization macro for it.

>
> > +     */
> > +    gicv3_sgi_state sgi_state[GIC_NR_SGIS];
> > +
> > +    uint16_t priority_mask[GICV3_NCPU];u
> > +    uint16_t running_irq[GICV3_NCPU];
> > +    uint16_t running_priority[GICV3_NCPU];
> > +    uint16_t current_pending[GICV3_NCPU];
> > +
> > +    uint32_t cpu_mask; /* For redistributor */
> > +    uint32_t num_cpu;
> > +    MemoryRegion iomem_dist; /* Distributor */
> > +    MemoryRegion iomem_lpi; /* Redistributor */
> > +    uint32_t num_irq;
> > +    uint32_t revision;
> > +    bool security_levels;
> > +    int dev_fd; /* kvm device fd if backed by kvm vgic support */
> > +} GICv3State;
>
> This whole struct reads like "we just took the GICv2 state
> and changed it as little as possible beyond bumping the
> NCPU define a bit". That doesn't make me very confident
> that it's actually correct for GICv3...
>
I admit that the intention of the first is to make as little changes a
possible and yet to be able to boot 64 Linux kernel (which was achieved).
Note that the kernel identified and used the GICv3 driver.

>
> thanks
> -- PMM
>

Reply via email to