EN JA
BUS_ALLOC_RESOURCE(9)
BUS_ALLOC_RESOURCE(9) FreeBSD Kernel Developer's Manual 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, endcount のための値を設定します (下記の start の説明を参照)。

引数は、次の通りです:

  • dev は、リソースの所有権を要求するデバイスです。割り付けの前に、リソースは、親のバスによって所有されます。
  • type は、割り付けたいリソースのタイプです。それは、次の 1 つです:
    SYS_RES_IRQ
    IRQ のためのタイプ。
    SYS_RES_DRQ
    ISA DMA ラインのためのタイプ。
    SYS_RES_IOPORT
    I/O ポートのためのタイプ。
    SYS_RES_MEMORY
    I/O メモリのためのタイプ。
  • rid は、割り付けてられているリソースを識別するバス特有のハンドルを指します。 ISA に関して、これは、PnP メカニズム、または hints メカニズムのいずれかによって、このデバイスのためにセットアップされるリソースの配列へのインデックスです。 PCCARD に関して、これは、PC カードの CIS のエントリによって記述されたリソースの配列へのインデックスです。 PCI に関して、リソースにアクセスするために使用する BAR がある pci 設定空間へのオフセットです。バスメッソドは、それらがパラメータとして与えられる RID を自由に変更することができます。以前に与えた値に依存してはなりません。
  • startend は、リソースの開始/終了アドレスです。 start のための 0ul、 end のための ~0ul、 count ための 1 の値を指定するなら、バスのためのデフォルト値が計算されます。
  • count は、リソースのサイズです。例えば、I/O ポートのサイズは、通常 1 バイトです (が、いくつかのデバイスは、これを上書きします)。 startend のためのデフォルト値を指定した場合で、 count がデフォルト値より小さいなら、バスのデフォルト値が使用され、それがデフォルト値より大きいなら、 count が使用されます。
  • flags は、リソースのためにフラグを設定します。これらのフラグの 1 つ以上を設定することができます:
    RF_ALLOCATED
    リソースは、予約されました。リソースは、まだ bus_activate_resource(9) で活性化される必要があります。
    RF_ACTIVE
    不可分に、リソースを活性化します。
    RF_SHAREABLE
    リソースは、同時の共有を許可します。リソースを共有することができないことを知らないなら、常に設定されるべきです。それは、バスが共有をサポートしないなら、フラグを除去するためのバスのドライバのタスクです。例えば、 pccard(4) は、IRQ を共有することができませんが、一方 cardbus(4) は、できます。
    RF_TIMESHARE
    リソースは、時分割の共有を許可します。

戻り値

成功すれば、 struct resource へのポインタが返され、そうでなければ、NULL ポインタが返されます。

使用例

これは、32 バイトの I/O ポート範囲と IRQ を割り付けるいくつかのサンプルコードです。 portidirqid の値は、これらの呼び出しの後に、デバイスの 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);

作者

このマニュアルページは、 Alexander Langer <alex@big.endian.de>によって書かれ、部分的に Warner Losh <imp@FreeBSD.org>によって書かれました。
May 18, 2000 FreeBSD