Hey Scott, So, Why do you want to force the virtual address for the peripherals to E0x?, from the febfxxxx that TS set up? On the other hand you can just let the kernel dynamically set up the virtual address like I'm doing. The only gotcha there is that I'm having trouble with disabling cached reads outside of the driver when using mmap. Stuart Wood -----Original Message----- From: linux-cirrus-bounce@xxxxxxxxxxxxx [mailto:linux-cirrus-bounce@xxxxxxxxxxxxx] On Behalf Of Wagner Scott (ST-IN/ENG1.1) Sent: Monday, June 18, 2007 9:09 AM To: linux-cirrus@xxxxxxxxxxxxx Subject: [linux-cirrus] Memory mapping (virtual to physical) __virt_to_phys() Hello all, I have an EP9302 running Linux 2.6.14 and using the following memory mapping: * 0xF200_0000 - 0xF2FF_FFFF 16 MB 0xfebfc000 nCS0 NAND Flash Address * 0xF100_0000 - 0xF1FF_FFFF 16 MB 0xfebfb000 nCS0 NAND Flash Command * 0xF000_0000 - 0xF0FF_FFFF 16 MB 0xfebfa000 nCS0 NAND Flash Data * 0xE000_0000 - 0xEFFF_FFFF 256 MB 0xc8000000 nSDCS2 SDRAM #2 * 0xD000_0000 - 0xDFFF_FFFF 256 MB - nSDCS1 Unused * 0xC000_0000 - 0xCFFF_FFFF 256 MB - nSDCS0 Unused * 0x8080_0000 - 0x8FFF_FFFF 248 MB 0xE0800000 APB EP9302 Peripherals * 0x8000_0000 - 0x800F_FFFF 1 MB 0xE0000000 AHB EP9302 Peripherals * 0x7000_0000 - 0x7FFF_FFFF 256 MB - nCS7 Unused * 0x6000_0000 - 0x6FFF_FFFF 256 MB - nCS6 Unused * 0x4000_0000 - 0x4FFF_FFFF Unused * 0x3000_0000 - 0x3000_00FF 256 B 0xfebf3000 nCS3 Peripheral 3 * 0x2000_0000 - 0x2000_00FF 256 B 0xfebf2000 nCS2 Peripheral 2 * 0x1000_0000 - 0x1000_00FF 256 B 0xfebf0000 nCS1 Peripheral 1 * 0x0000_0000 - 0x0FFF_FFFF 256 MB 0xc0000000 nSDCS3 SDRAM #1 My problem is with the __virt_to_phys() macro in ./include/arch/arm/memory.h. I have __phys_to_virt() mapping SDRAM physical addresses 0x00nn_nnnn to vrtual 0xC0nn_nnnn for the low block; 0xE0nn_nnnn to 0xC8nn_nnnn for the low block. I would expect that __virt_to_phys() should map addresses 0xC0nn_nnnn to 0x00nn_nnnn for the low block; 0xC8nn_nnnn to 0xE0nn_nnnn for the low block. This does not do what I expect. When I use this __virt_to_phys() mapping, the EP9302 peripherals do not work (note that they are mapped at virtual address 0xE0nn_nnnn). If I have __virt_to_phys() map the high block at C800_0000 to 4000_0000 (where there is nothing in either virtual or physical space), everything seems to work OK. I don't understand this. First, why can't I do a V to P mapping back to E0x? The peripherals are at _virtual_ E0, not _physical_ E0. Second, why does lying and mapping the high SDRAM block back to 40x (where there is absolutely nothing) work? Thanks in advance. Scott Wagner