summaryrefslogtreecommitdiffstats
path: root/drivers/zorro
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:27:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:27:49 +0000
commitace9429bb58fd418f0c81d4c2835699bddf6bde6 (patch)
treeb2d64bc10158fdd5497876388cd68142ca374ed3 /drivers/zorro
parentInitial commit. (diff)
downloadlinux-ace9429bb58fd418f0c81d4c2835699bddf6bde6.tar.xz
linux-ace9429bb58fd418f0c81d4c2835699bddf6bde6.zip
Adding upstream version 6.6.15.upstream/6.6.15
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'drivers/zorro')
-rw-r--r--drivers/zorro/.gitignore3
-rw-r--r--drivers/zorro/Kconfig19
-rw-r--r--drivers/zorro/Makefile23
-rw-r--r--drivers/zorro/gen-devlist.c108
-rw-r--r--drivers/zorro/names.c99
-rw-r--r--drivers/zorro/proc.c129
-rw-r--r--drivers/zorro/zorro-driver.c171
-rw-r--r--drivers/zorro/zorro-sysfs.c123
-rw-r--r--drivers/zorro/zorro.c246
-rw-r--r--drivers/zorro/zorro.h16
-rw-r--r--drivers/zorro/zorro.ids474
11 files changed, 1411 insertions, 0 deletions
diff --git a/drivers/zorro/.gitignore b/drivers/zorro/.gitignore
new file mode 100644
index 0000000000..acd6ffb8d7
--- /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 0000000000..41475ad46e
--- /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 0000000000..91ba82e633
--- /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 0000000000..e325c5ce99
--- /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 0000000000..077114ccc8
--- /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 0000000000..f916bf60b3
--- /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 0000000000..025edfcced
--- /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, struct device_driver *drv)
+{
+ struct zorro_dev *z = to_zorro_dev(dev);
+ 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;
+}
+
+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 0000000000..3d34dba9bb
--- /dev/null
+++ b/drivers/zorro/zorro-sysfs.c
@@ -0,0 +1,123 @@
+/*
+ * 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 <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 sprintf(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 sprintf(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 sprintf(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 sprintf(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,
+ 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 struct bin_attribute zorro_config_attr = {
+ .attr = {
+ .name = "config",
+ .mode = S_IRUGO,
+ },
+ .size = sizeof(struct ConfigDev),
+ .read = zorro_read_config,
+};
+
+static struct bin_attribute *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 0000000000..1b99286485
--- /dev/null
+++ b/drivers/zorro/zorro.c
@@ -0,0 +1,246 @@
+/*
+ * 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 <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++) {
+ struct resource *r = &bridge->resource[i];
+
+ if (zorro_resource_start(z) >= r->start &&
+ zorro_resource_end(z) <= r->end)
+ return r;
+ }
+ 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(struct_size(bus, devices, zorro_num_autocon),
+ GFP_KERNEL);
+ 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, zorro_num_autocon == 1 ? "" : "s");
+
+ /* 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.start = zi->boardaddr;
+ z->resource.end = zi->boardaddr + zi->boardsize - 1;
+ z->resource.name = 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 0000000000..f84df9fb4c
--- /dev/null
+++ b/drivers/zorro/zorro.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+ /*
+ * Zorro bus
+ */
+
+extern 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 0000000000..119abea8c6
--- /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]