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_64DMA_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) 指示 映射初始化 内核服务所返回的唯一句柄。
标志 指定下列其中一个标志:
DMA_READ
从设备到内存的传输。
繁忙 DMA
从一个设备到另一个设备的传输。
DMA_BYPASS
请勿检查页面访问权。
DMA_STMAP
指示短期映射。
巴德尔 指定缓冲区地址。
布萨德尔 指向 " 布萨德尔 " 字段。
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 ,或者在长期映射的情况下设备驱动程序已完成映射区域时调用。