d_map_slave 核心服務

用途

接受虛擬位址和大小的清單,並設定工作者 DMA 控制器。

語法

#include <sys/dma.h>
int d_map_slave (*handle, flags, minxfer, *vlist, chan_flag)
struct d_handle *handle;
int flags;
int minxfer;
struct dio *vlist;
uint chan_flag;

參數

項目 說明
控點 (handle) 指出 d_map_init 核心服務傳回的唯一控點。
旗標 指定下列其中一個旗標:
DMA_READ
從裝置傳送至記憶體。
BUS_DMA
從一個裝置傳送至另一個裝置。
DMA_BYPASS
不檢查頁面存取權。
明克斯費爾 指定裝置的傳送大小下限。
vlist 指定緩衝區位址和長度的清單。
chan_flag 指定傳送的裝置及匯流排特定旗標。

說明

d_map_slave 核心服務接受虛擬緩衝區位址及大小的清單,並為所要求的 DMA 傳送設定工作者 DMA 控制器。 這包括設定特定工作者通道的系統位址產生硬體,以指出指定的資料緩衝區,以及啟用特定硬體通道。 d_map_slave 核心服務不是匯出的核心服務,而是由 d_map_init 核心服務決定並透過 d_handle 結構提供給呼叫者的匯流排特定公用程式常式。

此服務容許工作者 DMA 控制器的散佈/收集功能,也容許裝置驅動程式聯合多個相對於裝置連續的要求。 該清單與 迪奧 結構一起傳遞。 如果 d_map_slave 核心服務由於資源而無法完成對映,則會傳回錯誤 DMA_NORES ,並將 迪奧 清單的 bytes_done 欄位設為已順利對映的位元組數。 此位元組計數保證為提供給 d_map_slave之裝置的 明克斯費爾 參數大小的倍數。 此外, Resid_iov 欄位會設為無法對映之其餘 _iovec 的索引。 除非設定 DMA_BYPASS 旗標,否則此服務將驗證每一個頁面的存取權。 如果在清單內的頁面上發現存取違規,則會傳回錯誤 DMA_NOACC ,且不會執行任何對映。 虛擬清單的 bytes_done 欄位設為錯誤 約韋茨之前的位元組數。 在此情況下, Resid_iov 欄位也會設為發現存取違規之 _iovec 項目的索引。

vlist 參數中提供的虛擬位址可以在多個位址空間內,以 迪奧 清單中每一個元素所指向的跨記憶體結構來識別。 對於相同位址空間中的多個緩衝區,每一個跨記憶體指標都可以指向相同的跨記憶體描述子,對於廣域空間緩衝區,指標可以設為匯出的 GLOBAL 跨記憶體描述子 xmem_global的位址。

明克斯費爾 參數指定裝置支援的絕對資料傳送下限 (裝置區塊傳輸因數)。 如果裝置支援最小傳送 512 個位元組 (例如,軟碟和磁碟) ,則 明克斯費爾 參數會設為 512。 這可讓基礎服務將局部傳送對映至裝置區塊大小的正確倍數。

附註:
  1. d_map_slave 核心服務不支援每個通道有多個未完成的 DMA 傳送。 嘗試在單一通道上執行多個工作者對映會毀損先前的對映。
  2. 您可以使用 /usr/include/sys/dma.h 檔案中提供的 D_MAP_SLAVE 巨集,來撰寫對 d_map_clear 核心服務的呼叫程式碼。
  3. /usr/include/sys/dma.h中可以找到 chan_flag 參數的可能旗標值。 這些旗標可以邏輯地 ORed 在一起,以反映裝置及通道的所需性質。
  4. 如果使用 CH_AUTOINIT 旗標,則 vlist 指標所說明的傳送會限制為長度不大於 4K 個位元組的單一緩衝區位址。

回覆值

項目 說明
DMA_NORES 指出在對映期間耗盡資源。
DMA_NOACC 指出對清單中的頁面沒有存取權。
DMA_BAD_MODE 指出不支援 chan_flag 參數指定的模式。