LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: Platform device model drawback
From: Peter Hanson @ 2005-11-17 23:05 UTC (permalink / raw)
  To: Greg KH; +Cc: linuxppc-embedded
In-Reply-To: <20051117174912.GA23034@kroah.com>

On 11/17/05, Greg KH <greg@kroah.com> wrote:
> On Thu, Nov 17, 2005 at 09:51:56AM -0800, Peter Hanson wrote:
> > On 11/16/05, Greg KH <greg@kroah.com> wrote:
> > > On Wed, Nov 16, 2005 at 06:39:49PM -0800, Peter Hanson wrote:
> > > > IIRC, Arabella claims to deal nicely with dynamic allocation of
> > > > PowerPC resources to Linux devices =3D>
> > > > http://www.arabellasw.com/home.php
> > >
> > > I don't understand how that pertains to this thread...
> >
> > Potential conflict: multiple logical devices competing for the same
> > SoC resource.  Converse: similar logical devices supported by
> > different resources.  Both cases have been mentioned in this thread,
> > with confusion about how to deal with them.
> >
> > Does Arabella solve it as claimed?  I don't know.  But dynamic
> > allocation doesn't sound crazy.  Maybe some of the code or design can
> > even be copied.
>
> Do you have a pointer to their code anywhere?

I checked [http://www.arabellasw.com/products-free.php], and the
downloadable source is now gone.  :-(

> thanks,
>
> greg k-h

^ permalink raw reply

* [PATCH] ppc: Fix MPC83xx device table
From: Kumar Gala @ 2005-11-17 23:05 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: dave, Paul Mackerras, linux-kernel, linuxppc-embedded

The SVRs for MPC8343/E where incorrect and really the SVRs
for MPC8347/E.

Signed-off-by: David Updegraff <dave@cray.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>

---
commit 6eba85c696e0a0fef59435bd641110a759b308ab
tree 0f2393d85f4f225793508a321460c74579c9d834
parent 5b45c04aa9d209ba1a71ff8061fda9ae3979ddd6
author Kumar Gala <galak@kernel.crashing.org> Thu, 17 Nov 2005 17:06:02 -0600
committer Kumar Gala <galak@kernel.crashing.org> Thu, 17 Nov 2005 17:06:02 -0600

 arch/ppc/syslib/mpc83xx_sys.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/arch/ppc/syslib/mpc83xx_sys.c b/arch/ppc/syslib/mpc83xx_sys.c
index a152398..82cf3ab 100644
--- a/arch/ppc/syslib/mpc83xx_sys.c
+++ b/arch/ppc/syslib/mpc83xx_sys.c
@@ -69,9 +69,33 @@ struct ppc_sys_spec ppc_sys_specs[] = {
 		},
 	},
 	{
-		.ppc_sys_name	= "8343E",
+		.ppc_sys_name	= "8347E",
 		.mask 		= 0xFFFF0000,
 		.value 		= 0x80540000,
+		.num_devices	= 9,
+		.device_list	= (enum ppc_sys_devices[])
+		{
+			MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
+			MPC83xx_IIC2, MPC83xx_DUART, MPC83xx_SEC2,
+			MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
+		},
+	},
+	{
+		.ppc_sys_name	= "8347",
+		.mask 		= 0xFFFF0000,
+		.value 		= 0x80550000,
+		.num_devices	= 8,
+		.device_list	= (enum ppc_sys_devices[])
+		{
+			MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
+			MPC83xx_IIC2, MPC83xx_DUART,
+			MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
+		},
+	},
+	{
+		.ppc_sys_name	= "8343E",
+		.mask 		= 0xFFFF0000,
+		.value 		= 0x80560000,
 		.num_devices	= 8,
 		.device_list	= (enum ppc_sys_devices[])
 		{
@@ -83,7 +107,7 @@ struct ppc_sys_spec ppc_sys_specs[] = {
 	{
 		.ppc_sys_name	= "8343",
 		.mask 		= 0xFFFF0000,
-		.value 		= 0x80550000,
+		.value 		= 0x80570000,
 		.num_devices	= 7,
 		.device_list	= (enum ppc_sys_devices[])
 		{

^ permalink raw reply related

* Re: gianfar generic PHY assumptions.
From: Kumar Gala @ 2005-11-17 23:07 UTC (permalink / raw)
  To: David Updegraff; +Cc: linux-ppc-embedded
In-Reply-To: <437CFB43.4060400@cray.com>

On Thu, 17 Nov 2005, David Updegraff wrote:
> Hi.
> 
> This patch lets gianfar work on 83xx (or 85xx??) boards that have 
> Generic PHYs on them that do _NOT_ happen to have an IRQ line wired to 
> external_15.  Surely reasonable that if we can't ID the PHY that its 
> probably not irq-wired the Freescale-ADS "way"...
> 
> It was critical for us; perhaps usefull for others.


The way PHYs are handle in 2.6.15 is completely different and the patch 
is not valid against the current tree.

- kumar

^ permalink raw reply

* Re: gianfar generic PHY assumptions.
From: Matt Porter @ 2005-11-17 23:14 UTC (permalink / raw)
  To: David Updegraff; +Cc: linux-ppc-embedded
In-Reply-To: <437CFB43.4060400@cray.com>

On Thu, Nov 17, 2005 at 03:50:59PM -0600, David Updegraff wrote:
> Hi.
> 
> This patch lets gianfar work on 83xx (or 85xx??) boards that have 
> Generic PHYs on them that do _NOT_ happen to have an IRQ line wired to 
> external_15.  Surely reasonable that if we can't ID the PHY that its 
> probably not irq-wired the Freescale-ADS "way"...
> 
> It was critical for us; perhaps usefull for others.

Aside from the fact that the patch doesn't apply against the
current kernel due to the change of gianfar to use the phy
layer...why wouldn't you just set the board_flags field
appropriately in your board port? If you don't use a phy interrupt
then don't set the flag claiming that you do.  stx_gp3.c doesn't
make use of the phy interrupt functionality, as an example.

I looked at an older kernel and I'm not sure where you see external
15 being used. It seems to be EXT5 on all the Fscale boards.

-Matt

^ permalink raw reply

* Re: [PATCH] ppc boot: replace string labels with numbers
From: Jerry Van Baren @ 2005-11-17 22:54 UTC (permalink / raw)
  Cc: linuxppc-dev
In-Reply-To: <20051117210902.GB31775@suse.de>

Olaf Hering wrote:
> Replacing the string labels with numbers saves 117 bytes in the final zImage.
> These local labels are not discared.
> 
> Signed-off-by: Olaf Hering <olh@suse.de>
> 
>  arch/powerpc/boot/crt0.S |   23 +++++++++++------------
>  1 files changed, 11 insertions(+), 12 deletions(-)
> 
> Index: linux-2.6.15-rc1-olh/arch/powerpc/boot/crt0.S
> ===================================================================
> --- linux-2.6.15-rc1-olh.orig/arch/powerpc/boot/crt0.S
> +++ linux-2.6.15-rc1-olh/arch/powerpc/boot/crt0.S
> @@ -14,43 +14,42 @@
>  	.text
>  	.globl	_zimage_start
>  _zimage_start:
> -	bl	reloc_offset
> +	bl	1f
>  
> -reloc_offset:
> +1:
>  	mflr	r0
> -	lis	r9,reloc_offset@ha
> -	addi	r9,r9,reloc_offset@l
> +	lis	r9,1b@ha
> +	addi	r9,r9,1b@l
>  	subf.	r0,r9,r0
> -	beq	clear_caches
> +	beq	3f

[snip]

OK, I've waited for someone dumber than me to ask, but I guess I'm the 
bottom guy on the totem pole here.

How does changing a local ascii label to a temporary label _but using 
the same machine instructions_ affect the output image size????  Why 
would "lis r9,reloc_offset@ha" generate a smaller (!) instruction than 
"lis r9,1b@ha"????

My first thought was that the symbol section of the ELF output is 
bigger, but the labels are not globals.  Even if the local labels end up 
in the symbol section (which the comment on the original patch message 
sort of implies), that isn't going to make a (stripped) binary any 
bigger.  If that is the case, isn't a better cure to strip the ELF file?

While I'm being dumb, I gotta ask, how big is zImage and why does 117 
bytes make a difference?

My 2c: if you are going to use inscrutable labels (1,2,3,4), please put 
comments in.  At least the previous labels gave hints as to what was 
happening.

Puzzled,
gvb

^ permalink raw reply

* [PATCH] ppc: Fix warnings related to seq_file
From: Kumar Gala @ 2005-11-17 23:45 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Paul Mackerras, linux-kernel, linuxppc-embedded

When we moved things around in irq.h seq_file became an issue.  Fix
warnings related to its usage.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>

---
commit ac2a1a810d71d6c5f928cfbb428717bc3c567fde
tree c213a8035b6bb13aeb5e2bf639b3af9830462fb2
parent 81fa90f4627668b94ba55163dca08b076ee71e50
author Kumar Gala <galak@kernel.crashing.org> Thu, 17 Nov 2005 17:47:03 -0600
committer Kumar Gala <galak@kernel.crashing.org> Thu, 17 Nov 2005 17:47:03 -0600

 arch/ppc/platforms/85xx/mpc85xx_ads_common.h |    2 ++
 arch/ppc/platforms/85xx/stx_gp3.h            |    2 --
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/ppc/platforms/85xx/mpc85xx_ads_common.h b/arch/ppc/platforms/85xx/mpc85xx_ads_common.h
index 7b26bcc..198a6a0 100644
--- a/arch/ppc/platforms/85xx/mpc85xx_ads_common.h
+++ b/arch/ppc/platforms/85xx/mpc85xx_ads_common.h
@@ -25,6 +25,8 @@
 #define BCSR_ADDR		((uint)0xf8000000)
 #define BCSR_SIZE		((uint)(32 * 1024))
 
+struct seq_file;
+
 extern int mpc85xx_ads_show_cpuinfo(struct seq_file *m);
 extern void mpc85xx_ads_init_IRQ(void) __init;
 extern void mpc85xx_ads_map_io(void) __init;
diff --git a/arch/ppc/platforms/85xx/stx_gp3.h b/arch/ppc/platforms/85xx/stx_gp3.h
index 7bcc6c3..2f25b51 100644
--- a/arch/ppc/platforms/85xx/stx_gp3.h
+++ b/arch/ppc/platforms/85xx/stx_gp3.h
@@ -21,7 +21,6 @@
 
 #include <linux/config.h>
 #include <linux/init.h>
-#include <linux/seq_file.h>
 #include <asm/ppcboot.h>
 
 #define BOARD_CCSRBAR		((uint)0xe0000000)
@@ -43,7 +42,6 @@ extern void mpc85xx_setup_hose(void) __i
 extern void mpc85xx_restart(char *cmd);
 extern void mpc85xx_power_off(void);
 extern void mpc85xx_halt(void);
-extern int mpc85xx_show_cpuinfo(struct seq_file *m);
 extern void mpc85xx_init_IRQ(void) __init;
 extern unsigned long mpc85xx_find_end_of_memory(void) __init;
 extern void mpc85xx_calibrate_decr(void) __init;

^ permalink raw reply related

* Re: Platform device model drawback
From: Grant Likely @ 2005-11-17 23:46 UTC (permalink / raw)
  To: Greg KH, Vitaly Bordug; +Cc: Kumar Gala, linuxppc-embedded list
In-Reply-To: <20051115224056.GA14357@kroah.com>

On 11/15/05, Greg KH <greg@kroah.com> wrote:
> On Tue, Nov 15, 2005 at 01:34:47PM -0600, Kumar Gala wrote:
> > This is where the confusion is.  We have two instances of device A.  We
> > want instance 1 of device A bound to driver "enet" and instance 2 of
> > device A bound to "serial".
>
> That's different from what was described earlier :)
>
> In this case, you need two different struct devices.
Which is what we have.

>
> > Today both instances are called "deviceA".  However we can't register t=
wo
> > different drivers as "deviceA".
>
> Nor would you want to.
>
> > Not sure if that clarifies the issue any.
>
> A bit.  I think it still sounds messy...
Does this help?  (We also discussed this a bit at the PPC BoF at OLS this y=
ear)

 For example on the mpc52xx (see arch/ppc/syslib/mpc52xx_devices.c);
   - 6 PSC devices on chip;
   - (struct platform_device) for each device has: .name=3D'mpc52xx-psc';
   - However, SCC1 may be driven by the Ethernet driver but PSC2 and
PSC6 may be serial
   - problem then is: How do you get only PSC1 bound to the
psc-ethernet driver and only PSC2 & PSC6 bound to the serial driver?

Possible solution;  Modify the naming scheme slightly from what is
currently used.
1. Make the Ethernet driver register the name "mpc52xx-psc:eth"
2. Make the serial driver register the name "mpc52xx-psc:uart"
3. In the board-specific platform code, modify the .name field in
struct platform_device *before* the device is registered with the
platform device. (possibly by extending ppc_sys_device_fixup callback)
   - The board specific code would set PSC1 to "mpc52xx-psc:eth",
PSC2&6 to "mpc52xx-psc:uart".  PSC3-5 would stick with "mpc52xx-psc"
and so would not get bound to anything.

Q: Can the .name field be modified *after* platform_device is
registered w/ the platform bus?

g.

^ permalink raw reply

* Problems with fcc_enet driver for MPC8248 (2.6.12)
From: Carlos Munoz @ 2005-11-17 23:39 UTC (permalink / raw)
  To: linuxppc-embedded

I'm working on an embedded board that is currently running kernel 2.4.28 
without any problems. However, I am trying to upgrade from kernel 2.4.28 
to kernel 2.6.12 and I'm unable to get the fcc_enet driver to work 
properly.
The fcc ports are connected to ethernet phy devices. The receive and 
transmitted data out of the ethernet phy devices is all 0xff.

I tried using the fcc_enet driver from the 2.4.28 kernel on the 2.6.12 
kernel but get the same results. This leads me to believe that the core 
initialization of the MPC8248 has changed on kernel 2.6.12.

Has anyone got the  fcc ports to work properly on the 2.6.12 kernel ? If 
yes, how ? Did the MPC8248 core initialization change ?

Thanks,


Carlos Munoz

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Paul Mackerras @ 2005-11-18  1:12 UTC (permalink / raw)
  To: David Woodhouse; +Cc: Tom Rini, linuxppc-dev
In-Reply-To: <1132136755.21643.40.camel@hades.cambridge.redhat.com>

David Woodhouse writes:

> I'll try it on Pegasos some time tonight or tomorrow. AFAICT I'm going
> to need the patch which started this thread, if I want any serial ports
> on my Pegasos. The newly-created asm-powerpc/serial.h file is devoid of
> serial port definitions.

This intersects with some more ambitious reworking Ben H is doing, so
I won't put this one in.

Paul.

^ permalink raw reply

* Help ! 2.6.14 kernel can't bring up
From: zjznliang @ 2005-11-18  2:02 UTC (permalink / raw)
  To: linuxppc-embedded

SGkgbGludXhwcGMtZW1iZWRkZWSjoQ0KDQoJSGkgLCBIb3cgdG8gY29uZmlnIHRoZSAiZWFybHkg
cHJpbnRrIiBpbiAyLjYuMTQgbGludXggY29uZmlncmF0aW9uPz8/DQoNCg0KIAkJCQkNCg0KoaGh
oXpqem5saWFuZw0KoaGhoaGhoaF6anpubGlhbmdfcG9wb0AxNjMuY29tDQqhoaGhoaGhoaGhoaEy
MDA1LTExLTE4DQo=

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Kumar Gala @ 2005-11-18  3:26 UTC (permalink / raw)
  To: Paul Mackerras, Benjamin Herrenschmidt
  Cc: Tom Rini, David Woodhouse, linuxppc-dev list
In-Reply-To: <17277.10875.334722.856865@cargo.ozlabs.ibm.com>

Paul or BenH,

Would you like to enlighten us on this ambitious rework?

- kumar

On Nov 17, 2005, at 7:12 PM, Paul Mackerras wrote:

> David Woodhouse writes:
>
>> I'll try it on Pegasos some time tonight or tomorrow. AFAICT I'm  
>> going
>> to need the patch which started this thread, if I want any serial  
>> ports
>> on my Pegasos. The newly-created asm-powerpc/serial.h file is  
>> devoid of
>> serial port definitions.
>
> This intersects with some more ambitious reworking Ben H is doing, so
> I won't put this one in.
>
> Paul.
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Benjamin Herrenschmidt @ 2005-11-18  3:50 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev list, David Woodhouse, Tom Rini
In-Reply-To: <3F990F6D-7A3F-47CA-938F-968593678895@kernel.crashing.org>

On Thu, 2005-11-17 at 21:26 -0600, Kumar Gala wrote:
> Paul or BenH,
> 
> Would you like to enlighten us on this ambitious rework?

First, some better & more generic routines for translating addresses
from the device-tree, and some more generic code for looking for
standard serial port using the above routines, among others ... also,
set_preferred_console gets modified to use the previous list so it can
detect the ports more reliably, etc ....

Ben.

^ permalink raw reply

* [PATCH] generate COFF zImage in arch/powerpc/boot
From: Paul Mackerras @ 2005-11-18  6:06 UTC (permalink / raw)
  To: linuxppc-dev

This patch makes ARCH=powerpc on 32-bit machines generate an
arch/powerpc/boot/zImage.coff suitable for booting on old-world
powermacs.  I took the opportunity to reorganize prom.c and prom.h a
bit.  The *printf routines have been moved to their own file, stdio.c,
and prom.c now contains a version of claim() that knows what to do on
older machines.  The link address of the zImage has been moved up from
4MB to 5MB, since OF on oldworld machines occupies the 4M - 5M region.

Signed-off-by: Paul Mackerras <paulus@samba.org>
---

diff -urN powerpc-merge/arch/powerpc/Makefile merge-hack/arch/powerpc/Makefile
--- powerpc-merge/arch/powerpc/Makefile	2005-11-18 16:11:26.000000000 +1100
+++ merge-hack/arch/powerpc/Makefile	2005-11-18 16:54:42.000000000 +1100
@@ -138,7 +138,7 @@
 
 drivers-$(CONFIG_OPROFILE)	+= arch/powerpc/oprofile/
 
-defaultimage-$(CONFIG_PPC32)	:= zImage
+defaultimage-$(CONFIG_PPC32)	:= zImage zImage.coff
 defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
 defaultimage-$(CONFIG_PPC_PSERIES) := zImage
 KBUILD_IMAGE := $(defaultimage-y)
@@ -149,7 +149,8 @@
 # All the instructions talk about "make bzImage".
 bzImage: zImage
 
-BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm
+BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm \
+	       zImage.vmode zImage.initrd.vmode zImage.coff zImage.initrd.coff
 
 .PHONY: $(BOOT_TARGETS)
 
diff -urN powerpc-merge/arch/powerpc/boot/Makefile merge-hack/arch/powerpc/boot/Makefile
--- powerpc-merge/arch/powerpc/boot/Makefile	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/Makefile	2005-11-17 14:53:27.000000000 +1100
@@ -27,6 +27,7 @@
 BOOTAFLAGS	:= -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
 BOOTLFLAGS	:= -T $(srctree)/$(src)/zImage.lds
 OBJCOPYFLAGS    := contents,alloc,load,readonly,data
+OBJCOPY_COFF_ARGS := -O aixcoff-rs6000 --set-start 0x500000
 
 zlib       := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c
 zlibheader := infblock.h infcodes.h inffast.h inftrees.h infutil.h
@@ -35,7 +36,7 @@
 $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
 #$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h)
 
-src-boot := string.S prom.c main.c div64.S crt0.S
+src-boot := crt0.S string.S prom.c stdio.c main.c div64.S
 src-boot += $(zlib)
 src-boot := $(addprefix $(obj)/, $(src-boot))
 obj-boot := $(addsuffix .o, $(basename $(src-boot)))
@@ -87,12 +88,13 @@
 src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
 gz-sec  = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))
 
-hostprogs-y		:= addnote addRamDisk
-targets 		+= zImage.vmode zImage.initrd.vmode zImage zImage.initrd \
-			   $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
-			   $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
-			   $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
-			   vmlinux.initrd
+hostprogs-y		:= addnote addRamDisk hack-coff
+
+targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \
+	   $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
+	   $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
+	   $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
+	   vmlinux.initrd
 extra-y			:= initrd.o
 
 quiet_cmd_ramdisk = RAMDISK $@
@@ -114,6 +116,10 @@
 quiet_cmd_addnote = ADDNOTE $@
       cmd_addnote = $(obj)/addnote $@
 
+quiet_cmd_gencoff = COFF    $@
+      cmd_gencoff = $(OBJCOPY) $(OBJCOPY_COFF_ARGS) $< $@ && \
+		    $(obj)/hack-coff $@
+
 $(call gz-sec, $(required)): $(obj)/kernel-%.gz: %
 	$(call if_changed,gzip)
 
@@ -143,6 +149,12 @@
 	@cp -f $< $@
 	$(call if_changed,addnote)
 
+$(obj)/zImage.coff: $(obj)/zImage.vmode $(obj)/hack-coff
+	$(call cmd,gencoff)
+
+$(obj)/zImage.initrd.coff: $(obj)/zImage.initrd.vmode $(obj)/hack-coff
+	$(call cmd,gencoff)
+
 install: $(CONFIGURE) $(BOOTIMAGE)
 	sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"
 
diff -urN powerpc-merge/arch/powerpc/boot/crt0.S merge-hack/arch/powerpc/boot/crt0.S
--- powerpc-merge/arch/powerpc/boot/crt0.S	2005-11-18 13:18:16.000000000 +1100
+++ merge-hack/arch/powerpc/boot/crt0.S	2005-11-18 14:00:00.000000000 +1100
@@ -12,17 +12,22 @@
 #include "ppc_asm.h"
 
 	.text
+	/* a procedure descriptor used when booting this as a COFF file */
+	.long	_zimage_start, 0, 0, 0
+
 	.globl	_zimage_start
 _zimage_start:
+	/* Work out the offset between the address we were linked at
+	   and the address where we're running. */
 	bl	1f
-
-1:
-	mflr	r0
+1:	mflr	r0
 	lis	r9,1b@ha
 	addi	r9,r9,1b@l
 	subf.	r0,r9,r0
-	beq	3f
+	beq	3f		/* if running at same address as linked */
 
+	/* The .got2 section contains a list of addresses, so add
+	   the address offset onto each entry. */
 	lis	r9,__got2_start@ha
 	addi	r9,r9,__got2_start@l
 	lis	r8,__got2_end@ha
@@ -32,15 +37,14 @@
 	srwi.	r8,r8,2
 	mtctr	r8
 	add	r9,r0,r9
-2:
-	lwz	r8,0(r9)
+2:	lwz	r8,0(r9)
 	add	r8,r8,r0
 	stw	r8,0(r9)
 	addi	r9,r9,4
 	bdnz	2b
 
-3:
-	lis	r9,_start@h
+	/* Do a cache flush for our text, in case OF didn't */
+3:	lis	r9,_start@h
 	add	r9,r0,r9
 	lis	r8,_etext@ha
 	addi	r8,r8,_etext@l
diff -urN powerpc-merge/arch/powerpc/boot/hack-coff.c merge-hack/arch/powerpc/boot/hack-coff.c
--- /dev/null	2005-04-02 20:23:56.000000000 +1000
+++ merge-hack/arch/powerpc/boot/hack-coff.c	2005-11-17 14:57:08.000000000 +1100
@@ -0,0 +1,84 @@
+/*
+ * hack-coff.c - hack the header of an xcoff file to fill in
+ * a few fields needed by the Open Firmware xcoff loader on
+ * Power Macs but not initialized by objcopy.
+ *
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include "rs6000.h"
+
+#define AOUT_MAGIC	0x010b
+
+#define get_16be(x)	((((unsigned char *)(x))[0] << 8) \
+			 + ((unsigned char *)(x))[1])
+#define put_16be(x, v)	(((unsigned char *)(x))[0] = (v) >> 8, \
+			 ((unsigned char *)(x))[1] = (v) & 0xff)
+#define get_32be(x)	((((unsigned char *)(x))[0] << 24) \
+			 + (((unsigned char *)(x))[1] << 16) \
+			 + (((unsigned char *)(x))[2] << 8) \
+			 + ((unsigned char *)(x))[3])
+
+int
+main(int ac, char **av)
+{
+    int fd;
+    int i, nsect;
+    int aoutsz;
+    struct external_filehdr fhdr;
+    AOUTHDR aout;
+    struct external_scnhdr shdr;
+
+    if (ac != 2) {
+	fprintf(stderr, "Usage: hack-coff coff-file\n");
+	exit(1);
+    }
+    if ((fd = open(av[1], 2)) == -1) {
+	perror(av[2]);
+	exit(1);
+    }
+    if (read(fd, &fhdr, sizeof(fhdr)) != sizeof(fhdr))
+	goto readerr;
+    i = get_16be(fhdr.f_magic);
+    if (i != U802TOCMAGIC && i != U802WRMAGIC && i != U802ROMAGIC) {
+	fprintf(stderr, "%s: not an xcoff file\n", av[1]);
+	exit(1);
+    }
+    aoutsz = get_16be(fhdr.f_opthdr);
+    if (read(fd, &aout, aoutsz) != aoutsz)
+	goto readerr;
+    nsect = get_16be(fhdr.f_nscns);
+    for (i = 0; i < nsect; ++i) {
+	if (read(fd, &shdr, sizeof(shdr)) != sizeof(shdr))
+	    goto readerr;
+	if (strcmp(shdr.s_name, ".text") == 0) {
+	    put_16be(aout.o_snentry, i+1);
+	    put_16be(aout.o_sntext, i+1);
+	} else if (strcmp(shdr.s_name, ".data") == 0) {
+	    put_16be(aout.o_sndata, i+1);
+	} else if (strcmp(shdr.s_name, ".bss") == 0) {
+	    put_16be(aout.o_snbss, i+1);
+	}
+    }
+    put_16be(aout.magic, AOUT_MAGIC);
+    if (lseek(fd, (long) sizeof(struct external_filehdr), 0) == -1
+	|| write(fd, &aout, aoutsz) != aoutsz) {
+	fprintf(stderr, "%s: write error\n", av[1]);
+	exit(1);
+    }
+    close(fd);
+    exit(0);
+
+readerr:
+    fprintf(stderr, "%s: read error or file too short\n", av[1]);
+    exit(1);
+}
diff -urN powerpc-merge/arch/powerpc/boot/main.c merge-hack/arch/powerpc/boot/main.c
--- powerpc-merge/arch/powerpc/boot/main.c	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/main.c	2005-11-17 14:41:13.000000000 +1100
@@ -21,8 +21,8 @@
 
 
 /* Value picked to match that used by yaboot */
-#define PROG_START	0x01400000
-#define RAM_END		(512<<20) // Fixme: use OF */
+#define PROG_START	0x01400000	/* only used on 64-bit systems */
+#define RAM_END		(512<<20)	/* Fixme: use OF */
 #define	ONE_MB		0x100000
 
 extern char _start[];
@@ -160,6 +160,17 @@
 	elfoffset = (unsigned long)elf64ph->p_offset;
 	vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset;
 	vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset;
+
+#if defined(PROG_START)
+	/*
+	 * Maintain a "magic" minimum address. This keeps some older
+	 * firmware platforms running.
+	 */
+
+	if (claim_base < PROG_START)
+		claim_base = PROG_START;
+#endif
+
 	return 1;
 }
 
@@ -206,12 +217,18 @@
 		exit();
 	if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4)
 		exit();
-	stderr = stdout;
-	if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
-		exit();
 
 	printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp);
 
+	/*
+	 * The first available claim_base must be above the end of the
+	 * the loaded kernel wrapper file (_start to _end includes the
+	 * initrd image if it is present) and rounded up to a nice
+	 * 1 MB boundary for good measure.
+	 */
+
+	claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
+
 	vmlinuz.addr = (unsigned long)_vmlinux_start;
 	vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
 
@@ -228,25 +245,6 @@
 		exit();
 	}
 
-	/*
-	 * The first available claim_base must be above the end of the
-	 * the loaded kernel wrapper file (_start to _end includes the
-	 * initrd image if it is present) and rounded up to a nice
-	 * 1 MB boundary for good measure.
-	 */
-
-	claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
-
-#if defined(PROG_START)
-	/*
-	 * Maintain a "magic" minimum address. This keeps some older
-	 * firmware platforms running.
-	 */
-
-	if (claim_base < PROG_START)
-		claim_base = PROG_START;
-#endif
-
 	/* We need to claim the memsize plus the file offset since gzip
 	 * will expand the header (file offset), then the kernel, then
 	 * possible rubbish we don't care about. But the kernel bss must
diff -urN powerpc-merge/arch/powerpc/boot/prom.c merge-hack/arch/powerpc/boot/prom.c
--- powerpc-merge/arch/powerpc/boot/prom.c	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/prom.c	2005-11-17 14:37:12.000000000 +1100
@@ -13,487 +13,153 @@
 #include "prom.h"
 
 int (*prom)(void *);
+phandle chosen_handle;
+ihandle stdout;
 
-void *chosen_handle;
-
-void *stdin;
-void *stdout;
-void *stderr;
-
-
-int
-write(void *handle, void *ptr, int nb)
-{
-	struct prom_args {
-		char *service;
-		int nargs;
-		int nret;
-		void *ihandle;
-		void *addr;
-		int len;
-		int actual;
-	} args;
-
-	args.service = "write";
-	args.nargs = 3;
-	args.nret = 1;
-	args.ihandle = handle;
-	args.addr = ptr;
-	args.len = nb;
-	args.actual = -1;
-	(*prom)(&args);
-	return args.actual;
-}
-
-int
-read(void *handle, void *ptr, int nb)
+int call_prom(const char *service, int nargs, int nret, ...)
 {
+	int i;
 	struct prom_args {
-		char *service;
+		const char *service;
 		int nargs;
 		int nret;
-		void *ihandle;
-		void *addr;
-		int len;
-		int actual;
+		unsigned int args[12];
 	} args;
+	va_list list;
 
-	args.service = "read";
-	args.nargs = 3;
-	args.nret = 1;
-	args.ihandle = handle;
-	args.addr = ptr;
-	args.len = nb;
-	args.actual = -1;
-	(*prom)(&args);
-	return args.actual;
-}
+	args.service = service;
+	args.nargs = nargs;
+	args.nret = nret;
 
-void
-exit()
-{
-	struct prom_args {
-		char *service;
-	} args;
+	va_start(list, nret);
+	for (i = 0; i < nargs; i++)
+		args.args[i] = va_arg(list, unsigned int);
+	va_end(list);
 
-	for (;;) {
-		args.service = "exit";
-		(*prom)(&args);
-	}
-}
+	for (i = 0; i < nret; i++)
+		args.args[nargs+i] = 0;
 
-void
-pause(void)
-{
-	struct prom_args {
-		char *service;
-	} args;
-
-	args.service = "enter";
-	(*prom)(&args);
-}
-
-void *
-finddevice(const char *name)
-{
-	struct prom_args {
-		char *service;
-		int nargs;
-		int nret;
-		const char *devspec;
-		void *phandle;
-	} args;
-
-	args.service = "finddevice";
-	args.nargs = 1;
-	args.nret = 1;
-	args.devspec = name;
-	args.phandle = (void *) -1;
-	(*prom)(&args);
-	return args.phandle;
-}
-
-void *
-claim(unsigned long virt, unsigned long size, unsigned long align)
-{
-	struct prom_args {
-		char *service;
-		int nargs;
-		int nret;
-		unsigned int virt;
-		unsigned int size;
-		unsigned int align;
-		void *ret;
-	} args;
+	if (prom(&args) < 0)
+		return -1;
 
-	args.service = "claim";
-	args.nargs = 3;
-	args.nret = 1;
-	args.virt = virt;
-	args.size = size;
-	args.align = align;
-	(*prom)(&args);
-	return args.ret;
+	return (nret > 0)? args.args[nargs]: 0;
 }
 
-int
-getprop(void *phandle, const char *name, void *buf, int buflen)
+int call_prom_ret(const char *service, int nargs, int nret,
+		  unsigned int *rets, ...)
 {
+	int i;
 	struct prom_args {
-		char *service;
+		const char *service;
 		int nargs;
 		int nret;
-		void *phandle;
-		const char *name;
-		void *buf;
-		int buflen;
-		int size;
+		unsigned int args[12];
 	} args;
+	va_list list;
 
-	args.service = "getprop";
-	args.nargs = 4;
-	args.nret = 1;
-	args.phandle = phandle;
-	args.name = name;
-	args.buf = buf;
-	args.buflen = buflen;
-	args.size = -1;
-	(*prom)(&args);
-	return args.size;
-}
+	args.service = service;
+	args.nargs = nargs;
+	args.nret = nret;
 
-int
-putc(int c, void *f)
-{
-	char ch = c;
+	va_start(list, rets);
+	for (i = 0; i < nargs; i++)
+		args.args[i] = va_arg(list, unsigned int);
+	va_end(list);
 
-	if (c == '\n')
-		putc('\r', f);
-	return write(f, &ch, 1) == 1? c: -1;
-}
+	for (i = 0; i < nret; i++)
+		args.args[nargs+i] = 0;
 
-int
-putchar(int c)
-{
-	return putc(c, stdout);
-}
+	if (prom(&args) < 0)
+		return -1;
 
-int
-fputs(char *str, void *f)
-{
-	int n = strlen(str);
+	if (rets != (void *) 0)
+		for (i = 1; i < nret; ++i)
+			rets[i-1] = args.args[nargs+i];
 
-	return write(f, str, n) == n? 0: -1;
+	return (nret > 0)? args.args[nargs]: 0;
 }
 
-size_t strnlen(const char * s, size_t count)
+int write(void *handle, void *ptr, int nb)
 {
-	const char *sc;
-
-	for (sc = s; count-- && *sc != '\0'; ++sc)
-		/* nothing */;
-	return sc - s;
+	return call_prom("write", 3, 1, handle, ptr, nb);
 }
 
-extern unsigned int __div64_32(unsigned long long *dividend,
-			       unsigned int divisor);
-
-/* The unnecessary pointer compare is there
- * to check for type safety (n must be 64bit)
+/*
+ * Older OF's require that when claiming a specific range of addresses,
+ * we claim the physical space in the /memory node and the virtual
+ * space in the chosen mmu node, and then do a map operation to
+ * map virtual to physical.
  */
-# define do_div(n,base) ({						\
-	unsigned int __base = (base);					\
-	unsigned int __rem;						\
-	(void)(((typeof((n)) *)0) == ((unsigned long long *)0));	\
-	if (((n) >> 32) == 0) {						\
-		__rem = (unsigned int)(n) % __base;			\
-		(n) = (unsigned int)(n) / __base;			\
-	} else								\
-		__rem = __div64_32(&(n), __base);			\
-	__rem;								\
- })
+static int need_map = -1;
+static ihandle chosen_mmu;
+static phandle memory;
 
-static int skip_atoi(const char **s)
+/* returns true if s2 is a prefix of s1 */
+static int string_match(const char *s1, const char *s2)
 {
-	int i, c;
-
-	for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s)
-		i = i*10 + c - '0';
-	return i;
+	for (; *s2; ++s2)
+		if (*s1++ != *s2)
+			return 0;
+	return 1;
 }
 
-#define ZEROPAD	1		/* pad with zero */
-#define SIGN	2		/* unsigned/signed long */
-#define PLUS	4		/* show plus */
-#define SPACE	8		/* space if plus */
-#define LEFT	16		/* left justified */
-#define SPECIAL	32		/* 0x */
-#define LARGE	64		/* use 'ABCDEF' instead of 'abcdef' */
-
-static char * number(char * str, unsigned long long num, int base, int size, int precision, int type)
+static int check_of_version(void)
 {
-	char c,sign,tmp[66];
-	const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
-	int i;
+	phandle oprom, chosen;
+	char version[64];
 
-	if (type & LARGE)
-		digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-	if (type & LEFT)
-		type &= ~ZEROPAD;
-	if (base < 2 || base > 36)
+	oprom = finddevice("/openprom");
+	if (oprom == (phandle) -1)
+		return 0;
+	if (getprop(oprom, "model", version, sizeof(version)) <= 0)
 		return 0;
-	c = (type & ZEROPAD) ? '0' : ' ';
-	sign = 0;
-	if (type & SIGN) {
-		if ((signed long long)num < 0) {
-			sign = '-';
-			num = - (signed long long)num;
-			size--;
-		} else if (type & PLUS) {
-			sign = '+';
-			size--;
-		} else if (type & SPACE) {
-			sign = ' ';
-			size--;
+	version[sizeof(version)-1] = 0;
+	printf("OF version = '%s'\r\n", version);
+	if (!string_match(version, "Open Firmware, 1.")
+	    && !string_match(version, "FirmWorks,3."))
+		return 0;
+	chosen = finddevice("/chosen");
+	if (chosen == (phandle) -1) {
+		chosen = finddevice("/chosen@0");
+		if (chosen == (phandle) -1) {
+			printf("no chosen\n");
+			return 0;
 		}
 	}
-	if (type & SPECIAL) {
-		if (base == 16)
-			size -= 2;
-		else if (base == 8)
-			size--;
-	}
-	i = 0;
-	if (num == 0)
-		tmp[i++]='0';
-	else while (num != 0) {
-		tmp[i++] = digits[do_div(num, base)];
+	if (getprop(chosen, "mmu", &chosen_mmu, sizeof(chosen_mmu)) <= 0) {
+		printf("no mmu\n");
+		return 0;
 	}
-	if (i > precision)
-		precision = i;
-	size -= precision;
-	if (!(type&(ZEROPAD+LEFT)))
-		while(size-->0)
-			*str++ = ' ';
-	if (sign)
-		*str++ = sign;
-	if (type & SPECIAL) {
-		if (base==8)
-			*str++ = '0';
-		else if (base==16) {
-			*str++ = '0';
-			*str++ = digits[33];
+	memory = (ihandle) call_prom("open", 1, 1, "/memory");
+	if (memory == (ihandle) -1) {
+		memory = (ihandle) call_prom("open", 1, 1, "/memory@0");
+		if (memory == (ihandle) -1) {
+			printf("no memory node\n");
+			return 0;
 		}
 	}
-	if (!(type & LEFT))
-		while (size-- > 0)
-			*str++ = c;
-	while (i < precision--)
-		*str++ = '0';
-	while (i-- > 0)
-		*str++ = tmp[i];
-	while (size-- > 0)
-		*str++ = ' ';
-	return str;
+	printf("old OF detected\r\n");
+	return 1;
 }
 
-int vsprintf(char *buf, const char *fmt, va_list args)
+void *claim(unsigned long virt, unsigned long size, unsigned long align)
 {
-	int len;
-	unsigned long long num;
-	int i, base;
-	char * str;
-	const char *s;
-
-	int flags;		/* flags to number() */
-
-	int field_width;	/* width of output field */
-	int precision;		/* min. # of digits for integers; max
-				   number of chars for from string */
-	int qualifier;		/* 'h', 'l', or 'L' for integer fields */
-	                        /* 'z' support added 23/7/1999 S.H.    */
-				/* 'z' changed to 'Z' --davidm 1/25/99 */
+	int ret;
+	unsigned int result;
 
+	if (need_map < 0)
+		need_map = check_of_version();
+	if (align || !need_map)
+		return (void *) call_prom("claim", 3, 1, virt, size, align);
 	
-	for (str=buf ; *fmt ; ++fmt) {
-		if (*fmt != '%') {
-			*str++ = *fmt;
-			continue;
-		}
-			
-		/* process flags */
-		flags = 0;
-		repeat:
-			++fmt;		/* this also skips first '%' */
-			switch (*fmt) {
-				case '-': flags |= LEFT; goto repeat;
-				case '+': flags |= PLUS; goto repeat;
-				case ' ': flags |= SPACE; goto repeat;
-				case '#': flags |= SPECIAL; goto repeat;
-				case '0': flags |= ZEROPAD; goto repeat;
-				}
-		
-		/* get field width */
-		field_width = -1;
-		if ('0' <= *fmt && *fmt <= '9')
-			field_width = skip_atoi(&fmt);
-		else if (*fmt == '*') {
-			++fmt;
-			/* it's the next argument */
-			field_width = va_arg(args, int);
-			if (field_width < 0) {
-				field_width = -field_width;
-				flags |= LEFT;
-			}
-		}
-
-		/* get the precision */
-		precision = -1;
-		if (*fmt == '.') {
-			++fmt;	
-			if ('0' <= *fmt && *fmt <= '9')
-				precision = skip_atoi(&fmt);
-			else if (*fmt == '*') {
-				++fmt;
-				/* it's the next argument */
-				precision = va_arg(args, int);
-			}
-			if (precision < 0)
-				precision = 0;
-		}
-
-		/* get the conversion qualifier */
-		qualifier = -1;
-		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') {
-			qualifier = *fmt;
-			++fmt;
-		}
-
-		/* default base */
-		base = 10;
-
-		switch (*fmt) {
-		case 'c':
-			if (!(flags & LEFT))
-				while (--field_width > 0)
-					*str++ = ' ';
-			*str++ = (unsigned char) va_arg(args, int);
-			while (--field_width > 0)
-				*str++ = ' ';
-			continue;
-
-		case 's':
-			s = va_arg(args, char *);
-			if (!s)
-				s = "<NULL>";
-
-			len = strnlen(s, precision);
-
-			if (!(flags & LEFT))
-				while (len < field_width--)
-					*str++ = ' ';
-			for (i = 0; i < len; ++i)
-				*str++ = *s++;
-			while (len < field_width--)
-				*str++ = ' ';
-			continue;
-
-		case 'p':
-			if (field_width == -1) {
-				field_width = 2*sizeof(void *);
-				flags |= ZEROPAD;
-			}
-			str = number(str,
-				(unsigned long) va_arg(args, void *), 16,
-				field_width, precision, flags);
-			continue;
-
-
-		case 'n':
-			if (qualifier == 'l') {
-				long * ip = va_arg(args, long *);
-				*ip = (str - buf);
-			} else if (qualifier == 'Z') {
-				size_t * ip = va_arg(args, size_t *);
-				*ip = (str - buf);
-			} else {
-				int * ip = va_arg(args, int *);
-				*ip = (str - buf);
-			}
-			continue;
-
-		case '%':
-			*str++ = '%';
-			continue;
-
-		/* integer number formats - set up the flags and "break" */
-		case 'o':
-			base = 8;
-			break;
-
-		case 'X':
-			flags |= LARGE;
-		case 'x':
-			base = 16;
-			break;
-
-		case 'd':
-		case 'i':
-			flags |= SIGN;
-		case 'u':
-			break;
-
-		default:
-			*str++ = '%';
-			if (*fmt)
-				*str++ = *fmt;
-			else
-				--fmt;
-			continue;
-		}
-		if (qualifier == 'l') {
-			num = va_arg(args, unsigned long);
-			if (flags & SIGN)
-				num = (signed long) num;
-		} else if (qualifier == 'Z') {
-			num = va_arg(args, size_t);
-		} else if (qualifier == 'h') {
-			num = (unsigned short) va_arg(args, int);
-			if (flags & SIGN)
-				num = (signed short) num;
-		} else {
-			num = va_arg(args, unsigned int);
-			if (flags & SIGN)
-				num = (signed int) num;
-		}
-		str = number(str, num, base, field_width, precision, flags);
-	}
-	*str = '\0';
-	return str-buf;
-}
-
-int sprintf(char * buf, const char *fmt, ...)
-{
-	va_list args;
-	int i;
-
-	va_start(args, fmt);
-	i=vsprintf(buf,fmt,args);
-	va_end(args);
-	return i;
-}
-
-static char sprint_buf[1024];
-
-int
-printf(const char *fmt, ...)
-{
-	va_list args;
-	int n;
-
-	va_start(args, fmt);
-	n = vsprintf(sprint_buf, fmt, args);
-	va_end(args);
-	write(stdout, sprint_buf, n);
-	return n;
+	ret = call_prom_ret("call-method", 5, 2, &result, "claim", memory,
+			    align, size, virt);
+	if (ret != 0 || result == -1)
+		return (void *) -1;
+	ret = call_prom_ret("call-method", 5, 2, &result, "claim", chosen_mmu,
+			    align, size, virt);
+	/* 0x12 == coherent + read/write */
+	ret = call_prom("call-method", 6, 1, "map", chosen_mmu,
+			0x12, size, virt, virt);
+	return (void *) virt;
 }
diff -urN powerpc-merge/arch/powerpc/boot/prom.h merge-hack/arch/powerpc/boot/prom.h
--- powerpc-merge/arch/powerpc/boot/prom.h	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/prom.h	2005-11-17 11:11:47.000000000 +1100
@@ -1,18 +1,34 @@
 #ifndef _PPC_BOOT_PROM_H_
 #define _PPC_BOOT_PROM_H_
 
+typedef void *phandle;
+typedef void *ihandle;
+
 extern int (*prom) (void *);
-extern void *chosen_handle;
+extern phandle chosen_handle;
+extern ihandle stdout;
 
-extern void *stdin;
-extern void *stdout;
-extern void *stderr;
+int	call_prom(const char *service, int nargs, int nret, ...);
+int	call_prom_ret(const char *service, int nargs, int nret,
+		      unsigned int *rets, ...);
 
 extern int write(void *handle, void *ptr, int nb);
-extern int read(void *handle, void *ptr, int nb);
-extern void exit(void);
-extern void pause(void);
-extern void *finddevice(const char *);
-extern void *claim(unsigned long virt, unsigned long size, unsigned long align);
-extern int getprop(void *phandle, const char *name, void *buf, int buflen);
+extern void *claim(unsigned long virt, unsigned long size, unsigned long aln);
+
+static inline void exit(void)
+{
+	call_prom("exit", 0, 0);
+}
+
+static inline phandle finddevice(const char *name)
+{
+	return (phandle) call_prom("finddevice", 1, 1, name);
+}
+
+static inline int getprop(void *phandle, const char *name,
+			  void *buf, int buflen)
+{
+	return call_prom("getprop", 4, 1, phandle, name, buf, buflen);
+}
+
 #endif				/* _PPC_BOOT_PROM_H_ */
diff -urN powerpc-merge/arch/powerpc/boot/rs6000.h merge-hack/arch/powerpc/boot/rs6000.h
--- /dev/null	2005-04-02 20:23:56.000000000 +1000
+++ merge-hack/arch/powerpc/boot/rs6000.h	2005-11-17 14:57:47.000000000 +1100
@@ -0,0 +1,243 @@
+/* IBM RS/6000 "XCOFF" file definitions for BFD.
+   Copyright (C) 1990, 1991 Free Software Foundation, Inc.
+   FIXME: Can someone provide a transliteration of this name into ASCII?
+   Using the following chars caused a compiler warning on HIUX (so I replaced
+   them with octal escapes), and isn't useful without an understanding of what
+   character set it is.
+   Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM
+   and John Gilmore of Cygnus Support.  */
+
+/********************** FILE HEADER **********************/
+
+struct external_filehdr {
+	char f_magic[2];	/* magic number			*/
+	char f_nscns[2];	/* number of sections		*/
+	char f_timdat[4];	/* time & date stamp		*/
+	char f_symptr[4];	/* file pointer to symtab	*/
+	char f_nsyms[4];	/* number of symtab entries	*/
+	char f_opthdr[2];	/* sizeof(optional hdr)		*/
+	char f_flags[2];	/* flags			*/
+};
+
+        /* IBM RS/6000 */
+#define U802WRMAGIC     0730    /* writeable text segments **chh**      */
+#define U802ROMAGIC     0735    /* readonly sharable text segments      */
+#define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
+
+#define BADMAG(x)	\
+	((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
+	 (x).f_magic != U802TOCMAGIC)
+
+#define	FILHDR	struct external_filehdr
+#define	FILHSZ	20
+
+
+/********************** AOUT "OPTIONAL HEADER" **********************/
+
+
+typedef struct
+{
+  unsigned char	magic[2];	/* type of file			*/
+  unsigned char	vstamp[2];	/* version stamp		*/
+  unsigned char	tsize[4];	/* text size in bytes, padded to FW bdry */
+  unsigned char	dsize[4];	/* initialized data "  "	*/
+  unsigned char	bsize[4];	/* uninitialized data "   "	*/
+  unsigned char	entry[4];	/* entry pt.			*/
+  unsigned char	text_start[4];	/* base of text used for this file */
+  unsigned char	data_start[4];	/* base of data used for this file */
+  unsigned char	o_toc[4];	/* address of TOC */
+  unsigned char	o_snentry[2];	/* section number of entry point */
+  unsigned char	o_sntext[2];	/* section number of .text section */
+  unsigned char	o_sndata[2];	/* section number of .data section */
+  unsigned char	o_sntoc[2];	/* section number of TOC */
+  unsigned char	o_snloader[2];	/* section number of .loader section */
+  unsigned char	o_snbss[2];	/* section number of .bss section */
+  unsigned char	o_algntext[2];	/* .text alignment */
+  unsigned char	o_algndata[2];	/* .data alignment */
+  unsigned char	o_modtype[2];	/* module type (??) */
+  unsigned char o_cputype[2];	/* cpu type */
+  unsigned char	o_maxstack[4];	/* max stack size (??) */
+  unsigned char o_maxdata[4];	/* max data size (??) */
+  unsigned char	o_resv2[12];	/* reserved */
+}
+AOUTHDR;
+
+#define AOUTSZ 72
+#define SMALL_AOUTSZ (28)
+#define AOUTHDRSZ 72
+
+#define	RS6K_AOUTHDR_OMAGIC	0x0107	/* old: text & data writeable */
+#define	RS6K_AOUTHDR_NMAGIC	0x0108	/* new: text r/o, data r/w */
+#define	RS6K_AOUTHDR_ZMAGIC	0x010B	/* paged: text r/o, both page-aligned */
+
+
+/********************** SECTION HEADER **********************/
+
+
+struct external_scnhdr {
+	char		s_name[8];	/* section name			*/
+	char		s_paddr[4];	/* physical address, aliased s_nlib */
+	char		s_vaddr[4];	/* virtual address		*/
+	char		s_size[4];	/* section size			*/
+	char		s_scnptr[4];	/* file ptr to raw data for section */
+	char		s_relptr[4];	/* file ptr to relocation	*/
+	char		s_lnnoptr[4];	/* file ptr to line numbers	*/
+	char		s_nreloc[2];	/* number of relocation entries	*/
+	char		s_nlnno[2];	/* number of line number entries*/
+	char		s_flags[4];	/* flags			*/
+};
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT	".text"
+#define _DATA	".data"
+#define _BSS	".bss"
+#define _PAD	".pad"
+#define _LOADER	".loader"
+
+#define	SCNHDR	struct external_scnhdr
+#define	SCNHSZ	40
+
+/* XCOFF uses a special .loader section with type STYP_LOADER.  */
+#define STYP_LOADER 0x1000
+
+/* XCOFF uses a special .debug section with type STYP_DEBUG.  */
+#define STYP_DEBUG 0x2000
+
+/* XCOFF handles line number or relocation overflow by creating
+   another section header with STYP_OVRFLO set.  */
+#define STYP_OVRFLO 0x8000
+
+/********************** LINE NUMBERS **********************/
+
+/* 1 line number entry for every "breakpointable" source line in a section.
+ * Line numbers are grouped on a per function basis; first entry in a function
+ * grouping will have l_lnno = 0 and in place of physical address will be the
+ * symbol table index of the function name.
+ */
+struct external_lineno {
+	union {
+		char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
+		char l_paddr[4];	/* (physical) address of line number	*/
+	} l_addr;
+	char l_lnno[2];	/* line number		*/
+};
+
+
+#define	LINENO	struct external_lineno
+#define	LINESZ	6
+
+
+/********************** SYMBOLS **********************/
+
+#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
+#define E_FILNMLEN	14	/* # characters in a file name		*/
+#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
+
+struct external_syment
+{
+  union {
+    char e_name[E_SYMNMLEN];
+    struct {
+      char e_zeroes[4];
+      char e_offset[4];
+    } e;
+  } e;
+  char e_value[4];
+  char e_scnum[2];
+  char e_type[2];
+  char e_sclass[1];
+  char e_numaux[1];
+};
+
+
+
+#define N_BTMASK	(017)
+#define N_TMASK		(060)
+#define N_BTSHFT	(4)
+#define N_TSHIFT	(2)
+
+
+union external_auxent {
+	struct {
+		char x_tagndx[4];	/* str, un, or enum tag indx */
+		union {
+			struct {
+			    char  x_lnno[2]; /* declaration line number */
+			    char  x_size[2]; /* str/union/array size */
+			} x_lnsz;
+			char x_fsize[4];	/* size of function */
+		} x_misc;
+		union {
+			struct {		/* if ISFCN, tag, or .bb */
+			    char x_lnnoptr[4];	/* ptr to fcn line # */
+			    char x_endndx[4];	/* entry ndx past block end */
+			} x_fcn;
+			struct {		/* if ISARY, up to 4 dimen. */
+			    char x_dimen[E_DIMNUM][2];
+			} x_ary;
+		} x_fcnary;
+		char x_tvndx[2];		/* tv index */
+	} x_sym;
+
+	union {
+		char x_fname[E_FILNMLEN];
+		struct {
+			char x_zeroes[4];
+			char x_offset[4];
+		} x_n;
+	} x_file;
+
+	struct {
+		char x_scnlen[4];			/* section length */
+		char x_nreloc[2];	/* # relocation entries */
+		char x_nlinno[2];	/* # line numbers */
+	} x_scn;
+
+        struct {
+		char x_tvfill[4];	/* tv fill value */
+		char x_tvlen[2];	/* length of .tv */
+		char x_tvran[2][2];	/* tv range */
+	} x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
+
+	struct {
+		unsigned char x_scnlen[4];
+		unsigned char x_parmhash[4];
+		unsigned char x_snhash[2];
+		unsigned char x_smtyp[1];
+		unsigned char x_smclas[1];
+		unsigned char x_stab[4];
+		unsigned char x_snstab[2];
+	} x_csect;
+
+};
+
+#define	SYMENT	struct external_syment
+#define	SYMESZ	18
+#define	AUXENT	union external_auxent
+#define	AUXESZ	18
+#define DBXMASK 0x80		/* for dbx storage mask */
+#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
+
+
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+
+struct external_reloc {
+  char r_vaddr[4];
+  char r_symndx[4];
+  char r_size[1];
+  char r_type[1];
+};
+
+
+#define RELOC struct external_reloc
+#define RELSZ 10
+
+#define DEFAULT_DATA_SECTION_ALIGNMENT 4
+#define DEFAULT_BSS_SECTION_ALIGNMENT 4
+#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
+/* For new sections we havn't heard of before */
+#define DEFAULT_SECTION_ALIGNMENT 4
diff -urN powerpc-merge/arch/powerpc/boot/stdio.c merge-hack/arch/powerpc/boot/stdio.c
--- /dev/null	2005-04-02 20:23:56.000000000 +1000
+++ merge-hack/arch/powerpc/boot/stdio.c	2005-11-17 14:36:52.000000000 +1100
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <stdarg.h>
+#include <stddef.h>
+#include "string.h"
+#include "stdio.h"
+#include "prom.h"
+
+size_t strnlen(const char * s, size_t count)
+{
+	const char *sc;
+
+	for (sc = s; count-- && *sc != '\0'; ++sc)
+		/* nothing */;
+	return sc - s;
+}
+
+extern unsigned int __div64_32(unsigned long long *dividend,
+			       unsigned int divisor);
+
+/* The unnecessary pointer compare is there
+ * to check for type safety (n must be 64bit)
+ */
+# define do_div(n,base) ({						\
+	unsigned int __base = (base);					\
+	unsigned int __rem;						\
+	(void)(((typeof((n)) *)0) == ((unsigned long long *)0));	\
+	if (((n) >> 32) == 0) {						\
+		__rem = (unsigned int)(n) % __base;			\
+		(n) = (unsigned int)(n) / __base;			\
+	} else								\
+		__rem = __div64_32(&(n), __base);			\
+	__rem;								\
+ })
+
+static int skip_atoi(const char **s)
+{
+	int i, c;
+
+	for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s)
+		i = i*10 + c - '0';
+	return i;
+}
+
+#define ZEROPAD	1		/* pad with zero */
+#define SIGN	2		/* unsigned/signed long */
+#define PLUS	4		/* show plus */
+#define SPACE	8		/* space if plus */
+#define LEFT	16		/* left justified */
+#define SPECIAL	32		/* 0x */
+#define LARGE	64		/* use 'ABCDEF' instead of 'abcdef' */
+
+static char * number(char * str, unsigned long long num, int base, int size, int precision, int type)
+{
+	char c,sign,tmp[66];
+	const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
+	int i;
+
+	if (type & LARGE)
+		digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+	if (type & LEFT)
+		type &= ~ZEROPAD;
+	if (base < 2 || base > 36)
+		return 0;
+	c = (type & ZEROPAD) ? '0' : ' ';
+	sign = 0;
+	if (type & SIGN) {
+		if ((signed long long)num < 0) {
+			sign = '-';
+			num = - (signed long long)num;
+			size--;
+		} else if (type & PLUS) {
+			sign = '+';
+			size--;
+		} else if (type & SPACE) {
+			sign = ' ';
+			size--;
+		}
+	}
+	if (type & SPECIAL) {
+		if (base == 16)
+			size -= 2;
+		else if (base == 8)
+			size--;
+	}
+	i = 0;
+	if (num == 0)
+		tmp[i++]='0';
+	else while (num != 0) {
+		tmp[i++] = digits[do_div(num, base)];
+	}
+	if (i > precision)
+		precision = i;
+	size -= precision;
+	if (!(type&(ZEROPAD+LEFT)))
+		while(size-->0)
+			*str++ = ' ';
+	if (sign)
+		*str++ = sign;
+	if (type & SPECIAL) {
+		if (base==8)
+			*str++ = '0';
+		else if (base==16) {
+			*str++ = '0';
+			*str++ = digits[33];
+		}
+	}
+	if (!(type & LEFT))
+		while (size-- > 0)
+			*str++ = c;
+	while (i < precision--)
+		*str++ = '0';
+	while (i-- > 0)
+		*str++ = tmp[i];
+	while (size-- > 0)
+		*str++ = ' ';
+	return str;
+}
+
+int vsprintf(char *buf, const char *fmt, va_list args)
+{
+	int len;
+	unsigned long long num;
+	int i, base;
+	char * str;
+	const char *s;
+
+	int flags;		/* flags to number() */
+
+	int field_width;	/* width of output field */
+	int precision;		/* min. # of digits for integers; max
+				   number of chars for from string */
+	int qualifier;		/* 'h', 'l', or 'L' for integer fields */
+	                        /* 'z' support added 23/7/1999 S.H.    */
+				/* 'z' changed to 'Z' --davidm 1/25/99 */
+
+	
+	for (str=buf ; *fmt ; ++fmt) {
+		if (*fmt != '%') {
+			*str++ = *fmt;
+			continue;
+		}
+			
+		/* process flags */
+		flags = 0;
+		repeat:
+			++fmt;		/* this also skips first '%' */
+			switch (*fmt) {
+				case '-': flags |= LEFT; goto repeat;
+				case '+': flags |= PLUS; goto repeat;
+				case ' ': flags |= SPACE; goto repeat;
+				case '#': flags |= SPECIAL; goto repeat;
+				case '0': flags |= ZEROPAD; goto repeat;
+				}
+		
+		/* get field width */
+		field_width = -1;
+		if ('0' <= *fmt && *fmt <= '9')
+			field_width = skip_atoi(&fmt);
+		else if (*fmt == '*') {
+			++fmt;
+			/* it's the next argument */
+			field_width = va_arg(args, int);
+			if (field_width < 0) {
+				field_width = -field_width;
+				flags |= LEFT;
+			}
+		}
+
+		/* get the precision */
+		precision = -1;
+		if (*fmt == '.') {
+			++fmt;	
+			if ('0' <= *fmt && *fmt <= '9')
+				precision = skip_atoi(&fmt);
+			else if (*fmt == '*') {
+				++fmt;
+				/* it's the next argument */
+				precision = va_arg(args, int);
+			}
+			if (precision < 0)
+				precision = 0;
+		}
+
+		/* get the conversion qualifier */
+		qualifier = -1;
+		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') {
+			qualifier = *fmt;
+			++fmt;
+		}
+
+		/* default base */
+		base = 10;
+
+		switch (*fmt) {
+		case 'c':
+			if (!(flags & LEFT))
+				while (--field_width > 0)
+					*str++ = ' ';
+			*str++ = (unsigned char) va_arg(args, int);
+			while (--field_width > 0)
+				*str++ = ' ';
+			continue;
+
+		case 's':
+			s = va_arg(args, char *);
+			if (!s)
+				s = "<NULL>";
+
+			len = strnlen(s, precision);
+
+			if (!(flags & LEFT))
+				while (len < field_width--)
+					*str++ = ' ';
+			for (i = 0; i < len; ++i)
+				*str++ = *s++;
+			while (len < field_width--)
+				*str++ = ' ';
+			continue;
+
+		case 'p':
+			if (field_width == -1) {
+				field_width = 2*sizeof(void *);
+				flags |= ZEROPAD;
+			}
+			str = number(str,
+				(unsigned long) va_arg(args, void *), 16,
+				field_width, precision, flags);
+			continue;
+
+
+		case 'n':
+			if (qualifier == 'l') {
+				long * ip = va_arg(args, long *);
+				*ip = (str - buf);
+			} else if (qualifier == 'Z') {
+				size_t * ip = va_arg(args, size_t *);
+				*ip = (str - buf);
+			} else {
+				int * ip = va_arg(args, int *);
+				*ip = (str - buf);
+			}
+			continue;
+
+		case '%':
+			*str++ = '%';
+			continue;
+
+		/* integer number formats - set up the flags and "break" */
+		case 'o':
+			base = 8;
+			break;
+
+		case 'X':
+			flags |= LARGE;
+		case 'x':
+			base = 16;
+			break;
+
+		case 'd':
+		case 'i':
+			flags |= SIGN;
+		case 'u':
+			break;
+
+		default:
+			*str++ = '%';
+			if (*fmt)
+				*str++ = *fmt;
+			else
+				--fmt;
+			continue;
+		}
+		if (qualifier == 'l') {
+			num = va_arg(args, unsigned long);
+			if (flags & SIGN)
+				num = (signed long) num;
+		} else if (qualifier == 'Z') {
+			num = va_arg(args, size_t);
+		} else if (qualifier == 'h') {
+			num = (unsigned short) va_arg(args, int);
+			if (flags & SIGN)
+				num = (signed short) num;
+		} else {
+			num = va_arg(args, unsigned int);
+			if (flags & SIGN)
+				num = (signed int) num;
+		}
+		str = number(str, num, base, field_width, precision, flags);
+	}
+	*str = '\0';
+	return str-buf;
+}
+
+int sprintf(char * buf, const char *fmt, ...)
+{
+	va_list args;
+	int i;
+
+	va_start(args, fmt);
+	i=vsprintf(buf,fmt,args);
+	va_end(args);
+	return i;
+}
+
+static char sprint_buf[1024];
+
+int
+printf(const char *fmt, ...)
+{
+	va_list args;
+	int n;
+
+	va_start(args, fmt);
+	n = vsprintf(sprint_buf, fmt, args);
+	va_end(args);
+	write(stdout, sprint_buf, n);
+	return n;
+}
diff -urN powerpc-merge/arch/powerpc/boot/stdio.h merge-hack/arch/powerpc/boot/stdio.h
--- powerpc-merge/arch/powerpc/boot/stdio.h	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/stdio.h	2005-11-17 11:07:34.000000000 +1100
@@ -7,10 +7,4 @@
 
 extern int vsprintf(char *buf, const char *fmt, va_list args);
 
-extern int putc(int c, void *f);
-extern int putchar(int c);
-extern int getchar(void);
-
-extern int fputs(char *str, void *f);
-
 #endif				/* _PPC_BOOT_STDIO_H_ */
diff -urN powerpc-merge/arch/powerpc/boot/zImage.lds merge-hack/arch/powerpc/boot/zImage.lds
--- powerpc-merge/arch/powerpc/boot/zImage.lds	2005-11-16 13:52:19.000000000 +1100
+++ merge-hack/arch/powerpc/boot/zImage.lds	2005-11-16 23:16:48.000000000 +1100
@@ -2,7 +2,7 @@
 ENTRY(_zimage_start)
 SECTIONS
 {
-  . = (4*1024*1024);
+  . = (5*1024*1024);
   _start = .;
   .text      :
   {
@@ -19,22 +19,18 @@
     __got2_start = .;
     *(.got2)
     __got2_end = .;
-  }
 
-  . = ALIGN(4096);
-  _vmlinux_start =  .;
-  .kernel:vmlinux.strip : { *(.kernel:vmlinux.strip) }
-  _vmlinux_end =  .;
+    _vmlinux_start =  .;
+    *(.kernel:vmlinux.strip)
+    _vmlinux_end =  .;
 
-  . = ALIGN(4096);
-  _initrd_start =  .;
-  .kernel:initrd : { *(.kernel:initrd) }
-  _initrd_end =  .;
+    _initrd_start =  .;
+    *(.kernel:initrd)
+    _initrd_end =  .;
+  }
 
   . = ALIGN(4096);
   _edata  =  .;
-
-  . = ALIGN(4096);
   __bss_start = .;
   .bss       :
   {

^ permalink raw reply

* [PATCH] powerpc: Fix setting MPIC priority
From: Benjamin Herrenschmidt @ 2005-11-18  6:18 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: linuxppc-dev list

Trying to set the priority would just disable the interrupt due to an
incorrect mask used. We rarely use that call, in fact, I think only in
the powermac code for the cmd-power key combo that triggers xmon. So it
got unnoticed for a while.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Index: linux-work/arch/powerpc/sysdev/mpic.c
===================================================================
--- linux-work.orig/arch/powerpc/sysdev/mpic.c	2005-11-17 17:06:04.000000000 +1100
+++ linux-work/arch/powerpc/sysdev/mpic.c	2005-11-17 17:07:40.000000000 +1100
@@ -361,7 +361,8 @@
 	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
 
 	mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
-		       mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) & ~MPIC_VECPRI_MASK);
+		       mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) &
+		       ~MPIC_VECPRI_MASK);
 
 	/* make sure mask gets to controller before we return to user */
 	do {
@@ -381,7 +382,8 @@
 	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
 
 	mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
-		       mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) | MPIC_VECPRI_MASK);
+		       mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) |
+		       MPIC_VECPRI_MASK);
 
 	/* make sure mask gets to controller before we return to user */
 	do {
@@ -735,12 +737,13 @@
 
 	spin_lock_irqsave(&mpic_lock, flags);
 	if (is_ipi) {
-		reg = mpic_ipi_read(irq - mpic->ipi_offset) & MPIC_VECPRI_PRIORITY_MASK;
+		reg = mpic_ipi_read(irq - mpic->ipi_offset) &
+			~MPIC_VECPRI_PRIORITY_MASK;
 		mpic_ipi_write(irq - mpic->ipi_offset,
 			       reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
 	} else {
-		reg = mpic_irq_read(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI)
-			& MPIC_VECPRI_PRIORITY_MASK;
+		reg = mpic_irq_read(irq - mpic->irq_offset,MPIC_IRQ_VECTOR_PRI)
+			& ~MPIC_VECPRI_PRIORITY_MASK;
 		mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI,
 			       reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
 	}

^ permalink raw reply

* Insmod mod.ko: ERROR: Module mod does not exist in /proc/modules
From: KS Soumya-ask067 @ 2005-11-18  7:06 UTC (permalink / raw)
  To: linuxppc-embedded

[-- Attachment #1: Type: text/plain, Size: 1170 bytes --]

Hi,
 
I am using Linux 2.6.10 for an MPC8540 board.
 "insmod" seemed to have a problem which said 
[insmod: QM_MODULES: Function not implemented] . 
After googling, I downloaded the module-init-tools 3.1, cross compiled
it with 85xx tool chain, installed it on the target filesystem. 
 
Now after doing that, I get an error,
 
ERROR: Module mod does not exist in /proc/modules
 
I have enabled the Module loading/unloading option in the kernel. Am I
missing out on anything else?
 
Can anyone please help me with a lead. A snapshot of the error is
attached.
 
Thanks a lot,
Soumya

10 login: root
Last login: Wed Dec 31 19:00:49 on console
bash-2.05b#
bash-2.05b#
bash-2.05b# insmod mod.ko
ERROR: Module mod does not exist in /proc/modules
bash-2.05b#
bash-2.05b#
bash-2.05b# insmod -f mod.ko
ERROR: Removing 'mod': No such file or directory
bash-2.05b#
bash-2.05b#
bash-2.05b# modprobe mod.ko
ERROR: Module mod does not exist in /proc/modules
bash-2.05b#
bash-2.05b# lsmod mod
ERROR: Module mod does not exist in /proc/modules
bash-2.05b#
bash-2.05b#
bash-2.05b# insmod -V
module-init-tools version 3.1
bash-2.05b#

 
 
 

[-- Attachment #2: Type: text/html, Size: 3305 bytes --]

^ permalink raw reply

* Re: [PATCH] ppc boot: replace string labels with numbers
From: Olaf Hering @ 2005-11-18  7:42 UTC (permalink / raw)
  To: Jerry Van Baren; +Cc: linuxppc-dev
In-Reply-To: <437D0A21.4090803@smiths-aerospace.com>

 On Thu, Nov 17, Jerry Van Baren wrote:

> While I'm being dumb, I gotta ask, how big is zImage and why does 117 
> bytes make a difference?

Because we can.

> My 2c: if you are going to use inscrutable labels (1,2,3,4), please put 
> comments in.  At least the previous labels gave hints as to what was 
> happening.

The code should be obvious.

-- 
short story of a lazy sysadmin:
 alias appserv=wotan

^ permalink raw reply

* Re: [PATCH] generate COFF zImage in arch/powerpc/boot
From: Olaf Hering @ 2005-11-18  7:51 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: linuxppc-dev
In-Reply-To: <17277.28534.614112.962810@cargo.ozlabs.ibm.com>

 On Fri, Nov 18, Paul Mackeras wrote:


> +++ merge-hack/arch/powerpc/boot/zImage.lds	2005-11-16 23:16:48.000000000 +1100

This change makes arch/powerpc/boot/README obsolete. 
Last time I looked, the COFF loader liked only .text, .data and .bss.
But maybe hack-coff needs some tweaking to modify also other sections.

I was about to do the same changes. There are some comments about the
COFF layout, and PReP, in arch/powerpc/kernel/head_32.S. Some of it can
go.

-- 
short story of a lazy sysadmin:
 alias appserv=wotan

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Christoph Hellwig @ 2005-11-18  8:23 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev list, David Woodhouse, Tom Rini
In-Reply-To: <1132285818.20016.79.camel@gaston>

On Fri, Nov 18, 2005 at 02:50:17PM +1100, Benjamin Herrenschmidt wrote:
> On Thu, 2005-11-17 at 21:26 -0600, Kumar Gala wrote:
> > Paul or BenH,
> > 
> > Would you like to enlighten us on this ambitious rework?
> 
> First, some better & more generic routines for translating addresses
> from the device-tree, and some more generic code for looking for
> standard serial port using the above routines, among others ... also,
> set_preferred_console gets modified to use the previous list so it can
> detect the ports more reliably, etc ....

so as a start can we move the code to a place in arch/powerpc/ where
it can bee used by ppc32 _now_ because it fixes a real problem?  You
can add your encehancements whenever you get time to actually do it.

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Benjamin Herrenschmidt @ 2005-11-18 10:51 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linuxppc-dev list, David Woodhouse, Tom Rini
In-Reply-To: <20051118082358.GA2309@lst.de>

On Fri, 2005-11-18 at 09:23 +0100, Christoph Hellwig wrote:
> On Fri, Nov 18, 2005 at 02:50:17PM +1100, Benjamin Herrenschmidt wrote:
> > On Thu, 2005-11-17 at 21:26 -0600, Kumar Gala wrote:
> > > Paul or BenH,
> > > 
> > > Would you like to enlighten us on this ambitious rework?
> > 
> > First, some better & more generic routines for translating addresses
> > from the device-tree, and some more generic code for looking for
> > standard serial port using the above routines, among others ... also,
> > set_preferred_console gets modified to use the previous list so it can
> > detect the ports more reliably, etc ....
> 
> so as a start can we move the code to a place in arch/powerpc/ where
> it can bee used by ppc32 _now_ because it fixes a real problem?  You
> can add your encehancements whenever you get time to actually do it.

My patch makes it ppc32 too :) udbg gets build on ppc32 along with early
console etc... all with the same code path as ppc64. I still need to
test it on more hw and fix a few problems and hopefully will post it
before the week-end is over.

Ben

^ permalink raw reply

* Porting Linux 2.4 on MPC8266
From: Manisha Jagadhane @ 2005-11-18 11:46 UTC (permalink / raw)
  To: Linuxppc-embedded

[-- Attachment #1: Type: text/plain, Size: 327 bytes --]

Hi all,
 we have a MPC8266 custom board . At present we ported u-boot(1.1.1) on the
board and its working properly.
 Now we want to port linux on that board. we have PowerTap Pro Emulator and
CodeWarrior (IDE) from Metroworks, can we use this for porting & debugging
Linux on the custom board?
 thanking u all
Manisha.

[-- Attachment #2: Type: text/html, Size: 430 bytes --]

^ permalink raw reply

* Re: [PATCH] ppc32: 8xx board-specific platform stuff for fs_enet
From: Vitaly Bordug @ 2005-11-18 14:09 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: linuxppc-embedded list
In-Reply-To: <20051117135810.GB9753@logos.cnet>

Marcelo,
Thanks for review, will fix.

Guess the proper place for setbits/clrbits should be asm-ppc/io.h?


-- 
Sincerely,
Vitaly

^ permalink raw reply

* Re: [PATCH] ppc32: 8xx board-specific platform stuff for fs_enet
From: Vitaly Bordug @ 2005-11-18 14:11 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: linuxppc-embedded list
In-Reply-To: <20051117140715.GC9753@logos.cnet>

Marcelo Tosatti wrote:
> On Wed, Nov 16, 2005 at 03:04:33PM +0300, Vitaly Bordug wrote:
>> This adds board-specific files needed to utilize fs_enet Ethernet driver
>> for MPC885ADS and MPC866ADS.
>>
>> Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
>>
> 
> Vitaly,
> 
> It also sounds to me that mpc885_nonplatform_device_init()
> initialization suits board_init() time, instead of post-start_kernel()
> do_initcalls(). No?
> 
> 
> 
Well, maybe, but it actually works and since this approach prevents messing up the 
m8xx_setup.c with #ifdef hell, I prefer the additional initialization to be there.

If this is odd, I'll proceed with the right way of course.

-- 
Sincerely,
Vitaly

^ permalink raw reply

* Re: [PATCH] ppc32: 8xx board-specific platform stuff for fs_enet
From: Marcelo Tosatti @ 2005-11-18  9:05 UTC (permalink / raw)
  To: Vitaly Bordug; +Cc: linuxppc-embedded list
In-Reply-To: <437DE127.50507@ru.mvista.com>

On Fri, Nov 18, 2005 at 05:11:51PM +0300, Vitaly Bordug wrote:
> Marcelo Tosatti wrote:
> >On Wed, Nov 16, 2005 at 03:04:33PM +0300, Vitaly Bordug wrote:
> >>This adds board-specific files needed to utilize fs_enet Ethernet driver
> >>for MPC885ADS and MPC866ADS.
> >>
> >>Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
> >>
> >
> >Vitaly,
> >
> >It also sounds to me that mpc885_nonplatform_device_init()
> >initialization suits board_init() time, instead of post-start_kernel()
> >do_initcalls(). No?
> >
> >
> >
> Well, maybe, but it actually works and since this approach prevents messing 
> up the m8xx_setup.c with #ifdef hell, I prefer the additional 
> initialization to be there.
> 
> If this is odd, I'll proceed with the right way of course.

No need to mess with m8xx_setup.c, just define your own board_init()
function:

+void __init
+board_init(void)
+{
+       ppc_md.time_init = cyc_rtc_init;
+       ppc_md.set_rtc_time = cyc_set_rtc_time;
+       ppc_md.get_rtc_time = cyc_get_rtc_time;
+       ppc_md.restart = cyc_8xx_restart;
+}

^ permalink raw reply

* Re: [PATCH] ppc32: 8xx board-specific platform stuff for fs_enet
From: Marcelo Tosatti @ 2005-11-18  9:08 UTC (permalink / raw)
  To: Vitaly Bordug, Paul Mackerras; +Cc: linuxppc-embedded list
In-Reply-To: <437DE07E.6080005@ru.mvista.com>

On Fri, Nov 18, 2005 at 05:09:02PM +0300, Vitaly Bordug wrote:
> Marcelo,
> Thanks for review, will fix.
> 
> Guess the proper place for setbits/clrbits should be asm-ppc/io.h?

Yes, think so.

Paul, you're OK with the following definitions on asm-ppc/io.h?

+/* access ports */
+#define setbits32(_addr, _v) out_be32(&(_addr), in_be32(&(_addr)) |  (_v))
+#define clrbits32(_addr, _v) out_be32(&(_addr), in_be32(&(_addr)) & ~(_v))
+
+#define setbits16(_addr, _v) out_be16(&(_addr), in_be16(&(_addr)) |  (_v))
+#define clrbits16(_addr, _v) out_be16(&(_addr), in_be16(&(_addr)) & ~(_v))

^ permalink raw reply

* Re: [PATCH] Fix 8250 probe on ppc32
From: Kumar Gala @ 2005-11-18 14:46 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev list, David Woodhouse, Tom Rini
In-Reply-To: <1132311088.20016.88.camel@gaston>


On Nov 18, 2005, at 4:51 AM, Benjamin Herrenschmidt wrote:

> On Fri, 2005-11-18 at 09:23 +0100, Christoph Hellwig wrote:
>> On Fri, Nov 18, 2005 at 02:50:17PM +1100, Benjamin Herrenschmidt  
>> wrote:
>>> On Thu, 2005-11-17 at 21:26 -0600, Kumar Gala wrote:
>>>> Paul or BenH,
>>>>
>>>> Would you like to enlighten us on this ambitious rework?
>>>
>>> First, some better & more generic routines for translating addresses
>>> from the device-tree, and some more generic code for looking for
>>> standard serial port using the above routines, among others ...  
>>> also,
>>> set_preferred_console gets modified to use the previous list so  
>>> it can
>>> detect the ports more reliably, etc ....
>>
>> so as a start can we move the code to a place in arch/powerpc/ where
>> it can bee used by ppc32 _now_ because it fixes a real problem?  You
>> can add your encehancements whenever you get time to actually do it.
>
> My patch makes it ppc32 too :) udbg gets build on ppc32 along with  
> early
> console etc... all with the same code path as ppc64. I still need to
> test it on more hw and fix a few problems and hopefully will post it
> before the week-end is over.

How early on can we use udbg? I'd be interested to see how this is  
going to work out for 4xx/83xx/85xx w/built-in 8250's.

- kumar

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox