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

Re: [Xen-devel] [PATCH v5 09/22] xen/arm: ITS: Export ITS info to Virtual ITS



Hi Vijay,

On 27/07/15 12:11, vijay.kilari@xxxxxxxxx wrote:
> diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c
> index aa4d3c5..e16fa03 100644
> --- a/xen/arch/arm/gic-v3-its.c
> +++ b/xen/arch/arm/gic-v3-its.c
> @@ -94,6 +94,7 @@ static LIST_HEAD(its_nodes);
>  static DEFINE_SPINLOCK(its_lock);
>  static struct rdist_prop  *gic_rdists;
>  static struct rb_root rb_its_dev;
> +static struct gic_its_info its_data;
>  static DEFINE_SPINLOCK(rb_its_dev_lock);
>  
>  #define gic_data_rdist()    (this_cpu(rdist))
> @@ -942,6 +943,8 @@ static int its_probe(struct dt_device_node *node)
>      its->phys_size = its_size;
>      typer = readl_relaxed(its_base + GITS_TYPER);
>      its->ite_size = ((typer >> 4) & 0xf) + 1;
> +    its_data.eventid_bits = GITS_TYPER_IDBITS(typer);
> +    its_data.dev_bits = GITS_TYPER_DEVBITS(typer);
>  
>      its->cmd_base = xzalloc_bytes(ITS_CMD_QUEUE_SZ);
>      if ( !its->cmd_base )
> @@ -1032,7 +1035,10 @@ int its_cpu_init(void)
>  
>  int __init its_init(struct rdist_prop *rdists)
>  {
> +    struct its_node *its;
> +    struct its_node_info *info;
>      struct dt_device_node *np = NULL;
> +    uint32_t i, nr_its = 0;
>  
>      static const struct dt_device_match its_device_ids[] __initconst =
>      {
> @@ -1042,7 +1048,10 @@ int __init its_init(struct rdist_prop *rdists)
>  
>      for (np = dt_find_matching_node(NULL, its_device_ids); np;
>               np = dt_find_matching_node(np, its_device_ids))
> -        its_probe(np);
> +    {
> +        if ( !its_probe(np) )
> +            nr_its++;
> +    }
>      if ( list_empty(&its_nodes) )
>      {
> @@ -1050,6 +1059,22 @@ int __init its_init(struct rdist_prop *rdists)
>          return -ENXIO;
>      }
>  
> +    info = xzalloc_array(struct its_node_info, nr_its);
> +    if ( !info )
> +        return -ENOMEM;
> +
> +    i = 0;
> +    list_for_each_entry(its, &its_nodes, entry)
> +    {
> +         info[i].phys_base = its->phys_base;
> +         info[i].phys_size = its->phys_size;
> +         i++;
> +    }
> +
> +    its_data.nr_its = nr_its;
> +    its_data.its_hw = info;
> +    vits_setup_hw(&its_data);
> +

The vITS will only expose 1 ITS to dom0. So there is no need to try to
allocate memory in order to expose all the ITS.

We can extend vits_setup_hw if we ever want to support more ITS in the
future.

Furthermore I'd like to see all the ITS data pass one by one rather than
in a structure. This would help to catch error if we ever extend the
structure.

Something like:

void vits_hw_setup(paddr_t its0_base, unsigned long its0_size,
                   uint32_t eventID_bits, uint32_t devID_bits);

>      gic_rdists = rdists;
>      its_lpi_init(rdists->id_bits);
>      its_alloc_lpi_tables();
> diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c
> index dfa3435..3a003d4 100644
> --- a/xen/arch/arm/vgic-v3-its.c
> +++ b/xen/arch/arm/vgic-v3-its.c
> @@ -51,6 +51,15 @@ static void dump_cmd(its_cmd_block *cmd)
>  static void dump_cmd(its_cmd_block *cmd) { do {} while ( 0 ); }
>  #endif
>  
> +static struct {
> +    struct gic_its_info *info;
> +} vits_hw;

Please add a boolean valid in the structure. It would help to know if
the vITS can be used or not later.

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