[PATCH RFC v1] ARM: olpc: Add support for calling into the XO-1.75's OpenFirmware (OFW)

Andres Salomon dilinger at queued.net
Fri Aug 5 09:44:47 EDT 2011


On Fri, 5 Aug 2011 09:11:44 +0100
Ben Dooks <ben-linux at fluff.org> wrote:

> On Thu, Aug 04, 2011 at 04:25:51PM -0700, Andres Salomon wrote:
> > Add support for saving OFW's cif, and later calling into it to run
> > OFW commands from the kernel.  OFW remains resident in memory after
> > boot, and the physical/virtual addresses are passed in a boot tag.
> > We parse that, and map the addresses.
> > 
> > This is currently only used by the OLPC XO-1.75, so it's named
> > olpc_ofw().
> > 
> > Signed-off-by: Andres Salomon <dilinger at queued.net>
> > ---
> >  Documentation/arm/Setup                  |    2 +
> >  arch/arm/Kconfig                         |    8 ++
> >  arch/arm/include/asm/olpc_ofw.h          |   23 ++++++
> >  arch/arm/include/asm/setup.h             |   24 ++++++
> >  arch/arm/mach-mmp/Makefile               |    1 +
> >  arch/arm/mach-mmp/include/mach/vmalloc.h |    2 +-
> >  arch/arm/mach-mmp/olpc-xo-1-75.c         |    7 ++
> >  arch/arm/mach-mmp/olpc_ofw.c             |  118
> > ++++++++++++++++++++++++++++++ 8 files changed, 184 insertions(+),
> > 1 deletions(-) create mode 100644 arch/arm/include/asm/olpc_ofw.h
> >  create mode 100644 arch/arm/mach-mmp/olpc_ofw.c
> > 
> > 
> > I'm looking for input on our mechanism for calling into OLPC's
> > openfirmware on arm.  Some of the x86 folks are cc'd
> > as they had lots of comment when we did this for x86 OLPC machines.
> > 
> > There's a device tree patch on top of this that can be seen here:
> > http://dev.laptop.org/git/olpc-3.0/patch/?id=12377851f9a64a9e2098adf09f858bed7d3eae7c
> > 
> > Unlike the XO-1, I'd like to get this OFW communication mechanism
> > ACKed prior to OLPC's mass production of these units.
> > 
[...]
> >  
> >  source "drivers/Kconfig"
> > diff --git a/arch/arm/include/asm/olpc_ofw.h
> > b/arch/arm/include/asm/olpc_ofw.h new file mode 100644
> > index 0000000..5346e9f
> > --- /dev/null
> > +++ b/arch/arm/include/asm/olpc_ofw.h
> > @@ -0,0 +1,23 @@
> > +#ifndef _ASM_ARM_OLPC_OFW_H
> > +#define _ASM_ARM_OLPC_OFW_H
> > +
> > +#ifdef CONFIG_OLPC
> > +
> > +/* run an OFW command by calling into the firmware */
> > +#define olpc_ofw(name, args, res) \
> > +	__olpc_ofw((name), ARRAY_SIZE(args), args,
> > ARRAY_SIZE(res), res) +
> > +extern int __olpc_ofw(const char *name, int nr_args, const void
> > **args,
> > +		int nr_res, void **res);
> > +
> > +/* map OFW's page tables into kernel memory */
> > +extern void setup_olpc_ofw_mapping(void);
> > +
> > +/* check if OFW was detected during boot */
> > +extern bool olpc_ofw_present(void);
> > +
> > +#else /* !CONFIG_OLPC */
> > +static inline void setup_olpc_ofw_mapping(void) { }
> > +#endif /* !CONFIG_OLPC */
> > +
> > +#endif /* _ASM_ARM_OLPC_OFW_H */
> > diff --git a/arch/arm/include/asm/setup.h
> > b/arch/arm/include/asm/setup.h index ee2ad8a..c75889e 100644
> > --- a/arch/arm/include/asm/setup.h
> > +++ b/arch/arm/include/asm/setup.h
> > @@ -143,6 +143,25 @@ struct tag_memclk {
> >  	__u32 fmemclk;
> >  };
> >  
> > +/* OLPC OpenFirmware callback parameters: see
> > arch/arm/mach-mmp/olpc_ofw.c */ +#define ATAG_OLPC_OFW
> > 0x41000502 +
> > +struct tag_olpc_ofw {
> > +	__u32 cif_handler;	/* callback into OFW */
> > +
> > +	/* map_desc one - OFW's main memory */
> > +	__u32 ofw_va;
> > +	__u32 ofw_pfn;		/* physical address's PFN */
> > +	__u32 ofw_length;
> > +	__u32 ofw_mem_type;	/* MT_ */
> > +
> > +	/* map_desc two - OFW's frame buffer */
> > +	__u32 fb_va;
> > +	__u32 fb_pfn;		/* physical address's PFN */
> > +	__u32 fb_length;
> > +	__u32 fb_mem_type;	/* MT_ */
> > +};
> > +
> 
> The new booting method for OF on ARM is pass a pointer to the dtb
> via r2 instead of the ATAGs. You can get rid of ATAGs completely
> at this point.
> 

This is not (only) about the device tree.  It's about calling into
OFW.  For example, one could break into OFW to debug crashed hardware
(or software, I support) by hooking up a sysrq to call
olpc_ofw("enter").  Building the device tree is just one of the things
that we do.

> >  struct tag {
> >  	struct tag_header hdr;
> >  	union {
> > @@ -165,6 +184,11 @@ struct tag {
> >  		 * DC21285 specific
> >  		 */
> >  		struct tag_memclk	memclk;
> > +
> > +		/*
> > +		 * OLPC specific - for OLPC's OpenFirmware
> > implementation
> > +		 */
> > +		struct tag_olpc_ofw	olpc_ofw;
> >  	} u;
> >  };
> >  



More information about the linux-arm-kernel mailing list