Re: [PATCH 3/3] bootwrapper: Initialise CCI device if found in the fdt

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

 



On Tue, Oct 02, 2012 at 12:30:54PM +0300, Riku Voipio wrote:
> On 1 October 2012 19:33, Dave Martin <dave.martin@xxxxxxxxxx> wrote:
> > On Thu, Sep 27, 2012 at 07:06:20PM +0100, Jon Medhurst (Tixy) wrote:
> >> +     /* Turn on CCI snoops and DVM messages */
> >> +     io32(cci+0x4000) = 0x3;   /* A15 cluster */
> >> +     io32(cci+0x5000) = 0x3;   /* A7 cluster */
> 
> > Ultimately, CCI slave port assignments will be deducible from the DT
> > topology, but we don't have this yet, so I guess this is OK for now.
> 
> > For the intergrated switcher work we can have a simple local patch for
> > this until/unless this (or the switcher) becomes more generic.
> 
> Would the local patch be for the bootwrapper or the integrated
> switcher kernel? The latter would be nice, as it would allow "one
> bootwrapper for everything". With the former we could still have an
> ifdef and build both bootwrappers from same source.

I think we are actually now not far away from the main bootwrapper being
usable for IKS.

We need to be able to boot Linux in the Secure world (that can be a
generic command-line option), and we need the initial CCI configuration
to match the way the model was started (i.e., which CPUs were held in
reset initially).  The latter may be a bit of a hack, for now.

If the "local patch" can be put in a sufficiently non-invasive form, I
don't see why we couldn't merge it and drop the IKS bootwrapper.  I
haven't had a lot of time to play with this though...

Cheers
---Dave

> >> +
> >> +     /* Wait while change pending bit of status register is set */
> >> +     while(io32(cci+0xc) & 0x1)
> >> +             {}
> >> +}
> >> +
> >> +static void configure_from_fdt(struct loader_info *info)
> >> +{
> >> +     void *fdt = (void *)info->fdt_start;
> >> +     uint32_t const *p;
> >> +     int addrcells, sizecells;
> >> +     int offset, len;
> >> +
> >> +     if(!fdt)
> >> +             return;
> >> +
> >> +     _fdt_address_and_size_cells(fdt, &addrcells, &sizecells);
> >> +
> >> +     /* See if there is a CCI device to initialise */
> >> +     offset = fdt_node_offset_by_compatible(fdt, 0, "arm,cci");
> >
> > I'm guessing this binding isn't official yet, but it'll do for now...
> >
> >> +     if (offset >= 0) {
> >> +             p = fdt_getprop(fdt, offset, "reg", &len);
> >> +             if(len != (addrcells + sizecells) * 4)
> >> +                     info("Failed parsing device-tree node for CCI\n");
> >> +             else
> >> +                     init_cci(fdt32_to_cpu(p[addrcells - 1]));
> >
> > I think this is worth a comment.  I presume you're trying to get the low
> > 32 bits of the address here (and assuming that the high 32 bits are zero).
> >
> > Cheers
> > ---Dave
> >
> >> +     }
> >> +
> >> +     return;
> >> +}
> >> +
> >>  static int is_space(char c)
> >>  {
> >>       return c == ' ';
> >> @@ -598,4 +646,6 @@ args_done:
> >>       atag_append(&atagp, ATAG_NONE, 0, 0);
> >>
> >>       update_fdt(&phys, info);
> >> +
> >> +     configure_from_fdt(info);
> >>  }
> >> --
> >> 1.7.10.4
> >>
> >
> > _______________________________________________
> > linaro-dev mailing list
> > linaro-dev@xxxxxxxxxxxxxxxx
> > http://lists.linaro.org/mailman/listinfo/linaro-dev
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux