[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    SOLVED: Reading acpi memory from a driver attached to hostb
From:       Andre Albsmeier <Andre.Albsmeier () siemens ! com>
Date:       2009-07-25 13:56:32
Message-ID: 20090725135632.GA77656 () curry ! mchp ! siemens ! de
[Download RAW message or body]

On Thu, 23-Jul-2009 at 16:06:11 -0400, John Baldwin wrote:
> On Thursday 23 July 2009 1:53:51 pm Andre Albsmeier wrote:
> > John, apparently you sent me an email (thanks a lot) which I never
> > received (we have to blame our company's spam filters which I do
> > not control). I'll comment on it here in my reply to Doug...
> 
> Yes, I saw the bounces.  Hopefully you see the list version of this.
> 
> > > | Did you try 
> > > | doing 'bus_alloc_resource(device_get_parent(device_get_parent(dev))' in 
> your 
> > > | driver that is a child of hostb0?
> > 
> > I tried this, well, something similar: I had to do 4 times
> > device_get_parent() to end up at acpi0:
> > 
> > mydriver -> hostb0 -> pci0 -> pcib0 -> acpi0
> 
> You don't actually need to do that.  pci0 will pass the request up to acpi0 
> eventually.  You just need to ask pci0 to allocate it for you and it will see 
> you are not a direct child and take the 'passthrough' case here:
> 
> struct resource *
> pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
>                    u_long start, u_long end, u_long count, u_int flags)
> {
> 	...
> 
>         if (device_get_parent(child) != dev)
>                 return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
>                     type, rid, start, end, count, flags));
> 	...
> }
> 
> Rather than trying to allocate the whole chunk of the ACPI resource, I would 
> just do a specific allocation like so:
> 
> 	rid = 0;
> 	res = BUS_ALLOC_RESOURCE(device_get_parent(device_get_parent(dev)),
> 	    dev, SYS_RES_MEMORY, &rid, <the real start address>, <the real
> 	    end address>, <the length>, RF_ACTIVE);

I finally got it working. Many thanks to all, especially to Doug
and John. It should have worked all the time with John's code
above but due to a stupidity on my part (I specified "end" as
"start + count" and not as "start + count - 1") the allocation
failed. It was Doug's suggestion to disable resource allocation
in acpi.c -- so the memory area was unused and I could allocate
it. After entering some debugging code into acpi_resource.c and
acpi.c, which do not forgive errors like the above, I found my
bug ;-)

No I learned a bit about acpi and found curious things like this:

When using

  BUS_ALLOC_RESOURCE( device_get_parent(device_get_parent(dev)), ...

it is pci0 appearing in acpi_alloc_resource() to allocate the
resource with the parameters I specify (count == 0x4000).

When using only

  BUS_ALLOC_RESOURCE( device_get_parent(dev), ...

it is hostb0 appearing in acpi_alloc_resource() but count
got changed to 0x80. However start and end remain unchanged
and do not match end = start + count - 1 anymore.

Thanks again,

	-Andre
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic