d_map_list 内核服务
用途
对虚拟地址列表执行特定于平台的 DMA 映射。
语法
#include <sys/dma.h> int d_map_list (*handle, flags, minxfer, *virt_list, *bus_list)
struct d_handle *handle;
int flags;
int minxfer;
struct dio *virt_list;
struct dio *bus_list;注: 当在 映射初始化 调用上设置 DMA_ADDRESS_64 和 DMA_ENABLE_64 标志时,以下是 映射列表 的接口定义。
int d_map_list (*handle, flags, minxfer, *virt_list, *bus_list)
struct d_handle *handle;
int flags;
int minxfer;
struct dio_64 *virt_list;
struct dio_64 *bus_list;参数
| 项 | 描述 |
|---|---|
| 句柄 (handle) | 指示 映射初始化 内核服务所返回的唯一句柄。 |
| 标志 | 指定下列其中一个标志:
|
| 明克斯费尔 | 指定该设备的最小传输大小。 |
| 虚拟列表 | 指定虚拟缓冲区地址和长度的列表。 |
| 总线列表 | 指定总线地址和长度的列表。 |
描述
映射列表 内核服务是特定于总线的实用程序例程,由 映射初始化 内核服务确定,它接受虚拟地址和大小的列表并提供生成的总线地址列表。 此服务会填写相应的总线地址列表,以供设备在执行 DMA 传输时使用。 此服务支持设备的散射/收集功能,并且还允许设备组合多个与设备相关的连续请求。 这些列表通过 迪奥 结构进行传递。 如果由于耗尽所提供的 迪奥 结构的容量而导致 映射列表 服务无法完成映射,那么将返回 DMA_DIOFULL 错误。 如果由于耗尽了映射所需的资源而导致 映射列表 服务无法完成映射,那么将返回 DMA_NORES 错误。 在这两种情况下, 迪奥 虚拟列表的 Bytes_done 字段都设置为已成功映射的字节数。 此字节计数是设备的 明克斯费尔 大小的倍数 (在调用 映射列表时提供)。 雷西季奥夫 字段将设置为列表中剩余 伊奥韦茨 个字段的索引。 除非设置了 DMA_BYPASS 标志,否则此服务将验证每个页面的访问许可权。 如果在具有该列表的页面上迂到访问违例,那么将返回 DMA_NOACC 错误,并且 Bytes_done 字段设置为发生故障之前的字节数 伊奥韦茨。 如果该映射是短期的 (即,在 I/O 完成后立即取消映射) ,那么必须设置 DMA_STMAP 标志。
注意:
- 当接收到 DMA_NOACC 返回值时,不执行任何映射,并且未定义总线列表。 在此情况下, 雷西季奥夫 字段将设置为迂到访问违例的 伊奥韦茨 的索引。
- 您可以使用 /usr/include/sys/dma.h 文件中提供的 D_MAP_LIST 宏来编码对 d_map_list 内核服务的调用。
返回值
| 项 | 描述 |
|---|---|
| DMA_NORES | 指示映射期间资源已耗尽。 |
已映射 注: 映射列表 个可能的部分传输。 设备驱动程序可能继续进行部分传输,并在后续 映射列表 调用时提交其余项,或者调用 未映射列表 以撤销部分映射。 如果发出了部分传输,那么在 I/O 完成时,驱动程序必须调用 未映射列表 。
| 项 | 描述 |
|---|---|
| DMA_DIOFULL | 指示目标总线列表已变满。 |
已映射 注: 映射列表 个可能的部分传输。 设备驱动程序可以继续进行部分传输,并在后续 映射列表 调用时提交剩余部分,或者调用 未映射列表 以撤销部分映射。 如果发出了部分传输,那么在 I/O 完成时,驱动程序必须调用 未映射列表 。
| 项 | 描述 |
|---|---|
| DMA_NOACC | 指示对列表中的页面没有访问许可权。 |
.
注: 映射列表 未执行任何映射。 设备驱动程序不需要调用 未映射列表,但是驱动程序必须使故障 I/O 请求失败,然后在后续 映射列表 调用中重新提交任何剩余项。
| 项 | 描述 |
|---|---|
| DMA_SUCC | 指示已成功映射整个传输。 |
已成功执行 注: 映射列表 映射。 I/O 完成时,设备驱动程序必须调用 未映射列表 。 如果是长期映射,那么当不再需要该长期映射时,驱动程序必须调用 未映射列表 。