diff options
Diffstat (limited to '01-blackmagic-dma.patch')
-rw-r--r-- | 01-blackmagic-dma.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/01-blackmagic-dma.patch b/01-blackmagic-dma.patch new file mode 100644 index 000000000000..7f762071eaec --- /dev/null +++ b/01-blackmagic-dma.patch @@ -0,0 +1,118 @@ +diff --git a/blackmagic_core.c b/blackmagic_core.c +index 0400061..19706f2 100644 +--- a/blackmagic-12.3a10/blackmagic_core.c ++++ b/blackmagic-12.3a10/blackmagic_core.c +@@ -485,11 +485,19 @@ bool dl_pci_start(void* pci_dev) + #define BMD_DMA_32_MASK DMA_32BIT_MASK + #endif + ++#if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ if (dma_set_mask(&pdev->dev, BMD_DMA_64_MASK) < 0) ++ { ++ if (dma_set_mask(&pdev->dev, BMD_DMA_32_MASK) < 0) ++ goto fail; ++ } ++#else + if (pci_set_dma_mask(pdev, BMD_DMA_64_MASK) < 0) + { + if (pci_set_dma_mask(pdev, BMD_DMA_32_MASK) < 0) + goto fail; + } ++#endif + + return true; + +diff --git a/blackmagic_dma.c b/blackmagic_dma.c +index f44235c..7a8bddf 100644 +--- a/blackmagic-12.3a10/blackmagic_dma.c ++++ b/blackmagic-12.3a10/blackmagic_dma.c +@@ -53,6 +53,7 @@ + #include <asm/uaccess.h> + + #include "blackmagic_lib.h" ++#include "blackmagic_version.h" + + struct dl_dma_entry + { +@@ -81,13 +82,23 @@ static inline int bmd_to_linux_direction(int direction) + { + switch (direction) + { ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ case DL_DMA_TO_DEVICE: return DMA_TO_DEVICE; ++ case DL_DMA_FROM_DEVICE: return DMA_FROM_DEVICE; ++ case DL_DMA_BIDIRECTIONAL: return DMA_BIDIRECTIONAL; ++ #else + case DL_DMA_TO_DEVICE: return PCI_DMA_TODEVICE; + case DL_DMA_FROM_DEVICE: return PCI_DMA_FROMDEVICE; + case DL_DMA_BIDIRECTIONAL: return PCI_DMA_BIDIRECTIONAL; ++ #endif + default: + break; + } ++#if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ return DMA_NONE; ++#else + return PCI_DMA_NONE; ++#endif + } + + static unsigned long dl_dma_get_num_pages(void *address, unsigned long size) +@@ -136,7 +147,11 @@ dl_dma_map_user_buffer(void* page_array, unsigned long num_pages, int direction, + + for (i = 0; i < num_pages; i++) + { ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ e->dma_addr = dma_map_page(pdev, pages[i], 0, PAGE_SIZE, direction); ++ #else + e->dma_addr = pci_map_page(pdev, pages[i], 0, PAGE_SIZE, direction); ++ #endif + e = next_entry(e); + } + +@@ -171,14 +186,22 @@ dl_dma_map_kernel_buffer(void *address, unsigned long size, int direction, int i + { + page = vmalloc_to_page((void*)(unsigned long)start_addr + offset); + offset += PAGE_SIZE; ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ e->dma_addr = dma_map_page(pdev, page, 0, PAGE_SIZE, direction); ++ #else + e->dma_addr = pci_map_page(pdev, page, 0, PAGE_SIZE, direction); ++ #endif + e = next_entry(e); + } + sl->num_pages = num_pages; + } + else + { ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ e->dma_addr = dma_map_single(pdev, address, size, direction); ++ #else + e->dma_addr = pci_map_single(pdev, address, size, direction); ++ #endif + sl->dma_is_single = 1; + sl->size = size; + } +@@ -226,12 +249,21 @@ void dl_dma_unmap_kernel_buffer(struct dl_dma_list* sl, int direction) + { + for (i = 0; i < sl->num_pages; i++) + { ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ dma_unmap_page(&sl->pdev->dev, e->dma_addr, PAGE_SIZE, direction); ++ #else + pci_unmap_page(sl->pdev, e->dma_addr, PAGE_SIZE, direction); ++ #endif + e = next_entry(e); + } + } +- else ++ else { ++ #if KERNEL_VERSION_OR_LATER(5, 18, 0) ++ dma_unmap_single(&sl->pdev->dev, e->dma_addr, sl->size, direction); ++ #else + pci_unmap_single(sl->pdev, e->dma_addr, sl->size, direction); ++ #endif ++ } + + destroy_dl_dma_entry(sl); + } |