tail head cat sleep
QR code linking to this page

manページ  — BUS_ALLOC_RESOURCE

名称

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> によって書かれました。

BUS_ALLOC_RESOURCE (9) May 18, 2000

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

UNIX is a four-letter word!