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