Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci - Don't try to sizing a BAR not if a device is h...
details: https://anonhg.NetBSD.org/src/rev/060d060e360e
branches: trunk
changeset: 822371:060d060e360e
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Fri Mar 17 08:51:44 2017 +0000
description:
- Don't try to sizing a BAR not if a device is host bridge but a device's
PCI_COMMAND_MEM_ENABLE is set.
- Fix 17 years old bug that all effective BARs are marked "not sized" on
pcictl pciN dump.
- Print BAR's window size on pcictl pciN dump.
- remove extra "(?)"
diffstat:
sys/dev/pci/pci_subr.c | 125 ++++++++++++++++++------------------------------
1 files changed, 46 insertions(+), 79 deletions(-)
diffs (261 lines):
diff -r 9a27ac44decd -r 060d060e360e sys/dev/pci/pci_subr.c
--- a/sys/dev/pci/pci_subr.c Fri Mar 17 06:52:59 2017 +0000
+++ b/sys/dev/pci/pci_subr.c Fri Mar 17 08:51:44 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_subr.c,v 1.166 2017/03/14 08:27:13 msaitoh Exp $ */
+/* $NetBSD: pci_subr.c,v 1.167 2017/03/17 08:51:44 msaitoh Exp $ */
/*
* Copyright (c) 1997 Zubin D. Dittia. All rights reserved.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.166 2017/03/14 08:27:13 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.167 2017/03/17 08:51:44 msaitoh Exp $");
#ifdef _KERNEL_OPT
#include "opt_pci.h"
@@ -884,21 +884,18 @@
#ifdef _KERNEL
pci_chipset_tag_t pc, pcitag_t tag,
#endif
- const pcireg_t *regs, int reg, const char *name
-#ifdef _KERNEL
- , int sizebar
-#endif
- )
+ const pcireg_t *regs, int reg, const char *name)
{
int width;
pcireg_t rval, rval64h;
-#ifdef _KERNEL
- int s;
- pcireg_t mask, mask64h;
-#endif
+ bool ioen, memen;
+ pcireg_t mask, mask64h = 0;
+
+ rval = regs[o2i(PCI_COMMAND_STATUS_REG)];
+ ioen = rval & PCI_COMMAND_IO_ENABLE;
+ memen = rval & PCI_COMMAND_MEM_ENABLE;
width = 4;
-
/*
* Section 6.2.5.1, `Address Maps', tells us that:
*
@@ -919,8 +916,9 @@
rval64h = 0;
#ifdef _KERNEL
- /* XXX don't size unknown memory type? */
- if (rval != 0 && sizebar) {
+ if (rval != 0 && memen) {
+ int s;
+
/*
* The following sequence seems to make some devices
* (e.g. host bus bridges, which don't normally
@@ -939,19 +937,23 @@
pci_conf_write(pc, tag, reg + 4, 0xffffffff);
mask64h = pci_conf_read(pc, tag, reg + 4);
pci_conf_write(pc, tag, reg + 4, rval64h);
- } else
- mask64h = 0;
+ }
splx(s);
} else
- mask = mask64h = 0;
#endif /* _KERNEL */
+ {
+ mask = regs[o2i(reg)];
+ if (PCI_MAPREG_TYPE(rval) == PCI_MAPREG_TYPE_MEM &&
+ PCI_MAPREG_MEM_TYPE(rval) == PCI_MAPREG_MEM_TYPE_64BIT)
+ mask64h = regs[o2i(reg + 4)];
+ }
printf(" Base address register at 0x%02x", reg);
if (name)
printf(" (%s)", name);
printf("\n ");
if (rval == 0) {
- printf("not implemented(?)\n");
+ printf("not implemented\n");
return width;
}
printf("type: ");
@@ -979,47 +981,34 @@
printf("%s %sprefetchable memory\n", type, prefetch);
switch (PCI_MAPREG_MEM_TYPE(rval)) {
case PCI_MAPREG_MEM_TYPE_64BIT:
- printf(" base: 0x%016llx, ",
+ printf(" base: 0x%016llx\n",
PCI_MAPREG_MEM64_ADDR(
((((long long) rval64h) << 32) | rval)));
-#ifdef _KERNEL
- if (sizebar)
- printf("size: 0x%016llx",
- PCI_MAPREG_MEM64_SIZE(
- ((((long long) mask64h) << 32) | mask)));
- else
-#endif /* _KERNEL */
- printf("not sized");
+ printf(" size: 0x%016llx",
+ PCI_MAPREG_MEM64_SIZE(
+ ((((long long) mask64h) << 32) | mask)));
+ if (!memen)
+ printf(", disabled");
printf("\n");
break;
case PCI_MAPREG_MEM_TYPE_32BIT:
case PCI_MAPREG_MEM_TYPE_32BIT_1M:
default:
- printf(" base: 0x%08x, ",
- PCI_MAPREG_MEM_ADDR(rval));
-#ifdef _KERNEL
- if (sizebar)
- printf("size: 0x%08x",
- PCI_MAPREG_MEM_SIZE(mask));
- else
-#endif /* _KERNEL */
- printf("not sized");
+ printf(" base: 0x%08x\n",
+ PCI_MAPREG_MEM_ADDR(rval)),
+ printf(" size: 0x%08x",
+ PCI_MAPREG_MEM_SIZE(mask));
+ if (!memen)
+ printf(", disabled");
printf("\n");
break;
}
} else {
-#ifdef _KERNEL
- if (sizebar)
- printf("%d-bit ", mask & ~0x0000ffff ? 32 : 16);
-#endif /* _KERNEL */
- printf("i/o\n");
- printf(" base: 0x%08x, ", PCI_MAPREG_IO_ADDR(rval));
-#ifdef _KERNEL
- if (sizebar)
- printf("size: 0x%08x", PCI_MAPREG_IO_SIZE(mask));
- else
-#endif /* _KERNEL */
- printf("not sized");
+ printf("%d-bit I/O\n", mask & ~0x0000ffff ? 32 : 16);
+ printf(" base: 0x%08x\n", PCI_MAPREG_IO_ADDR(rval));
+ printf(" size: 0x%08x", PCI_MAPREG_IO_SIZE(mask));
+ if (!ioen)
+ printf(", disabled");
printf("\n");
}
@@ -3866,18 +3855,14 @@
#ifdef _KERNEL
pci_chipset_tag_t pc, pcitag_t tag,
#endif
- const pcireg_t *regs
-#ifdef _KERNEL
- , int sizebars
-#endif
- )
+ const pcireg_t *regs)
{
int off, width;
pcireg_t rval;
for (off = PCI_MAPREG_START; off < PCI_MAPREG_END; off += width) {
#ifdef _KERNEL
- width = pci_conf_print_bar(pc, tag, regs, off, NULL, sizebars);
+ width = pci_conf_print_bar(pc, tag, regs, off, NULL);
#else
width = pci_conf_print_bar(regs, off, NULL);
#endif
@@ -3933,11 +3918,7 @@
#ifdef _KERNEL
pci_chipset_tag_t pc, pcitag_t tag,
#endif
- const pcireg_t *regs
-#ifdef _KERNEL
- , int sizebars
-#endif
- )
+ const pcireg_t *regs)
{
int off, width;
pcireg_t rval;
@@ -3954,7 +3935,7 @@
for (off = 0x10; off < 0x18; off += width) {
#ifdef _KERNEL
- width = pci_conf_print_bar(pc, tag, regs, off, NULL, sizebars);
+ width = pci_conf_print_bar(pc, tag, regs, off, NULL);
#else
width = pci_conf_print_bar(regs, off, NULL);
#endif
@@ -4109,11 +4090,7 @@
#ifdef _KERNEL
pci_chipset_tag_t pc, pcitag_t tag,
#endif
- const pcireg_t *regs
-#ifdef _KERNEL
- , int sizebars
-#endif
- )
+ const pcireg_t *regs)
{
pcireg_t rval;
@@ -4128,7 +4105,7 @@
#ifdef _KERNEL
pci_conf_print_bar(pc, tag, regs, 0x10,
- "CardBus socket/ExCA registers", sizebars);
+ "CardBus socket/ExCA registers");
#else
pci_conf_print_bar(regs, 0x10, "CardBus socket/ExCA registers");
#endif
@@ -4212,8 +4189,7 @@
printf(" Subsystem ID: 0x%04x\n", PCI_PRODUCT(rval));
#ifdef _KERNEL
- pci_conf_print_bar(pc, tag, regs, 0x44, "legacy-mode registers",
- sizebars);
+ pci_conf_print_bar(pc, tag, regs, 0x44, "legacy-mode registers");
#else
pci_conf_print_bar(regs, 0x44, "legacy-mode registers");
#endif
@@ -4233,9 +4209,7 @@
int off, capoff, endoff, hdrtype;
const char *type_name;
#ifdef _KERNEL
- void (*type_printfn)(pci_chipset_tag_t, pcitag_t, const pcireg_t *,
- int);
- int sizebars;
+ void (*type_printfn)(pci_chipset_tag_t, pcitag_t, const pcireg_t *);
#else
void (*type_printfn)(const pcireg_t *);
#endif
@@ -4252,13 +4226,6 @@
#endif
}
-#ifdef _KERNEL
- sizebars = 1;
- if (PCI_CLASS(regs[o2i(PCI_CLASS_REG)]) == PCI_CLASS_BRIDGE &&
- PCI_SUBCLASS(regs[o2i(PCI_CLASS_REG)]) == PCI_SUBCLASS_BRIDGE_HOST)
- sizebars = 0;
-#endif
-
/* common header */
printf(" Common header:\n");
pci_conf_print_regs(regs, 0, 16);
@@ -4310,7 +4277,7 @@
printf("\n");
if (type_printfn) {
#ifdef _KERNEL
- (*type_printfn)(pc, tag, regs, sizebars);
+ (*type_printfn)(pc, tag, regs);
#else
(*type_printfn)(regs);
#endif
Home |
Main Index |
Thread Index |
Old Index