机器设备驱动程序
机器设备驱动程序为系统配置和可靠性,可用性和可维护性 (RAS) 子系统提供了特定于平台的硬件的接口。 机器设备驱动程序支持以下用于从用户方式访问此硬件的 特殊文件 : /dev/nvram 和 /dev/bus0 ... /dev/busN ,其中 N 是总线号。 /dev/nvram 特殊文件 提供对特殊非易失性随机存取存储器 (RAM) 的访问,以便存储或检索错误信息和系统引导信息。 /dev/busN 特殊文件提供对 I/O 总线的访问以用于系统配置和诊断目的。 此设备驱动程序及其关联的特殊文件的存在和使用是特定于平台的,并且不得由一般应用程序使用。
程序必须具有相应的特权才能打开特殊文件 /dev/nvram 或 /dev/busN。 它还必须具有打开公共硬件参考平台 (CHRP) 总线特殊文件 /dev/pciN或 /dev/isaN的相应特权。
驱动程序初始化和终止
对于机器设备驱动程序,不存在特殊初始化和终止需求。 此驱动程序以静态方式绑定到操作系统内核,并在内核初始化期间进行初始化。 此设备驱动程序不支持终止,并且无法卸载。
/dev/nvram 特殊文件支持
打开和关闭子例程
机器设备驱动程序支持 /dev/nvram 特殊文件作为多路复用字符特殊文件。 此特殊文件以及对 NVRAM 的支持仅在此硬件平台上提供,以支持系统配置和 RAS 子系统。 这些子系统打开具有通道名称 n的 /dev/nvram/n 特殊文件,并指定要访问的数据区。 例外情况是未指定通道的 /dev/nvram 文件,该文件提供了对常规 NVRAM 控制功能和前面板上的 LED 显示屏的访问。
可使用特殊通道名称 基 来读取作为引导记录的一部分存储的基本定制信息。 此信息最初是由 保存库 命令复制到磁盘的,并且仅由驱动程序在引导时复制。 基 定制信息只可以读取一次。 首次关闭 /dev/nvram/base 文件时,将释放包含基本定制信息的缓冲区。 后续打开操作将返回 ENOENT 错误代码。
读写子例程
不支持 写 子例程,并返回 ENODEV 错误代码。 仅在成功打开 基 通道后,才支持 读 子例程。 读 子例程从与指定的通道关联的数据区传输数据。 传输从由以下项指定的偏移量 (在通道的数据区内) 开始:offset与子例程调用上使用的文件指针相关联的字段。
在 读 子例程上,如果在达到传输计数之前到达数据区的末尾,那么返回在到达数据区的末尾之前读取的字节数。 如果 读 子例程在数据区结束时启动,那么将读取零字节。 如果 读 子例程在数据区结束后启动,那么驱动程序将返回一个 ENXIO 错误代码。
寻求 子例程可以用来更改要在后续 读 调用中使用的起始数据区偏移量。
ioctl 操作
在成功打开 /dev/nvram/ 特殊文件之后,可以向机器设备驱动程序发出以下 ioctl 操作:
操作 | 描述 |
---|---|
IOCINFO | 返回调用者的 开发信息 结构中的机器设备驱动程序信息 (由 阿尔格 参数指向)。 此结构在 /usr/include/sys/devinfo.h 文件中定义。 此设备驱动程序的设备类型为 DD_PSEU。 |
MIOGETKEY | 返回钥匙锁的状态。 阿尔格 参数必须指向一个 mach_dd_io 结构。 该md_data字段必须指向一个整数; 此字段包含返回时键锁的状态。 注: 并非所有平台都具有软件可以读取的物理密钥锁。 对于这些平台,在引导时建立状态。
|
MIOGETPS | 返回电源状态。 阿尔格 参数必须指向一个 mach_dd_io 结构。 该md_data字段必须指向整数; 此字段包含返回时的电源状态。 注: 并非所有平台都提供电源状态。
|
MIOIPLCB | 返回引导控制块中的内容。 阿尔格 参数设置为指向 mach_dd_io 结构,该结构描述了要放置引导控制块的数据区。 此控制块的格式在 /usr/include/sys/iplcb.h 文件中指定, mach_dd_io 结构在 /usr/include/sys/mdio.h 文件中定义。 此 ioctl 操作在 mach_dd_io 结构中使用以下字段:
注: 此控制块中的区域依赖于平台。
|
MIONVGET | 从 NVRAM 地址中读取数据,并在调用者提供的缓冲区中返回数据。 此操作对于读取 NVRAM 的 ROS 区域很有用。 定义此区域的结构位于 /usr/include/sys/mdio.h 文件中。 在符合PowerPC参考平台或通用硬件参考平台的系统中,不支持使用此ioctl操作,在AIX® 4.2.1及更高版本中,会导致该操作以EINVAL错误代码失败。 |
MIONVLED | 将在 阿尔格 参数中找到的值写入系统前面板指示灯显示屏。 在此面板上,有三个数字可用,并且 阿尔格 参数值的范围可以从 0 到十六进制 FFF。 可以在 /usr/include/sys/mdio.h 文件中找到 LED 代码的说明。 注: 并非所有平台都具有指示灯。
|
MIONVPUT | 将数据从调用者所提供的缓冲区写入 NVRAM 地址。 此操作仅用于更新 NVRAM 的 ROS 区域,并且仅由系统命令使用。 在 NVRAM 的其他区域使用此操作可能会导致发生不可预测的结果。 如果提供的 NVRAM 地址在 ROS 区域内,那么将为该 ROS 区域生成新的循环冗余码 (CRC)。 在符合 PowerPC Reference Platform 或 Common Hardware Reference Platform 的系统上,不支持使用此 ioctl 操作,这将导致操作失败并产生 EINVAL 错误代码。 |
针对系统的 ioctl 操作
以下四个ioctl操作只能用于基于 POWER® 处理器的架构。 如果与其他系统一起使用,或者提供了无效的偏移地址,大小或插槽号,那么这些操作将返回 EINVAL 错误代码。
可以从用户空间或内核空间 (通过使用 fp_ioctl 内核服务) 调用这些 ioctl 操作,但是这些操作仅在进程环境中可用。
ioctl 参数必须是一个指向 mach_dd_io 结构的指针。
获取该锁定以序列化对总线插槽配置寄存器的访问。
MIOVPDGET
此 ioctl 操作允许对 VPD/ROM 地址空间进行读访问。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定要开始读取的功能部件或 VPD 地址空间的偏移量。 |
ulong md_size | 指定要传输的字节的数目。 |
char md_data | 指定指向数据的用户缓冲区的指针。 |
INT md_sla | 指定插槽号 (总线插槽配置选择)。 |
INT md_incr | 需要字节访问权 (MV_BYTE)。 |
读取从基地址 0xFFA00000开始。 将偏移量添加到基地址以获取用于读取的起始地址。
所选总线槽的 buc_info 结构用于获取字增量值。 此值在读取数据时执行正确的寻址。
MIOCFGGET
此 ioctl 操作允许对体系结构配置寄存器进行读访问。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定配置寄存器地址空间中的偏移量。 |
ulong md_size | 1 值为 1。 |
char md_data | 指定指向数据的用户缓冲区的指针。 |
INT md_sla | 指定插槽号 (总线插槽配置选择)。 |
INT md_incr | 需要字节或单词访问权 (MV_BYTE, MV_SHORT或 MV_WORD)。 |
基地址 0xFF200000 将添加到偏移量以获取所读取的地址。
MIOCFGPUT
此 ioctl 操作允许对体系结构配置寄存器进行写访问。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定配置寄存器地址空间中的偏移量。 |
ulong md_size | 1 值为 1。 |
char md_data | 指定指向要写入的数据的用户缓冲区的指针。 |
INT md_sla | 指定插槽号 (总线插槽配置选择)。 |
INT md_incr | 需要字节或单词访问权 (MV_BYTE, MV_SHORT或 MV_WORD)。 |
基地址 0xFF200000 将添加到偏移量以获取所读取的地址。
MIORESET
此 ioctl 操作允许访问体系结构的总线插槽重置寄存器。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定复位挂起时间 (以纳秒计)。 |
ulong md_size | 不使用。 |
char md_data | 不使用。 |
INT md_sla | 指定插槽号 (总线插槽配置选择)。 |
INT md_incr | 不使用。 |
对应于指定的总线插槽的总线插槽复位寄存器 0 设置为 0。 在指定延迟后,将位设置回 1 ,并将控制权返回给调用程序。
如果重置暂挂时间为 0 ,那么总线插槽在返回到调用过程时保持重置。
适用于 PowerPC® 参考平台规范和公共硬件参考平台的 ioctl 操作
以下四个 ioctl 操作只能与 PowerPC Reference Platform 和 Common Hardware Reference Platform 配合使用。
MIOGEARD
扫描全局环境区域中的变量名称,如果找到,那么会将以 null 结束的字符串返回给调用者。 全局变量的格式为: "variablename="。 返回的字符串的格式为 "variablename=string"。 如果提供的全局变量为 "* =" ,那么将返回全局环境区域中的所有变量字符串。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指向以等号作为最后一个非空字符的结尾为空值的全局变量字符串的指针。 |
ulong md_size | 数据缓冲区中的字节数。 |
INT md_incr | 不使用。 |
char md_data | 指向数据缓冲区的指针。 |
INT md_sla | 不使用。 |
ulong md_length | 它是一个指针,它指向返回的全局变量字符串 (包括空终止符) 的长度。md_length不为零。 |
MIOGEAUPD
如果指定的全局变量不存在,那么会将其添加到全局环境区域。 如果指定的变量在全局环境区域中存在,那么新内容将在调整任何大小变化量后替换旧内容。 此外,移动到较低地址的任何信息都将原始区域置零。 如果没有跟在变量名称和等号后面的字符串,那么将删除指定的变量。 如果找不到要删除的变量,那么将发生成功返回。 新信息将写入 NVRAM中。 此外,还会更新 NVRAM 操作中的头,以包含全局环境区域的更新时间,并且会重新计算 CRC 值。
您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指向以 null 结束的全局变量字符串的指针。 |
ulong md_size | 不使用。 |
INT md_incr | 不使用。 |
char md_data | 不使用。 |
INT md_sla | 不使用。 |
ulong md_length | 它是一个指针,该指针指向更新后在全局环境区域中剩余的空间量。 它的计算方式是面积的大小减去所有全局变量字符串的长度再减去阈值。 |
MIOGEAST
将设置指定的阈值,以便完成的任何更新不会超过全局环境区域大小减去该阈值。 在代替 姆迪奥 结构时,将使用整数值来指定阈值。 此阈值不会在所有 IPL 中持久存储。
MIOGEARDA
全局环境区域的属性将返回到由调用者指定的数据区。 gea_attrib 结构将添加到 mdio.h。 它包含以下信息:
结构成员 | 描述 |
---|---|
长整型 gea_length | NVRAM的全局环境区域中的字节数。 |
长整型 gea_used | 全局环境区域中使用的字节数。 |
长整型 gea_thresh | 全局环境区域阈值。 |
ulong md_addr | 不使用。 |
ulong md_size | 数据缓冲区的大小。 此值必须大于或等于 (盖阿特里卜) 的大小。 |
INT md_incr | 不使用。 |
char md_data | 要复制 盖阿特里卜 结构的缓冲区的地址。 |
INT md_sla | 不使用。 |
ulong md_length | 不使用。 |
MIONVPARTLEN
CHRP NVRAM 分区的长度将返回至由调用者指定的数据区。 您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定分区特征符。 |
ulong *md_length | 指定指向该分区的名称的指针。 |
INT md_incr | 不使用。 |
ulong md_size | 指定所返回分区长度的数据区。 |
char *md_data | 不使用。 |
INT md_sla | 不使用。 |
MIONVPARTRD
MIONVPARTRD 在 CHRP NVRAM 分区上执行读操作。 您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定分区特征符。 |
ulong *md_length | 指定指向该分区的名称的指针。 |
INT md_incr | 指定分区中的开始偏移量。 |
ulong md_size | 指定要读取的字节的数目。 |
char *md_data | 指定指向要在其中复制数据的用户缓冲区的指针。 |
INT md_sla | 不使用。 |
MIONVPARTUPD
MIONVPARTUPD 对 CHRP NVRAM 分区执行写操作。 您必须提供以下结构成员:
结构成员 | 描述 |
---|---|
ulong md_addr | 指定分区特征符。 |
ulong *md_length | 指定指向该分区的名称的指针。 |
INT md_incr | 指定分区中的开始偏移量。 |
ulong md_size | 指定要读取的字节的数目。 |
char *md_data | 指定一个指向要写入数据的用户缓冲区的指针。 |
INT md_sla | 不使用。 |
错误代码
使用 /dev/nvram/n 特殊文件访问机器设备驱动程序时,可能会返回以下错误情况:
错误条件 | 描述 |
---|---|
EACCES | 请求了对仅为读访问而打开的文件进行写操作。 |
ENOENT | 第一次关闭后尝试打开 /dev/nvram/base 。 |
EFAULT | 由调用者指定的缓冲区在 读, 写或 ioctl 子例程调用中无效。 |
EINVAL | 发出了无效的 ioctl 操作。 |
ENXIO | 尝试在通道指定的数据区结束后进行读取操作。 |
ENODEV | 已尝试写入。 |
ENOMEM | 已使用用户提供的缓冲区发出请求,该缓冲区对于所请求的数据而言太小,或者无法分配足够的内存来完成该请求。 |
总线特殊文件支持
所有型号都至少有一个总线。 对于非 CHRP 系统,名称的格式为 /dev/busN。 CHRP 系统的格式为 /dev/pciN 和 /dev/isaN。
打开和关闭子例程
机器设备驱动程序支持将总线特殊文件作为字符特殊文件。 这些特殊文件以及对 I/O 总线和控制器访问的支持是在此硬件平台上提供的,用于专门支持系统配置和诊断子系统。 配置子系统将通过机器设备驱动程序来访问 I/O 总线和控制器以确定系统的 I/O 配置。 此驱动程序还可用于根据需要配置 I/O 控制器和设备,以便进行正确的系统操作。 如果系统诊断测试无法通过设备自己的设备驱动程序所提供的诊断功能来访问设备,那么它们可能会使用机器设备驱动程序来尝试进一步的故障隔离。
读写子例程
机器设备驱动程序通过总线特殊文件不支持 读 和 写 子例程,如果调用了这些子例程,那么会在 错误号 全局变量中返回 ENOENT 返回码。
ioctl 操作
总线 ioctl 操作允许在系统 I/O 控制器或系统 I/O 总线与由调用者提供的数据区之间进行数据传输。 因为这些 ioctl 操作使用 mach_dd_io 结构,所以 ioctl 子例程上的 阿尔格 参数必须指向这样的结构。 总线地址,指向调用者的缓冲区的指针以及传输的数量和长度都在 mach_dd_io 结构中指定。 mach_dd_io 结构在 /usr/include/sys/mdio.h 文件中定义,并提供以下信息:
- 该md_addr字段包含 I/O 控制器或 I/O 总线地址。
- 该md_data字段指向缓冲区,至少为该字段中的值的大小。md_size:NONE.
- 该md_size字段包含要转移的项目数。
- 该md_incr字段指定已传输项的长度。 必须将其设置为 MV_BYTE, MV_SHORT或 MV_WORD。
在成功打开总线特殊文件之后,可以向机器设备驱动程序发出以下命令:
命令 | 描述 |
---|---|
IOCINFO | 返回调用者的 开发信息 结构中的机器设备驱动程序信息 (由 阿尔格 参数指定)。 此结构在 /usr/include/sys/devinfo.h 文件中定义。 此设备驱动程序的设备类型为 DD_PSEU。 |
MIOBUSGET | 从总线 I/O 空间中读取数据并将其返回到调用者提供的缓冲区中。 |
MIOBUSPUT | 将在调用者的缓冲区中提供的数据写入总线 I/O 空间。 |
MIOMEMGET | 从总线内存空间中读取数据并将其返回至调用者提供的缓冲区。 |
MIOMEMPUT | 将在调用者提供的缓冲区中提供的数据写入总线内存空间。 |
MIOPCFGET | 从 PCI 总线配置空间中读取数据并将其返回到调用者提供的缓冲区中。 mach_dd_io 结构字段 姆斯拉 必须包含要访问的设备的 "设备号" 和 "功能号"。 |
MIOPCFPPUT | 将在调用者的缓冲区中提供的数据写入 PCI 总线配置空间。 mach_dd_io 结构字段 姆斯拉 必须包含要访问的设备的 "设备号" 和 "功能号"。 |
错误代码
项 | 描述 |
---|---|
EFAULT | 在 ioctl 调用时,由调用者指定的缓冲区无效。 |
EIO | 在请求的数据传输上发生不可恢复的 I/O 错误。 |
ENOMEM | 机器设备驱动程序无法分配任何内存以在数据传输中使用。 |
文件
项 | 描述 |
---|---|
/dev/pciN | 提供对 I/O 总线 (CHRP 和 AIX 操作系统) 的访问权。 |
/dev/isaN | 提供对 I/O 总线 (CHRP 和 AIX 操作系统) 的访问权。 |
/dev/nvram | 提供对特定于平台的非易失性 RAM 的访问。 |
/dev/nvram/base | 允许对基本定制信息进行读访问,这些信息作为引导记录的一部分存储。 |