Date: Fri, 17 Jul 2009 21:04:50 +0200 From: Andre Albsmeier <Andre.Albsmeier@siemens.com> To: freebsd-hackers@freebsd.org Cc: Rui Paulo <rpaulo@freebsd.org>, Andre.Albsmeier@siemens.com Subject: Reading acpi memory from a driver attached to hostb Message-ID: <20090717190450.GA4697@curry.mchp.siemens.de>
next in thread | raw e-mail | index | archive | help
[CC'ing this to Rui Paulo since he tried to help me a while ago] I have written a driver that is a child of hostb (similar to agp) for RELENG_7. However, on some chipsets (e.g. i975) it has to read some memory locations (not pci configuration space) which were registered by acpi as system resources. Since my driver is a child of hostb0, I have no idea of how to access this memory area. Here is a devinfo -r to make things clear: nexus0 acpi0 Interrupt request lines: 9 I/O ports: 0x10-0x1f 0x22-0x3f ... 0x800-0x87f I/O memory addresses: 0xc0000-0xdffff 0xe0000-0xfffff 0xf0000000-0xf3ffffff 0xfec00000-0xfec00fff 0xfed13000-0xfed19fff <--- the memory needed 0xfed1c000-0xfed1ffff .... 0xfed20000-0xfed3ffff 0xfff00000-0xffffffff cpu0 coretemp0 acpi_throttle0 ACPI I/O ports: 0x810-0x813 cpufreq0 cpu1 coretemp1 pcib0 pci0 I/O ports: 0x170-0x177 0x376 hostb0 I/O memory addresses: 0xe4000000-0xe7ffffff MYDRIVER0 <--- my driver agp0 pcib1 pci7 vgapci0 Interrupt request lines: 16 I had the same problem under RELENG_6 six month ago which could be solved by a bus_set_resource() but since the driver now attaches to hostb, this is not possible anymore. Earlier, I was given the hint to attach as a child of acpi (see the old mail attached below) but in this case I didn't have access to the hostb registers which I need as well. The only thing I see is: Attach two drivers -- one as child of acpi and another as child of hostb and let them communicate somehow (no idea how to do this). I have also done crazy things like searching for acpi0 and trying to bus_alloc_resource() the memory I am interested in but this also failed. Or is it possible to free(!) somehow the address space from acpi0 and pass it to hostb0 so I can bus_alloc_resource() it? Thanks a lot for all ideas, -Andre ------------------------------------------------------------------ > Hello all, > > I am writing a driver which needs to access memory at a > specific location. The location depends on what the BIOS > has configured into the host bridge. For example, my > current machine uses an Intel 975X chipset and the memory > location I am interested in has been set to 0xFED14000 and > is 16KB in size (this is MCHBAR of the 975X memory hub). You probably just need to do something like: rid = PCI_BAR(number); res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); And then, bus_read_4(res, offset from specified PCI BAR); > > > I have no idea how to access this space from my driver. > I have played around with bus_alloc_resource() but this > only gives me back NULL. > > However, a devinfo -r gives me: > > nexus0 > npx0 > acpi0 > Interrupt request lines: > 9 > I/O ports: > 0x10-0x1f > ... > 0x800-0x87f > I/O memory addresses: > 0x0-0x9ffff > 0xc0000-0xdffff > 0xe0000-0xfffff > 0x100000-0x7fffffff > 0xf0000000-0xf3ffffff > 0xfec00000-0xfec00fff > 0xfed13000-0xfed19fff <--- > 0xfed1c000-0xfed1ffff > 0xfed20000-0xfed3ffff > 0xfed50000-0xfed8ffff > 0xfee00000-0xfee00fff > 0xffb00000-0xffbfffff > 0xfff00000-0xffffffff > cpu0 > ... > > The line marked with <--- shows the range which includes > the location I am interested in. It is probably assigned > to the acpi0 device. > > How do I proceed from this? Do I have to hack around in > the ACPI-Code? I don't hope so ;-) You'll probably need to create a fake ACPI child driver to access it. Create your identify routine with something like: static void mydriver_identify(driver_t *driver, device_t parent) { if (device_find_child(parent, "mydriver", -1) == NULL && mydriver_match(parent)) device_add_child(parent, "mydriver", -1); } mydriver_match() should check if you were given the acpi0 device. Regards, -- Rui Paulo
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090717190450.GA4697>