Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (49 commits) [POWERPC] Add zImage.iseries to arch/powerpc/boot/.gitignore [POWERPC] bootwrapper: fix build error on virtex405-head.S [POWERPC] 4xx: Fix 460GT support to not enable FPU [POWERPC] 4xx: Add NOR FLASH entries to Canyonlands and Glacier dts [POWERPC] Xilinx: of_serial support for Xilinx uart 16550. [POWERPC] Xilinx: boot support for Xilinx uart 16550. [POWERPC] celleb: Add support for PCI Express [POWERPC] celleb: Move miscellaneous files for Beat [POWERPC] celleb: Move a file for SPU on Beat [POWERPC] celleb: Move files for Beat mmu and iommu [POWERPC] celleb: Move files for Beat hvcall interfaces [POWERPC] celleb: Move the SCC related code for celleb [POWERPC] celleb: Move the files for celleb base support [POWERPC] celleb: Consolidate io-workarounds code [POWERPC] cell: Generalize io-workarounds code [POWERPC] Add CONFIG_PPC_PSERIES_DEBUG to enable debugging for platforms/pseries [POWERPC] Convert from DBG() to pr_debug() in platforms/pseries/ [POWERPC] Register udbg console early on pseries LPAR [POWERPC] Mark udbg console as CON_ANYTIME, ie. callable early in boot [POWERPC] Set udbg_console index to 0 ...
This commit is contained in:
106
include/asm-powerpc/fixmap.h
Normal file
106
include/asm-powerpc/fixmap.h
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* fixmap.h: compile-time virtual memory allocation
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1998 Ingo Molnar
|
||||
*
|
||||
* Copyright 2008 Freescale Semiconductor Inc.
|
||||
* Port to powerpc added by Kumar Gala
|
||||
*/
|
||||
|
||||
#ifndef _ASM_FIXMAP_H
|
||||
#define _ASM_FIXMAP_H
|
||||
|
||||
extern unsigned long FIXADDR_TOP;
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/page.h>
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
#include <linux/threads.h>
|
||||
#include <asm/kmap_types.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Here we define all the compile-time 'special' virtual
|
||||
* addresses. The point is to have a constant address at
|
||||
* compile time, but to set the physical address only
|
||||
* in the boot process. We allocate these special addresses
|
||||
* from the end of virtual memory (0xfffff000) backwards.
|
||||
* Also this lets us do fail-safe vmalloc(), we
|
||||
* can guarantee that these special addresses and
|
||||
* vmalloc()-ed addresses never overlap.
|
||||
*
|
||||
* these 'compile-time allocated' memory buffers are
|
||||
* fixed-size 4k pages. (or larger if used with an increment
|
||||
* highger than 1) use fixmap_set(idx,phys) to associate
|
||||
* physical memory with fixmap indices.
|
||||
*
|
||||
* TLB entries of such buffers will not be flushed across
|
||||
* task switches.
|
||||
*/
|
||||
enum fixed_addresses {
|
||||
FIX_HOLE,
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
|
||||
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
|
||||
#endif
|
||||
/* FIX_PCIE_MCFG, */
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap (enum fixed_addresses idx,
|
||||
phys_addr_t phys, pgprot_t flags);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define clear_fixmap(idx) \
|
||||
__set_fixmap(idx, 0, __pgprot(0))
|
||||
|
||||
#define __FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
||||
|
||||
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
||||
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
|
||||
|
||||
extern void __this_fixmap_does_not_exist(void);
|
||||
|
||||
/*
|
||||
* 'index to address' translation. If anyone tries to use the idx
|
||||
* directly without tranlation, we catch the bug with a NULL-deference
|
||||
* kernel oops. Illegal ranges of incoming indices are caught too.
|
||||
*/
|
||||
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
{
|
||||
/*
|
||||
* this branch gets completely eliminated after inlining,
|
||||
* except when someone tries to use fixaddr indices in an
|
||||
* illegal way. (such as mixing up address types or using
|
||||
* out-of-range indices).
|
||||
*
|
||||
* If it doesn't get removed, the linker will complain
|
||||
* loudly with a reasonably clear error message..
|
||||
*/
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
||||
{
|
||||
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
|
||||
return __virt_to_fix(vaddr);
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif
|
||||
@@ -27,9 +27,7 @@
|
||||
#include <asm/kmap_types.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/* undef for production */
|
||||
#define HIGHMEM_DEBUG 1
|
||||
#include <asm/fixmap.h>
|
||||
|
||||
extern pte_t *kmap_pte;
|
||||
extern pgprot_t kmap_prot;
|
||||
@@ -40,14 +38,12 @@ extern pte_t *pkmap_page_table;
|
||||
* easily, subsequent pte tables have to be allocated in one physical
|
||||
* chunk of RAM.
|
||||
*/
|
||||
#define PKMAP_BASE CONFIG_HIGHMEM_START
|
||||
#define LAST_PKMAP (1 << PTE_SHIFT)
|
||||
#define LAST_PKMAP_MASK (LAST_PKMAP-1)
|
||||
#define PKMAP_BASE ((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK)
|
||||
#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
|
||||
#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
|
||||
|
||||
#define KMAP_FIX_BEGIN (PKMAP_BASE + 0x00400000UL)
|
||||
|
||||
extern void *kmap_high(struct page *page);
|
||||
extern void kunmap_high(struct page *page);
|
||||
|
||||
@@ -73,7 +69,7 @@ static inline void kunmap(struct page *page)
|
||||
* be used in IRQ contexts, so in some (very limited) cases we need
|
||||
* it.
|
||||
*/
|
||||
static inline void *kmap_atomic(struct page *page, enum km_type type)
|
||||
static inline void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot)
|
||||
{
|
||||
unsigned int idx;
|
||||
unsigned long vaddr;
|
||||
@@ -84,34 +80,39 @@ static inline void *kmap_atomic(struct page *page, enum km_type type)
|
||||
return page_address(page);
|
||||
|
||||
idx = type + KM_TYPE_NR*smp_processor_id();
|
||||
vaddr = KMAP_FIX_BEGIN + idx * PAGE_SIZE;
|
||||
#ifdef HIGHMEM_DEBUG
|
||||
BUG_ON(!pte_none(*(kmap_pte+idx)));
|
||||
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
BUG_ON(!pte_none(*(kmap_pte-idx)));
|
||||
#endif
|
||||
set_pte_at(&init_mm, vaddr, kmap_pte+idx, mk_pte(page, kmap_prot));
|
||||
set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
|
||||
flush_tlb_page(NULL, vaddr);
|
||||
|
||||
return (void*) vaddr;
|
||||
}
|
||||
|
||||
static inline void *kmap_atomic(struct page *page, enum km_type type)
|
||||
{
|
||||
return kmap_atomic_prot(page, type, kmap_prot);
|
||||
}
|
||||
|
||||
static inline void kunmap_atomic(void *kvaddr, enum km_type type)
|
||||
{
|
||||
#ifdef HIGHMEM_DEBUG
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
|
||||
unsigned int idx = type + KM_TYPE_NR*smp_processor_id();
|
||||
enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
|
||||
|
||||
if (vaddr < KMAP_FIX_BEGIN) { // FIXME
|
||||
if (vaddr < __fix_to_virt(FIX_KMAP_END)) {
|
||||
pagefault_enable();
|
||||
return;
|
||||
}
|
||||
|
||||
BUG_ON(vaddr != KMAP_FIX_BEGIN + idx * PAGE_SIZE);
|
||||
BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
|
||||
|
||||
/*
|
||||
* force other mappings to Oops if they'll try to access
|
||||
* this pte without first remap it
|
||||
*/
|
||||
pte_clear(&init_mm, vaddr, kmap_pte+idx);
|
||||
pte_clear(&init_mm, vaddr, kmap_pte-idx);
|
||||
flush_tlb_page(NULL, vaddr);
|
||||
#endif
|
||||
pagefault_enable();
|
||||
@@ -120,12 +121,14 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type)
|
||||
static inline struct page *kmap_atomic_to_page(void *ptr)
|
||||
{
|
||||
unsigned long idx, vaddr = (unsigned long) ptr;
|
||||
pte_t *pte;
|
||||
|
||||
if (vaddr < KMAP_FIX_BEGIN)
|
||||
if (vaddr < FIXADDR_START)
|
||||
return virt_to_page(ptr);
|
||||
|
||||
idx = (vaddr - KMAP_FIX_BEGIN) >> PAGE_SHIFT;
|
||||
return pte_page(kmap_pte[idx]);
|
||||
idx = virt_to_fix(vaddr);
|
||||
pte = kmap_pte - (idx - FIX_KMAP_BEGIN);
|
||||
return pte_page(*pte);
|
||||
}
|
||||
|
||||
#define flush_cache_kmaps() flush_cache_all()
|
||||
|
||||
@@ -1,59 +1,60 @@
|
||||
/* This file is meant to be include multiple times by other headers */
|
||||
/* last 2 argments are used by platforms/cell/io-workarounds.[ch] */
|
||||
|
||||
DEF_PCI_AC_RET(readb, u8, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_RET(readw, u16, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_RET(readl, u32, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_RET(readw_be, u16, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_RET(readl_be, u32, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_NORET(writeb, (u8 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_NORET(writew, (u16 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_NORET(writel, (u32 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_NORET(writew_be, (u16 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_NORET(writel_be, (u32 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_RET(readb, u8, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_RET(readw, u16, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_RET(readl, u32, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_RET(readw_be, u16, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_RET(readl_be, u32, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writeb, (u8 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writew, (u16 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writel, (u32 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writew_be, (u16 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writel_be, (u32 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
|
||||
#ifdef __powerpc64__
|
||||
DEF_PCI_AC_RET(readq, u64, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_RET(readq_be, u64, (const PCI_IO_ADDR addr), (addr))
|
||||
DEF_PCI_AC_NORET(writeq, (u64 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_NORET(writeq_be, (u64 val, PCI_IO_ADDR addr), (val, addr))
|
||||
DEF_PCI_AC_RET(readq, u64, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_RET(readq_be, u64, (const PCI_IO_ADDR addr), (addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writeq, (u64 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
DEF_PCI_AC_NORET(writeq_be, (u64 val, PCI_IO_ADDR addr), (val, addr), mem, addr)
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
DEF_PCI_AC_RET(inb, u8, (unsigned long port), (port))
|
||||
DEF_PCI_AC_RET(inw, u16, (unsigned long port), (port))
|
||||
DEF_PCI_AC_RET(inl, u32, (unsigned long port), (port))
|
||||
DEF_PCI_AC_NORET(outb, (u8 val, unsigned long port), (val, port))
|
||||
DEF_PCI_AC_NORET(outw, (u16 val, unsigned long port), (val, port))
|
||||
DEF_PCI_AC_NORET(outl, (u32 val, unsigned long port), (val, port))
|
||||
DEF_PCI_AC_RET(inb, u8, (unsigned long port), (port), pio, port)
|
||||
DEF_PCI_AC_RET(inw, u16, (unsigned long port), (port), pio, port)
|
||||
DEF_PCI_AC_RET(inl, u32, (unsigned long port), (port), pio, port)
|
||||
DEF_PCI_AC_NORET(outb, (u8 val, unsigned long port), (val, port), pio, port)
|
||||
DEF_PCI_AC_NORET(outw, (u16 val, unsigned long port), (val, port), pio, port)
|
||||
DEF_PCI_AC_NORET(outl, (u32 val, unsigned long port), (val, port), pio, port)
|
||||
|
||||
DEF_PCI_AC_NORET(readsb, (const PCI_IO_ADDR a, void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(readsw, (const PCI_IO_ADDR a, void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(readsl, (const PCI_IO_ADDR a, void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(writesb, (PCI_IO_ADDR a, const void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(writesw, (PCI_IO_ADDR a, const void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(writesl, (PCI_IO_ADDR a, const void *b, unsigned long c), \
|
||||
(a, b, c))
|
||||
DEF_PCI_AC_NORET(readsb, (const PCI_IO_ADDR a, void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
DEF_PCI_AC_NORET(readsw, (const PCI_IO_ADDR a, void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
DEF_PCI_AC_NORET(readsl, (const PCI_IO_ADDR a, void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
DEF_PCI_AC_NORET(writesb, (PCI_IO_ADDR a, const void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
DEF_PCI_AC_NORET(writesw, (PCI_IO_ADDR a, const void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
DEF_PCI_AC_NORET(writesl, (PCI_IO_ADDR a, const void *b, unsigned long c),
|
||||
(a, b, c), mem, a)
|
||||
|
||||
DEF_PCI_AC_NORET(insb, (unsigned long p, void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c), \
|
||||
(p, b, c))
|
||||
DEF_PCI_AC_NORET(insb, (unsigned long p, void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c),
|
||||
(p, b, c), pio, p)
|
||||
|
||||
DEF_PCI_AC_NORET(memset_io, (PCI_IO_ADDR a, int c, unsigned long n), \
|
||||
(a, c, n))
|
||||
DEF_PCI_AC_NORET(memcpy_fromio,(void *d,const PCI_IO_ADDR s,unsigned long n), \
|
||||
(d, s, n))
|
||||
DEF_PCI_AC_NORET(memcpy_toio,(PCI_IO_ADDR d,const void *s,unsigned long n), \
|
||||
(d, s, n))
|
||||
DEF_PCI_AC_NORET(memset_io, (PCI_IO_ADDR a, int c, unsigned long n),
|
||||
(a, c, n), mem, a)
|
||||
DEF_PCI_AC_NORET(memcpy_fromio, (void *d, const PCI_IO_ADDR s, unsigned long n),
|
||||
(d, s, n), mem, s)
|
||||
DEF_PCI_AC_NORET(memcpy_toio, (PCI_IO_ADDR d, const void *s, unsigned long n),
|
||||
(d, s, n), mem, d)
|
||||
|
||||
@@ -458,8 +458,8 @@ __do_out_asm(_rec_outl, "stwbrx")
|
||||
/* Structure containing all the hooks */
|
||||
extern struct ppc_pci_io {
|
||||
|
||||
#define DEF_PCI_AC_RET(name, ret, at, al) ret (*name) at;
|
||||
#define DEF_PCI_AC_NORET(name, at, al) void (*name) at;
|
||||
#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) ret (*name) at;
|
||||
#define DEF_PCI_AC_NORET(name, at, al, space, aa) void (*name) at;
|
||||
|
||||
#include <asm/io-defs.h>
|
||||
|
||||
@@ -469,7 +469,7 @@ extern struct ppc_pci_io {
|
||||
} ppc_pci_io;
|
||||
|
||||
/* The inline wrappers */
|
||||
#define DEF_PCI_AC_RET(name, ret, at, al) \
|
||||
#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \
|
||||
static inline ret name at \
|
||||
{ \
|
||||
if (DEF_PCI_HOOK(ppc_pci_io.name) != NULL) \
|
||||
@@ -477,7 +477,7 @@ static inline ret name at \
|
||||
return __do_##name al; \
|
||||
}
|
||||
|
||||
#define DEF_PCI_AC_NORET(name, at, al) \
|
||||
#define DEF_PCI_AC_NORET(name, at, al, space, aa) \
|
||||
static inline void name at \
|
||||
{ \
|
||||
if (DEF_PCI_HOOK(ppc_pci_io.name) != NULL) \
|
||||
|
||||
@@ -11,16 +11,11 @@
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
|
||||
#define PHYSICAL_START KDUMP_KERNELBASE
|
||||
#define KDUMP_TRAMPOLINE_START 0x0100
|
||||
#define KDUMP_TRAMPOLINE_END 0x3000
|
||||
|
||||
#define KDUMP_MIN_TCE_ENTRIES 2048
|
||||
|
||||
#else /* !CONFIG_CRASH_DUMP */
|
||||
|
||||
#define PHYSICAL_START 0x0
|
||||
|
||||
#endif /* CONFIG_CRASH_DUMP */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@@ -108,6 +108,7 @@ struct paca_struct {
|
||||
};
|
||||
|
||||
extern struct paca_struct paca[];
|
||||
extern void initialise_pacas(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_PACA_H */
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <asm/asm-compat.h>
|
||||
#include <asm/kdump.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
/*
|
||||
* On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software
|
||||
@@ -42,8 +43,23 @@
|
||||
*
|
||||
* The kdump dump kernel is one example where KERNELBASE != PAGE_OFFSET.
|
||||
*
|
||||
* To get a physical address from a virtual one you subtract PAGE_OFFSET,
|
||||
* _not_ KERNELBASE.
|
||||
* PAGE_OFFSET is the virtual address of the start of lowmem.
|
||||
*
|
||||
* PHYSICAL_START is the physical address of the start of the kernel.
|
||||
*
|
||||
* MEMORY_START is the physical address of the start of lowmem.
|
||||
*
|
||||
* KERNELBASE, PAGE_OFFSET, and PHYSICAL_START are all configurable on
|
||||
* ppc32 and based on how they are set we determine MEMORY_START.
|
||||
*
|
||||
* For the linear mapping the following equation should be true:
|
||||
* KERNELBASE - PAGE_OFFSET = PHYSICAL_START - MEMORY_START
|
||||
*
|
||||
* Also, KERNELBASE >= PAGE_OFFSET and PHYSICAL_START >= MEMORY_START
|
||||
*
|
||||
* There are two was to determine a physical address from a virtual one:
|
||||
* va = pa + PAGE_OFFSET - MEMORY_START
|
||||
* va = pa + KERNELBASE - PHYSICAL_START
|
||||
*
|
||||
* If you want to know something's offset from the start of the kernel you
|
||||
* should subtract KERNELBASE.
|
||||
@@ -51,20 +67,33 @@
|
||||
* If you want to test if something's a kernel address, use is_kernel_addr().
|
||||
*/
|
||||
|
||||
#define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START)
|
||||
#define KERNELBASE (PAGE_OFFSET + PHYSICAL_START)
|
||||
#define LOAD_OFFSET PAGE_OFFSET
|
||||
#define KERNELBASE ASM_CONST(CONFIG_KERNEL_START)
|
||||
#define PAGE_OFFSET ASM_CONST(CONFIG_PAGE_OFFSET)
|
||||
#define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START))
|
||||
|
||||
#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_FLATMEM)
|
||||
#ifndef __ASSEMBLY__
|
||||
extern phys_addr_t memstart_addr;
|
||||
extern phys_addr_t kernstart_addr;
|
||||
#endif
|
||||
#define PHYSICAL_START kernstart_addr
|
||||
#define MEMORY_START memstart_addr
|
||||
#else
|
||||
#define PHYSICAL_START ASM_CONST(CONFIG_PHYSICAL_START)
|
||||
#define MEMORY_START (PHYSICAL_START + PAGE_OFFSET - KERNELBASE)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FLATMEM
|
||||
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
||||
#define ARCH_PFN_OFFSET (MEMORY_START >> PAGE_SHIFT)
|
||||
#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (ARCH_PFN_OFFSET + max_mapnr))
|
||||
#endif
|
||||
|
||||
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||
|
||||
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
|
||||
#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET)
|
||||
#define __va(x) ((void *)((unsigned long)(x) - PHYSICAL_START + KERNELBASE))
|
||||
#define __pa(x) ((unsigned long)(x) + PHYSICAL_START - KERNELBASE)
|
||||
|
||||
/*
|
||||
* Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
#ifndef _ASM_POWERPC_PAGE_32_H
|
||||
#define _ASM_POWERPC_PAGE_32_H
|
||||
|
||||
#if defined(CONFIG_PHYSICAL_ALIGN) && (CONFIG_PHYSICAL_START != 0)
|
||||
#if (CONFIG_PHYSICAL_START % CONFIG_PHYSICAL_ALIGN) != 0
|
||||
#error "CONFIG_PHYSICAL_START must be a multiple of CONFIG_PHYSICAL_ALIGN"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS32
|
||||
|
||||
#ifdef CONFIG_NOT_COHERENT_CACHE
|
||||
|
||||
@@ -80,12 +80,8 @@ struct thread_info {
|
||||
|
||||
#else /* THREAD_SHIFT < PAGE_SHIFT */
|
||||
|
||||
#ifdef CONFIG_DEBUG_STACK_USAGE
|
||||
#define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL)
|
||||
#else
|
||||
#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
|
||||
#endif
|
||||
#define free_thread_info(ti) kfree(ti)
|
||||
extern struct thread_info *alloc_thread_info(struct task_struct *tsk);
|
||||
extern void free_thread_info(struct thread_info *ti);
|
||||
|
||||
#endif /* THREAD_SHIFT < PAGE_SHIFT */
|
||||
|
||||
|
||||
@@ -15,10 +15,8 @@
|
||||
* physical need a larger than native word size type. -Matt
|
||||
*/
|
||||
#ifndef CONFIG_PHYS_64BIT
|
||||
typedef unsigned long phys_addr_t;
|
||||
#define PHYS_FMT "%.8lx"
|
||||
#else
|
||||
typedef unsigned long long phys_addr_t;
|
||||
extern phys_addr_t fixup_bigphys_addr(phys_addr_t, phys_addr_t);
|
||||
#define PHYS_FMT "%16Lx"
|
||||
#endif
|
||||
|
||||
@@ -35,10 +35,6 @@
|
||||
#include <platforms/tqm8260.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PQ2ADS) || defined (CONFIG_PQ2FADS)
|
||||
#include <platforms/pq2ads.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI_8260
|
||||
#include <syslib/m82xx_pci.h>
|
||||
#endif
|
||||
|
||||
@@ -63,10 +63,6 @@
|
||||
#include <platforms/lantec.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MPC885ADS)
|
||||
#include <platforms/mpc885ads.h>
|
||||
#endif
|
||||
|
||||
/* Currently, all 8xx boards that support a processor to PCI/ISA bridge
|
||||
* use the same memory map.
|
||||
*/
|
||||
|
||||
@@ -1926,6 +1926,8 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
|
||||
|
||||
#endif
|
||||
|
||||
extern void thread_info_cache_init(void);
|
||||
|
||||
/* set thread flags in other task's structures
|
||||
* - see asm/thread_info.h for TIF_xxxx flags available
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user