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

Re: [Xen-devel] [PATCH] xen: get GIC addresses from DT



On 30/11/12 12:25, Stefano Stabellini wrote:
> On Fri, 30 Nov 2012, David Vrabel wrote:
>> On 23/11/12 15:21, Stefano Stabellini wrote:
>>> Get the address of the GIC distributor, cpu, virtual and virtual cpu
>>> interfaces registers from device tree.
>>
>> The original intention of the early DTB parsing was to get the minimum
>> of info needed before the DTB could be translated into a more useful
>> form (similar to what Linux does).
>>
>> Is this something that is still being considered in the long term?  If
>> so, should the GIC be initialized from this translated form, instead of
>> using the early parsing?
> 
> Regardless of the final form of DT parsing in Xen, I think that CPU,
> memory and GIC are the three things that should be parsed early.

Ok.

>>> +bool_t device_tree_node_compatible(const void *fdt, int node, const char 
>>> *match)
>>> +{
>>> +    int len, l;
>>> +    const void *prop;
>>> +
>>> +    prop = fdt_getprop(fdt, node, "compatible", &len);
>>> +    if ( prop == NULL )
>>> +        return 0;
>>> +
>>> +    while ( len > 0 ) {
>>> +        if ( !strncmp(prop, match, strlen(match)) )
>>> +            return 1;
>>> +        l = strlen(prop) + 1;
>>> +        prop += l;
>>> +        len -= l;
>>> +    }
>>
>> This doesn't look right.  Don't you need to split the prop string on
>> comma boundaries?
> 
> Nope, the compatible string to match is, for example, the entirety of
> "arm,cortex-a15-gic", or alternatively "arm,cortex-a9-gic". Trying to
> match just "cortex-a15-gic" would be incorrect.
> This is what Linux does too.

Yes, you're right. I was misrembering the format.

>>> +    cell = (const u32 *)prop->data;
>>> +    device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
>>
>> Is this needed?  This cell is reread below.
> 
> Yes, because device_tree_get_reg increments the cell pointer

Perhaps I wasn't clear.  The result of this device_tree_get_reg() is not
used anywhere, and the side effect of advancing cell is also not used.

>>> +
>>> +    cell = (const u32 *)prop->data;
>>> +    reg_cells = address_cells + size_cells;
>>> +    interfaces = fdt32_to_cpu(prop->len) / (reg_cells * sizeof(u32));

David

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