diff options
| author | Zeng Chi <zengchi@kylinos.cn> | 2026-09-21 18:24:42 +0800 |
|---|---|---|
| committer | Sean Christopherson <seanjc@google.com> | 2026-09-22 08:36:16 -0700 |
| commit | 119e9db233ad0f4cbd4cfb9f9385a7bca378b37d (patch) | |
| tree | 660d50d4139cb750fbde1ae3432452c20726c99d /drivers/zorro | |
| download | linux-stable-119e9db233ad0f4cbd4cfb9f9385a7bca378b37d.tar.gz linux-stable-119e9db233ad0f4cbd4cfb9f9385a7bca378b37d.zip | |
KVM: Don't pre-reserve xarray entries when storing empty/NULL attributesgrafted
Skip the xarray reservation loop when clearing all memory attributes, as
storing NULL only erases the entry and never needs to allocate, so no
reservation (and no cleanup of a failed one) is required in that case.
Suggested-by: Sean Christopherson <seanjc@google.com>
Cc: David Ballesteros <davimaba.v@proton.me>
Signed-off-by: Zeng Chi <zengchi@kylinos.cn>
Link: https://patch.msgid.link/20260921102442.1232375-1-zeng_chi911@163.com
[sean: split to separate patch]
Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to 'drivers/zorro')
| -rw-r--r-- | drivers/zorro/.gitignore | 3 | ||||
| -rw-r--r-- | drivers/zorro/Kconfig | 19 | ||||
| -rw-r--r-- | drivers/zorro/Makefile | 23 | ||||
| -rw-r--r-- | drivers/zorro/gen-devlist.c | 108 | ||||
| -rw-r--r-- | drivers/zorro/names.c | 99 | ||||
| -rw-r--r-- | drivers/zorro/proc.c | 129 | ||||
| -rw-r--r-- | drivers/zorro/zorro-driver.c | 171 | ||||
| -rw-r--r-- | drivers/zorro/zorro-sysfs.c | 124 | ||||
| -rw-r--r-- | drivers/zorro/zorro.c | 240 | ||||
| -rw-r--r-- | drivers/zorro/zorro.h | 16 | ||||
| -rw-r--r-- | drivers/zorro/zorro.ids | 474 |
11 files changed, 1406 insertions, 0 deletions
diff --git a/drivers/zorro/.gitignore b/drivers/zorro/.gitignore new file mode 100644 index 000000000..acd6ffb8d --- /dev/null +++ b/drivers/zorro/.gitignore @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only +devlist.h +gen-devlist diff --git a/drivers/zorro/Kconfig b/drivers/zorro/Kconfig new file mode 100644 index 000000000..41475ad46 --- /dev/null +++ b/drivers/zorro/Kconfig @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Zorro configuration +# +config ZORRO_NAMES + bool "Zorro device name database" + depends on ZORRO + help + By default, the kernel contains a database of all known Zorro device + names to make the information in /proc/iomem comprehensible to the + user. This database increases the size of the kernel image by about + 15KB, but it gets freed after the system boots up, so it doesn't + take up kernel memory. Anyway, if you are building an installation + floppy or kernel for an embedded system where kernel image size + really matters, you can disable this feature and you'll get device + ID numbers instead of names. + + When in doubt, say Y. + diff --git a/drivers/zorro/Makefile b/drivers/zorro/Makefile new file mode 100644 index 000000000..91ba82e63 --- /dev/null +++ b/drivers/zorro/Makefile @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the Zorro bus specific drivers. +# + +obj-$(CONFIG_ZORRO) += zorro.o zorro-driver.o zorro-sysfs.o +obj-$(CONFIG_PROC_FS) += proc.o +obj-$(CONFIG_ZORRO_NAMES) += names.o + +hostprogs := gen-devlist + +# Files generated that shall be removed upon make clean +clean-files := devlist.h + +# Dependencies on generated files need to be listed explicitly +$(obj)/names.o: $(obj)/devlist.h + +# And that's how to generate them +quiet_cmd_devlist = DEVLIST $@ + cmd_devlist = ( cd $(obj); ./gen-devlist ) < $< +$(obj)/devlist.h: $(src)/zorro.ids $(obj)/gen-devlist + $(call cmd,devlist) + diff --git a/drivers/zorro/gen-devlist.c b/drivers/zorro/gen-devlist.c new file mode 100644 index 000000000..e325c5ce9 --- /dev/null +++ b/drivers/zorro/gen-devlist.c @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Generate devlist.h from the Zorro ID file. + * + * (c) 2000 Geert Uytterhoeven <geert@linux-m68k.org> + * + * Based on the PCI version: + * + * (c) 1999--2000 Martin Mares <mj@ucw.cz> + */ + +#include <stdio.h> +#include <string.h> + +#define MAX_NAME_SIZE 63 + +static void +pq(FILE *f, const char *c) +{ + while (*c) { + if (*c == '"') + fprintf(f, "\\\""); + else + fputc(*c, f); + c++; + } +} + +int +main(void) +{ + char line[1024], *c, *bra, manuf[8]; + int manufs = 0; + int mode = 0; + int lino = 0; + int manuf_len = 0; + FILE *devf; + + devf = fopen("devlist.h", "w"); + if (!devf) { + fprintf(stderr, "Cannot create output file!\n"); + return 1; + } + + while (fgets(line, sizeof(line)-1, stdin)) { + lino++; + if ((c = strchr(line, '\n'))) + *c = 0; + if (!line[0] || line[0] == '#') + continue; + if (line[0] == '\t') { + switch (mode) { + case 1: + if (strlen(line) > 5 && line[5] == ' ') { + c = line + 5; + while (*c == ' ') + *c++ = 0; + if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) { + /* Too long, try cutting off long description */ + bra = strchr(c, '['); + if (bra && bra > c && bra[-1] == ' ') + bra[-1] = 0; + if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) { + fprintf(stderr, "Line %d: Product name too long\n", lino); + return 1; + } + } + fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1); + pq(devf, c); + fputs("\")\n", devf); + } else goto err; + break; + default: + goto err; + } + } else if (strlen(line) > 4 && line[4] == ' ') { + c = line + 4; + while (*c == ' ') + *c++ = 0; + if (manufs) + fputs("ENDMANUF()\n\n", devf); + manufs++; + strcpy(manuf, line); + manuf_len = strlen(c); + if (manuf_len + 24 > MAX_NAME_SIZE) { + fprintf(stderr, "Line %d: manufacturer name too long\n", lino); + return 1; + } + fprintf(devf, "MANUF(%s,\"", manuf); + pq(devf, c); + fputs("\")\n", devf); + mode = 1; + } else { + err: + fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line); + return 1; + } + } + fputs("ENDMANUF()\n\ +\n\ +#undef MANUF\n\ +#undef PRODUCT\n\ +#undef ENDMANUF\n", devf); + + fclose(devf); + + return 0; +} diff --git a/drivers/zorro/names.c b/drivers/zorro/names.c new file mode 100644 index 000000000..b44f90989 --- /dev/null +++ b/drivers/zorro/names.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zorro Device Name Tables + * + * Copyright (C) 1999--2000 Geert Uytterhoeven + * + * Based on the PCI version: + * + * Copyright 1992--1999 Drew Eckhardt, Frederic Potter, + * David Mosberger-Tang, Martin Mares + */ + +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/zorro.h> + +#include "zorro.h" + +struct zorro_prod_info { + __u16 prod; + unsigned short seen; + const char *name; +}; + +struct zorro_manuf_info { + __u16 manuf; + unsigned short nr; + const char *name; + struct zorro_prod_info *prods; +}; + +/* + * This is ridiculous, but we want the strings in + * the .init section so that they don't take up + * real memory.. Parse the same file multiple times + * to get all the info. + */ +#define MANUF(manuf, name) static char __manufstr_##manuf[] __initdata = name; +#define ENDMANUF() +#define PRODUCT(manuf, prod, name) static char __prodstr_##manuf##prod[] __initdata = name; +#include "devlist.h" + + +#define MANUF(manuf, name) static struct zorro_prod_info __prods_##manuf[] __initdata = { +#define ENDMANUF() }; +#define PRODUCT(manuf, prod, name) { 0x##prod, 0, __prodstr_##manuf##prod }, +#include "devlist.h" + +static struct zorro_manuf_info __initdata zorro_manuf_list[] = { +#define MANUF(manuf, name) { 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf }, +#define ENDMANUF() +#define PRODUCT(manuf, prod, name) +#include "devlist.h" +}; + +#define MANUFS ARRAY_SIZE(zorro_manuf_list) + +void __init zorro_name_device(struct zorro_dev *dev) +{ + const struct zorro_manuf_info *manuf_p = zorro_manuf_list; + int i = MANUFS; + char *name = dev->name; + + do { + if (manuf_p->manuf == ZORRO_MANUF(dev->id)) + goto match_manuf; + manuf_p++; + } while (--i); + + /* Couldn't find either the manufacturer nor the product */ + return; + + match_manuf: { + struct zorro_prod_info *prod_p = manuf_p->prods; + int i = manuf_p->nr; + + while (i > 0) { + if (prod_p->prod == + ((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id))) + goto match_prod; + prod_p++; + i--; + } + + /* Ok, found the manufacturer, but unknown product */ + sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name); + return; + + /* Full match */ + match_prod: { + char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name); + int nr = prod_p->seen + 1; + prod_p->seen = nr; + if (nr > 1) + sprintf(n, " (#%d)", nr); + } + } +} diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c new file mode 100644 index 000000000..f916bf60b --- /dev/null +++ b/drivers/zorro/proc.c @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Procfs interface for the Zorro bus. + * + * Copyright (C) 1998-2003 Geert Uytterhoeven + * + * Heavily based on the procfs interface for the PCI bus, which is + * + * Copyright (C) 1997, 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz> + */ + +#include <linux/types.h> +#include <linux/zorro.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/init.h> +#include <linux/export.h> + +#include <asm/byteorder.h> +#include <linux/uaccess.h> +#include <asm/amigahw.h> +#include <asm/setup.h> + +static loff_t +proc_bus_zorro_lseek(struct file *file, loff_t off, int whence) +{ + return fixed_size_llseek(file, off, whence, sizeof(struct ConfigDev)); +} + +static ssize_t +proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) +{ + struct zorro_dev *z = pde_data(file_inode(file)); + struct ConfigDev cd; + loff_t pos = *ppos; + + if (pos >= sizeof(struct ConfigDev)) + return 0; + if (nbytes >= sizeof(struct ConfigDev)) + nbytes = sizeof(struct ConfigDev); + if (pos + nbytes > sizeof(struct ConfigDev)) + nbytes = sizeof(struct ConfigDev) - pos; + + /* Construct a ConfigDev */ + memset(&cd, 0, sizeof(cd)); + cd.cd_Rom = z->rom; + cd.cd_SlotAddr = cpu_to_be16(z->slotaddr); + cd.cd_SlotSize = cpu_to_be16(z->slotsize); + cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z)); + cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z)); + + if (copy_to_user(buf, (void *)&cd + pos, nbytes)) + return -EFAULT; + *ppos += nbytes; + + return nbytes; +} + +static const struct proc_ops bus_zorro_proc_ops = { + .proc_lseek = proc_bus_zorro_lseek, + .proc_read = proc_bus_zorro_read, +}; + +static void * zorro_seq_start(struct seq_file *m, loff_t *pos) +{ + return (*pos < zorro_num_autocon) ? pos : NULL; +} + +static void * zorro_seq_next(struct seq_file *m, void *v, loff_t *pos) +{ + (*pos)++; + return (*pos < zorro_num_autocon) ? pos : NULL; +} + +static void zorro_seq_stop(struct seq_file *m, void *v) +{ +} + +static int zorro_seq_show(struct seq_file *m, void *v) +{ + unsigned int slot = *(loff_t *)v; + struct zorro_dev *z = &zorro_autocon[slot]; + + seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, + (unsigned long)zorro_resource_start(z), + (unsigned long)zorro_resource_len(z), + z->rom.er_Type); + return 0; +} + +static const struct seq_operations zorro_devices_seq_ops = { + .start = zorro_seq_start, + .next = zorro_seq_next, + .stop = zorro_seq_stop, + .show = zorro_seq_show, +}; + +static struct proc_dir_entry *proc_bus_zorro_dir; + +static int __init zorro_proc_attach_device(unsigned int slot) +{ + struct proc_dir_entry *entry; + char name[4]; + + sprintf(name, "%02x", slot); + entry = proc_create_data(name, 0, proc_bus_zorro_dir, + &bus_zorro_proc_ops, + &zorro_autocon[slot]); + if (!entry) + return -ENOMEM; + proc_set_size(entry, sizeof(struct zorro_dev)); + return 0; +} + +static int __init zorro_proc_init(void) +{ + unsigned int slot; + + if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { + proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); + proc_create_seq("devices", 0, proc_bus_zorro_dir, + &zorro_devices_seq_ops); + for (slot = 0; slot < zorro_num_autocon; slot++) + zorro_proc_attach_device(slot); + } + return 0; +} + +device_initcall(zorro_proc_init); diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c new file mode 100644 index 000000000..e7d3af1a2 --- /dev/null +++ b/drivers/zorro/zorro-driver.c @@ -0,0 +1,171 @@ +/* + * Zorro Driver Services + * + * Copyright (C) 2003 Geert Uytterhoeven + * + * Loosely based on drivers/pci/pci-driver.c + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/zorro.h> + +#include "zorro.h" + + + /** + * zorro_match_device - Tell if a Zorro device structure has a matching + * Zorro device id structure + * @ids: array of Zorro device id structures to search in + * @dev: the Zorro device structure to match against + * + * Used by a driver to check whether a Zorro device present in the + * system is in its list of supported devices. Returns the matching + * zorro_device_id structure or %NULL if there is no match. + */ + +static const struct zorro_device_id * +zorro_match_device(const struct zorro_device_id *ids, + const struct zorro_dev *z) +{ + while (ids->id) { + if (ids->id == ZORRO_WILDCARD || ids->id == z->id) + return ids; + ids++; + } + return NULL; +} + + +static int zorro_device_probe(struct device *dev) +{ + int error = 0; + struct zorro_driver *drv = to_zorro_driver(dev->driver); + struct zorro_dev *z = to_zorro_dev(dev); + + if (drv->probe) { + const struct zorro_device_id *id; + + id = zorro_match_device(drv->id_table, z); + if (id) + error = drv->probe(z, id); + if (error >= 0) + error = 0; + } + return error; +} + + +static void zorro_device_remove(struct device *dev) +{ + struct zorro_dev *z = to_zorro_dev(dev); + struct zorro_driver *drv = to_zorro_driver(dev->driver); + + if (drv->remove) + drv->remove(z); +} + + + /** + * zorro_register_driver - register a new Zorro driver + * @drv: the driver structure to register + * + * Adds the driver structure to the list of registered drivers + * Returns zero or a negative error value. + */ + +int zorro_register_driver(struct zorro_driver *drv) +{ + /* initialize common driver fields */ + drv->driver.name = drv->name; + drv->driver.bus = &zorro_bus_type; + + /* register with core */ + return driver_register(&drv->driver); +} +EXPORT_SYMBOL(zorro_register_driver); + + + /** + * zorro_unregister_driver - unregister a zorro driver + * @drv: the driver structure to unregister + * + * Deletes the driver structure from the list of registered Zorro drivers, + * gives it a chance to clean up by calling its remove() function for + * each device it was responsible for, and marks those devices as + * driverless. + */ + +void zorro_unregister_driver(struct zorro_driver *drv) +{ + driver_unregister(&drv->driver); +} +EXPORT_SYMBOL(zorro_unregister_driver); + + + /** + * zorro_bus_match - Tell if a Zorro device structure has a matching Zorro + * device id structure + * @ids: array of Zorro device id structures to search in + * @dev: the Zorro device structure to match against + * + * Used by the driver core to check whether a Zorro device present in the + * system is in a driver's list of supported devices. Returns 1 if + * supported, and 0 if there is no match. + */ + +static int zorro_bus_match(struct device *dev, const struct device_driver *drv) +{ + struct zorro_dev *z = to_zorro_dev(dev); + const struct zorro_driver *zorro_drv = to_zorro_driver(drv); + const struct zorro_device_id *ids = zorro_drv->id_table; + + if (!ids) + return 0; + + return !!zorro_match_device(ids, z); +} + +static int zorro_uevent(const struct device *dev, struct kobj_uevent_env *env) +{ + const struct zorro_dev *z; + + if (!dev) + return -ENODEV; + + z = to_zorro_dev(dev); + if (!z) + return -ENODEV; + + if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) || + add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) || + add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) || + add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id)) + return -ENOMEM; + + return 0; +} + +const struct bus_type zorro_bus_type = { + .name = "zorro", + .dev_name = "zorro", + .dev_groups = zorro_device_attribute_groups, + .match = zorro_bus_match, + .uevent = zorro_uevent, + .probe = zorro_device_probe, + .remove = zorro_device_remove, +}; +EXPORT_SYMBOL(zorro_bus_type); + + +static int __init zorro_driver_init(void) +{ + return bus_register(&zorro_bus_type); +} + +postcore_initcall(zorro_driver_init); + diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c new file mode 100644 index 000000000..9989240fb --- /dev/null +++ b/drivers/zorro/zorro-sysfs.c @@ -0,0 +1,124 @@ +/* + * File Attributes for Zorro Devices + * + * Copyright (C) 2003 Geert Uytterhoeven + * + * Loosely based on drivers/pci/pci-sysfs.c + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + + +#include <linux/kernel.h> +#include <linux/zorro.h> +#include <linux/stat.h> +#include <linux/string.h> +#include <linux/sysfs.h> + +#include <asm/byteorder.h> + +#include "zorro.h" + + +/* show configuration fields */ +#define zorro_config_attr(name, field, format_string) \ +static ssize_t name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct zorro_dev *z; \ + \ + z = to_zorro_dev(dev); \ + return sysfs_emit(buf, format_string, z->field); \ +} \ +static DEVICE_ATTR_RO(name); + +zorro_config_attr(id, id, "0x%08x\n"); +zorro_config_attr(type, rom.er_Type, "0x%02x\n"); +zorro_config_attr(slotaddr, slotaddr, "0x%04x\n"); +zorro_config_attr(slotsize, slotsize, "0x%04x\n"); + +static ssize_t serial_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct zorro_dev *z; + + z = to_zorro_dev(dev); + return sysfs_emit(buf, "0x%08x\n", be32_to_cpu(z->rom.er_SerialNumber)); +} +static DEVICE_ATTR_RO(serial); + +static ssize_t resource_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct zorro_dev *z = to_zorro_dev(dev); + + return sysfs_emit(buf, "0x%08lx 0x%08lx 0x%08lx\n", + (unsigned long)zorro_resource_start(z), + (unsigned long)zorro_resource_end(z), + zorro_resource_flags(z)); +} +static DEVICE_ATTR_RO(resource); + +static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct zorro_dev *z = to_zorro_dev(dev); + + return sysfs_emit(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id); +} +static DEVICE_ATTR_RO(modalias); + +static struct attribute *zorro_device_attrs[] = { + &dev_attr_id.attr, + &dev_attr_type.attr, + &dev_attr_serial.attr, + &dev_attr_slotaddr.attr, + &dev_attr_slotsize.attr, + &dev_attr_resource.attr, + &dev_attr_modalias.attr, + NULL +}; + +static ssize_t zorro_read_config(struct file *filp, struct kobject *kobj, + const struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct zorro_dev *z = to_zorro_dev(kobj_to_dev(kobj)); + struct ConfigDev cd; + + /* Construct a ConfigDev */ + memset(&cd, 0, sizeof(cd)); + cd.cd_Rom = z->rom; + cd.cd_SlotAddr = cpu_to_be16(z->slotaddr); + cd.cd_SlotSize = cpu_to_be16(z->slotsize); + cd.cd_BoardAddr = cpu_to_be32(zorro_resource_start(z)); + cd.cd_BoardSize = cpu_to_be32(zorro_resource_len(z)); + + return memory_read_from_buffer(buf, count, &off, &cd, sizeof(cd)); +} + +static const struct bin_attribute zorro_config_attr = { + .attr = { + .name = "config", + .mode = S_IRUGO, + }, + .size = sizeof(struct ConfigDev), + .read = zorro_read_config, +}; + +static const struct bin_attribute *const zorro_device_bin_attrs[] = { + &zorro_config_attr, + NULL +}; + +static const struct attribute_group zorro_device_attr_group = { + .attrs = zorro_device_attrs, + .bin_attrs = zorro_device_bin_attrs, +}; + +const struct attribute_group *zorro_device_attribute_groups[] = { + &zorro_device_attr_group, + NULL +}; diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c new file mode 100644 index 000000000..45495c423 --- /dev/null +++ b/drivers/zorro/zorro.c @@ -0,0 +1,240 @@ +/* + * Zorro Bus Services + * + * Copyright (C) 1995-2003 Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#include <linux/module.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/zorro.h> +#include <linux/bitops.h> +#include <linux/string.h> +#include <linux/platform_device.h> +#include <linux/dma-mapping.h> +#include <linux/slab.h> +#include <linux/string_choices.h> + +#include <asm/byteorder.h> +#include <asm/setup.h> +#include <asm/amigahw.h> + +#include "zorro.h" + + + /* + * Zorro Expansion Devices + */ + +unsigned int zorro_num_autocon; +struct zorro_dev_init zorro_autocon_init[ZORRO_NUM_AUTO] __initdata; +struct zorro_dev *zorro_autocon; + + + /* + * Zorro bus + */ + +struct zorro_bus { + struct device dev; + struct zorro_dev devices[]; +}; + + + /* + * Find Zorro Devices + */ + +struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) +{ + struct zorro_dev *z; + + if (!zorro_num_autocon) + return NULL; + + for (z = from ? from+1 : &zorro_autocon[0]; + z < zorro_autocon+zorro_num_autocon; + z++) + if (id == ZORRO_WILDCARD || id == z->id) + return z; + return NULL; +} +EXPORT_SYMBOL(zorro_find_device); + + + /* + * Bitmask indicating portions of available Zorro II RAM that are unused + * by the system. Every bit represents a 64K chunk, for a maximum of 8MB + * (128 chunks, physical 0x00200000-0x009fffff). + * + * If you want to use (= allocate) portions of this RAM, you should clear + * the corresponding bits. + * + * Possible uses: + * - z2ram device + * - SCSI DMA bounce buffers + * + * FIXME: use the normal resource management + */ + +DECLARE_BITMAP(zorro_unused_z2ram, 128); +EXPORT_SYMBOL(zorro_unused_z2ram); + + +static void __init mark_region(unsigned long start, unsigned long end, + int flag) +{ + if (flag) + start += Z2RAM_CHUNKMASK; + else + end += Z2RAM_CHUNKMASK; + start &= ~Z2RAM_CHUNKMASK; + end &= ~Z2RAM_CHUNKMASK; + + if (end <= Z2RAM_START || start >= Z2RAM_END) + return; + start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; + end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; + while (start < end) { + u32 chunk = start>>Z2RAM_CHUNKSHIFT; + + if (flag) + set_bit(chunk, zorro_unused_z2ram); + else + clear_bit(chunk, zorro_unused_z2ram); + start += Z2RAM_CHUNKSIZE; + } +} + + +static struct resource __init *zorro_find_parent_resource( + struct platform_device *bridge, struct zorro_dev *z) +{ + int i; + + for (i = 0; i < bridge->num_resources; i++) { + if (resource_contains(&bridge->resource[i], &z->resource)) + return &bridge->resource[i]; + } + + return &iomem_resource; +} + +static int __init amiga_zorro_probe(struct platform_device *pdev) +{ + struct zorro_bus *bus; + struct zorro_dev_init *zi; + struct zorro_dev *z; + struct resource *r; + unsigned int i; + int error; + + /* Initialize the Zorro bus */ + bus = kzalloc_flex(*bus, devices, zorro_num_autocon); + if (!bus) + return -ENOMEM; + + zorro_autocon = bus->devices; + bus->dev.parent = &pdev->dev; + dev_set_name(&bus->dev, zorro_bus_type.name); + error = device_register(&bus->dev); + if (error) { + pr_err("Zorro: Error registering zorro_bus\n"); + put_device(&bus->dev); + kfree(bus); + return error; + } + platform_set_drvdata(pdev, bus); + + pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n", + zorro_num_autocon, str_plural(zorro_num_autocon)); + + /* First identify all devices ... */ + for (i = 0; i < zorro_num_autocon; i++) { + zi = &zorro_autocon_init[i]; + z = &zorro_autocon[i]; + + z->rom = zi->rom; + z->id = (be16_to_cpu(z->rom.er_Manufacturer) << 16) | + (z->rom.er_Product << 8); + if (z->id == ZORRO_PROD_GVP_EPC_BASE) { + /* GVP quirk */ + unsigned long magic = zi->boardaddr + 0x8000; + + z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; + } + z->slotaddr = zi->slotaddr; + z->slotsize = zi->slotsize; + sprintf(z->name, "Zorro device %08x", z->id); + zorro_name_device(z); + z->resource = DEFINE_RES_MEM_NAMED(zi->boardaddr, zi->boardsize, z->name); + r = zorro_find_parent_resource(pdev, z); + error = request_resource(r, &z->resource); + if (error && !(z->rom.er_Type & ERTF_MEMLIST)) + dev_err(&bus->dev, + "Address space collision on device %s %pR\n", + z->name, &z->resource); + z->dev.parent = &bus->dev; + z->dev.bus = &zorro_bus_type; + z->dev.id = i; + switch (z->rom.er_Type & ERT_TYPEMASK) { + case ERT_ZORROIII: + z->dev.coherent_dma_mask = DMA_BIT_MASK(32); + break; + + case ERT_ZORROII: + default: + z->dev.coherent_dma_mask = DMA_BIT_MASK(24); + break; + } + z->dev.dma_mask = &z->dev.coherent_dma_mask; + } + + /* ... then register them */ + for (i = 0; i < zorro_num_autocon; i++) { + z = &zorro_autocon[i]; + error = device_register(&z->dev); + if (error) { + dev_err(&bus->dev, "Error registering device %s\n", + z->name); + put_device(&z->dev); + continue; + } + } + + /* Mark all available Zorro II memory */ + zorro_for_each_dev(z) { + if (z->rom.er_Type & ERTF_MEMLIST) + mark_region(zorro_resource_start(z), + zorro_resource_end(z)+1, 1); + } + + /* Unmark all used Zorro II memory */ + for (i = 0; i < m68k_num_memory; i++) + if (m68k_memory[i].addr < 16*1024*1024) + mark_region(m68k_memory[i].addr, + m68k_memory[i].addr+m68k_memory[i].size, + 0); + + return 0; +} + +static struct platform_driver amiga_zorro_driver = { + .driver = { + .name = "amiga-zorro", + }, +}; + +static int __init amiga_zorro_init(void) +{ + return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe); +} + +module_init(amiga_zorro_init); + +MODULE_LICENSE("GPL"); diff --git a/drivers/zorro/zorro.h b/drivers/zorro/zorro.h new file mode 100644 index 000000000..df44e3520 --- /dev/null +++ b/drivers/zorro/zorro.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + + /* + * Zorro bus + */ + +extern const struct bus_type zorro_bus_type; + + +#ifdef CONFIG_ZORRO_NAMES +extern void zorro_name_device(struct zorro_dev *z); +#else +static inline void zorro_name_device(struct zorro_dev *dev) { } +#endif + +extern const struct attribute_group *zorro_device_attribute_groups[]; diff --git a/drivers/zorro/zorro.ids b/drivers/zorro/zorro.ids new file mode 100644 index 000000000..119abea8c --- /dev/null +++ b/drivers/zorro/zorro.ids @@ -0,0 +1,474 @@ +# +# List of Zorro IDs +# +# Maintained by Geert Uytterhoeven <zorro@linux-m68k.org> +# If you have any new entries, please send them to the maintainer. +# + +# Manufacturers and Products. Please keep sorted. + +# Syntax: +# manufacturer manufacturer_name +# product product_name <-- single tab + +00d3 Pacific Peripherals + 0000 SE 2000 A500 [HD Controller] + 0a00 [SCSI Host Adapter] +00dd Kupke + 0000 Golem RAM Box 2MB [RAM Expansion] +0100 MacroSystems USA +# The Stormbringer is actually made by Memphis + 0000 Stormbringer [Accelerator] + 1300 Warp Engine [Accelerator, SCSI Host Adapter and RAM Expansion] +0200 3-State + 0200 Megamix 2000 [RAM Expansion] +0201 Commodore Braunschweig + 0100 A2088 XT/A2286 AT [ISA Bus Bridge] + 0200 A2286 AT [ISA Bus Bridge] + 5400 A4091 [SCSI Host Adapter] + 6700 A2386-SX [ISA Bus Bridge] +0202 Commodore West Chester + 0100 A2090/A2090A [SCSI Host Adapter] + 0200 A590/A2091 [SCSI Host Adapter] + 0300 A590/A2091 [SCSI Host Adapter] + 0400 A2090B 2090 Autoboot [SCSI Host Adapter] + 0900 A2060 [ArcNet Card] + 0a00 A590/A2052/A2058/A2091 [RAM Expansion] + 2000 A560 [RAM Expansion] + 4500 A2232 Prototype [Multi I/O] + 4600 A2232 [Multi I/O] + 5000 A2620 68020 [Accelerator and RAM Expansion] + 5100 A2630 68030 [Accelerator and RAM Expansion] + 5400 A4091 [SCSI Host Adapter] + 5a00 A2065 [Ethernet Card] + 6000 Romulator Card + 6100 A3000 Test Fixture [Miscellaneous Expansion Card] + 6700 A2386-SX [ISA Bus Bridge] + 7000 A2065 [Ethernet Card] +0203 Commodore West Chester + 0300 A2090/A2090A Combitec/MacroSystem [SCSI Host Adapter] +02f4 Progressive Peripherals & Systems + 0200 EXP8000 [RAM Expansion] + 6900 A2000 68040 [Accelerator] + 9600 68040 [Accelerator] +02ff Kolff Computer Supplies + 0000 KCS Power PC [ISA Bus Bridge] +03ec Cardco Ltd. + 0400 Kronos 2000 [SCSI Host Adapter] + 0c00 A1000 [SCSI Host Adapter] + 0e00 Escort [SCSI Host Adapter] + f500 A2410 HiRes [Graphics Card] +03ed A-Squared + 0100 Live! 2000 [Video Card] +03ee Comspec Communications + 0100 AX2000 [RAM Expansion] +03f1 Anakin Research + 0100 Easyl Drawing Tablet Interface +03f2 Microbotics + 0000 StarBoard II [RAM Expansion] + 0200 StarDrive [SCSI Host Adapter] + 0300 8-Up (Rev A) [RAM Expansion] + 0400 8-Up (Rev Z) [RAM Expansion] + 2000 Delta [RAM Expansion] + 4000 8-Star [RAM Expansion] + 4100 8-Star [Miscellaneous Expansion Card] + 4400 VXL RAM*32 [RAM Expansion] + 4500 VXL-30 [Accelerator] + 6000 Delta [Miscellaneous Expansion Card] + 8100 MBX 1200/1200z [RAM Expansion] + 9600 Hardframe 2000 [SCSI Host Adapter] + 9e00 Hardframe 2000 [SCSI Host Adapter] + c100 MBX 1200/1200z [Miscellaneous Expansion Card] +03f4 Access Associates Alegra +03f6 Expansion Technologies/Pacific Cypress +03ff ASDG + 0100 [RAM Expansion] + 0200 [RAM Expansion] + fe00 EB-920 Lan Rover [Ethernet Card] + ff00 GPIB/Dual IEEE-488/Twin-X [Multi I/O] +0404 Ronin/Imtronics + 3900 Hurricane 2800 [Accelerator and RAM Expansion] + 5700 Hurricane 2800 [Accelerator and RAM Expansion] +0406 Commodore/University of Lowell + 0000 A2410 HiRes [Graphics Card] +041d Ameristar + 0100 A2065 [Ethernet Card] + 0900 A560 [ArcNet Card] + 0a00 A4066 [Ethernet Card] + 2000 1600-GX [Graphics Card] +0420 Supra + 0100 SupraDrive 4x4 [SCSI Host Adapter] + 0200 1000 [RAM Expansion] + 0300 2000 DMA [SCSI Host Adapter] + 0500 500 [SCSI Host Adapter and RAM Expansion] + 0800 500 [SCSI Host Adapter] + 0900 500XP/2000 [RAM Expansion] + 0a00 500RX/2000 [RAM Expansion] + 0b00 2400zi [Modem] + 0c00 500XP/SupraDrive WordSync [SCSI Host Adapter] + 0d00 SupraDrive WordSync II [SCSI Host Adapter] + 1000 2400zi+ [Modem] +0422 Computer Systems Associates + 1100 Magnum 40 [Accelerator and SCSI Host Adapter] + 1500 12 Gauge [SCSI Host Adapter] +0439 Marc Michael Groth +0502 M-Tech + 0300 AT500 [RAM Expansion] +06e1 Great Valley Products + 0800 Impact Series I [SCSI Host Adapter and RAM Expansion] + 2000 Impact Vision 24 [Graphics Card] +07da ByteBox + 0000 A500 +07db Hacker Test Board +07dc DKB/Power Computing + 0900 SecureKey + 0e00 DKM 3128 [RAM Expansion] + 0f00 Rapid Fire [SCSI Host Adapter] + 1000 DKM 1202 [FPU and RAM Expansion] + 1200 Cobra/Viper II 68EC030 [Accelerator] + 1700 WildFire 060 [Accelerator] + ff00 WildFire 060 [Accelerator] +07e1 Great Valley Products + 0100 Impact Series I (4K) [SCSI Host Adapter] + 0200 Impact Series I (16K/2) [SCSI Host Adapter] + 0300 Impact Series I (16K/2) [SCSI Host Adapter] + 0800 Impact 3001 [IDE Interface] + 0900 Impact 3001 [RAM Expansion] + 0a00 Impact Series II [RAM Expansion] + 0b20 GForce 040 [Accelerator] + 0b30 GForce 040 [Accelerator and SCSI Host Adapter] + 0b40 A1291 [SCSI Host Adapter] + 0b60 Combo 030 R4 [Accelerator] + 0b70 Combo 030 R4 [Accelerator and SCSI Host Adapter] + 0b78 Phone Pak + 0b98 IO-Extender [Multi I/O] + 0ba0 GForce 030 [Accelerator] + 0bb0 GForce 030 [Accelerator and SCSI Host Adapter] + 0bc0 A530 [Accelerator] + 0bd0 A530 [Accelerator and SCSI Host Adapter] + 0be0 Combo 030 R3 [Accelerator] + 0bf0 Combo 030 R3 [Accelerator and SCSI Host Adapter] + 0bf8 Series-II [SCSI Host Adapter] + 0d00 Impact 3001 [IDE Interface] + 1600 GForce 040/060 [Accelerator and SCSI Host Adapter] + 2000 Impact Vision 24 [Graphics Card] + 4400 Rembrandt [Graphics Card] + ff00 GForce 040 [Accelerator] +07e5 California Access/Synergy + 0100 Malibu [SCSI Host Adapter] +07e6 Xetec + 0100 FastCard [SCSI Host Adapter] + 0200 FastCard [RAM Expansion] + 0300 FastCard Plus [SCSI Host Adapter] +07ea Progressive Peripherals & Systems + 0000 Mercury [Accelerator] + 0100 A3000 68040 [Accelerator] + 6900 A2000 68040 [Accelerator] + 9600 Zeus [Accelerator, SCSI Host Adapter and RAM Expansion] + bb00 A500 68040 [Accelerator] +# The AteoBus and Pixel64 are actually made by Ateo Concepts + fc00 AteoBus [Expansion Bus Bridge] + fe00 Pixel64 [Graphics Card] + ff00 Pixel64 RAM [Graphics Card] +07ec Xebec +07f2 Spirit Technology + 0100 Insider IN1000 [RAM Expansion] + 0200 Insider IN500 [RAM Expansion] + 0300 SIN500 [RAM Expansion] + 0400 HDA 506 [HD Controller] + 0500 AX-S [Miscellaneous Expansion Card] + 0600 OctaByte [RAM Expansion] + 0800 Inmate [SCSI Host Adapter and RAM Expansion] +07f3 Spirit Technology +07fe BSC/Alfadata + 0300 ALF 3 [SCSI Host Adapter] +0801 BSC/Alfadata + 0100 ALF 2 [SCSI Host Adapter] + 0200 ALF 2 [SCSI Host Adapter] + 0300 ALF 3 [SCSI Host Adapter] + 0400 Oktagon 500 [SCSI Host Adapter] + 0600 Tandem AT-2008/508 [IDE Interface] + 0800 Oktagon 2008 [RAM Expansion] + 1000 MultiFace I [Multi I/O] + 2000 FrameMaster II [Graphics Card] + 4000 ISDN MasterCard [ISDN Interface] +0802 Cardco Ltd. + 0400 Kronos 2000 [SCSI Host Adapter] + 0c00 A1000 [SCSI Host Adapter] +0804 Jochheim + 0100 [RAM Expansion] + 2000 [RAM Expansion] +0807 Checkpoint Technologies + 0000 Serial Solution [Multi Serial] +0810 Edotronik + 0100 IEEE-488 Interface Card + 0200 CBM-8032 Card + 0300 [Multi Serial] + 0400 24Bit Realtime Video Digitizer + 0500 32Bit Parallel I/O Interface + 0600 PIC Prototyping Card + 0700 16 Channel ADC Interface + 0800 VME-Bus Controller + 0900 DSP96000 Realtime Data Acquisition DSP Card +0813 NES Inc. + 0000 [RAM Expansion] +0817 ICD + 0100 Advantage 2000 [SCSI Host Adapter] + 0300 Advantage [IDE Interface] + 0400 Advantage 2080 [RAM Expansion] +0819 Kupke + 0100 Omti [HD Controller] + 0200 Golem SCSI-II [SCSI Host Adapter] + 0300 Golem Box + 0400 030/882 [Accelerator] + 0500 Golem [SCSI Host Adapter] +081d Great Valley Products + 0900 A2000-RAM8/2 [Miscellaneous Expansion Card] + 0a00 Impact Series II [RAM Expansion] +081e Interworks Network +0820 Hardital Synthesis + 0100 Super Big Bang [Accelerator, SCSI Host Adapter and RAM Expansion] + 1400 TQM 68030+68882 [Accelerator] +0828 Applied Engineering + 1000 DL2000 [Modem] + e000 RAM Works [RAM Expansion] +082c BSC/Alfadata + 0400 Oktagon 500 [SCSI Host Adapter] + 0500 Oktagon 2008 [SCSI Host Adapter] + 0600 Tandem AT-2008/508 [IDE Interface] + 0700 Alpha 1200 [RAM Expansion] + 0800 Oktagon 2008 [RAM Expansion] + 1000 MultiFace I [Multi I/O] + 1100 MultiFace II [Multi I/O] + 1200 MultiFace III [Multi I/O] + 2000 FrameMaster II [Graphics Card] + 2100 Graffiti RAM [Graphics Card] + 2200 Graffiti [Graphics Card] + 4000 ISDN MasterCard [ISDN Interface] + 4100 ISDN MasterCard II [ISDN Interface] +0835 Phoenix + 2100 ST506 [HD Controller] + 2200 [SCSI Host Adapter] + be00 [RAM Expansion] +0836 Advanced Storage Systems + 0100 Nexus [SCSI Host Adapter] + 0800 Nexus [RAM Expansion] +0838 Impulse + 0000 FireCracker 24 (NTSC) [Graphics Card] + 0100 FireCracker 24 (PAL) [Graphics Card] +0840 IVS + 0200 GrandSlam PIC 2 [RAM Expansion] + 0400 GrandSlam PIC 1 [RAM Expansion] + 1000 OverDrive [HD Controller] + 3000 TrumpCard Classic [SCSI Host Adapter] + 3400 TrumpCard Pro/GrandSlam [SCSI Host Adapter] + 4000 Meta-4 [RAM Expansion] + bf00 Wavetools [Audio Card] + f300 Vector [SCSI Host Adapter] + f400 Vector [SCSI Host Adapter] +0841 Vector + e300 Connection [Multi I/O] +0845 XPert ProDev + 0100 Visiona RAM [Graphics Card] + 0200 Visiona [Graphics Card] + 0300 Merlin RAM [Graphics Card] + 0400 Merlin [Graphics Card] + c900 Merlin [Graphics Card] +0849 Hydra Systems + 0100 Amiganet [Ethernet Card] +084f Sunrize Industries + 0100 AD1012 [Audio Card] + 0200 AD516 [Audio Card] + 0300 DD512 [Audio Card] +0850 Triceratops + 0100 [Multi I/O] +0851 Applied Magic Inc. + 0100 DMI Resolver [Graphics Card] + 0200 Vivid 24 [Graphics Card] + 0600 Digital Broadcaster [Video Card] +085e GFX-Base + 0000 GDA-1 VRAM [Graphics Card] + 0100 GDA-1 [Graphics Card] +0860 RocTec + 0100 RH 800C [HD Controller] + 0200 RH 800C [RAM Expansion] +0861 Kato +# The Rainbow II and III are actually made by Ingenieurbüro Helfrich + 2000 Rainbow II [Graphics Card] + 2100 Rainbow III [Graphics Card] + 8000 Melody MPEG [Audio Card] +0862 Atlantis +0864 Protar +0865 ACS +0866 Software Results Enterprises + 0100 Golden Gate 2 Bus+ [ISA Bus Bridge] +086a Unknown + 0100 Horizon [Graphics Card] + 0200 Blackbox [Graphics Card] + 0300 Voyager [Graphics Card] +086d Masoboshi + 0300 MasterCard SC201 [RAM Expansion] + 0400 MasterCard MC702 [SCSI Host Adapter and IDE Interface] + 0700 MVD 819 +086f Mainhattan-Data/A-Team + 0100 [IDE Interface] +0877 Village Tronic + 0100 Domino RAM [Graphics Card] + 0200 Domino [Graphics Card] + 0300 Domino 16M Prototype [Graphics Card] + 0b00 Picasso II/II+ RAM [Graphics Card] + 0c00 Picasso II/II+ [Graphics Card] + 0d00 Picasso II/II+ (Segmented Mode) [Graphics Card] + 1500 Picasso IV Z2 RAM [Graphics Card] + 1600 Picasso IV Z2 RAM [Graphics Card] + 1700 Picasso IV Z2 [Graphics Card] + 1800 Picasso IV Z3 [Graphics Card] + c900 Ariadne [Ethernet Card and Parallel Ports] + ca00 Ariadne II [Ethernet Card] +087b Utilities Unlimited + 1500 Emplant Deluxe [Macintosh Emulator] + 2000 Emplant Deluxe [Macintosh Emulator] +0880 Amitrix + 0100 [Multi I/O] + 0200 CD-RAM [RAM Expansion] +0885 ArMax + 0000 OmniBus [Graphics Card] +088d ZEUS Electronic Development + 0300 [ISDN Interface] + 0400 Spider [Video Card] +088f NewTek + 0000 VideoToaster [Video Card] +0890 M-Tech Germany + 0100 AT500 [IDE Interface] + 0300 68030 [Accelerator] + 0600 68020i [Accelerator] + 2000 A1200 T68030 RTC [Accelerator] + 2100 Viper Mk V/E-Matrix 530 [Accelerator and RAM Expansion] + 2200 8MB [RAM Expansion] + 2400 Viper Mk V/E-Matrix 530 [SCSI Host Adapter and IDE Interface] +0891 Great Valley Products + 0100 EGS 28/24 Spectrum RAM [Graphics Card] + 0200 EGS 28/24 Spectrum [Graphics Card] +0892 Apollo + 0100 A1200 [FPU and RAM Expansion] +0893 Ingenieurbüro Helfrich + 0500 Piccolo RAM [Graphics Card] + 0600 Piccolo [Graphics Card] + 0700 PeggyPlus MPEG [Video Card] + 0800 VideoCruncher [Video Card] + 0a00 Piccolo SD64 RAM [Graphics Card] + 0b00 Piccolo SD64 [Graphics Card] +089b MacroSystems USA + 1300 Warp Engine 40xx [Accelerator, SCSI Host Adapter and RAM Expansion] +089e ElBox Computer + 0600 1200/4 [RAM Expansion] + 0800 FastATA 1200 [IDE Interface] + 1200 FastATA 1200 [IDE Interface] + 1300 FastATA 1200 [IDE Interface] + 1800 FastATA 1200 [IDE Interface] + 1900 FastATA 4000 [IDE Interface] + 1d00 FastATA 4000 [IDE Interface] + 1e00 FastATA ZIV [IDE Interface] +0a00 Harms Professional + 1000 030 Plus [Accelerator] + d000 3500 Professional [Accelerator and RAM Expansion] +0a50 Micronik + 0a00 RCA 120 [RAM Expansion] +0f0f Micronik + 0100 Z3i A1200 [Zorro III Extender and SCSI Host Adapter] +1000 MegaMicro + 0300 SCRAM 500 [SCSI Host Adapter] + 0400 SCRAM 500 [RAM Expansion] +1028 Ronin/Imtronics + 3900 Hurricane 2800 [Accelerator and RAM Expansion] + 5700 Hurricane 2800 [Accelerator and RAM Expansion] +102f Ateo Concepts + fc00 AteoBus [Expansion Bus Bridge] + fe00 Pixel64 [Graphics Card] + ff00 Pixel64 RAM [Graphics Card] +1212 Individual Computers + 0000 Buddha [IDE Interface] + 1700 X-Surf [Ethernet Card and IDE Interface] + 2a00 Catweasel [IDE Interface and Floppy Controller] +1248 Kupke + 0100 Golem HD 3000 [HD Controller] +1267 RBM-Computertechnik + 0100 IOBlix [Multi I/O] +1388 ITH + 0100 ISDN-Master II [ISDN Interface] +1389 VMC + 0100 ISDN Blaster Z2 [ISDN Interface] + 0200 HyperCom 4 [Multi I/O] + 0600 HyperCom 4+ [Multi I/O] +157c Information + 6400 ISDN Engine I [ISDN Interface] +2017 Vortex + 0700 Golden Gate 80386SX [ISA Bus Bridge] + 0800 Golden Gate [RAM Expansion] + 0900 Golden Gate 80486 [ISA Bus Bridge] +2062 Expansion Systems + 0100 DataFlyer 4000SX [SCSI Host Adapter] + 0200 DataFlyer 4000SX [RAM Expansion] +2100 ReadySoft + 0100 AMax II/IV [Macintosh Emulator] +2140 Phase 5 + 0100 Blizzard [RAM Expansion] + 0200 Blizzard [Accelerator] + 0600 Blizzard 1220-IV [Accelerator] + 0a00 FastLane Z3 [RAM Expansion] + 0b00 Blizzard 1230-II/Fastlane Z3/CyberSCSI/CyberStorm060 [Accelerator and/or SCSI Host Adapter] + 0c00 Blizzard 1220/CyberStorm [Accelerator and SCSI Host Adapter] + 0d00 Blizzard 1230 [Accelerator] + 1100 Blizzard 1230-IV/1260 [Accelerator] + 1800 Blizzard 2060 [Accelerator] + 1900 CyberStorm Mk II [Flash ROM] + 2200 CyberVision64 [Graphics Card] + 3200 CyberVision64-3D Prototype [Graphics Card] + 4300 CyberVision64-3D [Graphics Card] + 6400 CyberStorm Mk III [Accelerator and SCSI Host Adapter] + 6e00 Blizzard 603e+ [Accelerator and SCSI Host Adapter] +2169 DPS + 0100 Personal Animation Recorder [Video Card] +2200 Apollo + 0000 A620 68020 [Accelerator] + 0100 A620 68020 [Accelerator] +2222 Apollo + 2200 AT-Apollo + 2300 1230/1240/1260/2030/4040/4060 [Accelerator] +38a5 Petsoff LP + 0000 Delfina [Audio Card] + 0100 Delfina Lite [Audio Card] + 0200 Delfina Plus [Audio Card] +3ff7 Uwe Gerlach + d400 RAM/ROM [Miscellaneous Expansion Card] +4231 ACT + 0100 Prelude [Audio Card] +4754 MacroSystems Germany + 0300 Maestro [Audio Card] + 0400 VLab [Video Card] + 0500 Maestro Pro [Audio Card] + 0600 Retina [Graphics Card] + 0800 MultiEvolution [SCSI Host Adapter] + 0c00 Toccata [Audio Card] + 0d00 Toccata Pro [Audio Card] + 1000 Retina Z3 [Graphics Card] + 1200 VLab Motion [Video Card] + 1300 Altais [Graphics Card] + fd00 Falcon '040 [Accelerator] +6766 Combitec +8000 SKI Peripherals + 0800 MAST Fireball [SCSI Host Adapter] + 8000 [SCSI Host Adapter and Dual Serial Card] +a9ad Reis-Ware + 1100 Scan King [Scanner Interface] +aa01 Cameron + 1000 Personal A4 [Scanner Interface] +aa11 Reis-Ware + 1100 Handyscanner [Scanner Interface] +b5a8 Phoenix + 2100 ST506 [HD Controller] + 2200 [SCSI Host Adapter] + be00 [RAM Expansion] +c008 Combitec + 2a00 [HD Controller] + 2b00 SRAM [RAM Expansion] |
