Index: pci_map.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pci_map.c,v
retrieving revision 1.23
diff -u -r1.23 pci_map.c
--- pci_map.c	28 Apr 2008 20:23:55 -0000	1.23
+++ pci_map.c	8 Jun 2008 03:52:28 -0000
@@ -320,6 +320,67 @@
 }
 
 int
+pci_mapreg_submap(struct pci_attach_args *pa, int reg, pcireg_t type,
+    int busflags, bus_size_t maxsize, bus_size_t offset, bus_space_tag_t *tagp,
+	bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep)
+{
+	bus_space_tag_t tag;
+	bus_space_handle_t handle;
+	bus_addr_t base;
+	bus_size_t size;
+	int flags;
+
+	if (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) {
+		if ((pa->pa_flags & PCI_FLAGS_IO_ENABLED) == 0)
+			return (1);
+		if (pci_io_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
+		    &size, &flags))
+			return (1);
+		tag = pa->pa_iot;
+	} else {
+		if ((pa->pa_flags & PCI_FLAGS_MEM_ENABLED) == 0)
+			return (1);
+		if (pci_mem_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
+		    &size, &flags))
+			return (1);
+		tag = pa->pa_memt;
+	}
+
+	if (reg == PCI_MAPREG_ROM) {
+		pcireg_t 	mask;
+		int		s;
+		/* we have to enable the ROM address decoder... */
+		s = splhigh();
+		mask = pci_conf_read(pa->pa_pc, pa->pa_tag, reg);
+		mask |= PCI_MAPREG_ROM_ENABLE;
+		pci_conf_write(pa->pa_pc, pa->pa_tag, reg, mask);
+		splx(s);
+	}
+
+
+	if ((maxsize < size && offset + maxsize <= size) || offset != 0)
+		return (1);
+
+	base += offset;
+	size = maxsize;
+
+
+	if (bus_space_map(tag, base, maxsize, busflags | flags, &handle))
+		return (1);
+
+	if (tagp != 0)
+		*tagp = tag;
+	if (handlep != 0)
+		*handlep = handle;
+	if (basep != 0)
+		*basep = base;
+	if (sizep != 0)
+		*sizep = size;
+
+	return (0);
+}
+
+int
 pci_find_rom(struct pci_attach_args *pa, bus_space_tag_t bst,
     bus_space_handle_t bsh, int type, bus_space_handle_t *romh, bus_size_t *sz)
 {
Index: pcivar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pcivar.h,v
retrieving revision 1.82
diff -u -r1.82 pcivar.h
--- pcivar.h	30 May 2008 19:26:35 -0000	1.82
+++ pcivar.h	8 Jun 2008 03:52:28 -0000
@@ -198,6 +198,9 @@
 int	pci_mapreg_map(struct pci_attach_args *, int, pcireg_t, int,
 	    bus_space_tag_t *, bus_space_handle_t *, bus_addr_t *,
 	    bus_size_t *);
+int	pci_mapreg_submap(struct pci_attach_args *, int, pcireg_t, int,
+	    bus_size_t, bus_size_t, bus_space_tag_t *, bus_space_handle_t *, 
+	    bus_addr_t *, bus_size_t *);
 
 int pci_find_rom(struct pci_attach_args *, bus_space_tag_t, bus_space_handle_t,
 	    int, bus_space_handle_t *, bus_size_t *);
