d_map_page 内核服务
用途
对单个页面执行特定于平台的 DMA 映射。
语法
#include <sys/dma.h>
#include <sys/xmem.h>
int d_map_page(*handle, flags, baddr, *busaddr, *xmp)
struct d_handle *handle;
int flags;
caddr_t baddr;
uint *busaddr;
struct xmem *xmp;注: 当在 映射初始化 调用上设置 DMA_ADDRESS_64 和 DMA_ENABLE_64 标志时,以下是 映射页 的接口定义。
int d_map_page(*handle, flags, baddr, *busaddr, *xmp)
struct d_handle *handle;
int flags;
unsigned long long baddr;
unsigned long long *busaddr;
struct xmem *xmp;参数
| 项 | 描述 |
|---|---|
| 句柄 (handle) | 指示 映射初始化 内核服务所返回的唯一句柄。 |
| 标志 | 指定下列其中一个标志:
|
| 巴德尔 | 指定缓冲区地址。 |
| 布萨德尔 | 指向 " 布萨德尔 " 字段。 |
| Xmp | 用于缓冲区的跨内存描述符。 |
描述
映射页 内核服务是特定于总线的实用程序例程,由 映射初始化 或 _map_init_ext 内核服务确定,用于对 DMA 主设备的单个 4KB 或更少传输执行特定于平台的映射。 映射页 内核服务是一个快速路径版本的 映射列表 服务。 为了使用此服务,整个传输量必须在单个页面内合适。 此服务接受虚拟地址,并完成相应的总线地址,以便设备在 DMA 传输中使用。 除非设置了 DMA_BYPASS 标志,否则此服务还会验证对页面的访问许可权。 如果该映射是短期的 (即,在 I/O 完成后立即取消映射) ,那么必须设置 DMA_STMAP 标志。
如果该缓冲区是全局内核空间缓冲区,那么可以将跨内存描述符设置为指向已导出的 全局 跨内存描述符 xmem_global。
如果由于资源限制而无法映射该传输,那么 映射页 服务将返回 DMA_NORES。 如果由于页面访问违例而无法映射该传输,那么此服务将返回 DMA_NOACC。
注: 您可以使用 /usr/include/sys/dma.h 文件中提供的 D_MAP_PAGE 宏来编码对 d_map_page 内核服务的调用。
返回值
| 项 | 描述 |
|---|---|
| DMA_NORES | 指示资源不可用。 |
注: 映射页 未完成任何映射,设备驱动程序必须等待资源释放后,然后重试 映射页 调用。
| 项 | 描述 |
|---|---|
| DMA_NOACC | 指示没有对页面的访问许可权。 |
注: 映射页 未完成映射,设备驱动程序必须使相应的 I/O 请求失败。
| 项 | 描述 |
|---|---|
| DMA_SUCC | 指示 布萨德尔 参数包含要用于设备传输的总线地址。 |
注: 映射页 已成功完成映射,设备驱动程序必须在 I/O 完成时调用 _unmap_page ,或者在长期映射的情况下设备驱动程序已完成映射区域时调用。