diff options
Diffstat (limited to 'arch/arm/mm/mm-ebsa285.c')
-rw-r--r-- | arch/arm/mm/mm-ebsa285.c | 128 |
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" |