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
|
--- src/nvidia/nvidia_ctl.c.orig 2021-01-21 21:50:34 UTC
+++ src/nvidia/nvidia_ctl.c
@@ -13,6 +13,12 @@
#include "nv.h"
#include "nv-freebsd.h"
+#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */
+#include <compat/linux/linux_util.h>
+
+const char nvidia_driver_name[] = "nvidia";
+#endif
+
static d_open_t nvidia_ctl_open;
static void nvidia_ctl_dtor(void *arg);
static d_ioctl_t nvidia_ctl_ioctl;
@@ -138,6 +144,18 @@ static int nvidia_ctl_poll(
int nvidia_ctl_attach(void)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
+
if (nvidia_count == 0) {
nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw,
CDEV_CTL_MINOR,
@@ -145,6 +163,10 @@ int nvidia_ctl_attach(void)
"%s", nvidia_ctl_cdevsw.d_name);
if (nvidia_ctl_cdev == NULL)
return ENOMEM;
+
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_register_handler(&nvidia_ctl_linux_handler);
+#endif
}
nvidia_count++;
@@ -153,10 +175,25 @@ int nvidia_ctl_attach(void)
int nvidia_ctl_detach(void)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
nvidia_count--;
- if (nvidia_count == 0)
+ if (nvidia_count == 0) {
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_unregister_handler(&nvidia_ctl_linux_handler);
+#endif
destroy_dev(nvidia_ctl_cdev);
+ }
return 0;
}
|