xref: /netbsd-src/sys/external/bsd/drm2/linux/linux_module.c (revision d83a40f33c4c2cc4f15cd537214164eac1721e25)
1*d83a40f3Sriastradh /*	$NetBSD: linux_module.c,v 1.14 2022/09/01 01:54:38 riastradh Exp $	*/
26cb10275Sriastradh 
36cb10275Sriastradh /*-
46cb10275Sriastradh  * Copyright (c) 2014 The NetBSD Foundation, Inc.
56cb10275Sriastradh  * All rights reserved.
66cb10275Sriastradh  *
76cb10275Sriastradh  * This code is derived from software contributed to The NetBSD Foundation
86cb10275Sriastradh  * by Taylor R. Campbell.
96cb10275Sriastradh  *
106cb10275Sriastradh  * Redistribution and use in source and binary forms, with or without
116cb10275Sriastradh  * modification, are permitted provided that the following conditions
126cb10275Sriastradh  * are met:
136cb10275Sriastradh  * 1. Redistributions of source code must retain the above copyright
146cb10275Sriastradh  *    notice, this list of conditions and the following disclaimer.
156cb10275Sriastradh  * 2. Redistributions in binary form must reproduce the above copyright
166cb10275Sriastradh  *    notice, this list of conditions and the following disclaimer in the
176cb10275Sriastradh  *    documentation and/or other materials provided with the distribution.
186cb10275Sriastradh  *
196cb10275Sriastradh  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
206cb10275Sriastradh  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
216cb10275Sriastradh  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
226cb10275Sriastradh  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
236cb10275Sriastradh  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
246cb10275Sriastradh  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
256cb10275Sriastradh  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
266cb10275Sriastradh  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
276cb10275Sriastradh  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
286cb10275Sriastradh  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
296cb10275Sriastradh  * POSSIBILITY OF SUCH DAMAGE.
306cb10275Sriastradh  */
316cb10275Sriastradh 
326cb10275Sriastradh #include <sys/cdefs.h>
33*d83a40f3Sriastradh __KERNEL_RCSID(0, "$NetBSD: linux_module.c,v 1.14 2022/09/01 01:54:38 riastradh Exp $");
346cb10275Sriastradh 
356cb10275Sriastradh #include <sys/module.h>
3677b5597aSriastradh #ifndef _MODULE
3777b5597aSriastradh #include <sys/once.h>
3877b5597aSriastradh #endif
396cb10275Sriastradh 
401d9ce707Sriastradh #include <linux/atomic.h>
41*d83a40f3Sriastradh #include <linux/dma-fence.h>
426cb10275Sriastradh #include <linux/highmem.h>
4377b5597aSriastradh #include <linux/idr.h>
4477b5597aSriastradh #include <linux/io.h>
45aaec65bfSriastradh #include <linux/irq_work.h>
46f576a286Sriastradh #include <linux/kthread.h>
476cb10275Sriastradh #include <linux/mutex.h>
48f3f16f17Sriastradh #include <linux/rcupdate.h>
494e9d6760Sriastradh #include <linux/tasklet.h>
507319b3e1Sriastradh #include <linux/wait_bit.h>
516cb10275Sriastradh #include <linux/workqueue.h>
526cb10275Sriastradh 
531252d3ceSpgoyette MODULE(MODULE_CLASS_MISC, drmkms_linux, "i2cexec");
546cb10275Sriastradh 
5577b5597aSriastradh static int
linux_init(void)5677b5597aSriastradh linux_init(void)
5777b5597aSriastradh {
5877b5597aSriastradh 	int error;
5977b5597aSriastradh 
6077b5597aSriastradh 	error = linux_idr_module_init();
6177b5597aSriastradh 	if (error) {
6277b5597aSriastradh 		printf("linux: unable to initialize idr: %d\n", error);
6377b5597aSriastradh 		goto fail0;
6477b5597aSriastradh 	}
6577b5597aSriastradh 
6677b5597aSriastradh 	error = linux_kmap_init();
6777b5597aSriastradh 	if (error) {
6877b5597aSriastradh 		printf("linux: unable to initialize kmap: %d\n", error);
6977b5597aSriastradh 		goto fail1;
7077b5597aSriastradh 	}
7177b5597aSriastradh 
72f3f16f17Sriastradh 	error = linux_rcu_gc_init();
73f3f16f17Sriastradh 	if (error) {
74f3f16f17Sriastradh 		printf("linux: unable to initialize rcu gc: %d\n", error);
75f3f16f17Sriastradh 		goto fail2;
76f3f16f17Sriastradh 	}
77f3f16f17Sriastradh 
7877b5597aSriastradh 	error = linux_workqueue_init();
7977b5597aSriastradh 	if (error) {
8077b5597aSriastradh 		printf("linux: unable to initialize workqueues: %d\n", error);
81f3f16f17Sriastradh 		goto fail3;
8277b5597aSriastradh 	}
8377b5597aSriastradh 
8477b5597aSriastradh 	error = linux_writecomb_init();
8577b5597aSriastradh 	if (error) {
8677b5597aSriastradh 		printf("linux: unable to initialize write-combining: %d\n",
8777b5597aSriastradh 		    error);
88f3f16f17Sriastradh 		goto fail4;
8977b5597aSriastradh 	}
9077b5597aSriastradh 
911d9ce707Sriastradh 	error = linux_atomic64_init();
921d9ce707Sriastradh 	if (error) {
931d9ce707Sriastradh 		printf("linux: unable to initialize atomic64: %d\n", error);
941d9ce707Sriastradh 		goto fail5;
951d9ce707Sriastradh 	}
961d9ce707Sriastradh 
974e9d6760Sriastradh 	error = linux_tasklets_init();
984e9d6760Sriastradh 	if (error) {
994e9d6760Sriastradh 		printf("linux: unable to initialize tasklets: %d\n", error);
1004e9d6760Sriastradh 		goto fail6;
1014e9d6760Sriastradh 	}
1024e9d6760Sriastradh 
1037319b3e1Sriastradh 	error = linux_wait_bit_init();
1047319b3e1Sriastradh 	if (error) {
1057319b3e1Sriastradh 		printf("linux: unable to initialize wait_bit: %d\n", error);
1067319b3e1Sriastradh 		goto fail7;
1077319b3e1Sriastradh 	}
1087319b3e1Sriastradh 
109f576a286Sriastradh 	error = linux_kthread_init();
110f576a286Sriastradh 	if (error) {
111f576a286Sriastradh 		printf("linux: unable to initialize kthread: %d\n", error);
112f576a286Sriastradh 		goto fail8;
113f576a286Sriastradh 	}
114f576a286Sriastradh 
115aaec65bfSriastradh 	linux_irq_work_init();
116*d83a40f3Sriastradh 	linux_dma_fences_init();
117aaec65bfSriastradh 
11877b5597aSriastradh 	return 0;
11977b5597aSriastradh 
120f576a286Sriastradh fail9: __unused
121f576a286Sriastradh 	linux_kthread_fini();
122f576a286Sriastradh fail8:	linux_wait_bit_fini();
1237319b3e1Sriastradh fail7:	linux_tasklets_fini();
1244e9d6760Sriastradh fail6:	linux_atomic64_fini();
1251d9ce707Sriastradh fail5:	linux_writecomb_fini();
126f3f16f17Sriastradh fail4:	linux_workqueue_fini();
127f3f16f17Sriastradh fail3:	linux_rcu_gc_fini();
12877b5597aSriastradh fail2:	linux_kmap_fini();
12977b5597aSriastradh fail1:	linux_idr_module_fini();
13077b5597aSriastradh fail0:	return error;
13177b5597aSriastradh }
13277b5597aSriastradh 
13377b5597aSriastradh int	linux_guarantee_initialized(void); /* XXX */
13477b5597aSriastradh int
linux_guarantee_initialized(void)13577b5597aSriastradh linux_guarantee_initialized(void)
13677b5597aSriastradh {
13777b5597aSriastradh #ifdef _MODULE
13877b5597aSriastradh 	return 0;
13977b5597aSriastradh #else
14077b5597aSriastradh 	static ONCE_DECL(linux_init_once);
14177b5597aSriastradh 
14277b5597aSriastradh 	return RUN_ONCE(&linux_init_once, &linux_init);
1436cb10275Sriastradh #endif
14477b5597aSriastradh }
14577b5597aSriastradh 
14677b5597aSriastradh static void
linux_fini(void)14777b5597aSriastradh linux_fini(void)
14877b5597aSriastradh {
14977b5597aSriastradh 
150*d83a40f3Sriastradh 	linux_dma_fences_fini();
151aaec65bfSriastradh 	linux_irq_work_fini();
152f576a286Sriastradh 	linux_kthread_fini();
1537319b3e1Sriastradh 	linux_wait_bit_fini();
1544e9d6760Sriastradh 	linux_tasklets_fini();
1551d9ce707Sriastradh 	linux_atomic64_fini();
15677b5597aSriastradh 	linux_writecomb_fini();
15777b5597aSriastradh 	linux_workqueue_fini();
158f3f16f17Sriastradh 	linux_rcu_gc_fini();
15977b5597aSriastradh 	linux_kmap_fini();
160bc2ce81aSchristos 	linux_idr_module_fini();
16177b5597aSriastradh }
1626cb10275Sriastradh 
1636cb10275Sriastradh static int
drmkms_linux_modcmd(modcmd_t cmd,void * arg __unused)1646cb10275Sriastradh drmkms_linux_modcmd(modcmd_t cmd, void *arg __unused)
1656cb10275Sriastradh {
1666cb10275Sriastradh 
1676cb10275Sriastradh 	switch (cmd) {
1686cb10275Sriastradh 	case MODULE_CMD_INIT:
16977b5597aSriastradh #ifdef _MODULE
17077b5597aSriastradh 		return linux_init();
17177b5597aSriastradh #else
17277b5597aSriastradh 		return linux_guarantee_initialized();
1736cb10275Sriastradh #endif
1746cb10275Sriastradh 	case MODULE_CMD_FINI:
17577b5597aSriastradh 		linux_fini();
1766cb10275Sriastradh 		return 0;
1776cb10275Sriastradh 	default:
1786cb10275Sriastradh 		return ENOTTY;
1796cb10275Sriastradh 	}
1806cb10275Sriastradh }
181