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

Re: [Xen-devel] [PATCH v3 07/16] xen/arm: segregate and split GIC low level functionality



Hello Vijay,

A couple of things I've noticed while reviewing this series.

On 04/15/2014 12:17 PM, vijay.kilari@xxxxxxxxx wrote:
> +static void gicv2_write_lr(int lr, struct gic_lr *lr_reg)
> +{
> +    uint32_t lrv = 0;

Newline here.

> +    lrv = ( ((lr_reg->pirq & GICH_LR_PHYSICAL_MASK) << 
> GICH_LR_PHYSICAL_SHIFT)  |
> +            ((lr_reg->virq & GICH_LR_VIRTUAL_MASK) << GICH_LR_VIRTUAL_SHIFT) 
>   |
> +            ((uint32_t)(lr_reg->priority & GICH_LR_PRIORITY_MASK) << 
> GICH_LR_PRIORITY_SHIFT) |
> +            ((uint32_t)(lr_reg->state & GICH_LR_STATE_MASK) << 
> GICH_LR_STATE_SHIFT) |
> +            ((uint32_t)(lr_reg->hw_status & GICH_LR_HW_MASK)  << 
> GICH_LR_HW_SHIFT)  |
> +            ((uint32_t)(lr_reg->grp & GICH_LR_GRP_MASK) << 
> GICH_LR_GRP_SHIFT) );
> +
> +    GICH[GICH_LR + lr] = lrv;
> +}

[..]

> +struct gic_hw_operations {

Some of these functions require locks. You have to specified here which
lock is required.

That will avoid headache for people who are planning to implement new
GIC driver.

> +    /* GIC version */
> +    enum gic_version hw_version;
> +    /* Number of GIC lines supported */
> +    unsigned int nr_lines;
> +    /* Number of LR registers */
> +    unsigned int nr_lrs;
> +    /* Maintenance irq is derived from dt node. Fetch from gic driver */
> +    struct dt_irq * (*get_maintenance_irq)(void);
> +    /* Save GIC registers */
> +    void (*save_state)(struct vcpu *);
> +    /* Restore GIC registers */
> +    void (*restore_state)(struct vcpu *);
> +    /* Dump GIC LR register information */
> +    void (*dump_state)(struct vcpu *);
> +    /* Map MMIO region of GIC and get GIC address information */
> +    int (*gicv_setup)(struct domain *);
> +
> +    /* hw_irq_controller for enable/disable/eoi irq */
> +    hw_irq_controller *gic_irq_ops;
> +
> +    /* Deactivate/reduce priority of irq */
> +    void (*deactivate_irq)(int);
> +    /* Ack IRQ and return irq id */
> +    unsigned int (*ack_irq)(void);

This name of this function is not clear for me. I would rename into

read_irq_and_ack (maybe the and_ack is not necessary).

> +    /* Set IRQ property */
> +    void (*set_irq_property)(unsigned int irq, bool_t level,
> +                            const cpumask_t *cpu_mask,
> +                            unsigned int priority);
> +    /* Send SGI */
> +    void (*send_sgi)(const cpumask_t *online_mask,
> +                         enum gic_sgi sgi, uint8_t irqmode);
> +    /* Disable CPU physical and virtual interfaces */
> +    void (*disable_interface)(void);
> +    /* Update LR with state and priority */
> +    void (*update_lr)(int lr, struct pending_irq *, unsigned int state);
> +    /* Update HCR status register */
> +    void (*update_hcr_status)(uint32_t flag, bool_t set);
> +    /* Clear LR register */
> +    void (*clear_lr)(int lr);
> +    /* Read LR register and populate gic_lr structure */
> +    void (*read_lr)(int lr, struct gic_lr *);
> +    /* Write LR register from gic_lr structure */
> +    void (*write_lr)(int lr, struct gic_lr *);
> +    /* Read VMCR priority */
> +    unsigned int (*read_vmcr_priority)(void);
> +    /* Secondary CPU init */
> +    void (*secondary_init)(void);

I would return an int here. I saw a panic on GICv3, and I don't think
it's acceptable for secondary CPUs. I can be used during CPU hotplug.

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