LCOV - code coverage report
Current view: top level - drivers/gpu/drm - drm_drv.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 202 308 65.6 %
Date: 2023-07-19 18:55:55 Functions: 19 30 63.3 %

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

Generated by: LCOV version 1.14