Commit 95001ee9 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

parents 63906e41 0dc46106
...@@ -33,6 +33,14 @@ config DEBUG_BOOTMEM ...@@ -33,6 +33,14 @@ config DEBUG_BOOTMEM
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
bool "Debug BOOTMEM initialization" bool "Debug BOOTMEM initialization"
config DEBUG_PAGEALLOC
bool "Page alloc debugging"
depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND
help
Unmap pages from the kernel linear mapping after free_pages().
This results in a large slowdown, but helps to find certain types
of memory corruptions.
config MCOUNT config MCOUNT
bool bool
depends on STACK_DEBUG depends on STACK_DEBUG
......
...@@ -135,6 +135,28 @@ void __init device_scan(void) ...@@ -135,6 +135,28 @@ void __init device_scan(void)
cpu_data(0).clock_tick = prom_getintdefault(cpu_node, cpu_data(0).clock_tick = prom_getintdefault(cpu_node,
"clock-frequency", "clock-frequency",
0); 0);
cpu_data(0).dcache_size = prom_getintdefault(cpu_node,
"dcache-size",
16 * 1024);
cpu_data(0).dcache_line_size =
prom_getintdefault(cpu_node, "dcache-line-size", 32);
cpu_data(0).icache_size = prom_getintdefault(cpu_node,
"icache-size",
16 * 1024);
cpu_data(0).icache_line_size =
prom_getintdefault(cpu_node, "icache-line-size", 32);
cpu_data(0).ecache_size = prom_getintdefault(cpu_node,
"ecache-size",
4 * 1024 * 1024);
cpu_data(0).ecache_line_size =
prom_getintdefault(cpu_node, "ecache-line-size", 64);
printk("CPU[0]: Caches "
"D[sz(%d):line_sz(%d)] "
"I[sz(%d):line_sz(%d)] "
"E[sz(%d):line_sz(%d)]\n",
cpu_data(0).dcache_size, cpu_data(0).dcache_line_size,
cpu_data(0).icache_size, cpu_data(0).icache_line_size,
cpu_data(0).ecache_size, cpu_data(0).ecache_line_size);
} }
#endif #endif
......
...@@ -9,17 +9,7 @@ ...@@ -9,17 +9,7 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/mmu.h> #include <asm/mmu.h>
#if PAGE_SHIFT == 13 #define VALID_SZ_BITS (_PAGE_VALID | _PAGE_SZBITS)
#define SZ_BITS _PAGE_SZ8K
#elif PAGE_SHIFT == 16
#define SZ_BITS _PAGE_SZ64K
#elif PAGE_SHIFT == 19
#define SZ_BITS _PAGE_SZ512K
#elif PAGE_SHIFT == 22
#define SZ_BITS _PAGE_SZ4MB
#endif
#define VALID_SZ_BITS (_PAGE_VALID | SZ_BITS)
#define VPTE_BITS (_PAGE_CP | _PAGE_CV | _PAGE_P ) #define VPTE_BITS (_PAGE_CP | _PAGE_CV | _PAGE_P )
#define VPTE_SHIFT (PAGE_SHIFT - 3) #define VPTE_SHIFT (PAGE_SHIFT - 3)
...@@ -163,7 +153,6 @@ sparc64_vpte_continue: ...@@ -163,7 +153,6 @@ sparc64_vpte_continue:
stxa %g4, [%g1 + %g1] ASI_DMMU ! Restore previous TAG_ACCESS stxa %g4, [%g1 + %g1] ASI_DMMU ! Restore previous TAG_ACCESS
retry ! Load PTE once again retry ! Load PTE once again
#undef SZ_BITS
#undef VALID_SZ_BITS #undef VALID_SZ_BITS
#undef VPTE_SHIFT #undef VPTE_SHIFT
#undef VPTE_BITS #undef VPTE_BITS
......
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
from_tl1_trap: from_tl1_trap:
rdpr %tl, %g5 ! For TL==3 test rdpr %tl, %g5 ! For TL==3 test
CREATE_VPTE_OFFSET1(%g4, %g6) ! Create VPTE offset CREATE_VPTE_OFFSET1(%g4, %g6) ! Create VPTE offset
be,pn %xcc, 3f ! Yep, special processing be,pn %xcc, kvmap ! Yep, special processing
CREATE_VPTE_OFFSET2(%g4, %g6) ! Create VPTE offset CREATE_VPTE_OFFSET2(%g4, %g6) ! Create VPTE offset
cmp %g5, 4 ! Last trap level? cmp %g5, 4 ! Last trap level?
be,pn %xcc, longpath ! Yep, cannot risk VPTE miss be,pn %xcc, longpath ! Yep, cannot risk VPTE miss
...@@ -83,9 +83,9 @@ from_tl1_trap: ...@@ -83,9 +83,9 @@ from_tl1_trap:
nop ! Delay-slot nop ! Delay-slot
9: stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Reload TLB 9: stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Reload TLB
retry ! Trap return retry ! Trap return
3: brlz,pt %g4, 9b ! Kernel virtual map? nop
xor %g2, %g4, %g5 ! Finish bit twiddles nop
ba,a,pt %xcc, kvmap ! Yep, go check for obp/vmalloc nop
/* DTLB ** ICACHE line 3: winfixups+real_faults */ /* DTLB ** ICACHE line 3: winfixups+real_faults */
longpath: longpath:
......
...@@ -30,159 +30,6 @@ ...@@ -30,159 +30,6 @@
.text .text
.align 32 .align 32
.globl sparc64_vpte_patchme1
.globl sparc64_vpte_patchme2
/*
* On a second level vpte miss, check whether the original fault is to the OBP
* range (note that this is only possible for instruction miss, data misses to
* obp range do not use vpte). If so, go back directly to the faulting address.
* This is because we want to read the tpc, otherwise we have no way of knowing
* the 8k aligned faulting address if we are using >8k kernel pagesize. This
* also ensures no vpte range addresses are dropped into tlb while obp is
* executing (see inherit_locked_prom_mappings() rant).
*/
sparc64_vpte_nucleus:
/* Note that kvmap below has verified that the address is
* in the range MODULES_VADDR --> VMALLOC_END already. So
* here we need only check if it is an OBP address or not.
*/
sethi %hi(LOW_OBP_ADDRESS), %g5
cmp %g4, %g5
blu,pn %xcc, sparc64_vpte_patchme1
mov 0x1, %g5
sllx %g5, 32, %g5
cmp %g4, %g5
blu,pn %xcc, obp_iaddr_patch
nop
/* These two instructions are patched by paginig_init(). */
sparc64_vpte_patchme1:
sethi %hi(0), %g5
sparc64_vpte_patchme2:
or %g5, %lo(0), %g5
/* With kernel PGD in %g5, branch back into dtlb_backend. */
ba,pt %xcc, sparc64_kpte_continue
andn %g1, 0x3, %g1 /* Finish PMD offset adjustment. */
vpte_noent:
/* Restore previous TAG_ACCESS, %g5 is zero, and we will
* skip over the trap instruction so that the top level
* TLB miss handler will thing this %g5 value is just an
* invalid PTE, thus branching to full fault processing.
*/
mov TLB_SFSR, %g1
stxa %g4, [%g1 + %g1] ASI_DMMU
done
.globl obp_iaddr_patch
obp_iaddr_patch:
/* These two instructions patched by inherit_prom_mappings(). */
sethi %hi(0), %g5
or %g5, %lo(0), %g5
/* Behave as if we are at TL0. */
wrpr %g0, 1, %tl
rdpr %tpc, %g4 /* Find original faulting iaddr */
srlx %g4, 13, %g4 /* Throw out context bits */
sllx %g4, 13, %g4 /* g4 has vpn + ctx0 now */
/* Restore previous TAG_ACCESS. */
mov TLB_SFSR, %g1
stxa %g4, [%g1 + %g1] ASI_IMMU
/* Get PMD offset. */
srlx %g4, 23, %g6
and %g6, 0x7ff, %g6
sllx %g6, 2, %g6
/* Load PMD, is it valid? */
lduwa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
sllx %g5, 11, %g5
/* Get PTE offset. */
srlx %g4, 13, %g6
and %g6, 0x3ff, %g6
sllx %g6, 3, %g6
/* Load PTE. */
ldxa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brgez,pn %g5, longpath
nop
/* TLB load and return from trap. */
stxa %g5, [%g0] ASI_ITLB_DATA_IN
retry
.globl obp_daddr_patch
obp_daddr_patch:
/* These two instructions patched by inherit_prom_mappings(). */
sethi %hi(0), %g5
or %g5, %lo(0), %g5
/* Get PMD offset. */
srlx %g4, 23, %g6
and %g6, 0x7ff, %g6
sllx %g6, 2, %g6
/* Load PMD, is it valid? */
lduwa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
sllx %g5, 11, %g5
/* Get PTE offset. */
srlx %g4, 13, %g6
and %g6, 0x3ff, %g6
sllx %g6, 3, %g6
/* Load PTE. */
ldxa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brgez,pn %g5, longpath
nop
/* TLB load and return from trap. */
stxa %g5, [%g0] ASI_DTLB_DATA_IN
retry
/*
* On a first level data miss, check whether this is to the OBP range (note
* that such accesses can be made by prom, as well as by kernel using
* prom_getproperty on "address"), and if so, do not use vpte access ...
* rather, use information saved during inherit_prom_mappings() using 8k
* pagesize.
*/
.align 32
kvmap:
sethi %hi(MODULES_VADDR), %g5
cmp %g4, %g5
blu,pn %xcc, longpath
mov (VMALLOC_END >> 24), %g5
sllx %g5, 24, %g5
cmp %g4, %g5
bgeu,pn %xcc, longpath
nop
kvmap_check_obp:
sethi %hi(LOW_OBP_ADDRESS), %g5
cmp %g4, %g5
blu,pn %xcc, kvmap_vmalloc_addr
mov 0x1, %g5
sllx %g5, 32, %g5
cmp %g4, %g5
blu,pn %xcc, obp_daddr_patch
nop
kvmap_vmalloc_addr:
/* If we get here, a vmalloc addr was accessed, load kernel VPTE. */
ldxa [%g3 + %g6] ASI_N, %g5
brgez,pn %g5, longpath
nop
/* PTE is valid, load into TLB and return from trap. */
stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Reload TLB
retry
/* This is trivial with the new code... */ /* This is trivial with the new code... */
.globl do_fpdis .globl do_fpdis
do_fpdis: do_fpdis:
...@@ -525,14 +372,13 @@ cheetah_plus_patch_fpdis: ...@@ -525,14 +372,13 @@ cheetah_plus_patch_fpdis:
* *
* DATA 0: [low 32-bits] Address of function to call, jmp to this * DATA 0: [low 32-bits] Address of function to call, jmp to this
* [high 32-bits] MMU Context Argument 0, place in %g5 * [high 32-bits] MMU Context Argument 0, place in %g5
* DATA 1: Address Argument 1, place in %g6 * DATA 1: Address Argument 1, place in %g1
* DATA 2: Address Argument 2, place in %g7 * DATA 2: Address Argument 2, place in %g7
* *
* With this method we can do most of the cross-call tlb/cache * With this method we can do most of the cross-call tlb/cache
* flushing very quickly. * flushing very quickly.
* *
* Current CPU's IRQ worklist table is locked into %g1, * Current CPU's IRQ worklist table is locked into %g6, don't touch.
* don't touch.
*/ */
.text .text
.align 32 .align 32
...@@ -1006,13 +852,14 @@ cheetah_plus_dcpe_trap_vector: ...@@ -1006,13 +852,14 @@ cheetah_plus_dcpe_trap_vector:
nop nop
do_cheetah_plus_data_parity: do_cheetah_plus_data_parity:
ba,pt %xcc, etrap rdpr %pil, %g2
wrpr %g0, 15, %pil
ba,pt %xcc, etrap_irq
rd %pc, %g7 rd %pc, %g7
mov 0x0, %o0 mov 0x0, %o0
call cheetah_plus_parity_error call cheetah_plus_parity_error
add %sp, PTREGS_OFF, %o1 add %sp, PTREGS_OFF, %o1
ba,pt %xcc, rtrap ba,a,pt %xcc, rtrap_irq
clr %l6
cheetah_plus_dcpe_trap_vector_tl1: cheetah_plus_dcpe_trap_vector_tl1:
membar #Sync membar #Sync
...@@ -1036,13 +883,14 @@ cheetah_plus_icpe_trap_vector: ...@@ -1036,13 +883,14 @@ cheetah_plus_icpe_trap_vector:
nop nop
do_cheetah_plus_insn_parity: do_cheetah_plus_insn_parity:
ba,pt %xcc, etrap rdpr %pil, %g2
wrpr %g0, 15, %pil
ba,pt %xcc, etrap_irq
rd %pc, %g7 rd %pc, %g7
mov 0x1, %o0 mov 0x1, %o0
call cheetah_plus_parity_error call cheetah_plus_parity_error
add %sp, PTREGS_OFF, %o1 add %sp, PTREGS_OFF, %o1
ba,pt %xcc, rtrap ba,a,pt %xcc, rtrap_irq
clr %l6
cheetah_plus_icpe_trap_vector_tl1: cheetah_plus_icpe_trap_vector_tl1:
membar #Sync membar #Sync
...@@ -1075,6 +923,10 @@ do_dcpe_tl1: ...@@ -1075,6 +923,10 @@ do_dcpe_tl1:
nop nop
wrpr %g1, %tl ! Restore original trap level wrpr %g1, %tl ! Restore original trap level
do_dcpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */ do_dcpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */
sethi %hi(dcache_parity_tl1_occurred), %g2
lduw [%g2 + %lo(dcache_parity_tl1_occurred)], %g1
add %g1, 1, %g1
stw %g1, [%g2 + %lo(dcache_parity_tl1_occurred)]
/* Reset D-cache parity */ /* Reset D-cache parity */
sethi %hi(1 << 16), %g1 ! D-cache size sethi %hi(1 << 16), %g1 ! D-cache size
mov (1 << 5), %g2 ! D-cache line size mov (1 << 5), %g2 ! D-cache line size
...@@ -1121,6 +973,10 @@ do_icpe_tl1: ...@@ -1121,6 +973,10 @@ do_icpe_tl1:
nop nop
wrpr %g1, %tl ! Restore original trap level wrpr %g1, %tl ! Restore original trap level
do_icpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */ do_icpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */
sethi %hi(icache_parity_tl1_occurred), %g2
lduw [%g2 + %lo(icache_parity_tl1_occurred)], %g1
add %g1, 1, %g1
stw %g1, [%g2 + %lo(icache_parity_tl1_occurred)]
/* Flush I-cache */ /* Flush I-cache */
sethi %hi(1 << 15), %g1 ! I-cache size sethi %hi(1 << 15), %g1 ! I-cache size
mov (1 << 5), %g2 ! I-cache line size mov (1 << 5), %g2 ! I-cache line size
......
This diff is collapsed.
/* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling.
*
* Copyright (C) 1995, 1997, 2005 David S. Miller <davem@davemloft.net>
* Copyright (C) 1996 Eddie C. Dost (ecd@brainaid.de)
* Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
* Copyright (C) 1996,98,99 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
#include <linux/config.h>
#include <asm/head.h>
#include <asm/asi.h>
#include <asm/page.h>
#include <asm/pgtable.h>
.text
.align 32
/*
* On a second level vpte miss, check whether the original fault is to the OBP
* range (note that this is only possible for instruction miss, data misses to
* obp range do not use vpte). If so, go back directly to the faulting address.
* This is because we want to read the tpc, otherwise we have no way of knowing
* the 8k aligned faulting address if we are using >8k kernel pagesize. This
* also ensures no vpte range addresses are dropped into tlb while obp is
* executing (see inherit_locked_prom_mappings() rant).
*/
sparc64_vpte_nucleus:
/* Note that kvmap below has verified that the address is
* in the range MODULES_VADDR --> VMALLOC_END already. So
* here we need only check if it is an OBP address or not.
*/
sethi %hi(LOW_OBP_ADDRESS), %g5
cmp %g4, %g5
blu,pn %xcc, kern_vpte
mov 0x1, %g5
sllx %g5, 32, %g5
cmp %g4, %g5
blu,pn %xcc, vpte_insn_obp
nop
/* These two instructions are patched by paginig_init(). */
kern_vpte:
sethi %hi(swapper_pgd_zero), %g5
lduw [%g5 + %lo(swapper_pgd_zero)], %g5
/* With kernel PGD in %g5, branch back into dtlb_backend. */
ba,pt %xcc, sparc64_kpte_continue
andn %g1, 0x3, %g1 /* Finish PMD offset adjustment. */
vpte_noent:
/* Restore previous TAG_ACCESS, %g5 is zero, and we will
* skip over the trap instruction so that the top level
* TLB miss handler will thing this %g5 value is just an
* invalid PTE, thus branching to full fault processing.
*/
mov TLB_SFSR, %g1
stxa %g4, [%g1 + %g1] ASI_DMMU
done
vpte_insn_obp:
sethi %hi(prom_pmd_phys), %g5
ldx [%g5 + %lo(prom_pmd_phys)], %g5
/* Behave as if we are at TL0. */
wrpr %g0, 1, %tl
rdpr %tpc, %g4 /* Find original faulting iaddr */
srlx %g4, 13, %g4 /* Throw out context bits */
sllx %g4, 13, %g4 /* g4 has vpn + ctx0 now */
/* Restore previous TAG_ACCESS. */
mov TLB_SFSR, %g1
stxa %g4, [%g1 + %g1] ASI_IMMU
/* Get PMD offset. */
srlx %g4, 23, %g6
and %g6, 0x7ff, %g6
sllx %g6, 2, %g6
/* Load PMD, is it valid? */
lduwa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
sllx %g5, 11, %g5
/* Get PTE offset. */
srlx %g4, 13, %g6
and %g6, 0x3ff, %g6
sllx %g6, 3, %g6
/* Load PTE. */
ldxa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brgez,pn %g5, longpath
nop
/* TLB load and return from trap. */
stxa %g5, [%g0] ASI_ITLB_DATA_IN
retry
kvmap_do_obp:
sethi %hi(prom_pmd_phys), %g5
ldx [%g5 + %lo(prom_pmd_phys)], %g5
/* Get PMD offset. */
srlx %g4, 23, %g6
and %g6, 0x7ff, %g6
sllx %g6, 2, %g6
/* Load PMD, is it valid? */
lduwa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
sllx %g5, 11, %g5
/* Get PTE offset. */
srlx %g4, 13, %g6
and %g6, 0x3ff, %g6
sllx %g6, 3, %g6
/* Load PTE. */
ldxa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brgez,pn %g5, longpath
nop
/* TLB load and return from trap. */
stxa %g5, [%g0] ASI_DTLB_DATA_IN
retry
/*
* On a first level data miss, check whether this is to the OBP range (note
* that such accesses can be made by prom, as well as by kernel using
* prom_getproperty on "address"), and if so, do not use vpte access ...
* rather, use information saved during inherit_prom_mappings() using 8k
* pagesize.
*/
.align 32
kvmap:
brgez,pn %g4, kvmap_nonlinear
nop
#ifdef CONFIG_DEBUG_PAGEALLOC
.globl kvmap_linear_patch
kvmap_linear_patch:
#endif
ba,pt %xcc, kvmap_load
xor %g2, %g4, %g5
#ifdef CONFIG_DEBUG_PAGEALLOC
sethi %hi(swapper_pg_dir), %g5
or %g5, %lo(swapper_pg_dir), %g5
sllx %g4, 64 - (PGDIR_SHIFT + PGDIR_BITS), %g6
srlx %g6, 64 - PAGE_SHIFT, %g6
andn %g6, 0x3, %g6
lduw [%g5 + %g6], %g5
brz,pn %g5, longpath
sllx %g4, 64 - (PMD_SHIFT + PMD_BITS), %g6
srlx %g6, 64 - PAGE_SHIFT, %g6
sllx %g5, 11, %g5
andn %g6, 0x3, %g6
lduwa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
sllx %g4, 64 - PMD_SHIFT, %g6
srlx %g6, 64 - PAGE_SHIFT, %g6
sllx %g5, 11, %g5
andn %g6, 0x7, %g6
ldxa [%g5 + %g6] ASI_PHYS_USE_EC, %g5
brz,pn %g5, longpath
nop
ba,a,pt %xcc, kvmap_load
#endif
kvmap_nonlinear:
sethi %hi(MODULES_VADDR), %g5
cmp %g4, %g5
blu,pn %xcc, longpath
mov (VMALLOC_END >> 24), %g5
sllx %g5, 24, %g5
cmp %g4, %g5
bgeu,pn %xcc, longpath
nop
kvmap_check_obp:
sethi %hi(LOW_OBP_ADDRESS), %g5
cmp %g4, %g5
blu,pn %xcc, kvmap_vmalloc_addr
mov 0x1, %g5
sllx %g5, 32, %g5
cmp %g4, %g5
blu,pn %xcc, kvmap_do_obp
nop
kvmap_vmalloc_addr:
/* If we get here, a vmalloc addr was accessed, load kernel VPTE. */
ldxa [%g3 + %g6] ASI_N, %g5
brgez,pn %g5, longpath
nop
kvmap_load:
/* PTE is valid, load into TLB and return from trap. */
stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Reload TLB
retry
...@@ -330,7 +330,7 @@ static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) ...@@ -330,7 +330,7 @@ static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
static void tomatillo_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_arg2) static void tomatillo_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_arg2)
{ {
unsigned long sync_reg = (unsigned long) _arg2; unsigned long sync_reg = (unsigned long) _arg2;
u64 mask = 1 << (__irq_ino(__irq(bucket)) & IMAP_INO); u64 mask = 1UL << (__irq_ino(__irq(bucket)) & IMAP_INO);
u64 val; u64 val;
int limit; int limit;
......
...@@ -496,7 +496,6 @@ extern void paging_init(void); ...@@ -496,7 +496,6 @@ extern void paging_init(void);
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
unsigned long highest_paddr;
int i; int i;
/* Initialize PROM console and command line. */ /* Initialize PROM console and command line. */
...@@ -519,11 +518,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -519,11 +518,7 @@ void __init setup_arch(char **cmdline_p)
idprom_init(); idprom_init();
(void) prom_probe_memory(); (void) prom_probe_memory();
/* In paging_init() we tip off this value to see if we need
* to change init_mm.pgd to point to the real alias mapping.
*/
phys_base = 0xffffffffffffffffUL; phys_base = 0xffffffffffffffffUL;
highest_paddr = 0UL;
for (i = 0; sp_banks[i].num_bytes != 0; i++) { for (i = 0; sp_banks[i].num_bytes != 0; i++) {
unsigned long top; unsigned long top;
...@@ -531,25 +526,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -531,25 +526,10 @@ void __init setup_arch(char **cmdline_p)
phys_base = sp_banks[i].base_addr; phys_base = sp_banks[i].base_addr;
top = sp_banks[i].base_addr + top = sp_banks[i].base_addr +
sp_banks[i].num_bytes; sp_banks[i].num_bytes;
if (highest_paddr < top)
highest_paddr = top;
} }
pfn_base = phys_base >> PAGE_SHIFT; pfn_base = phys_base >> PAGE_SHIFT;
switch (tlb_type) { kern_base = (prom_boot_mapping_phys_low >> 22UL) << 22UL;
default:
case spitfire:
kern_base = spitfire_get_itlb_data(sparc64_highest_locked_tlbent());
kern_base &= _PAGE_PADDR_SF;
break;
case cheetah:
case cheetah_plus:
kern_base = cheetah_get_litlb_data(sparc64_highest_locked_tlbent());
kern_base &= _PAGE_PADDR;
break;
};
kern_size = (unsigned long)&_end - (unsigned long)KERNBASE; kern_size = (unsigned long)&_end - (unsigned long)KERNBASE;
if (!root_flags) if (!root_flags)
...@@ -625,6 +605,9 @@ extern void smp_info(struct seq_file *); ...@@ -625,6 +605,9 @@ extern void smp_info(struct seq_file *);
extern void smp_bogo(struct seq_file *); extern void smp_bogo(struct seq_file *);
extern void mmu_info(struct seq_file *); extern void mmu_info(struct seq_file *);
unsigned int dcache_parity_tl1_occurred;
unsigned int icache_parity_tl1_occurred;
static int show_cpuinfo(struct seq_file *m, void *__unused) static int show_cpuinfo(struct seq_file *m, void *__unused)
{ {
seq_printf(m, seq_printf(m,
...@@ -635,6 +618,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused) ...@@ -635,6 +618,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
"type\t\t: sun4u\n" "type\t\t: sun4u\n"
"ncpus probed\t: %ld\n" "ncpus probed\t: %ld\n"
"ncpus active\t: %ld\n" "ncpus active\t: %ld\n"
"D$ parity tl1\t: %u\n"
"I$ parity tl1\t: %u\n"
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
"Cpu0Bogo\t: %lu.%02lu\n" "Cpu0Bogo\t: %lu.%02lu\n"
"Cpu0ClkTck\t: %016lx\n" "Cpu0ClkTck\t: %016lx\n"
...@@ -647,7 +632,9 @@ static int show_cpuinfo(struct seq_file *m, void *__unused) ...@@ -647,7 +632,9 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
(prom_prev >> 8) & 0xff, (prom_prev >> 8) & 0xff,
prom_prev & 0xff, prom_prev & 0xff,
(long)num_possible_cpus(), (long)num_possible_cpus(),
(long)num_online_cpus() (long)num_online_cpus(),
dcache_parity_tl1_occurred,
icache_parity_tl1_occurred
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
, cpu_data(0).udelay_val/(500000/HZ), , cpu_data(0).udelay_val/(500000/HZ),
(cpu_data(0).udelay_val/(5000/HZ)) % 100, (cpu_data(0).udelay_val/(5000/HZ)) % 100,
......
...@@ -93,6 +93,27 @@ void __init smp_store_cpu_info(int id) ...@@ -93,6 +93,27 @@ void __init smp_store_cpu_info(int id)
cpu_data(id).pte_cache[1] = NULL; cpu_data(id).pte_cache[1] = NULL;
cpu_data(id).pgd_cache = NULL; cpu_data(id).pgd_cache = NULL;
cpu_data(id).idle_volume = 1; cpu_data(id).idle_volume = 1;
cpu_data(id).dcache_size = prom_getintdefault(cpu_node, "dcache-size",
16 * 1024);
cpu_data(id).dcache_line_size =
prom_getintdefault(cpu_node, "dcache-line-size", 32);
cpu_data(id).icache_size = prom_getintdefault(cpu_node, "icache-size",
16 * 1024);
cpu_data(id).icache_line_size =
prom_getintdefault(cpu_node, "icache-line-size", 32);
cpu_data(id).ecache_size = prom_getintdefault(cpu_node, "ecache-size",
4 * 1024 * 1024);
cpu_data(id).ecache_line_size =
prom_getintdefault(cpu_node, "ecache-line-size", 64);
printk("CPU[%d]: Caches "
"D[sz(%d):line_sz(%d)] "
"I[sz(%d):line_sz(%d)] "
"E[sz(%d):line_sz(%d)]\n",
id,
cpu_data(id).dcache_size, cpu_data(id).dcache_line_size,
cpu_data(id).icache_size, cpu_data(id).icache_line_size,
cpu_data(id).ecache_size, cpu_data(id).ecache_line_size);
} }
static void smp_setup_percpu_timer(void); static void smp_setup_percpu_timer(void);
......
...@@ -119,8 +119,8 @@ startup_continue: ...@@ -119,8 +119,8 @@ startup_continue:
sethi %hi(itlb_load), %g2 sethi %hi(itlb_load), %g2
or %g2, %lo(itlb_load), %g2 or %g2, %lo(itlb_load), %g2
stx %g2, [%sp + 2047 + 128 + 0x18] stx %g2, [%sp + 2047 + 128 + 0x18]
sethi %hi(mmu_ihandle_cache), %g2 sethi %hi(prom_mmu_ihandle_cache), %g2
lduw [%g2 + %lo(mmu_ihandle_cache)], %g2 lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2
stx %g2, [%sp + 2047 + 128 + 0x20] stx %g2, [%sp + 2047 + 128 + 0x20]
sethi %hi(KERNBASE), %g2 sethi %hi(KERNBASE), %g2
stx %g2, [%sp + 2047 + 128 + 0x28] stx %g2, [%sp + 2047 + 128 + 0x28]
...@@ -156,8 +156,8 @@ startup_continue: ...@@ -156,8 +156,8 @@ startup_continue:
sethi %hi(itlb_load), %g2 sethi %hi(itlb_load), %g2
or %g2, %lo(itlb_load), %g2 or %g2, %lo(itlb_load), %g2
stx %g2, [%sp + 2047 + 128 + 0x18] stx %g2, [%sp + 2047 + 128 + 0x18]
sethi %hi(mmu_ihandle_cache), %g2 sethi %hi(prom_mmu_ihandle_cache), %g2
lduw [%g2 + %lo(mmu_ihandle_cache)], %g2 lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2
stx %g2, [%sp + 2047 + 128 + 0x20] stx %g2, [%sp + 2047 + 128 + 0x20]
sethi %hi(KERNBASE + 0x400000), %g2 sethi %hi(KERNBASE + 0x400000), %g2
stx %g2, [%sp + 2047 + 128 + 0x28] stx %g2, [%sp + 2047 + 128 + 0x28]
...@@ -190,8 +190,8 @@ do_dtlb: ...@@ -190,8 +190,8 @@ do_dtlb:
sethi %hi(dtlb_load), %g2 sethi %hi(dtlb_load), %g2
or %g2, %lo(dtlb_load), %g2 or %g2, %lo(dtlb_load), %g2
stx %g2, [%sp + 2047 + 128 + 0x18] stx %g2, [%sp + 2047 + 128 + 0x18]
sethi %hi(mmu_ihandle_cache), %g2 sethi %hi(prom_mmu_ihandle_cache), %g2
lduw [%g2 + %lo(mmu_ihandle_cache)], %g2 lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2
stx %g2, [%sp + 2047 + 128 + 0x20] stx %g2, [%sp + 2047 + 128 + 0x20]
sethi %hi(KERNBASE), %g2 sethi %hi(KERNBASE), %g2
stx %g2, [%sp + 2047 + 128 + 0x28] stx %g2, [%sp + 2047 + 128 + 0x28]
...@@ -228,8 +228,8 @@ do_dtlb: ...@@ -228,8 +228,8 @@ do_dtlb:
sethi %hi(dtlb_load), %g2 sethi %hi(dtlb_load), %g2
or %g2, %lo(dtlb_load), %g2 or %g2, %lo(dtlb_load), %g2
stx %g2, [%sp + 2047 + 128 + 0x18] stx %g2, [%sp + 2047 + 128 + 0x18]
sethi %hi(mmu_ihandle_cache), %g2 sethi %hi(prom_mmu_ihandle_cache), %g2
lduw [%g2 + %lo(mmu_ihandle_cache)], %g2 lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2
stx %g2, [%sp + 2047 + 128 + 0x20] stx %g2, [%sp + 2047 + 128 + 0x20]
sethi %hi(KERNBASE + 0x400000), %g2 sethi %hi(KERNBASE + 0x400000), %g2
stx %g2, [%sp + 2047 + 128 + 0x28] stx %g2, [%sp + 2047 + 128 + 0x28]
......
...@@ -869,14 +869,19 @@ static void cheetah_flush_ecache_line(unsigned long physaddr) ...@@ -869,14 +869,19 @@ static void cheetah_flush_ecache_line(unsigned long physaddr)
*/ */
static void __cheetah_flush_icache(void) static void __cheetah_flush_icache(void)
{ {
unsigned long i; unsigned int icache_size, icache_line_size;
unsigned long addr;
icache_size = local_cpu_data().icache_size;
icache_line_size = local_cpu_data().icache_line_size;
/* Clear the valid bits in all the tags. */ /* Clear the valid bits in all the tags. */
for (i = 0; i < (1 << 15); i += (1 << 5)) { for (addr = 0; addr < icache_size; addr += icache_line_size) {
__asm__ __volatile__("stxa %%g0, [%0] %1\n\t" __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
"membar #Sync" "membar #Sync"
: /* no outputs */ : /* no outputs */
: "r" (i | (2 << 3)), "i" (ASI_IC_TAG)); : "r" (addr | (2 << 3)),
"i" (ASI_IC_TAG));
} }
} }
...@@ -904,13 +909,17 @@ static void cheetah_flush_icache(void) ...@@ -904,13 +909,17 @@ static void cheetah_flush_icache(void)
static void cheetah_flush_dcache(void) static void cheetah_flush_dcache(void)
{ {
unsigned long i; unsigned int dcache_size, dcache_line_size;
unsigned long addr;
dcache_size = local_cpu_data().dcache_size;
dcache_line_size = local_cpu_data().dcache_line_size;
for (i = 0; i < (1 << 16); i += (1 << 5)) { for (addr = 0; addr < dcache_size; addr += dcache_line_size) {
__asm__ __volatile__("stxa %%g0, [%0] %1\n\t" __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
"membar #Sync" "membar #Sync"
: /* no outputs */ : /* no outputs */
: "r" (i), "i" (ASI_DCACHE_TAG)); : "r" (addr), "i" (ASI_DCACHE_TAG));
} }
} }
...@@ -921,24 +930,29 @@ static void cheetah_flush_dcache(void) ...@@ -921,24 +930,29 @@ static void cheetah_flush_dcache(void)
*/ */
static void cheetah_plus_zap_dcache_parity(void) static void cheetah_plus_zap_dcache_parity(void)
{ {
unsigned long i; unsigned int dcache_size, dcache_line_size;
unsigned long addr;
dcache_size = local_cpu_data().dcache_size;
dcache_line_size = local_cpu_data().dcache_line_size;
for (i = 0; i < (1 << 16); i += (1 << 5)) { for (addr = 0; addr < dcache_size; addr += dcache_line_size) {
unsigned long tag = (i >> 14); unsigned long tag = (addr >> 14);
unsigned long j; unsigned long line;
__asm__ __volatile__("membar #Sync\n\t" __asm__ __volatile__("membar #Sync\n\t"
"stxa %0, [%1] %2\n\t" "stxa %0, [%1] %2\n\t"
"membar #Sync" "membar #Sync"
: /* no outputs */ : /* no outputs */
: "r" (tag), "r" (i), : "r" (tag), "r" (addr),
"i" (ASI_DCACHE_UTAG)); "i" (ASI_DCACHE_UTAG));
for (j = i; j < i + (1 << 5); j += (1 << 3)) for (line = addr; line < addr + dcache_line_size; line += 8)
__asm__ __volatile__("membar #Sync\n\t" __asm__ __volatile__("membar #Sync\n\t"
"stxa %%g0, [%0] %1\n\t" "stxa %%g0, [%0] %1\n\t"
"membar #Sync" "membar #Sync"
: /* no outputs */ : /* no outputs */
: "r" (j), "i" (ASI_DCACHE_DATA)); : "r" (line),
"i" (ASI_DCACHE_DATA));
} }
} }
......
...@@ -9,8 +9,7 @@ ENTRY(_start) ...@@ -9,8 +9,7 @@ ENTRY(_start)
jiffies = jiffies_64; jiffies = jiffies_64;
SECTIONS SECTIONS
{ {
swapper_pmd_dir = 0x0000000000402000; swapper_low_pmd_dir = 0x0000000000402000;
empty_pg_dir = 0x0000000000403000;
. = 0x4000; . = 0x4000;
.text 0x0000000000404000 : .text 0x0000000000404000 :
{ {
......
This diff is collapsed.
...@@ -144,42 +144,29 @@ __flush_icache_page: /* %o0 = phys_page */ ...@@ -144,42 +144,29 @@ __flush_icache_page: /* %o0 = phys_page */
#define DTAG_MASK 0x3 #define DTAG_MASK 0x3
/* This routine is Spitfire specific so the hardcoded
* D-cache size and line-size are OK.
*/
.align 64 .align 64
.globl __flush_dcache_page .globl __flush_dcache_page
__flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */ __flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */
sethi %uhi(PAGE_OFFSET), %g1 sethi %uhi(PAGE_OFFSET), %g1
sllx %g1, 32, %g1 sllx %g1, 32, %g1
sub %o0, %g1, %o0 sub %o0, %g1, %o0 ! physical address
clr %o4 srlx %o0, 11, %o0 ! make D-cache TAG
srlx %o0, 11, %o0 sethi %hi(1 << 14), %o2 ! D-cache size
sethi %hi(1 << 14), %o2 sub %o2, (1 << 5), %o2 ! D-cache line size
1: ldxa [%o4] ASI_DCACHE_TAG, %o3 ! LSU Group 1: ldxa [%o2] ASI_DCACHE_TAG, %o3 ! load D-cache TAG
add %o4, (1 << 5), %o4 ! IEU0 andcc %o3, DTAG_MASK, %g0 ! Valid?
ldxa [%o4] ASI_DCACHE_TAG, %g1 ! LSU Group be,pn %xcc, 2f ! Nope, branch
add %o4, (1 << 5), %o4 ! IEU0 andn %o3, DTAG_MASK, %o3 ! Clear valid bits
ldxa [%o4] ASI_DCACHE_TAG, %g2 ! LSU Group o3 available cmp %o3, %o0 ! TAG match?
add %o4, (1 << 5), %o4 ! IEU0 bne,pt %xcc, 2f ! Nope, branch
andn %o3, DTAG_MASK, %o3 ! IEU1 nop
ldxa [%o4] ASI_DCACHE_TAG, %g3 ! LSU Group stxa %g0, [%o2] ASI_DCACHE_TAG ! Invalidate TAG
add %o4, (1 << 5), %o4 ! IEU0 membar #Sync
andn %g1, DTAG_MASK, %g1 ! IEU1 2: brnz,pt %o2, 1b
cmp %o0, %o3 ! IEU1 Group sub %o2, (1 << 5), %o2 ! D-cache line size
be,a,pn %xcc, dflush1 ! CTI
sub %o4, (4 << 5), %o4 ! IEU0 (Group)
cmp %o0, %g1 ! IEU1 Group
andn %g2, DTAG_MASK, %g2 ! IEU0
be,a,pn %xcc, dflush2 ! CTI
sub %o4, (3 << 5), %o4 ! IEU0 (Group)
cmp %o0, %g2 ! IEU1 Group
andn %g3, DTAG_MASK, %g3 ! IEU0
be,a,pn %xcc, dflush3 ! CTI
sub %o4, (2 << 5), %o4 ! IEU0 (Group)
cmp %o0, %g3 ! IEU1 Group
be,a,pn %xcc, dflush4 ! CTI
sub %o4, (1 << 5), %o4 ! IEU0
2: cmp %o4, %o2 ! IEU1 Group
bne,pt %xcc, 1b ! CTI
nop ! IEU0
/* The I-cache does not snoop local stores so we /* The I-cache does not snoop local stores so we
* better flush that too when necessary. * better flush that too when necessary.
...@@ -189,48 +176,9 @@ __flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */ ...@@ -189,48 +176,9 @@ __flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */
retl retl
nop nop
dflush1:stxa %g0, [%o4] ASI_DCACHE_TAG
add %o4, (1 << 5), %o4
dflush2:stxa %g0, [%o4] ASI_DCACHE_TAG
add %o4, (1 << 5), %o4
dflush3:stxa %g0, [%o4] ASI_DCACHE_TAG
add %o4, (1 << 5), %o4
dflush4:stxa %g0, [%o4] ASI_DCACHE_TAG
add %o4, (1 << 5), %o4
membar #Sync
ba,pt %xcc, 2b
nop
#endif /* DCACHE_ALIASING_POSSIBLE */ #endif /* DCACHE_ALIASING_POSSIBLE */
.previous .text .previous
.align 32
__prefill_dtlb:
rdpr %pstate, %g7
wrpr %g7, PSTATE_IE, %pstate
mov TLB_TAG_ACCESS, %g1
stxa %o5, [%g1] ASI_DMMU
stxa %o2, [%g0] ASI_DTLB_DATA_IN
flush %g6
retl
wrpr %g7, %pstate
__prefill_itlb:
rdpr %pstate, %g7
wrpr %g7, PSTATE_IE, %pstate
mov TLB_TAG_ACCESS, %g1
stxa %o5, [%g1] ASI_IMMU
stxa %o2, [%g0] ASI_ITLB_DATA_IN
flush %g6
retl
wrpr %g7, %pstate
.globl __update_mmu_cache
__update_mmu_cache: /* %o0=hw_context, %o1=address, %o2=pte, %o3=fault_code */
srlx %o1, PAGE_SHIFT, %o1
andcc %o3, FAULT_CODE_DTLB, %g0
sllx %o1, PAGE_SHIFT, %o5
bne,pt %xcc, __prefill_dtlb
or %o5, %o0, %o5
ba,a,pt %xcc, __prefill_itlb
/* Cheetah specific versions, patched at boot time. */ /* Cheetah specific versions, patched at boot time. */
__cheetah_flush_tlb_mm: /* 18 insns */ __cheetah_flush_tlb_mm: /* 18 insns */
...@@ -283,7 +231,7 @@ __cheetah_flush_tlb_pending: /* 26 insns */ ...@@ -283,7 +231,7 @@ __cheetah_flush_tlb_pending: /* 26 insns */
wrpr %g7, 0x0, %pstate wrpr %g7, 0x0, %pstate
#ifdef DCACHE_ALIASING_POSSIBLE #ifdef DCACHE_ALIASING_POSSIBLE
flush_dcpage_cheetah: /* 11 insns */ __cheetah_flush_dcache_page: /* 11 insns */
sethi %uhi(PAGE_OFFSET), %g1 sethi %uhi(PAGE_OFFSET), %g1
sllx %g1, 32, %g1 sllx %g1, 32, %g1
sub %o0, %g1, %o0 sub %o0, %g1, %o0
...@@ -329,8 +277,8 @@ cheetah_patch_cachetlbops: ...@@ -329,8 +277,8 @@ cheetah_patch_cachetlbops:
#ifdef DCACHE_ALIASING_POSSIBLE #ifdef DCACHE_ALIASING_POSSIBLE
sethi %hi(__flush_dcache_page), %o0 sethi %hi(__flush_dcache_page), %o0
or %o0, %lo(__flush_dcache_page), %o0 or %o0, %lo(__flush_dcache_page), %o0
sethi %hi(flush_dcpage_cheetah), %o1 sethi %hi(__cheetah_flush_dcache_page), %o1
or %o1, %lo(flush_dcpage_cheetah), %o1 or %o1, %lo(__cheetah_flush_dcache_page), %o1
call cheetah_patch_one call cheetah_patch_one
mov 11, %o2 mov 11, %o2
#endif /* DCACHE_ALIASING_POSSIBLE */ #endif /* DCACHE_ALIASING_POSSIBLE */
......
...@@ -7,4 +7,4 @@ EXTRA_AFLAGS := -ansi ...@@ -7,4 +7,4 @@ EXTRA_AFLAGS := -ansi
EXTRA_CFLAGS := -Werror EXTRA_CFLAGS := -Werror
lib-y := bootstr.o devops.o init.o memory.o misc.o \ lib-y := bootstr.o devops.o init.o memory.o misc.o \
tree.o console.o printf.o p1275.o map.o cif.o tree.o console.o printf.o p1275.o cif.o
...@@ -67,7 +67,7 @@ prom_putchar(char c) ...@@ -67,7 +67,7 @@ prom_putchar(char c)
} }
void void
prom_puts(char *s, int len) prom_puts(const char *s, int len)
{ {
p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)|
P1275_INOUT(3,1), P1275_INOUT(3,1),
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* Returns 0 on failure. * Returns 0 on failure.
*/ */
int int
prom_devopen(char *dstr) prom_devopen(const char *dstr)
{ {
return p1275_cmd ("open", P1275_ARG(0,P1275_ARG_IN_STRING)| return p1275_cmd ("open", P1275_ARG(0,P1275_ARG_IN_STRING)|
P1275_INOUT(1,1), P1275_INOUT(1,1),
......
...@@ -46,7 +46,7 @@ void __init prom_init(void *cif_handler, void *cif_stack) ...@@ -46,7 +46,7 @@ void __init prom_init(void *cif_handler, void *cif_stack)
if((prom_root_node == 0) || (prom_root_node == -1)) if((prom_root_node == 0) || (prom_root_node == -1))
prom_halt(); prom_halt();
prom_chosen_node = prom_finddevice("/chosen"); prom_chosen_node = prom_finddevice(prom_chosen_path);
if (!prom_chosen_node || prom_chosen_node == -1) if (!prom_chosen_node || prom_chosen_node == -1)
prom_halt(); prom_halt();
......
/* $Id: map.S,v 1.2 1999/11/19 05:53:02 davem Exp $
* map.S: Tricky coding required to fixup the kernel OBP maps
* properly.
*
* Copyright (C) 1999 David S. Miller (davem@redhat.com)
*/
.text
.align 8192
.globl prom_boot_page
prom_boot_page:
call_method:
.asciz "call-method"
.align 8
map:
.asciz "map"
.align 8
/* When we are invoked, our caller has remapped us to
* page zero, therefore we must use PC relative addressing
* for everything after we begin performing the unmap/map
* calls.
*/
.globl prom_remap
prom_remap: /* %o0 = physpage, %o1 = virtpage, %o2 = mmu_ihandle */
rd %pc, %g1
srl %o2, 0, %o2 ! kill sign extension
sethi %hi(p1275buf), %g2
or %g2, %lo(p1275buf), %g2
ldx [%g2 + 0x10], %g3 ! prom_cif_stack
save %g3, -(192 + 128), %sp
ldx [%g2 + 0x08], %l0 ! prom_cif_handler
mov %g6, %i3
mov %g4, %i4
mov %g5, %i5
flushw
sethi %hi(prom_remap - call_method), %g7
or %g7, %lo(prom_remap - call_method), %g7
sub %g1, %g7, %l2 ! call-method string
sethi %hi(prom_remap - map), %g7
or %g7, %lo(prom_remap - map), %g7
sub %g1, %g7, %l4 ! map string
/* OK, map the 4MB region we really live at. */
stx %l2, [%sp + 2047 + 128 + 0x00] ! call-method
mov 7, %l5
stx %l5, [%sp + 2047 + 128 + 0x08] ! num_args
mov 1, %l5
stx %l5, [%sp + 2047 + 128 + 0x10] ! num_rets
stx %l4, [%sp + 2047 + 128 + 0x18] ! map
stx %i2, [%sp + 2047 + 128 + 0x20] ! mmu_ihandle
mov -1, %l5
stx %l5, [%sp + 2047 + 128 + 0x28] ! mode == default
sethi %hi(4 * 1024 * 1024), %l5
stx %l5, [%sp + 2047 + 128 + 0x30] ! size
stx %i1, [%sp + 2047 + 128 + 0x38] ! vaddr
stx %g0, [%sp + 2047 + 128 + 0x40] ! filler
stx %i0, [%sp + 2047 + 128 + 0x48] ! paddr
call %l0
add %sp, (2047 + 128), %o0 ! argument array
/* Restore hard-coded globals. */
mov %i3, %g6
mov %i4, %g4
mov %i5, %g5
/* Wheee.... we are done. */
ret
restore
.align 8192
...@@ -17,14 +17,14 @@ ...@@ -17,14 +17,14 @@
#include <asm/system.h> #include <asm/system.h>
/* Reset and reboot the machine with the command 'bcommand'. */ /* Reset and reboot the machine with the command 'bcommand'. */
void prom_reboot(char *bcommand) void prom_reboot(const char *bcommand)
{ {
p1275_cmd("boot", P1275_ARG(0, P1275_ARG_IN_STRING) | p1275_cmd("boot", P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_INOUT(1, 0), bcommand); P1275_INOUT(1, 0), bcommand);
} }
/* Forth evaluate the expression contained in 'fstring'. */ /* Forth evaluate the expression contained in 'fstring'. */
void prom_feval(char *fstring) void prom_feval(const char *fstring)
{ {
if (!fstring || fstring[0] == 0) if (!fstring || fstring[0] == 0)
return; return;
...@@ -148,21 +148,19 @@ void prom_set_trap_table(unsigned long tba) ...@@ -148,21 +148,19 @@ void prom_set_trap_table(unsigned long tba)
p1275_cmd("SUNW,set-trap-table", P1275_INOUT(1, 0), tba); p1275_cmd("SUNW,set-trap-table", P1275_INOUT(1, 0), tba);
} }
int mmu_ihandle_cache = 0;
int prom_get_mmu_ihandle(void) int prom_get_mmu_ihandle(void)
{ {
int node, ret; int node, ret;
if (mmu_ihandle_cache != 0) if (prom_mmu_ihandle_cache != 0)
return mmu_ihandle_cache; return prom_mmu_ihandle_cache;
node = prom_finddevice("/chosen"); node = prom_finddevice(prom_chosen_path);
ret = prom_getint(node, "mmu"); ret = prom_getint(node, prom_mmu_name);
if (ret == -1 || ret == 0) if (ret == -1 || ret == 0)
mmu_ihandle_cache = -1; prom_mmu_ihandle_cache = -1;
else else
mmu_ihandle_cache = ret; prom_mmu_ihandle_cache = ret;
return ret; return ret;
} }
...@@ -190,7 +188,7 @@ long prom_itlb_load(unsigned long index, ...@@ -190,7 +188,7 @@ long prom_itlb_load(unsigned long index,
unsigned long tte_data, unsigned long tte_data,
unsigned long vaddr) unsigned long vaddr)
{ {
return p1275_cmd("call-method", return p1275_cmd(prom_callmethod_name,
(P1275_ARG(0, P1275_ARG_IN_STRING) | (P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(2, P1275_ARG_IN_64B) |
P1275_ARG(3, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) |
...@@ -207,7 +205,7 @@ long prom_dtlb_load(unsigned long index, ...@@ -207,7 +205,7 @@ long prom_dtlb_load(unsigned long index,
unsigned long tte_data, unsigned long tte_data,
unsigned long vaddr) unsigned long vaddr)
{ {
return p1275_cmd("call-method", return p1275_cmd(prom_callmethod_name,
(P1275_ARG(0, P1275_ARG_IN_STRING) | (P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(2, P1275_ARG_IN_64B) |
P1275_ARG(3, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) |
...@@ -223,13 +221,13 @@ long prom_dtlb_load(unsigned long index, ...@@ -223,13 +221,13 @@ long prom_dtlb_load(unsigned long index,
int prom_map(int mode, unsigned long size, int prom_map(int mode, unsigned long size,
unsigned long vaddr, unsigned long paddr) unsigned long vaddr, unsigned long paddr)
{ {
int ret = p1275_cmd("call-method", int ret = p1275_cmd(prom_callmethod_name,
(P1275_ARG(0, P1275_ARG_IN_STRING) | (P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_ARG(3, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) |
P1275_ARG(4, P1275_ARG_IN_64B) | P1275_ARG(4, P1275_ARG_IN_64B) |
P1275_ARG(6, P1275_ARG_IN_64B) | P1275_ARG(6, P1275_ARG_IN_64B) |
P1275_INOUT(7, 1)), P1275_INOUT(7, 1)),
"map", prom_map_name,
prom_get_mmu_ihandle(), prom_get_mmu_ihandle(),
mode, mode,
size, size,
...@@ -244,12 +242,12 @@ int prom_map(int mode, unsigned long size, ...@@ -244,12 +242,12 @@ int prom_map(int mode, unsigned long size,
void prom_unmap(unsigned long size, unsigned long vaddr) void prom_unmap(unsigned long size, unsigned long vaddr)
{ {
p1275_cmd("call-method", p1275_cmd(prom_callmethod_name,
(P1275_ARG(0, P1275_ARG_IN_STRING) | (P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(2, P1275_ARG_IN_64B) |
P1275_ARG(3, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) |
P1275_INOUT(4, 0)), P1275_INOUT(4, 0)),
"unmap", prom_unmap_name,
prom_get_mmu_ihandle(), prom_get_mmu_ihandle(),
size, size,
vaddr); vaddr);
...@@ -258,7 +256,7 @@ void prom_unmap(unsigned long size, unsigned long vaddr) ...@@ -258,7 +256,7 @@ void prom_unmap(unsigned long size, unsigned long vaddr)
/* Set aside physical memory which is not touched or modified /* Set aside physical memory which is not touched or modified
* across soft resets. * across soft resets.
*/ */
unsigned long prom_retain(char *name, unsigned long prom_retain(const char *name,
unsigned long pa_low, unsigned long pa_high, unsigned long pa_low, unsigned long pa_high,
long size, long align) long size, long align)
{ {
...@@ -290,7 +288,7 @@ int prom_getunumber(int syndrome_code, ...@@ -290,7 +288,7 @@ int prom_getunumber(int syndrome_code,
unsigned long phys_addr, unsigned long phys_addr,
char *buf, int buflen) char *buf, int buflen)
{ {
return p1275_cmd("call-method", return p1275_cmd(prom_callmethod_name,
(P1275_ARG(0, P1275_ARG_IN_STRING) | (P1275_ARG(0, P1275_ARG_IN_STRING) |
P1275_ARG(3, P1275_ARG_OUT_BUF) | P1275_ARG(3, P1275_ARG_OUT_BUF) |
P1275_ARG(6, P1275_ARG_IN_64B) | P1275_ARG(6, P1275_ARG_IN_64B) |
......
...@@ -46,7 +46,7 @@ static inline unsigned long spitfire_get_primary_context(void) ...@@ -46,7 +46,7 @@ static inline unsigned long spitfire_get_primary_context(void)
*/ */
DEFINE_SPINLOCK(prom_entry_lock); DEFINE_SPINLOCK(prom_entry_lock);
long p1275_cmd (char *service, long fmt, ...) long p1275_cmd(const char *service, long fmt, ...)
{ {
char *p, *q; char *p, *q;
unsigned long flags; unsigned long flags;
......
...@@ -34,7 +34,7 @@ prom_write(const char *buf, unsigned int n) ...@@ -34,7 +34,7 @@ prom_write(const char *buf, unsigned int n)
} }
void void
prom_printf(char *fmt, ...) prom_printf(const char *fmt, ...)
{ {
va_list args; va_list args;
int i; int i;
......
...@@ -69,7 +69,7 @@ prom_getsibling(int node) ...@@ -69,7 +69,7 @@ prom_getsibling(int node)
* Return -1 on error. * Return -1 on error.
*/ */
__inline__ int __inline__ int
prom_getproplen(int node, char *prop) prom_getproplen(int node, const char *prop)
{ {
if((!node) || (!prop)) return -1; if((!node) || (!prop)) return -1;
return p1275_cmd ("getproplen", return p1275_cmd ("getproplen",
...@@ -83,20 +83,20 @@ prom_getproplen(int node, char *prop) ...@@ -83,20 +83,20 @@ prom_getproplen(int node, char *prop)
* was successful the length will be returned, else -1 is returned. * was successful the length will be returned, else -1 is returned.
*/ */
__inline__ int __inline__ int
prom_getproperty(int node, char *prop, char *buffer, int bufsize) prom_getproperty(int node, const char *prop, char *buffer, int bufsize)
{ {
int plen; int plen;
plen = prom_getproplen(node, prop); plen = prom_getproplen(node, prop);
if((plen > bufsize) || (plen == 0) || (plen == -1)) if ((plen > bufsize) || (plen == 0) || (plen == -1)) {
return -1; return -1;
else { } else {
/* Ok, things seem all right. */ /* Ok, things seem all right. */
return p1275_cmd ("getprop", return p1275_cmd(prom_getprop_name,
P1275_ARG(1,P1275_ARG_IN_STRING)| P1275_ARG(1,P1275_ARG_IN_STRING)|
P1275_ARG(2,P1275_ARG_OUT_BUF)| P1275_ARG(2,P1275_ARG_OUT_BUF)|
P1275_INOUT(4, 1), P1275_INOUT(4, 1),
node, prop, buffer, P1275_SIZE(plen)); node, prop, buffer, P1275_SIZE(plen));
} }
} }
...@@ -104,7 +104,7 @@ prom_getproperty(int node, char *prop, char *buffer, int bufsize) ...@@ -104,7 +104,7 @@ prom_getproperty(int node, char *prop, char *buffer, int bufsize)
* on failure. * on failure.
*/ */
__inline__ int __inline__ int
prom_getint(int node, char *prop) prom_getint(int node, const char *prop)
{ {
int intprop; int intprop;
...@@ -119,7 +119,7 @@ prom_getint(int node, char *prop) ...@@ -119,7 +119,7 @@ prom_getint(int node, char *prop)
*/ */
int int
prom_getintdefault(int node, char *property, int deflt) prom_getintdefault(int node, const char *property, int deflt)
{ {
int retval; int retval;
...@@ -131,7 +131,7 @@ prom_getintdefault(int node, char *property, int deflt) ...@@ -131,7 +131,7 @@ prom_getintdefault(int node, char *property, int deflt)
/* Acquire a boolean property, 1=TRUE 0=FALSE. */ /* Acquire a boolean property, 1=TRUE 0=FALSE. */
int int
prom_getbool(int node, char *prop) prom_getbool(int node, const char *prop)
{ {
int retval; int retval;
...@@ -145,7 +145,7 @@ prom_getbool(int node, char *prop) ...@@ -145,7 +145,7 @@ prom_getbool(int node, char *prop)
* buffer. * buffer.
*/ */
void void
prom_getstring(int node, char *prop, char *user_buf, int ubuf_size) prom_getstring(int node, const char *prop, char *user_buf, int ubuf_size)
{ {
int len; int len;
...@@ -160,7 +160,7 @@ prom_getstring(int node, char *prop, char *user_buf, int ubuf_size) ...@@ -160,7 +160,7 @@ prom_getstring(int node, char *prop, char *user_buf, int ubuf_size)
* YES = 1 NO = 0 * YES = 1 NO = 0
*/ */
int int
prom_nodematch(int node, char *name) prom_nodematch(int node, const char *name)
{ {
char namebuf[128]; char namebuf[128];
prom_getproperty(node, "name", namebuf, sizeof(namebuf)); prom_getproperty(node, "name", namebuf, sizeof(namebuf));
...@@ -172,7 +172,7 @@ prom_nodematch(int node, char *name) ...@@ -172,7 +172,7 @@ prom_nodematch(int node, char *name)
* 'nodename'. Return node if successful, zero if not. * 'nodename'. Return node if successful, zero if not.
*/ */
int int
prom_searchsiblings(int node_start, char *nodename) prom_searchsiblings(int node_start, const char *nodename)
{ {
int thisnode, error; int thisnode, error;
...@@ -294,7 +294,7 @@ prom_firstprop(int node, char *buffer) ...@@ -294,7 +294,7 @@ prom_firstprop(int node, char *buffer)
* property types for this node. * property types for this node.
*/ */
__inline__ char * __inline__ char *
prom_nextprop(int node, char *oprop, char *buffer) prom_nextprop(int node, const char *oprop, char *buffer)
{ {
char buf[32]; char buf[32];
...@@ -314,15 +314,17 @@ prom_nextprop(int node, char *oprop, char *buffer) ...@@ -314,15 +314,17 @@ prom_nextprop(int node, char *oprop, char *buffer)
} }
int int
prom_finddevice(char *name) prom_finddevice(const char *name)
{ {
if(!name) return 0; if (!name)
return p1275_cmd ("finddevice", P1275_ARG(0,P1275_ARG_IN_STRING)| return 0;
P1275_INOUT(1, 1), return p1275_cmd(prom_finddev_name,
name); P1275_ARG(0,P1275_ARG_IN_STRING)|
P1275_INOUT(1, 1),
name);
} }
int prom_node_has_property(int node, char *prop) int prom_node_has_property(int node, const char *prop)
{ {
char buf [32]; char buf [32];
...@@ -339,7 +341,7 @@ int prom_node_has_property(int node, char *prop) ...@@ -339,7 +341,7 @@ int prom_node_has_property(int node, char *prop)
* of 'size' bytes. Return the number of bytes the prom accepted. * of 'size' bytes. Return the number of bytes the prom accepted.
*/ */
int int
prom_setprop(int node, char *pname, char *value, int size) prom_setprop(int node, const char *pname, char *value, int size)
{ {
if(size == 0) return 0; if(size == 0) return 0;
if((pname == 0) || (value == 0)) return 0; if((pname == 0) || (value == 0)) return 0;
...@@ -364,7 +366,7 @@ prom_inst2pkg(int inst) ...@@ -364,7 +366,7 @@ prom_inst2pkg(int inst)
* FIXME: Should work for v0 as well * FIXME: Should work for v0 as well
*/ */
int int
prom_pathtoinode(char *path) prom_pathtoinode(const char *path)
{ {
int node, inst; int node, inst;
......
...@@ -66,6 +66,11 @@ extern void flush_ptrace_access(struct vm_area_struct *, struct page *, ...@@ -66,6 +66,11 @@ extern void flush_ptrace_access(struct vm_area_struct *, struct page *,
#define flush_cache_vmap(start, end) do { } while (0) #define flush_cache_vmap(start, end) do { } while (0)
#define flush_cache_vunmap(start, end) do { } while (0) #define flush_cache_vunmap(start, end) do { } while (0)
#ifdef CONFIG_DEBUG_PAGEALLOC
/* internal debugging function */
void kernel_map_pages(struct page *page, int numpages, int enable);
#endif
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#endif /* _SPARC64_CACHEFLUSH_H */ #endif /* _SPARC64_CACHEFLUSH_H */
...@@ -22,6 +22,16 @@ typedef struct { ...@@ -22,6 +22,16 @@ typedef struct {
unsigned int __pad1; unsigned int __pad1;
unsigned long *pte_cache[2]; unsigned long *pte_cache[2];
unsigned long *pgd_cache; unsigned long *pgd_cache;
/* Dcache line 3, rarely used */
unsigned int dcache_size;
unsigned int dcache_line_size;
unsigned int icache_size;
unsigned int icache_line_size;
unsigned int ecache_size;
unsigned int ecache_line_size;
unsigned int __pad2;
unsigned int __pad3;
} cpuinfo_sparc; } cpuinfo_sparc;
DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
......
...@@ -38,6 +38,20 @@ extern int prom_stdin, prom_stdout; ...@@ -38,6 +38,20 @@ extern int prom_stdin, prom_stdout;
*/ */
extern int prom_chosen_node; extern int prom_chosen_node;
/* Helper values and strings in arch/sparc64/kernel/head.S */
extern const char prom_finddev_name[];
extern const char prom_chosen_path[];
extern const char prom_getprop_name[];
extern const char prom_mmu_name[];
extern const char prom_callmethod_name[];
extern const char prom_translate_name[];
extern const char prom_map_name[];
extern const char prom_unmap_name[];
extern int prom_mmu_ihandle_cache;
extern unsigned int prom_boot_mapped_pc;
extern unsigned int prom_boot_mapping_mode;
extern unsigned long prom_boot_mapping_phys_high, prom_boot_mapping_phys_low;
struct linux_mlist_p1275 { struct linux_mlist_p1275 {
struct linux_mlist_p1275 *theres_more; struct linux_mlist_p1275 *theres_more;
unsigned long start_adr; unsigned long start_adr;
...@@ -68,7 +82,7 @@ extern char *prom_getbootargs(void); ...@@ -68,7 +82,7 @@ extern char *prom_getbootargs(void);
* of the string is different on V0 vs. V2->higher proms. The caller must * of the string is different on V0 vs. V2->higher proms. The caller must
* know what he/she is doing! Returns the device descriptor, an int. * know what he/she is doing! Returns the device descriptor, an int.
*/ */
extern int prom_devopen(char *device_string); extern int prom_devopen(const char *device_string);
/* Close a previously opened device described by the passed integer /* Close a previously opened device described by the passed integer
* descriptor. * descriptor.
...@@ -98,10 +112,10 @@ extern struct linux_mem_p1275 *prom_meminfo(void); ...@@ -98,10 +112,10 @@ extern struct linux_mem_p1275 *prom_meminfo(void);
/* Miscellaneous routines, don't really fit in any category per se. */ /* Miscellaneous routines, don't really fit in any category per se. */
/* Reboot the machine with the command line passed. */ /* Reboot the machine with the command line passed. */
extern void prom_reboot(char *boot_command); extern void prom_reboot(const char *boot_command);
/* Evaluate the forth string passed. */ /* Evaluate the forth string passed. */
extern void prom_feval(char *forth_string); extern void prom_feval(const char *forth_string);
/* Enter the prom, with possibility of continuation with the 'go' /* Enter the prom, with possibility of continuation with the 'go'
* command in newer proms. * command in newer proms.
...@@ -154,7 +168,7 @@ extern char prom_getchar(void); ...@@ -154,7 +168,7 @@ extern char prom_getchar(void);
extern void prom_putchar(char character); extern void prom_putchar(char character);
/* Prom's internal routines, don't use in kernel/boot code. */ /* Prom's internal routines, don't use in kernel/boot code. */
extern void prom_printf(char *fmt, ...); extern void prom_printf(const char *fmt, ...);
extern void prom_write(const char *buf, unsigned int len); extern void prom_write(const char *buf, unsigned int len);
/* Query for input device type */ /* Query for input device type */
...@@ -215,7 +229,7 @@ extern int prom_getunumber(int syndrome_code, ...@@ -215,7 +229,7 @@ extern int prom_getunumber(int syndrome_code,
char *buf, int buflen); char *buf, int buflen);
/* Retain physical memory to the caller across soft resets. */ /* Retain physical memory to the caller across soft resets. */
extern unsigned long prom_retain(char *name, extern unsigned long prom_retain(const char *name,
unsigned long pa_low, unsigned long pa_high, unsigned long pa_low, unsigned long pa_high,
long size, long align); long size, long align);
...@@ -269,28 +283,28 @@ extern int prom_getsibling(int node); ...@@ -269,28 +283,28 @@ extern int prom_getsibling(int node);
/* Get the length, at the passed node, of the given property type. /* Get the length, at the passed node, of the given property type.
* Returns -1 on error (ie. no such property at this node). * Returns -1 on error (ie. no such property at this node).
*/ */
extern int prom_getproplen(int thisnode, char *property); extern int prom_getproplen(int thisnode, const char *property);
/* Fetch the requested property using the given buffer. Returns /* Fetch the requested property using the given buffer. Returns
* the number of bytes the prom put into your buffer or -1 on error. * the number of bytes the prom put into your buffer or -1 on error.
*/ */
extern int prom_getproperty(int thisnode, char *property, extern int prom_getproperty(int thisnode, const char *property,
char *prop_buffer, int propbuf_size); char *prop_buffer, int propbuf_size);
/* Acquire an integer property. */ /* Acquire an integer property. */
extern int prom_getint(int node, char *property); extern int prom_getint(int node, const char *property);
/* Acquire an integer property, with a default value. */ /* Acquire an integer property, with a default value. */
extern int prom_getintdefault(int node, char *property, int defval); extern int prom_getintdefault(int node, const char *property, int defval);
/* Acquire a boolean property, 0=FALSE 1=TRUE. */ /* Acquire a boolean property, 0=FALSE 1=TRUE. */
extern int prom_getbool(int node, char *prop); extern int prom_getbool(int node, const char *prop);
/* Acquire a string property, null string on error. */ /* Acquire a string property, null string on error. */
extern void prom_getstring(int node, char *prop, char *buf, int bufsize); extern void prom_getstring(int node, const char *prop, char *buf, int bufsize);
/* Does the passed node have the given "name"? YES=1 NO=0 */ /* Does the passed node have the given "name"? YES=1 NO=0 */
extern int prom_nodematch(int thisnode, char *name); extern int prom_nodematch(int thisnode, const char *name);
/* Puts in buffer a prom name in the form name@x,y or name (x for which_io /* Puts in buffer a prom name in the form name@x,y or name (x for which_io
* and y for first regs phys address * and y for first regs phys address
...@@ -300,7 +314,7 @@ extern int prom_getname(int node, char *buf, int buflen); ...@@ -300,7 +314,7 @@ extern int prom_getname(int node, char *buf, int buflen);
/* Search all siblings starting at the passed node for "name" matching /* Search all siblings starting at the passed node for "name" matching
* the given string. Returns the node on success, zero on failure. * the given string. Returns the node on success, zero on failure.
*/ */
extern int prom_searchsiblings(int node_start, char *name); extern int prom_searchsiblings(int node_start, const char *name);
/* Return the first property type, as a string, for the given node. /* Return the first property type, as a string, for the given node.
* Returns a null string on error. Buffer should be at least 32B long. * Returns a null string on error. Buffer should be at least 32B long.
...@@ -310,21 +324,21 @@ extern char *prom_firstprop(int node, char *buffer); ...@@ -310,21 +324,21 @@ extern char *prom_firstprop(int node, char *buffer);
/* Returns the next property after the passed property for the given /* Returns the next property after the passed property for the given
* node. Returns null string on failure. Buffer should be at least 32B long. * node. Returns null string on failure. Buffer should be at least 32B long.
*/ */
extern char *prom_nextprop(int node, char *prev_property, char *buffer); extern char *prom_nextprop(int node, const char *prev_property, char *buffer);
/* Returns 1 if the specified node has given property. */ /* Returns 1 if the specified node has given property. */
extern int prom_node_has_property(int node, char *property); extern int prom_node_has_property(int node, const char *property);
/* Returns phandle of the path specified */ /* Returns phandle of the path specified */
extern int prom_finddevice(char *name); extern int prom_finddevice(const char *name);
/* Set the indicated property at the given node with the passed value. /* Set the indicated property at the given node with the passed value.
* Returns the number of bytes of your value that the prom took. * Returns the number of bytes of your value that the prom took.
*/ */
extern int prom_setprop(int node, char *prop_name, char *prop_value, extern int prom_setprop(int node, const char *prop_name, char *prop_value,
int value_size); int value_size);
extern int prom_pathtoinode(char *path); extern int prom_pathtoinode(const char *path);
extern int prom_inst2pkg(int); extern int prom_inst2pkg(int);
/* CPU probing helpers. */ /* CPU probing helpers. */
...@@ -334,7 +348,7 @@ int cpu_find_by_mid(int mid, int *prom_node); ...@@ -334,7 +348,7 @@ int cpu_find_by_mid(int mid, int *prom_node);
/* Client interface level routines. */ /* Client interface level routines. */
extern void prom_set_trap_table(unsigned long tba); extern void prom_set_trap_table(unsigned long tba);
extern long p1275_cmd (char *, long, ...); extern long p1275_cmd(const char *, long, ...);
#if 0 #if 0
......
...@@ -60,13 +60,13 @@ ...@@ -60,13 +60,13 @@
* table can map * table can map
*/ */
#define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3)) #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3))
#define PMD_SIZE (1UL << PMD_SHIFT) #define PMD_SIZE (_AC(1,UL) << PMD_SHIFT)
#define PMD_MASK (~(PMD_SIZE-1)) #define PMD_MASK (~(PMD_SIZE-1))
#define PMD_BITS (PAGE_SHIFT - 2) #define PMD_BITS (PAGE_SHIFT - 2)
/* PGDIR_SHIFT determines what a third-level page table entry can map */ /* PGDIR_SHIFT determines what a third-level page table entry can map */
#define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS) #define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT-3) + PMD_BITS)
#define PGDIR_SIZE (1UL << PGDIR_SHIFT) #define PGDIR_SIZE (_AC(1,UL) << PGDIR_SHIFT)
#define PGDIR_MASK (~(PGDIR_SIZE-1)) #define PGDIR_MASK (~(PGDIR_SIZE-1))
#define PGDIR_BITS (PAGE_SHIFT - 2) #define PGDIR_BITS (PAGE_SHIFT - 2)
...@@ -336,7 +336,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *p ...@@ -336,7 +336,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *p
#define pte_clear(mm,addr,ptep) \ #define pte_clear(mm,addr,ptep) \
set_pte_at((mm), (addr), (ptep), __pte(0UL)) set_pte_at((mm), (addr), (ptep), __pte(0UL))
extern pgd_t swapper_pg_dir[1]; extern pgd_t swapper_pg_dir[2048];
extern pmd_t swapper_low_pmd_dir[2048];
/* These do nothing with the way I have things setup. */ /* These do nothing with the way I have things setup. */
#define mmu_lockarea(vaddr, len) (vaddr) #define mmu_lockarea(vaddr, len) (vaddr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment