BUS_ALLOC_RESOURCE(9)

名称
bus_alloc_resource - バス上の資源の割り当て

書式
<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)

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

引数は以下の通りです。

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 に 0 の値を end に ~0 の値を指定した場合には、バスのためのデフォルト値が計算されます。

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

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

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

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

RF_SHAREABLE
    資源は同時共有を許可します。 その資源が共有不可であることを知らない場合、常に設定されるべきです。 バスが共有をサポートしていない場合、 このフラグを取り除くのはバスのコードの仕事です。この例として、 pccard/cardbus ではデバイスを共有できるかできないかは、バスに依存します。

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

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

使用例
これはあるサンプルのコードです。 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(dev, SYS_RES_IRQ, &irqid,
    			0ul, ~0ul, 1, RF_ACTIVE | RF_SHAREABLE);

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

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