From nobody Tue Jun 30 16:40:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3BD2DC433EF for ; Wed, 12 Jan 2022 21:39:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233569AbiALVjd (ORCPT ); Wed, 12 Jan 2022 16:39:33 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:45007 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233172AbiALVjS (ORCPT ); Wed, 12 Jan 2022 16:39:18 -0500 Received: from quad ([82.142.23.158]) by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1N2Unv-1mLjqJ15rD-013tPl; Wed, 12 Jan 2022 22:39:04 +0100 From: Laurent Vivier To: linux-kernel@vger.kernel.org Cc: Geert Uytterhoeven , linux-m68k@lists.linux-m68k.org, Alessandro Zummo , Alexandre Belloni , linux-rtc@vger.kernel.org, Laurent Vivier Subject: [PATCH v4 1/3] m68k: add asm/config.h Date: Wed, 12 Jan 2022 22:38:59 +0100 Message-Id: <20220112213901.2178667-2-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220112213901.2178667-1-laurent@vivier.eu> References: <20220112213901.2178667-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:FWFH2vlO6ubonKRzbAlRpjK6hALl3ebhACmvPwTmU1WxcuSOxPl oUhET47roBrIkf4FKcage4yQ5m9d0JoAhyyiiHKb+b/r4mSNTRvRjM0m2ZaAb8wK7ZsvonG jdR8LTAvgImfJ5Bn7yMZadJuO6bKea6THGVDdU9eq5n7x7C8CKflAHGUOFyPBsLBX0ySw/T zbLCj/UGic1jWkxEJwAKw== X-UI-Out-Filterresults: notjunk:1;V03:K0:/A1vrSlgx+s=:oRKMq/X7BYWQpNtlBNZSkY 1xYngG8kBrkTWG4k4N+SktVEhtO5Gn/lwJoQvYjFaLn38e1QgEhyiZH3PBPH4wQelMZF/vDVn ejBJCApa9HUQgmTEWP/puc2Dmu1cSZRfXPyvOZTU19urVGWcXuzCQKvImDrpluIz7tkFCmzDh SIdZxm4V/rlzvOxNIBQ9/3+PmSP8WQU3TT/UpTnwgzkrnOVZwKDKOuc832vdw5eoaTqSifdKj 0ixWhLcNLquwBHZcHPqDI0/GA4P7F2GzC+69cINyNpYQfZNQbtRoEvn63Gv1hGoecgLgsDrHj c3L/eE+bs0f7fhfnHT92Vjk/n6q0IvH+H7fVMGDV4V45OQ1BN121VdC2+uRDR8TJRt2XO8sqH JpGuzed8ATs8fswYT3Eo0+1U6VYlG2deNv3cV+wDZHrYXJKg/wjVutB9x5ryvHBPYXxjQGXCg ULfH9qE7eSfBjWs9Cnut3C8DTyCdZAeU4/9vsVfBdakbNdO83H6pPVhpfY9LvIBzYqK68N91h JEk+ciD9ddlm0+MUX52hSi114ubIPFsh9WT1R88ZRJu4yqdSc4fZRN1EuqQRan3JlGgXyBROg 67UFQUbRV48jsZZCNyY0i5P4/Pv3DQqfRFDF0Yl7Ysy83isxY8jyru4MRRapuZ0hixZNMpTxK tQDMA9vmdCzvnRBgdfawFKBZkA5gfSICBuvpAZofKtF8LucUipr71Q2UFFp9PCqL+Z/0= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To avoid 'warning: no previous prototype for' error, declare all the parse_bootinfo and config functions prototypes into asm/config.h and include it in arch/m68k/kernel/setup_mm.c and arch/m68k/*/config.c Signed-off-by: Laurent Vivier Reviewed-by: Geert Uytterhoeven --- arch/m68k/amiga/config.c | 1 + arch/m68k/apollo/config.c | 1 + arch/m68k/atari/config.c | 1 + arch/m68k/bvme6000/config.c | 1 + arch/m68k/hp300/config.c | 1 + arch/m68k/include/asm/config.h | 33 +++++++++++++++++++++++++++++++++ arch/m68k/kernel/setup_mm.c | 23 +---------------------- arch/m68k/mac/config.c | 1 + arch/m68k/mvme147/config.c | 1 + arch/m68k/mvme16x/config.c | 1 + arch/m68k/q40/config.c | 1 + 11 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 arch/m68k/include/asm/config.h diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index be2dfab48fd4..3137b45750df 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c @@ -37,6 +37,7 @@ #include #include #include +#include =20 static unsigned long amiga_model; =20 diff --git a/arch/m68k/apollo/config.c b/arch/m68k/apollo/config.c index 581a5f68d102..42a8b8e2b664 100644 --- a/arch/m68k/apollo/config.c +++ b/arch/m68k/apollo/config.c @@ -16,6 +16,7 @@ #include #include #include +#include =20 u_long sio01_physaddr; u_long sio23_physaddr; diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c index 261a0f57cc9a..38a7c0578105 100644 --- a/arch/m68k/atari/config.c +++ b/arch/m68k/atari/config.c @@ -46,6 +46,7 @@ #include #include #include +#include =20 u_long atari_mch_cookie; EXPORT_SYMBOL(atari_mch_cookie); diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c index 0c6feafbbd11..9b060d466e03 100644 --- a/arch/m68k/bvme6000/config.c +++ b/arch/m68k/bvme6000/config.c @@ -36,6 +36,7 @@ #include #include #include +#include =20 static void bvme6000_get_model(char *model); extern void bvme6000_sched_init(void); diff --git a/arch/m68k/hp300/config.c b/arch/m68k/hp300/config.c index ce1eb3d3d55d..2c92843397c3 100644 --- a/arch/m68k/hp300/config.c +++ b/arch/m68k/hp300/config.c @@ -22,6 +22,7 @@ #include #include /* readb() and writeb() = */ #include +#include =20 #include "time.h" =20 diff --git a/arch/m68k/include/asm/config.h b/arch/m68k/include/asm/config.h new file mode 100644 index 000000000000..aae61070628b --- /dev/null +++ b/arch/m68k/include/asm/config.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * This file contains prototypes provided by each m68k machine + * to parse bootinfo data structures and to configure the machine + */ + +#ifndef _M68K_CONFIG_H +#define _M68K_CONFIG_H + +extern int amiga_parse_bootinfo(const struct bi_record *record); +extern int atari_parse_bootinfo(const struct bi_record *record); +extern int mac_parse_bootinfo(const struct bi_record *record); +extern int q40_parse_bootinfo(const struct bi_record *record); +extern int bvme6000_parse_bootinfo(const struct bi_record *record); +extern int mvme16x_parse_bootinfo(const struct bi_record *record); +extern int mvme147_parse_bootinfo(const struct bi_record *record); +extern int hp300_parse_bootinfo(const struct bi_record *record); +extern int apollo_parse_bootinfo(const struct bi_record *record); + +extern void config_amiga(void); +extern void config_atari(void); +extern void config_mac(void); +extern void config_sun3(void); +extern void config_apollo(void); +extern void config_mvme147(void); +extern void config_mvme16x(void); +extern void config_bvme6000(void); +extern void config_hp300(void); +extern void config_q40(void); +extern void config_sun3x(void); + +#endif /* _M68K_CONFIG_H */ diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c index 4b51bfd38e5f..226dc3750397 100644 --- a/arch/m68k/kernel/setup_mm.c +++ b/arch/m68k/kernel/setup_mm.c @@ -47,6 +47,7 @@ #endif #include #include +#include =20 #if !FPSTATESIZE || !NR_IRQS #warning No CPU/platform type selected, your kernel will not work! @@ -113,28 +114,6 @@ EXPORT_SYMBOL(isa_type); EXPORT_SYMBOL(isa_sex); #endif =20 -extern int amiga_parse_bootinfo(const struct bi_record *); -extern int atari_parse_bootinfo(const struct bi_record *); -extern int mac_parse_bootinfo(const struct bi_record *); -extern int q40_parse_bootinfo(const struct bi_record *); -extern int bvme6000_parse_bootinfo(const struct bi_record *); -extern int mvme16x_parse_bootinfo(const struct bi_record *); -extern int mvme147_parse_bootinfo(const struct bi_record *); -extern int hp300_parse_bootinfo(const struct bi_record *); -extern int apollo_parse_bootinfo(const struct bi_record *); - -extern void config_amiga(void); -extern void config_atari(void); -extern void config_mac(void); -extern void config_sun3(void); -extern void config_apollo(void); -extern void config_mvme147(void); -extern void config_mvme16x(void); -extern void config_bvme6000(void); -extern void config_hp300(void); -extern void config_q40(void); -extern void config_sun3x(void); - #define MASK_256K 0xfffc0000 =20 extern void paging_init(void); diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 5d16f9b47aa9..65d124ec80bb 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c @@ -47,6 +47,7 @@ #include #include #include +#include =20 /* Mac bootinfo struct */ struct mac_booter_data mac_bi_data; diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c index dfd6202fd403..b96ea7c76a19 100644 --- a/arch/m68k/mvme147/config.c +++ b/arch/m68k/mvme147/config.c @@ -34,6 +34,7 @@ #include #include #include +#include =20 =20 static void mvme147_get_model(char *model); diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c index b4422c2dfbbf..88cbdc10925b 100644 --- a/arch/m68k/mvme16x/config.c +++ b/arch/m68k/mvme16x/config.c @@ -37,6 +37,7 @@ #include #include #include +#include =20 extern t_bdid mvme_bdid; =20 diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c index 5caf1e5be1c2..9237243077ce 100644 --- a/arch/m68k/q40/config.c +++ b/arch/m68k/q40/config.c @@ -34,6 +34,7 @@ #include #include #include +#include =20 extern void q40_init_IRQ(void); static void q40_get_model(char *model); --=20 2.34.1 From nobody Tue Jun 30 16:40:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF843C433F5 for ; Wed, 12 Jan 2022 21:39:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233728AbiALVjj (ORCPT ); Wed, 12 Jan 2022 16:39:39 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:51489 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233179AbiALVjS (ORCPT ); Wed, 12 Jan 2022 16:39:18 -0500 Received: from quad ([82.142.23.158]) by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1Mg6JS-1mQSpC3xaI-00hfbU; Wed, 12 Jan 2022 22:39:05 +0100 From: Laurent Vivier To: linux-kernel@vger.kernel.org Cc: Geert Uytterhoeven , linux-m68k@lists.linux-m68k.org, Alessandro Zummo , Alexandre Belloni , linux-rtc@vger.kernel.org, Laurent Vivier Subject: [PATCH v4 2/3] m68k: introduce a virtual m68k machine Date: Wed, 12 Jan 2022 22:39:00 +0100 Message-Id: <20220112213901.2178667-3-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220112213901.2178667-1-laurent@vivier.eu> References: <20220112213901.2178667-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Le2kK7QE5954lUdd+KjSRlqOayc6JOphmI7cgPUgd43O5M1FbSh gnS+06V1qY1eL/Sv1UpZdciVFvj/7FgpBP9ZjRRuasF914a+jVxvphxaurwKdAItjRMdGPy SdbXQKVsE7vbMfZg/wPMixQEJCDbb+RP3F7qijD5fVhV/HmpT6NhlgqtTKziUOVGUXV0Cbn /sb2CqRs+FbixWlGS0woQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:/F2Xo7BF2f4=:M+r+Yk8ODEewYjYduWQCfD VQdHrHOJi7l3HGKz+V/ryygzeEhXScQD48MvtQtACG0y61TGf3KBRfErJJWiLb0htWdqGoi30 uvyIPxOBHSsEvozSZAJoseaWfoBRh39KoJRfZIjV4kFH8Q02aaBG89ie2afRJrVkj/P+aLdYw oN1tOmU55XKkx3OfCwUrupWkDDfXKI3t137gjm/4PLQ9xD774kc135F9aS4JgwxN7cj34XgEZ utvV+4QH1/EiRNlxI+W5aOWeyO9zPxeqt/2mPNaa49o/C9ScITgHrpNDF9gL0AsbiKRUU/Zcv 5vbtFanSan7Npv1GiBGTN4B8v0evGEK1cRsW/FiTrqJ63RRwU9WSL74HfmkM00kscY00aZey7 CZYZt/FYPM6YRBmajwyeQVhQyxEPZV9EILPFu/9m2KdOFk7ARa4LPfLDl2xibQzxXihTGk8OQ ToRZ84PXSB9LX5ycf9fDeJKtzOF1RMftFTmyPCVediPwEi79jRQqwYUPmgZRrnytlpRIf5gO5 X/QQwj+kDpbqfNQAz8vHYF+7havLhciJ6G/L5Srb7lFFS7Bw3vTPFppiJAtNkQmxUKSgUb+Z9 lJvb8kKY9aEkrNbpzKr4bT0tNMD5xRsaDU+ILqotOIPUHbcx571trmhlGPnRvkdBbwt8H3UAh bzV084zQX7bD2Tq/sGs6dExkx9wLIpfcWrLxB9mTQfHJE321zzRp508Pdiuf0DAbkn08= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This machine allows to have up to 3.2 GiB and 128 Virtio devices. It is based on android goldfish devices. Signed-off-by: Laurent Vivier --- arch/m68k/Kbuild | 1 + arch/m68k/Kconfig.machine | 16 +++ arch/m68k/configs/virt_defconfig | 65 +++++++++++ arch/m68k/include/asm/config.h | 2 + arch/m68k/include/asm/irq.h | 3 +- arch/m68k/include/asm/pgtable_mm.h | 7 ++ arch/m68k/include/asm/setup.h | 44 ++++++-- arch/m68k/include/asm/virt.h | 26 +++++ arch/m68k/include/uapi/asm/bootinfo-virt.h | 18 ++++ arch/m68k/include/uapi/asm/bootinfo.h | 1 + arch/m68k/kernel/Makefile | 1 + arch/m68k/kernel/head.S | 31 ++++++ arch/m68k/kernel/setup_mm.c | 7 ++ arch/m68k/mm/kmap.c | 23 ++-- arch/m68k/virt/Makefile | 6 ++ arch/m68k/virt/config.c | 112 +++++++++++++++++++ arch/m68k/virt/ints.c | 120 +++++++++++++++++++++ arch/m68k/virt/platform.c | 72 +++++++++++++ arch/m68k/virt/timer.c | 90 ++++++++++++++++ 19 files changed, 627 insertions(+), 18 deletions(-) create mode 100644 arch/m68k/configs/virt_defconfig create mode 100644 arch/m68k/include/asm/virt.h create mode 100644 arch/m68k/include/uapi/asm/bootinfo-virt.h create mode 100644 arch/m68k/virt/Makefile create mode 100644 arch/m68k/virt/config.c create mode 100644 arch/m68k/virt/ints.c create mode 100644 arch/m68k/virt/platform.c create mode 100644 arch/m68k/virt/timer.c diff --git a/arch/m68k/Kbuild b/arch/m68k/Kbuild index 18abb35c26a1..7762af9f6def 100644 --- a/arch/m68k/Kbuild +++ b/arch/m68k/Kbuild @@ -17,3 +17,4 @@ obj-$(CONFIG_M68060) +=3D ifpsp060/ obj-$(CONFIG_M68KFPU_EMU) +=3D math-emu/ obj-$(CONFIG_M68000) +=3D 68000/ obj-$(CONFIG_COLDFIRE) +=3D coldfire/ +obj-$(CONFIG_VIRT) +=3D virt/ diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine index eeab4f3e6c19..769c5b38fe16 100644 --- a/arch/m68k/Kconfig.machine +++ b/arch/m68k/Kconfig.machine @@ -149,6 +149,22 @@ config SUN3 =20 If you don't want to compile a kernel exclusively for a Sun 3, say N. =20 +config VIRT + bool "Virtual M68k Machine support" + depends on MMU + select LEGACY_TIMER_TICK + select M68040 + select MMU_MOTOROLA if MMU + select GOLDFISH + select GOLDFISH_TTY + select TTY + select RTC_CLASS + select RTC_DRV_GOLDFISH + select VIRTIO_MMIO + help + This options enable a pure virtual machine based on m68k, + VIRTIO MMIO devices and GOLDFISH interfaces (TTY, RTC, PIC) + config PILOT bool =20 diff --git a/arch/m68k/configs/virt_defconfig b/arch/m68k/configs/virt_defc= onfig new file mode 100644 index 000000000000..462e51ef69eb --- /dev/null +++ b/arch/m68k/configs/virt_defconfig @@ -0,0 +1,65 @@ +CONFIG_LOCALVERSION=3D"-virt" +CONFIG_SYSVIPC=3Dy +CONFIG_CGROUPS=3Dy +CONFIG_BLK_CGROUP=3Dy +CONFIG_CGROUP_SCHED=3Dy +CONFIG_CGROUP_PIDS=3Dy +CONFIG_CGROUP_RDMA=3Dy +CONFIG_CGROUP_FREEZER=3Dy +CONFIG_CGROUP_DEVICE=3Dy +CONFIG_CGROUP_CPUACCT=3Dy +CONFIG_VIRT=3Dy +CONFIG_PROC_HARDWARE=3Dy +CONFIG_PARTITION_ADVANCED=3Dy +CONFIG_AMIGA_PARTITION=3Dy +CONFIG_ATARI_PARTITION=3Dy +CONFIG_MAC_PARTITION=3Dy +CONFIG_BSD_DISKLABEL=3Dy +CONFIG_MINIX_SUBPARTITION=3Dy +CONFIG_SOLARIS_X86_PARTITION=3Dy +CONFIG_UNIXWARE_DISKLABEL=3Dy +CONFIG_LDM_PARTITION=3Dy +CONFIG_LDM_DEBUG=3Dy +CONFIG_SUN_PARTITION=3Dy +CONFIG_SYSV68_PARTITION=3Dy +CONFIG_NET=3Dy +CONFIG_PACKET=3Dy +CONFIG_UNIX=3Dy +CONFIG_INET=3Dy +CONFIG_IP_PNP=3Dy +CONFIG_IP_PNP_DHCP=3Dy +CONFIG_IP_PNP_BOOTP=3Dy +CONFIG_CGROUP_NET_PRIO=3Dy +CONFIG_CGROUP_NET_CLASSID=3Dy +CONFIG_NET_9P=3Dy +CONFIG_NET_9P_VIRTIO=3Dy +CONFIG_DEVTMPFS=3Dy +CONFIG_BLK_DEV_LOOP=3Dy +CONFIG_BLK_DEV_RAM=3Dy +CONFIG_VIRTIO_BLK=3Dy +CONFIG_SCSI=3Dy +CONFIG_BLK_DEV_SR=3Dy +CONFIG_SCSI_VIRTIO=3Dy +CONFIG_NETDEVICES=3Dy +CONFIG_VIRTIO_NET=3Dy +CONFIG_INPUT_MOUSEDEV=3Dy +CONFIG_INPUT_EVDEV=3Dy +CONFIG_VIRTIO_CONSOLE=3Dy +CONFIG_HW_RANDOM_VIRTIO=3Dy +CONFIG_DRM=3Dy +CONFIG_DRM_VIRTIO_GPU=3Dy +CONFIG_FB=3Dy +CONFIG_VIRT_DRIVERS=3Dy +CONFIG_VIRTIO_INPUT=3Dy +CONFIG_EXT4_FS=3Dy +CONFIG_AUTOFS_FS=3Dy +CONFIG_ISO9660_FS=3Dy +CONFIG_JOLIET=3Dy +CONFIG_ZISOFS=3Dy +CONFIG_UDF_FS=3Dy +CONFIG_TMPFS=3Dy +CONFIG_TMPFS_POSIX_ACL=3Dy +CONFIG_9P_FS=3Dy +CONFIG_9P_FS_POSIX_ACL=3Dy +CONFIG_9P_FS_SECURITY=3Dy +CONFIG_EARLY_PRINTK=3Dy diff --git a/arch/m68k/include/asm/config.h b/arch/m68k/include/asm/config.h index aae61070628b..b9dacc52f2c8 100644 --- a/arch/m68k/include/asm/config.h +++ b/arch/m68k/include/asm/config.h @@ -17,6 +17,7 @@ extern int mvme16x_parse_bootinfo(const struct bi_record = *record); extern int mvme147_parse_bootinfo(const struct bi_record *record); extern int hp300_parse_bootinfo(const struct bi_record *record); extern int apollo_parse_bootinfo(const struct bi_record *record); +extern int virt_parse_bootinfo(const struct bi_record *record); =20 extern void config_amiga(void); extern void config_atari(void); @@ -29,5 +30,6 @@ extern void config_bvme6000(void); extern void config_hp300(void); extern void config_q40(void); extern void config_sun3x(void); +extern void config_virt(void); =20 #endif /* _M68K_CONFIG_H */ diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h index 91dd493791d7..7829e955ca04 100644 --- a/arch/m68k/include/asm/irq.h +++ b/arch/m68k/include/asm/irq.h @@ -12,7 +12,8 @@ */ #if defined(CONFIG_COLDFIRE) #define NR_IRQS 256 -#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) +#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || \ + defined(CONFIG_SUN3X) || defined(CONFIG_VIRT) #define NR_IRQS 200 #elif defined(CONFIG_ATARI) #define NR_IRQS 141 diff --git a/arch/m68k/include/asm/pgtable_mm.h b/arch/m68k/include/asm/pgt= able_mm.h index 143ba7de9bda..9b4e2fe2ac82 100644 --- a/arch/m68k/include/asm/pgtable_mm.h +++ b/arch/m68k/include/asm/pgtable_mm.h @@ -80,6 +80,9 @@ #elif defined(CONFIG_COLDFIRE) #define KMAP_START 0xe0000000 #define KMAP_END 0xf0000000 +#elif defined(CONFIG_VIRT) +#define KMAP_START 0xdf000000 +#define KMAP_END 0xff000000 #else #define KMAP_START 0xd0000000 #define KMAP_END 0xf0000000 @@ -92,6 +95,10 @@ extern unsigned long m68k_vmalloc_end; #elif defined(CONFIG_COLDFIRE) #define VMALLOC_START 0xd0000000 #define VMALLOC_END 0xe0000000 +#elif defined(CONFIG_VIRT) +#define VMALLOC_OFFSET PAGE_SIZE +#define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(= VMALLOC_OFFSET-1)) +#define VMALLOC_END KMAP_START #else /* Just any arbitrary offset to the start of the vmalloc VM area: the * current 8MB value just means that there will be a 8MB "hole" after the diff --git a/arch/m68k/include/asm/setup.h b/arch/m68k/include/asm/setup.h index 8f2023f8c1c4..2c99477aaf89 100644 --- a/arch/m68k/include/asm/setup.h +++ b/arch/m68k/include/asm/setup.h @@ -37,7 +37,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLL= O) \ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_AMIGA (m68k_machtype =3D=3D MACH_AMIGA) #else # define MACH_AMIGA_ONLY @@ -50,7 +51,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLL= O) \ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_ATARI (m68k_machtype =3D=3D MACH_ATARI) #else # define MACH_ATARI_ONLY @@ -63,7 +65,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APO= LLO) \ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_MAC (m68k_machtype =3D=3D MACH_MAC) #else # define MACH_MAC_ONLY @@ -84,7 +87,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_APOLLO (m68k_machtype =3D=3D MACH_APOLLO) #else # define MACH_APOLLO_ONLY @@ -97,7 +101,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x) \ + || defined(CONFIG_VIRT) # define MACH_IS_MVME147 (m68k_machtype =3D=3D MACH_MVME147) #else # define MACH_MVME147_ONLY @@ -110,7 +115,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_MVME16x (m68k_machtype =3D=3D MACH_MVME16x) #else # define MACH_MVME16x_ONLY @@ -123,7 +129,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_BVME6000 (m68k_machtype =3D=3D MACH_BVME6000) #else # define MACH_BVME6000_ONLY @@ -136,7 +143,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ || defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_HP300 (m68k_machtype =3D=3D MACH_HP300) #else # define MACH_HP300_ONLY @@ -149,7 +157,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \ - || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) + || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_Q40 (m68k_machtype =3D=3D MACH_Q40) #else # define MACH_Q40_ONLY @@ -162,7 +171,8 @@ extern unsigned long m68k_machtype; #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \ - || defined(CONFIG_Q40) || defined(CONFIG_MVME147) + || defined(CONFIG_Q40) || defined(CONFIG_MVME147) \ + || defined(CONFIG_VIRT) # define MACH_IS_SUN3X (m68k_machtype =3D=3D MACH_SUN3X) #else # define CONFIG_SUN3X_ONLY @@ -170,6 +180,20 @@ extern unsigned long m68k_machtype; # define MACH_TYPE (MACH_SUN3X) #endif =20 +#if !defined(CONFIG_VIRT) +# define MACH_IS_VIRT (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI= ) \ + || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ + || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \ + || defined(CONFIG_Q40) || defined(CONFIG_SUN3X) \ + || defined(CONFIG_MVME147) +# define MACH_IS_VIRT (m68k_machtype =3D=3D MACH_VIRT) +#else +# define MACH_VIRT_ONLY +# define MACH_IS_VIRT (1) +# define MACH_TYPE (MACH_VIRT) +#endif + #ifndef MACH_TYPE # define MACH_TYPE (m68k_machtype) #endif diff --git a/arch/m68k/include/asm/virt.h b/arch/m68k/include/asm/virt.h new file mode 100644 index 000000000000..2795a70f709b --- /dev/null +++ b/arch/m68k/include/asm/virt.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ASM_VIRT_H +#define __ASM_VIRT_H + +#define NUM_VIRT_SOURCES 200 + +struct virt_booter_device_data { + unsigned long mmio; + unsigned long irq; +}; + +struct virt_booter_data { + unsigned long qemu_version; + struct virt_booter_device_data pic; + struct virt_booter_device_data rtc; + struct virt_booter_device_data tty; + struct virt_booter_device_data ctrl; + struct virt_booter_device_data virtio; +}; + +extern struct virt_booter_data virt_bi_data; + +extern void __init virt_init_IRQ(void); +extern void __init virt_sched_init(void); + +#endif diff --git a/arch/m68k/include/uapi/asm/bootinfo-virt.h b/arch/m68k/include= /uapi/asm/bootinfo-virt.h new file mode 100644 index 000000000000..ab17fd9d200d --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-virt.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * asm/bootinfo-virt.h -- Virtual-m68k-specific boot information definitio= ns + */ + +#ifndef _UAPI_ASM_M68K_BOOTINFO_VIRT_H +#define _UAPI_ASM_M68K_BOOTINFO_VIRT_H + +#define BI_VIRT_QEMU_VERSION 0x8000 +#define BI_VIRT_GF_PIC_BASE 0x8001 +#define BI_VIRT_GF_RTC_BASE 0x8002 +#define BI_VIRT_GF_TTY_BASE 0x8003 +#define BI_VIRT_VIRTIO_BASE 0x8004 +#define BI_VIRT_CTRL_BASE 0x8005 + +#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0) + +#endif /* _UAPI_ASM_M68K_BOOTINFO_MAC_H */ diff --git a/arch/m68k/include/uapi/asm/bootinfo.h b/arch/m68k/include/uapi= /asm/bootinfo.h index 38d3140381fa..203d9cbf9630 100644 --- a/arch/m68k/include/uapi/asm/bootinfo.h +++ b/arch/m68k/include/uapi/asm/bootinfo.h @@ -83,6 +83,7 @@ struct mem_info { #define MACH_SUN3X 11 #define MACH_M54XX 12 #define MACH_M5441X 13 +#define MACH_VIRT 14 =20 =20 /* diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile index dbac7f8743fc..c0833da6a2ca 100644 --- a/arch/m68k/kernel/Makefile +++ b/arch/m68k/kernel/Makefile @@ -11,6 +11,7 @@ extra-$(CONFIG_VME) :=3D head.o extra-$(CONFIG_HP300) :=3D head.o extra-$(CONFIG_Q40) :=3D head.o extra-$(CONFIG_SUN3X) :=3D head.o +extra-$(CONFIG_VIRT) :=3D head.o extra-$(CONFIG_SUN3) :=3D sun3-head.o extra-y +=3D vmlinux.lds =20 diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S index 493c95db0e51..ca9ccf23de86 100644 --- a/arch/m68k/kernel/head.S +++ b/arch/m68k/kernel/head.S @@ -262,6 +262,7 @@ #include #include #include +#include #include #include #include @@ -534,6 +535,7 @@ func_define putn,1 #define is_not_apollo(lab) cmpl &MACH_APOLLO,%pc@(m68k_machtype); jne lab #define is_not_q40(lab) cmpl &MACH_Q40,%pc@(m68k_machtype); jne lab #define is_not_sun3x(lab) cmpl &MACH_SUN3X,%pc@(m68k_machtype); jne lab +#define is_not_virt(lab) cmpl &MACH_VIRT,%pc@(m68k_machtype); jne lab =20 #define hasnt_leds(lab) cmpl &MACH_HP300,%pc@(m68k_machtype); \ jeq 42f; \ @@ -647,6 +649,14 @@ ENTRY(__start) L(test_notmac): #endif /* CONFIG_MAC */ =20 +#ifdef CONFIG_VIRT + is_not_virt(L(test_notvirt)) + + get_bi_record BI_VIRT_GF_TTY_BASE + lea %pc@(L(virt_gf_tty_base)),%a1 + movel %a0@,%a1@ +L(test_notvirt): +#endif /* CONFIG_VIRT */ =20 /* * There are ultimately two pieces of information we want for all kinds of @@ -1237,6 +1247,13 @@ L(mmu_init_not_mac): L(notsun3x): #endif =20 +#ifdef CONFIG_VIRT + is_not_virt(L(novirt)) + mmu_map_tt #1,#0xFF000000,#0x01000000,#_PAGE_NOCACHE_S + jbra L(mmu_init_done) +L(novirt): +#endif + #ifdef CONFIG_APOLLO is_not_apollo(L(notapollo)) =20 @@ -3186,6 +3203,14 @@ func_start serial_putc,%d0/%d1/%a0/%a1 3: #endif =20 +#ifdef CONFIG_VIRT + is_not_virt(1f) + + movel L(virt_gf_tty_base),%a1 + moveb %d0,%a1@(GF_PUT_CHAR) +1: +#endif + L(serial_putc_done): func_return serial_putc =20 @@ -3865,3 +3890,9 @@ q40_mem_cptr: L(q40_do_debug): .long 0 #endif + +#if defined(CONFIG_VIRT) +GF_PUT_CHAR =3D 0x00 +L(virt_gf_tty_base): + .long 0 +#endif /* CONFIG_VIRT */ diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c index 226dc3750397..b4ece3b05504 100644 --- a/arch/m68k/kernel/setup_mm.c +++ b/arch/m68k/kernel/setup_mm.c @@ -182,6 +182,8 @@ static void __init m68k_parse_bootinfo(const struct bi_= record *record) unknown =3D hp300_parse_bootinfo(record); else if (MACH_IS_APOLLO) unknown =3D apollo_parse_bootinfo(record); + else if (MACH_IS_VIRT) + unknown =3D virt_parse_bootinfo(record); else unknown =3D 1; } @@ -312,6 +314,11 @@ void __init setup_arch(char **cmdline_p) cf_mmu_context_init(); config_BSP(NULL, 0); break; +#endif +#ifdef CONFIG_VIRT + case MACH_VIRT: + config_virt(); + break; #endif default: panic("No configuration setup"); diff --git a/arch/m68k/mm/kmap.c b/arch/m68k/mm/kmap.c index 20ddf71b43d0..39729f40d106 100644 --- a/arch/m68k/mm/kmap.c +++ b/arch/m68k/mm/kmap.c @@ -179,6 +179,12 @@ void __iomem *__ioremap(unsigned long physaddr, unsign= ed long size, int cachefla return (void __iomem *)physaddr; } #endif +#ifdef CONFIG_VIRT + if (MACH_IS_VIRT) { + if (physaddr >=3D 0xff000000 && cacheflag =3D=3D IOMAP_NOCACHE_SER) + return (void __iomem *)physaddr; + } +#endif #ifdef CONFIG_COLDFIRE if (__cf_internalio(physaddr)) return (void __iomem *) physaddr; @@ -292,18 +298,21 @@ EXPORT_SYMBOL(__ioremap); */ void iounmap(void __iomem *addr) { -#ifdef CONFIG_AMIGA - if ((!MACH_IS_AMIGA) || - (((unsigned long)addr < 0x40000000) || - ((unsigned long)addr > 0x60000000))) - free_io_area((__force void *)addr); -#else +#if defined(CONFIG_AMIGA) + if (MACH_IS_AMIGA && + ((unsigned long)addr >=3D 0x40000000) && + ((unsigned long)addr < 0x60000000)) + return; +#endif +#if defined(CONFIG_VIRT) + if (MACH_IS_VIRT && (unsigned long)addr >=3D 0xff000000) + return; +#endif #ifdef CONFIG_COLDFIRE if (cf_internalio(addr)) return; #endif free_io_area((__force void *)addr); -#endif } EXPORT_SYMBOL(iounmap); =20 diff --git a/arch/m68k/virt/Makefile b/arch/m68k/virt/Makefile new file mode 100644 index 000000000000..40420fc886bb --- /dev/null +++ b/arch/m68k/virt/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Makefile for Linux arch/m68k/virt source directory +# + +obj-y :=3D config.o ints.o platform.o timer.o diff --git a/arch/m68k/virt/config.c b/arch/m68k/virt/config.c new file mode 100644 index 000000000000..3b1ac40c77bc --- /dev/null +++ b/arch/m68k/virt/config.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +#include +#include +#include +#include +#include +#include + +struct virt_booter_data virt_bi_data; + +struct virt_ctrl { + u32 features; + u32 cmd; +}; + +enum { + CMD_NOOP, + CMD_RESET, + CMD_HALT, + CMD_PANIC, +}; + +#define virt_ctrl ((volatile struct virt_ctrl *)virt_bi_data.ctrl.mmio) + +static void virt_get_model(char *str) +{ + /* str is 80 characters long */ + sprintf(str, "QEMU Virtual M68K Machine (%u.%u.%u)", + (u8)(virt_bi_data.qemu_version >> 24), + (u8)(virt_bi_data.qemu_version >> 16), + (u8)(virt_bi_data.qemu_version >> 8)); +} + +static void virt_halt(void) +{ + virt_ctrl->cmd =3D CMD_HALT; + local_irq_disable(); + while (1) + ; +} + +static void virt_reset(void) +{ + virt_ctrl->cmd =3D CMD_RESET; + local_irq_disable(); + while (1) + ; +} + +/* + * Parse a virtual-m68k-specific record in the bootinfo + */ + +int __init virt_parse_bootinfo(const struct bi_record *record) +{ + int unknown =3D 0; + const void *data =3D record->data; + + switch (be16_to_cpu(record->tag)) { + case BI_VIRT_QEMU_VERSION: + virt_bi_data.qemu_version =3D be32_to_cpup(data); + break; + case BI_VIRT_GF_PIC_BASE: + virt_bi_data.pic.mmio =3D be32_to_cpup(data); + data +=3D 4; + virt_bi_data.pic.irq =3D be32_to_cpup(data); + break; + case BI_VIRT_GF_RTC_BASE: + virt_bi_data.rtc.mmio =3D be32_to_cpup(data); + data +=3D 4; + virt_bi_data.rtc.irq =3D be32_to_cpup(data); + break; + case BI_VIRT_GF_TTY_BASE: + virt_bi_data.tty.mmio =3D be32_to_cpup(data); + data +=3D 4; + virt_bi_data.tty.irq =3D be32_to_cpup(data); + break; + case BI_VIRT_CTRL_BASE: + virt_bi_data.ctrl.mmio =3D be32_to_cpup(data); + data +=3D 4; + virt_bi_data.ctrl.irq =3D be32_to_cpup(data); + break; + case BI_VIRT_VIRTIO_BASE: + virt_bi_data.virtio.mmio =3D be32_to_cpup(data); + data +=3D 4; + virt_bi_data.virtio.irq =3D be32_to_cpup(data); + break; + default: + unknown =3D 1; + break; + } + return unknown; +} + +void __init config_virt(void) +{ + char earlycon[24]; + + snprintf(earlycon, sizeof(earlycon), "early_gf_tty,0x%08lx", + virt_bi_data.tty.mmio); + setup_earlycon(earlycon); + + mach_init_IRQ =3D virt_init_IRQ; + mach_sched_init =3D virt_sched_init; + mach_get_model =3D virt_get_model; + mach_reset =3D virt_reset; + mach_halt =3D virt_halt; + mach_power_off =3D virt_halt; +} diff --git a/arch/m68k/virt/ints.c b/arch/m68k/virt/ints.c new file mode 100644 index 000000000000..7b2827f84b09 --- /dev/null +++ b/arch/m68k/virt/ints.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +struct goldfish_pic { + u32 status; + u32 irq_pending; + u32 irq_diable_all; + u32 disable; + u32 enable; + u32 pad[1019]; +}; + +extern void show_registers(struct pt_regs *); + +#define gf_pic ((volatile struct goldfish_pic *)virt_bi_data.pic.mmio) + +#define GF_PIC(irq) (gf_pic[(irq - IRQ_USER) / 32]) +#define GF_IRQ(irq) ((irq - IRQ_USER) % 32) + +static void virt_irq_enable(struct irq_data *data) +{ + GF_PIC(data->irq).enable =3D 1 << GF_IRQ(data->irq); +} + +static void virt_irq_disable(struct irq_data *data) +{ + GF_PIC(data->irq).disable =3D 1 << GF_IRQ(data->irq); +} + +static unsigned int virt_irq_startup(struct irq_data *data) +{ + virt_irq_enable(data); + return 0; +} + +static irqreturn_t virt_nmi_handler(int irq, void *dev_id) +{ + static volatile int in_nmi; + + if (in_nmi) + return IRQ_HANDLED; + in_nmi =3D 1; + + pr_warn("Non-Maskable Interrupt\n"); + show_registers(get_irq_regs()); + + in_nmi =3D 0; + return IRQ_HANDLED; +} + +static struct irq_chip virt_irq_chip =3D { + .name =3D "virt", + .irq_enable =3D virt_irq_enable, + .irq_disable =3D virt_irq_disable, + .irq_startup =3D virt_irq_startup, + .irq_shutdown =3D virt_irq_disable, +}; + +static void goldfish_pic_irq(struct irq_desc *desc) +{ + u32 irq_pending; + int irq_num; + + irq_pending =3D gf_pic[desc->irq_data.irq - 1].irq_pending; + irq_num =3D IRQ_USER + (desc->irq_data.irq - 1) * 32; + + do { + if (irq_pending & 1) + generic_handle_irq(irq_num); + ++irq_num; + irq_pending >>=3D 1; + } while (irq_pending); +} + +/* + * 6 goldfish-pic for CPU IRQ #1 to IRQ #6 + * CPU IRQ #1 -> PIC #1 + * IRQ #1 to IRQ #31 -> unused + * IRQ #32 -> goldfish-tty + * CPU IRQ #2 -> PIC #2 + * IRQ #1 to IRQ #32 -> virtio-mmio from 1 to 32 + * CPU IRQ #3 -> PIC #3 + * IRQ #1 to IRQ #32 -> virtio-mmio from 33 to 64 + * CPU IRQ #4 -> PIC #4 + * IRQ #1 to IRQ #32 -> virtio-mmio from 65 to 96 + * CPU IRQ #5 -> PIC #5 + * IRQ #1 to IRQ #32 -> virtio-mmio from 97 to 128 + * CPU IRQ #6 -> PIC #6 + * IRQ #1 -> goldfish-rtc + * IRQ #2 to IRQ #32 -> unused + * CPU IRQ #7 -> NMI + */ +void __init virt_init_IRQ(void) +{ + int i; + + m68k_setup_irq_controller(&virt_irq_chip, handle_simple_irq, IRQ_USER, + NUM_VIRT_SOURCES - IRQ_USER); + + for (i =3D 0; i < 6; i++) { + irq_set_chained_handler(virt_bi_data.pic.irq + i, + goldfish_pic_irq); + } + + if (request_irq(IRQ_AUTO_7, virt_nmi_handler, 0, "NMI", + virt_nmi_handler)) + pr_err("Couldn't register NMI\n"); +} diff --git a/arch/m68k/virt/platform.c b/arch/m68k/virt/platform.c new file mode 100644 index 000000000000..c16158e7a9ca --- /dev/null +++ b/arch/m68k/virt/platform.c @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include + +#define VIRTIO_BUS_NB 128 + +static int __init virt_virtio_init(int id) +{ + const struct resource res[] =3D { + DEFINE_RES_MEM(virt_bi_data.virtio.mmio + id * 0x200, 0x200), + DEFINE_RES_IRQ(virt_bi_data.virtio.irq + id), + }; + struct platform_device *pdev; + + pdev =3D platform_device_register_simple("virtio-mmio", id, + res, ARRAY_SIZE(res)); + if (IS_ERR(pdev)) + return PTR_ERR(pdev); + + return 0; +} + +static int __init virt_platform_init(void) +{ + const struct resource goldfish_tty_res[] =3D { + DEFINE_RES_MEM(virt_bi_data.tty.mmio, 1), + DEFINE_RES_IRQ(virt_bi_data.tty.irq), + }; + /* this is the second gf-rtc, the first one is used by the scheduler */ + const struct resource goldfish_rtc_res[] =3D { + DEFINE_RES_MEM(virt_bi_data.rtc.mmio + 0x1000, 0x1000), + DEFINE_RES_IRQ(virt_bi_data.rtc.irq + 1), + }; + extern unsigned long min_low_pfn; + struct platform_device *pdev; + int i; + + if (!MACH_IS_VIRT) + return -ENODEV; + + /* We need this to have DMA'able memory provided to goldfish-tty */ + min_low_pfn =3D 0; + + pdev =3D platform_device_register_simple("goldfish_tty", + PLATFORM_DEVID_NONE, + goldfish_tty_res, + ARRAY_SIZE(goldfish_tty_res)); + if (IS_ERR(pdev)) + return PTR_ERR(pdev); + + pdev =3D platform_device_register_simple("goldfish_rtc", + PLATFORM_DEVID_NONE, + goldfish_rtc_res, + ARRAY_SIZE(goldfish_rtc_res)); + if (IS_ERR(pdev)) + return PTR_ERR(pdev); + + for (i =3D 0; i < VIRTIO_BUS_NB; i++) { + int err; + + err =3D virt_virtio_init(i); + if (err) + return err; + } + + return 0; +} + +arch_initcall(virt_platform_init); diff --git a/arch/m68k/virt/timer.c b/arch/m68k/virt/timer.c new file mode 100644 index 000000000000..843bf6ed7e1a --- /dev/null +++ b/arch/m68k/virt/timer.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include + +struct goldfish_timer { + u32 time_low; + u32 time_high; + u32 alarm_low; + u32 alarm_high; + u32 irq_enabled; + u32 clear_alarm; + u32 alarm_status; + u32 clear_interrupt; +}; + +#define gf_timer ((volatile struct goldfish_timer *)virt_bi_data.rtc.mmio) + +static u64 goldfish_timer_read(struct clocksource *cs) +{ + u64 ticks; + + /* + * time_low: get low bits of current time and update time_high + * time_high: get high bits of time at last time_low read + */ + ticks =3D gf_timer->time_low; + ticks +=3D (u64)gf_timer->time_high << 32; + + return ticks; +} + +static struct clocksource goldfish_timer =3D { + .name =3D "goldfish_timer", + .rating =3D 400, + .read =3D goldfish_timer_read, + .mask =3D CLOCKSOURCE_MASK(64), + .flags =3D 0, + .max_idle_ns =3D LONG_MAX, +}; + +static irqreturn_t golfish_timer_handler(int irq, void *dev_id) +{ + u64 now; + + gf_timer->clear_interrupt =3D 1; + + now =3D goldfish_timer_read(NULL); + + legacy_timer_tick(1); + + now +=3D NSEC_PER_SEC / HZ; + gf_timer->alarm_high =3D upper_32_bits(now); + gf_timer->alarm_low =3D lower_32_bits(now); + + return IRQ_HANDLED; +} + +void __init virt_sched_init(void) +{ + static struct resource sched_res; + u64 now; + + sched_res.name =3D "goldfish_timer"; + sched_res.start =3D virt_bi_data.rtc.mmio; + sched_res.end =3D virt_bi_data.rtc.mmio + 0xfff; + + if (request_resource(&iomem_resource, &sched_res)) { + pr_err("Cannot allocate goldfish-timer resource\n"); + return; + } + + if (request_irq(virt_bi_data.rtc.irq, golfish_timer_handler, IRQF_TIMER, + "timer", NULL)) { + pr_err("Couldn't register timer interrupt\n"); + return; + } + + now =3D goldfish_timer_read(NULL); + now +=3D NSEC_PER_SEC / HZ; + + gf_timer->clear_interrupt =3D 1; + gf_timer->alarm_high =3D upper_32_bits(now); + gf_timer->alarm_low =3D lower_32_bits(now); + gf_timer->irq_enabled =3D 1; + + clocksource_register_hz(&goldfish_timer, NSEC_PER_SEC); +} --=20 2.34.1 From nobody Tue Jun 30 16:40:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1EF8CC433FE for ; Wed, 12 Jan 2022 21:39:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233409AbiALVjY (ORCPT ); Wed, 12 Jan 2022 16:39:24 -0500 Received: from mout.kundenserver.de ([212.227.126.187]:54981 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233174AbiALVjS (ORCPT ); Wed, 12 Jan 2022 16:39:18 -0500 Received: from quad ([82.142.23.158]) by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MFbBO-1n8MDM0glq-00HAXY; Wed, 12 Jan 2022 22:39:06 +0100 From: Laurent Vivier To: linux-kernel@vger.kernel.org Cc: Geert Uytterhoeven , linux-m68k@lists.linux-m68k.org, Alessandro Zummo , Alexandre Belloni , linux-rtc@vger.kernel.org, Laurent Vivier , Arnd Bergmann Subject: [PATCH v4 3/3] m68k: virt: Remove LEGACY_TIMER_TICK Date: Wed, 12 Jan 2022 22:39:01 +0100 Message-Id: <20220112213901.2178667-4-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220112213901.2178667-1-laurent@vivier.eu> References: <20220112213901.2178667-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:YXtM90aHK1d0OvIhVyXWSgykMR28ld+QZcz3xqT1FE55S6fbL2g 2XLUVIPCPCcc0cITaHfkR1/1JTWpVqsYttX+FHiZRPHn2vs0OV9m58vIHvifcb2xlccHjJF uV+hlJsEhHvz49jJPR2hBLTxk5WijKSYPi5+MW7Jj/R2qqrpkRRICvmY/PlCCjqkGrX6zzz KHhzN6PcXqAoqXeeNri9Q== X-UI-Out-Filterresults: notjunk:1;V03:K0:teksdMZ8okw=:Pa5JvdQsPVOSQbzhA3t5YU DrZAO9tmjLOIk4lQu9+dmMsozylLLm7DOgX//1UuZ+rK3Xf+k9SxT4bFl4casS7YjZ5Kjl9Mg IGmrkBrvoLoEHTTsn5OYOaWZQ6Oqpz1rI8HkDQPYyZ4PSj7biLYYKKfAEz+Wi4RYeZUCjp+AB PJIp4NBLOeM84gCMWzk+5w317SVi3wSvu8Sb5Q7cmdM0jTcUl+qCzdfAt5EWcJATVsoKoW7qS ArAQ6Ok3V8qem4ciBZJG5/TEKnrGab70jLSLornk0PL1A2N4JEn/NTrWu11ibuDULtPAtrykE D1jXl1X2SFSbwg4x4IY44++in2YL3SxdRga08++OWXBl4UTwGhJ7jL0Hy8GHEWnWEPMCQW9iJ B52gVwburOrCGBE2WOMLRFov/hCpxSnbfaaz30Eza7jnIlQaFgv3ltepOoqC+A+G2g2VuG1AW Mq0tlaXO+smcmyEo2koNcFGyhPZXDBLmJCqaOt9mCeBI1cRjQlYDxRp0YYyzJI8hdgrxXn7OH lMm1HcSs8Xpe7Eoe8+4YUHvY8HEWI2OPz85FWQ4YiLE0EJO+Abog3FJEyh8ecuUn2hAPYnB46 xceey3lE4QNAtRQqyvGYt/BySyXMxgVe8CQD+NXCeg0AP9qSiEsVu7Tk5mwC8PKN4hylfyQdu lQculNAc23dZeJtbqjBNTIeRIG4RUGR1e+CZ1Q+wsUS6LtmedKeEO7fxbFwkbRARnfCE= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Move virt machine to generic clockevents. cc: Arnd Bergmann Signed-off-by: Laurent Vivier --- arch/m68k/Kconfig.machine | 1 - arch/m68k/virt/timer.c | 56 ++++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine index 769c5b38fe16..74a2354bc226 100644 --- a/arch/m68k/Kconfig.machine +++ b/arch/m68k/Kconfig.machine @@ -152,7 +152,6 @@ config SUN3 config VIRT bool "Virtual M68k Machine support" depends on MMU - select LEGACY_TIMER_TICK select M68040 select MMU_MOTOROLA if MMU select GOLDFISH diff --git a/arch/m68k/virt/timer.c b/arch/m68k/virt/timer.c index 843bf6ed7e1a..767b01f75abb 100644 --- a/arch/m68k/virt/timer.c +++ b/arch/m68k/virt/timer.c @@ -3,6 +3,7 @@ #include #include #include +#include #include =20 struct goldfish_timer { @@ -41,7 +42,25 @@ static struct clocksource goldfish_timer =3D { .max_idle_ns =3D LONG_MAX, }; =20 -static irqreturn_t golfish_timer_handler(int irq, void *dev_id) +static int goldfish_timer_set_oneshot(struct clock_event_device *evt) +{ + gf_timer->alarm_high =3D 0; + gf_timer->alarm_low =3D 0; + + gf_timer->irq_enabled =3D 1; + + return 0; +} + +static int goldfish_timer_shutdown(struct clock_event_device *evt) +{ + gf_timer->irq_enabled =3D 0; + + return 0; +} + +static int goldfish_timer_next_event(unsigned long delta, + struct clock_event_device *evt) { u64 now; =20 @@ -49,19 +68,35 @@ static irqreturn_t golfish_timer_handler(int irq, void = *dev_id) =20 now =3D goldfish_timer_read(NULL); =20 - legacy_timer_tick(1); + now +=3D delta; =20 - now +=3D NSEC_PER_SEC / HZ; gf_timer->alarm_high =3D upper_32_bits(now); gf_timer->alarm_low =3D lower_32_bits(now); =20 + return 0; +} + +struct clock_event_device goldfish_timer_clockevent =3D { + .name =3D "goldfish_timer", + .features =3D CLOCK_EVT_FEAT_ONESHOT, + .set_state_shutdown =3D goldfish_timer_shutdown, + .set_state_oneshot =3D goldfish_timer_set_oneshot, + .set_next_event =3D goldfish_timer_next_event, + .shift =3D 32, +}; + +static irqreturn_t golfish_timer_tick(int irq, void *dev_id) +{ + struct clock_event_device *evt =3D &goldfish_timer_clockevent; + + evt->event_handler(evt); + return IRQ_HANDLED; } =20 void __init virt_sched_init(void) { static struct resource sched_res; - u64 now; =20 sched_res.name =3D "goldfish_timer"; sched_res.start =3D virt_bi_data.rtc.mmio; @@ -72,19 +107,14 @@ void __init virt_sched_init(void) return; } =20 - if (request_irq(virt_bi_data.rtc.irq, golfish_timer_handler, IRQF_TIMER, + clockevents_config_and_register(&goldfish_timer_clockevent, NSEC_PER_SEC, + 1, 0xffffffff); + + if (request_irq(virt_bi_data.rtc.irq, golfish_timer_tick, IRQF_TIMER, "timer", NULL)) { pr_err("Couldn't register timer interrupt\n"); return; } =20 - now =3D goldfish_timer_read(NULL); - now +=3D NSEC_PER_SEC / HZ; - - gf_timer->clear_interrupt =3D 1; - gf_timer->alarm_high =3D upper_32_bits(now); - gf_timer->alarm_low =3D lower_32_bits(now); - gf_timer->irq_enabled =3D 1; - clocksource_register_hz(&goldfish_timer, NSEC_PER_SEC); } --=20 2.34.1