|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v2 06/22] xen/arm: its: Port ITS driver to xen
Hi Julien,
On Fri, Mar 20, 2015 at 8:36 PM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:
> Hello Vijay,
>
> On 19/03/2015 14:37, vijay.kilari@xxxxxxxxx wrote:
>>
>> static LIST_HEAD(its_nodes);
>> static DEFINE_SPINLOCK(its_lock);
>> -static struct device_node *gic_root_node;
>> -static struct rdists *gic_rdists;
>> +static struct dt_device_node *gic_root_node;
>> +static struct rdist_prop *gic_rdists;
>>
>> -#define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist))
>> -#define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base)
>> +#define gic_data_rdist() (per_cpu(rdist,
>> smp_processor_id()))
>
>
> Again why didn't you return a pointer here? It would have been avoid some
> confusing changes (s/->/./) in the code.
>
> #define gic_data_rdist(&per_cpu(rdist, smp_processor_id))
>
>> +#define gic_data_rdist_rd_base() (per_cpu(rdist,
>> smp_processor_id()).rbase)
>
>
> That would avoid this change too.
OK. Let me try
>
>>
>> /*
>> * ITS command descriptors - parameters to be encoded in a command
>> @@ -228,10 +243,10 @@ static struct its_collection
>> *its_build_mapd_cmd(struct its_cmd_block *cmd,
>> struct its_cmd_desc
>> *desc)
>> {
>> unsigned long itt_addr;
>> - u8 size = ilog2(desc->its_mapd_cmd.dev->nr_ites);
>> + u8 size = max(fls(desc->its_mapd_cmd.dev->nr_ites) - 1, 1);
>
>
> ilog2 on an uint32_t is defined as fls(val) - 1. Where does the max come
> from?
>
> IHMO, I would define ilog2 in Xen, that would be easier.
Anyway this code is not used later. So I don't bother much about this
>
>>
>> - itt_addr = virt_to_phys(desc->its_mapd_cmd.dev->itt);
>> - itt_addr = ALIGN(itt_addr, ITS_ITT_ALIGN);
>> + itt_addr = __pa(desc->its_mapd_cmd.dev->itt);
>> + itt_addr = ROUNDUP(itt_addr, ITS_ITT_ALIGN);
>
>
> This file use the Linux coding style. Please use hard tab.
>
>>
>> its_encode_cmd(cmd, GITS_CMD_MAPD);
>> its_encode_devid(cmd, desc->its_mapd_cmd.dev->device_id);
>> @@ -348,7 +363,7 @@ static struct its_cmd_block *its_allocate_entry(struct
>> its_node *its)
>> while (its_queue_full(its)) {
>> count--;
>> if (!count) {
>> - pr_err_ratelimited("ITS queue not draining\n");
>> + its_err("ITS queue not draining\n");
>
>
> its_err and pr_err_ratelimited are not the same things. The former is not
> ratelimited.
>
> AFAICT this function will be accessible in someway from the guest. It would
> be possible to DOS Xen when sending a command.
Any equivalent ratelimited function in Xen?
>
>> return NULL;
>> }
>> cpu_relax();
>> @@ -380,7 +395,7 @@ static void its_flush_cmd(struct its_node *its, struct
>> its_cmd_block *cmd)
>> * the ITS.
>> */
>> if (its->flags & ITS_FLAGS_CMDQ_NEEDS_FLUSHING)
>> - __flush_dcache_area(cmd, sizeof(*cmd));
>> + clean_and_invalidate_dcache_va_range(cmd, sizeof(*cmd));
>> else
>> dsb(ishst);
>> }
>> @@ -402,7 +417,7 @@ static void its_wait_for_range_completion(struct
>> its_node *its,
>>
>> count--;
>> if (!count) {
>> - pr_err_ratelimited("ITS queue timeout\n");
>> + its_err("ITS queue timeout\n");
>
>
> Ditto
>
> [..]
>
>> -static void its_send_inv(struct its_device *dev, u32 event_id)
>> +/* TODO: Remove static for the sake of compilation */
>> +void its_send_inv(struct its_device *dev, u32 event_id)
>
>
> Rather than changing the prototype. Would it be possible to #if 0 the
> function? It would be easier to keep track change.
Does not matter much. Anyway I can try as you wish
>
>> -static int its_alloc_device_irq(struct its_device *dev, irq_hw_number_t
>> *hwirq)
>> +/* TODO: Remove static for the sake of compilation */
>> +int its_alloc_device_irq(struct its_device *dev, int *hwirq)
>> {
>> int idx;
>>
>> @@ -1139,6 +1169,8 @@ static int its_alloc_device_irq(struct its_device
>> *dev, irq_hw_number_t *hwirq)
>> return 0;
>> }
>>
>> +/* pci and msi handling no more required here */
>
>
> Hmmm why?
This code is not required. we don't have msi_domain_ops
>
>
> Already said on V1: of_device_id and dt_device_match are compatible. If you
> change the name it will work too...
>
>> + while ((np = dt_find_matching_node(np, its_device_ids)))
>> + {
>> + if (!dt_find_property(np, "msi-controller", NULL))
>> + continue;
>
>
> In your cover letter, you said you support multiple ITS node but this piece
> of code show that it's not the case...
If I remember correctly, this is later updated
>
>> + }
>>
>> - for (np = of_find_matching_node(node, its_device_id); np;
>> - np = of_find_matching_node(np, its_device_id)) {
>> - its_probe(np, parent_domain);
>
>
> The for loop was perfect, why did you drop it?
>
>> + if (np) {
>> + its_probe(np);
>> }
>>
>> if (list_empty(&its_nodes)) {
>> - pr_warn("ITS: No ITS available, not enabling LPIs\n");
>> + its_warn("ITS: No ITS available, not enabling LPIs\n");
>> return -ENXIO;
>> }
>>
>> diff --git a/xen/include/asm-arm/gic_v3_defs.h
>> b/xen/include/asm-arm/gic_v3_defs.h
>> index 4e64b56..f8bac52 100644
>> --- a/xen/include/asm-arm/gic_v3_defs.h
>> +++ b/xen/include/asm-arm/gic_v3_defs.h
>> @@ -59,11 +59,12 @@
>> #define GICR_WAKER_ProcessorSleep (1U << 1)
>> #define GICR_WAKER_ChildrenAsleep (1U << 2)
>>
>> -#define GICD_PIDR2_ARCH_REV_MASK (0xf0)
>> +#define GIC_PIDR2_ARCH_REV_MASK (0xf0)
>> +#define GICD_PIDR2_ARCH_REV_MASK GIC_PIDR2_ARCH_REV_MASK
>
>
> Why do you define GIC_PIDR2_ARCH_REV_MASK? It's not consistent with the
> other part of the code.
Linux code uses GIC_PIDR2_ARCH_REV_MASK
>
>> #define GICD_PIDR2_ARCH_REV_SHIFT (0x4)
>> #define GICD_PIDR2_ARCH_GICV3 (0x3)
>>
>> -#define GICR_PIDR2_ARCH_REV_MASK GICD_PIDR2_ARCH_REV_MASK
>> +#define GICR_PIDR2_ARCH_REV_MASK GIC_PIDR2_ARCH_REV_MASK
>
>
> Why this change? GICD_PIDR2_ARCH_REV_MASK still exists...
gic-v3.c still uses this.
Regards
Vijay
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |