I've seen the same thing, I believe the standard __virt_to_phys macro's don't work because mmaping is being setup outside of the standard Linux method in: include/asm-arm/arch-ep93xx/ep93xx-regs.h Your path of least resistance is probably to use those macro's instead for standard register mappings. gl, NZG > -----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