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 *);