Module Name: src Committed By: jakllsch Date: Sat May 19 17:18:57 UTC 2018
Modified Files: src/sys/arch/x86/x86: efi.c src/sys/dev/pci: pci_map.c pcivar.h Log Message: Refine previous change to enable PCI window decoding in Command Register upon mapping; conditionalize on a global variable, that is set to true on x86 machines booting under EFI. For now, initialize the global variable at compile time to false. This is intended to limit potential problems for other NetBSD ports, should this changeset be pulled up to netbsd-8. Related to PR #53286. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/arch/x86/x86/efi.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/pci/pci_map.c cvs rdiff -u -r1.111 -r1.112 src/sys/dev/pci/pcivar.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/arch/x86/x86/efi.c diff -u src/sys/arch/x86/x86/efi.c:1.14 src/sys/arch/x86/x86/efi.c:1.15 --- src/sys/arch/x86/x86/efi.c:1.14 Sun Oct 22 01:29:26 2017 +++ src/sys/arch/x86/x86/efi.c Sat May 19 17:18:57 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efi.c,v 1.14 2017/10/22 01:29:26 maya Exp $ */ +/* $NetBSD: efi.c,v 1.15 2018/05/19 17:18:57 jakllsch Exp $ */ /*- * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: efi.c,v 1.14 2017/10/22 01:29:26 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efi.c,v 1.15 2018/05/19 17:18:57 jakllsch Exp $"); #include <sys/kmem.h> #include <sys/param.h> @@ -40,6 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: efi.c,v 1.14 #include <x86/efi.h> #include <dev/mm.h> +#include <dev/pci/pcivar.h> /* for pci_mapreg_map_enable_decode */ const struct uuid EFI_UUID_ACPI20 = EFI_TABLE_ACPI20; const struct uuid EFI_UUID_ACPI10 = EFI_TABLE_ACPI10; @@ -407,6 +408,7 @@ efi_init(void) return; } bootmethod_efi = true; + pci_mapreg_map_enable_decode = true; /* PR port-amd64/53286 */ } bool Index: src/sys/dev/pci/pci_map.c diff -u src/sys/dev/pci/pci_map.c:1.34 src/sys/dev/pci/pci_map.c:1.35 --- src/sys/dev/pci/pci_map.c:1.34 Wed May 16 19:02:00 2018 +++ src/sys/dev/pci/pci_map.c Sat May 19 17:18:57 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_map.c,v 1.34 2018/05/16 19:02:00 jakllsch Exp $ */ +/* $NetBSD: pci_map.c,v 1.35 2018/05/19 17:18:57 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.34 2018/05/16 19:02:00 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.35 2018/05/19 17:18:57 jakllsch Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -43,6 +43,8 @@ __KERNEL_RCSID(0, "$NetBSD: pci_map.c,v #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> +bool pci_mapreg_map_enable_decode = false; + static int pci_io_find(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t type, bus_addr_t *basep, bus_size_t *sizep, int *flagsp) @@ -293,11 +295,6 @@ pci_mapreg_submap(const struct pci_attac 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; @@ -305,11 +302,6 @@ 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; @@ -339,6 +331,15 @@ pci_mapreg_submap(const struct pci_attac if (bus_space_map(tag, base, reqsize, busflags | flags, &handle)) return 1; + if (pci_mapreg_map_enable_decode) { + s = splhigh(); + csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); + csr |= (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) ? + PCI_COMMAND_IO_ENABLE : PCI_COMMAND_MEM_ENABLE; + pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr); + splx(s); + } + if (tagp != NULL) *tagp = tag; if (handlep != NULL) Index: src/sys/dev/pci/pcivar.h diff -u src/sys/dev/pci/pcivar.h:1.111 src/sys/dev/pci/pcivar.h:1.112 --- src/sys/dev/pci/pcivar.h:1.111 Thu Apr 19 21:50:09 2018 +++ src/sys/dev/pci/pcivar.h Sat May 19 17:18:57 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pcivar.h,v 1.111 2018/04/19 21:50:09 christos Exp $ */ +/* $NetBSD: pcivar.h,v 1.112 2018/05/19 17:18:57 jakllsch Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -258,6 +258,8 @@ struct pci_softc { extern struct cfdriver pci_cd; +extern bool pci_mapreg_map_enable_decode; + int pcibusprint(void *, const char *); /*