Port-powerpc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: evbppc reserved-tlb cleanup
Hi Jachym Holecek,
http://mail-index.netbsd.org/port-powerpc/2006/09/24/0000.html
http://mail-index.netbsd.org/port-powerpc/2006/09/24/0006.html
These two patch is not enough for OpenBlockS266.
I've added following fixes,
- change arch/powerpc/ibm4xx/openbios/locore.S too for OBS266
- use OBS405_CONADDR instead of 0xef000000
- don't call consinit() in obs2{00,66}_machdep.c because consinit() is
already called in ibm4xx_init() (but I'm not sure which place is
good)
- do bus_space_map() to get bus space handle in emacs_attach() (!!!)
then OpenBlockS266 boots correctly.
Attached patch is your 2 patch + my fixes. s/0x74000000/BASE_ISA/ is not
included. (sorry)
--
FUKAUMI Naoki
diff -ur src.orig/sys/arch/evbppc/explora/machdep.c
src/sys/arch/evbppc/explora/machdep.c
--- src.orig/sys/arch/evbppc/explora/machdep.c 2006-09-19 07:05:47.000000000
+0900
+++ src/sys/arch/evbppc/explora/machdep.c 2006-10-06 13:49:44.000000000
+0900
@@ -134,26 +134,6 @@
#endif /* DDB */
};
-static void
-set_tlb(int idx, u_int addr, u_int flags)
-{
- u_int lo, hi;
-
- addr &= ~(TLB_PG_SIZE-1);
-
- lo = addr | TLB_EX | TLB_WR | flags;
-#ifdef PPC_4XX_NOCACHE
- lo |= TLB_I;
-#endif
- hi = addr | TLB_VALID | TLB_PG_16M;
-
- __asm volatile(
- " tlbwe %1,%0,1 \n"
- " tlbwe %2,%0,0 \n"
- " sync \n"
- : : "r" (idx), "r" (lo), "r" (hi) );
-}
-
/*
* Install a trap vector. We cannot use memcpy because the
* destination may be zero.
@@ -174,11 +154,9 @@
bootstrap(u_int startkernel, u_int endkernel)
{
u_int i, j, t, br[4];
- u_int ntlb, maddr, msize, size;
+ u_int maddr, msize, size;
struct cpu_info * const ci = &cpu_info[0];
- consinit();
-
br[0] = mfdcr(DCR_BR4);
br[1] = mfdcr(DCR_BR5);
br[2] = mfdcr(DCR_BR6);
@@ -198,14 +176,6 @@
size = maddr+msize;
}
-#ifdef COM_IS_CONSOLE
- ntlb = TLB_NRESERVED-1;
-#else
- ntlb = TLB_NRESERVED-2;
-#endif
- if (size > ntlb*TLB_PG_SIZE)
- size = ntlb*TLB_PG_SIZE;
-
phys_mem[0].start = 0;
phys_mem[0].size = size & ~PGOFSET;
avail_mem[0].start = startkernel;
@@ -214,7 +184,7 @@
__asm volatile(
" mtpid %0 \n"
" sync \n"
- : : "r" (1) );
+ : : "r" (KERNEL_PID) );
/*
* Setup initial tlbs.
@@ -224,15 +194,18 @@
t = 0;
for (maddr = 0; maddr < phys_mem[0].size; maddr += TLB_PG_SIZE)
- set_tlb(t++, maddr, 0);
+ ppc4xx_tlb_reserve(maddr, maddr, TLB_PG_SIZE, TLB_EX);
-#ifdef COM_IS_CONSOLE
- set_tlb(t++, BASE_COM, TLB_I | TLB_G);
-#else
- set_tlb(t++, BASE_FB, TLB_I | TLB_G);
- set_tlb(t++, BASE_FB2, TLB_I | TLB_G);
+ /* Map PCKBC, PCKBC2, COM, LPT. */
+ ppc4xx_tlb_reserve(0x74000000, 0x74000000, TLB_PG_SIZE, TLB_I | TLB_G);
+
+#ifndef COM_IS_CONSOLE
+ ppc4xx_tlb_reserve(BASE_FB, BASE_FB, TLB_PG_SIZE, TLB_I | TLB_G);
+ ppc4xx_tlb_reserve(BASE_FB2, BASE_FB2, TLB_PG_SIZE, TLB_I | TLB_G);
#endif
+ consinit();
+
/* Disable all external interrupts */
mtdcr(DCR_EXIER, 0);
diff -ur src.orig/sys/arch/evbppc/obs405/obs200_locore.S
src/sys/arch/evbppc/obs405/obs200_locore.S
--- src.orig/sys/arch/evbppc/obs405/obs200_locore.S 2006-07-01
02:54:50.000000000 +0900
+++ src/sys/arch/evbppc/obs405/obs200_locore.S 2006-10-06 13:48:19.000000000
+0900
@@ -190,59 +190,11 @@
stw %r8,0(%r7)
#endif
- /*
- * Set up TLB entry to cover kernel addresses.
- *
- * XXX: Skip TLB 0 for now, due to unresolved TLB 0 replacement
- * and hard hangs
- */
- li %r0,1
+ /* Set kernel MMU context. */
+ li %r0,KERNEL_PID
mtpid %r0
sync
- li %r0,0
-#ifdef PPC_4XX_NOCACHE
- li %r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- li %r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- li %r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-
-#if 1
- /* Damn. Have to be able to access all real memory.... Hardcode for 32M
for now. */
- li %r0,1
- lis %r4,0x01000000@h
- ori %r3,%r4,0
-#ifdef PPC_4XX_NOCACHE
- addi %r4,%r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- addi %r4,%r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- addi %r3,%r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-#endif
-
- /* set up a TLB mapping to cover uart0 */
- lis %r3,0xef000000@h /* Load the virtual address */
- ori %r4,%r3,0 /* Load the physical address */
-
- clrrwi %r4,%r4,10 /* Mask off the real page number */
- /* write, execute, cache inhibit, guarded */
- ori %r4,%r4,(TLB_WR|TLB_EX|TLB_I|TLB_G)
-
- clrrwi %r3,%r3,10 /* Mask off the effective page number */
- ori %r3,%r3,(TLB_VALID|TLB_PG_16M)
-
- li %r0,2
-
- tlbwe %r4,%r0,1 /* Load the data portion of the entry */
- tlbwe %r3,%r0,0 /* Load the tag portion of the entry */
-
- /* END of TLB setup */
-
INIT_CPUINFO(8,1,9,0)
mr %r4,%r8
diff -ur src.orig/sys/arch/evbppc/obs405/obs200_machdep.c
src/sys/arch/evbppc/obs405/obs200_machdep.c
--- src.orig/sys/arch/evbppc/obs405/obs200_machdep.c 2006-03-30
02:50:33.000000000 +0900
+++ src/sys/arch/evbppc/obs405/obs200_machdep.c 2006-10-06 15:06:51.000000000
+0900
@@ -97,6 +97,9 @@
#include "ksyms.h"
+
+#define TLB_PG_SIZE (16*1024*1024)
+
/*
* Global variables used here and there
*/
@@ -117,6 +120,7 @@
{
u_int32_t pllmode;
u_int32_t psr;
+ vaddr_t va;
u_int memsize;
/* Disable all external interrupts */
@@ -128,16 +132,18 @@
bios_board_init(info_block, startkernel);
memsize = bios_board_memsize_get();
+ /* Linear map whole physmem. */
+ for (va = 0; va < memsize; va += TLB_PG_SIZE)
+ ppc4xx_tlb_reserve(va, va, TLB_PG_SIZE, TLB_EX);
+
+ /* Map console right after RAM. */
+ ppc4xx_tlb_reserve(OBS405_CONADDR, va, TLB_PG_SIZE, TLB_I | TLB_G);
+
/* Initialize IBM405GPr CPU */
ibm40x_memsize_init(memsize, startkernel);
ibm4xx_init((void (*)(void))ext_intr);
/*
- * Initialize console.
- */
- consinit();
-
- /*
* Set the page size.
*/
uvm_setpagesize();
diff -ur src.orig/sys/arch/evbppc/obs405/obs266_machdep.c
src/sys/arch/evbppc/obs405/obs266_machdep.c
--- src.orig/sys/arch/evbppc/obs405/obs266_machdep.c 2006-03-30
02:50:33.000000000 +0900
+++ src/sys/arch/evbppc/obs405/obs266_machdep.c 2006-10-06 14:07:37.000000000
+0900
@@ -97,6 +97,9 @@
#include "ksyms.h"
+
+#define TLB_PG_SIZE (16*1024*1024)
+
/*
* Global variables used here and there
*/
@@ -115,6 +118,7 @@
void
initppc(u_int startkernel, u_int endkernel, char *args, void *info_block)
{
+ vaddr_t va;
u_int memsize;
/* Disable all external interrupts */
@@ -124,16 +128,18 @@
openbios_board_init(info_block, startkernel);
memsize = openbios_board_memsize_get();
+ /* Linear map whole physmem */
+ for (va = 0; va < memsize; va += TLB_PG_SIZE)
+ ppc4xx_tlb_reserve(va, va, TLB_PG_SIZE, TLB_EX);
+
+ /* Map console just after RAM */
+ ppc4xx_tlb_reserve(OBS405_CONADDR, va, TLB_PG_SIZE, TLB_I | TLB_G);
+
/* Initialize IBM405GPr CPU */
ibm40x_memsize_init(memsize, startkernel);
ibm4xx_init((void (*)(void))ext_intr);
/*
- * Initialize console.
- */
- consinit();
-
- /*
* Set the page size.
*/
uvm_setpagesize();
diff -ur src.orig/sys/arch/evbppc/walnut/machdep.c
src/sys/arch/evbppc/walnut/machdep.c
--- src.orig/sys/arch/evbppc/walnut/machdep.c 2006-07-13 16:36:04.000000000
+0900
+++ src/sys/arch/evbppc/walnut/machdep.c 2006-10-06 13:48:19.000000000
+0900
@@ -115,6 +115,9 @@
#include <ddb/db_extern.h>
#endif
+
+#define TLB_PG_SIZE (16*1024*1024)
+
/*
* Global variables used here and there
*/
@@ -171,6 +174,7 @@
#ifdef IPKDB
extern int ipkdblow, ipkdbsize;
#endif
+ vaddr_t va;
int exc, dbcr0;
struct cpu_info * const ci = curcpu();
@@ -191,6 +195,13 @@
availmemr[0].start = startkernel;
availmemr[0].size = board_data.mem_size - availmemr[0].start;
+ /* Linear map whole physmem */
+ for (va = 0; va < board_data.mem_size; va += TLB_PG_SIZE)
+ ppc4xx_tlb_reserve(va, va, TLB_PG_SIZE, TLB_EX);
+
+ /* Map console just after RAM */
+ ppc4xx_tlb_reserve(0xef000000, va, TLB_PG_SIZE, TLB_I | TLB_G);
+
/*
* Initialize lwp0 and current pcb and pmap pointers.
*/
diff -ur src.orig/sys/arch/evbppc/walnut/walnut_start.S
src/sys/arch/evbppc/walnut/walnut_start.S
--- src.orig/sys/arch/evbppc/walnut/walnut_start.S 2006-07-01
02:54:51.000000000 +0900
+++ src/sys/arch/evbppc/walnut/walnut_start.S 2006-10-06 13:48:19.000000000
+0900
@@ -192,59 +192,11 @@
stw %r8,0(%r7)
#endif
- /*
- * Set up TLB entry to cover kernel addresses.
- *
- * XXX: Skip TLB 0 for now, due to unresolved TLB 0 replacement
- * and hard hangs
- */
- li %r0,1
+ /* Set kernel MMU context. */
+ li %r0,KERNEL_PID
mtpid %r0
sync
- li %r0,0
-#ifdef PPC_4XX_NOCACHE
- li %r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- li %r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- li %r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-
-#if 1
- /* Damn. Have to be able to access all real memory.... Hardcode for 32M
for now. */
- li %r0,1
- lis %r4,0x01000000@h
- ori %r3,%r4,0
-#ifdef PPC_4XX_NOCACHE
- addi %r4,%r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- addi %r4,%r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- addi %r3,%r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-#endif
-
- /* set up a TLB mapping to cover uart0 */
- lis %r3,0xef000000@h /* Load the virtual address */
- ori %r4,%r3,0 /* Load the physical address */
-
- clrrwi %r4,%r4,10 /* Mask off the real page number */
- /* write, execute, cache inhibit, guarded */
- ori %r4,%r4,(TLB_WR|TLB_EX|TLB_I|TLB_G)
-
- clrrwi %r3,%r3,10 /* Mask off the effective page number */
- ori %r3,%r3,(TLB_VALID|TLB_PG_16M)
-
- li %r0,2
-
- tlbwe %r4,%r0,1 /* Load the data portion of the entry */
- tlbwe %r3,%r0,0 /* Load the tag portion of the entry */
-
- /* END of TLB setup */
-
INIT_CPUINFO(8,1,9,0)
mr %r4,%r8
diff -ur src.orig/sys/arch/powerpc/ibm4xx/dev/emacreg.h
src/sys/arch/powerpc/ibm4xx/dev/emacreg.h
--- src.orig/sys/arch/powerpc/ibm4xx/dev/emacreg.h 2002-08-13
13:57:48.000000000 +0900
+++ src/sys/arch/powerpc/ibm4xx/dev/emacreg.h 2006-10-06 15:01:42.000000000
+0900
@@ -38,6 +38,9 @@
#ifndef _IBM4XX_EMACREG_H_
#define _IBM4XX_EMACREG_H_
+/* Number of Ethernet MAC Registers */
+#define EMAC_NREG 0x70
+
/* Ethernet MAC Registers */
#define EMAC_MR0 0x00 /* Mode Register 0 */
#define MR0_RXI 0x80000000 /* Receive MAC Idle */
diff -ur src.orig/sys/arch/powerpc/ibm4xx/dev/if_emac.c
src/sys/arch/powerpc/ibm4xx/dev/if_emac.c
--- src.orig/sys/arch/powerpc/ibm4xx/dev/if_emac.c 2006-05-06
03:04:42.000000000 +0900
+++ src/sys/arch/powerpc/ibm4xx/dev/if_emac.c 2006-10-06 15:01:52.000000000
+0900
@@ -307,8 +307,8 @@
const uint8_t *enaddr;
prop_data_t ea;
+ bus_space_map(oaa->opb_bt, oaa->opb_addr, EMAC_NREG, 0, &sc->sc_sh);
sc->sc_st = oaa->opb_bt;
- sc->sc_sh = oaa->opb_addr;
sc->sc_dmat = oaa->opb_dmat;
printf(": 405GP EMAC\n");
diff -ur src.orig/sys/arch/powerpc/ibm4xx/openbios/locore.S
src/sys/arch/powerpc/ibm4xx/openbios/locore.S
--- src.orig/sys/arch/powerpc/ibm4xx/openbios/locore.S 2005-12-11
21:18:43.000000000 +0900
+++ src/sys/arch/powerpc/ibm4xx/openbios/locore.S 2006-10-06
13:55:19.000000000 +0900
@@ -210,59 +210,11 @@
stw %r8,0(%r7)
#endif
- /*
- * Set up TLB entry to cover kernel addresses.
- *
- * XXX: Skip TLB 0 for now, due to unresolved TLB 0 replacement
- * and hard hangs
- */
- li %r0,1
+ /* Set kernel MMU context. */
+ li %r0,KERNEL_PID
mtpid %r0
sync
- li %r0,0
-#ifdef PPC_4XX_NOCACHE
- li %r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- li %r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- li %r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-
-#if 1
- /* Damn. Have to be able to access all real memory.... Hardcode for 32M
for now. */
- li %r0,1
- lis %r4,0x01000000@h
- ori %r3,%r4,0
-#ifdef PPC_4XX_NOCACHE
- addi %r4,%r4,TLB_EX|TLB_WR|TLB_I /* |TLB_W */
-#else
- addi %r4,%r4,TLB_EX|TLB_WR /* |TLB_W */
-#endif
- addi %r3,%r3,TLB_VALID|TLB_PG_16M
- tlbwe %r4,%r0,1 /* Load the data(Low) portion of the
entry */
- tlbwe %r3,%r0,0 /* Load the tag(High) portion of the
entry */
-#endif
-
- /* set up a TLB mapping to cover uart0 */
- lis %r3,0xef000000@h /* Load the virtual address */
- ori %r4,%r3,0 /* Load the physical address */
-
- clrrwi %r4,%r4,10 /* Mask off the real page number */
- /* write, execute, cache inhibit, guarded */
- ori %r4,%r4,(TLB_WR|TLB_EX|TLB_I|TLB_G)
-
- clrrwi %r3,%r3,10 /* Mask off the effective page number */
- ori %r3,%r3,(TLB_VALID|TLB_PG_16M)
-
- li %r0,2
-
- tlbwe %r4,%r0,1 /* Load the data portion of the entry */
- tlbwe %r3,%r0,0 /* Load the tag portion of the entry */
-
- /* END of TLB setup */
-
INIT_CPUINFO(8,1,9,0)
mr %r4,%r8
diff -ur src.orig/sys/arch/powerpc/ibm4xx/pmap.c
src/sys/arch/powerpc/ibm4xx/pmap.c
--- src.orig/sys/arch/powerpc/ibm4xx/pmap.c 2006-09-01 07:13:51.000000000
+0900
+++ src/sys/arch/powerpc/ibm4xx/pmap.c 2006-10-06 13:48:19.000000000 +0900
@@ -267,10 +267,6 @@
int cnt, i;
u_int s, e, sz;
- /* XXXfreza: compat, we used to statically reserve 4 entries. */
- if (tlb_nreserved == 0)
- tlb_nreserved = TLB_NRESERVED;
-
tlbnext = tlb_nreserved;
/*
@@ -1454,7 +1450,7 @@
va &= ~(rsize - 1); /* EPN */
lo = pa | TLB_WR | flags;
- hi = va | TLB_VALID | szmask | KERNEL_PID;
+ hi = va | TLB_VALID | szmask;
#ifdef PPC_4XX_NOCACHE
lo |= TLB_I;
diff -ur src.orig/sys/arch/powerpc/include/ibm4xx/tlb.h
src/sys/arch/powerpc/include/ibm4xx/tlb.h
--- src.orig/sys/arch/powerpc/include/ibm4xx/tlb.h 2006-09-01
07:13:51.000000000 +0900
+++ src/sys/arch/powerpc/include/ibm4xx/tlb.h 2006-10-06 13:48:19.000000000
+0900
@@ -109,6 +109,4 @@
#define TLB_PID_INVALID 0xFFFF
-#define TLB_NRESERVED 4 /* XXXfreza: kill. */
-
#endif /* _IBM4XX_TLB_H_ */
Home |
Main Index |
Thread Index |
Old Index