From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941613AbcLWBp7 (ORCPT ); Thu, 22 Dec 2016 20:45:59 -0500 Received: from szxga01-in.huawei.com ([58.251.152.64]:14006 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S941456AbcLWBp5 (ORCPT ); Thu, 22 Dec 2016 20:45:57 -0500 Subject: Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced To: Ming Lei References: <1478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com> <1478576829-112707-2-git-send-email-yuanzhichang@hisilicon.com> CC: Catalin Marinas , Will Deacon , Rob Herring , Bjorn Helgaas , Mark Rutland , Olof Johansson , Arnd Bergmann , linux-arm-kernel , Lorenzo Pieralisi , Linux Kernel Mailing List , , "devicetree@vger.kernel.org" , "linux-pci@vger.kernel.org" , , , Benjamin Herrenschmidt , Liviu Dudau , , , , , , From: "zhichang.yuan" Message-ID: <585C815B.4030000@hisilicon.com> Date: Fri, 23 Dec 2016 09:43:55 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.57.79.81] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi,Ming, On 2016/12/22 16:15, Ming Lei wrote: > Hi Guys, > > On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan > wrote: >> For arm64, there is no I/O space as other architectural platforms, such as >> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs, >> such as Hip06, when accessing some legacy ISA devices connected to LPC, those >> known port addresses are used to control the corresponding target devices, for >> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the >> normal MMIO mode in using. >> >> To drive these devices, this patch introduces a method named indirect-IO. >> In this method the in/out pair in arch/arm64/include/asm/io.h will be >> redefined. When upper layer drivers call in/out with those known legacy port >> addresses to access the peripherals, the hooking functions corrresponding to >> those target peripherals will be called. Through this way, those upper layer >> drivers which depend on in/out can run on Hip06 without any changes. >> >> Cc: Catalin Marinas >> Cc: Will Deacon >> Signed-off-by: zhichang.yuan >> Signed-off-by: Gabriele Paoloni >> --- >> arch/arm64/Kconfig | 6 +++ >> arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/io.h | 29 +++++++++++++ >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/extio.c | 27 ++++++++++++ >> 5 files changed, 157 insertions(+) > > When I applied these three patches against current linus tree and > enable CONFIG_HISILICON_LPC, the following build failure[1] is > triggered when running 'make modules'. > Thanks for your report! This patch has compilation issue on some architectures, sorry for the inconvenience caused by this! The ongoing v6 will solve these issues. I will trace this failure and provide a fix if you can not wait for the next version. Could you send me your .config in private? I don't want to bother all the hacker in the mail-list. Thanks, Zhichang > > Thanks, > Ming > > [1] 'make modules' failure log > > Building modules, stage 2. > MODPOST 2260 modules > ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "outw" [drivers/video/vgastate.ko] undefined! > ERROR: "outb" [drivers/video/vgastate.ko] undefined! > ERROR: "inb" [drivers/video/vgastate.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined! > ..... > ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined! > ERROR: "inb" [drivers/ata/pata_artop.ko] undefined! > scripts/Makefile.modpost:91: recipe for target '__modpost' failed > make[1]: *** [__modpost] Error 1 > Makefile:1196: recipe for target 'modules' failed > make: *** [modules] Error 2 > > >> create mode 100644 arch/arm64/include/asm/extio.h >> create mode 100644 arch/arm64/kernel/extio.c >> >> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig >> index 969ef88..b44070b 100644 >> --- a/arch/arm64/Kconfig >> +++ b/arch/arm64/Kconfig >> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN >> config ARCH_MMAP_RND_COMPAT_BITS_MAX >> default 16 >> >> +config ARM64_INDIRECT_PIO >> + bool "access peripherals with legacy I/O port" >> + help >> + Support special accessors for ISA I/O devices. This is needed for >> + SoCs that do not support standard read/write for the ISA range. >> + >> config NO_IOPORT_MAP >> def_bool y if !PCI >> >> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h >> new file mode 100644 >> index 0000000..6ae0787 >> --- /dev/null >> +++ b/arch/arm64/include/asm/extio.h >> @@ -0,0 +1,94 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#ifndef __LINUX_EXTIO_H >> +#define __LINUX_EXTIO_H >> + >> +struct extio_ops { >> + unsigned long start;/* inclusive, sys io addr */ >> + unsigned long end;/* inclusive, sys io addr */ >> + >> + u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen); >> + void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval, >> + size_t dlen); >> + u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf, >> + size_t dlen, unsigned int count); >> + void (*pfouts)(void *devobj, unsigned long ptaddr, >> + const void *outbuf, size_t dlen, >> + unsigned int count); >> + void *devpara; >> +}; >> + >> +extern struct extio_ops *arm64_extio_ops; >> + >> +#define DECLARE_EXTIO(bw, type) \ >> +extern type in##bw(unsigned long addr); \ >> +extern void out##bw(type value, unsigned long addr); \ >> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\ >> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count); >> + >> +#define BUILD_EXTIO(bw, type) \ >> +type in##bw(unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + return read##bw(PCI_IOBASE + addr); \ >> + return arm64_extio_ops->pfin ? \ >> + arm64_extio_ops->pfin(arm64_extio_ops->devpara, \ >> + addr, sizeof(type)) : -1; \ >> +} \ >> + \ >> +void out##bw(type value, unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + write##bw(value, PCI_IOBASE + addr); \ >> + else \ >> + if (arm64_extio_ops->pfout) \ >> + arm64_extio_ops->pfout(arm64_extio_ops->devpara,\ >> + addr, value, sizeof(type)); \ >> +} \ >> + \ >> +void ins##bw(unsigned long addr, void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + reads##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfins) \ >> + arm64_extio_ops->pfins(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} \ >> + \ >> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + writes##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfouts) \ >> + arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} >> + >> +static inline void arm64_set_extops(struct extio_ops *ops) >> +{ >> + if (ops) >> + WRITE_ONCE(arm64_extio_ops, ops); >> +} >> + >> +#endif /* __LINUX_EXTIO_H*/ >> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h >> index 0bba427..136735d 100644 >> --- a/arch/arm64/include/asm/io.h >> +++ b/arch/arm64/include/asm/io.h >> @@ -31,6 +31,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> >> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr) >> #define IO_SPACE_LIMIT (PCI_IO_SIZE - 1) >> #define PCI_IOBASE ((void __iomem *)PCI_IO_START) >> >> + >> +/* >> + * redefine the in(s)b/out(s)b for indirect-IO. >> + */ >> +#ifdef CONFIG_ARM64_INDIRECT_PIO >> +#define inb inb >> +#define outb outb >> +#define insb insb >> +#define outsb outsb >> +/* external declaration */ >> +DECLARE_EXTIO(b, u8) >> + >> +#define inw inw >> +#define outw outw >> +#define insw insw >> +#define outsw outsw >> + >> +DECLARE_EXTIO(w, u16) >> + >> +#define inl inl >> +#define outl outl >> +#define insl insl >> +#define outsl outsl >> + >> +DECLARE_EXTIO(l, u32) >> +#endif >> + >> + >> /* >> * String version of I/O memory access operations. >> */ >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 7d66bba..60e0482 100644 >> --- a/arch/arm64/kernel/Makefile >> +++ b/arch/arm64/kernel/Makefile >> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ >> sys_compat.o entry32.o >> arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o >> arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o >> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o >> arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o >> arm64-obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o >> arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o >> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c >> new file mode 100644 >> index 0000000..647b3fa >> --- /dev/null >> +++ b/arch/arm64/kernel/extio.c >> @@ -0,0 +1,27 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#include >> + >> +struct extio_ops *arm64_extio_ops; >> + >> + >> +BUILD_EXTIO(b, u8) >> + >> +BUILD_EXTIO(w, u16) >> + >> +BUILD_EXTIO(l, u32) >> -- >> 1.9.1 >> > > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: "zhichang.yuan" Subject: Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced Date: Fri, 23 Dec 2016 09:43:55 +0800 Message-ID: <585C815B.4030000@hisilicon.com> References: <1478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com> <1478576829-112707-2-git-send-email-yuanzhichang@hisilicon.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Ming Lei Cc: Catalin Marinas , Will Deacon , Rob Herring , Bjorn Helgaas , Mark Rutland , Olof Johansson , Arnd Bergmann , linux-arm-kernel , Lorenzo Pieralisi , Linux Kernel Mailing List , linuxarm@huawei.com, "devicetree@vger.kernel.org" , "linux-pci@vger.kernel.org" , linux-serial@vger.kernel.org, minyard@acm.org, Benjamin Herrenschmidt , Liviu Dudau , zourongrong@gmail.com, john.garry@huawei.com, gabriele.paoloni@huawei.com List-Id: devicetree@vger.kernel.org Hi,Ming, On 2016/12/22 16:15, Ming Lei wrote: > Hi Guys, > > On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan > wrote: >> For arm64, there is no I/O space as other architectural platforms, such as >> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs, >> such as Hip06, when accessing some legacy ISA devices connected to LPC, those >> known port addresses are used to control the corresponding target devices, for >> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the >> normal MMIO mode in using. >> >> To drive these devices, this patch introduces a method named indirect-IO. >> In this method the in/out pair in arch/arm64/include/asm/io.h will be >> redefined. When upper layer drivers call in/out with those known legacy port >> addresses to access the peripherals, the hooking functions corrresponding to >> those target peripherals will be called. Through this way, those upper layer >> drivers which depend on in/out can run on Hip06 without any changes. >> >> Cc: Catalin Marinas >> Cc: Will Deacon >> Signed-off-by: zhichang.yuan >> Signed-off-by: Gabriele Paoloni >> --- >> arch/arm64/Kconfig | 6 +++ >> arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/io.h | 29 +++++++++++++ >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/extio.c | 27 ++++++++++++ >> 5 files changed, 157 insertions(+) > > When I applied these three patches against current linus tree and > enable CONFIG_HISILICON_LPC, the following build failure[1] is > triggered when running 'make modules'. > Thanks for your report! This patch has compilation issue on some architectures, sorry for the inconvenience caused by this! The ongoing v6 will solve these issues. I will trace this failure and provide a fix if you can not wait for the next version. Could you send me your .config in private? I don't want to bother all the hacker in the mail-list. Thanks, Zhichang > > Thanks, > Ming > > [1] 'make modules' failure log > > Building modules, stage 2. > MODPOST 2260 modules > ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "outw" [drivers/video/vgastate.ko] undefined! > ERROR: "outb" [drivers/video/vgastate.ko] undefined! > ERROR: "inb" [drivers/video/vgastate.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined! > ..... > ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined! > ERROR: "inb" [drivers/ata/pata_artop.ko] undefined! > scripts/Makefile.modpost:91: recipe for target '__modpost' failed > make[1]: *** [__modpost] Error 1 > Makefile:1196: recipe for target 'modules' failed > make: *** [modules] Error 2 > > >> create mode 100644 arch/arm64/include/asm/extio.h >> create mode 100644 arch/arm64/kernel/extio.c >> >> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig >> index 969ef88..b44070b 100644 >> --- a/arch/arm64/Kconfig >> +++ b/arch/arm64/Kconfig >> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN >> config ARCH_MMAP_RND_COMPAT_BITS_MAX >> default 16 >> >> +config ARM64_INDIRECT_PIO >> + bool "access peripherals with legacy I/O port" >> + help >> + Support special accessors for ISA I/O devices. This is needed for >> + SoCs that do not support standard read/write for the ISA range. >> + >> config NO_IOPORT_MAP >> def_bool y if !PCI >> >> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h >> new file mode 100644 >> index 0000000..6ae0787 >> --- /dev/null >> +++ b/arch/arm64/include/asm/extio.h >> @@ -0,0 +1,94 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#ifndef __LINUX_EXTIO_H >> +#define __LINUX_EXTIO_H >> + >> +struct extio_ops { >> + unsigned long start;/* inclusive, sys io addr */ >> + unsigned long end;/* inclusive, sys io addr */ >> + >> + u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen); >> + void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval, >> + size_t dlen); >> + u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf, >> + size_t dlen, unsigned int count); >> + void (*pfouts)(void *devobj, unsigned long ptaddr, >> + const void *outbuf, size_t dlen, >> + unsigned int count); >> + void *devpara; >> +}; >> + >> +extern struct extio_ops *arm64_extio_ops; >> + >> +#define DECLARE_EXTIO(bw, type) \ >> +extern type in##bw(unsigned long addr); \ >> +extern void out##bw(type value, unsigned long addr); \ >> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\ >> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count); >> + >> +#define BUILD_EXTIO(bw, type) \ >> +type in##bw(unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + return read##bw(PCI_IOBASE + addr); \ >> + return arm64_extio_ops->pfin ? \ >> + arm64_extio_ops->pfin(arm64_extio_ops->devpara, \ >> + addr, sizeof(type)) : -1; \ >> +} \ >> + \ >> +void out##bw(type value, unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + write##bw(value, PCI_IOBASE + addr); \ >> + else \ >> + if (arm64_extio_ops->pfout) \ >> + arm64_extio_ops->pfout(arm64_extio_ops->devpara,\ >> + addr, value, sizeof(type)); \ >> +} \ >> + \ >> +void ins##bw(unsigned long addr, void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + reads##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfins) \ >> + arm64_extio_ops->pfins(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} \ >> + \ >> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + writes##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfouts) \ >> + arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} >> + >> +static inline void arm64_set_extops(struct extio_ops *ops) >> +{ >> + if (ops) >> + WRITE_ONCE(arm64_extio_ops, ops); >> +} >> + >> +#endif /* __LINUX_EXTIO_H*/ >> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h >> index 0bba427..136735d 100644 >> --- a/arch/arm64/include/asm/io.h >> +++ b/arch/arm64/include/asm/io.h >> @@ -31,6 +31,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> >> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr) >> #define IO_SPACE_LIMIT (PCI_IO_SIZE - 1) >> #define PCI_IOBASE ((void __iomem *)PCI_IO_START) >> >> + >> +/* >> + * redefine the in(s)b/out(s)b for indirect-IO. >> + */ >> +#ifdef CONFIG_ARM64_INDIRECT_PIO >> +#define inb inb >> +#define outb outb >> +#define insb insb >> +#define outsb outsb >> +/* external declaration */ >> +DECLARE_EXTIO(b, u8) >> + >> +#define inw inw >> +#define outw outw >> +#define insw insw >> +#define outsw outsw >> + >> +DECLARE_EXTIO(w, u16) >> + >> +#define inl inl >> +#define outl outl >> +#define insl insl >> +#define outsl outsl >> + >> +DECLARE_EXTIO(l, u32) >> +#endif >> + >> + >> /* >> * String version of I/O memory access operations. >> */ >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 7d66bba..60e0482 100644 >> --- a/arch/arm64/kernel/Makefile >> +++ b/arch/arm64/kernel/Makefile >> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ >> sys_compat.o entry32.o >> arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o >> arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o >> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o >> arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o >> arm64-obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o >> arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o >> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c >> new file mode 100644 >> index 0000000..647b3fa >> --- /dev/null >> +++ b/arch/arm64/kernel/extio.c >> @@ -0,0 +1,27 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#include >> + >> +struct extio_ops *arm64_extio_ops; >> + >> + >> +BUILD_EXTIO(b, u8) >> + >> +BUILD_EXTIO(w, u16) >> + >> +BUILD_EXTIO(l, u32) >> -- >> 1.9.1 >> > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Return-Path: Subject: Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced To: Ming Lei References: <1478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com> <1478576829-112707-2-git-send-email-yuanzhichang@hisilicon.com> From: "zhichang.yuan" Message-ID: <585C815B.4030000@hisilicon.com> Date: Fri, 23 Dec 2016 09:43:55 +0800 MIME-Version: 1.0 In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , gabriele.paoloni@huawei.com, Benjamin Herrenschmidt , Will Deacon , linuxarm@huawei.com, Lorenzo Pieralisi , Arnd Bergmann , xuwei5@hisilicon.com, linux-serial@vger.kernel.org, Catalin Marinas , "devicetree@vger.kernel.org" , minyard@acm.org, Liviu Dudau , john.garry@huawei.com, zourongrong@gmail.com, Rob Herring , Bjorn Helgaas , kantyzc@163.com, zhichang.yuan02@gmail.com, linux-arm-kernel , "linux-pci@vger.kernel.org" , Linux Kernel Mailing List , Olof Johansson Content-Type: text/plain; charset="utf-8" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+bjorn=helgaas.com@lists.infradead.org List-ID: SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1 eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+ IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1 dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3 ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0 cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2 L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2 ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93 cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2 L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0 ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1 YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2 ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+ ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5 cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02 NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02 NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7 ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02 NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+ IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1 ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+ ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+ PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91 dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5 IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+ ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+ PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: yuanzhichang@hisilicon.com (zhichang.yuan) Date: Fri, 23 Dec 2016 09:43:55 +0800 Subject: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced In-Reply-To: References: <1478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com> <1478576829-112707-2-git-send-email-yuanzhichang@hisilicon.com> Message-ID: <585C815B.4030000@hisilicon.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi?Ming, On 2016/12/22 16:15, Ming Lei wrote: > Hi Guys, > > On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan > wrote: >> For arm64, there is no I/O space as other architectural platforms, such as >> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs, >> such as Hip06, when accessing some legacy ISA devices connected to LPC, those >> known port addresses are used to control the corresponding target devices, for >> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the >> normal MMIO mode in using. >> >> To drive these devices, this patch introduces a method named indirect-IO. >> In this method the in/out pair in arch/arm64/include/asm/io.h will be >> redefined. When upper layer drivers call in/out with those known legacy port >> addresses to access the peripherals, the hooking functions corrresponding to >> those target peripherals will be called. Through this way, those upper layer >> drivers which depend on in/out can run on Hip06 without any changes. >> >> Cc: Catalin Marinas >> Cc: Will Deacon >> Signed-off-by: zhichang.yuan >> Signed-off-by: Gabriele Paoloni >> --- >> arch/arm64/Kconfig | 6 +++ >> arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/io.h | 29 +++++++++++++ >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/extio.c | 27 ++++++++++++ >> 5 files changed, 157 insertions(+) > > When I applied these three patches against current linus tree and > enable CONFIG_HISILICON_LPC, the following build failure[1] is > triggered when running 'make modules'. > Thanks for your report! This patch has compilation issue on some architectures, sorry for the inconvenience caused by this! The ongoing v6 will solve these issues. I will trace this failure and provide a fix if you can not wait for the next version. Could you send me your .config in private? I don't want to bother all the hacker in the mail-list. Thanks, Zhichang > > Thanks, > Ming > > [1] 'make modules' failure log > > Building modules, stage 2. > MODPOST 2260 modules > ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined! > ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined! > ERROR: "outw" [drivers/video/vgastate.ko] undefined! > ERROR: "outb" [drivers/video/vgastate.ko] undefined! > ERROR: "inb" [drivers/video/vgastate.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined! > ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined! > ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined! > ..... > ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined! > ERROR: "inb" [drivers/ata/pata_artop.ko] undefined! > scripts/Makefile.modpost:91: recipe for target '__modpost' failed > make[1]: *** [__modpost] Error 1 > Makefile:1196: recipe for target 'modules' failed > make: *** [modules] Error 2 > > >> create mode 100644 arch/arm64/include/asm/extio.h >> create mode 100644 arch/arm64/kernel/extio.c >> >> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig >> index 969ef88..b44070b 100644 >> --- a/arch/arm64/Kconfig >> +++ b/arch/arm64/Kconfig >> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN >> config ARCH_MMAP_RND_COMPAT_BITS_MAX >> default 16 >> >> +config ARM64_INDIRECT_PIO >> + bool "access peripherals with legacy I/O port" >> + help >> + Support special accessors for ISA I/O devices. This is needed for >> + SoCs that do not support standard read/write for the ISA range. >> + >> config NO_IOPORT_MAP >> def_bool y if !PCI >> >> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h >> new file mode 100644 >> index 0000000..6ae0787 >> --- /dev/null >> +++ b/arch/arm64/include/asm/extio.h >> @@ -0,0 +1,94 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#ifndef __LINUX_EXTIO_H >> +#define __LINUX_EXTIO_H >> + >> +struct extio_ops { >> + unsigned long start;/* inclusive, sys io addr */ >> + unsigned long end;/* inclusive, sys io addr */ >> + >> + u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen); >> + void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval, >> + size_t dlen); >> + u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf, >> + size_t dlen, unsigned int count); >> + void (*pfouts)(void *devobj, unsigned long ptaddr, >> + const void *outbuf, size_t dlen, >> + unsigned int count); >> + void *devpara; >> +}; >> + >> +extern struct extio_ops *arm64_extio_ops; >> + >> +#define DECLARE_EXTIO(bw, type) \ >> +extern type in##bw(unsigned long addr); \ >> +extern void out##bw(type value, unsigned long addr); \ >> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\ >> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count); >> + >> +#define BUILD_EXTIO(bw, type) \ >> +type in##bw(unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + return read##bw(PCI_IOBASE + addr); \ >> + return arm64_extio_ops->pfin ? \ >> + arm64_extio_ops->pfin(arm64_extio_ops->devpara, \ >> + addr, sizeof(type)) : -1; \ >> +} \ >> + \ >> +void out##bw(type value, unsigned long addr) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + write##bw(value, PCI_IOBASE + addr); \ >> + else \ >> + if (arm64_extio_ops->pfout) \ >> + arm64_extio_ops->pfout(arm64_extio_ops->devpara,\ >> + addr, value, sizeof(type)); \ >> +} \ >> + \ >> +void ins##bw(unsigned long addr, void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + reads##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfins) \ >> + arm64_extio_ops->pfins(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} \ >> + \ >> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count) \ >> +{ \ >> + if (!arm64_extio_ops || arm64_extio_ops->start > addr || \ >> + arm64_extio_ops->end < addr) \ >> + writes##bw(PCI_IOBASE + addr, buffer, count); \ >> + else \ >> + if (arm64_extio_ops->pfouts) \ >> + arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\ >> + addr, buffer, sizeof(type), count); \ >> +} >> + >> +static inline void arm64_set_extops(struct extio_ops *ops) >> +{ >> + if (ops) >> + WRITE_ONCE(arm64_extio_ops, ops); >> +} >> + >> +#endif /* __LINUX_EXTIO_H*/ >> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h >> index 0bba427..136735d 100644 >> --- a/arch/arm64/include/asm/io.h >> +++ b/arch/arm64/include/asm/io.h >> @@ -31,6 +31,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> >> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr) >> #define IO_SPACE_LIMIT (PCI_IO_SIZE - 1) >> #define PCI_IOBASE ((void __iomem *)PCI_IO_START) >> >> + >> +/* >> + * redefine the in(s)b/out(s)b for indirect-IO. >> + */ >> +#ifdef CONFIG_ARM64_INDIRECT_PIO >> +#define inb inb >> +#define outb outb >> +#define insb insb >> +#define outsb outsb >> +/* external declaration */ >> +DECLARE_EXTIO(b, u8) >> + >> +#define inw inw >> +#define outw outw >> +#define insw insw >> +#define outsw outsw >> + >> +DECLARE_EXTIO(w, u16) >> + >> +#define inl inl >> +#define outl outl >> +#define insl insl >> +#define outsl outsl >> + >> +DECLARE_EXTIO(l, u32) >> +#endif >> + >> + >> /* >> * String version of I/O memory access operations. >> */ >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 7d66bba..60e0482 100644 >> --- a/arch/arm64/kernel/Makefile >> +++ b/arch/arm64/kernel/Makefile >> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ >> sys_compat.o entry32.o >> arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o >> arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o >> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o >> arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o >> arm64-obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o >> arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o >> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c >> new file mode 100644 >> index 0000000..647b3fa >> --- /dev/null >> +++ b/arch/arm64/kernel/extio.c >> @@ -0,0 +1,27 @@ >> +/* >> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved. >> + * Author: Zhichang Yuan >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program. If not, see . >> + */ >> + >> +#include >> + >> +struct extio_ops *arm64_extio_ops; >> + >> + >> +BUILD_EXTIO(b, u8) >> + >> +BUILD_EXTIO(w, u16) >> + >> +BUILD_EXTIO(l, u32) >> -- >> 1.9.1 >> > > >