From: Michael Schmitz <schmitzmic@gmail.com>
To: linux-m68k@vger.kernel.org, geert@linux-m68k.org
Cc: linux-ide@vger.kernel.org, fthain@linux-m68k.org,
Michael Schmitz <schmitzmic@gmail.com>
Subject: [PATCH v2] m68k: io_mm.h: conditionalize ISA address translation on Atari
Date: Wed, 9 Jun 2021 19:22:02 +1200 [thread overview]
Message-ID: <1623223322-4242-1-git-send-email-schmitzmic@gmail.com> (raw)
In-Reply-To: <1622957313-321-1-git-send-email-schmitzmic@gmail.com>
Current io_mm.h uses address translation and ROM port IO primitives when
port addresses are below 1024, and raw untranslated MMIO IO primitives
else when CONFIG_ATARI_ROM_ISA is set. This is done regardless of the
m68k machine type a multi-platform kernel runs on. As a consequence,
the Q40 IDE driver in multiplatform kernels cannot work.
Conversely, the Atari IDE driver uses wrong address translation if a
multiplatform Q40 and Atari kernel does _not_ set CONFIG_ATARI_ROM_ISA.
Replace MMIO by ISA IO primitives for addresses > 1024 (if isa_type
is ISA_TYPE_ENEC), and change the ISA address translation used for
Atari to a no-op for those addresses.
Switch readb()/writeb() and readw()/writew() to their ISA equivalents
also. Change the address translation functions to return the identity
translation if CONFIG_ATARI_ROM_ISA is not defined, and set MULTI_ISA
for kernels where Q40 and Atari are both configured so this can actually
work (isa_type set to Q40 at compile time else).
Fixes: 84b16b7b0d5c818f ("m68k/atari: ROM port ISA adapter support")
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
--
Changes from v1:
Geert Uytterhoeven;
- fix Fixes tag
- remove comment about isa_sex zero initialization
- move default return outside switch statement in address
translation functions to allow other code to break to default.
- fix indentation in switch statement
Changes from RFC:
Geert Uytterhoeven;
- drop setup_mm.c patch
Finn Thain:
- Add 'Fixes' tag
- Annotate rationale for MULTI_ISA setting on Atari
- Use fallthrough macro annotation in Atari address translation
---
arch/m68k/include/asm/io_mm.h | 66 +++++++++++++++++++++++++++----------------
1 file changed, 41 insertions(+), 25 deletions(-)
diff --git a/arch/m68k/include/asm/io_mm.h b/arch/m68k/include/asm/io_mm.h
index d41fa48..6eae9ec 100644
--- a/arch/m68k/include/asm/io_mm.h
+++ b/arch/m68k/include/asm/io_mm.h
@@ -52,7 +52,11 @@
#define Q40_ISA_MEM_B(madr) (q40_isa_mem_base+1+4*((unsigned long)(madr)))
#define Q40_ISA_MEM_W(madr) (q40_isa_mem_base+ 4*((unsigned long)(madr)))
+#ifdef CONFIG_ATARI
+#define MULTI_ISA 1 /* Need MULTI_ISA if Atari drivers (IDE) present !! */
+#else
#define MULTI_ISA 0
+#endif /* Atari */
#endif /* Q40 */
#ifdef CONFIG_AMIGA_PCMCIA
@@ -135,10 +139,13 @@ static inline u8 __iomem *isa_itb(unsigned long addr)
case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
#endif
#ifdef CONFIG_ATARI_ROM_ISA
- case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_IO_B(addr);
+ case ISA_TYPE_ENEC:
+ if (addr < 1024)
+ return (u8 __iomem *)ENEC_ISA_IO_B(addr);
+ break; /* not ROM port? fallback below! */
#endif
- default: return NULL; /* avoid warnings, just in case */
}
+ return (u8 __iomem *)(addr); /* avoid warnings, just in case */
}
static inline u16 __iomem *isa_itw(unsigned long addr)
{
@@ -151,10 +158,13 @@ static inline u16 __iomem *isa_itw(unsigned long addr)
case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
#endif
#ifdef CONFIG_ATARI_ROM_ISA
- case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_IO_W(addr);
+ case ISA_TYPE_ENEC:
+ if (addr < 1024)
+ return (u16 __iomem *)ENEC_ISA_IO_W(addr);
+ break; /* not ROM port? fallback below! */
#endif
- default: return NULL; /* avoid warnings, just in case */
}
+ return (u16 __iomem *)(addr); /* avoid warnings, just in case */
}
static inline u32 __iomem *isa_itl(unsigned long addr)
{
@@ -163,8 +173,8 @@ static inline u32 __iomem *isa_itl(unsigned long addr)
#ifdef CONFIG_AMIGA_PCMCIA
case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
#endif
- default: return 0; /* avoid warnings, just in case */
}
+ return 0; /* avoid warnings, just in case */
}
static inline u8 __iomem *isa_mtb(unsigned long addr)
{
@@ -177,10 +187,13 @@ static inline u8 __iomem *isa_mtb(unsigned long addr)
case ISA_TYPE_AG: return (u8 __iomem *)addr;
#endif
#ifdef CONFIG_ATARI_ROM_ISA
- case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_MEM_B(addr);
+ case ISA_TYPE_ENEC:
+ if (addr < 1024)
+ return (u8 __iomem *)ENEC_ISA_MEM_B(addr);
+ break; /* not ROM port? fallback below! */
#endif
- default: return NULL; /* avoid warnings, just in case */
}
+ return (u8 __iomem *)(addr); /* avoid warnings, just in case */
}
static inline u16 __iomem *isa_mtw(unsigned long addr)
{
@@ -193,10 +206,13 @@ static inline u16 __iomem *isa_mtw(unsigned long addr)
case ISA_TYPE_AG: return (u16 __iomem *)addr;
#endif
#ifdef CONFIG_ATARI_ROM_ISA
- case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_MEM_W(addr);
+ case ISA_TYPE_ENEC:
+ if (addr < 1024)
+ return (u16 __iomem *)ENEC_ISA_MEM_W(addr);
+ break; /* not ROM port? fallback below! */
#endif
- default: return NULL; /* avoid warnings, just in case */
}
+ return (u16 __iomem *)(addr); /* avoid warnings, just in case */
}
@@ -344,31 +360,31 @@ static inline void isa_delay(void)
* ROM port ISA and everything else regular ISA for IDE. read,write defined
* below.
*/
-#define inb(port) ((port) < 1024 ? isa_rom_inb(port) : in_8(port))
-#define inb_p(port) ((port) < 1024 ? isa_rom_inb_p(port) : in_8(port))
-#define inw(port) ((port) < 1024 ? isa_rom_inw(port) : in_le16(port))
-#define inw_p(port) ((port) < 1024 ? isa_rom_inw_p(port) : in_le16(port))
+#define inb(port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_inb(port) : isa_inb(port))
+#define inb_p(port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_inb_p(port) : isa_inb_p(port))
+#define inw(port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_inw(port) : isa_inw(port))
+#define inw_p(port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_inw_p(port) : isa_inw_p(port))
#define inl isa_inl
#define inl_p isa_inl_p
-#define outb(val, port) ((port) < 1024 ? isa_rom_outb((val), (port)) : out_8((port), (val)))
-#define outb_p(val, port) ((port) < 1024 ? isa_rom_outb_p((val), (port)) : out_8((port), (val)))
-#define outw(val, port) ((port) < 1024 ? isa_rom_outw((val), (port)) : out_le16((port), (val)))
-#define outw_p(val, port) ((port) < 1024 ? isa_rom_outw_p((val), (port)) : out_le16((port), (val)))
+#define outb(val, port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outb((val), (port)) : isa_outb((val), (port)))
+#define outb_p(val, port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outb_p((val), (port)) : isa_outb_p((val), (port)))
+#define outw(val, port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outw((val), (port)) : isa_outw((val), (port)))
+#define outw_p(val, port) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outw_p((val), (port)) : isa_outw_p((val), (port)))
#define outl isa_outl
#define outl_p isa_outl_p
-#define insb(port, buf, nr) ((port) < 1024 ? isa_rom_insb((port), (buf), (nr)) : isa_insb((port), (buf), (nr)))
-#define insw(port, buf, nr) ((port) < 1024 ? isa_rom_insw((port), (buf), (nr)) : isa_insw((port), (buf), (nr)))
+#define insb(port, buf, nr) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_insb((port), (buf), (nr)) : isa_insb((port), (buf), (nr)))
+#define insw(port, buf, nr) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_insw((port), (buf), (nr)) : isa_insw((port), (buf), (nr)))
#define insl isa_insl
-#define outsb(port, buf, nr) ((port) < 1024 ? isa_rom_outsb((port), (buf), (nr)) : isa_outsb((port), (buf), (nr)))
-#define outsw(port, buf, nr) ((port) < 1024 ? isa_rom_outsw((port), (buf), (nr)) : isa_outsw((port), (buf), (nr)))
+#define outsb(port, buf, nr) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outsb((port), (buf), (nr)) : isa_outsb((port), (buf), (nr)))
+#define outsw(port, buf, nr) (((port) < 1024 && ISA_TYPE == ISA_TYPE_ENEC) ? isa_rom_outsw((port), (buf), (nr)) : isa_outsw((port), (buf), (nr)))
#define outsl isa_outsl
-#define readb(addr) in_8(addr)
-#define writeb(val, addr) out_8((addr), (val))
-#define readw(addr) in_le16(addr)
-#define writew(val, addr) out_le16((addr), (val))
+#define readb isa_readb
+#define readw isa_readw
+#define writeb isa_writeb
+#define writew isa_writew
#endif /* CONFIG_ATARI_ROM_ISA */
#define readl(addr) in_le32(addr)
--
2.7.4
next prev parent reply other threads:[~2021-06-09 7:22 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-25 9:06 [PATCH] m68k/mac: Replace macide driver with generic platform driver Finn Thain
2021-04-25 10:25 ` John Paul Adrian Glaubitz
2021-04-26 7:37 ` Finn Thain
2021-04-26 7:48 ` John Paul Adrian Glaubitz
2021-04-27 1:51 ` Michael Schmitz
2021-04-27 3:47 ` Finn Thain
2021-04-27 19:54 ` Michael Schmitz
2021-04-28 6:53 ` Geert Uytterhoeven
2021-06-01 3:32 ` Michael Schmitz
2021-06-01 7:55 ` Michael Schmitz
2021-06-01 8:43 ` Geert Uytterhoeven
2021-06-01 21:05 ` Michael Schmitz
2021-06-02 5:21 ` [PATCH RFC 0/2] Fix m68k multiplatform ISA support Michael Schmitz
2021-06-02 5:21 ` [PATCH RFC 1/2] m68k: io_mm.h: conditionalize ISA address translation on Atari Michael Schmitz
2021-06-03 8:23 ` Finn Thain
2021-06-04 0:19 ` Michael Schmitz
2021-06-04 5:55 ` Finn Thain
2021-06-04 7:30 ` Michael Schmitz
2021-06-04 22:49 ` Brad Boyer
2021-06-05 1:41 ` Michael Schmitz
2021-06-05 6:04 ` Brad Boyer
2021-06-05 22:05 ` Michael Schmitz
2021-06-06 2:18 ` Michael Schmitz
2021-06-06 4:53 ` Finn Thain
2021-06-06 5:42 ` Michael Schmitz
2021-06-06 23:51 ` Brad Boyer
2021-06-06 5:54 ` [PATCH RFC 0/2] Add APNE PCMCIA 100 Mbit support Michael Schmitz
2021-06-06 5:54 ` [PATCH RFC 1/2] m68k: io_mm.h - add APNE 100 MBit support Michael Schmitz
2021-06-07 8:01 ` Geert Uytterhoeven
2021-06-07 8:20 ` Michael Schmitz
2021-06-07 11:15 ` Geert Uytterhoeven
2021-06-07 19:57 ` Michael Schmitz
2021-06-08 6:42 ` Geert Uytterhoeven
2021-06-08 21:55 ` Michael Schmitz
2021-06-09 6:33 ` Geert Uytterhoeven
2021-06-08 21:56 ` Michael Schmitz
2021-06-06 5:54 ` [PATCH RFC 2/2] net/8390: apne.c - add 100 Mbit support to apne.c driver Michael Schmitz
2021-06-06 12:42 ` kernel test robot
2021-06-07 8:08 ` Geert Uytterhoeven
2021-06-07 8:40 ` Michael Schmitz
2021-06-07 8:46 ` ALeX Kazik
2021-06-08 3:10 ` Michael Schmitz
2021-06-07 8:37 ` Geert Uytterhoeven
2021-06-07 12:56 ` Geert Uytterhoeven
2021-06-13 21:53 ` Michael Schmitz
2021-06-09 7:36 ` [PATCH v1 0/2] Add APNE PCMCIA 100 Mbit support Michael Schmitz
2021-06-09 7:36 ` [PATCH v1 1/2] m68k: io_mm.h - add APNE 100 MBit support Michael Schmitz
2021-06-09 8:04 ` Andreas Schwab
2021-06-09 21:54 ` Michael Schmitz
2021-06-10 1:09 ` Finn Thain
2021-06-10 7:32 ` Geert Uytterhoeven
2021-06-11 2:15 ` Michael Schmitz
2021-06-10 8:53 ` Andreas Schwab
2021-06-09 7:36 ` [PATCH v1 2/2] net/8390: apne.c - add 100 Mbit support to apne.c driver Michael Schmitz
2021-06-10 2:09 ` [PATCH v2 0/2] Add APNE PCMCIA 100 Mbit support Michael Schmitz
2021-06-10 2:09 ` [PATCH v2 1/2] m68k: io_mm.h - add APNE 100 MBit support Michael Schmitz
2021-06-10 2:09 ` [PATCH v2 2/2] net/8390: apne.c - add 100 Mbit support to apne.c driver Michael Schmitz
2021-06-16 21:11 ` [PATCH v2 0/2] Add APNE PCMCIA 100 Mbit support ALeX Kazik
2021-06-17 1:10 ` Michael Schmitz
2021-06-04 7:54 ` [PATCH RFC 1/2] m68k: io_mm.h: conditionalize ISA address translation on Atari Geert Uytterhoeven
2021-06-04 21:36 ` Michael Schmitz
2021-06-04 23:31 ` Finn Thain
2021-06-05 0:24 ` Finn Thain
2021-06-05 3:48 ` Michael Schmitz
2021-06-09 6:35 ` Geert Uytterhoeven
2021-06-09 7:20 ` Michael Schmitz
2021-06-02 5:21 ` [PATCH RFC 2/2] m68k: setup_mm.c: set isa_sex for Atari if ATARI_ROM_ISA not used Michael Schmitz
2021-06-02 7:09 ` Geert Uytterhoeven
2021-06-02 8:21 ` Michael Schmitz
2021-06-03 8:29 ` Finn Thain
2021-06-04 3:02 ` Michael Schmitz
2021-06-03 3:43 ` [PATCH RFC 0/2] Fix m68k multiplatform ISA support Michael Schmitz
2021-06-03 7:09 ` Geert Uytterhoeven
2021-06-04 0:22 ` Michael Schmitz
2021-06-06 5:28 ` [PATCH] m68k: Fix " Michael Schmitz
2021-06-07 7:49 ` Geert Uytterhoeven
2021-06-07 8:17 ` Michael Schmitz
2021-06-09 7:22 ` Michael Schmitz [this message]
2021-06-09 7:57 ` [PATCH v2] m68k: io_mm.h: conditionalize ISA address translation on Atari Andreas Schwab
2021-06-09 21:43 ` Michael Schmitz
2021-06-10 2:04 ` [PATCH v3] " Michael Schmitz
2021-04-27 8:11 ` [PATCH] m68k/mac: Replace macide driver with generic platform driver Sergei Shtylyov
2021-04-27 8:36 ` John Paul Adrian Glaubitz
2021-04-27 19:29 ` Michael Schmitz
2021-04-25 22:24 ` Michael Schmitz
2021-04-26 7:35 ` Finn Thain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1623223322-4242-1-git-send-email-schmitzmic@gmail.com \
--to=schmitzmic@gmail.com \
--cc=fthain@linux-m68k.org \
--cc=geert@linux-m68k.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-m68k@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.