[parisc-linux] ioremap with 32bit kernel on 64bit machines
Thomas Bogendoerfer
tsbogend@alpha.franken.de
Thu, 28 Jun 2001 23:03:46 +0200
Hi,
we do have a problem with ioremap on 64bit machines with a 32bit kernel.
While ldaw and friends translate the 32bit address to an appropriate
64bit address our dtlb miss handler doesn't.
ldaw translation:
0x00000000 - 0xefffffff -> 0x00000000 00000000 - 0x00000000 efffffff
0xf0000000 - 0xf0ffffff -> 0xf0000000 00000000 - 0xf0000000 00ffffff
0xf1000000 - 0xffffffff -> 0xffffffff f1000000 - 0xffffffff ffffffff
the second range is PDC address space, don't know whether we need it.
I've added code in dtlb_miss_20 and nadtlb_miss_20 to do following
mapping:
0x00000000 - 0xefffffff -> 0x00000000 00000000 - 0x00000000 efffffff
0xf0000000 - 0xffffffff -> 0xffffffff f0000000 - 0xffffffff ffffffff
This way we get at least io address space right. The changes are below
and I guess they could be improved. With this changes I'm able to ioremap
the framebuffer on my C200 and after changes to zalon and sym53x8xx the
system works as before. Comments ?
Thomas.
Index: arch/parisc/kernel/entry.S
===================================================================
RCS file: /home/cvs/parisc/linux/arch/parisc/kernel/entry.S,v
retrieving revision 1.85
diff -u -r1.85 entry.S
--- arch/parisc/kernel/entry.S 2001/06/12 16:09:52 1.85
+++ arch/parisc/kernel/entry.S 2001/06/27 23:05:40
@@ -1251,7 +1251,10 @@
/* Get rid of prot bits and convert to page addr for idtlbt */
depdi 0,63,12,pte
- extrd,u pte,56,25,pte
+ extrd,u pte,35,4,t0
+ cmpiclr,<> 15,t0,r0
+ depdi -1,31,32,pte
+ extrd,u pte,56,52,pte
idtlbt pte,prot
rfir
@@ -1324,7 +1327,10 @@
/* Get rid of prot bits and convert to page addr for idtlbt */
depdi 0,63,12,pte
- extrd,u pte,56,25,pte
+ extrd,u pte,35,4,t0
+ cmpiclr,<> 15,t0,r0
+ depdi -1,31,32,pte
+ extrd,u pte,56,52,pte
idtlbt pte,prot
rfir
--
Crap can work. Given enough thrust pigs will fly, but it's not necessary a
good idea. [ Alexander Viro on linux-kernel ]