Home | History | Annotate | Line # | Download | only in drm
drm_module.c revision 1.15.4.1
      1  1.15.4.1    martin /*	$NetBSD: drm_module.c,v 1.15.4.1 2020/01/05 09:42:05 martin Exp $	*/
      2       1.2  riastrad 
      3       1.2  riastrad /*-
      4       1.2  riastrad  * Copyright (c) 2013 The NetBSD Foundation, Inc.
      5       1.2  riastrad  * All rights reserved.
      6       1.2  riastrad  *
      7       1.2  riastrad  * This code is derived from software contributed to The NetBSD Foundation
      8       1.2  riastrad  * by Taylor R. Campbell.
      9       1.2  riastrad  *
     10       1.2  riastrad  * Redistribution and use in source and binary forms, with or without
     11       1.2  riastrad  * modification, are permitted provided that the following conditions
     12       1.2  riastrad  * are met:
     13       1.2  riastrad  * 1. Redistributions of source code must retain the above copyright
     14       1.2  riastrad  *    notice, this list of conditions and the following disclaimer.
     15       1.2  riastrad  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.2  riastrad  *    notice, this list of conditions and the following disclaimer in the
     17       1.2  riastrad  *    documentation and/or other materials provided with the distribution.
     18       1.2  riastrad  *
     19       1.2  riastrad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20       1.2  riastrad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21       1.2  riastrad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22       1.2  riastrad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23       1.2  riastrad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24       1.2  riastrad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25       1.2  riastrad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26       1.2  riastrad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27       1.2  riastrad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28       1.2  riastrad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29       1.2  riastrad  * POSSIBILITY OF SUCH DAMAGE.
     30       1.2  riastrad  */
     31       1.2  riastrad 
     32       1.2  riastrad #include <sys/cdefs.h>
     33  1.15.4.1    martin __KERNEL_RCSID(0, "$NetBSD: drm_module.c,v 1.15.4.1 2020/01/05 09:42:05 martin Exp $");
     34       1.2  riastrad 
     35       1.2  riastrad #include <sys/types.h>
     36      1.12  riastrad #include <sys/condvar.h>
     37       1.8  riastrad #include <sys/conf.h>
     38       1.2  riastrad #include <sys/device.h>
     39       1.2  riastrad #include <sys/module.h>
     40      1.12  riastrad #include <sys/mutex.h>
     41       1.6  riastrad #include <sys/once.h>
     42       1.4  riastrad #include <sys/reboot.h>
     43       1.2  riastrad #include <sys/systm.h>
     44       1.2  riastrad 
     45       1.6  riastrad #include <linux/mutex.h>
     46       1.6  riastrad 
     47       1.2  riastrad #include <drm/drmP.h>
     48      1.10  riastrad #include <drm/drm_encoder_slave.h>
     49      1.12  riastrad #include <drm/drm_internal.h>
     50       1.9  christos #include <drm/drm_sysctl.h>
     51  1.15.4.1    martin #include <drm/drm_panel.h>
     52       1.2  riastrad 
     53       1.2  riastrad /*
     54      1.15  riastrad  * XXX This is stupid.
     55      1.15  riastrad  *
     56      1.15  riastrad  * 1. Builtin modules are broken: they don't get initialized before
     57      1.15  riastrad  *    autoconf matches devices, but we need the initialization to be
     58      1.15  riastrad  *    run in order to match and attach drmkms drivers.
     59      1.15  riastrad  *
     60      1.15  riastrad  * 2. The following dependencies are _not_ correct:
     61      1.15  riastrad  *    - drmkms can't depend on agp because not all drmkms drivers run
     62      1.15  riastrad  *      on platforms guaranteed to have pci, let alone agp
     63      1.15  riastrad  *    - drmkms_pci can't depend on agp because not all _pci_ has agp
     64      1.15  riastrad  *      (e.g., tegra)
     65      1.15  riastrad  *    - radeon (e.g.) can't depend on agp because not all radeon
     66      1.15  riastrad  *      devices are on platforms guaranteed to have agp
     67      1.15  riastrad  *
     68      1.15  riastrad  * 3. We need to register the agp hooks before we try to attach a
     69      1.15  riastrad  *    device.
     70      1.15  riastrad  *
     71      1.15  riastrad  * 4. The only mechanism we have to force this is the
     72      1.15  riastrad  *    mumblefrotz_guarantee_initialized kludge.
     73      1.15  riastrad  *
     74      1.15  riastrad  * 5. We don't know if we even _can_ call
     75      1.15  riastrad  *    drmkms_agp_guarantee_initialized unless we know NAGP.
     76      1.15  riastrad  *
     77      1.15  riastrad  * 6. We don't know NAGP unless we include "agp.h".
     78      1.15  riastrad  *
     79      1.15  riastrad  * 7. We can't include "agp.h" if the platform has agp.
     80      1.15  riastrad  *
     81      1.15  riastrad  * 8. The way we determine whether we have agp is NAGP.
     82      1.15  riastrad  *
     83      1.15  riastrad  * 9. @!*#&^@&*@!&^#@
     84      1.15  riastrad  */
     85      1.15  riastrad #if defined(__powerpc__) || defined(__i386__) || defined(__x86_64__)
     86      1.15  riastrad #include "agp.h"
     87      1.15  riastrad #endif
     88      1.15  riastrad 
     89      1.15  riastrad /*
     90       1.2  riastrad  * XXX I2C stuff should be moved to a separate drmkms_i2c module.
     91       1.2  riastrad  */
     92      1.11  pgoyette MODULE(MODULE_CLASS_DRIVER, drmkms, "drmkms_linux");
     93       1.2  riastrad 
     94       1.6  riastrad struct mutex	drm_global_mutex;
     95       1.6  riastrad 
     96       1.9  christos struct drm_sysctl_def drm_def = DRM_SYSCTL_INIT();
     97       1.9  christos 
     98       1.6  riastrad static int
     99       1.6  riastrad drm_init(void)
    100       1.6  riastrad {
    101       1.6  riastrad 	extern int linux_guarantee_initialized(void);
    102       1.6  riastrad 	int error;
    103       1.6  riastrad 
    104       1.6  riastrad 	error = linux_guarantee_initialized();
    105       1.6  riastrad 	if (error)
    106       1.6  riastrad 		return error;
    107       1.6  riastrad 
    108      1.15  riastrad 	drm_agp_hooks_init();
    109      1.15  riastrad #if NAGP > 0
    110      1.15  riastrad 	extern int drmkms_agp_guarantee_initialized(void);
    111      1.15  riastrad 	error = drmkms_agp_guarantee_initialized();
    112      1.15  riastrad 	if (error) {
    113      1.15  riastrad 		drm_agp_hooks_fini();
    114      1.15  riastrad 		return error;
    115      1.15  riastrad 	}
    116      1.15  riastrad #endif
    117      1.15  riastrad 
    118       1.6  riastrad 	if (ISSET(boothowto, AB_DEBUG))
    119       1.6  riastrad 		drm_debug = ~(unsigned int)0;
    120       1.6  riastrad 
    121       1.6  riastrad 	spin_lock_init(&drm_minor_lock);
    122       1.6  riastrad 	idr_init(&drm_minors_idr);
    123       1.6  riastrad 	linux_mutex_init(&drm_global_mutex);
    124       1.6  riastrad 	drm_connector_ida_init();
    125       1.7  riastrad 	drm_global_init();
    126  1.15.4.1    martin 	drm_panel_init_lock();
    127  1.15.4.1    martin 	drm_bridge_init_lock();
    128       1.9  christos 	drm_sysctl_init(&drm_def);
    129      1.10  riastrad 	drm_i2c_encoders_init();
    130       1.6  riastrad 
    131       1.6  riastrad 	return 0;
    132       1.6  riastrad }
    133       1.6  riastrad 
    134       1.6  riastrad int
    135       1.6  riastrad drm_guarantee_initialized(void)
    136       1.6  riastrad {
    137       1.5  riastrad #ifdef _MODULE
    138       1.6  riastrad 	return 0;
    139       1.5  riastrad #else
    140       1.6  riastrad 	static ONCE_DECL(drm_init_once);
    141       1.6  riastrad 
    142       1.6  riastrad 	return RUN_ONCE(&drm_init_once, &drm_init);
    143       1.2  riastrad #endif
    144       1.6  riastrad }
    145       1.6  riastrad 
    146       1.6  riastrad static void
    147       1.6  riastrad drm_fini(void)
    148       1.6  riastrad {
    149      1.10  riastrad 
    150      1.10  riastrad 	drm_i2c_encoders_fini();
    151       1.9  christos 	drm_sysctl_fini(&drm_def);
    152  1.15.4.1    martin 	drm_bridge_fini_lock();
    153  1.15.4.1    martin 	drm_panel_fini_lock();
    154       1.7  riastrad 	drm_global_release();
    155       1.6  riastrad 	drm_connector_ida_destroy();
    156       1.6  riastrad 	linux_mutex_destroy(&drm_global_mutex);
    157       1.6  riastrad 	idr_destroy(&drm_minors_idr);
    158       1.6  riastrad 	spin_lock_destroy(&drm_minor_lock);
    159      1.15  riastrad 	drm_agp_hooks_fini();
    160       1.6  riastrad }
    161       1.2  riastrad 
    162      1.12  riastrad int
    163      1.12  riastrad drm_irq_by_busid(struct drm_device *dev, void *data, struct drm_file *file)
    164      1.12  riastrad {
    165      1.12  riastrad 
    166      1.12  riastrad 	return -ENODEV;
    167      1.12  riastrad }
    168      1.12  riastrad 
    169       1.2  riastrad static int
    170       1.2  riastrad drmkms_modcmd(modcmd_t cmd, void *arg __unused)
    171       1.2  riastrad {
    172       1.2  riastrad #ifdef _MODULE
    173       1.2  riastrad 	devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR;
    174       1.6  riastrad #endif
    175       1.2  riastrad 	int error;
    176       1.2  riastrad 
    177       1.2  riastrad 	switch (cmd) {
    178       1.2  riastrad 	case MODULE_CMD_INIT:
    179       1.2  riastrad #ifdef _MODULE
    180       1.6  riastrad 		error = drm_init();
    181       1.6  riastrad #else
    182       1.6  riastrad 		error = drm_guarantee_initialized();
    183       1.6  riastrad #endif
    184       1.6  riastrad 		if (error)
    185       1.6  riastrad 			return error;
    186       1.6  riastrad #ifdef _MODULE
    187       1.2  riastrad 		error = devsw_attach("drm", NULL, &bmajor,
    188       1.2  riastrad 		    &drm_cdevsw, &cmajor);
    189       1.2  riastrad 		if (error) {
    190       1.2  riastrad 			aprint_error("drmkms: unable to attach devsw: %d\n",
    191       1.2  riastrad 			    error);
    192       1.6  riastrad 			return error;
    193       1.2  riastrad 		}
    194       1.2  riastrad #endif
    195       1.2  riastrad 		return 0;
    196       1.2  riastrad 
    197       1.2  riastrad 	case MODULE_CMD_FINI:
    198       1.2  riastrad #ifdef _MODULE
    199       1.2  riastrad 		error = devsw_detach(NULL, &drm_cdevsw);
    200       1.2  riastrad 		if (error)
    201       1.2  riastrad 			return error;
    202       1.2  riastrad #endif
    203       1.6  riastrad 		drm_fini();
    204       1.2  riastrad 		return 0;
    205       1.2  riastrad 
    206       1.2  riastrad 	default:
    207       1.2  riastrad 		return ENOTTY;
    208       1.2  riastrad 	}
    209       1.2  riastrad }
    210