Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Sep 2015 21:59:24 -0700
From:      "alex.burlyga.ietf alex.burlyga.ietf" <alex.burlyga.ietf@gmail.com>
To:        "Pokala, Ravi" <rpokala@panasas.com>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: bus_.*_resource() and rid
Message-ID:  <CA%2BJhTNRA86ESztWFKTQAZnOp5%2BbSGkSCgB2SDatd_Z29Pe-cBQ@mail.gmail.com>
In-Reply-To: <D214E963.145154%rpokala@panasas.com>
References:  <D214E963.145154%rpokala@panasas.com>

next in thread | previous in thread | raw e-mail | index | archive | help
See  replies in-line.

On Tue, Sep 8, 2015 at 7:37 PM, Pokala, Ravi <rpokala@panasas.com> wrote:
> Hi folks,
>
> I'm modifying a home-grown device driver; this is the first time I've
> played around in device-probe and -attach, so I'm a bit out of my element
> here. This is an LPC device attached to a PCI-ISA bridge (aka the LPC
> controller). It's accessed through IOPORT, and the BIOS sets up enough
> stuff that we can look for it.
>
> One thing that's confusing me is the "rid" which is passed to a bunch of
> the bus_.*_resource() functions. I've looked at bus_set_resource(9),
> bus_alloc_resource(9), and section 10.5 of the Architecture Handbook[1],
> and I'm still confused.
>
> bus_alloc_resource(9) says:
>
>      rid points to a bus specific handle that identifies the resource being
>      allocated.  For ISA this is an index into an array of resources that
> have
>      been setup for this device by either the PnP mechanism, or via the
> hints
>      mechanism. ...
>
>
> But there's no indication as to how we get that index. One possibility is
> that the value passed in doesn't matter; bus_alloc_resource() sets it
> correctly and the caller can use the new value. However, that doesn't
> appear to be the case, since lots of times rid is ignored after the call
> to bus_alloc_resource().

It's a discriminator for the resource type. It's bus specific, so in
case of ISA it's just an integer in a range of 0 to 50(i think).

>
> For the sake of discussion, here are stripped-down versions of our probe
> and attach functions:
>
> xxx_probe_unit(device_t dev)
> {
>         uint32_t ioport_base;
>         uint32_t ioport_size;
>         int rc;
>
>         /* Device identification stuff; details unimportant, but we determine
>          * ioport_base and ioport_size.
>          */
>
>         rc = bus_set_resource(
>             /* dev */ dev,
>             /* type */ SYS_RES_IOPORT,
>             /* rid */ 0,
>             /* start */ ioport_base,
>             /* count */ ioport_size);
> }
>
> Most of those args are obvious, but I have no idea why rid is 0. It looks
> like lots of drivers pass in a rid of 0, and the original author might
> have just shrugged and gone with "convention".

Depends on the device, if it only has one IOPORT then this makes sense.

>
> xxx_attach_unit(device_t dev)
> {
>         struct xxx_softc *sc;
>         int rid;
>         struct resource res;
>
>         sc = device_get_softc(dev);
>
>         /* Device configuration stuff; details unimportant. */
>
>         rid = 0;
>         res = bus_alloc_resource(
>             /* dev */ dev,
>             /* type */ SYS_RES_IOPORT,
>             /* rid */ &rid,
>             /* start */ 0,
>             /* end */ ~0,
>             /* count */ sc->ioport_size,
>             /* flags */ RF_ACTIVE);
>
>         /* save stuff for use with bus_space_{read,write}_1() */
>         sc->iobase_addr = rman_get_start(res);
>         sc->iobase_bustag = rman_get_bustag(res);
>         sc->iobase_bushandle = rman_get_bushandle(res);
>         sc->dev = dev;
> }
>
> Again, most things are fairly obvious, but I have no idea why rid is 0.
> It's passed by reference to bus_alloc_resource(), but the
> potentially-altered value is never stored or used.

You are attaching a driver to a device, so you are actually allocating
resource for the range you claimed in the probe function with
bus_set_resource. Again since device has only one IOPORT, and ISA does
not change "rid" so there is no need to store "rid" anywhere.

>
> The lazy part of me says to just go with blindly passing in 0, because it
> works. However, the new device I'm adding support for will have multiple
> IOPORT ranges associated with it, so I'm not sure if passing 0 is the
> right thing.

I think you have options here, during probe you can go with just 0 as
"rid" but then during allocation you would need to populate start and
end parameters with appropriate offsets. Or you can do "rid" per
IOPORT and then you can retain
0, ~0 for start end and pass appropriate "rid" during attach phase.

>
> Any help would be appreciated.
>
> Thanks,
>
> Ravi
>
> [1]
> https://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/isa-driver-
> resources.html
>
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2BJhTNRA86ESztWFKTQAZnOp5%2BbSGkSCgB2SDatd_Z29Pe-cBQ>