summarylogtreecommitdiffstats
path: root/01-blackmagic-dma.patch
blob: 7f762071eaec0cd3c1ce4c9e53be0d36e0752924 (plain)
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
106
107
108
109
110
111
112
113
114
115
116
117
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);
 }