Двухадресный цикл отображения PCI
Отображения DAC не требуют внешних ресурсов, поэтому нет необходимости явно освобождать их после использования. Следует, однако, относиться к DAC отображениям как и другим потоковым отображениям и соблюдать правила, касающиеся владения буфером. Существует набор функций для синхронизации буферов DMA, которые аналогичны универсальному варианту: Для DAC отображений используется специальный тип… Читать ещё >
Двухадресный цикл отображения PCI (реферат, курсовая, диплом, контрольная)
Обычно, уровень поддержки DMA работает с 32-х разрядными шинными адресами, возможно, ограниченными маской DMA определённого устройства. Шина PCI, однако, также поддерживает 64-х разрядный режим адресации с циклом двойной адресации (double-address cycle, DAC). Универсальный уровень DMA не поддерживает этот режим по ряду причин, первая из которых в том, что это возможность специфична для PCI. Кроме того, во многих реализациях DAC в лучшем случае глючит и поскольку DAC медленнее, чем обычный, 32-х разрядный DMA, это может быть накладным расходом. Тем не менее, существуют приложения, где использование DAC может быть тем, что делать правильно; если вы имеете устройство, которое может работать с очень большими буферами, размещёнными в верхней памяти, вы можете рассмотреть вопрос о реализации поддержки DAC. Эта поддержка доступна только для шины PCI, так что должны быть использованы процедуры, предназначенные для PCI.
Для использования DAC ваш драйвер должен подключить. Вы должны установить отдельную маску DMA:
int pci_dac_set_dma_mask (struct pci_dev *pdev, u64 mask);
Вы можете использовать DAC адресацию только если эта функция возвращает 0.
Для DAC отображений используется специальный тип (dma64_addr_t). Чтобы установить одно из таких отображений, вызовите pci_dac_page_to_dma:
dma64_addr_t pci_dac_page_to_dma (struct pci_dev *pdev, struct page *page,.
unsigned long offset, int direction);
Вы заметите, что DAC отображения могут быть сделаны только из указателей struct page (в конце концов, они должны находиться в верхней памяти, или в их использовании нет смысла); они должны быть созданы одной страницей за раз. Аргумент direction является эквивалентом PCI для enum dma_data_direction, используемого в универсальном уровне DMA; он должен быть PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE или PCI_DMA_BIDIRECTIONAL.
Отображения DAC не требуют внешних ресурсов, поэтому нет необходимости явно освобождать их после использования. Следует, однако, относиться к DAC отображениям как и другим потоковым отображениям и соблюдать правила, касающиеся владения буфером. Существует набор функций для синхронизации буферов DMA, которые аналогичны универсальному варианту:
void pci_dac_dma_sync_single_for_cpu (struct pci_dev *pdev,.
dma64_addr_t dma_addr,.
size_t len,.
int direction);
void pci_dac_dma_sync_single_for_device (struct pci_dev *pdev,.
dma64_addr_t dma_addr,.
size_t len,.
int direction);