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.

Do you laugh when the waiter drops a tray full of dishes? Unix weenies do. They're the first ones to laugh at hapless users, trying to figure out an error message that doesn't have anything to do with what they just typed.
— The Unix Haters' handbook