Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Oct 2000 15:07:04 +0400 (MSD)
From:      nms@otdel-1.org
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/22078: Option ROM(s) must be excluded from ISA IO memory space allocation
Message-ID:  <20001018110704.23694F3@Draculina.otdel-1.org>

next in thread | raw e-mail | index | archive | help

>Number:         22078
>Category:       kern
>Synopsis:       Option ROM(s) must be excluded from ISA IO memory space allocation
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Oct 18 04:10:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Nikolai Saoukh
>Release:        FreeBSD 4.1.1-STABLE i386
>Organization:
>Environment:

	Any device on ISA bus with io memory window request with current
	resource manager.

>Description:

	Option ROM(s) are not excluded from ISA io memory, thus
	any request for io memory window can land upon video/...
	BIOS. See also kern/17715.

>How-To-Repeat:

	

>Fix:

Attached patch introduce new device wich take care of any option ROM(s)
present on ISA address space.

--- src/sys/isa/isa_common.c.orig	Tue Oct 10 13:49:04 2000
+++ src/sys/isa/isa_common.c	Thu Oct 12 18:24:16 2000
@@ -1047,3 +1047,95 @@
 DRIVER_MODULE(isa, nexus, isa_driver, isa_devclass, 0, 0);
 #endif
 
+/*
+ * Pseudo driver to take care of holes in ISA iomem occupied
+ * by option rom(s)
+ */
+
+#define	ORM_ID	0x00004d3e
+
+static struct isa_pnp_id orm_ids[] = {
+	{ ORM_ID,	NULL },		/* ORM0000 */
+	{ 0,		NULL },
+};
+
+static int
+orm_probe(device_t dev) {
+	return ISA_PNP_PROBE(device_get_parent(dev), dev, orm_ids);
+}
+
+static int
+orm_attach(device_t dev) {
+	return 0;
+}
+
+#define	IOMEM_START	0x0a0000
+#define	IOMEM_STEP	0x000800
+#define	IOMEM_END	0x100000
+
+static void
+orm_identify(driver_t* driver, device_t parent) {
+	device_t	child;
+	u_int32_t	chunk;
+	int		rnum = 0;
+
+	child = BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "orm", -1);
+	device_set_driver(child, driver);
+	device_set_desc(child, "Option ROM(s)");
+	isa_set_logicalid(child, ORM_ID);
+	isa_set_vendorid(child, ORM_ID);
+	for (chunk = IOMEM_START; chunk < IOMEM_END; chunk += IOMEM_STEP) {
+		struct resource*	res;
+		int			rid;
+		bus_space_tag_t		bt;
+		bus_space_handle_t	bh;
+		u_int32_t		rom_size;
+		u_int8_t		buf[3];
+
+		bus_set_resource(child, SYS_RES_MEMORY, rnum, chunk, IOMEM_STEP);
+		rid = rnum;
+		res = bus_alloc_resource(child, SYS_RES_MEMORY, &rid, 0ul, ~0ul, IOMEM_STEP, RF_ACTIVE);
+		if (res == NULL) {
+			bus_delete_resource(child, SYS_RES_MEMORY, rnum);
+			continue;
+		}
+		bt = rman_get_bustag(res);
+		bh = rman_get_bushandle(res);
+		bus_space_read_region_1(bt, bh, 0, buf, sizeof(buf));
+		bus_release_resource(child, SYS_RES_MEMORY, rid, res);
+		bus_delete_resource(child, SYS_RES_MEMORY, rnum);
+		if (buf[0] != 0x55 || buf[1] != 0xAA || (buf[2] & 0x03) != 0) {
+			continue;
+		}
+		rom_size = buf[2] << 9;
+		bus_set_resource(child, SYS_RES_MEMORY, rnum, chunk, rom_size);
+		rid = rnum;
+		res = bus_alloc_resource(child, SYS_RES_MEMORY, &rid, 0ul, ~0ul, rom_size, 0);
+		if (res == NULL) {
+			bus_delete_resource(child, SYS_RES_MEMORY, rnum);
+			continue;
+		}
+		chunk += rom_size - IOMEM_STEP;
+		rnum++;
+	}
+	if(rnum == 0)
+		device_delete_child(parent, child);
+}
+
+static device_method_t orm_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_identify,	orm_identify),
+	DEVMETHOD(device_probe,		orm_probe),
+	DEVMETHOD(device_attach,	orm_attach),
+	{ 0, 0 }
+};
+
+static driver_t orm_driver = {
+	"orm",
+	orm_methods,
+	0
+};
+
+static devclass_t orm_devclass;
+
+DRIVER_MODULE(orm, isa, orm_driver, orm_devclass, 0, 0);

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001018110704.23694F3>