Module Name:    src
Committed By:   jakllsch
Date:           Wed May 16 19:02:00 UTC 2018

Modified Files:
        src/sys/dev/pci: pci_map.c

Log Message:
Enable the appropriate memory or I/O space decode in the PCI
Command/Status Register upon mapping a BAR.

This should fix PR #53286.  It's also possible there are other similar
PRs that might be fixed by this.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/pci/pci_map.c

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.33 src/sys/dev/pci/pci_map.c:1.34
--- src/sys/dev/pci/pci_map.c:1.33	Fri Mar 17 11:21:45 2017
+++ src/sys/dev/pci/pci_map.c	Wed May 16 19:02:00 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci_map.c,v 1.33 2017/03/17 11:21:45 msaitoh Exp $	*/
+/*	$NetBSD: pci_map.c,v 1.34 2018/05/16 19:02:00 jakllsch 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.33 2017/03/17 11:21:45 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.34 2018/05/16 19:02:00 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -287,11 +287,17 @@ pci_mapreg_submap(const struct pci_attac
 	bus_space_handle_t handle;
 	bus_addr_t base;
 	bus_size_t realmaxsize;
-	int flags;
+	pcireg_t csr;
+	int flags, s;
 
 	if (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) {
 		if ((pa->pa_flags & PCI_FLAGS_IO_OKAY) == 0)
 			return 1;
+		s = splhigh();
+		csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+		csr |= PCI_COMMAND_IO_ENABLE;
+		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
+		splx(s);
 		if (pci_io_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
 		    &realmaxsize, &flags))
 			return 1;
@@ -299,6 +305,11 @@ pci_mapreg_submap(const struct pci_attac
 	} else {
 		if ((pa->pa_flags & PCI_FLAGS_MEM_OKAY) == 0)
 			return 1;
+		s = splhigh();
+		csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+		csr |= PCI_COMMAND_MEM_ENABLE;
+		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
+		splx(s);
 		if (pci_mem_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
 		    &realmaxsize, &flags))
 			return 1;
@@ -307,7 +318,6 @@ pci_mapreg_submap(const struct pci_attac
 
 	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);

Reply via email to