Module Name:    src
Committed By:   snj
Date:           Wed Jan 27 00:01:07 UTC 2016

Modified Files:
        src/sys/external/bsd/drm2/include/linux [netbsd-7]: pci.h

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #1077):
        sys/external/bsd/drm2/include/linux/pci.h: revision 1.22
Use PCI ROM MD fallback if PCI ROM BAR points to invalid ROM.
We previously applied the PCI ROM MD fallback only if the PCI ROM BAR
was altogether unpopulated.  Some Radeon devices seem to have a
populated PCI ROM BAR pointing at a bogus ROM, while 0xc0000 works
fine.
Fixes at least one manifestation of PR kern/49964.


To generate a diff of this commit:
cvs rdiff -u -r1.7.2.7 -r1.7.2.8 \
    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/external/bsd/drm2/include/linux/pci.h
diff -u src/sys/external/bsd/drm2/include/linux/pci.h:1.7.2.7 src/sys/external/bsd/drm2/include/linux/pci.h:1.7.2.8
--- src/sys/external/bsd/drm2/include/linux/pci.h:1.7.2.7	Thu Jul 30 15:46:41 2015
+++ src/sys/external/bsd/drm2/include/linux/pci.h	Wed Jan 27 00:01:07 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci.h,v 1.7.2.7 2015/07/30 15:46:41 snj Exp $	*/
+/*	$NetBSD: pci.h,v 1.7.2.8 2016/01/27 00:01:07 snj Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -496,6 +496,7 @@ pci_map_rom_md(struct pci_dev *pdev)
 	pdev->pd_rom_bst = pdev->pd_pa.pa_memt;
 	pdev->pd_rom_bsh = rom_bsh;
 	pdev->pd_rom_size = rom_size;
+	pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM;
 
 	return 0;
 #else
@@ -512,9 +513,8 @@ 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 &&
-	    pci_map_rom_md(pdev) != 0)
-		return NULL;
+	    != 0)
+		goto fail_mi;
 	pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM;
 
 	/* XXX This type is obviously wrong in general...  */
@@ -522,14 +522,31 @@ pci_map_rom(struct pci_dev *pdev, size_t
 		pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86,
 		&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) {
 		pci_unmap_rom(pdev, NULL);
-		return NULL;
+		goto fail_mi;
 	}
+	goto success;
+
+fail_mi:
+	if (pci_map_rom_md(pdev) != 0)
+		goto fail_md;
 
+	/* XXX This type is obviously wrong in general...  */
+	if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh,
+		pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86,
+		&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) {
+		pci_unmap_rom(pdev, NULL);
+		goto fail_md;
+	}
+
+success:
 	KASSERT(pdev->pd_rom_found_size <= SIZE_T_MAX);
 	*sizep = pdev->pd_rom_found_size;
 	pdev->pd_rom_vaddr = bus_space_vaddr(pdev->pd_rom_bst,
 	    pdev->pd_rom_found_bsh);
 	return pdev->pd_rom_vaddr;
+
+fail_md:
+	return NULL;
 }
 
 static inline void __pci_rom_iomem *

Reply via email to