* Re: muram in device tree for mpc8250 in arch/powerpc
From: James Black @ 2008-03-24 21:45 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-embedded
In-Reply-To: <47E7DC46.2010806@freescale.com>
I started from scratch and am trying to build the cuImage. I get this
compiler error.
arch/powerpc/boot/cuboot-pq2.c:14:20: error: bitops.h: No such file or directory
arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
arch/powerpc/boot/cuboot-pq2.c:205: warning: implicit declaration of
function '__ilog2_u32'
I looks as though cuboot-pq2.c expects bitops.h to be in the same
directory, but it has moved to
linux/include/asm-powerpc/bitops.h
Did you run into this problem?
JB
On Mon, Mar 24, 2008 at 10:52 AM, Scott Wood <scottwood@freescale.com> wrote:
> James Black wrote:
> > Thanks much for the help Scott. Do you feel that the dts is correct
> > now and probably not the culprit? Do you have 2.6.24.2 running on
> > other boards?
>
> I just booted 2.6.24.2 on pq2fads (using cuImage, since I don't have a
> devtree-aware u-boot on this board).
>
>
> > localbus@f0010100 {
> > compatible = "fsl,mpc8250-localbus",
> > "fsl,pq2-localbus";
> >
> > #address-cells = <2>;
> > #size-cells = <1>;
> > reg = <f0010100 60>;
> > ranges = <0 0 fe000000 00200000>;
> >
> > flash@fe000000,0 {
> > compatible = "cfi-flash";
> > reg = <0 fe000000 00200000>;
> > bank-width = <2>;
> > device-width = <1>;
> > };
>
> This is wrong; the flash will not translate since you didn't provide a
> window at the address reg is at.
>
> The first cell of the reg should be the chipselect, and the second cell
> the offset.
>
>
> > brg@119f0 {
> > compatible = "fsl,mpc8250-brg",
> > "fsl,cpm2-brg",
> > "fsl,cpm-brg";
> > reg = <119f0 10>;
> > };
>
> BRG should be <119f0 10 115f0 10>.
>
> -Scott
>
>
^ permalink raw reply
* Re: muram in device tree for mpc8250 in arch/powerpc
From: Scott Wood @ 2008-03-24 21:53 UTC (permalink / raw)
To: James Black; +Cc: linuxppc-embedded
In-Reply-To: <b77025b40803241445w46aaf071k427df888b4597c4d@mail.gmail.com>
James Black wrote:
> I started from scratch and am trying to build the cuImage. I get this
> compiler error.
>
> arch/powerpc/boot/cuboot-pq2.c:14:20: error: bitops.h: No such file or directory
> arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
> arch/powerpc/boot/cuboot-pq2.c:205: warning: implicit declaration of
> function '__ilog2_u32'
>
> I looks as though cuboot-pq2.c expects bitops.h to be in the same
> directory, but it has moved to
> linux/include/asm-powerpc/bitops.h
I don't see any reference to bitops.h in cuboot-pq2.c...
Line 14 includes "ops.h".
-Scott
^ permalink raw reply
* Re: muram in device tree for mpc8250 in arch/powerpc
From: James Black @ 2008-03-24 21:59 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-embedded
In-Reply-To: <47E822EC.9030408@freescale.com>
OK, you are right. I was looking at my old copy I was trying to fix.
The error is,
arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
arch/powerpc/boot/cuboot-pq2.c:204: warning: implicit declaration of
function '__ilog2_u32'
On Mon, Mar 24, 2008 at 3:53 PM, Scott Wood <scottwood@freescale.com> wrote:
> James Black wrote:
> > I started from scratch and am trying to build the cuImage. I get this
> > compiler error.
> >
> > arch/powerpc/boot/cuboot-pq2.c:14:20: error: bitops.h: No such file or directory
> > arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
> > arch/powerpc/boot/cuboot-pq2.c:205: warning: implicit declaration of
> > function '__ilog2_u32'
> >
> > I looks as though cuboot-pq2.c expects bitops.h to be in the same
> > directory, but it has moved to
> > linux/include/asm-powerpc/bitops.h
>
> I don't see any reference to bitops.h in cuboot-pq2.c...
> Line 14 includes "ops.h".
>
> -Scott
>
>
^ permalink raw reply
* Re: muram in device tree for mpc8250 in arch/powerpc
From: Scott Wood @ 2008-03-24 22:05 UTC (permalink / raw)
To: James Black; +Cc: linuxppc-embedded
In-Reply-To: <b77025b40803241459s4537b1f6rdcf85c59a4af6707@mail.gmail.com>
James Black wrote:
> OK, you are right. I was looking at my old copy I was trying to fix.
> The error is,
>
> arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
> arch/powerpc/boot/cuboot-pq2.c:204: warning: implicit declaration of
> function '__ilog2_u32'
It's defined as an inline function in ops.h. Do you have an old ops.h?
-Scott
^ permalink raw reply
* RE: dcr stuff.
From: Benjamin Herrenschmidt @ 2008-03-24 21:59 UTC (permalink / raw)
To: Stephen Neuendorffer; +Cc: linuxppc-dev, git-dev
In-Reply-To: <20080324043416.3634316E007A@mail15-dub.bigfish.com>
On Sun, 2008-03-23 at 21:34 -0700, Stephen Neuendorffer wrote:
>
> Certainly, if it ain't broke don't fix it. What I'm really trying to
> do is figure out how to clean up alot of non-mainline drivers.
> At the moment, several cores use DCR, but the drivers for those cores
> have internal code for DCR, their own ifdefs, etc. This *is* broken.
> I'm looking at the available documentation to figure out the best way
> of approaching the problem.
>
> It might be nice if there was an extra layer of indirection which was
> only enabled if DCR_NATIVE and DCR_MMIO, and which was no cost
> otherwise,
> but the bigger problem I see in the short term is that we'll likely
> have to support ARCH ppc for at least some time into the future, and
> it would be
> nice if we used the same driver code to do it: it doesn't seem obvious
> how to achieve this.
It's not too hard to have the DCR code be common, it's harder to deal
with the lack of device-tree in arch/ppc tho.
As for enabling support for both native and MMIO, that's certainly
possible, patches welcome :-) You could make the dcr host structure
contain the type or even function pointers, as you see fit. But make is
so that when only native is enabled, it turns back into the inlines we
have now.
Cheers,
Ben.
^ permalink raw reply
* Re: muram in device tree for mpc8250 in arch/powerpc
From: James Black @ 2008-03-24 22:09 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-embedded
In-Reply-To: <47E82591.9050907@freescale.com>
I must have the old one. I don't see '__ilog2_u32' defined. This is
the kernel I got from denx eldk 4.2. I'll grab the kernel from
kernel.org and check there. Thanks.
JB
On Mon, Mar 24, 2008 at 4:05 PM, Scott Wood <scottwood@freescale.com> wrote:
> James Black wrote:
> > OK, you are right. I was looking at my old copy I was trying to fix.
> > The error is,
> >
> > arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
> > arch/powerpc/boot/cuboot-pq2.c:204: warning: implicit declaration of
> > function '__ilog2_u32'
>
> It's defined as an inline function in ops.h. Do you have an old ops.h?
>
> -Scott
>
^ permalink raw reply
* RE: dcr stuff.
From: Stephen Neuendorffer @ 2008-03-24 22:18 UTC (permalink / raw)
To: benh; +Cc: linuxppc-dev, git-dev
In-Reply-To: <1206395973.7197.50.camel@pasglop>
> -----Original Message-----
> From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
> Sent: Monday, March 24, 2008 3:00 PM
> To: Stephen Neuendorffer
> Cc: Josh Boyer; linuxppc-dev@ozlabs.org; git-dev
> Subject: RE: dcr stuff.
>=20
>=20
> On Sun, 2008-03-23 at 21:34 -0700, Stephen Neuendorffer wrote:
> >
> > Certainly, if it ain't broke don't fix it. What I'm really trying
to
> > do is figure out how to clean up alot of non-mainline drivers.
> > At the moment, several cores use DCR, but the drivers for those
cores
> > have internal code for DCR, their own ifdefs, etc. This *is*
broken.
> > I'm looking at the available documentation to figure out the best
way
> > of approaching the problem.
> >
> > It might be nice if there was an extra layer of indirection which
was
> > only enabled if DCR_NATIVE and DCR_MMIO, and which was no cost
> > otherwise,
> > but the bigger problem I see in the short term is that we'll likely
> > have to support ARCH ppc for at least some time into the future, and
> > it would be
> > nice if we used the same driver code to do it: it doesn't seem
obvious
> > how to achieve this.
>=20
> It's not too hard to have the DCR code be common, it's harder to deal
> with the lack of device-tree in arch/ppc tho.
My thoughts at the moment are to punt on map and unmap and at least
provide support for dcr_host_t and dcr_read and dcr_write. Any driver
code that wants to use this without a device tree will just have to do
the work itself. This will at least support the use cases we have
today: If people want something better, then they should switch to ARCH
powerpc.. :)
=20
> As for enabling support for both native and MMIO, that's certainly
> possible, patches welcome :-) You could make the dcr host structure
> contain the type or even function pointers, as you see fit. But make
is
> so that when only native is enabled, it turns back into the inlines we
> have now.
Working on it.. :)
Steve
^ permalink raw reply
* Re: muram in device tree for mpc8250 in arch/powerpc
From: James Black @ 2008-03-24 22:28 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-embedded
In-Reply-To: <b77025b40803241509p44162ebfg2728bec85efb5d7a@mail.gmail.com>
That was it. It seems that the eldk/4.2 is missing the ilog2_u32
declaration. Makes me wonder what else is missing. I'll start again
with the kernel.org version and see what happens.
I'll send an email when this work gets done. Good catch.
JB
On Mon, Mar 24, 2008 at 4:09 PM, James Black <jblack547@gmail.com> wrote:
> I must have the old one. I don't see '__ilog2_u32' defined. This is
> the kernel I got from denx eldk 4.2. I'll grab the kernel from
> kernel.org and check there. Thanks.
>
> JB
>
>
>
> On Mon, Mar 24, 2008 at 4:05 PM, Scott Wood <scottwood@freescale.com> wrote:
> > James Black wrote:
> > > OK, you are right. I was looking at my old copy I was trying to fix.
> > > The error is,
> > >
> > > arch/powerpc/boot/cuboot-pq2.c: In function 'fixup_pci':
> > > arch/powerpc/boot/cuboot-pq2.c:204: warning: implicit declaration of
> > > function '__ilog2_u32'
> >
> > It's defined as an inline function in ops.h. Do you have an old ops.h?
> >
> > -Scott
> >
>
^ permalink raw reply
* [PATCH] [POWERPC] Remove and replace uses of PPC_MEMSTART with memstart_addr
From: Kumar Gala @ 2008-03-24 22:39 UTC (permalink / raw)
To: linuxppc-dev
A number of users of PPC_MEMSTART (40x, ppc_mmu_32) can just always use
0 as we don't support booting these kernels at non-zero physical addresses
since their exception vectors must be at 0 (or 0xfffx_xxxx).
For the sub-arches that support relocatable interrupt vectors (book-e) its
reasonable to have memory start at a non-zero physical address. For those
cases use the variable memstart_addr instead of the #define PPC_MEMSTART since
the only uses of PPC_MEMSTART are for initialization and in the future we can
set memstart_addr at runtime to have a relocatable kernel.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/mm/40x_mmu.c | 2 +-
arch/powerpc/mm/fsl_booke_mmu.c | 11 +++++------
arch/powerpc/mm/init_32.c | 8 ++++----
arch/powerpc/mm/mmu_decl.h | 1 +
arch/powerpc/mm/pgtable_32.c | 5 +++--
arch/powerpc/mm/ppc_mmu_32.c | 10 ++--------
include/asm-powerpc/page_32.h | 2 --
7 files changed, 16 insertions(+), 23 deletions(-)
diff --git a/arch/powerpc/mm/40x_mmu.c b/arch/powerpc/mm/40x_mmu.c
index 3899ea9..cecbbc7 100644
--- a/arch/powerpc/mm/40x_mmu.c
+++ b/arch/powerpc/mm/40x_mmu.c
@@ -97,7 +97,7 @@ unsigned long __init mmu_mapin_ram(void)
phys_addr_t p;
v = KERNELBASE;
- p = PPC_MEMSTART;
+ p = 0;
s = total_lowmem;
if (__map_without_ltlbs)
diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c
index c93a966..3dd0c81 100644
--- a/arch/powerpc/mm/fsl_booke_mmu.c
+++ b/arch/powerpc/mm/fsl_booke_mmu.c
@@ -53,13 +53,12 @@
#include <asm/machdep.h>
#include <asm/setup.h>
+#include "mmu_decl.h"
+
extern void loadcam_entry(unsigned int index);
unsigned int tlbcam_index;
unsigned int num_tlbcam_entries;
static unsigned long __cam0, __cam1, __cam2;
-extern unsigned long total_lowmem;
-extern unsigned long __max_low_memory;
-extern unsigned long __initial_memory_limit;
#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE
#define NUM_TLBCAMS (16)
@@ -165,15 +164,15 @@ void invalidate_tlbcam_entry(int index)
void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
unsigned long cam2)
{
- settlbcam(0, PAGE_OFFSET, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
+ settlbcam(0, PAGE_OFFSET, memstart_addr, cam0, _PAGE_KERNEL, 0);
tlbcam_index++;
if (cam1) {
tlbcam_index++;
- settlbcam(1, PAGE_OFFSET+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
+ settlbcam(1, PAGE_OFFSET+cam0, memstart_addr+cam0, cam1, _PAGE_KERNEL, 0);
}
if (cam2) {
tlbcam_index++;
- settlbcam(2, PAGE_OFFSET+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
+ settlbcam(2, PAGE_OFFSET+cam0+cam1, memstart_addr+cam0+cam1, cam2, _PAGE_KERNEL, 0);
}
}
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 59a725b..01a81a0 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -59,8 +59,9 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
unsigned long total_memory;
unsigned long total_lowmem;
-unsigned long ppc_memstart;
-unsigned long ppc_memoffset = PAGE_OFFSET;
+phys_addr_t memstart_addr;
+EXPORT_SYMBOL(memstart_addr);
+phys_addr_t lowmem_end_addr;
int boot_mapsize;
#ifdef CONFIG_PPC_PMAC
@@ -145,8 +146,7 @@ void __init MMU_init(void)
printk(KERN_WARNING "Only using first contiguous memory region");
}
- total_memory = lmb_end_of_DRAM();
- total_lowmem = total_memory;
+ total_lowmem = total_memory = lmb_end_of_DRAM() - memstart_addr;
#ifdef CONFIG_FSL_BOOKE
/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h
index ebfd13d..5bc11f5 100644
--- a/arch/powerpc/mm/mmu_decl.h
+++ b/arch/powerpc/mm/mmu_decl.h
@@ -51,6 +51,7 @@ extern unsigned long __max_low_memory;
extern unsigned long __initial_memory_limit;
extern unsigned long total_memory;
extern unsigned long total_lowmem;
+extern phys_addr_t memstart_addr;
/* ...and now those things that may be slightly different between processor
* architectures. -- Dan
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
index ac3390f..64c44bc 100644
--- a/arch/powerpc/mm/pgtable_32.c
+++ b/arch/powerpc/mm/pgtable_32.c
@@ -281,12 +281,13 @@ int map_page(unsigned long va, phys_addr_t pa, int flags)
*/
void __init mapin_ram(void)
{
- unsigned long v, p, s, f;
+ unsigned long v, s, f;
+ phys_addr_t p;
int ktext;
s = mmu_mapin_ram();
v = KERNELBASE + s;
- p = PPC_MEMSTART + s;
+ p = memstart_addr + s;
for (; s < total_lowmem; s += PAGE_SIZE) {
ktext = ((char *) v >= _stext && (char *) v < etext);
f = ktext ?_PAGE_RAM_TEXT : _PAGE_RAM;
diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c
index 72de3c7..7dea68b 100644
--- a/arch/powerpc/mm/ppc_mmu_32.c
+++ b/arch/powerpc/mm/ppc_mmu_32.c
@@ -93,19 +93,13 @@ unsigned long __init mmu_mapin_ram(void)
/* Make sure we don't map a block larger than the
smallest alignment of the physical address. */
- /* alignment of PPC_MEMSTART */
- align = ~(PPC_MEMSTART-1) & PPC_MEMSTART;
- /* set BAT block size to MIN(max_size, align) */
- if (align && align < max_size)
- max_size = align;
-
tot = total_lowmem;
for (bl = 128<<10; bl < max_size; bl <<= 1) {
if (bl * 2 > tot)
break;
}
- setbat(2, KERNELBASE, PPC_MEMSTART, bl, _PAGE_RAM);
+ setbat(2, KERNELBASE, 0, bl, _PAGE_RAM);
done = (unsigned long)bat_addrs[2].limit - KERNELBASE + 1;
if ((done < tot) && !bat_addrs[3].limit) {
/* use BAT3 to cover a bit more */
@@ -113,7 +107,7 @@ unsigned long __init mmu_mapin_ram(void)
for (bl = 128<<10; bl < max_size; bl <<= 1)
if (bl * 2 > tot)
break;
- setbat(3, KERNELBASE+done, PPC_MEMSTART+done, bl, _PAGE_RAM);
+ setbat(3, KERNELBASE+done, done, bl, _PAGE_RAM);
done = (unsigned long)bat_addrs[3].limit - KERNELBASE + 1;
}
diff --git a/include/asm-powerpc/page_32.h b/include/asm-powerpc/page_32.h
index 65ea19e..51f8134 100644
--- a/include/asm-powerpc/page_32.h
+++ b/include/asm-powerpc/page_32.h
@@ -3,8 +3,6 @@
#define VM_DATA_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS32
-#define PPC_MEMSTART 0
-
#ifdef CONFIG_NOT_COHERENT_CACHE
#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
#endif
--
1.5.4.1
^ permalink raw reply related
* [RFC] [POWERPC] add target for building .dtb files
From: Grant Likely @ 2008-03-24 22:52 UTC (permalink / raw)
To: linuxppc-dev, paulus, jwboyer
From: Grant Likely <grant.likely@secretlab.ca>
Call dtc from the Makefile instead of the wrapper script so that the dt
blobs can be generated with a simple make invocation.
Using this patch allows board ports to trigger automatic building of .dtb
files by adding them to the image-y target list.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
Josh, how does this look to you? It will give you the ability to build .dtb
files from the command line. If it looks good, I'd like to get it in when
then merge window opens.
Cheers,
g.
arch/powerpc/Makefile | 2 +-
arch/powerpc/boot/Makefile | 26 +++++++++++++++-----------
2 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index ab5cfe8..dd80825 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -164,7 +164,7 @@ boot := arch/$(ARCH)/boot
$(BOOT_TARGETS): vmlinux
$(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-bootwrapper_install:
+bootwrapper_install %.dtb:
$(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
define archhelp
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 4974d9e..2f8a9f4 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -285,11 +285,11 @@ $(obj)/zImage.%: vmlinux $(wrapperbits)
$(call if_changed,wrap,$*)
# dtbImage% - a dtbImage is a zImage with an embedded device tree blob
-$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(dtstree)/%.dts
- $(call if_changed,wrap,$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz)
+$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
+ $(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
-$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(dtstree)/%.dts
- $(call if_changed,wrap,$*,$(dtstree)/$*.dts)
+$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb
+ $(call if_changed,wrap,$*,,$(obj)/$*.dtb)
# This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
# prefix
@@ -302,14 +302,18 @@ $(obj)/zImage.iseries: vmlinux
$(obj)/uImage: vmlinux $(wrapperbits)
$(call if_changed,wrap,uboot)
-$(obj)/cuImage.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
- $(call if_changed,wrap,cuboot-$*,$(dtstree)/$*.dts)
+$(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb)
-$(obj)/treeImage.initrd.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
- $(call if_changed,wrap,treeboot-$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz)
+$(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
-$(obj)/treeImage.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
- $(call if_changed,wrap,treeboot-$*,$(dtstree)/$*.dts)
+$(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)
+
+# Rule to build device tree blobs
+$(obj)/%.dtb: $(dtstree)/%.dts $(obj)/dtc
+ $(obj)/dtc -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts
# If there isn't a platform selected then just strip the vmlinux.
ifeq (,$(image-y))
@@ -326,7 +330,7 @@ install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y))
# anything not in $(targets)
clean-files += $(image-) $(initrd-) zImage zImage.initrd cuImage.* treeImage.* \
- otheros.bld
+ otheros.bld *.dtb
# clean up files cached by wrapper
clean-kernel := vmlinux.strip vmlinux.bin
^ permalink raw reply related
* Re: crash in init_ipic_sysfs on efika
From: Matt Sealey @ 2008-03-24 23:01 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev, Olaf Hering, Paul Mackerras
In-Reply-To: <fa686aa40803211151w688a8d61sba9d0d0e6cdc7833@mail.gmail.com>
My assessment of the situation is: not at all.
--
Matt Sealey <matt@genesi-usa.com>
Genesi, Manager, Developer Relations
Grant Likely wrote:
> On Fri, Mar 21, 2008 at 7:14 AM, Matt Sealey <matt@genesi-usa.com> wrote:
>> Is the MPC5200B PSC-AC97 driver in there?
>
> Audio drivers need to go in via one of the ALSA developers and I
> haven't been paying close enough attention to know if it has not in
> yet.
>
> g.
>
>
^ permalink raw reply
* Re: crash in init_ipic_sysfs on efika
From: Kumar Gala @ 2008-03-24 22:59 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev, Olaf Hering
In-Reply-To: <18407.24604.209928.398497@cargo.ozlabs.ibm.com>
On Mar 24, 2008, at 3:02 AM, Paul Mackerras wrote:
> Kumar Gala writes:
>
>> since you are going to send something to linus let me update the fsl
>> defconfigs and send you a pull request.
>
> OK -- I'm about to send Linus a pull request now in case he feels like
> releasing 2.6.25 this weekend. I'll send him another pull request
> with your defconfig update and whatever else has turned up when I get
> your pull request.
ok and sent you a pull request.
- k
^ permalink raw reply
* Re: interrupt handlers PowerPC via GCC
From: Tehn Yit Chin @ 2008-03-24 23:03 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-embedded
In-Reply-To: <47E29C60.10300@freescale.com>
[-- Attachment #1: Type: text/plain, Size: 1158 bytes --]
Hey Scott,
Thanks for the reply, I shall investigate further.
I wasn't talking about interrupt handlers in Linux as such, but using
powerpc-eabi-gcc to write an ISR for the MPC5516. (I guess that could be
off-topic on this mailing list, but I thought the folks on this mailing list
would probably know the answer pretty easily). I was hoping that gcc would
generate the prologue and epilogue code for me via the interrupt attributes.
Many thanks.
Tehn Yit Chin
On Fri, Mar 21, 2008 at 4:18 AM, Scott Wood <scottwood@freescale.com> wrote:
> Tehn Yit Chin wrote:
> > Hi all,
> >
> > Apologies for such a basic question. I am trying to write an ISR on a
> > MPC551x. When I tried to use the interrupt attribute with
> > powerpc-eabi-gcc such as
> >
> > _attribute_((interrupt_handler)) foobarISR(void)
> > {
> > }
>
> Assuming you're talking about an interrupt handler in Linux, you don't
> need to do anything like that. The actual interrupt entry is assembly
> code. Search existing drivers for "irqreturn_t" to find examples of
> what an interrupt handler looks like, and "request_irq" for how to hook
> the handler into the interrupt.
>
> -Scott
>
[-- Attachment #2: Type: text/html, Size: 1586 bytes --]
^ permalink raw reply
* Re: [PATCH 1/2] ibm_newemac: PowerPC 440GX EMAC PHY clock workaround
From: Benjamin Herrenschmidt @ 2008-03-24 23:21 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev
In-Reply-To: <20080306134105.GA31715@ru.mvista.com>
On Thu, 2008-03-06 at 16:41 +0300, Valentine Barshak wrote:
> The PowerPC 440GX Taishan board fails to reset EMAC3 (reset timeout error)
> if there's no link. Because of that it fails to find PHY chip. The older ibm_emac
> driver had a workaround for that: the EMAC_CLK_INTERNAL/EMAC_CLK_EXTERNAL macros,
> which toggle the Ethernet Clock Select bit in the SDR0_MFR register. This patch
> does the same for "ibm,emac-440gx" compatible chips. The workaround forces
> clock on -all- EMACs, so we select clock under global emac_phy_map_lock.
>
> Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Just get them acked by Jeff now and they can go in via Josh tree.
Cheers,
Ben.
> ---
> drivers/net/ibm_newemac/core.c | 16 +++++++++++++++-
> drivers/net/ibm_newemac/core.h | 8 ++++++--
> 2 files changed, 21 insertions(+), 3 deletions(-)
>
> diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.c linux-2.6/drivers/net/ibm_newemac/core.c
> --- linux-2.6.orig/drivers/net/ibm_newemac/core.c 2008-02-22 19:56:26.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.c 2008-02-22 20:38:47.000000000 +0300
> @@ -43,6 +43,8 @@
> #include <asm/io.h>
> #include <asm/dma.h>
> #include <asm/uaccess.h>
> +#include <asm/dcr.h>
> +#include <asm/dcr-regs.h>
>
> #include "core.h"
>
> @@ -2323,6 +2325,10 @@ static int __devinit emac_init_phy(struc
> dev->phy.mdio_read = emac_mdio_read;
> dev->phy.mdio_write = emac_mdio_write;
>
> + /* Enable internal clock source */
> + if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX))
> + dcri_clrset(SDR0, SDR0_MFR, 0, SDR0_MFR_ECS);
> +
> /* Configure EMAC with defaults so we can at least use MDIO
> * This is needed mostly for 440GX
> */
> @@ -2355,6 +2361,11 @@ static int __devinit emac_init_phy(struc
> if (!emac_mii_phy_probe(&dev->phy, i))
> break;
> }
> +
> + /* Enable external clock source */
> + if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX))
> + dcri_clrset(SDR0, SDR0_MFR, SDR0_MFR_ECS, 0);
> +
> mutex_unlock(&emac_phy_map_lock);
> if (i == 0x20) {
> printk(KERN_WARNING "%s: can't find PHY!\n", np->full_name);
> @@ -2480,8 +2491,11 @@ static int __devinit emac_init_config(st
> }
>
> /* Check EMAC version */
> - if (of_device_is_compatible(np, "ibm,emac4"))
> + if (of_device_is_compatible(np, "ibm,emac4")) {
> dev->features |= EMAC_FTR_EMAC4;
> + if (of_device_is_compatible(np, "ibm,emac-440gx"))
> + dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX;
> + }
>
> /* Fixup some feature bits based on the device tree */
> if (of_get_property(np, "has-inverted-stacr-oc", NULL))
> diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.h linux-2.6/drivers/net/ibm_newemac/core.h
> --- linux-2.6.orig/drivers/net/ibm_newemac/core.h 2008-02-21 16:45:36.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.h 2008-02-22 19:57:44.000000000 +0300
> @@ -301,6 +301,10 @@ struct emac_instance {
> * Set if we have new type STACR with STAOPC
> */
> #define EMAC_FTR_HAS_NEW_STACR 0x00000040
> +/*
> + * Set if we need phy clock workaround for 440gx
> + */
> +#define EMAC_FTR_440GX_PHY_CLK_FIX 0x00000080
>
>
> /* Right now, we don't quite handle the always/possible masks on the
> @@ -312,8 +316,8 @@ enum {
>
> EMAC_FTRS_POSSIBLE =
> #ifdef CONFIG_IBM_NEW_EMAC_EMAC4
> - EMAC_FTR_EMAC4 | EMAC_FTR_HAS_NEW_STACR |
> - EMAC_FTR_STACR_OC_INVERT |
> + EMAC_FTR_EMAC4 | EMAC_FTR_HAS_NEW_STACR |
> + EMAC_FTR_STACR_OC_INVERT | EMAC_FTR_440GX_PHY_CLK_FIX |
> #endif
> #ifdef CONFIG_IBM_NEW_EMAC_TAH
> EMAC_FTR_HAS_TAH |
^ permalink raw reply
* Re: [PATCH 2/2] ibm_newemac: PowerPC 440EP/440GR EMAC PHY clock workaround
From: Benjamin Herrenschmidt @ 2008-03-24 23:22 UTC (permalink / raw)
To: Valentine Barshak; +Cc: linuxppc-dev
In-Reply-To: <20080306134359.GA31762@ru.mvista.com>
On Thu, 2008-03-06 at 16:43 +0300, Valentine Barshak wrote:
> This patch adds ibm_newemac PHY clock workaround for 440EP/440GR EMAC
> attached to a PHY which doesn't generate RX clock if there is no link.
> The code is based on the previous ibm_emac driver stuff. The 440EP/440GR
> allows controlling each EMAC clock separately as opposed to global clock
> selection for 440GX.
>
> Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
> drivers/net/ibm_newemac/core.c | 34 ++++++++++++++++++++++++++++++++--
> drivers/net/ibm_newemac/core.h | 6 +++++-
> 2 files changed, 37 insertions(+), 3 deletions(-)
>
> diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.c linux-2.6/drivers/net/ibm_newemac/core.c
> --- linux-2.6.orig/drivers/net/ibm_newemac/core.c 2008-02-26 16:32:33.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.c 2008-02-26 16:37:52.000000000 +0300
> @@ -129,10 +129,29 @@ static struct device_node *emac_boot_lis
> static inline void emac_report_timeout_error(struct emac_instance *dev,
> const char *error)
> {
> - if (net_ratelimit())
> + if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX |
> + EMAC_FTR_440EP_PHY_CLK_FIX))
> + DBG(dev, "%s" NL, error);
> + else if (net_ratelimit())
> printk(KERN_ERR "%s: %s\n", dev->ndev->name, error);
> }
>
> +/* EMAC PHY clock workaround:
> + * 440EP/440GR has more sane SDR0_MFR register implementation than 440GX,
> + * which allows controlling each EMAC clock
> + */
> +static inline void emac_rx_clk_tx(struct emac_instance *dev)
> +{
> + if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX))
> + dcri_clrset(SDR0, SDR0_MFR, 0, SDR0_MFR_ECS >> dev->cell_index);
> +}
> +
> +static inline void emac_rx_clk_default(struct emac_instance *dev)
> +{
> + if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX))
> + dcri_clrset(SDR0, SDR0_MFR, SDR0_MFR_ECS >> dev->cell_index, 0);
> +}
> +
> /* PHY polling intervals */
> #define PHY_POLL_LINK_ON HZ
> #define PHY_POLL_LINK_OFF (HZ / 5)
> @@ -1089,9 +1112,11 @@ static int emac_open(struct net_device *
> int link_poll_interval;
> if (dev->phy.def->ops->poll_link(&dev->phy)) {
> dev->phy.def->ops->read_link(&dev->phy);
> + emac_rx_clk_default(dev);
> netif_carrier_on(dev->ndev);
> link_poll_interval = PHY_POLL_LINK_ON;
> } else {
> + emac_rx_clk_tx(dev);
> netif_carrier_off(dev->ndev);
> link_poll_interval = PHY_POLL_LINK_OFF;
> }
> @@ -1169,6 +1194,7 @@ static void emac_link_timer(struct work_
>
> if (dev->phy.def->ops->poll_link(&dev->phy)) {
> if (!netif_carrier_ok(dev->ndev)) {
> + emac_rx_clk_default(dev);
> /* Get new link parameters */
> dev->phy.def->ops->read_link(&dev->phy);
>
> @@ -1181,6 +1207,7 @@ static void emac_link_timer(struct work_
> link_poll_interval = PHY_POLL_LINK_ON;
> } else {
> if (netif_carrier_ok(dev->ndev)) {
> + emac_rx_clk_tx(dev);
> netif_carrier_off(dev->ndev);
> netif_tx_disable(dev->ndev);
> emac_reinitialize(dev);
> @@ -2325,9 +2352,12 @@ static int __devinit emac_init_phy(struc
> dev->phy.mdio_read = emac_mdio_read;
> dev->phy.mdio_write = emac_mdio_write;
>
> - /* Enable internal clock source */
> + /* EMAC PHY clock workaround */
> if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX))
> + /* Enable internal clock source */
> dcri_clrset(SDR0, SDR0_MFR, 0, SDR0_MFR_ECS);
> + else
> + emac_rx_clk_tx(dev);
>
> /* Configure EMAC with defaults so we can at least use MDIO
> * This is needed mostly for 440GX
> @@ -2495,6 +2525,10 @@ static int __devinit emac_init_config(st
> dev->features |= EMAC_FTR_EMAC4;
> if (of_device_is_compatible(np, "ibm,emac-440gx"))
> dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX;
> + } else {
> + if (of_device_is_compatible(np, "ibm,emac-440ep") ||
> + of_device_is_compatible(np, "ibm,emac-440gr"))
> + dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
> }
>
> /* Fixup some feature bits based on the device tree */
> diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.h linux-2.6/drivers/net/ibm_newemac/core.h
> --- linux-2.6.orig/drivers/net/ibm_newemac/core.h 2008-02-26 16:32:33.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.h 2008-02-26 16:37:52.000000000 +0300
> @@ -305,6 +305,10 @@ struct emac_instance {
> * Set if we need phy clock workaround for 440gx
> */
> #define EMAC_FTR_440GX_PHY_CLK_FIX 0x00000080
> +/*
> + * Set if we need phy clock workaround for 440ep or 440gr
> + */
> +#define EMAC_FTR_440EP_PHY_CLK_FIX 0x00000100
>
>
> /* Right now, we don't quite handle the always/possible masks on the
> @@ -328,7 +332,7 @@ enum {
> #ifdef CONFIG_IBM_NEW_EMAC_RGMII
> EMAC_FTR_HAS_RGMII |
> #endif
> - 0,
> + EMAC_FTR_440EP_PHY_CLK_FIX,
> };
>
> static inline int emac_has_feature(struct emac_instance *dev,
^ permalink raw reply
* [PATCH] [RFC][POWERPC] refactor dcr code
From: Stephen Neuendorffer @ 2008-03-24 23:28 UTC (permalink / raw)
To: linuxppc-dev, benh, jwboyer, git-dev
Previously, dcr support was configured at compile time to either using
MMIO or native dcr instructions. Although this works for most
platforms, it fails on FPGA platforms:
1) Systems may include more than one dcr bus.
2) Systems may be native dcr capable and still use memory mapped dcr interface.
This patch provides runtime support based on the device trees for the
case where CONFIG_PPC_DCR_MMIO and CONFIG_PPC_DCR_NATIVE are both
selected. Previously, this was a poorly defined configuration, which
happened to provide NATIVE support. The runtime selection is made
based on the dcr slave device having a 'dcr-access-method' attribute
in the device tree. If only one of the above options is selected,
then the code uses #defines to select only the used code in order to
avoid interoducing overhead in existing usage.
Signed-off-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
---
I did some brief compile testing of this and it appears to not break
anything, but it's not been heavily tested. Mainly RFC at this point,
but if anyone feels like testing this, I'd appreciate it.
Steve
---
arch/powerpc/sysdev/dcr.c | 79 ++++++++++++++++++++++++++++++++----
include/asm-powerpc/dcr-generic.h | 49 +++++++++++++++++++++++
include/asm-powerpc/dcr-mmio.h | 12 +++---
include/asm-powerpc/dcr-native.h | 12 +++---
include/asm-powerpc/dcr.h | 36 ++++++++++++++++-
5 files changed, 166 insertions(+), 22 deletions(-)
create mode 100644 include/asm-powerpc/dcr-generic.h
diff --git a/arch/powerpc/sysdev/dcr.c b/arch/powerpc/sysdev/dcr.c
index 427027c..0b9442e 100644
--- a/arch/powerpc/sysdev/dcr.c
+++ b/arch/powerpc/sysdev/dcr.c
@@ -23,6 +23,67 @@
#include <asm/prom.h>
#include <asm/dcr.h>
+#if defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO)
+
+bool dcr_map_ok_generic(dcr_host_t host) {
+ if(host.type == INVALID) {
+ return 0;
+ } else if(host.type == NATIVE) {
+ return dcr_map_ok_native(host.host.native);
+ } else {
+ return dcr_map_ok_mmio(host.host.mmio);
+ }
+}
+EXPORT_SYMBOL_GPL(dcr_map_ok_generic);
+
+dcr_host_t dcr_map_generic(struct device_node *dev, unsigned int dcr_n,
+ unsigned int dcr_c) {
+ dcr_host_t host;
+ const char *prop = of_get_property(dev, "dcr-access-method", NULL);
+ if(!strcmp(prop, "native")) {
+ host.type = NATIVE;
+ host.host.native = dcr_map_native(dev, dcr_n, dcr_c);
+ } else if(!strcmp(prop, "mmio")) {
+ host.type = MMIO;
+ host.host.mmio = dcr_map_mmio(dev, dcr_n, dcr_c);
+ } else {
+ host.type = INVALID;
+ }
+ return host;
+}
+EXPORT_SYMBOL_GPL(dcr_map_generic);
+
+void dcr_unmap_generic(dcr_host_t host, unsigned int dcr_c) {
+ if(host.type == NATIVE) {
+ dcr_unmap_native(host.host.native, dcr_c);
+ } else {
+ dcr_unmap_mmio(host.host.mmio, dcr_c);
+ }
+}
+EXPORT_SYMBOL_GPL(dcr_unmap_generic);
+
+u32 dcr_read_generic(dcr_host_t host, unsigned int dcr_n)
+{
+ if(host.type == NATIVE) {
+ return dcr_read_native(host.host.native, dcr_n);
+ } else {
+ return dcr_read_mmio(host.host.mmio, dcr_n);
+ }
+}
+EXPORT_SYMBOL_GPL(dcr_read_generic);
+
+void dcr_write_generic(dcr_host_t host, unsigned int dcr_n, u32 value)
+{
+ if(host.type == NATIVE) {
+ dcr_write_native(host.host.native, dcr_n, value);
+ } else {
+ dcr_write_mmio(host.host.mmio, dcr_n, value);
+ }
+}
+EXPORT_SYMBOL_GPL(dcr_write_generic);
+
+#endif /* defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO) */
+
unsigned int dcr_resource_start(struct device_node *np, unsigned int index)
{
unsigned int ds;
@@ -47,7 +108,7 @@ unsigned int dcr_resource_len(struct device_node *np, unsigned int index)
}
EXPORT_SYMBOL_GPL(dcr_resource_len);
-#ifndef CONFIG_PPC_DCR_NATIVE
+#ifdef CONFIG_PPC_DCR_MMIO
static struct device_node * find_dcr_parent(struct device_node * node)
{
@@ -101,17 +162,17 @@ u64 of_translate_dcr_address(struct device_node *dev,
return ret;
}
-dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
+dcr_host_mmio_t dcr_map_mmio(struct device_node *dev, unsigned int dcr_n,
unsigned int dcr_c)
{
- dcr_host_t ret = { .token = NULL, .stride = 0, .base = dcr_n };
+ dcr_host_mmio_t ret = { .token = NULL, .stride = 0, .base = dcr_n };
u64 addr;
pr_debug("dcr_map(%s, 0x%x, 0x%x)\n",
dev->full_name, dcr_n, dcr_c);
addr = of_translate_dcr_address(dev, dcr_n, &ret.stride);
- pr_debug("translates to addr: 0x%lx, stride: 0x%x\n",
+ pr_debug("translates to addr: 0x%p, stride: 0x%x\n",
addr, ret.stride);
if (addr == OF_BAD_ADDR)
return ret;
@@ -124,11 +185,11 @@ dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
ret.token -= dcr_n * ret.stride;
return ret;
}
-EXPORT_SYMBOL_GPL(dcr_map);
+EXPORT_SYMBOL_GPL(dcr_map_mmio);
-void dcr_unmap(dcr_host_t host, unsigned int dcr_c)
+void dcr_unmap_mmio(dcr_host_mmio_t host, unsigned int dcr_c)
{
- dcr_host_t h = host;
+ dcr_host_mmio_t h = host;
if (h.token == NULL)
return;
@@ -136,6 +197,6 @@ void dcr_unmap(dcr_host_t host, unsigned int dcr_c)
iounmap(h.token);
h.token = NULL;
}
-EXPORT_SYMBOL_GPL(dcr_unmap);
+EXPORT_SYMBOL_GPL(dcr_unmap_mmio);
-#endif /* !defined(CONFIG_PPC_DCR_NATIVE) */
+#endif /* defined(CONFIG_PPC_DCR_MMIO) */
diff --git a/include/asm-powerpc/dcr-generic.h b/include/asm-powerpc/dcr-generic.h
new file mode 100644
index 0000000..0ee74fb
--- /dev/null
+++ b/include/asm-powerpc/dcr-generic.h
@@ -0,0 +1,49 @@
+/*
+ * (c) Copyright 2006 Benjamin Herrenschmidt, IBM Corp.
+ * <benh@kernel.crashing.org>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _ASM_POWERPC_DCR_GENERIC_H
+#define _ASM_POWERPC_DCR_GENERIC_H
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+
+enum host_type_t {MMIO, NATIVE, INVALID};
+
+typedef struct {
+ enum host_type_t type;
+ union {
+ dcr_host_mmio_t mmio;
+ dcr_host_native_t native;
+ } host;
+} dcr_host_t;
+
+extern bool dcr_map_ok_generic(dcr_host_t host);
+
+extern dcr_host_t dcr_map_generic(struct device_node *dev, unsigned int dcr_n,
+ unsigned int dcr_c);
+extern void dcr_unmap_generic(dcr_host_t host, unsigned int dcr_c);
+
+extern u32 dcr_read_generic(dcr_host_t host, unsigned int dcr_n);
+
+extern void dcr_write_generic(dcr_host_t host, unsigned int dcr_n, u32 value);
+
+#endif /* __ASSEMBLY__ */
+#endif /* __KERNEL__ */
+#endif /* _ASM_POWERPC_DCR_GENERIC_H */
+
+
diff --git a/include/asm-powerpc/dcr-mmio.h b/include/asm-powerpc/dcr-mmio.h
index 08532ff..fc3adce 100644
--- a/include/asm-powerpc/dcr-mmio.h
+++ b/include/asm-powerpc/dcr-mmio.h
@@ -27,20 +27,20 @@ typedef struct {
void __iomem *token;
unsigned int stride;
unsigned int base;
-} dcr_host_t;
+} dcr_host_mmio_t;
-#define DCR_MAP_OK(host) ((host).token != NULL)
+#define dcr_map_ok_mmio(host) ((host).token != NULL)
-extern dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
+extern dcr_host_mmio_t dcr_map_mmio(struct device_node *dev, unsigned int dcr_n,
unsigned int dcr_c);
-extern void dcr_unmap(dcr_host_t host, unsigned int dcr_c);
+extern void dcr_unmap_mmio(dcr_host_mmio_t host, unsigned int dcr_c);
-static inline u32 dcr_read(dcr_host_t host, unsigned int dcr_n)
+static inline u32 dcr_read_mmio(dcr_host_mmio_t host, unsigned int dcr_n)
{
return in_be32(host.token + ((host.base + dcr_n) * host.stride));
}
-static inline void dcr_write(dcr_host_t host, unsigned int dcr_n, u32 value)
+static inline void dcr_write_mmio(dcr_host_mmio_t host, unsigned int dcr_n, u32 value)
{
out_be32(host.token + ((host.base + dcr_n) * host.stride), value);
}
diff --git a/include/asm-powerpc/dcr-native.h b/include/asm-powerpc/dcr-native.h
index 8dbb1ab..f9fc865 100644
--- a/include/asm-powerpc/dcr-native.h
+++ b/include/asm-powerpc/dcr-native.h
@@ -24,14 +24,14 @@
typedef struct {
unsigned int base;
-} dcr_host_t;
+} dcr_host_native_t;
-#define DCR_MAP_OK(host) (1)
+#define dcr_map_ok_native(host) (1)
-#define dcr_map(dev, dcr_n, dcr_c) ((dcr_host_t){ .base = (dcr_n) })
-#define dcr_unmap(host, dcr_c) do {} while (0)
-#define dcr_read(host, dcr_n) mfdcr(dcr_n + host.base)
-#define dcr_write(host, dcr_n, value) mtdcr(dcr_n + host.base, value)
+#define dcr_map_native(dev, dcr_n, dcr_c) ((dcr_host_native_t){ .base = (dcr_n) })
+#define dcr_unmap_native(host, dcr_c) do {} while (0)
+#define dcr_read_native(host, dcr_n) mfdcr(dcr_n + host.base)
+#define dcr_write_native(host, dcr_n, value) mtdcr(dcr_n + host.base, value)
/* Device Control Registers */
void __mtdcr(int reg, unsigned int val);
diff --git a/include/asm-powerpc/dcr.h b/include/asm-powerpc/dcr.h
index 9338d50..6b86322 100644
--- a/include/asm-powerpc/dcr.h
+++ b/include/asm-powerpc/dcr.h
@@ -20,14 +20,47 @@
#ifndef _ASM_POWERPC_DCR_H
#define _ASM_POWERPC_DCR_H
#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
#ifdef CONFIG_PPC_DCR
#ifdef CONFIG_PPC_DCR_NATIVE
#include <asm/dcr-native.h>
-#else
+#endif
+
+#ifdef CONFIG_PPC_DCR_MMIO
#include <asm/dcr-mmio.h>
#endif
+#if defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO)
+
+#include <asm/dcr-generic.h>
+
+#define DCR_MAP_OK(host) dcr_map_ok_generic(host)
+#define dcr_map(dev, dcr_n, dcr_c) dcr_map_generic(dev, dcr_n, dcr_c)
+#define dcr_unmap(host, dcr_c) dcr_unmap_generic(host, dcr_c)
+#define dcr_read(host, dcr_n) dcr_read_generic(host, dcr_n)
+#define dcr_write(host, dcr_n, value) dcr_write_generic(host, dcr_n, value)
+
+#else
+
+#ifdef CONFIG_PPC_DCR_NATIVE
+typedef dcr_host_native_t dcr_host_t;
+#define DCR_MAP_OK(host) dcr_map_ok_native(host)
+#define dcr_map(dev, dcr_n, dcr_c) dcr_map_native(dev, dcr_n, dcr_c)
+#define dcr_unmap(host, dcr_c) dcr_unmap_native(host, dcr_c)
+#define dcr_read(host, dcr_n) dcr_read_native(host, dcr_n)
+#define dcr_write(host, dcr_n, value) dcr_write_native(host, dcr_n, value)
+#else
+typedef dcr_host_mmio_t dcr_host_t;
+#define DCR_MAP_OK(host) dcr_map_ok_mmio(host)
+#define dcr_map(dev, dcr_n, dcr_c) dcr_map_mmio(dev, dcr_n, dcr_c)
+#define dcr_unmap(host, dcr_c) dcr_unmap_mmio(host, dcr_c)
+#define dcr_read(host, dcr_n) dcr_read_mmio(host, dcr_n)
+#define dcr_write(host, dcr_n, value) dcr_write_mmio(host, dcr_n, value)
+#endif
+
+#endif /* defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO) */
+
/*
* On CONFIG_PPC_MERGE, we have additional helpers to read the DCR
* base from the device-tree
@@ -41,5 +74,6 @@ extern unsigned int dcr_resource_len(struct device_node *np,
#endif /* CONFIG_PPC_MERGE */
#endif /* CONFIG_PPC_DCR */
+#endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_DCR_H */
--
1.5.3.4-dirty
^ permalink raw reply related
* [PATCH] [POWERPC] Introduce lowmem_end_addr to distiguish from total_lowmem
From: Kumar Gala @ 2008-03-24 23:33 UTC (permalink / raw)
To: linuxppc-dev
total_lowmem represents the amount of low memory not the physical address
that low memory ends at. If the start of memory is at 0 it happends that
total_lowmem can be used as both the size and the address that lowmem
ends at. (technical its one byte beyond the end)
To make the code a bit more clear and deal with the case when the start of
memory isn't at physical 0, we introduce lowmem_end_addr that represents
one byte beyond the last physical address in the lowmem region.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/mm/44x_mmu.c | 2 +-
arch/powerpc/mm/init_32.c | 4 +++-
arch/powerpc/mm/init_64.c | 2 ++
arch/powerpc/mm/mem.c | 16 +++++++++-------
4 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/arch/powerpc/mm/44x_mmu.c b/arch/powerpc/mm/44x_mmu.c
index 04dc087..953fb91 100644
--- a/arch/powerpc/mm/44x_mmu.c
+++ b/arch/powerpc/mm/44x_mmu.c
@@ -67,7 +67,7 @@ unsigned long __init mmu_mapin_ram(void)
/* Pin in enough TLBs to cover any lowmem not covered by the
* initial 256M mapping established in head_44x.S */
- for (addr = PPC_PIN_SIZE; addr < total_lowmem;
+ for (addr = PPC_PIN_SIZE; addr < lowmem_end_addr;
addr += PPC_PIN_SIZE)
ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 01a81a0..345a275 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -147,6 +147,7 @@ void __init MMU_init(void)
}
total_lowmem = total_memory = lmb_end_of_DRAM() - memstart_addr;
+ lowmem_end_addr = memstart_addr + total_lowmem;
#ifdef CONFIG_FSL_BOOKE
/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
@@ -157,9 +158,10 @@ void __init MMU_init(void)
if (total_lowmem > __max_low_memory) {
total_lowmem = __max_low_memory;
+ lowmem_end_addr = memstart_addr + total_lowmem;
#ifndef CONFIG_HIGHMEM
total_memory = total_lowmem;
- lmb_enforce_memory_limit(total_lowmem);
+ lmb_enforce_memory_limit(lowmem_end_addr);
lmb_analyze();
#endif /* CONFIG_HIGHMEM */
}
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index abeb0eb..f18b203 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -75,6 +75,8 @@
/* max amount of RAM to use */
unsigned long __max_memory;
+phys_addr_t memstart_addr;
+
void free_initmem(void)
{
unsigned long addr;
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 60c019c..9c10b14 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -217,9 +217,11 @@ void __init do_init_bootmem(void)
unsigned long total_pages;
int boot_mapsize;
- max_pfn = total_pages = lmb_end_of_DRAM() >> PAGE_SHIFT;
+ max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT;
+ total_pages = (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT;
#ifdef CONFIG_HIGHMEM
total_pages = total_lowmem >> PAGE_SHIFT;
+ max_low_pfn = lowmem_end_addr >> PAGE_SHIFT;
#endif
/*
@@ -245,18 +247,18 @@ void __init do_init_bootmem(void)
* present.
*/
#ifdef CONFIG_HIGHMEM
- free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
+ free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT);
/* reserve the sections we're already using */
for (i = 0; i < lmb.reserved.cnt; i++) {
unsigned long addr = lmb.reserved.region[i].base +
lmb_size_bytes(&lmb.reserved, i) - 1;
- if (addr < total_lowmem)
+ if (addr < lowmem_end_addr)
reserve_bootmem(lmb.reserved.region[i].base,
lmb_size_bytes(&lmb.reserved, i),
BOOTMEM_DEFAULT);
- else if (lmb.reserved.region[i].base < total_lowmem) {
- unsigned long adjusted_size = total_lowmem -
+ else if (lmb.reserved.region[i].base < lowmem_end_addr) {
+ unsigned long adjusted_size = lowmem_end_addr -
lmb.reserved.region[i].base;
reserve_bootmem(lmb.reserved.region[i].base,
adjusted_size, BOOTMEM_DEFAULT);
@@ -326,7 +328,7 @@ void __init paging_init(void)
(top_of_ram - total_ram) >> 20);
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
#ifdef CONFIG_HIGHMEM
- max_zone_pfns[ZONE_DMA] = total_lowmem >> PAGE_SHIFT;
+ max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT;
max_zone_pfns[ZONE_HIGHMEM] = top_of_ram >> PAGE_SHIFT;
#else
max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
@@ -381,7 +383,7 @@ void __init mem_init(void)
{
unsigned long pfn, highmem_mapnr;
- highmem_mapnr = total_lowmem >> PAGE_SHIFT;
+ highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;
for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
struct page *page = pfn_to_page(pfn);
if (lmb_is_reserved(pfn << PAGE_SHIFT))
--
1.5.4.1
^ permalink raw reply related
* Re: dtc: Simplify error handling for unparseable input
From: David Gibson @ 2008-03-25 1:28 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-dev
In-Reply-To: <20080324173641.GA22159@loki.buserror.net>
On Mon, Mar 24, 2008 at 12:36:41PM -0500, Scott Wood wrote:
> On Mon, Mar 24, 2008 at 02:44:24PM +1100, David Gibson wrote:
> > Index: dtc/dtc.h
> > ===================================================================
> > --- dtc.orig/dtc.h 2008-03-24 14:33:33.000000000 +1100
> > +++ dtc/dtc.h 2008-03-24 14:33:34.000000000 +1100
> > @@ -232,7 +232,6 @@
> > struct boot_info {
> > struct reserve_info *reservelist;
> > struct node *dt; /* the device tree */
> > - int error;
> > };
>
> If you remove this, there'll be no way to indicate semantic errors other
> than die() (the NULL approaches are no good, since they inhibit recovery),
> which is suboptimal if the error is not immediately fatal.
But everything is immediately fatal. When we have a *real* example of
something that's not, we can restore an error code.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
^ permalink raw reply
* Re: [PATCH] [RFC][POWERPC] refactor dcr code
From: Stephen Rothwell @ 2008-03-25 2:37 UTC (permalink / raw)
To: Stephen Neuendorffer; +Cc: linuxppc-dev, git-dev
In-Reply-To: <20080324232835.A0AFA1B58093@mail17-dub.bigfish.com>
[-- Attachment #1: Type: text/plain, Size: 2587 bytes --]
Hi Stephen,
Just some trivial issues ...
On Mon, 24 Mar 2008 16:28:33 -0700 Stephen Neuendorffer <stephen.neuendorffer@xilinx.com> wrote:
>
> +++ b/arch/powerpc/sysdev/dcr.c
> @@ -23,6 +23,67 @@
> #include <asm/prom.h>
> #include <asm/dcr.h>
>
> +#if defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO)
> +
> +bool dcr_map_ok_generic(dcr_host_t host) {
> + if(host.type == INVALID) {
^
Space, please.
> + return 0;
> + } else if(host.type == NATIVE) {
And again. And more below.
> + return dcr_map_ok_native(host.host.native);
> + } else {
> + return dcr_map_ok_mmio(host.host.mmio);
> + }
You don't need the braces around each if/else clause. Again, more below.
> +dcr_host_t dcr_map_generic(struct device_node *dev, unsigned int dcr_n,
> + unsigned int dcr_c) {
> + dcr_host_t host;
> + const char *prop = of_get_property(dev, "dcr-access-method", NULL);
> + if(!strcmp(prop, "native")) {
Indentation. We also usually separate declarations from code with a a
blank line.
> -dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
> +dcr_host_mmio_t dcr_map_mmio(struct device_node *dev, unsigned int dcr_n,
> unsigned int dcr_c)
> {
> - dcr_host_t ret = { .token = NULL, .stride = 0, .base = dcr_n };
> + dcr_host_mmio_t ret = { .token = NULL, .stride = 0, .base = dcr_n };
> u64 addr;
>
> pr_debug("dcr_map(%s, 0x%x, 0x%x)\n",
> dev->full_name, dcr_n, dcr_c);
>
> addr = of_translate_dcr_address(dev, dcr_n, &ret.stride);
> - pr_debug("translates to addr: 0x%lx, stride: 0x%x\n",
> + pr_debug("translates to addr: 0x%p, stride: 0x%x\n",
> addr, ret.stride);
This change should cause a warning because you are passing a u64 where
printk is expecting a pointer. We usually use %llx and cast the u64 to
unsigned long long.
> +++ b/include/asm-powerpc/dcr-mmio.h
> @@ -27,20 +27,20 @@ typedef struct {
> void __iomem *token;
> unsigned int stride;
> unsigned int base;
> -} dcr_host_t;
> +} dcr_host_mmio_t;
>
> -#define DCR_MAP_OK(host) ((host).token != NULL)
> +#define dcr_map_ok_mmio(host) ((host).token != NULL)
This could be a static inline function.
> +++ b/include/asm-powerpc/dcr-native.h
> @@ -24,14 +24,14 @@
>
> typedef struct {
> unsigned int base;
> -} dcr_host_t;
> +} dcr_host_native_t;
>
> -#define DCR_MAP_OK(host) (1)
> +#define dcr_map_ok_native(host) (1)
As could this.
--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* RE: [PATCH] [POWERPC] Introduce lowmem_end_addr to distiguish fromtotal_lowmem
From: Zhang Wei @ 2008-03-25 3:18 UTC (permalink / raw)
To: Kumar Gala, linuxppc-dev; +Cc: Wang Haiying
In-Reply-To: <Pine.LNX.4.64.0803241832570.29472@blarg.am.freescale.net>
Hi, Kumar,
> -----Original Message-----
> From: linuxppc-dev-bounces+wei.zhang=3Dfreescale.com@ozlabs.org=20
>=20
> total_lowmem represents the amount of low memory not the=20
> physical address
> that low memory ends at. If the start of memory is at 0 it=20
> happends that
> total_lowmem can be used as both the size and the address that lowmem
> ends at. (technical its one byte beyond the end)
>=20
> To make the code a bit more clear and deal with the case when=20
> the start of
> memory isn't at physical 0, we introduce lowmem_end_addr that=20
> represents
> one byte beyond the last physical address in the lowmem region.
About the kernel memory offset, if the memory area from phyical 0
to lowmem start address is reserved for other usage in this kernel,
no more comments. If it will be used by other kernel (in asmp mode),
how about to use tlb mapping physical address to virtual address 0
not move the kernel lowmem address? I consider the tlb mapping
will be more safe.
Cheers!
Wei.
>=20
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> ---
> arch/powerpc/mm/44x_mmu.c | 2 +-
> arch/powerpc/mm/init_32.c | 4 +++-
> arch/powerpc/mm/init_64.c | 2 ++
> arch/powerpc/mm/mem.c | 16 +++++++++-------
> 4 files changed, 15 insertions(+), 9 deletions(-)
>=20
> diff --git a/arch/powerpc/mm/44x_mmu.c b/arch/powerpc/mm/44x_mmu.c
> index 04dc087..953fb91 100644
> --- a/arch/powerpc/mm/44x_mmu.c
> +++ b/arch/powerpc/mm/44x_mmu.c
> @@ -67,7 +67,7 @@ unsigned long __init mmu_mapin_ram(void)
>=20
> /* Pin in enough TLBs to cover any lowmem not covered by the
> * initial 256M mapping established in head_44x.S */
> - for (addr =3D PPC_PIN_SIZE; addr < total_lowmem;
> + for (addr =3D PPC_PIN_SIZE; addr < lowmem_end_addr;
> addr +=3D PPC_PIN_SIZE)
> ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
>=20
> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
> index 01a81a0..345a275 100644
> --- a/arch/powerpc/mm/init_32.c
> +++ b/arch/powerpc/mm/init_32.c
> @@ -147,6 +147,7 @@ void __init MMU_init(void)
> }
>=20
> total_lowmem =3D total_memory =3D lmb_end_of_DRAM() - memstart_addr;
> + lowmem_end_addr =3D memstart_addr + total_lowmem;
>=20
> #ifdef CONFIG_FSL_BOOKE
> /* Freescale Book-E parts expect lowmem to be mapped by=20
> fixed TLB
> @@ -157,9 +158,10 @@ void __init MMU_init(void)
>=20
> if (total_lowmem > __max_low_memory) {
> total_lowmem =3D __max_low_memory;
> + lowmem_end_addr =3D memstart_addr + total_lowmem;
> #ifndef CONFIG_HIGHMEM
> total_memory =3D total_lowmem;
> - lmb_enforce_memory_limit(total_lowmem);
> + lmb_enforce_memory_limit(lowmem_end_addr);
> lmb_analyze();
> #endif /* CONFIG_HIGHMEM */
> }
> diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
> index abeb0eb..f18b203 100644
> --- a/arch/powerpc/mm/init_64.c
> +++ b/arch/powerpc/mm/init_64.c
> @@ -75,6 +75,8 @@
> /* max amount of RAM to use */
> unsigned long __max_memory;
>=20
> +phys_addr_t memstart_addr;
> +
> void free_initmem(void)
> {
> unsigned long addr;
> diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
> index 60c019c..9c10b14 100644
> --- a/arch/powerpc/mm/mem.c
> +++ b/arch/powerpc/mm/mem.c
> @@ -217,9 +217,11 @@ void __init do_init_bootmem(void)
> unsigned long total_pages;
> int boot_mapsize;
>=20
> - max_pfn =3D total_pages =3D lmb_end_of_DRAM() >> PAGE_SHIFT;
> + max_pfn =3D lmb_end_of_DRAM() >> PAGE_SHIFT;
> + total_pages =3D (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT;
> #ifdef CONFIG_HIGHMEM
> total_pages =3D total_lowmem >> PAGE_SHIFT;
> + max_low_pfn =3D lowmem_end_addr >> PAGE_SHIFT;
> #endif
>=20
> /*
> @@ -245,18 +247,18 @@ void __init do_init_bootmem(void)
> * present.
> */
> #ifdef CONFIG_HIGHMEM
> - free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
> + free_bootmem_with_active_regions(0, lowmem_end_addr >>=20
> PAGE_SHIFT);
>=20
> /* reserve the sections we're already using */
> for (i =3D 0; i < lmb.reserved.cnt; i++) {
> unsigned long addr =3D lmb.reserved.region[i].base +
> =20
> lmb_size_bytes(&lmb.reserved, i) - 1;
> - if (addr < total_lowmem)
> + if (addr < lowmem_end_addr)
> reserve_bootmem(lmb.reserved.region[i].base,
> =09
> lmb_size_bytes(&lmb.reserved, i),
> BOOTMEM_DEFAULT);
> - else if (lmb.reserved.region[i].base < total_lowmem) {
> - unsigned long adjusted_size =3D total_lowmem -
> + else if (lmb.reserved.region[i].base <=20
> lowmem_end_addr) {
> + unsigned long adjusted_size =3D lowmem_end_addr -
> lmb.reserved.region[i].base;
> reserve_bootmem(lmb.reserved.region[i].base,
> adjusted_size, BOOTMEM_DEFAULT);
> @@ -326,7 +328,7 @@ void __init paging_init(void)
> (top_of_ram - total_ram) >> 20);
> memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
> #ifdef CONFIG_HIGHMEM
> - max_zone_pfns[ZONE_DMA] =3D total_lowmem >> PAGE_SHIFT;
> + max_zone_pfns[ZONE_DMA] =3D lowmem_end_addr >> PAGE_SHIFT;
> max_zone_pfns[ZONE_HIGHMEM] =3D top_of_ram >> PAGE_SHIFT;
> #else
> max_zone_pfns[ZONE_DMA] =3D top_of_ram >> PAGE_SHIFT;
> @@ -381,7 +383,7 @@ void __init mem_init(void)
> {
> unsigned long pfn, highmem_mapnr;
>=20
> - highmem_mapnr =3D total_lowmem >> PAGE_SHIFT;
> + highmem_mapnr =3D lowmem_end_addr >> PAGE_SHIFT;
> for (pfn =3D highmem_mapnr; pfn < max_mapnr; ++pfn) {
> struct page *page =3D pfn_to_page(pfn);
> if (lmb_is_reserved(pfn << PAGE_SHIFT))
> --=20
> 1.5.4.1
>=20
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
>=20
^ permalink raw reply
* Re: [PATCH] [POWERPC] Introduce lowmem_end_addr to distiguish fromtotal_lowmem
From: Kumar Gala @ 2008-03-25 3:31 UTC (permalink / raw)
To: Zhang Wei; +Cc: linuxppc-dev, Wang Haiying
In-Reply-To: <78567AC4946EDC42B7DE978C350CD869EC52AE@zch01exm26.fsl.freescale.net>
On Mar 24, 2008, at 10:18 PM, Zhang Wei wrote:
> Hi, Kumar,
>
>> -----Original Message-----
>> From: linuxppc-dev-bounces+wei.zhang=freescale.com@ozlabs.org
>>
>> total_lowmem represents the amount of low memory not the
>> physical address
>> that low memory ends at. If the start of memory is at 0 it
>> happends that
>> total_lowmem can be used as both the size and the address that lowmem
>> ends at. (technical its one byte beyond the end)
>>
>> To make the code a bit more clear and deal with the case when
>> the start of
>> memory isn't at physical 0, we introduce lowmem_end_addr that
>> represents
>> one byte beyond the last physical address in the lowmem region.
>
> About the kernel memory offset, if the memory area from phyical 0
> to lowmem start address is reserved for other usage in this kernel,
> no more comments. If it will be used by other kernel (in asmp mode),
> how about to use tlb mapping physical address to virtual address 0
> not move the kernel lowmem address? I consider the tlb mapping
> will be more safe.
I'm not sure I follow your question.
- k
^ permalink raw reply
* Please pull powerpc.git merge branch
From: Paul Mackerras @ 2008-03-25 3:32 UTC (permalink / raw)
To: torvalds; +Cc: linuxppc-dev, akpm, linux-kernel
Linus,
Please do:
git pull \
git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc.git merge
once more. Kumar sent me a defconfig update for the Freescale
platforms, and there is another 1-line fix from Grant Likely that only
affects MPC5200B machines.
Thanks,
Paul.
arch/powerpc/boot/dts/lite5200b.dts | 2
arch/powerpc/configs/ep8248e_defconfig | 74 +++++++---
arch/powerpc/configs/ep88xc_defconfig | 56 +++++--
arch/powerpc/configs/linkstation_defconfig | 131 +++++++++++------
arch/powerpc/configs/mpc7448_hpc2_defconfig | 119 ++++++++++++----
arch/powerpc/configs/mpc8272_ads_defconfig | 75 ++++++++--
arch/powerpc/configs/mpc8313_rdb_defconfig | 114 ++++++++++-----
arch/powerpc/configs/mpc8315_rdb_defconfig | 110 ++++++++++-----
arch/powerpc/configs/mpc832x_mds_defconfig | 101 +++++++++----
arch/powerpc/configs/mpc832x_rdb_defconfig | 106 +++++++++-----
arch/powerpc/configs/mpc834x_itx_defconfig | 111 +++++++++------
arch/powerpc/configs/mpc834x_itxgp_defconfig | 109 +++++++++-----
arch/powerpc/configs/mpc834x_mds_defconfig | 104 +++++++++-----
arch/powerpc/configs/mpc836x_mds_defconfig | 102 +++++++++----
arch/powerpc/configs/mpc837x_mds_defconfig | 197 ++++++++++++++------------
arch/powerpc/configs/mpc837x_rdb_defconfig | 83 +++++++----
arch/powerpc/configs/mpc83xx_defconfig | 88 ++++++++----
arch/powerpc/configs/mpc8540_ads_defconfig | 121 ++++++++++++----
arch/powerpc/configs/mpc8544_ds_defconfig | 127 ++++++++++++-----
arch/powerpc/configs/mpc8560_ads_defconfig | 126 +++++++++++++----
arch/powerpc/configs/mpc8568mds_defconfig | 106 ++++++++++----
arch/powerpc/configs/mpc8572_ds_defconfig | 127 ++++++++++++-----
arch/powerpc/configs/mpc85xx_cds_defconfig | 131 +++++++++++++----
arch/powerpc/configs/mpc85xx_defconfig | 111 ++++++++++-----
arch/powerpc/configs/mpc8610_hpcd_defconfig | 131 ++++++++++++++---
arch/powerpc/configs/mpc8641_hpcn_defconfig | 115 ++++++++++-----
arch/powerpc/configs/mpc866_ads_defconfig | 112 +++++++++++----
arch/powerpc/configs/mpc885_ads_defconfig | 56 +++++--
arch/powerpc/configs/pq2fads_defconfig | 89 +++++++++---
arch/powerpc/configs/prpmc2800_defconfig | 160 +++++++++++++++------
arch/powerpc/configs/sbc834x_defconfig | 78 +++++++---
arch/powerpc/configs/sbc8548_defconfig | 115 ++++++++++++---
arch/powerpc/configs/sbc8560_defconfig | 124 +++++++++++++---
arch/powerpc/configs/storcenter_defconfig | 102 ++++++++-----
arch/powerpc/configs/stx_gp3_defconfig | 154 +++++++++++++++-----
arch/powerpc/configs/tqm8540_defconfig | 133 +++++++++++++-----
arch/powerpc/configs/tqm8541_defconfig | 133 +++++++++++++-----
arch/powerpc/configs/tqm8555_defconfig | 133 +++++++++++++-----
arch/powerpc/configs/tqm8560_defconfig | 133 +++++++++++++-----
39 files changed, 3032 insertions(+), 1267 deletions(-)
commit 5492a7e4cba8e38419d489f0865de0a67c737e8a
Author: Grant Likely <grant.likely@secretlab.ca>
Date: Sat Mar 22 14:25:15 2008 +1100
[POWERPC] mpc5200: Fix incorrect compatible string for the mdio node
The MDIO node in the lite5200b.dts file needs to also claim compatibility
with the older mpc5200 chip. Otherwise the driver won't find the device.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Paul Mackerras <paulus@samba.org>
commit eff2f1ec37c114fda63ac1dd15c9ca9ac7e68db4
Author: Kumar Gala <galak@kernel.crashing.org>
Date: Mon Mar 24 08:56:06 2008 -0500
[POWERPC] Update some defconfigs
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
^ permalink raw reply
* [PATCH v2] [POWERPC] Introduce lowmem_end_addr to distiguish from total_lowmem
From: Kumar Gala @ 2008-03-25 3:44 UTC (permalink / raw)
To: linuxppc-dev
total_lowmem represents the amount of low memory not the physical address
that low memory ends at. If the start of memory is at 0 it happends that
total_lowmem can be used as both the size and the address that lowmem
ends at. (technical its one byte beyond the end)
To make the code a bit more clear and deal with the case when the start of
memory isn't at physical 0, we introduce lowmem_end_addr that represents
one byte beyond the last physical address in the lowmem region.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
For got update to mmu_decl.h in the first patch.
arch/powerpc/mm/44x_mmu.c | 2 +-
arch/powerpc/mm/init_32.c | 4 +++-
arch/powerpc/mm/init_64.c | 2 ++
arch/powerpc/mm/mem.c | 16 +++++++++-------
arch/powerpc/mm/mmu_decl.h | 1 +
5 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/arch/powerpc/mm/44x_mmu.c b/arch/powerpc/mm/44x_mmu.c
index 04dc087..953fb91 100644
--- a/arch/powerpc/mm/44x_mmu.c
+++ b/arch/powerpc/mm/44x_mmu.c
@@ -67,7 +67,7 @@ unsigned long __init mmu_mapin_ram(void)
/* Pin in enough TLBs to cover any lowmem not covered by the
* initial 256M mapping established in head_44x.S */
- for (addr = PPC_PIN_SIZE; addr < total_lowmem;
+ for (addr = PPC_PIN_SIZE; addr < lowmem_end_addr;
addr += PPC_PIN_SIZE)
ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 01a81a0..345a275 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -147,6 +147,7 @@ void __init MMU_init(void)
}
total_lowmem = total_memory = lmb_end_of_DRAM() - memstart_addr;
+ lowmem_end_addr = memstart_addr + total_lowmem;
#ifdef CONFIG_FSL_BOOKE
/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
@@ -157,9 +158,10 @@ void __init MMU_init(void)
if (total_lowmem > __max_low_memory) {
total_lowmem = __max_low_memory;
+ lowmem_end_addr = memstart_addr + total_lowmem;
#ifndef CONFIG_HIGHMEM
total_memory = total_lowmem;
- lmb_enforce_memory_limit(total_lowmem);
+ lmb_enforce_memory_limit(lowmem_end_addr);
lmb_analyze();
#endif /* CONFIG_HIGHMEM */
}
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index abeb0eb..f18b203 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -75,6 +75,8 @@
/* max amount of RAM to use */
unsigned long __max_memory;
+phys_addr_t memstart_addr;
+
void free_initmem(void)
{
unsigned long addr;
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 60c019c..9c10b14 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -217,9 +217,11 @@ void __init do_init_bootmem(void)
unsigned long total_pages;
int boot_mapsize;
- max_pfn = total_pages = lmb_end_of_DRAM() >> PAGE_SHIFT;
+ max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT;
+ total_pages = (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT;
#ifdef CONFIG_HIGHMEM
total_pages = total_lowmem >> PAGE_SHIFT;
+ max_low_pfn = lowmem_end_addr >> PAGE_SHIFT;
#endif
/*
@@ -245,18 +247,18 @@ void __init do_init_bootmem(void)
* present.
*/
#ifdef CONFIG_HIGHMEM
- free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
+ free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT);
/* reserve the sections we're already using */
for (i = 0; i < lmb.reserved.cnt; i++) {
unsigned long addr = lmb.reserved.region[i].base +
lmb_size_bytes(&lmb.reserved, i) - 1;
- if (addr < total_lowmem)
+ if (addr < lowmem_end_addr)
reserve_bootmem(lmb.reserved.region[i].base,
lmb_size_bytes(&lmb.reserved, i),
BOOTMEM_DEFAULT);
- else if (lmb.reserved.region[i].base < total_lowmem) {
- unsigned long adjusted_size = total_lowmem -
+ else if (lmb.reserved.region[i].base < lowmem_end_addr) {
+ unsigned long adjusted_size = lowmem_end_addr -
lmb.reserved.region[i].base;
reserve_bootmem(lmb.reserved.region[i].base,
adjusted_size, BOOTMEM_DEFAULT);
@@ -326,7 +328,7 @@ void __init paging_init(void)
(top_of_ram - total_ram) >> 20);
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
#ifdef CONFIG_HIGHMEM
- max_zone_pfns[ZONE_DMA] = total_lowmem >> PAGE_SHIFT;
+ max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT;
max_zone_pfns[ZONE_HIGHMEM] = top_of_ram >> PAGE_SHIFT;
#else
max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
@@ -381,7 +383,7 @@ void __init mem_init(void)
{
unsigned long pfn, highmem_mapnr;
- highmem_mapnr = total_lowmem >> PAGE_SHIFT;
+ highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;
for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
struct page *page = pfn_to_page(pfn);
if (lmb_is_reserved(pfn << PAGE_SHIFT))
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h
index 5bc11f5..67477e7 100644
--- a/arch/powerpc/mm/mmu_decl.h
+++ b/arch/powerpc/mm/mmu_decl.h
@@ -52,6 +52,7 @@ extern unsigned long __initial_memory_limit;
extern unsigned long total_memory;
extern unsigned long total_lowmem;
extern phys_addr_t memstart_addr;
+extern phys_addr_t lowmem_end_addr;
/* ...and now those things that may be slightly different between processor
* architectures. -- Dan
--
1.5.4.1
^ permalink raw reply related
* Re: [RESEND] [PATCH 1/2 v2] [OF] Add of_device_is_available function
From: Sean MacLennan @ 2008-03-25 4:47 UTC (permalink / raw)
To: linuxppc-dev
In-Reply-To: <18407.37606.990271.551578@cargo.ozlabs.ibm.com>
On Mon, 24 Mar 2008 22:39:18 +1100
"Paul Mackerras" <paulus@samba.org> wrote:
> The second test will succeed for anything that starts with "ok", so
> the first test is redundant. I suspect you want strcmp instead of
> strncmp in both tests.
I like the strncmp(status, "ok", 2). Then you can have a status of
okey-dokey ;)
Cheers,
Sean
^ permalink raw reply
* Re: [PATCH 1/2 v2] [POWERPC] Add PPC4xx L2-cache support (440GX)
From: Stefan Roese @ 2008-03-25 6:21 UTC (permalink / raw)
To: Josh Boyer; +Cc: linuxppc-dev
In-Reply-To: <20080324083957.2945077c@zod.rchland.ibm.com>
On Monday 24 March 2008, Josh Boyer wrote:
> > diff --git a/arch/powerpc/sysdev/ppc4xx_soc.c
> > b/arch/powerpc/sysdev/ppc4xx_soc.c new file mode 100644
> > index 0000000..4847555
> > --- /dev/null
> > +++ b/arch/powerpc/sysdev/ppc4xx_soc.c
> > @@ -0,0 +1,178 @@
> > +/*
> > + * IBM/AMCC PPC4xx SoC setup code
> > + *
> > + * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
> > + *
> > + * L2 cache routines cloned from arch/ppc/syslib/ibm440gx_common.c whi=
ch
> > is: + * Eugene Surovegin <eugene.surovegin@zultys.com> or
> > <ebs@ebshome.net> + * Copyright (c) 2003 - 2006 Zultys Technologies
> > + *
> > + * This program is free software; you can redistribute it and/or modi=
fy
> > 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 <linux/stddef.h>
> > +#include <linux/kernel.h>
> > +#include <linux/init.h>
> > +#include <linux/errno.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/irq.h>
> > +#include <linux/of_platform.h>
> > +
> > +#include <asm/dcr.h>
> > +#include <asm/dcr-regs.h>
> > +
> > +static u32 dcrbase;
>
> If this file is really intended to have other miscellaneous stuff added
> to it, perhaps this variable should be renamed l2_dcrbase. I know it's
> minor, so perhaps we can wait until something else gets added.
Right. I'll change this with the next version.
> > +
> > +/*
> > + * L2-cache
> > + */
> > +
> > +/* Issue L2C diagnostic command */
> > +static inline u32 l2c_diag(u32 addr)
> > +{
> > + mtdcr(dcrbase + DCRN_L2C0_ADDR, addr);
> > + mtdcr(dcrbase + DCRN_L2C0_CMD, L2C_CMD_DIAG);
> > + while (!(mfdcr(dcrbase + DCRN_L2C0_SR) & L2C_SR_CC))
> > + ;
> > +
> > + return mfdcr(dcrbase + DCRN_L2C0_DATA);
> > +}
> > +
> > +static irqreturn_t l2c_error_handler(int irq, void *dev)
> > +{
> > + u32 sr =3D mfdcr(dcrbase + DCRN_L2C0_SR);
> > +
> > + if (sr & L2C_SR_CPE) {
> > + /* Read cache trapped address */
> > + u32 addr =3D l2c_diag(0x42000000);
>
> What is this magical hex number?
I have to admit that I didn't check. As mentioned in the commit log, most o=
f=20
this L2 cache code is copied directly from arch/ppc done by Eugene Surovegi=
n.=20
=46rom my point of view, the comment right above the line should be enough.=
=20
Especially since this "magical hex number" isn't used anywhere else in the=
=20
code. But I could introduce a define for this. Please give me a short note =
if=20
you think it is necessary.
> > + printk(KERN_EMERG "L2C: Cache Parity Error, addr[16:26] =3D 0x%08x\n=
",
> > + addr);
> > + }
> > + if (sr & L2C_SR_TPE) {
> > + /* Read tag trapped address */
> > + u32 addr =3D l2c_diag(0x82000000) >> 16;
>
> And here?
Same comment as above.
> > + printk(KERN_EMERG "L2C: Tag Parity Error, addr[16:26] =3D 0x%08x\n",
> > + addr);
> > + }
> > +
> > + /* Clear parity errors */
> > + if (sr & (L2C_SR_CPE | L2C_SR_TPE)){
> > + mtdcr(dcrbase + DCRN_L2C0_ADDR, 0);
> > + mtdcr(dcrbase + DCRN_L2C0_CMD, L2C_CMD_CCP | L2C_CMD_CTE);
> > + } else {
> > + printk(KERN_EMERG "L2C: LRU error\n");
> > + }
> > +
> > + return IRQ_HANDLED;
> > +}
> > +
> > +static int __init ppc4xx_l2c_probe(void)
> > +{
> > + struct device_node *np;
> > + u32 r;
> > + unsigned long flags;
> > + int irq;
> > + const u32 *dcrreg;
> > + u32 dcrbase_isram;
> > + int len;
> > +
> > + np =3D of_find_compatible_node(np, NULL, "ibm,l2-cache");
> > + if (!np)
> > + return 0;
> > +
> > + /* Map DCRs */
> > + dcrreg =3D of_get_property(np, "dcr-reg", &len);
> > + if (!dcrreg || (len !=3D 4 * sizeof(u32))) {
> > + printk(KERN_ERR "%s: Can't get DCR register base !",
> > + np->full_name);
> > + of_node_put(np);
> > + return -ENODEV;
> > + }
> > + dcrbase_isram =3D dcrreg[0];
> > + dcrbase =3D dcrreg[2];
> > +
> > + /* Get and map irq number from device tree */
> > + irq =3D irq_of_parse_and_map(np, 0);
> > + if (irq =3D=3D NO_IRQ) {
> > + printk(KERN_ERR "irq_of_parse_and_map failed\n");
> > + of_node_put(np);
> > + return -ENODEV;
> > + }
> > +
> > + /* Install error handler */
> > + if (request_irq(irq, l2c_error_handler, IRQF_DISABLED, "L2C", 0) < 0)=
{
> > + printk(KERN_ERR "Cannot install L2C error handler"
> > + ", cache is not enabled\n");
> > + of_node_put(np);
> > + return -ENODEV;
> > + }
> > +
> > + local_irq_save(flags);
> > + asm volatile ("sync" ::: "memory");
>
> Perhaps just call iosync() for these instead of the open coded asm
> volatile stuff?
With Ben's comments, I'll leave it unchanged.
> > +
> > + /* Disable SRAM */
> > + mtdcr(dcrbase_isram + DCRN_SRAM0_DPC,
> > + mfdcr(dcrbase_isram + DCRN_SRAM0_DPC) & ~SRAM_DPC_ENABLE);
> > + mtdcr(dcrbase_isram + DCRN_SRAM0_SB0CR,
> > + mfdcr(dcrbase_isram + DCRN_SRAM0_SB0CR) & ~SRAM_SBCR_BU_MASK);
> > + mtdcr(dcrbase_isram + DCRN_SRAM0_SB1CR,
> > + mfdcr(dcrbase_isram + DCRN_SRAM0_SB1CR) & ~SRAM_SBCR_BU_MASK);
> > + mtdcr(dcrbase_isram + DCRN_SRAM0_SB2CR,
> > + mfdcr(dcrbase_isram + DCRN_SRAM0_SB2CR) & ~SRAM_SBCR_BU_MASK);
> > + mtdcr(dcrbase_isram + DCRN_SRAM0_SB3CR,
> > + mfdcr(dcrbase_isram + DCRN_SRAM0_SB3CR) & ~SRAM_SBCR_BU_MASK);
> > +
> > + /* Enable L2_MODE without ICU/DCU */
> > + r =3D mfdcr(dcrbase + DCRN_L2C0_CFG) &
> > + ~(L2C_CFG_ICU | L2C_CFG_DCU | L2C_CFG_SS_MASK);
> > + r |=3D L2C_CFG_L2M | L2C_CFG_SS_256;
> > + mtdcr(dcrbase + DCRN_L2C0_CFG, r);
> > +
> > + mtdcr(dcrbase + DCRN_L2C0_ADDR, 0);
> > +
> > + /* Hardware Clear Command */
> > + mtdcr(dcrbase + DCRN_L2C0_CMD, L2C_CMD_HCC);
> > + while (!(mfdcr(dcrbase + DCRN_L2C0_SR) & L2C_SR_CC))
> > + ;
> > +
> > + /* Clear Cache Parity and Tag Errors */
> > + mtdcr(dcrbase + DCRN_L2C0_CMD, L2C_CMD_CCP | L2C_CMD_CTE);
> > +
> > + /* Enable 64G snoop region starting at 0 */
> > + r =3D mfdcr(dcrbase + DCRN_L2C0_SNP0) &
> > + ~(L2C_SNP_BA_MASK | L2C_SNP_SSR_MASK);
> > + r |=3D L2C_SNP_SSR_32G | L2C_SNP_ESR;
> > + mtdcr(dcrbase + DCRN_L2C0_SNP0, r);
> > +
> > + r =3D mfdcr(dcrbase + DCRN_L2C0_SNP1) &
> > + ~(L2C_SNP_BA_MASK | L2C_SNP_SSR_MASK);
> > + r |=3D 0x80000000 | L2C_SNP_SSR_32G | L2C_SNP_ESR;
> > + mtdcr(dcrbase + DCRN_L2C0_SNP1, r);
> > +
> > + asm volatile ("sync" ::: "memory");
> > +
> > + /* Enable ICU/DCU ports */
> > + r =3D mfdcr(dcrbase + DCRN_L2C0_CFG);
> > + r &=3D ~(L2C_CFG_DCW_MASK | L2C_CFG_PMUX_MASK | L2C_CFG_PMIM
> > + | L2C_CFG_TPEI | L2C_CFG_CPEI | L2C_CFG_NAM | L2C_CFG_NBRM);
> > + r |=3D L2C_CFG_ICU | L2C_CFG_DCU | L2C_CFG_TPC | L2C_CFG_CPC |
> > L2C_CFG_FRAN + | L2C_CFG_CPIM | L2C_CFG_TPIM | L2C_CFG_LIM |
> > L2C_CFG_SMCM;
> > +
> > + /* Check for 460EX/GT special handling */
> > + if (of_device_is_compatible(np, "ibm,l2-cache-460ex"))
> > + r |=3D L2C_CFG_RDBW;
> > +
> > + mtdcr(dcrbase + DCRN_L2C0_CFG, r);
> > +
> > + asm volatile ("sync; isync" ::: "memory");
> > + local_irq_restore(flags);
> > +
> > + printk(KERN_INFO "256k L2-cache enabled\n");
>
> Should the cache size be derived from the device tree?
Right, we should probably do this. Even though currently there doesn't seem=
to=20
be a 4xx with a different L2 cache size than 256k.
Best regards,
Stefan
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox