Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Enable the appropriate memory or I/...



details:   https://anonhg.NetBSD.org/src/rev/0222b5233304
branches:  trunk
changeset: 319101:0222b5233304
user:      jakllsch <jakllsch%NetBSD.org@localhost>
date:      Wed May 16 19:02:00 2018 +0000

description:
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.

diffstat:

 sys/dev/pci/pci_map.c |  18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diffs (57 lines):

diff -r ce586b5b2f5a -r 0222b5233304 sys/dev/pci/pci_map.c
--- a/sys/dev/pci/pci_map.c     Wed May 16 16:33:23 2018 +0000
+++ b/sys/dev/pci/pci_map.c     Wed May 16 19:02:00 2018 +0000
@@ -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 @@
        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 @@
        } 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 @@
 
        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);



Home | Main Index | Thread Index | Old Index