From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753399AbbL2NfT (ORCPT ); Tue, 29 Dec 2015 08:35:19 -0500 Received: from mail-yk0-f195.google.com ([209.85.160.195]:32966 "EHLO mail-yk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752049AbbL2NfM (ORCPT ); Tue, 29 Dec 2015 08:35:12 -0500 From: Rongrong Zou To: arnd@arndb.de, catalin.marinas@arm.com, will.deacon@arm.com Cc: benh@kernel.crashing.org, lijianhua@huawei.com, lixiancai@huawei.com, linuxarm@huawei.com, linux-kernel@vger.kernel.org, minyard@acm.org, gregkh@linuxfoundation.org Subject: [PATCH v1 1/3] ARM64 LPC: indirect ISA PORT IO introduced Date: Tue, 29 Dec 2015 21:33:50 +0800 Message-Id: <1451396032-23708-2-git-send-email-zourongrong@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1451396032-23708-1-git-send-email-zourongrong@gmail.com> References: <1451396032-23708-1-git-send-email-zourongrong@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Indirect ISA port I/O accessing introduced, vendors can hook their own in/out function to general inb/outb. Drivers can access legacy ISA I/O port by inb/outb as it is done in x86 platform. Signed-off-by: Rongrong Zou --- arch/arm64/Kconfig.platforms | 5 ++- arch/arm64/include/asm/io.h | 78 ++++++++++++++++++++++++++++++++++++++++++++ arch/arm64/kernel/setup.c | 5 +++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms index 4043c35..98ae206 100644 --- a/arch/arm64/Kconfig.platforms +++ b/arch/arm64/Kconfig.platforms @@ -127,5 +127,8 @@ config ARCH_ZYNQMP bool "Xilinx ZynqMP Family" help This enables support for Xilinx ZynqMP Family - +config ARM64_INDIRECT_PIO + bool "ARM64 Indirect port I/O" + help + This enables support for ARM64 indirect port I/O endmenu diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 44be1e0..0041f3b 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h @@ -193,6 +193,84 @@ extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size); */ #define xlate_dev_kmem_ptr(p) p +#ifdef CONFIG_ARM64_INDIRECT_PIO +#define DEF_PCI_HOOK_pio(x) x +#else +#define DEF_PCI_HOOK_pio(x) NULL +#endif + +/* + * This value is equal to PCIBIOS_MIN_IO + */ +#define LEGACY_ISA_PORT_MAX 0x1000 + +extern struct arm64_isa_io { + u8 (*inb)(unsigned long port); + u16 (*inw)(unsigned long port); + u32 (*inl)(unsigned long port); + void (*outb)(u8 value, unsigned long port); + void (*outw)(u16 value, unsigned long port); + void (*outl)(u32 value, unsigned long port); +} arm64_isa_io; + +#define inb inb +static inline u8 inb(unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.inb) && + port < LEGACY_ISA_PORT_MAX) + return arm64_isa_io.inb(port); + return readb(PCI_IOBASE + port); +} + +#define inw inw +static inline u16 inw(unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.inw) && + port < LEGACY_ISA_PORT_MAX) + return arm64_isa_io.inw(port); + return readw(PCI_IOBASE + port); +} + +#define inl inl +static inline u32 inl(unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.inl) && + port < LEGACY_ISA_PORT_MAX) + return arm64_isa_io.inl(port); + return readl(PCI_IOBASE + port); +} + +#define outb outb +static inline void outb(u8 val, unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.outb) && + port < LEGACY_ISA_PORT_MAX) + arm64_isa_io.outb(val, port); + else + writeb(val, PCI_IOBASE + port); +} + +#define outw outw +static inline void outw(u16 val, unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.outw) && + port < LEGACY_ISA_PORT_MAX) + arm64_isa_io.outw(val, port); + else + writew(val, PCI_IOBASE + port); +} + +#define outl outl +static inline void outl(u32 val, unsigned long port) +{ + if (DEF_PCI_HOOK_pio(arm64_isa_io.outl) && + port < LEGACY_ISA_PORT_MAX) + arm64_isa_io.outl(val, port); + else + writel(val, PCI_IOBASE + port); +} + + #include /* diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 8119479..c689dd7 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -381,3 +381,8 @@ static int __init topology_init(void) return 0; } subsys_initcall(topology_init); + +#if defined(CONFIG_ARM64_INDIRECT_PIO) +struct arm64_isa_io arm64_isa_io; +EXPORT_SYMBOL_GPL(arm64_isa_io); +#endif -- 1.9.1