BUS_ALLOC_RESOURCE(9)

名称
bus_alloc_resource, bus_alloc_resource_any - 親のバスからの資源の割り当て

書式
<sys/param.h> <sys/bus.h>

<machine/bus.h> <sys/rman.h> <machine/resource.h> struct resource * bus_alloc_resource(device_t dev, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) struct resource * bus_alloc_resource_any(device_t dev, int type, int *rid, u_int flags)

解説
これは資源管理関数群への簡単なインタフェースです。 親のメソッドテーブルを通る間接的な方法を隠蔽します。 この関数は、一般的にアタッチ時に呼び出されるべきですが、 (幾つかの稀な場合を除いて) 決してその前に呼び出してはなりません。

bus_alloc_resource_any() 関数は bus_alloc_resource() のための簡単なラッパです。 これは start, end および count の値としてデフォルトのリソース (下記の start の解説を参照してください) を設定します。

引数は以下の通りです。

dev は、資源の所有を要求するデバイスです。 割り当て前は、資源は親のバスによって所有されています。

type は、割り当てたい資源の型です。 以下の内の 1 つです。

SYS_RES_IRQ
    IRQ 用。

SYS_RES_DRQ
    ISA DMA ライン用。

SYS_RES_IOPORT
    入出力ポート用。

SYS_RES_MEMORY
    入出力メモリ用。

rid は、割り当てている資源を識別する、バス固有のハンドルを指します。 ISA では、PnP の仕組みまたは hints の仕組みを通して、デバイスのために セットアップされている資源の配列へのインデックスです。 PCCARD では、この文章を書いている現時点では同様ですが、 将来の newcard では変わるかもしれません。 PCI では、pci コンフィグ空間において、 資源を記述するワードへのオフセットになっています。 バスのメソッドは、引数として与えられている RID を無制限に変更します。 以前に与えた時の値に依存してはなりません。

start および end は資源の開始/終了アドレスです。 start に 0ul を、 end に ~0ul を、 count に 1 を指定した場合には、バスのためのデフォルト値が計算されます。

count は資源の大きさです。 例えば、入出力ポートの大きさは通常 1 バイトです (しかし、 幾つかのデバイスはこれを上書きします)。 start および end にデフォルト値を指定した場合、 count がデフォルト値よりも小さいならばデフォルト値が使用され、 count がデフォルト値以上ならば count が使用されます。

flags は資源のためのフラグを設定します。 以下のフラグを 1 つ以上設定できます。

RF_ALLOCATED
    資源は既に予約されています。 資源は引続き bus_activate_resource(9) で活性化される必要があります。

RF_ACTIVE
    不可分に、資源を活性化します。

RF_SHAREABLE
    資源は同時共有を許可します。 その資源が共有不可であることを知らない場合、常に設定されるべきです。 そのバスが共有をサポートしていない場合、 このフラグを取り除くのはバスドライバの仕事です。 例えば、 pccard(4) は IRQ を共有できませんが、一方 cardbus(4) は共有できます。

RF_TIMESHARE
    資源は時分割共有を許可します。

戻り値
成功時には struct resource 構造体へのポインタが返され、そうでない場合にはヌルポインタが返されます。

使用例
これは 32 バイトの I/O ポート範囲と IRQ を割り当てるサンプルのコードです。 portid および irqid の値はこれらの呼び出しの後で、デバイスの softc の中に保存されるはずです。

    	struct resource *portres, irqres;
    	int portid, irqid;
    	portid = 0;
    	irqid = 0;
    	portres = bus_alloc_resource(dev, SYS_RES_IOPORT, &portid,
    			0ul, ~0ul, 32, RF_ACTIVE);
    	irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irqid,
    			RF_ACTIVE | RF_SHAREABLE);

関連項目
bus_activate_resource(9), bus_release_resource(9), device(9), driver(9)

作者
このマニュアルページは Alexander Langer <alex@big.endian.de> が書き、部分的に Warner Losh <imp@FreeBSD.org> が書きました。