sh: Clean up places that make 29-bit physical assumptions.
authorStuart Menefy <stuart.menefy@st.com>
Fri, 30 Nov 2007 08:52:53 +0000 (17:52 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 28 Jan 2008 04:18:59 +0000 (13:18 +0900)
Signed-off-by: Stuart Menefy <stuart.menefy@st.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/boot/compressed/misc_32.c
arch/sh/kernel/setup.c
arch/sh/kernel/vmlinux_32.lds.S
include/asm-sh/addrspace.h
include/asm-sh/cpu-sh4/mmu_context.h
include/asm-sh/io.h
include/asm-sh/page.h
include/asm-sh/pgtable.h
include/asm-sh/pgtable_32.h
include/asm-sh/scatterlist.h

index df65e305acf78b14710efa0ddc32998207fc9fbb..adcea31e663eade000c375f47badafa14189caf8 100644 (file)
@@ -230,7 +230,10 @@ long* stack_start = &user_stack[STACK_SIZE];
 void decompress_kernel(void)
 {
        output_data = 0;
-       output_ptr = P2SEGADDR((unsigned long)&_text+PAGE_SIZE);
+       output_ptr = PHYSADDR((unsigned long)&_text+PAGE_SIZE);
+#ifdef CONFIG_29BIT
+       output_ptr |= P2SEG;
+#endif
        free_mem_ptr = (unsigned long)&_end;
        free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 
index 7eb7fdcce0f83bb7435276d098c8129341948290..f48ce8e5d0a87690499dc56fb4402d77a2e33bc7 100644 (file)
@@ -82,7 +82,7 @@ static int __init early_parse_mem(char *p)
 {
        unsigned long size;
 
-       memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
+       memory_start = (unsigned long)__va(__MEMORY_START);
        size = memparse(p, &p);
 
        if (size > __MEMORY_SIZE) {
@@ -254,7 +254,7 @@ void __init setup_arch(char **cmdline_p)
        data_resource.start = virt_to_phys(_etext);
        data_resource.end = virt_to_phys(_edata)-1;
 
-       memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
+       memory_start = (unsigned long)__va(__MEMORY_START);
        if (!memory_end)
                memory_end = memory_start + __MEMORY_SIZE;
 
index 50c69c18dced77a3473c3d006d0fd6a065932741..d549fac6d3e7dc5cb1692122ad890d670c1a4b9a 100644 (file)
@@ -15,7 +15,12 @@ OUTPUT_ARCH(sh)
 ENTRY(_start)
 SECTIONS
 {
+#ifdef CONFIG_32BIT
+       . = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET;
+#else
        . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET;
+#endif
+
        _text = .;                      /* Text and read-only data */
 
        .empty_zero_page : {
index e7f2deb28e06179b456d8cced784af0c9c9586f6..fa544fc38c233cc546a51c309e203dcd93570cf7 100644 (file)
@@ -31,6 +31,7 @@
 /* Returns the physical address of a PnSEG (n=1,2) address   */
 #define PHYSADDR(a)    (((unsigned long)(a)) & 0x1fffffff)
 
+#ifdef CONFIG_29BIT
 /*
  * Map an address to a certain privileged segment
  */
        ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG))
 #define P4SEGADDR(a)   \
        ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG))
-
+#endif /* 29BIT */
 #endif /* P1SEG */
 
+/* Check if an address can be reached in 29 bits */
+#define IS_29BIT(a)    (((unsigned long)(a)) < 0x20000000)
+
 #endif /* __KERNEL__ */
 #endif /* __ASM_SH_ADDRSPACE_H */
index fdd56e3e3a3bb83351accfdb59426d462cf7cea3..9ea8eb27b18e20dd69d43ce9897a163a3851c9ed 100644 (file)
 #define MMUCR_ME               (0)
 #endif
 
+#if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40)
+#define MMUCR_SE               (1 << 4)
+#else
+#define MMUCR_SE               (0)
+#endif
+
 #ifdef CONFIG_SH_STORE_QUEUES
 #define MMUCR_SQMD             (1 << 9)
 #else
@@ -37,7 +43,7 @@
 #endif
 
 #define MMU_NTLB_ENTRIES       64
-#define MMU_CONTROL_INIT       (0x05|MMUCR_SQMD|MMUCR_ME)
+#define MMU_CONTROL_INIT       (0x05|MMUCR_SQMD|MMUCR_ME|MMUCR_SE)
 
 #define MMU_ITLB_DATA_ARRAY    0xF3000000
 #define MMU_UTLB_DATA_ARRAY    0xF7000000
index a4e5f5573eee2481f56ea0f9530c22f7198b668b..94900c0895198062f356bb0a1c283c709fd56858 100644 (file)
@@ -273,23 +273,9 @@ extern void onchip_unmap(unsigned long vaddr);
 #if !defined(CONFIG_MMU)
 #define virt_to_phys(address)  ((unsigned long)(address))
 #define phys_to_virt(address)  ((void *)(address))
-#elif defined(CONFIG_SUPERH64)
+#else
 #define virt_to_phys(address)  (__pa(address))
 #define phys_to_virt(address)  (__va(address))
-#else
-/*
- * Change virtual addresses to physical addresses and vv.
- * These are trivial on the 1:1 Linux/SuperH mapping
- */
-static inline unsigned long virt_to_phys(volatile void *address)
-{
-       return PHYSADDR(address);
-}
-
-static inline void *phys_to_virt(unsigned long address)
-{
-       return (void *)P1SEGADDR(address);
-}
 #endif
 
 /*
index bff635a078c86a536e0a25d7a9cc764b745d34f2..002e64a4f04950b8fd879cb99d07ed7fadf21c1c 100644 (file)
@@ -5,6 +5,8 @@
  * Copyright (C) 1999  Niibe Yutaka
  */
 
+#include <linux/const.h>
+
 #ifdef __KERNEL__
 
 /* PAGE_SHIFT determines the page size */
 # error "Bogus kernel page size?"
 #endif
 
-#ifdef __ASSEMBLY__
-#define PAGE_SIZE      (1 << PAGE_SHIFT)
-#else
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#endif
-
+#define PAGE_SIZE      (_AC(1, UL) << PAGE_SHIFT)
 #define PAGE_MASK      (~(PAGE_SIZE-1))
 #define PTE_MASK       PAGE_MASK
 
+/* to align the pointer to the (next) page boundary */
+#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
+
 #if defined(CONFIG_HUGETLB_PAGE_SIZE_64K)
 #define HPAGE_SHIFT    16
 #elif defined(CONFIG_HUGETLB_PAGE_SIZE_256K)
@@ -104,20 +104,44 @@ typedef struct { unsigned long pgd; } pgd_t;
 
 #endif /* !__ASSEMBLY__ */
 
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
+/*
+ * __MEMORY_START and SIZE are the physical addresses and size of RAM.
+ */
 #define __MEMORY_START         CONFIG_MEMORY_START
 #define __MEMORY_SIZE          CONFIG_MEMORY_SIZE
 
+/*
+ * PAGE_OFFSET is the virtual address of the start of kernel address
+ * space.
+ */
 #define PAGE_OFFSET            CONFIG_PAGE_OFFSET
-#define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
-#define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
-#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
 
+/*
+ * Virtual to physical RAM address translation.
+ *
+ * In 29 bit mode, the physical offset of RAM from address 0 is visible in
+ * the kernel virtual address space, and thus we don't have to take
+ * this into account when translating. However in 32 bit mode this offset
+ * is not visible (it is part of the PMB mapping) and so needs to be
+ * added or subtracted as required.
+ */
+#ifdef CONFIG_32BIT
+#define __pa(x)        ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START)
+#define __va(x)        ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START))
+#else
+#define __pa(x)        ((unsigned long)(x)-PAGE_OFFSET)
+#define __va(x)        ((void *)((unsigned long)(x)+PAGE_OFFSET))
+#endif
+
+#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
 #define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
-/* PFN start number, because of __MEMORY_START */
+/*
+ * PFN = physical frame number (ie PFN 0 == physical address 0)
+ * PFN_START is the PFN of the first page of RAM. By defining this we
+ * don't have struct page entries for the portion of address space
+ * between physical address 0 and the start of RAM.
+ */
 #define PFN_START              (__MEMORY_START >> PAGE_SHIFT)
 #define ARCH_PFN_OFFSET                (PFN_START)
 #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
index b4d7561cd9e0396c1423749885e28a4bca5ed23f..3df90f003e951bf0f5adedeee505c3ac9e3bb717 100644 (file)
@@ -69,7 +69,13 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
 #define USER_PTRS_PER_PGD      (TASK_SIZE/PGDIR_SIZE)
 #define FIRST_USER_ADDRESS     0
 
-#define PTE_PHYS_MASK          (0x20000000 - PAGE_SIZE)
+#ifdef CONFIG_32BIT
+#define PHYS_ADDR_MASK         0xffffffff
+#else
+#define PHYS_ADDR_MASK         0x1fffffff
+#endif
+
+#define PTE_PHYS_MASK          (PHYS_ADDR_MASK & PAGE_MASK)
 
 #ifdef CONFIG_SUPERH32
 #define VMALLOC_START  (P3SEG)
index 70303603e89dd018dfd8dc5354594a3455a63a19..7efc95404c645eea31a74cb683aa650f0bd3a623 100644 (file)
@@ -98,7 +98,7 @@
 #define _PAGE_CLEAR_FLAGS      (_PAGE_PROTNONE | _PAGE_ACCESSED | _PAGE_FILE)
 #endif
 
-#define _PAGE_FLAGS_HARDWARE_MASK      (0x1fffffff & ~(_PAGE_CLEAR_FLAGS))
+#define _PAGE_FLAGS_HARDWARE_MASK      (PHYS_ADDR_MASK & ~(_PAGE_CLEAR_FLAGS))
 
 /* Hardware flags, page size encoding */
 #if defined(CONFIG_X2TLB)
index a7d0d1856a993bae7cde541f6c4df72a6a464bf3..35ef9c30f0dec8338da7398edc3a716510fdbee0 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __ASM_SH_SCATTERLIST_H
 #define __ASM_SH_SCATTERLIST_H
 
+#include <asm/pgtable.h>
 #include <asm/types.h>
 
 struct scatterlist {
@@ -13,7 +14,7 @@ struct scatterlist {
     unsigned int length;
 };
 
-#define ISA_DMA_THRESHOLD (0x1fffffff)
+#define ISA_DMA_THRESHOLD      PHYS_ADDR_MASK
 
 /* These macros should be used after a pci_map_sg call has been done
  * to get bus addresses of each of the SG entries and their lengths.