DragonFly BSD
DragonFly kernel List (threaded) for 2006-03
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: MSI(-X) interface RFC (was: MSI prototype)


From: "Chuck Tuffli" <ctuffli@xxxxxxxxx>
Date: Wed, 1 Mar 2006 11:46:37 -0800

On 2/26/06, Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxx> wrote:
. ..
>     I was assuming bus_alloc_sub_resource() would be where the table entry
>     number is specified / allocated / reserved.  But bus_setup_intr() would
>     be responsible for actually installing it.

Ok, something like:

struct resource *
bus_alloc_sub_resource(struct resource *parent, int rid, u_long start
        u_long end, u_long count, u_int flags);

where the parameters have similar meanings to those previously defined
except that rid now specifies the table entry. For example,

    struct resource *parent, *msix[4];
    int     vec_start;
    void    *msix_h[4];

    /* E.g. #1 - allocate 4 MSI-X vectors */
    parent = bus_alloc_resource(dev, SYS_RES_MSIX, &vec_start,
            SYS_VECTOR_MIN, SYS_VECTOR_MAX, 4/* count */, RF_ACTIVE);
    /* how to assign every other MSI-X table entry a vector */
    for (i=0; i<4; i++) {
        msix[i] = bus_alloc_sub_resource(parent, 2*i, vec_start+i,
                vec_start+i, 1, 0);
        bus_setup_intr(dev, msix[i], 0, handler, handler_arg,
                &msix_h[i], NULL);
    }
. ..
    /* E.g. #2 - allocate 2 MSI-X vectors used for 4 table entries */
    parent = bus_alloc_resource(dev, SYS_RES_MSIX, &vec_start,
            SYS_VECTOR_MIN, SYS_VECTOR_MAX, 2/* count */, RF_ACTIVE);
    /* example of vector aliasing (each vector used multiple times) */
    for (i=0; i<4; i++) {
        msix[i] = bus_alloc_sub_resource(parent, i, vec_start+(i%2),
                vec_start+(i%2), 1, 0);
        bus_setup_intr(dev, msix[i], 0, handler, handler_arg,
                &msix_h[i], NULL);
    }

MSI would look similar to the above except the rid would always be
zero because MSI only has a single table entry. If a resource count is
greater than 1, bus_setup_intr will return an error.

---chuck




[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]