1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
diff --git a/bm_mm.c b/bm_mm.c
index 64ab876..7b2d6a0 100644
--- a/blackmagic-io-12.3a10/bm_mm.c
+++ b/blackmagic-io-12.3a10/bm_mm.c
@@ -54,7 +54,9 @@ struct bm_mmap
bm_user_mem_t umem; // Must be last member in struct
};
-#if KERNEL_VERSION_OR_LATER(2, 6, 27)
+#if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ #define bm_pci_dma_mapping_error(dev, addr) dma_mapping_error(dev, addr)
+#elif KERNEL_VERSION_OR_LATER(2, 6, 27)
#define bm_pci_dma_mapping_error(dev, addr) pci_dma_mapping_error(dev, addr)
#else
#define bm_pci_dma_mapping_error(dev, addr) pci_dma_mapping_error(addr)
@@ -223,8 +225,13 @@ bm_dma_list_t* bm_dma_map_user_buffer(bm_pci_device_t* pci, bm_user_mem_t* umem,
for (i = 0; i < umem->length; ++i)
{
+ #if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ dlist->addrs[i] = dma_map_page(&pci->pdev->dev, umem->pages[i], 0, PAGE_SIZE, dir);
+ if (bm_pci_dma_mapping_error(&pci->pdev->dev, dlist->addrs[i]))
+ #else
dlist->addrs[i] = pci_map_page(pci->pdev, umem->pages[i], 0, PAGE_SIZE, dir);
if (bm_pci_dma_mapping_error(pci->pdev, dlist->addrs[i]))
+ #endif
{
bm_dma_unmap_buffer(pci, dlist, dir);
return NULL;
@@ -246,8 +253,13 @@ bm_dma_list_t* bm_dma_map_kernel_buffer(bm_pci_device_t* pci, void* addr, vm_siz
dlist->contig = 1;
dlist->length = size;
+#if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ dlist->addrs[0] = dma_map_single(&pci->pdev->dev, addr, size, dir);
+ if (bm_pci_dma_mapping_error(&pci->pdev->dev, dlist->addrs[0]))
+#else
dlist->addrs[0] = pci_map_single(pci->pdev, addr, size, dir);
if (bm_pci_dma_mapping_error(pci->pdev, dlist->addrs[0]))
+#endif
{
bm_dma_unmap_buffer(pci, dlist, dir);
return NULL;
@@ -275,8 +287,13 @@ bm_dma_list_t* bm_dma_map_kernel_buffer_vmalloc(bm_pci_device_t* pci, void* addr
for (i = 0; i < n_pages; ++i, offset += PAGE_SIZE)
{
struct page* page = vmalloc_to_page((void*)(aligned_addr + offset));
+ #if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ dlist->addrs[i] = dma_map_page(&pci->pdev->dev, page, 0, PAGE_SIZE, dir);
+ if (bm_pci_dma_mapping_error(&pci->pdev->dev, dlist->addrs[i]))
+ #else
dlist->addrs[i] = pci_map_page(pci->pdev, page, 0, PAGE_SIZE, dir);
if (bm_pci_dma_mapping_error(pci->pdev, dlist->addrs[i]))
+ #endif
{
bm_dma_unmap_buffer(pci, dlist, dir);
return NULL;
@@ -292,7 +309,11 @@ void bm_dma_unmap_buffer(bm_pci_device_t* pci, bm_dma_list_t* dlist, bm_dma_dire
size_t i;
if (dlist->contig)
{
+ #if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ dma_unmap_single(&pci->pdev->dev, dlist->addrs[0], dlist->length, dir);
+ #else
pci_unmap_single(pci->pdev, dlist->addrs[0], dlist->length, dir);
+ #endif
bm_atomic_sub(&statistics.memory_mapped, dlist->length);
}
else
@@ -301,7 +322,11 @@ void bm_dma_unmap_buffer(bm_pci_device_t* pci, bm_dma_list_t* dlist, bm_dma_dire
{
if (dlist->addrs[i])
{
+ #if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ dma_unmap_page(&pci->pdev->dev, dlist->addrs[i], PAGE_SIZE, dir);
+ #else
pci_unmap_page(pci->pdev, dlist->addrs[i], PAGE_SIZE, dir);
+ #endif
bm_atomic_sub(&statistics.pages_mapped, 1);
}
}
diff --git a/bm_pci.c b/bm_pci.c
index 7c21e66..7e5be29 100644
--- a/blackmagic-io-12.3a10/bm_pci.c
+++ b/blackmagic-io-12.3a10/bm_pci.c
@@ -76,11 +76,19 @@ bool bm_pci_start(bm_pci_device_t* pci)
pci_set_master(pci->pdev);
+#if KERNEL_VERSION_OR_LATER(5, 18, 0)
+ if (dma_set_mask(&pci->pdev->dev, BM_DMA_64BIT_MASK) < 0)
+ {
+ if (dma_set_mask(&pci->pdev->dev, BM_DMA_32BIT_MASK) < 0)
+ goto bail;
+ }
+#else
if (pci_set_dma_mask(pci->pdev, BM_DMA_64BIT_MASK) < 0)
{
if (pci_set_dma_mask(pci->pdev, BM_DMA_32BIT_MASK) < 0)
goto bail;
}
+#endif
if (strcmp(default_irq_type, "msi") == 0)
pci_enable_msi(pci->pdev);
|