Thread (64 messages) 64 messages, 6 authors, 2021-06-17

Re: [PATCH RFC 1/2] m68k: io_mm.h: conditionalize ISA address translation on Atari

From: Michael Schmitz <schmitzmic@gmail.com>
Date: 2021-06-06 05:42:52
Also in: linux-m68k

Hi Finn,

Thanks for the quick review!

Am 06.06.2021 um 16:53 schrieb Finn Thain:
On Sun, 6 Jun 2021, Michael Schmitz wrote:
quoted
This patch to io_mm.h (on top of my current patch), plus setting isa_type to
ISA_TPYE_AG100 using a module parameter, should do the trick:
diff --git a/arch/m68k/include/asm/io_mm.h b/arch/m68k/include/asm/io_mm.h
index f6b487b..6f79a5e 100644
--- a/arch/m68k/include/asm/io_mm.h
+++ b/arch/m68k/include/asm/io_mm.h
@@ -102,6 +102,11 @@
 #define ISA_TYPE_AG   (2)
 #define ISA_TYPE_ENEC (3)

+#if defined(CONFIG_AMIGA_PCMCIA_100)
+#define ISA_TYPE_AG100 (4)     /* for 100 MBit APNE card */
IMHO this would be simpler if that #define was unconditional like the
others.
Yep, that one could be unconditional (and we could rearrange the defs to 
keep the new type between AG and ENEC).
quoted
+#define MULTI_ISA 1
Hmm...
That one I didn't want to make unconditional, in order to allow the 
optimization below.
quoted
+#endif
+
 #if defined(CONFIG_Q40) && !defined(MULTI_ISA)
 #define ISA_TYPE ISA_TYPE_Q40
 #define ISA_SEX  0
@@ -135,6 +140,9 @@ static inline u8 __iomem *isa_itb(unsigned long addr)
 #ifdef CONFIG_Q40
     case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr);
 #endif
+#if defined(CONFIG_AMIGA_PCMCIA_100)
+    case ISA_TYPE_AG100: fallthrough;
+#endif
I wonder whether that 'fallthrough' is needed. One would hope not...
It won't be, but it ought to shut up compiler warnings, no?
quoted
 #ifdef CONFIG_AMIGA_PCMCIA
     case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
 #endif
@@ -153,6 +161,9 @@ static inline u16 __iomem *isa_itw(unsigned long addr)
 #ifdef CONFIG_Q40
     case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr);
 #endif
+#if defined(CONFIG_AMIGA_PCMCIA_100)
+    case ISA_TYPE_AG100: fallthrough;
+#endif
 #ifdef CONFIG_AMIGA_PCMCIA
     case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
 #endif
@@ -168,6 +179,9 @@ static inline u32 __iomem *isa_itl(unsigned long addr)
 {
   switch(ISA_TYPE)
     {
+#if defined(CONFIG_AMIGA_PCMCIA_100)
+    case ISA_TYPE_AG100: fallthrough;
+#endif
 #ifdef CONFIG_AMIGA_PCMCIA
     case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
 #endif
@@ -181,6 +195,9 @@ static inline u8 __iomem *isa_mtb(unsigned long addr)
 #ifdef CONFIG_Q40
     case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
 #endif
+#if defined(CONFIG_AMIGA_PCMCIA_100)
+    case ISA_TYPE_AG100: fallthrough;
+#endif
 #ifdef CONFIG_AMIGA_PCMCIA
     case ISA_TYPE_AG: return (u8 __iomem *)addr;
 #endif
@@ -199,6 +216,9 @@ static inline u16 __iomem *isa_mtw(unsigned long addr)
 #ifdef CONFIG_Q40
     case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
 #endif
+#if defined(CONFIG_AMIGA_PCMCIA_100)
+    case ISA_TYPE_AG100: fallthrough;
+#endif
 #ifdef CONFIG_AMIGA_PCMCIA
     case ISA_TYPE_AG: return (u16 __iomem *)addr;
 #endif
@@ -219,6 +239,11 @@ static inline u16 __iomem *isa_mtw(unsigned long addr)
 #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) :
out_le16(isa_itw(port),(val)))
 #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) :
out_le32(isa_itl(port),(val)))

+#if defined(CONFIG_AMIGA_PCMCIA_100)
+#undef isa_inb
+#define isa_inb(port)      ((ISA_TYPE == ISA_TYPE_AG100) ? ((port) & 1 ?
isa_inw((port) - 1) & 0xff : isa_inw(port) >> 8) : in_8(isa_itb(port))
+#endif
+
Would (port & ~1) be faster than (port - 1) here?
Perhaps it would - I'd hope the compiler will pick the most efficient 
solution here.
Also, I don't think you need '#if defined' here. When
!defined(CONFIG_AMIGA_PCMCIA_100), I think ISA_TYPE should be a
compile-time constant 0, and the dead code will get tossed out anyway.
Right, that's a good point.
quoted
 #define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
 #define isa_readw(p)       \
        (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \

(linebreak-mangled, sorry).

The card reset patch hunk from Alex' patch can probably go into the APNE
driver regardless?

It's been quite a while - can you still try and build/test this change, Alex?
Note that isa_type is never assigned to ISA_TYPE_AG100 in
arch/m68k/kernel/setup_mm.c which means (IIUC) this patch won't take
effect with MULTI_ISA == 1.
In order to make this useful, a Kconfig option is needed, and a module 
parameter will set isa_type to ISA_TYPE_AG100 in the APNE probe routine. 
I'll send the complete set as RFC soon. Will include your suggestions 
before doing that, of course.

Cheers,

	Michael


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help