Messages in this thread Patch in this message | | | Date | Thu, 2 Dec 2004 11:28:53 -0500 | From | Linh Dang <> | Subject | Re: [PATCH][PPC32[NEWBIE] enhancement to virt_to_bus/bus_to_virt (try 2) |
| |
In 2.6.9 on non-APUS ppc32 platforms, virt_to_bus() will just subtract KERNELBASE from the the virtual address. bus_to_virt() will perform the reverse operation.
This patch will make virt_to_bus():
- perform the current operation if the virtual address is between KERNELBASE and ioremap_bot.
- use iopa() (as on APUS platform) otherwise.
The patch will make bus_to_virt():
- perform the current operation if the bus address is between PCI_DRAM_OFFSET and (ioremap_bot - KERNELBASE + PCI_DRAM_OFFSET).
- use mm_ptov() (as on APUS platform) otherwise.
The patch also changes virt_to_phys()/phys_to_virt() in a similar way.
-- Linh Dang
--- include/asm-ppc/io.h~2.6.9 2004-11-12 14:24:46.000000000 -0500 +++ include/asm-ppc/io.h 2004-12-02 11:20:21.000000000 -0500 @@ -6,10 +6,11 @@ #include <linux/types.h> #include <asm/page.h> #include <asm/byteorder.h> #include <asm/mmu.h> +#include <asm/pgtable.h> #define SIO_CONFIG_RA 0x398 #define SIO_CONFIG_RD 0x399 #define SLOW_DOWN_IO @@ -222,49 +223,56 @@ extern void io_block_mapping(unsigned lo * have to be modified [mapped] appropriately. */ extern inline unsigned long virt_to_bus(volatile void * address) { #ifndef CONFIG_APUS - if (address == (void *)0) + if (unlikely(address == (void *)0)) return 0; + if (likely((address >= (void*) KERNELBASE) && + (address < ((void*) ioremap_bot)))) return (unsigned long)address - KERNELBASE + PCI_DRAM_OFFSET; -#else - return iopa ((unsigned long) address); + else #endif + return iopa ((unsigned long) address); } extern inline void * bus_to_virt(unsigned long address) { #ifndef CONFIG_APUS - if (address == 0) + if (unlikely (address == 0)) return NULL; + if (likely((address >= PCI_DRAM_OFFSET) && + (address < (ioremap_bot - KERNELBASE + PCI_DRAM_OFFSET)))) return (void *)(address - PCI_DRAM_OFFSET + KERNELBASE); -#else - return (void*) mm_ptov (address); + else #endif + return (void*) mm_ptov (address); } /* * Change virtual addresses to physical addresses and vv, for * addresses in the area where the kernel has the RAM mapped. */ extern inline unsigned long virt_to_phys(volatile void * address) { #ifndef CONFIG_APUS + if (likely((address >= (void*) KERNELBASE) && + (address < ((void*) ioremap_bot)))) return (unsigned long) address - KERNELBASE; -#else - return iopa ((unsigned long) address); + else #endif + return iopa ((unsigned long) address); } extern inline void * phys_to_virt(unsigned long address) { #ifndef CONFIG_APUS + if (likely(address < (ioremap_bot - KERNELBASE))) return (void *) (address + KERNELBASE); -#else - return (void*) mm_ptov (address); + else #endif + return (void*) mm_ptov (address); } /* * Change "struct page" to physical address. */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |