summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2010-01-13 06:12:49 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2010-01-13 06:12:49 +0000
commitd0bbd2d6443777ef53c24574b09427c55e04112e (patch)
treeae56d7b5f737f9251280f969c9e815c684de1e9a /sys
parentf81cc2b29a14337b801b60b0e5372ce058b26241 (diff)
Don't whack conflicting BARs if they are enabled.
Makes the IBM eServer x336 work. Tested by sthen@ and naddy@.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/pci.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 02e73fa1346..15432e50d52 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pci.c,v 1.71 2009/11/23 22:34:23 mlarkin Exp $ */
+/* $OpenBSD: pci.c,v 1.72 2010/01/13 06:12:48 kettenis Exp $ */
/* $NetBSD: pci.c,v 1.31 1997/06/06 23:48:04 thorpej Exp $ */
/*
@@ -531,12 +531,13 @@ pci_reserve_resources(struct pci_attach_args *pa)
{
pci_chipset_tag_t pc = pa->pa_pc;
pcitag_t tag = pa->pa_tag;
- pcireg_t bhlc, blr, type;
+ pcireg_t bhlc, blr, csr, type;
bus_addr_t base, limit;
bus_size_t size;
int reg, reg_start, reg_end;
int flags;
+ csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
bhlc = pci_conf_read(pc, tag, PCI_BHLC_REG);
switch (PCI_HDRTYPE_TYPE(bhlc)) {
case 0:
@@ -554,7 +555,7 @@ pci_reserve_resources(struct pci_attach_args *pa)
default:
return (0);
}
-
+
for (reg = reg_start; reg < reg_end; reg += 4) {
if (!pci_mapreg_probe(pc, tag, reg, &type))
continue;
@@ -579,9 +580,14 @@ pci_reserve_resources(struct pci_attach_args *pa)
base, size, EX_NOWAIT)) {
printf("mem address conflict 0x%x/0x%x\n",
base, size);
- pci_conf_write(pc, tag, reg, 0);
- if (type & PCI_MAPREG_MEM_TYPE_64BIT)
- pci_conf_write(pc, tag, reg + 4, 0);
+ if (csr & PCI_COMMAND_MEM_ENABLE) {
+ extent_alloc_region(pa->pa_memex,
+ base, size, EX_NOWAIT | EX_CONFLICTOK);
+ } else {
+ pci_conf_write(pc, tag, reg, 0);
+ if (type & PCI_MAPREG_MEM_TYPE_64BIT)
+ pci_conf_write(pc, tag, reg + 4, 0);
+ }
}
break;
case PCI_MAPREG_TYPE_IO:
@@ -589,7 +595,12 @@ pci_reserve_resources(struct pci_attach_args *pa)
base, size, EX_NOWAIT)) {
printf("io address conflict 0x%x/0x%x\n",
base, size);
- pci_conf_write(pc, tag, reg, 0);
+ if (csr & PCI_COMMAND_IO_ENABLE) {
+ extent_alloc_region(pa->pa_memex,
+ base, size, EX_NOWAIT | EX_CONFLICTOK);
+ } else {
+ pci_conf_write(pc, tag, reg, 0);
+ }
}
break;
}