Module Name: src Committed By: riastradh Date: Thu Oct 16 12:31:23 UTC 2014
Modified Files: src/sys/dev/pci: pci_map.c pcivar.h radeonfb.c src/sys/external/bsd/drm2/include/linux: pci.h Log Message: Generalize pci_find_rom and use it to locate x86 video ROM in drm2. - Make pci_find_rom take the ROM `BAR' size as a parameter, instead of using pci_find_mem with the ROM `BAR' to detect the size. - Use it to find the x86 video ROM in [0xc0000, 0xe0000) in drm2, when nothing else reports that location. - Adapt the one other caller in radeonfb, which already has the maximum ROM size handy (romsz). XXX pullup to netbsd-7 To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/dev/pci/pci_map.c cvs rdiff -u -r1.99 -r1.100 src/sys/dev/pci/pcivar.h cvs rdiff -u -r1.84 -r1.85 src/sys/dev/pci/radeonfb.c cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/pci.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/pci_map.c diff -u src/sys/dev/pci/pci_map.c:1.30 src/sys/dev/pci/pci_map.c:1.31 --- src/sys/dev/pci/pci_map.c:1.30 Sat Oct 20 06:03:38 2012 +++ src/sys/dev/pci/pci_map.c Thu Oct 16 12:31:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_map.c,v 1.30 2012/10/20 06:03:38 matt Exp $ */ +/* $NetBSD: pci_map.c,v 1.31 2014/10/16 12:31:23 riastradh Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.30 2012/10/20 06:03:38 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.31 2014/10/16 12:31:23 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -347,24 +347,21 @@ pci_mapreg_submap(const struct pci_attac int pci_find_rom(const 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) + bus_space_handle_t bsh, bus_size_t sz, int type, + bus_space_handle_t *romh, bus_size_t *romsz) { - bus_size_t romsz, offset = 0, imagesz; + bus_size_t offset = 0, imagesz; uint16_t ptr; int done = 0; - if (pci_mem_find(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM, - PCI_MAPREG_TYPE_ROM, NULL, &romsz, NULL)) - return 1; - /* * no upper bound check; i cannot imagine a 4GB ROM, but * it appears the spec would allow it! */ - if (romsz < 1024) + if (sz < 1024) return 1; - while (offset < romsz && !done){ + while (offset < sz && !done){ struct pci_rom_header hdr; struct pci_rom rom; @@ -379,7 +376,7 @@ pci_find_rom(const struct pci_attach_arg ptr = offset + hdr.romh_data_ptr; - if (ptr > romsz) { + if (ptr > sz) { printf("pci_find_rom: rom data ptr out of range\n"); return 1; } @@ -415,7 +412,7 @@ pci_find_rom(const struct pci_attach_arg (rom.rom_subclass == PCI_SUBCLASS(pa->pa_class)) && (rom.rom_interface == PCI_INTERFACE(pa->pa_class)) && (rom.rom_code_type == type)) { - *sz = imagesz; + *romsz = imagesz; bus_space_subregion(bst, bsh, offset, imagesz, romh); return 0; } Index: src/sys/dev/pci/pcivar.h diff -u src/sys/dev/pci/pcivar.h:1.99 src/sys/dev/pci/pcivar.h:1.100 --- src/sys/dev/pci/pcivar.h:1.99 Sat Mar 29 19:28:25 2014 +++ src/sys/dev/pci/pcivar.h Thu Oct 16 12:31:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pcivar.h,v 1.99 2014/03/29 19:28:25 christos Exp $ */ +/* $NetBSD: pcivar.h,v 1.100 2014/10/16 12:31:23 riastradh Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -271,7 +271,7 @@ int pci_mapreg_map(const struct pci_atta bus_size_t *); int pci_find_rom(const struct pci_attach_args *, bus_space_tag_t, - bus_space_handle_t, + bus_space_handle_t, bus_size_t, int, bus_space_handle_t *, bus_size_t *); int pci_get_capability(pci_chipset_tag_t, pcitag_t, int, int *, pcireg_t *); Index: src/sys/dev/pci/radeonfb.c diff -u src/sys/dev/pci/radeonfb.c:1.84 src/sys/dev/pci/radeonfb.c:1.85 --- src/sys/dev/pci/radeonfb.c:1.84 Tue Jul 22 15:42:59 2014 +++ src/sys/dev/pci/radeonfb.c Thu Oct 16 12:31:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: radeonfb.c,v 1.84 2014/07/22 15:42:59 riastradh Exp $ */ +/* $NetBSD: radeonfb.c,v 1.85 2014/10/16 12:31:23 riastradh Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: radeonfb.c,v 1.84 2014/07/22 15:42:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: radeonfb.c,v 1.85 2014/10/16 12:31:23 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1321,7 +1321,7 @@ radeonfb_loadbios(struct radeonfb_softc return; } - pci_find_rom(pa, romt, romh, PCI_ROM_CODE_TYPE_X86, &biosh, + pci_find_rom(pa, romt, romh, romsz, PCI_ROM_CODE_TYPE_X86, &biosh, &sc->sc_biossz); if (sc->sc_biossz == 0) { aprint_verbose("%s: Video BIOS not present\n", XNAME(sc)); Index: src/sys/external/bsd/drm2/include/linux/pci.h diff -u src/sys/external/bsd/drm2/include/linux/pci.h:1.8 src/sys/external/bsd/drm2/include/linux/pci.h:1.9 --- src/sys/external/bsd/drm2/include/linux/pci.h:1.8 Wed Aug 13 20:56:21 2014 +++ src/sys/external/bsd/drm2/include/linux/pci.h Thu Oct 16 12:31:23 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pci.h,v 1.8 2014/08/13 20:56:21 riastradh Exp $ */ +/* $NetBSD: pci.h,v 1.9 2014/10/16 12:31:23 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -430,6 +430,36 @@ pci_unmap_rom(struct pci_dev *pdev, void pdev->pd_rom_vaddr = NULL; } +/* XXX Whattakludge! Should move this in sys/arch/. */ +static int +pci_map_rom_md(struct pci_dev *pdev) +{ +#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) + const bus_addr_t rom_base = 0xc0000; + const bus_size_t rom_size = 0x20000; + bus_space_handle_t rom_bsh; + int error; + + if (PCI_CLASS(pdev->pd_pa.pa_class) != PCI_CLASS_DISPLAY) + return ENXIO; + if (PCI_SUBCLASS(pdev->pd_pa.pa_class) != PCI_SUBCLASS_DISPLAY_VGA) + return ENXIO; + /* XXX Check whether this is the primary VGA card? */ + error = bus_space_map(pdev->pd_pa.pa_memt, rom_base, rom_size, + (BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE), &rom_bsh); + if (error) + return ENXIO; + + pdev->pd_rom_bst = pdev->pd_pa.pa_memt; + pdev->pd_rom_bsh = rom_bsh; + pdev->pd_rom_size = rom_size; + + return 0; +#else + return ENXIO; +#endif +} + static inline void __pci_rom_iomem * pci_map_rom(struct pci_dev *pdev, size_t *sizep) { @@ -441,13 +471,14 @@ pci_map_rom(struct pci_dev *pdev, size_t if (pci_mapreg_map(&pdev->pd_pa, PCI_MAPREG_ROM, PCI_MAPREG_TYPE_ROM, (BUS_SPACE_MAP_PREFETCHABLE | BUS_SPACE_MAP_LINEAR), &pdev->pd_rom_bst, &pdev->pd_rom_bsh, NULL, &pdev->pd_rom_size) - != 0) + != 0 && + pci_map_rom_md(pdev) != 0) return NULL; pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM; /* XXX This type is obviously wrong in general... */ if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh, - PCI_ROM_CODE_TYPE_X86, &bsh, &size)) { + pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86, &bsh, &size)) { pci_unmap_rom(pdev, NULL); return NULL; }