スポンサーリンク

BUS_ALLOC_RESOURCE(9) FreeBSD カーネル開発者マニュアル BUS_ALLOC_RESOURCE(9)

名称

bus_alloc_resource, bus_alloc_resource_any − 親のバスからの資源の割り当て

書式

#include <sys/param.h>
#include <sys/bus.h>

#include <machine/bus.h>
#include <sys/rman.h>
#include <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⟩ によって書かれました。

FreeBSD 10.0 May 18, 2000 FreeBSD 10.0

スポンサーリンク