Skip to content

Commit 05d51e4

Browse files
viviergeertu
authored andcommitted
m68k: Introduce a virtual m68k machine
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]>
1 parent c92e7ef commit 05d51e4

File tree

19 files changed

+595
-17
lines changed

19 files changed

+595
-17
lines changed

arch/m68k/Kbuild

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ obj-$(CONFIG_M68060) += ifpsp060/
1717
obj-$(CONFIG_M68KFPU_EMU) += math-emu/
1818
obj-$(CONFIG_M68000) += 68000/
1919
obj-$(CONFIG_COLDFIRE) += coldfire/
20+
obj-$(CONFIG_VIRT) += virt/

arch/m68k/Kconfig.machine

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,23 @@ config SUN3
149149

150150
If you don't want to compile a kernel exclusively for a Sun 3, say N.
151151

152+
config VIRT
153+
bool "Virtual M68k Machine support"
154+
depends on MMU
155+
select GENERIC_CLOCKEVENTS
156+
select GOLDFISH
157+
select GOLDFISH_TIMER
158+
select GOLDFISH_TTY
159+
select M68040
160+
select MMU_MOTOROLA if MMU
161+
select RTC_CLASS
162+
select RTC_DRV_GOLDFISH
163+
select TTY
164+
select VIRTIO_MMIO
165+
help
166+
This options enable a pure virtual machine based on m68k,
167+
VIRTIO MMIO devices and GOLDFISH interfaces (TTY, RTC, PIC)
168+
152169
config PILOT
153170
bool
154171

arch/m68k/configs/virt_defconfig

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
CONFIG_LOCALVERSION="-virt"
2+
CONFIG_SYSVIPC=y
3+
CONFIG_CGROUPS=y
4+
CONFIG_BLK_CGROUP=y
5+
CONFIG_CGROUP_SCHED=y
6+
CONFIG_CGROUP_PIDS=y
7+
CONFIG_CGROUP_RDMA=y
8+
CONFIG_CGROUP_FREEZER=y
9+
CONFIG_CGROUP_DEVICE=y
10+
CONFIG_CGROUP_CPUACCT=y
11+
CONFIG_VIRT=y
12+
CONFIG_PROC_HARDWARE=y
13+
CONFIG_PARTITION_ADVANCED=y
14+
CONFIG_AMIGA_PARTITION=y
15+
CONFIG_ATARI_PARTITION=y
16+
CONFIG_MAC_PARTITION=y
17+
CONFIG_BSD_DISKLABEL=y
18+
CONFIG_MINIX_SUBPARTITION=y
19+
CONFIG_SOLARIS_X86_PARTITION=y
20+
CONFIG_UNIXWARE_DISKLABEL=y
21+
CONFIG_LDM_PARTITION=y
22+
CONFIG_LDM_DEBUG=y
23+
CONFIG_SUN_PARTITION=y
24+
CONFIG_SYSV68_PARTITION=y
25+
CONFIG_NET=y
26+
CONFIG_PACKET=y
27+
CONFIG_UNIX=y
28+
CONFIG_INET=y
29+
CONFIG_IP_PNP=y
30+
CONFIG_IP_PNP_DHCP=y
31+
CONFIG_IP_PNP_BOOTP=y
32+
CONFIG_CGROUP_NET_PRIO=y
33+
CONFIG_CGROUP_NET_CLASSID=y
34+
CONFIG_NET_9P=y
35+
CONFIG_NET_9P_VIRTIO=y
36+
CONFIG_DEVTMPFS=y
37+
CONFIG_BLK_DEV_LOOP=y
38+
CONFIG_BLK_DEV_RAM=y
39+
CONFIG_VIRTIO_BLK=y
40+
CONFIG_SCSI=y
41+
CONFIG_BLK_DEV_SR=y
42+
CONFIG_SCSI_VIRTIO=y
43+
CONFIG_NETDEVICES=y
44+
CONFIG_VIRTIO_NET=y
45+
CONFIG_INPUT_MOUSEDEV=y
46+
CONFIG_INPUT_EVDEV=y
47+
CONFIG_VIRTIO_CONSOLE=y
48+
CONFIG_HW_RANDOM_VIRTIO=y
49+
CONFIG_DRM=y
50+
CONFIG_DRM_VIRTIO_GPU=y
51+
CONFIG_FB=y
52+
CONFIG_SOUND=y
53+
CONFIG_SND=y
54+
CONFIG_SND_VIRTIO=y
55+
CONFIG_VIRT_DRIVERS=y
56+
CONFIG_VIRTIO_INPUT=y
57+
CONFIG_EXT4_FS=y
58+
CONFIG_AUTOFS_FS=y
59+
CONFIG_ISO9660_FS=y
60+
CONFIG_JOLIET=y
61+
CONFIG_ZISOFS=y
62+
CONFIG_UDF_FS=y
63+
CONFIG_TMPFS=y
64+
CONFIG_TMPFS_POSIX_ACL=y
65+
CONFIG_9P_FS=y
66+
CONFIG_9P_FS_POSIX_ACL=y
67+
CONFIG_9P_FS_SECURITY=y
68+
CONFIG_EARLY_PRINTK=y

arch/m68k/include/asm/config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ extern int mac_parse_bootinfo(const struct bi_record *record);
1717
extern int mvme147_parse_bootinfo(const struct bi_record *record);
1818
extern int mvme16x_parse_bootinfo(const struct bi_record *record);
1919
extern int q40_parse_bootinfo(const struct bi_record *record);
20+
extern int virt_parse_bootinfo(const struct bi_record *record);
2021

2122
extern void config_amiga(void);
2223
extern void config_apollo(void);
@@ -29,5 +30,6 @@ extern void config_mvme16x(void);
2930
extern void config_q40(void);
3031
extern void config_sun3(void);
3132
extern void config_sun3x(void);
33+
extern void config_virt(void);
3234

3335
#endif /* _M68K_CONFIG_H */

arch/m68k/include/asm/io.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
#include <asm/io_mm.h>
99
#endif
1010

11+
#define gf_ioread32 ioread32be
12+
#define gf_iowrite32 iowrite32be
13+
1114
#include <asm-generic/io.h>
1215

1316
#endif /* _M68K_IO_H */

arch/m68k/include/asm/irq.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
*/
1313
#if defined(CONFIG_COLDFIRE)
1414
#define NR_IRQS 256
15-
#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
15+
#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || \
16+
defined(CONFIG_SUN3X) || defined(CONFIG_VIRT)
1617
#define NR_IRQS 200
1718
#elif defined(CONFIG_ATARI)
1819
#define NR_IRQS 141

arch/m68k/include/asm/pgtable_mm.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@
8080
#elif defined(CONFIG_COLDFIRE)
8181
#define KMAP_START 0xe0000000
8282
#define KMAP_END 0xf0000000
83+
#elif defined(CONFIG_VIRT)
84+
#define KMAP_START 0xdf000000
85+
#define KMAP_END 0xff000000
8386
#else
8487
#define KMAP_START 0xd0000000
8588
#define KMAP_END 0xf0000000
@@ -92,6 +95,10 @@ extern unsigned long m68k_vmalloc_end;
9295
#elif defined(CONFIG_COLDFIRE)
9396
#define VMALLOC_START 0xd0000000
9497
#define VMALLOC_END 0xe0000000
98+
#elif defined(CONFIG_VIRT)
99+
#define VMALLOC_OFFSET PAGE_SIZE
100+
#define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
101+
#define VMALLOC_END KMAP_START
95102
#else
96103
/* Just any arbitrary offset to the start of the vmalloc VM area: the
97104
* current 8MB value just means that there will be a 8MB "hole" after the

arch/m68k/include/asm/setup.h

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ extern unsigned long m68k_machtype;
3737
#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
3838
|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
3939
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
40-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
40+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
41+
|| defined(CONFIG_VIRT)
4142
# define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
4243
#else
4344
# define MACH_AMIGA_ONLY
@@ -50,7 +51,8 @@ extern unsigned long m68k_machtype;
5051
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
5152
|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
5253
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
53-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
54+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
55+
|| defined(CONFIG_VIRT)
5456
# define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
5557
#else
5658
# define MACH_ATARI_ONLY
@@ -63,7 +65,8 @@ extern unsigned long m68k_machtype;
6365
#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
6466
|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
6567
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
66-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
68+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
69+
|| defined(CONFIG_VIRT)
6770
# define MACH_IS_MAC (m68k_machtype == MACH_MAC)
6871
#else
6972
# define MACH_MAC_ONLY
@@ -84,7 +87,8 @@ extern unsigned long m68k_machtype;
8487
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
8588
|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
8689
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
87-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
90+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
91+
|| defined(CONFIG_VIRT)
8892
# define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
8993
#else
9094
# define MACH_APOLLO_ONLY
@@ -97,7 +101,8 @@ extern unsigned long m68k_machtype;
97101
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
98102
|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
99103
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
100-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
104+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x) \
105+
|| defined(CONFIG_VIRT)
101106
# define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
102107
#else
103108
# define MACH_MVME147_ONLY
@@ -110,7 +115,8 @@ extern unsigned long m68k_machtype;
110115
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
111116
|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
112117
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
113-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
118+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
119+
|| defined(CONFIG_VIRT)
114120
# define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
115121
#else
116122
# define MACH_MVME16x_ONLY
@@ -123,7 +129,8 @@ extern unsigned long m68k_machtype;
123129
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
124130
|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
125131
|| defined(CONFIG_HP300) || defined(CONFIG_Q40) \
126-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
132+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
133+
|| defined(CONFIG_VIRT)
127134
# define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
128135
#else
129136
# define MACH_BVME6000_ONLY
@@ -136,7 +143,8 @@ extern unsigned long m68k_machtype;
136143
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
137144
|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
138145
|| defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
139-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
146+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
147+
|| defined(CONFIG_VIRT)
140148
# define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
141149
#else
142150
# define MACH_HP300_ONLY
@@ -149,7 +157,8 @@ extern unsigned long m68k_machtype;
149157
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
150158
|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
151159
|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
152-
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
160+
|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) \
161+
|| defined(CONFIG_VIRT)
153162
# define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
154163
#else
155164
# define MACH_Q40_ONLY
@@ -162,14 +171,29 @@ extern unsigned long m68k_machtype;
162171
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
163172
|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
164173
|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
165-
|| defined(CONFIG_Q40) || defined(CONFIG_MVME147)
174+
|| defined(CONFIG_Q40) || defined(CONFIG_MVME147) \
175+
|| defined(CONFIG_VIRT)
166176
# define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
167177
#else
168178
# define CONFIG_SUN3X_ONLY
169179
# define MACH_IS_SUN3X (1)
170180
# define MACH_TYPE (MACH_SUN3X)
171181
#endif
172182

183+
#if !defined(CONFIG_VIRT)
184+
# define MACH_IS_VIRT (0)
185+
#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
186+
|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
187+
|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
188+
|| defined(CONFIG_Q40) || defined(CONFIG_SUN3X) \
189+
|| defined(CONFIG_MVME147)
190+
# define MACH_IS_VIRT (m68k_machtype == MACH_VIRT)
191+
#else
192+
# define MACH_VIRT_ONLY
193+
# define MACH_IS_VIRT (1)
194+
# define MACH_TYPE (MACH_VIRT)
195+
#endif
196+
173197
#ifndef MACH_TYPE
174198
# define MACH_TYPE (m68k_machtype)
175199
#endif

arch/m68k/include/asm/virt.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
#ifndef __ASM_VIRT_H
3+
#define __ASM_VIRT_H
4+
5+
#define NUM_VIRT_SOURCES 200
6+
7+
struct virt_booter_device_data {
8+
u32 mmio;
9+
u32 irq;
10+
};
11+
12+
struct virt_booter_data {
13+
u32 qemu_version;
14+
struct virt_booter_device_data pic;
15+
struct virt_booter_device_data rtc;
16+
struct virt_booter_device_data tty;
17+
struct virt_booter_device_data ctrl;
18+
struct virt_booter_device_data virtio;
19+
};
20+
21+
extern struct virt_booter_data virt_bi_data;
22+
23+
extern void __init virt_init_IRQ(void);
24+
25+
#endif
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
/*
3+
* asm/bootinfo-virt.h -- Virtual-m68k-specific boot information definitions
4+
*/
5+
6+
#ifndef _UAPI_ASM_M68K_BOOTINFO_VIRT_H
7+
#define _UAPI_ASM_M68K_BOOTINFO_VIRT_H
8+
9+
#define BI_VIRT_QEMU_VERSION 0x8000
10+
#define BI_VIRT_GF_PIC_BASE 0x8001
11+
#define BI_VIRT_GF_RTC_BASE 0x8002
12+
#define BI_VIRT_GF_TTY_BASE 0x8003
13+
#define BI_VIRT_VIRTIO_BASE 0x8004
14+
#define BI_VIRT_CTRL_BASE 0x8005
15+
16+
#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0)
17+
18+
#endif /* _UAPI_ASM_M68K_BOOTINFO_MAC_H */

0 commit comments

Comments
 (0)