SOLVED: Reading acpi memory from a driver attached to hostb

2009-07-25 Thread Andre Albsmeier
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, ,end address>, , 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-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-24 Thread Andre Albsmeier
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.

Yes, I've been lucky this time.

> 
> > > | 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 

That's what I hoped as well.

> 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, ,end address>, , RF_ACTIVE);

OK, I have modified my driver exactly this way, but still no success.

It seems my code didn't make it to the list (the attachment
was stripped) so I include it inline now. Testing is quite
simple, every feedback is welcome:

1. check if "devinfo -r" spits out some free "I/O memory addresses"
   ranges under acpi0 with at minimum 4 bytes length.

2. select one of them and assign its start address to rstart in
   eccmon_probe() at the line which reads now

   u_long rstart = 0xfed14000;

   (this is the address I use for testing)

3. compile, kldload and dmesg. I always get the message
   "bus_alloc_resource() returned NULL".

Thanks,

-Andre

 eccmon.c start -

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

struct eccmon_softc {
  device_t  dev;
  int   res_set;/* flag if bus_set_resource() was used 
successfully */
  struct resource*  res;
  int   rid;
};


/**/
/*   eccmon_probe()   */
/**/
static int eccmon_probe( const device_t const dev )
{
  u_long rstart = 0xfed14000;

  int ret;
  struct resource* res;
  int rid = 0;

  device_printf( dev, "probe: started for %x:%x\n", pci_get_vendor( dev ) , 
pci_get_device( dev ) );

  /*
   * try to bus_alloc_resource the resource and give it back
   */

  if( (res = BUS_ALLOC_RESOURCE( device_get_parent(device_get_parent(dev)), 
dev, SYS_RES_MEMORY, &rid, rstart, rstart+4, 4, RF_ACTIVE )) == NULL ) {
device_printf( dev, "bus_alloc_resource() returned NULL\n" );
return ENXIO;
  }

  if( (ret = BUS_RELEASE_RESOURCE( device_get_parent(device_get_parent(dev)), 
dev, SYS_RES_MEMORY, rid, res )) != 0 )
device_printf( dev, "bus_release_resource() returned %d\n", ret );

  return ENXIO;
}


/***/
/*   eccmon_attach()   */
/***/
static int eccmon_attach( const device_t const dev )
{
  device_printf( dev, "attach: started for %x:%x\n", pci_get_vendor( dev ) , 
pci_get_device( dev ) );

  return ENXIO;
}


/***/
/*   eccmon_detach()   */
/***/
static int eccmon_detach( const device_t const dev )
{
  device_printf( dev, "detach: started for %x:%x\n", pci_get_vendor( dev ) , 
pci_get_device( dev ) );

  return 0;
}


/*/
/*   eccmon_identify()   */
/*/
static void eccmon_identify( driver_t *driver, device_t p )
{
  device_printf( p, "identify: start: %x %x\n", pci_get_vendor( p ), 
pci_get_device( p ) );
  device_printf( p, "identify on: %s %d\n", device_get_name( p ), 
device_get_unit(p) );

  if( device_find_child( p, "eccmon", -1 ) == NULL &&
   strcmp( device_get_name( p ), "hostb" ) == 0 &&
   device_get_unit( p ) == 0 ) {

device_t child = device_add_child( p, "eccmon", -1 );
device_printf( p, "identify added child: %p\n", child );
  }
}


/***/
/*   driver(9) stuff   */
/***/
static device_method_t eccmon_methods[] = {
  DEVMETHOD( device_identify,   eccmon_identify ),
  DEVMETHOD( device_probe,  eccmon_probe ),
  DEVMETHOD( device_attach, eccmon_attach ),
  DEVMETHOD( device_detach, eccmon_detach ),
  

Re: Reading acpi memory from a driver attached to hostb

2009-07-23 Thread John Baldwin
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, , , , RF_ACTIVE);

-- 
John Baldwin
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-23 Thread Andre Albsmeier
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...

On Thu, 23-Jul-2009 at 07:25:40 -0700, Doug Ambrisko wrote:
> John Baldwin writes:
> | On Thursday 23 July 2009 2:08:35 am Andre Albsmeier wrote:
> | > On Wed, 22-Jul-2009 at 09:48:56 -0700, Doug Ambrisko wrote:
> | > > Andre Albsmeier writes:
> | > > | > 
stripping some elder stuff
> | > > | 
> | > > | I assume it is possible somehow, I am just too stupid (it is the first
> | > > | driver I wrote). John, for easy reference, here is my initial message:
> | > > | 
> | > > | 
> http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
> | > > | 
> | > > | Please remember all, that I need the access to the acpi0 memory 
> location
> | > > | only for a few reads during probing/attaching, not later.
> | > > | 
> | > > | I have also read somewhere that, when resources are allocated, the
> | > > | system "walks up" the device tree until it finds the resource. Since
> | > > | my driver is below hostb0 and hostb0 is below acpi0 I thought it
> | > > | should work but it doesn't..
> | > > 
> | > > FWIW, you might look at ipmi(4) especially in some early states since
> | > > it can probe and attach in many ways (isa, acpi, pci etc.) and had to
> | > > figure out the best way to attach.  Also it had various front ends.
> | > > If I recall correctly, I did a find for a driver (ie. acpi) then
> | > > select the first instance.  Once you get that handle then you can 
> | > > request device resources from it, get the info you need then release
> | > > that stuff.  However, you won't get the module auto-loading part
> | > > that you would get if you created a module that depended on both.
> | > > That might get you enough of a hint.  Also there are some generic
> | > > stuff to read various memory bits like SMBIOS areas etc.  This is
> | > > used in ipmi(4) as well since the attachment can be defined in SMBIOS.
> | > > If you have a specific question, about why the driver did something
> | > > I should recall that.  The ipmi(4) driver is in fairly clean.  There
> | > > is some improvements I still need to do on probe/attachment that
> | > > causes a bogus ipmi1 at times.
> | > 
> | > Thanks a lot for this interesting information. I see, things are more
> | > complicated than I thought. There is no easy way having a quick glance
> | > at "foreign" memory during probing. Now I have to figure out how to get
> | > the order of probing/attaching done. One thing I could do is:
> | > 
> | > 1. attach mydriver_ACPI to acpi0
> | > 
> | > 2. probe mydriver under hostb0, check if we need access to
> | >sysresources from acpi0 (depends on the chipset found).
> | >If no, goto 5.
> | > 
> | > 3. ask mydriver_ACPI about stuff I want to know (HOW?)
> | > 
> | > 4. tell mydriver to detach from acpi0 (HOW?)
> | > 
> | > 5. attach mydriver to hostb0 and do my work
> | > 
> | > What I would like more is something like:
> | > 
> | > 1. probe mydriver under hostb0, check if we need access to
> | >sysresources from acpi0 (depends on the chipset found).
> | >If no, goto 3.
> | > 
> | > 2. ask mydriver_ACPI to attach to acpi0, give me the info
> | >I want, detach mydriver_ACPI (HOW?)
> | > 
> | > 3. attach mydriver to hostb0 and do my work
> | 
> | 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

> 
> That should basically work since almost everything is a child of acpi.

Thats what I hoped indeed. It would be a lot simpler than
working with two drivers which have to communicate with each other.

> However, the depth could change so running through the device_get_parent
> and then checking the name might be good.

I thought the same so I decided to lookup the acpi devclass
and then acpi0 from there.

To be sure, I compared the resulting pointers of acpi0 with
the one found after the four device_get_parent(). They were
the same.

> 
> BTW, there is an example in sys/compat/linsysfs/linsysfs.c
> in which I run the entire bus tree via linsysfs_run_bus which is
> recursive and started from linsysfs_init.
> 
> As John and I say, you don't need to "attach" to acpi just allocate
> what you need, access it, then release it.  If you need to hold on
> it then it becomes more involved.  Since you never attach then you
> don't need to dettach just release the resources you grabbed (
> ie. bus_release_resource what you bus_alloc_resource).

Well, then I still must be doing something wrong. I have attached
my driver skeleton which does the following:

1. device_identify() which does a device_add_child() if needed

2. device_probe() which just tries to bus_alloc_resource() a
   SYS_RES_MEMORY resource from ac

Re: Reading acpi memory from a driver attached to hostb

2009-07-23 Thread John Baldwin
On Thursday 23 July 2009 10:25:40 am Doug Ambrisko wrote:
> John Baldwin writes:
> | On Thursday 23 July 2009 2:08:35 am Andre Albsmeier wrote:
> | > On Wed, 22-Jul-2009 at 09:48:56 -0700, Doug Ambrisko wrote:
> | > > Andre Albsmeier writes:
> | > > | On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
> | > > | > On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
> | > > | > 
> | > > | > > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> | > > | > >> Andre Albsmeier wrote:
> | > > | > >>> [CC'ing this to Rui Paulo since he tried to help me a while 
ago]
> | > > | > >>>
> | > > | > >>> Since my driver is a child of hostb0, I have no idea of how to  
> | > > | > >>> access
> | > > | > >>> acpi0's memory area. Here is a devinfo -r to make things 
clear:
> | > > | > >>>
> | > > | > >> ...
> | > > | > >>>
> | > > | > >>> 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?
> | > > | > >>>
> | > > | > >>
> | > > | > >> You can probably make two drivers in one which cooperate to
> | > > | > >> allow access to both sets of resources.
> | > > | > >
> | > > | > > Hmm, that's what I meant by: Attach two drivers -- one as child 
of  
> | > > | > > acpi
> | > > | > > and another as child of hostb...
> | > > | > >
> | > > | > > And that's similar to Rui Paulo's suggestion a while ago:
> | > > | > >
> | > > | > >> 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.
> | > > | > >
> | > > | > > But in order to attach to acpi0, I need to say
> | > > | > >
> | > > | > > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  
NULL,  
> | > > | > > NULL );
> | > > | > >
> | > > | > > instead of
> | > > | > >
> | > > | > > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  
NULL,  
> | > > | > > NULL );
> | > > | > >
> | > > | > > This way I could attach to acpi but not to hostb anymore
> | > > | > >
> | > > | > > I have searched the net for solutions, I have read 
newbus-draft.txt
> | > > | > > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to 
all
> | > > | > > of these my driver is working on other mainboards where it 
doesn't
> | > > | > > have to access foreign memory) but didn't find anything.
> | > > | > 
> | > > | > I'm out of ideas.
> | > > | > John, do you know if this is a newbus limitation or if it can be  
> | > > | > worked around ?
> | > > | 
> | > > | I assume it is possible somehow, I am just too stupid (it is the 
first
> | > > | driver I wrote). John, for easy reference, here is my initial 
message:
> | > > | 
> | > > | 
http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
> | > > | 
> | > > | Please remember all, that I need the access to the acpi0 memory 
location
> | > > | only for a few reads during probing/attaching, not later.
> | > > | 
> | > > | I have also read somewhere that, when resources are allocated, the
> | > > | system "walks up" the device tree until it finds the resource. Since
> | > > | my driver is below hostb0 and hostb0 is below acpi0 I thought it
> | > > | should work but it doesn't..
> | > > 
> | > > FWIW, you might look at ipmi(4) especially in some early states since
> | > > it can probe and attach in many ways (isa, acpi, pci etc.) and had to
> | > > figure out the best way to attach.  Also it had various front ends.
> | > > If I recall correctly, I did a find for a driver (ie. acpi) then
> | > > select the first instance.  Once you get that handle then you can 
> | > > request device resources from it, get the info you need then release
> | > > that stuff.  However, you won't get the module auto-loading part
> | > > that you would get if you created a module that depended on both.
> | > > That might get you enou

Re: Reading acpi memory from a driver attached to hostb

2009-07-23 Thread Doug Ambrisko
John Baldwin writes:
| On Thursday 23 July 2009 2:08:35 am Andre Albsmeier wrote:
| > On Wed, 22-Jul-2009 at 09:48:56 -0700, Doug Ambrisko wrote:
| > > Andre Albsmeier writes:
| > > | On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
| > > | > On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
| > > | > 
| > > | > > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
| > > | > >> Andre Albsmeier wrote:
| > > | > >>> [CC'ing this to Rui Paulo since he tried to help me a while ago]
| > > | > >>>
| > > | > >>> Since my driver is a child of hostb0, I have no idea of how to  
| > > | > >>> access
| > > | > >>> acpi0's memory area. Here is a devinfo -r to make things clear:
| > > | > >>>
| > > | > >> ...
| > > | > >>>
| > > | > >>> 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?
| > > | > >>>
| > > | > >>
| > > | > >> You can probably make two drivers in one which cooperate to
| > > | > >> allow access to both sets of resources.
| > > | > >
| > > | > > Hmm, that's what I meant by: Attach two drivers -- one as child of  
| > > | > > acpi
| > > | > > and another as child of hostb...
| > > | > >
| > > | > > And that's similar to Rui Paulo's suggestion a while ago:
| > > | > >
| > > | > >> 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.
| > > | > >
| > > | > > But in order to attach to acpi0, I need to say
| > > | > >
| > > | > > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL, 
 
| > > | > > NULL );
| > > | > >
| > > | > > instead of
| > > | > >
| > > | > > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  
NULL,  
| > > | > > NULL );
| > > | > >
| > > | > > This way I could attach to acpi but not to hostb anymore
| > > | > >
| > > | > > I have searched the net for solutions, I have read newbus-draft.txt
| > > | > > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
| > > | > > of these my driver is working on other mainboards where it doesn't
| > > | > > have to access foreign memory) but didn't find anything.
| > > | > 
| > > | > I'm out of ideas.
| > > | > John, do you know if this is a newbus limitation or if it can be  
| > > | > worked around ?
| > > | 
| > > | I assume it is possible somehow, I am just too stupid (it is the first
| > > | driver I wrote). John, for easy reference, here is my initial message:
| > > | 
| > > | http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
| > > | 
| > > | Please remember all, that I need the access to the acpi0 memory location
| > > | only for a few reads during probing/attaching, not later.
| > > | 
| > > | I have also read somewhere that, when resources are allocated, the
| > > | system "walks up" the device tree until it finds the resource. Since
| > > | my driver is below hostb0 and hostb0 is below acpi0 I thought it
| > > | should work but it doesn't..
| > > 
| > > FWIW, you might look at ipmi(4) especially in some early states since
| > > it can probe and attach in many ways (isa, acpi, pci etc.) and had to
| > > figure out the best way to attach.  Also it had various front ends.
| > > If I recall correctly, I did a find for a driver (ie. acpi) then
| > > select the first instance.  Once you get that handle then you can 
| > > request device resources from it, get the info you need then release
| > > that stuff.  However, you won't get the module auto-loading part
| > > that you would get if you created a module that depended on both.
| > > That might get you enough of a hint.  Also there are some generic
| > > stuff to read various memory bits like SMBIOS areas etc.  This is
| > > used in ipmi(4) as well since the attachment can be defined in SMBIOS.
| > > If you have a specific question, about why the driver did something
| > > I should 

Re: Reading acpi memory from a driver attached to hostb

2009-07-23 Thread John Baldwin
On Thursday 23 July 2009 2:08:35 am Andre Albsmeier wrote:
> On Wed, 22-Jul-2009 at 09:48:56 -0700, Doug Ambrisko wrote:
> > Andre Albsmeier writes:
> > | On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
> > | > On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
> > | > 
> > | > > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> > | > >> Andre Albsmeier wrote:
> > | > >>> [CC'ing this to Rui Paulo since he tried to help me a while ago]
> > | > >>>
> > | > >>> Since my driver is a child of hostb0, I have no idea of how to  
> > | > >>> access
> > | > >>> acpi0's memory area. Here is a devinfo -r to make things clear:
> > | > >>>
> > | > >> ...
> > | > >>>
> > | > >>> 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?
> > | > >>>
> > | > >>
> > | > >> You can probably make two drivers in one which cooperate to
> > | > >> allow access to both sets of resources.
> > | > >
> > | > > Hmm, that's what I meant by: Attach two drivers -- one as child of  
> > | > > acpi
> > | > > and another as child of hostb...
> > | > >
> > | > > And that's similar to Rui Paulo's suggestion a while ago:
> > | > >
> > | > >> 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.
> > | > >
> > | > > But in order to attach to acpi0, I need to say
> > | > >
> > | > > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,  
> > | > > NULL );
> > | > >
> > | > > instead of
> > | > >
> > | > > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,  
> > | > > NULL );
> > | > >
> > | > > This way I could attach to acpi but not to hostb anymore
> > | > >
> > | > > I have searched the net for solutions, I have read newbus-draft.txt
> > | > > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
> > | > > of these my driver is working on other mainboards where it doesn't
> > | > > have to access foreign memory) but didn't find anything.
> > | > 
> > | > I'm out of ideas.
> > | > John, do you know if this is a newbus limitation or if it can be  
> > | > worked around ?
> > | 
> > | I assume it is possible somehow, I am just too stupid (it is the first
> > | driver I wrote). John, for easy reference, here is my initial message:
> > | 
> > | http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
> > | 
> > | Please remember all, that I need the access to the acpi0 memory location
> > | only for a few reads during probing/attaching, not later.
> > | 
> > | I have also read somewhere that, when resources are allocated, the
> > | system "walks up" the device tree until it finds the resource. Since
> > | my driver is below hostb0 and hostb0 is below acpi0 I thought it
> > | should work but it doesn't..
> > 
> > FWIW, you might look at ipmi(4) especially in some early states since
> > it can probe and attach in many ways (isa, acpi, pci etc.) and had to
> > figure out the best way to attach.  Also it had various front ends.
> > If I recall correctly, I did a find for a driver (ie. acpi) then
> > select the first instance.  Once you get that handle then you can 
> > request device resources from it, get the info you need then release
> > that stuff.  However, you won't get the module auto-loading part
> > that you would get if you created a module that depended on both.
> > That might get you enough of a hint.  Also there are some generic
> > stuff to read various memory bits like SMBIOS areas etc.  This is
> > used in ipmi(4) as well since the attachment can be defined in SMBIOS.
> > If you have a specific question, about why the driver did something
> > I should recall that.  The ipmi(4) driver is in fairly clean.  There
> > is some improvements I still need to do on probe/attachment that
> > causes a bogus ipmi1 at times.
> 
> Thanks a lot for this interesting information. I see, things are mo

Re: Reading acpi memory from a driver attached to hostb

2009-07-22 Thread Andre Albsmeier
On Wed, 22-Jul-2009 at 09:48:56 -0700, Doug Ambrisko wrote:
> Andre Albsmeier writes:
> | On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
> | > On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
> | > 
> | > > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> | > >> Andre Albsmeier wrote:
> | > >>> [CC'ing this to Rui Paulo since he tried to help me a while ago]
> | > >>>
> | > >>> Since my driver is a child of hostb0, I have no idea of how to  
> | > >>> access
> | > >>> acpi0's memory area. Here is a devinfo -r to make things clear:
> | > >>>
> | > >> ...
> | > >>>
> | > >>> 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?
> | > >>>
> | > >>
> | > >> You can probably make two drivers in one which cooperate to
> | > >> allow access to both sets of resources.
> | > >
> | > > Hmm, that's what I meant by: Attach two drivers -- one as child of  
> | > > acpi
> | > > and another as child of hostb...
> | > >
> | > > And that's similar to Rui Paulo's suggestion a while ago:
> | > >
> | > >> 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.
> | > >
> | > > But in order to attach to acpi0, I need to say
> | > >
> | > > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,  
> | > > NULL );
> | > >
> | > > instead of
> | > >
> | > > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,  
> | > > NULL );
> | > >
> | > > This way I could attach to acpi but not to hostb anymore
> | > >
> | > > I have searched the net for solutions, I have read newbus-draft.txt
> | > > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
> | > > of these my driver is working on other mainboards where it doesn't
> | > > have to access foreign memory) but didn't find anything.
> | > 
> | > I'm out of ideas.
> | > John, do you know if this is a newbus limitation or if it can be  
> | > worked around ?
> | 
> | I assume it is possible somehow, I am just too stupid (it is the first
> | driver I wrote). John, for easy reference, here is my initial message:
> | 
> | http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
> | 
> | Please remember all, that I need the access to the acpi0 memory location
> | only for a few reads during probing/attaching, not later.
> | 
> | I have also read somewhere that, when resources are allocated, the
> | system "walks up" the device tree until it finds the resource. Since
> | my driver is below hostb0 and hostb0 is below acpi0 I thought it
> | should work but it doesn't..
> 
> FWIW, you might look at ipmi(4) especially in some early states since
> it can probe and attach in many ways (isa, acpi, pci etc.) and had to
> figure out the best way to attach.  Also it had various front ends.
> If I recall correctly, I did a find for a driver (ie. acpi) then
> select the first instance.  Once you get that handle then you can 
> request device resources from it, get the info you need then release
> that stuff.  However, you won't get the module auto-loading part
> that you would get if you created a module that depended on both.
> That might get you enough of a hint.  Also there are some generic
> stuff to read various memory bits like SMBIOS areas etc.  This is
> used in ipmi(4) as well since the attachment can be defined in SMBIOS.
> If you have a specific question, about why the driver did something
> I should recall that.  The ipmi(4) driver is in fairly clean.  There
> is some improvements I still need to do on probe/attachment that
> causes a bogus ipmi1 at times.

Thanks a lot for this interesting information. I see, things are more
complicated than I thought. There is no easy way having a quick glance
at "foreign" memory during probing. Now I have to figure out how to get
the order of probing/attaching done. One thing I could do is:

1. attach mydriver_ACPI to acpi0

2. probe mydriver under hostb0

Re: Reading acpi memory from a driver attached to hostb

2009-07-20 Thread John Baldwin
On Saturday 18 July 2009 9:39:38 am Andre Albsmeier wrote:
> On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
> > On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
> > 
> > > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> > >> Andre Albsmeier wrote:
> > >>> [CC'ing this to Rui Paulo since he tried to help me a while ago]
> > >>>
> > >>> Since my driver is a child of hostb0, I have no idea of how to  
> > >>> access
> > >>> acpi0's memory area. Here is a devinfo -r to make things clear:
> > >>>
> > >> ...
> > >>>
> > >>> 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?
> > >>>
> > >>
> > >> You can probably make two drivers in one which cooperate to
> > >> allow access to both sets of resources.
> > >
> > > Hmm, that's what I meant by: Attach two drivers -- one as child of  
> > > acpi
> > > and another as child of hostb...
> > >
> > > And that's similar to Rui Paulo's suggestion a while ago:
> > >
> > >> 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.
> > >
> > > But in order to attach to acpi0, I need to say
> > >
> > > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,  
> > > NULL );
> > >
> > > instead of
> > >
> > > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,  
> > > NULL );
> > >
> > > This way I could attach to acpi but not to hostb anymore
> > >
> > > I have searched the net for solutions, I have read newbus-draft.txt
> > > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
> > > of these my driver is working on other mainboards where it doesn't
> > > have to access foreign memory) but didn't find anything.
> > 
> > I'm out of ideas.
> > John, do you know if this is a newbus limitation or if it can be  
> > worked around ?
> 
> I assume it is possible somehow, I am just too stupid (it is the first
> driver I wrote). John, for easy reference, here is my initial message:
> 
> http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html
> 
> Please remember all, that I need the access to the acpi0 memory location
> only for a few reads during probing/attaching, not later.
> 
> I have also read somewhere that, when resources are allocated, the
> system "walks up" the device tree until it finds the resource. Since
> my driver is below hostb0 and hostb0 is below acpi0 I thought it
> should work but it doesn't..

I think you want to probably patch hostb0 to let bus_set_resource() work and 
then use that.  You could also just explicitly by-pass hostb0 and allocate a 
resource from its parent as a quick hack.  The PCI bus should pass the requst 
up to acpi0.  That is, do:

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

instead of

bus_alloc_resource(dev, ...);

-- 
John Baldwin
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-20 Thread Andre Albsmeier
On Mon, 20-Jul-2009 at 14:05:34 +0300, Andriy Gapon wrote:
> on 18/07/2009 17:06 Julian Elischer said the following:
> > Andre Albsmeier wrote:
> >> But in order to attach to acpi0, I need to say
> >>
> >> DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,
> >> NULL );
> >>
> >> instead of
> >>
> >> DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,
> >> NULL );
> > 
> > try both  with different devclass and other args.
> 
> Just to expand on Julian's words.
> You can create eccmon and e.g. eccmon_acpi such that they are different 
> drivers
> (on different buses) in newbus sense, but logically they can share data or
> otherwise cooperate.

Very interesting code, I still haven't understood all of it but
we will see...

This could be the solution -- however, if somebody knows a more
simple way, please let me know.

Thanks,

-Andre

> 
> /sys/dev/cpufreq/ichss.c prior to rev. 177041 used to be like that.
> 
> -- 
> Andriy Gapon
> ___
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

-- 
Amateurs like Linux, but professionals prefer FreeBSD.
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-20 Thread Andriy Gapon
on 18/07/2009 17:06 Julian Elischer said the following:
> Andre Albsmeier wrote:
>> But in order to attach to acpi0, I need to say
>>
>> DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,
>> NULL );
>>
>> instead of
>>
>> DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,
>> NULL );
> 
> try both  with different devclass and other args.

Just to expand on Julian's words.
You can create eccmon and e.g. eccmon_acpi such that they are different drivers
(on different buses) in newbus sense, but logically they can share data or
otherwise cooperate.

/sys/dev/cpufreq/ichss.c prior to rev. 177041 used to be like that.

-- 
Andriy Gapon
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-18 Thread Julian Elischer

Andre Albsmeier wrote:

On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:

Andre Albsmeier wrote:

[CC'ing this to Rui Paulo since he tried to help me a while ago]

Since my driver is a child of hostb0, I have no idea of how to access
acpi0's memory area. Here is a devinfo -r to make things clear:


...

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?


You can probably make two drivers in one which cooperate to
allow access to both sets of resources.


Hmm, that's what I meant by: Attach two drivers -- one as child of acpi
and another as child of hostb...

And that's similar to Rui Paulo's suggestion a while ago:


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.


But in order to attach to acpi0, I need to say

DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL, NULL );

instead of

DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL, NULL );


try both  with different devclass and other args.



This way I could attach to acpi but not to hostb anymore

I have searched the net for solutions, I have read newbus-draft.txt
and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
of these my driver is working on other mainboards where it doesn't
have to access foreign memory) but didn't find anything.

Thanks,

-Andre


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-18 Thread Andre Albsmeier
On Sat, 18-Jul-2009 at 10:25:06 +0100, Rui Paulo wrote:
> On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:
> 
> > On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> >> Andre Albsmeier wrote:
> >>> [CC'ing this to Rui Paulo since he tried to help me a while ago]
> >>>
> >>> Since my driver is a child of hostb0, I have no idea of how to  
> >>> access
> >>> acpi0's memory area. Here is a devinfo -r to make things clear:
> >>>
> >> ...
> >>>
> >>> 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?
> >>>
> >>
> >> You can probably make two drivers in one which cooperate to
> >> allow access to both sets of resources.
> >
> > Hmm, that's what I meant by: Attach two drivers -- one as child of  
> > acpi
> > and another as child of hostb...
> >
> > And that's similar to Rui Paulo's suggestion a while ago:
> >
> >> 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.
> >
> > But in order to attach to acpi0, I need to say
> >
> > DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,  
> > NULL );
> >
> > instead of
> >
> > DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,  
> > NULL );
> >
> > This way I could attach to acpi but not to hostb anymore
> >
> > I have searched the net for solutions, I have read newbus-draft.txt
> > and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
> > of these my driver is working on other mainboards where it doesn't
> > have to access foreign memory) but didn't find anything.
> 
> I'm out of ideas.
> John, do you know if this is a newbus limitation or if it can be  
> worked around ?

I assume it is possible somehow, I am just too stupid (it is the first
driver I wrote). John, for easy reference, here is my initial message:

http://lists.freebsd.org/pipermail/freebsd-hackers/2009-July/029127.html

Please remember all, that I need the access to the acpi0 memory location
only for a few reads during probing/attaching, not later.

I have also read somewhere that, when resources are allocated, the
system "walks up" the device tree until it finds the resource. Since
my driver is below hostb0 and hostb0 is below acpi0 I thought it
should work but it doesn't..

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-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-18 Thread Rui Paulo

On 18 Jul 2009, at 09:10, Andre Albsmeier wrote:


On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:

Andre Albsmeier wrote:

[CC'ing this to Rui Paulo since he tried to help me a while ago]

Since my driver is a child of hostb0, I have no idea of how to  
access

acpi0's memory area. Here is a devinfo -r to make things clear:


...


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?



You can probably make two drivers in one which cooperate to
allow access to both sets of resources.


Hmm, that's what I meant by: Attach two drivers -- one as child of  
acpi

and another as child of hostb...

And that's similar to Rui Paulo's suggestion a while ago:


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.


But in order to attach to acpi0, I need to say

DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL,  
NULL );


instead of

DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL,  
NULL );


This way I could attach to acpi but not to hostb anymore

I have searched the net for solutions, I have read newbus-draft.txt
and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
of these my driver is working on other mainboards where it doesn't
have to access foreign memory) but didn't find anything.


I'm out of ideas.
John, do you know if this is a newbus limitation or if it can be  
worked around ?


--
Rui Paulo

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-18 Thread Andre Albsmeier
On Fri, 17-Jul-2009 at 12:53:53 -0700, Julian Elischer wrote:
> Andre Albsmeier wrote:
> > [CC'ing this to Rui Paulo since he tried to help me a while ago]
> > 
> > Since my driver is a child of hostb0, I have no idea of how to access
> > acpi0's memory area. Here is a devinfo -r to make things clear:
> > 
> ...
> > 
> > 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?
> > 
> 
> You can probably make two drivers in one which cooperate to
> allow access to both sets of resources.

Hmm, that's what I meant by: Attach two drivers -- one as child of acpi
and another as child of hostb...

And that's similar to Rui Paulo's suggestion a while ago:

> 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.

But in order to attach to acpi0, I need to say

DRIVER_MODULE( eccmon, acpi, eccmon_driver, eccmon_devclass,  NULL, NULL );

instead of

DRIVER_MODULE( eccmon, hostb, eccmon_driver, eccmon_devclass,  NULL, NULL );

This way I could attach to acpi but not to hostb anymore

I have searched the net for solutions, I have read newbus-draft.txt
and newbus-intro.txt and Warner Losh's newbus-led.c (thanks to all
of these my driver is working on other mainboards where it doesn't
have to access foreign memory) but didn't find anything.

Thanks,

-Andre
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Re: Reading acpi memory from a driver attached to hostb

2009-07-17 Thread Julian Elischer

Andre Albsmeier wrote:

[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:
  0xc-0xd
  0xe-0xf
  0xf000-0xf3ff
  0xfec0-0xfec00fff
  0xfed13000-0xfed19fff <--- the memory needed
  0xfed1c000-0xfed1
  
  0xfed2-0xfed3
  0xfff0-0x
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:
0xe400-0xe7ff
  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



You can probably make two drivers in one which cooperate to
allow access to both sets of resources.





___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"


Reading acpi memory from a driver attached to hostb

2009-07-17 Thread Andre Albsmeier
[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:
  0xc-0xd
  0xe-0xf
  0xf000-0xf3ff
  0xfec0-0xfec00fff
  0xfed13000-0xfed19fff <--- the memory needed
  0xfed1c000-0xfed1
  
  0xfed2-0xfed3
  0xfff0-0x
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:
0xe400-0xe7ff
  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-0x9
>  0xc-0xd
>  0xe-0xf
>  0x10-0x7fff
>  0xf000-0xf3ff
>  0xfec0-0xfec00fff
>  0xfed13000-0xfed19fff<---
>  0xfed1c000-0xfed1
>  0xfed2-0xfed3
>  0xfed5-0xfed8
>  0xfee0-0xfee00fff
>  0xffb0-0xffbf
>  0xfff0-0x
>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
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"