Date: Tue, 21 Jan 2014 14:54:08 -0500 From: David Shane Holden <dpejesh@yahoo.com> To: freebsd-hackers@freebsd.org Subject: Re: Atom Board ACPI API MOPNV10J failing since 9.1 Message-ID: <52DED060.4070800@yahoo.com> In-Reply-To: <201401211215.22021.jhb@freebsd.org> References: <52CF850A.9060906@erdgeist.org> <201401140823.00259.jhb@freebsd.org> <lb518g$i3h$1@ger.gmane.org> <201401211215.22021.jhb@freebsd.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On 01/21/14 12:15, John Baldwin wrote:
>
> Hmm, I think I see the issue, and I might have a fix for it in the
> works already. The problem is that we haven't reserved pcib1's
> windows when agp probes, so agp0 steals a resource that is already
> in use. The change I have that might fix this isn't trivial though,
> so I don't have a patch I can just give you to test right now. :(
> Also, this isn't a BIOS issue per se.
>
I came to the same conclusion a few days ago when I started digging into
it more. The agp driver requests some memory and the resource manager
gives it a chunk which should be reserved for the bridge. I couldn't
find an elegant solution; the best I could come up with was to add the
bridge devices first in pci_add_children() to ensure they got attached
before anything else. Which worked, but seems like a hack. Feel free
to ping me if you have something that needs testing.
[-- Attachment #2 --]
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 4d8837f..38c102f 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -3278,7 +3278,8 @@ pci_add_children(device_t dev, int domain, int busno, size_t dinfo_size)
dinfo = pci_read_device(pcib, domain, busno, s, f,
dinfo_size);
if (dinfo != NULL) {
- pci_add_child(dev, dinfo);
+ pci_add_child_ordered(dev,
+ (hdrtype & PCIM_HDRTYPE) == PCIM_HDRTYPE_BRIDGE ? 0 : 1, dinfo);
}
}
}
@@ -3288,7 +3289,13 @@ pci_add_children(device_t dev, int domain, int busno, size_t dinfo_size)
void
pci_add_child(device_t bus, struct pci_devinfo *dinfo)
{
- dinfo->cfg.dev = device_add_child(bus, NULL, -1);
+ pci_add_child_ordered(bus, 0, dinfo);
+}
+
+void
+pci_add_child_ordered(device_t bus, u_int order, struct pci_devinfo *dinfo)
+{
+ dinfo->cfg.dev = device_add_child_ordered(bus, order, NULL, -1);
device_set_ivars(dinfo->cfg.dev, dinfo);
resource_list_init(&dinfo->resources);
pci_cfg_save(dinfo->cfg.dev, dinfo, 0);
diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h
index 1502288..10536fc 100644
--- a/sys/dev/pci/pci_private.h
+++ b/sys/dev/pci/pci_private.h
@@ -48,6 +48,8 @@ extern int pci_do_power_suspend;
void pci_add_children(device_t dev, int domain, int busno,
size_t dinfo_size);
void pci_add_child(device_t bus, struct pci_devinfo *dinfo);
+void pci_add_child_ordered(device_t bus, u_int order,
+ struct pci_devinfo *dinfo);
void pci_add_resources(device_t bus, device_t dev, int force,
uint32_t prefetchmask);
int pci_attach_common(device_t dev);
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?52DED060.4070800>
