Caching in the MPC107
Adrian Cox
adrian at humboldt.co.uk
Wed Sep 11 22:52:23 EST 2002
On Wed, 2002-09-11 at 00:33, Paul Mackerras wrote:
> Adrian Cox writes:
> > My current thinking is to produce a patch which introduces a new option:
> > CONFIG_CACHING_HOSTBRIDGE which boards combining the MPC107 and the
> > MPC7450 can set. This will probably be needed for Motorola's Valis or
> > Gyrus PMCs.
>
> Hmmm, it would be better to have the code just do the right thing on
> each platform. We could for instance have platform_init set a flag to
> say "we have a caching hostbridge" and have mapin_ram and
> bat_mapin_ram set the M bit if that flag is set.
I think you're right so long as all the memory is mapped at boot time.
this should be fine for the MPC107, as that can't support highmem. Once
somebody produces a caching PCI bridge which supports more memory, we'll
have to change the flags elsewhere. Probably in create_hpte().
Is the patch below the sort of thing you're thinking of?
- Adrian Cox
http://www.humboldt.co.uk/
===== arch/ppc/kernel/cputable.c 1.11 vs edited =====
--- 1.11/arch/ppc/kernel/cputable.c Wed Jun 5 00:24:08 2002
+++ edited/arch/ppc/kernel/cputable.c Wed Sep 11 12:55:00 2002
@@ -212,7 +212,7 @@
0xffffffff, 0x80000200, "7450",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
- CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450,
+ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_CACHE_SHARED,
COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC,
32, 32,
__setup_cpu_7450
@@ -221,7 +221,7 @@
0xffffffff, 0x80000201, "7450",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_CAN_NAP |
CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
- CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450,
+ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_CACHE_SHARED,
COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC,
32, 32,
__setup_cpu_7450
@@ -230,7 +230,7 @@
0xffff0000, 0x80000000, "7450",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_CAN_NAP |
CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
- CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450,
+ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_CACHE_SHARED,
COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC,
32, 32,
__setup_cpu_7450_23
@@ -239,7 +239,7 @@
0xffff0000, 0x80010000, "7455",
CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_CAN_NAP |
CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR |
- CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450,
+ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_CACHE_SHARED,
COMMON_PPC | PPC_FEATURE_HAS_ALTIVEC,
32, 32,
__setup_cpu_7455
===== arch/ppc/mm/pgtable.c 1.18 vs edited =====
--- 1.18/arch/ppc/mm/pgtable.c Sat Apr 6 22:06:49 2002
+++ edited/arch/ppc/mm/pgtable.c Wed Sep 11 11:31:09 2002
@@ -63,6 +63,8 @@
#endif
extern char etext[], _stext[];
+int extra_page_flags __initdata;
+
#ifdef HAVE_BATS
extern unsigned long v_mapped_by_bats(unsigned long va);
@@ -371,6 +373,7 @@
#endif /* CONFIG_PPC_STD_MMU */
#endif /* CONFIG_KGDB || CONFIG_XMON */
map_page(v, p, f);
+ f |= extra_page_flags;
v += PAGE_SIZE;
p += PAGE_SIZE;
}
===== arch/ppc/mm/ppc_mmu.c 1.9 vs edited =====
--- 1.9/arch/ppc/mm/ppc_mmu.c Fri Jan 25 15:41:09 2002
+++ edited/arch/ppc/mm/ppc_mmu.c Wed Sep 11 11:29:29 2002
@@ -91,12 +91,13 @@
unsigned long tot, done;
tot = total_lowmem;
- setbat(2, KERNELBASE, PPC_MEMSTART, bat2, _PAGE_KERNEL);
+ setbat(2, KERNELBASE, PPC_MEMSTART, bat2,
+ _PAGE_KERNEL | extra_page_flags);
done = (unsigned long)bat_addrs[2].limit - KERNELBASE + 1;
if ((done < tot) && !bat_addrs[3].limit && bat3) {
tot -= done;
setbat(3, KERNELBASE+done, PPC_MEMSTART+done, bat3,
- _PAGE_KERNEL);
+ _PAGE_KERNEL | extra_page_flags);
}
}
===== arch/ppc/platforms/sandpoint_setup.c 1.24 vs edited =====
--- 1.24/arch/ppc/platforms/sandpoint_setup.c Mon Jun 3 21:20:31 2002
+++ edited/arch/ppc/platforms/sandpoint_setup.c Wed Sep 11 13:01:12 2002
@@ -91,6 +91,7 @@
#include <asm/bootinfo.h>
#include <asm/mpc10x.h>
#include <asm/pci-bridge.h>
+#include <asm/cputable.h>
#include "sandpoint.h"
@@ -598,6 +599,9 @@
/* Map in board regs, etc. */
sandpoint_set_bat();
+ if (cur_cpu_spec[0]->cpu_features & CPU_FTR_CACHE_SHARED)
+ extra_page_flags = _PAGE_COHERENT;
+
isa_io_base = MPC10X_MAPB_ISA_IO_BASE;
isa_mem_base = MPC10X_MAPB_ISA_MEM_BASE;
pci_dram_offset = MPC10X_MAPB_DRAM_OFFSET;
===== include/asm-ppc/cputable.h 1.7 vs edited =====
--- 1.7/include/asm-ppc/cputable.h Wed Mar 20 22:04:09 2002
+++ edited/include/asm-ppc/cputable.h Wed Sep 11 12:54:07 2002
@@ -69,6 +69,7 @@
#define CPU_FTR_HPTE_TABLE 0x00000200
#define CPU_FTR_CAN_NAP 0x00000400
#define CPU_FTR_L3CR 0x00000800
+#define CPU_FTR_CACHE_SHARED 0x00001000
#ifdef __ASSEMBLY__
===== include/asm-ppc/pgtable.h 1.49 vs edited =====
--- 1.49/include/asm-ppc/pgtable.h Mon Jun 3 03:36:27 2002
+++ edited/include/asm-ppc/pgtable.h Wed Sep 11 13:01:15 2002
@@ -112,6 +112,12 @@
extern unsigned long va_to_phys(unsigned long address);
extern pte_t *va_to_pte(unsigned long address);
extern unsigned long ioremap_bot, ioremap_base;
+
+/* Some boards require extra page flags (for example, because there is
+ another caching bus master in the system). These flags will be ored into
+ the page flags when memory is initially mapped. */
+extern int extra_page_flags;
+
#endif /* __ASSEMBLY__ */
/*
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list