d_cflush 内核服务

用途

在使用长期 仅限 DMA_WRITE_ONLY 选项映射总线设备 DMA 时,清空处理器和 I/O 通道控制器 (IOCC) 数据高速缓存。

语法

int d_cflush (channel_id, baddr, count, daddr)
int   channel_id;
caddr_t   baddr;
size_t   count;
caddr_t   daddr;

参数

描述
通道标识 指定由 初始化 内核服务返回的 DMA 通道标识。
巴德尔 指定该内存缓冲区的地址。
COUNT 指定内存缓冲区传输的长度 (以字节为单位)。
达德尔 指定对应于传输的设备的地址。

描述

在将进行直接存储器存取 (DMA) 处理的缓冲区中修改数据之后,应调用 内核服务。 通过 DMA 处理,此数据将发送到以下设备: 具有 仅限 DMA_WRITE_ONLY 选项的 主服务器 内核服务已映射设备 DMA 的缓冲区的设备。 如果未使用 仅限 DMA_WRITE_ONLY 选项,或者通过调用 主服务器 内核服务在执行每个 DMA 操作之前映射了缓冲区,那么不需要 内核服务。

内核服务会清空所涉及的高速缓存行的处理器高速缓存,并使先前检索到的可能位于指定通道的 IOCC 缓冲区中的任何数据失效。 这最常见的情况是使用长期缓冲区映射来支持设备或从设备获取 DMA 支持。

长期 DMA 缓冲区映射

将缓冲区池定义为使用总线主 DMA 发送命令和获取来自适配器的响应时,经常使用长期 DMA 缓冲区映射方法。 在通信字段中也会频繁使用此方法,其中缓冲区可以来自公共池 (例如 姆布夫 池或用于协议头的池)。

当使用固定的缓冲区池时, 主服务器 内核服务仅使用一次来映射池的地址和范围。 然后,设备驱动程序修改缓冲区中的数据。 它还必须清空处理器中的数据,并使与设备进行传输时涉及的 IOCC 数据高速缓存失效。 必须使 IOCC 高速缓存失效,因为 IOCC 数据高速缓存中的数据可能由于最近一次执行 DMA 操作而失效,该操作与刚刚为下一次操作修改的缓冲区之间的数据失效。

内核服务允许清空处理器高速缓存,并使必需的 IOCC 高速缓存无效。 设备驱动程序应在修改缓冲区中的数据后,向设备发送命令以启动 DMA 操作之前,使用此服务。

完成 DMA 处理后,设备驱动程序应调用 完整 服务以检查错误,并确保从设备读取的任何数据都已清空到内存。

注: 在 64 位内核上, 内核服务不受支持。

执行环境

可以从 流程中断 环境中调用 内核服务。

返回值

描述
重大安全事件数量 指示转移已成功完成。
EINVAL 指示是否存在无效参数。