summaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/mm-ebsa285.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/mm-ebsa285.c')
-rw-r--r--arch/arm/mm/mm-ebsa285.c128
1 files changed, 55 insertions, 73 deletions
diff --git a/arch/arm/mm/mm-ebsa285.c b/arch/arm/mm/mm-ebsa285.c
index eb5d7152a..82bbce899 100644
--- a/arch/arm/mm/mm-ebsa285.c
+++ b/arch/arm/mm/mm-ebsa285.c
@@ -3,16 +3,48 @@
*
* Extra MM routines for the EBSA285 architecture
*
- * Copyright (C) 1998 Russell King
+ * Copyright (C) 1998 Russell King, Dave Gilbert.
*/
+#include <linux/config.h>
#include <linux/sched.h>
#include <linux/mm.h>
+#include <linux/init.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/io.h>
#include <asm/proc/mm-init.h>
-
+
+/*
+ * These two functions convert PCI bus addresses to virtual addresses
+ * and back again.
+ */
+unsigned long __virt_to_bus(unsigned long res)
+{
+ if (res < PAGE_OFFSET || res >= 0xD0000000) {
+ printk("__virt_to_bus: invalid address 0x%08lx\n", res);
+#ifdef CONFIG_DEBUG_ERRORS
+ __backtrace();
+#endif
+ } else
+ res = (res - PAGE_OFFSET) + 0x10000000;
+
+ return res;
+}
+
+unsigned long __bus_to_virt(unsigned long res)
+{
+ if (res < 0x10000000 || res >= 0x20000000) {
+ printk("__bus_to_virt: invalid address 0x%08lx\n", res);
+#ifdef CONFIG_DEBUG_ERRORS
+ __backtrace();
+#endif
+ } else
+ res = (res - 0x10000000) + PAGE_OFFSET;
+
+ return res;
+}
+
/* Logical Physical
* 0xfff00000 0x40000000 X-Bus
* 0xffe00000 0x7c000000 PCI I/O space
@@ -23,75 +55,25 @@
* 0xf8000000 0x7b000000 PCI Config type 0
*/
-static struct mapping {
- unsigned long virtual;
- unsigned long physical;
- unsigned long length;
-} io_mapping[] = {
- /*
- * This is to allow us to fiddle with the EEPROM
- * This entry will go away in time
- */
- { 0xd8000000, 0x41000000, 0x00400000 },
-
- /*
- * These ones are so that we can fiddle
- * with the various cards (eg VGA)
- * until we're happy with them...
- */
- { 0xdc000000, 0x7c000000, 0x00100000 },
- { 0xe0000000, 0x80000000, 0x10000000 },
-
- { 0xf8000000, 0x7b000000, 0x01000000 }, /* Type 0 Config */
-
- { 0xf9000000, 0x7a000000, 0x01000000 }, /* Type 1 Config */
-
- { 0xfc000000, 0x79000000, 0x01000000 }, /* PCI IACK */
- { 0xfd000000, 0x78000000, 0x01000000 }, /* Outbound wflsh*/
- { 0xfe000000, 0x42000000, 0x01000000 }, /* CSR */
- { 0xffe00000, 0x7c000000, 0x00100000 }, /* PCI I/O */
- { 0xfff00000, 0x40000000, 0x00100000 }, /* X-Bus */
-};
-
-#define SIZEOFIO (sizeof(io_mapping) / sizeof(io_mapping[0]))
-
-/* map in IO */
-unsigned long setup_io_pagetables(unsigned long start_mem)
-{
- struct mapping *mp;
- int i;
-
- for (i = 0, mp = io_mapping; i < SIZEOFIO; i++, mp++) {
- while ((mp->virtual & 1048575 || mp->physical & 1048575) && mp->length >= PAGE_SIZE) {
- alloc_init_page(&start_mem, mp->virtual, mp->physical, DOMAIN_IO,
- PTE_AP_WRITE);
-
- mp->length -= PAGE_SIZE;
- mp->virtual += PAGE_SIZE;
- mp->physical += PAGE_SIZE;
- }
-
- while (mp->length >= 1048576) {
-if (mp->virtual > 0xf0000000)
- alloc_init_section(&start_mem, mp->virtual, mp->physical, DOMAIN_IO,
- PMD_SECT_AP_WRITE);
-else
-alloc_init_section(&start_mem, mp->virtual, mp->physical, DOMAIN_USER, PMD_SECT_AP_WRITE | PMD_SECT_AP_READ);
-
- mp->length -= 1048576;
- mp->virtual += 1048576;
- mp->physical += 1048576;
- }
-
- while (mp->length >= PAGE_SIZE) {
- alloc_init_page(&start_mem, mp->virtual, mp->physical, DOMAIN_IO,
- PTE_AP_WRITE);
-
- mp->length -= PAGE_SIZE;
- mp->virtual += PAGE_SIZE;
- mp->physical += PAGE_SIZE;
- }
- }
- return start_mem;
-}
+/*
+ * This is to allow us to fiddle with the EEPROM
+ * This entry will go away in time, once the fmu
+ * can mmap() the flash.
+ *
+ * These ones are so that we can fiddle
+ * with the various cards (eg VGA)
+ * until we're happy with them...
+ */
+#define MAPPING \
+ { 0xd8000000, 0x41000000, 0x00400000, DOMAIN_USER, 1, 1 }, /* EEPROM */ \
+ { 0xdc000000, 0x7c000000, 0x00100000, DOMAIN_USER, 1, 1 }, /* VGA */ \
+ { 0xe0000000, 0x80000000, 0x10000000, DOMAIN_USER, 1, 1 }, /* VGA */ \
+ { 0xf8000000, 0x7b000000, 0x01000000, DOMAIN_IO , 0, 1 }, /* Type 0 Config */ \
+ { 0xf9000000, 0x7a000000, 0x01000000, DOMAIN_IO , 0, 1 }, /* Type 1 Config */ \
+ { 0xfc000000, 0x79000000, 0x01000000, DOMAIN_IO , 0, 1 }, /* PCI IACK */ \
+ { 0xfd000000, 0x78000000, 0x01000000, DOMAIN_IO , 0, 1 }, /* Outbound wflsh*/ \
+ { 0xfe000000, 0x42000000, 0x01000000, DOMAIN_IO , 0, 1 }, /* CSR */ \
+ { 0xffe00000, 0x7c000000, 0x00100000, DOMAIN_IO , 0, 1 }, /* PCI I/O */ \
+ { 0xfff00000, 0x40000000, 0x00100000, DOMAIN_IO , 0, 1 }, /* X-Bus */
+#include "mm-armv.c"