LCOV - code coverage report
Current view: top level - drivers/gpu/drm - drm_drv.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 12 295 4.1 %
Date: 2022-12-09 01:23:36 Functions: 1 31 3.2 %

          Line data    Source code
       1             : /*
       2             :  * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org
       3             :  *
       4             :  * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
       5             :  * All Rights Reserved.
       6             :  *
       7             :  * Author Rickard E. (Rik) Faith <faith@valinux.com>
       8             :  *
       9             :  * Permission is hereby granted, free of charge, to any person obtaining a
      10             :  * copy of this software and associated documentation files (the "Software"),
      11             :  * to deal in the Software without restriction, including without limitation
      12             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      13             :  * and/or sell copies of the Software, and to permit persons to whom the
      14             :  * Software is furnished to do so, subject to the following conditions:
      15             :  *
      16             :  * The above copyright notice and this permission notice (including the next
      17             :  * paragraph) shall be included in all copies or substantial portions of the
      18             :  * Software.
      19             :  *
      20             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      21             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      22             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      23             :  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
      24             :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      25             :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      26             :  * DEALINGS IN THE SOFTWARE.
      27             :  */
      28             : 
      29             : #include <linux/debugfs.h>
      30             : #include <linux/fs.h>
      31             : #include <linux/module.h>
      32             : #include <linux/moduleparam.h>
      33             : #include <linux/mount.h>
      34             : #include <linux/pseudo_fs.h>
      35             : #include <linux/slab.h>
      36             : #include <linux/srcu.h>
      37             : 
      38             : #include <drm/drm_cache.h>
      39             : #include <drm/drm_client.h>
      40             : #include <drm/drm_color_mgmt.h>
      41             : #include <drm/drm_drv.h>
      42             : #include <drm/drm_file.h>
      43             : #include <drm/drm_managed.h>
      44             : #include <drm/drm_mode_object.h>
      45             : #include <drm/drm_print.h>
      46             : #include <drm/drm_privacy_screen_machine.h>
      47             : 
      48             : #include "drm_crtc_internal.h"
      49             : #include "drm_internal.h"
      50             : #include "drm_legacy.h"
      51             : 
      52             : MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
      53             : MODULE_DESCRIPTION("DRM shared core routines");
      54             : MODULE_LICENSE("GPL and additional rights");
      55             : 
      56             : static DEFINE_SPINLOCK(drm_minor_lock);
      57             : static struct idr drm_minors_idr;
      58             : 
      59             : /*
      60             :  * If the drm core fails to init for whatever reason,
      61             :  * we should prevent any drivers from registering with it.
      62             :  * It's best to check this at drm_dev_init(), as some drivers
      63             :  * prefer to embed struct drm_device into their own device
      64             :  * structure and call drm_dev_init() themselves.
      65             :  */
      66             : static bool drm_core_init_complete;
      67             : 
      68             : static struct dentry *drm_debugfs_root;
      69             : 
      70             : DEFINE_STATIC_SRCU(drm_unplug_srcu);
      71             : 
      72             : /*
      73             :  * DRM Minors
      74             :  * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
      75             :  * of them is represented by a drm_minor object. Depending on the capabilities
      76             :  * of the device-driver, different interfaces are registered.
      77             :  *
      78             :  * Minors can be accessed via dev->$minor_name. This pointer is either
      79             :  * NULL or a valid drm_minor pointer and stays valid as long as the device is
      80             :  * valid. This means, DRM minors have the same life-time as the underlying
      81             :  * device. However, this doesn't mean that the minor is active. Minors are
      82             :  * registered and unregistered dynamically according to device-state.
      83             :  */
      84             : 
      85           0 : static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
      86             :                                              unsigned int type)
      87             : {
      88           0 :         switch (type) {
      89             :         case DRM_MINOR_PRIMARY:
      90           0 :                 return &dev->primary;
      91             :         case DRM_MINOR_RENDER:
      92           0 :                 return &dev->render;
      93             :         default:
      94           0 :                 BUG();
      95             :         }
      96             : }
      97             : 
      98           0 : static void drm_minor_alloc_release(struct drm_device *dev, void *data)
      99             : {
     100           0 :         struct drm_minor *minor = data;
     101             :         unsigned long flags;
     102             : 
     103           0 :         WARN_ON(dev != minor->dev);
     104             : 
     105           0 :         put_device(minor->kdev);
     106             : 
     107           0 :         spin_lock_irqsave(&drm_minor_lock, flags);
     108           0 :         idr_remove(&drm_minors_idr, minor->index);
     109           0 :         spin_unlock_irqrestore(&drm_minor_lock, flags);
     110           0 : }
     111             : 
     112           0 : static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
     113             : {
     114             :         struct drm_minor *minor;
     115             :         unsigned long flags;
     116             :         int r;
     117             : 
     118           0 :         minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL);
     119           0 :         if (!minor)
     120             :                 return -ENOMEM;
     121             : 
     122           0 :         minor->type = type;
     123           0 :         minor->dev = dev;
     124             : 
     125           0 :         idr_preload(GFP_KERNEL);
     126           0 :         spin_lock_irqsave(&drm_minor_lock, flags);
     127           0 :         r = idr_alloc(&drm_minors_idr,
     128             :                       NULL,
     129           0 :                       64 * type,
     130           0 :                       64 * (type + 1),
     131             :                       GFP_NOWAIT);
     132           0 :         spin_unlock_irqrestore(&drm_minor_lock, flags);
     133             :         idr_preload_end();
     134             : 
     135           0 :         if (r < 0)
     136             :                 return r;
     137             : 
     138           0 :         minor->index = r;
     139             : 
     140           0 :         r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor);
     141           0 :         if (r)
     142             :                 return r;
     143             : 
     144           0 :         minor->kdev = drm_sysfs_minor_alloc(minor);
     145           0 :         if (IS_ERR(minor->kdev))
     146           0 :                 return PTR_ERR(minor->kdev);
     147             : 
     148           0 :         *drm_minor_get_slot(dev, type) = minor;
     149           0 :         return 0;
     150             : }
     151             : 
     152           0 : static int drm_minor_register(struct drm_device *dev, unsigned int type)
     153             : {
     154             :         struct drm_minor *minor;
     155             :         unsigned long flags;
     156             :         int ret;
     157             : 
     158           0 :         DRM_DEBUG("\n");
     159             : 
     160           0 :         minor = *drm_minor_get_slot(dev, type);
     161           0 :         if (!minor)
     162             :                 return 0;
     163             : 
     164           0 :         ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
     165             :         if (ret) {
     166             :                 DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
     167             :                 goto err_debugfs;
     168             :         }
     169             : 
     170           0 :         ret = device_add(minor->kdev);
     171           0 :         if (ret)
     172             :                 goto err_debugfs;
     173             : 
     174             :         /* replace NULL with @minor so lookups will succeed from now on */
     175           0 :         spin_lock_irqsave(&drm_minor_lock, flags);
     176           0 :         idr_replace(&drm_minors_idr, minor, minor->index);
     177           0 :         spin_unlock_irqrestore(&drm_minor_lock, flags);
     178             : 
     179           0 :         DRM_DEBUG("new minor registered %d\n", minor->index);
     180           0 :         return 0;
     181             : 
     182             : err_debugfs:
     183             :         drm_debugfs_cleanup(minor);
     184             :         return ret;
     185             : }
     186             : 
     187           0 : static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
     188             : {
     189             :         struct drm_minor *minor;
     190             :         unsigned long flags;
     191             : 
     192           0 :         minor = *drm_minor_get_slot(dev, type);
     193           0 :         if (!minor || !device_is_registered(minor->kdev))
     194             :                 return;
     195             : 
     196             :         /* replace @minor with NULL so lookups will fail from now on */
     197           0 :         spin_lock_irqsave(&drm_minor_lock, flags);
     198           0 :         idr_replace(&drm_minors_idr, NULL, minor->index);
     199           0 :         spin_unlock_irqrestore(&drm_minor_lock, flags);
     200             : 
     201           0 :         device_del(minor->kdev);
     202           0 :         dev_set_drvdata(minor->kdev, NULL); /* safety belt */
     203             :         drm_debugfs_cleanup(minor);
     204             : }
     205             : 
     206             : /*
     207             :  * Looks up the given minor-ID and returns the respective DRM-minor object. The
     208             :  * refence-count of the underlying device is increased so you must release this
     209             :  * object with drm_minor_release().
     210             :  *
     211             :  * As long as you hold this minor, it is guaranteed that the object and the
     212             :  * minor->dev pointer will stay valid! However, the device may get unplugged and
     213             :  * unregistered while you hold the minor.
     214             :  */
     215           0 : struct drm_minor *drm_minor_acquire(unsigned int minor_id)
     216             : {
     217             :         struct drm_minor *minor;
     218             :         unsigned long flags;
     219             : 
     220           0 :         spin_lock_irqsave(&drm_minor_lock, flags);
     221           0 :         minor = idr_find(&drm_minors_idr, minor_id);
     222           0 :         if (minor)
     223           0 :                 drm_dev_get(minor->dev);
     224           0 :         spin_unlock_irqrestore(&drm_minor_lock, flags);
     225             : 
     226           0 :         if (!minor) {
     227             :                 return ERR_PTR(-ENODEV);
     228           0 :         } else if (drm_dev_is_unplugged(minor->dev)) {
     229           0 :                 drm_dev_put(minor->dev);
     230             :                 return ERR_PTR(-ENODEV);
     231             :         }
     232             : 
     233             :         return minor;
     234             : }
     235             : 
     236           0 : void drm_minor_release(struct drm_minor *minor)
     237             : {
     238           0 :         drm_dev_put(minor->dev);
     239           0 : }
     240             : 
     241             : /**
     242             :  * DOC: driver instance overview
     243             :  *
     244             :  * A device instance for a drm driver is represented by &struct drm_device. This
     245             :  * is allocated and initialized with devm_drm_dev_alloc(), usually from
     246             :  * bus-specific ->probe() callbacks implemented by the driver. The driver then
     247             :  * needs to initialize all the various subsystems for the drm device like memory
     248             :  * management, vblank handling, modesetting support and initial output
     249             :  * configuration plus obviously initialize all the corresponding hardware bits.
     250             :  * Finally when everything is up and running and ready for userspace the device
     251             :  * instance can be published using drm_dev_register().
     252             :  *
     253             :  * There is also deprecated support for initializing device instances using
     254             :  * bus-specific helpers and the &drm_driver.load callback. But due to
     255             :  * backwards-compatibility needs the device instance have to be published too
     256             :  * early, which requires unpretty global locking to make safe and is therefore
     257             :  * only support for existing drivers not yet converted to the new scheme.
     258             :  *
     259             :  * When cleaning up a device instance everything needs to be done in reverse:
     260             :  * First unpublish the device instance with drm_dev_unregister(). Then clean up
     261             :  * any other resources allocated at device initialization and drop the driver's
     262             :  * reference to &drm_device using drm_dev_put().
     263             :  *
     264             :  * Note that any allocation or resource which is visible to userspace must be
     265             :  * released only when the final drm_dev_put() is called, and not when the
     266             :  * driver is unbound from the underlying physical struct &device. Best to use
     267             :  * &drm_device managed resources with drmm_add_action(), drmm_kmalloc() and
     268             :  * related functions.
     269             :  *
     270             :  * devres managed resources like devm_kmalloc() can only be used for resources
     271             :  * directly related to the underlying hardware device, and only used in code
     272             :  * paths fully protected by drm_dev_enter() and drm_dev_exit().
     273             :  *
     274             :  * Display driver example
     275             :  * ~~~~~~~~~~~~~~~~~~~~~~
     276             :  *
     277             :  * The following example shows a typical structure of a DRM display driver.
     278             :  * The example focus on the probe() function and the other functions that is
     279             :  * almost always present and serves as a demonstration of devm_drm_dev_alloc().
     280             :  *
     281             :  * .. code-block:: c
     282             :  *
     283             :  *      struct driver_device {
     284             :  *              struct drm_device drm;
     285             :  *              void *userspace_facing;
     286             :  *              struct clk *pclk;
     287             :  *      };
     288             :  *
     289             :  *      static const struct drm_driver driver_drm_driver = {
     290             :  *              [...]
     291             :  *      };
     292             :  *
     293             :  *      static int driver_probe(struct platform_device *pdev)
     294             :  *      {
     295             :  *              struct driver_device *priv;
     296             :  *              struct drm_device *drm;
     297             :  *              int ret;
     298             :  *
     299             :  *              priv = devm_drm_dev_alloc(&pdev->dev, &driver_drm_driver,
     300             :  *                                        struct driver_device, drm);
     301             :  *              if (IS_ERR(priv))
     302             :  *                      return PTR_ERR(priv);
     303             :  *              drm = &priv->drm;
     304             :  *
     305             :  *              ret = drmm_mode_config_init(drm);
     306             :  *              if (ret)
     307             :  *                      return ret;
     308             :  *
     309             :  *              priv->userspace_facing = drmm_kzalloc(..., GFP_KERNEL);
     310             :  *              if (!priv->userspace_facing)
     311             :  *                      return -ENOMEM;
     312             :  *
     313             :  *              priv->pclk = devm_clk_get(dev, "PCLK");
     314             :  *              if (IS_ERR(priv->pclk))
     315             :  *                      return PTR_ERR(priv->pclk);
     316             :  *
     317             :  *              // Further setup, display pipeline etc
     318             :  *
     319             :  *              platform_set_drvdata(pdev, drm);
     320             :  *
     321             :  *              drm_mode_config_reset(drm);
     322             :  *
     323             :  *              ret = drm_dev_register(drm);
     324             :  *              if (ret)
     325             :  *                      return ret;
     326             :  *
     327             :  *              drm_fbdev_generic_setup(drm, 32);
     328             :  *
     329             :  *              return 0;
     330             :  *      }
     331             :  *
     332             :  *      // This function is called before the devm_ resources are released
     333             :  *      static int driver_remove(struct platform_device *pdev)
     334             :  *      {
     335             :  *              struct drm_device *drm = platform_get_drvdata(pdev);
     336             :  *
     337             :  *              drm_dev_unregister(drm);
     338             :  *              drm_atomic_helper_shutdown(drm)
     339             :  *
     340             :  *              return 0;
     341             :  *      }
     342             :  *
     343             :  *      // This function is called on kernel restart and shutdown
     344             :  *      static void driver_shutdown(struct platform_device *pdev)
     345             :  *      {
     346             :  *              drm_atomic_helper_shutdown(platform_get_drvdata(pdev));
     347             :  *      }
     348             :  *
     349             :  *      static int __maybe_unused driver_pm_suspend(struct device *dev)
     350             :  *      {
     351             :  *              return drm_mode_config_helper_suspend(dev_get_drvdata(dev));
     352             :  *      }
     353             :  *
     354             :  *      static int __maybe_unused driver_pm_resume(struct device *dev)
     355             :  *      {
     356             :  *              drm_mode_config_helper_resume(dev_get_drvdata(dev));
     357             :  *
     358             :  *              return 0;
     359             :  *      }
     360             :  *
     361             :  *      static const struct dev_pm_ops driver_pm_ops = {
     362             :  *              SET_SYSTEM_SLEEP_PM_OPS(driver_pm_suspend, driver_pm_resume)
     363             :  *      };
     364             :  *
     365             :  *      static struct platform_driver driver_driver = {
     366             :  *              .driver = {
     367             :  *                      [...]
     368             :  *                      .pm = &driver_pm_ops,
     369             :  *              },
     370             :  *              .probe = driver_probe,
     371             :  *              .remove = driver_remove,
     372             :  *              .shutdown = driver_shutdown,
     373             :  *      };
     374             :  *      module_platform_driver(driver_driver);
     375             :  *
     376             :  * Drivers that want to support device unplugging (USB, DT overlay unload) should
     377             :  * use drm_dev_unplug() instead of drm_dev_unregister(). The driver must protect
     378             :  * regions that is accessing device resources to prevent use after they're
     379             :  * released. This is done using drm_dev_enter() and drm_dev_exit(). There is one
     380             :  * shortcoming however, drm_dev_unplug() marks the drm_device as unplugged before
     381             :  * drm_atomic_helper_shutdown() is called. This means that if the disable code
     382             :  * paths are protected, they will not run on regular driver module unload,
     383             :  * possibly leaving the hardware enabled.
     384             :  */
     385             : 
     386             : /**
     387             :  * drm_put_dev - Unregister and release a DRM device
     388             :  * @dev: DRM device
     389             :  *
     390             :  * Called at module unload time or when a PCI device is unplugged.
     391             :  *
     392             :  * Cleans up all DRM device, calling drm_lastclose().
     393             :  *
     394             :  * Note: Use of this function is deprecated. It will eventually go away
     395             :  * completely.  Please use drm_dev_unregister() and drm_dev_put() explicitly
     396             :  * instead to make sure that the device isn't userspace accessible any more
     397             :  * while teardown is in progress, ensuring that userspace can't access an
     398             :  * inconsistent state.
     399             :  */
     400           0 : void drm_put_dev(struct drm_device *dev)
     401             : {
     402           0 :         DRM_DEBUG("\n");
     403             : 
     404           0 :         if (!dev) {
     405           0 :                 DRM_ERROR("cleanup called no dev\n");
     406           0 :                 return;
     407             :         }
     408             : 
     409           0 :         drm_dev_unregister(dev);
     410             :         drm_dev_put(dev);
     411             : }
     412             : EXPORT_SYMBOL(drm_put_dev);
     413             : 
     414             : /**
     415             :  * drm_dev_enter - Enter device critical section
     416             :  * @dev: DRM device
     417             :  * @idx: Pointer to index that will be passed to the matching drm_dev_exit()
     418             :  *
     419             :  * This function marks and protects the beginning of a section that should not
     420             :  * be entered after the device has been unplugged. The section end is marked
     421             :  * with drm_dev_exit(). Calls to this function can be nested.
     422             :  *
     423             :  * Returns:
     424             :  * True if it is OK to enter the section, false otherwise.
     425             :  */
     426           0 : bool drm_dev_enter(struct drm_device *dev, int *idx)
     427             : {
     428           0 :         *idx = srcu_read_lock(&drm_unplug_srcu);
     429             : 
     430           0 :         if (dev->unplugged) {
     431           0 :                 srcu_read_unlock(&drm_unplug_srcu, *idx);
     432           0 :                 return false;
     433             :         }
     434             : 
     435             :         return true;
     436             : }
     437             : EXPORT_SYMBOL(drm_dev_enter);
     438             : 
     439             : /**
     440             :  * drm_dev_exit - Exit device critical section
     441             :  * @idx: index returned from drm_dev_enter()
     442             :  *
     443             :  * This function marks the end of a section that should not be entered after
     444             :  * the device has been unplugged.
     445             :  */
     446           0 : void drm_dev_exit(int idx)
     447             : {
     448           0 :         srcu_read_unlock(&drm_unplug_srcu, idx);
     449           0 : }
     450             : EXPORT_SYMBOL(drm_dev_exit);
     451             : 
     452             : /**
     453             :  * drm_dev_unplug - unplug a DRM device
     454             :  * @dev: DRM device
     455             :  *
     456             :  * This unplugs a hotpluggable DRM device, which makes it inaccessible to
     457             :  * userspace operations. Entry-points can use drm_dev_enter() and
     458             :  * drm_dev_exit() to protect device resources in a race free manner. This
     459             :  * essentially unregisters the device like drm_dev_unregister(), but can be
     460             :  * called while there are still open users of @dev.
     461             :  */
     462           0 : void drm_dev_unplug(struct drm_device *dev)
     463             : {
     464             :         /*
     465             :          * After synchronizing any critical read section is guaranteed to see
     466             :          * the new value of ->unplugged, and any critical section which might
     467             :          * still have seen the old value of ->unplugged is guaranteed to have
     468             :          * finished.
     469             :          */
     470           0 :         dev->unplugged = true;
     471           0 :         synchronize_srcu(&drm_unplug_srcu);
     472             : 
     473           0 :         drm_dev_unregister(dev);
     474             : 
     475             :         /* Clear all CPU mappings pointing to this device */
     476           0 :         unmap_mapping_range(dev->anon_inode->i_mapping, 0, 0, 1);
     477           0 : }
     478             : EXPORT_SYMBOL(drm_dev_unplug);
     479             : 
     480             : /*
     481             :  * DRM internal mount
     482             :  * We want to be able to allocate our own "struct address_space" to control
     483             :  * memory-mappings in VRAM (or stolen RAM, ...). However, core MM does not allow
     484             :  * stand-alone address_space objects, so we need an underlying inode. As there
     485             :  * is no way to allocate an independent inode easily, we need a fake internal
     486             :  * VFS mount-point.
     487             :  *
     488             :  * The drm_fs_inode_new() function allocates a new inode, drm_fs_inode_free()
     489             :  * frees it again. You are allowed to use iget() and iput() to get references to
     490             :  * the inode. But each drm_fs_inode_new() call must be paired with exactly one
     491             :  * drm_fs_inode_free() call (which does not have to be the last iput()).
     492             :  * We use drm_fs_inode_*() to manage our internal VFS mount-point and share it
     493             :  * between multiple inode-users. You could, technically, call
     494             :  * iget() + drm_fs_inode_free() directly after alloc and sometime later do an
     495             :  * iput(), but this way you'd end up with a new vfsmount for each inode.
     496             :  */
     497             : 
     498             : static int drm_fs_cnt;
     499             : static struct vfsmount *drm_fs_mnt;
     500             : 
     501           0 : static int drm_fs_init_fs_context(struct fs_context *fc)
     502             : {
     503           0 :         return init_pseudo(fc, 0x010203ff) ? 0 : -ENOMEM;
     504             : }
     505             : 
     506             : static struct file_system_type drm_fs_type = {
     507             :         .name           = "drm",
     508             :         .owner          = THIS_MODULE,
     509             :         .init_fs_context = drm_fs_init_fs_context,
     510             :         .kill_sb        = kill_anon_super,
     511             : };
     512             : 
     513           0 : static struct inode *drm_fs_inode_new(void)
     514             : {
     515             :         struct inode *inode;
     516             :         int r;
     517             : 
     518           0 :         r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
     519           0 :         if (r < 0) {
     520           0 :                 DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
     521           0 :                 return ERR_PTR(r);
     522             :         }
     523             : 
     524           0 :         inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
     525           0 :         if (IS_ERR(inode))
     526           0 :                 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
     527             : 
     528             :         return inode;
     529             : }
     530             : 
     531           0 : static void drm_fs_inode_free(struct inode *inode)
     532             : {
     533           0 :         if (inode) {
     534           0 :                 iput(inode);
     535           0 :                 simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
     536             :         }
     537           0 : }
     538             : 
     539             : /**
     540             :  * DOC: component helper usage recommendations
     541             :  *
     542             :  * DRM drivers that drive hardware where a logical device consists of a pile of
     543             :  * independent hardware blocks are recommended to use the :ref:`component helper
     544             :  * library<component>`. For consistency and better options for code reuse the
     545             :  * following guidelines apply:
     546             :  *
     547             :  *  - The entire device initialization procedure should be run from the
     548             :  *    &component_master_ops.master_bind callback, starting with
     549             :  *    devm_drm_dev_alloc(), then binding all components with
     550             :  *    component_bind_all() and finishing with drm_dev_register().
     551             :  *
     552             :  *  - The opaque pointer passed to all components through component_bind_all()
     553             :  *    should point at &struct drm_device of the device instance, not some driver
     554             :  *    specific private structure.
     555             :  *
     556             :  *  - The component helper fills the niche where further standardization of
     557             :  *    interfaces is not practical. When there already is, or will be, a
     558             :  *    standardized interface like &drm_bridge or &drm_panel, providing its own
     559             :  *    functions to find such components at driver load time, like
     560             :  *    drm_of_find_panel_or_bridge(), then the component helper should not be
     561             :  *    used.
     562             :  */
     563             : 
     564           0 : static void drm_dev_init_release(struct drm_device *dev, void *res)
     565             : {
     566           0 :         drm_legacy_ctxbitmap_cleanup(dev);
     567           0 :         drm_legacy_remove_map_hash(dev);
     568           0 :         drm_fs_inode_free(dev->anon_inode);
     569             : 
     570           0 :         put_device(dev->dev);
     571             :         /* Prevent use-after-free in drm_managed_release when debugging is
     572             :          * enabled. Slightly awkward, but can't really be helped. */
     573           0 :         dev->dev = NULL;
     574           0 :         mutex_destroy(&dev->master_mutex);
     575           0 :         mutex_destroy(&dev->clientlist_mutex);
     576           0 :         mutex_destroy(&dev->filelist_mutex);
     577           0 :         mutex_destroy(&dev->struct_mutex);
     578           0 :         drm_legacy_destroy_members(dev);
     579           0 : }
     580             : 
     581           0 : static int drm_dev_init(struct drm_device *dev,
     582             :                         const struct drm_driver *driver,
     583             :                         struct device *parent)
     584             : {
     585             :         struct inode *inode;
     586             :         int ret;
     587             : 
     588           0 :         if (!drm_core_init_complete) {
     589           0 :                 DRM_ERROR("DRM core is not initialized\n");
     590           0 :                 return -ENODEV;
     591             :         }
     592             : 
     593           0 :         if (WARN_ON(!parent))
     594             :                 return -EINVAL;
     595             : 
     596           0 :         kref_init(&dev->ref);
     597           0 :         dev->dev = get_device(parent);
     598           0 :         dev->driver = driver;
     599             : 
     600           0 :         INIT_LIST_HEAD(&dev->managed.resources);
     601           0 :         spin_lock_init(&dev->managed.lock);
     602             : 
     603             :         /* no per-device feature limits by default */
     604           0 :         dev->driver_features = ~0u;
     605             : 
     606           0 :         drm_legacy_init_members(dev);
     607           0 :         INIT_LIST_HEAD(&dev->filelist);
     608           0 :         INIT_LIST_HEAD(&dev->filelist_internal);
     609           0 :         INIT_LIST_HEAD(&dev->clientlist);
     610           0 :         INIT_LIST_HEAD(&dev->vblank_event_list);
     611             : 
     612           0 :         spin_lock_init(&dev->event_lock);
     613           0 :         mutex_init(&dev->struct_mutex);
     614           0 :         mutex_init(&dev->filelist_mutex);
     615           0 :         mutex_init(&dev->clientlist_mutex);
     616           0 :         mutex_init(&dev->master_mutex);
     617             : 
     618           0 :         ret = drmm_add_action(dev, drm_dev_init_release, NULL);
     619           0 :         if (ret)
     620             :                 return ret;
     621             : 
     622           0 :         inode = drm_fs_inode_new();
     623           0 :         if (IS_ERR(inode)) {
     624           0 :                 ret = PTR_ERR(inode);
     625           0 :                 DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
     626           0 :                 goto err;
     627             :         }
     628             : 
     629           0 :         dev->anon_inode = inode;
     630             : 
     631           0 :         if (drm_core_check_feature(dev, DRIVER_RENDER)) {
     632           0 :                 ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
     633           0 :                 if (ret)
     634             :                         goto err;
     635             :         }
     636             : 
     637           0 :         ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
     638           0 :         if (ret)
     639             :                 goto err;
     640             : 
     641           0 :         ret = drm_legacy_create_map_hash(dev);
     642             :         if (ret)
     643             :                 goto err;
     644             : 
     645           0 :         drm_legacy_ctxbitmap_init(dev);
     646             : 
     647           0 :         if (drm_core_check_feature(dev, DRIVER_GEM)) {
     648           0 :                 ret = drm_gem_init(dev);
     649           0 :                 if (ret) {
     650           0 :                         DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
     651           0 :                         goto err;
     652             :                 }
     653             :         }
     654             : 
     655           0 :         ret = drm_dev_set_unique(dev, dev_name(parent));
     656           0 :         if (ret)
     657             :                 goto err;
     658             : 
     659             :         return 0;
     660             : 
     661             : err:
     662           0 :         drm_managed_release(dev);
     663             : 
     664           0 :         return ret;
     665             : }
     666             : 
     667           0 : static void devm_drm_dev_init_release(void *data)
     668             : {
     669           0 :         drm_dev_put(data);
     670           0 : }
     671             : 
     672           0 : static int devm_drm_dev_init(struct device *parent,
     673             :                              struct drm_device *dev,
     674             :                              const struct drm_driver *driver)
     675             : {
     676             :         int ret;
     677             : 
     678           0 :         ret = drm_dev_init(dev, driver, parent);
     679           0 :         if (ret)
     680             :                 return ret;
     681             : 
     682             :         return devm_add_action_or_reset(parent,
     683             :                                         devm_drm_dev_init_release, dev);
     684             : }
     685             : 
     686           0 : void *__devm_drm_dev_alloc(struct device *parent,
     687             :                            const struct drm_driver *driver,
     688             :                            size_t size, size_t offset)
     689             : {
     690             :         void *container;
     691             :         struct drm_device *drm;
     692             :         int ret;
     693             : 
     694           0 :         container = kzalloc(size, GFP_KERNEL);
     695           0 :         if (!container)
     696             :                 return ERR_PTR(-ENOMEM);
     697             : 
     698           0 :         drm = container + offset;
     699           0 :         ret = devm_drm_dev_init(parent, drm, driver);
     700           0 :         if (ret) {
     701           0 :                 kfree(container);
     702           0 :                 return ERR_PTR(ret);
     703             :         }
     704           0 :         drmm_add_final_kfree(drm, container);
     705             : 
     706           0 :         return container;
     707             : }
     708             : EXPORT_SYMBOL(__devm_drm_dev_alloc);
     709             : 
     710             : /**
     711             :  * drm_dev_alloc - Allocate new DRM device
     712             :  * @driver: DRM driver to allocate device for
     713             :  * @parent: Parent device object
     714             :  *
     715             :  * This is the deprecated version of devm_drm_dev_alloc(), which does not support
     716             :  * subclassing through embedding the struct &drm_device in a driver private
     717             :  * structure, and which does not support automatic cleanup through devres.
     718             :  *
     719             :  * RETURNS:
     720             :  * Pointer to new DRM device, or ERR_PTR on failure.
     721             :  */
     722           0 : struct drm_device *drm_dev_alloc(const struct drm_driver *driver,
     723             :                                  struct device *parent)
     724             : {
     725             :         struct drm_device *dev;
     726             :         int ret;
     727             : 
     728           0 :         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
     729           0 :         if (!dev)
     730             :                 return ERR_PTR(-ENOMEM);
     731             : 
     732           0 :         ret = drm_dev_init(dev, driver, parent);
     733           0 :         if (ret) {
     734           0 :                 kfree(dev);
     735           0 :                 return ERR_PTR(ret);
     736             :         }
     737             : 
     738           0 :         drmm_add_final_kfree(dev, dev);
     739             : 
     740           0 :         return dev;
     741             : }
     742             : EXPORT_SYMBOL(drm_dev_alloc);
     743             : 
     744           0 : static void drm_dev_release(struct kref *ref)
     745             : {
     746           0 :         struct drm_device *dev = container_of(ref, struct drm_device, ref);
     747             : 
     748           0 :         if (dev->driver->release)
     749           0 :                 dev->driver->release(dev);
     750             : 
     751           0 :         drm_managed_release(dev);
     752             : 
     753           0 :         kfree(dev->managed.final_kfree);
     754           0 : }
     755             : 
     756             : /**
     757             :  * drm_dev_get - Take reference of a DRM device
     758             :  * @dev: device to take reference of or NULL
     759             :  *
     760             :  * This increases the ref-count of @dev by one. You *must* already own a
     761             :  * reference when calling this. Use drm_dev_put() to drop this reference
     762             :  * again.
     763             :  *
     764             :  * This function never fails. However, this function does not provide *any*
     765             :  * guarantee whether the device is alive or running. It only provides a
     766             :  * reference to the object and the memory associated with it.
     767             :  */
     768           0 : void drm_dev_get(struct drm_device *dev)
     769             : {
     770           0 :         if (dev)
     771           0 :                 kref_get(&dev->ref);
     772           0 : }
     773             : EXPORT_SYMBOL(drm_dev_get);
     774             : 
     775             : /**
     776             :  * drm_dev_put - Drop reference of a DRM device
     777             :  * @dev: device to drop reference of or NULL
     778             :  *
     779             :  * This decreases the ref-count of @dev by one. The device is destroyed if the
     780             :  * ref-count drops to zero.
     781             :  */
     782           0 : void drm_dev_put(struct drm_device *dev)
     783             : {
     784           0 :         if (dev)
     785           0 :                 kref_put(&dev->ref, drm_dev_release);
     786           0 : }
     787             : EXPORT_SYMBOL(drm_dev_put);
     788             : 
     789           0 : static int create_compat_control_link(struct drm_device *dev)
     790             : {
     791             :         struct drm_minor *minor;
     792             :         char *name;
     793             :         int ret;
     794             : 
     795           0 :         if (!drm_core_check_feature(dev, DRIVER_MODESET))
     796             :                 return 0;
     797             : 
     798           0 :         minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
     799           0 :         if (!minor)
     800             :                 return 0;
     801             : 
     802             :         /*
     803             :          * Some existing userspace out there uses the existing of the controlD*
     804             :          * sysfs files to figure out whether it's a modeset driver. It only does
     805             :          * readdir, hence a symlink is sufficient (and the least confusing
     806             :          * option). Otherwise controlD* is entirely unused.
     807             :          *
     808             :          * Old controlD chardev have been allocated in the range
     809             :          * 64-127.
     810             :          */
     811           0 :         name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
     812           0 :         if (!name)
     813             :                 return -ENOMEM;
     814             : 
     815           0 :         ret = sysfs_create_link(minor->kdev->kobj.parent,
     816           0 :                                 &minor->kdev->kobj,
     817             :                                 name);
     818             : 
     819           0 :         kfree(name);
     820             : 
     821           0 :         return ret;
     822             : }
     823             : 
     824           0 : static void remove_compat_control_link(struct drm_device *dev)
     825             : {
     826             :         struct drm_minor *minor;
     827             :         char *name;
     828             : 
     829           0 :         if (!drm_core_check_feature(dev, DRIVER_MODESET))
     830             :                 return;
     831             : 
     832           0 :         minor = *drm_minor_get_slot(dev, DRM_MINOR_PRIMARY);
     833           0 :         if (!minor)
     834             :                 return;
     835             : 
     836           0 :         name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
     837           0 :         if (!name)
     838             :                 return;
     839             : 
     840           0 :         sysfs_remove_link(minor->kdev->kobj.parent, name);
     841             : 
     842           0 :         kfree(name);
     843             : }
     844             : 
     845             : /**
     846             :  * drm_dev_register - Register DRM device
     847             :  * @dev: Device to register
     848             :  * @flags: Flags passed to the driver's .load() function
     849             :  *
     850             :  * Register the DRM device @dev with the system, advertise device to user-space
     851             :  * and start normal device operation. @dev must be initialized via drm_dev_init()
     852             :  * previously.
     853             :  *
     854             :  * Never call this twice on any device!
     855             :  *
     856             :  * NOTE: To ensure backward compatibility with existing drivers method this
     857             :  * function calls the &drm_driver.load method after registering the device
     858             :  * nodes, creating race conditions. Usage of the &drm_driver.load methods is
     859             :  * therefore deprecated, drivers must perform all initialization before calling
     860             :  * drm_dev_register().
     861             :  *
     862             :  * RETURNS:
     863             :  * 0 on success, negative error code on failure.
     864             :  */
     865           0 : int drm_dev_register(struct drm_device *dev, unsigned long flags)
     866             : {
     867           0 :         const struct drm_driver *driver = dev->driver;
     868             :         int ret;
     869             : 
     870           0 :         if (!driver->load)
     871           0 :                 drm_mode_config_validate(dev);
     872             : 
     873           0 :         WARN_ON(!dev->managed.final_kfree);
     874             : 
     875           0 :         if (drm_dev_needs_global_mutex(dev))
     876           0 :                 mutex_lock(&drm_global_mutex);
     877             : 
     878           0 :         ret = drm_minor_register(dev, DRM_MINOR_RENDER);
     879           0 :         if (ret)
     880             :                 goto err_minors;
     881             : 
     882           0 :         ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
     883           0 :         if (ret)
     884             :                 goto err_minors;
     885             : 
     886           0 :         ret = create_compat_control_link(dev);
     887           0 :         if (ret)
     888             :                 goto err_minors;
     889             : 
     890           0 :         dev->registered = true;
     891             : 
     892           0 :         if (dev->driver->load) {
     893           0 :                 ret = dev->driver->load(dev, flags);
     894           0 :                 if (ret)
     895             :                         goto err_minors;
     896             :         }
     897             : 
     898           0 :         if (drm_core_check_feature(dev, DRIVER_MODESET))
     899           0 :                 drm_modeset_register_all(dev);
     900             : 
     901           0 :         DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
     902             :                  driver->name, driver->major, driver->minor,
     903             :                  driver->patchlevel, driver->date,
     904             :                  dev->dev ? dev_name(dev->dev) : "virtual device",
     905             :                  dev->primary->index);
     906             : 
     907           0 :         goto out_unlock;
     908             : 
     909             : err_minors:
     910           0 :         remove_compat_control_link(dev);
     911           0 :         drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
     912           0 :         drm_minor_unregister(dev, DRM_MINOR_RENDER);
     913             : out_unlock:
     914           0 :         if (drm_dev_needs_global_mutex(dev))
     915           0 :                 mutex_unlock(&drm_global_mutex);
     916           0 :         return ret;
     917             : }
     918             : EXPORT_SYMBOL(drm_dev_register);
     919             : 
     920             : /**
     921             :  * drm_dev_unregister - Unregister DRM device
     922             :  * @dev: Device to unregister
     923             :  *
     924             :  * Unregister the DRM device from the system. This does the reverse of
     925             :  * drm_dev_register() but does not deallocate the device. The caller must call
     926             :  * drm_dev_put() to drop their final reference.
     927             :  *
     928             :  * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
     929             :  * which can be called while there are still open users of @dev.
     930             :  *
     931             :  * This should be called first in the device teardown code to make sure
     932             :  * userspace can't access the device instance any more.
     933             :  */
     934           0 : void drm_dev_unregister(struct drm_device *dev)
     935             : {
     936           0 :         if (drm_core_check_feature(dev, DRIVER_LEGACY))
     937           0 :                 drm_lastclose(dev);
     938             : 
     939           0 :         dev->registered = false;
     940             : 
     941           0 :         drm_client_dev_unregister(dev);
     942             : 
     943           0 :         if (drm_core_check_feature(dev, DRIVER_MODESET))
     944           0 :                 drm_modeset_unregister_all(dev);
     945             : 
     946           0 :         if (dev->driver->unload)
     947           0 :                 dev->driver->unload(dev);
     948             : 
     949           0 :         drm_legacy_pci_agp_destroy(dev);
     950           0 :         drm_legacy_rmmaps(dev);
     951             : 
     952           0 :         remove_compat_control_link(dev);
     953           0 :         drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
     954           0 :         drm_minor_unregister(dev, DRM_MINOR_RENDER);
     955           0 : }
     956             : EXPORT_SYMBOL(drm_dev_unregister);
     957             : 
     958             : /**
     959             :  * drm_dev_set_unique - Set the unique name of a DRM device
     960             :  * @dev: device of which to set the unique name
     961             :  * @name: unique name
     962             :  *
     963             :  * Sets the unique name of a DRM device using the specified string. This is
     964             :  * already done by drm_dev_init(), drivers should only override the default
     965             :  * unique name for backwards compatibility reasons.
     966             :  *
     967             :  * Return: 0 on success or a negative error code on failure.
     968             :  */
     969           0 : int drm_dev_set_unique(struct drm_device *dev, const char *name)
     970             : {
     971           0 :         drmm_kfree(dev, dev->unique);
     972           0 :         dev->unique = drmm_kstrdup(dev, name, GFP_KERNEL);
     973             : 
     974           0 :         return dev->unique ? 0 : -ENOMEM;
     975             : }
     976             : EXPORT_SYMBOL(drm_dev_set_unique);
     977             : 
     978             : /*
     979             :  * DRM Core
     980             :  * The DRM core module initializes all global DRM objects and makes them
     981             :  * available to drivers. Once setup, drivers can probe their respective
     982             :  * devices.
     983             :  * Currently, core management includes:
     984             :  *  - The "DRM-Global" key/value database
     985             :  *  - Global ID management for connectors
     986             :  *  - DRM major number allocation
     987             :  *  - DRM minor management
     988             :  *  - DRM sysfs class
     989             :  *  - DRM debugfs root
     990             :  *
     991             :  * Furthermore, the DRM core provides dynamic char-dev lookups. For each
     992             :  * interface registered on a DRM device, you can request minor numbers from DRM
     993             :  * core. DRM core takes care of major-number management and char-dev
     994             :  * registration. A stub ->open() callback forwards any open() requests to the
     995             :  * registered minor.
     996             :  */
     997             : 
     998           0 : static int drm_stub_open(struct inode *inode, struct file *filp)
     999             : {
    1000             :         const struct file_operations *new_fops;
    1001             :         struct drm_minor *minor;
    1002             :         int err;
    1003             : 
    1004           0 :         DRM_DEBUG("\n");
    1005             : 
    1006           0 :         minor = drm_minor_acquire(iminor(inode));
    1007           0 :         if (IS_ERR(minor))
    1008           0 :                 return PTR_ERR(minor);
    1009             : 
    1010           0 :         new_fops = fops_get(minor->dev->driver->fops);
    1011           0 :         if (!new_fops) {
    1012             :                 err = -ENODEV;
    1013             :                 goto out;
    1014             :         }
    1015             : 
    1016           0 :         replace_fops(filp, new_fops);
    1017           0 :         if (filp->f_op->open)
    1018           0 :                 err = filp->f_op->open(inode, filp);
    1019             :         else
    1020             :                 err = 0;
    1021             : 
    1022             : out:
    1023             :         drm_minor_release(minor);
    1024             : 
    1025             :         return err;
    1026             : }
    1027             : 
    1028             : static const struct file_operations drm_stub_fops = {
    1029             :         .owner = THIS_MODULE,
    1030             :         .open = drm_stub_open,
    1031             :         .llseek = noop_llseek,
    1032             : };
    1033             : 
    1034           0 : static void drm_core_exit(void)
    1035             : {
    1036           0 :         drm_privacy_screen_lookup_exit();
    1037           0 :         unregister_chrdev(DRM_MAJOR, "drm");
    1038           0 :         debugfs_remove(drm_debugfs_root);
    1039           0 :         drm_sysfs_destroy();
    1040           0 :         idr_destroy(&drm_minors_idr);
    1041           0 :         drm_connector_ida_destroy();
    1042           0 : }
    1043             : 
    1044           1 : static int __init drm_core_init(void)
    1045             : {
    1046             :         int ret;
    1047             : 
    1048           1 :         drm_connector_ida_init();
    1049           1 :         idr_init(&drm_minors_idr);
    1050           1 :         drm_memcpy_init_early();
    1051             : 
    1052           1 :         ret = drm_sysfs_init();
    1053           1 :         if (ret < 0) {
    1054           0 :                 DRM_ERROR("Cannot create DRM class: %d\n", ret);
    1055           0 :                 goto error;
    1056             :         }
    1057             : 
    1058           2 :         drm_debugfs_root = debugfs_create_dir("dri", NULL);
    1059             : 
    1060           1 :         ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
    1061           1 :         if (ret < 0)
    1062             :                 goto error;
    1063             : 
    1064             :         drm_privacy_screen_lookup_init();
    1065             : 
    1066           1 :         drm_core_init_complete = true;
    1067             : 
    1068           1 :         DRM_DEBUG("Initialized\n");
    1069           1 :         return 0;
    1070             : 
    1071             : error:
    1072           0 :         drm_core_exit();
    1073           0 :         return ret;
    1074             : }
    1075             : 
    1076             : module_init(drm_core_init);
    1077             : module_exit(drm_core_exit);

Generated by: LCOV version 1.14