?sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget%/translations/zh_CN/gpu/drm-internalsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/zh_TW/gpu/drm-internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/it_IT/gpu/drm-internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ja_JP/gpu/drm-internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ko_KR/gpu/drm-internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/sp_SP/gpu/drm-internalsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h DRM Internalsh]h DRM Internals}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh?/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals.rsthKubh paragraph)}(hThis chapter documents DRM internals relevant to driver authors and developers working to add support for the latest features to existing drivers.h]hThis chapter documents DRM internals relevant to driver authors and developers working to add support for the latest features to existing drivers.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXFirst, we go over some typical driver initialization requirements, like setting up command buffers, creating an initial output configuration, and initializing core services. Subsequent sections cover core internals in more detail, providing implementation notes and examples.h]hXFirst, we go over some typical driver initialization requirements, like setting up command buffers, creating an initial output configuration, and initializing core services. Subsequent sections cover core internals in more detail, providing implementation notes and examples.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hXdThe DRM layer provides several services to graphics drivers, many of them driven by the application interfaces it provides through libdrm, the library that wraps most of the DRM ioctls. These include vblank event handling, memory management, output management, framebuffer management, command submission & fencing, suspend/resume support, and DMA services.h]hXdThe DRM layer provides several services to graphics drivers, many of them driven by the application interfaces it provides through libdrm, the library that wraps most of the DRM ioctls. These include vblank event handling, memory management, output management, framebuffer management, command submission & fencing, suspend/resume support, and DMA services.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hDriver Initializationh]hDriver Initialization}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hXdAt the core of every DRM driver is a :c:type:`struct drm_driver ` structure. Drivers typically statically initialize a drm_driver structure, and then pass it to drm_dev_alloc() to allocate a device instance. After the device instance is fully initialized it can be registered (which makes it accessible from userspace) using drm_dev_register().h](h%At the core of every DRM driver is a }(hhhhhNhNubh)}(h(:c:type:`struct drm_driver `h]hliteral)}(hhh]hstruct drm_driver}(hjhhhNhNubah}(h]h ](xrefcc-typeeh"]h$]h&]uh1jhhubah}(h]h ]h"]h$]h&]refdocgpu/drm-internals refdomainj reftypetype refexplicitrefwarn reftarget drm_driveruh1hhhhKhhubhX structure. Drivers typically statically initialize a drm_driver structure, and then pass it to drm_dev_alloc() to allocate a device instance. After the device instance is fully initialized it can be registered (which makes it accessible from userspace) using drm_dev_register().}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThe :c:type:`struct drm_driver ` structure contains static information that describes the driver and features it supports, and pointers to methods that the DRM core will call to implement the DRM API. We will first go through the :c:type:`struct drm_driver ` static information fields, and will then describe individual operations in details as they get used in later sections.h](hThe }(hj+hhhNhNubh)}(h(:c:type:`struct drm_driver `h]j)}(hj5h]hstruct drm_driver}(hj7hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_driveruh1hhhhKhj+ubh structure contains static information that describes the driver and features it supports, and pointers to methods that the DRM core will call to implement the DRM API. We will first go through the }(hj+hhhNhNubh)}(h(:c:type:`struct drm_driver `h]j)}(hjXh]hstruct drm_driver}(hjZhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_driveruh1hhhhKhj+ubhw static information fields, and will then describe individual operations in details as they get used in later sections.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hDriver Informationh]hDriver Information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK(ubh)}(hhh](h)}(hMajor, Minor and Patchlevelh]hMajor, Minor and Patchlevel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK+ubh)}(hint major; int minor; int patchlevel; The DRM core identifies driver versions by a major, minor and patch level triplet. The information is printed to the kernel log at initialization time and passed to userspace through the DRM_IOCTL_VERSION ioctl.h]hint major; int minor; int patchlevel; The DRM core identifies driver versions by a major, minor and patch level triplet. The information is printed to the kernel log at initialization time and passed to userspace through the DRM_IOCTL_VERSION ioctl.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjhhubh)}(hXThe major and minor numbers are also used to verify the requested driver API version passed to DRM_IOCTL_SET_VERSION. When the driver API changes between minor versions, applications can call DRM_IOCTL_SET_VERSION to select a specific version of the API. If the requested major isn't equal to the driver major, or the requested minor is larger than the driver minor, the DRM_IOCTL_SET_VERSION call will return an error. Otherwise the driver's set_version() method will be called with the requested version.h]hXThe major and minor numbers are also used to verify the requested driver API version passed to DRM_IOCTL_SET_VERSION. When the driver API changes between minor versions, applications can call DRM_IOCTL_SET_VERSION to select a specific version of the API. If the requested major isn’t equal to the driver major, or the requested minor is larger than the driver minor, the DRM_IOCTL_SET_VERSION call will return an error. Otherwise the driver’s set_version() method will be called with the requested version.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubeh}(h]major-minor-and-patchlevelah ]h"]major, minor and patchlevelah$]h&]uh1hhjhhhhhK+ubh)}(hhh](h)}(hName and Descriptionh]hName and Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK=ubh)}(hchar \*name; char \*desc; char \*date; The driver name is printed to the kernel log at initialization time, used for IRQ registration and passed to userspace through DRM_IOCTL_VERSION.h]hchar *name; char *desc; char *date; The driver name is printed to the kernel log at initialization time, used for IRQ registration and passed to userspace through DRM_IOCTL_VERSION.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hjhhubh)}(hThe driver description is a purely informative string passed to userspace through the DRM_IOCTL_VERSION ioctl and otherwise unused by the kernel.h]hThe driver description is a purely informative string passed to userspace through the DRM_IOCTL_VERSION ioctl and otherwise unused by the kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubeh}(h]name-and-descriptionah ]h"]name and descriptionah$]h&]uh1hhjhhhhhK=ubeh}(h]driver-informationah ]h"]driver informationah$]h&]uh1hhhhhhhhK(ubh)}(hhh](h)}(hModule Initializationh]hModule Initialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKIubh)}(hXThis library provides helpers registering DRM drivers during module initialization and shutdown. The provided helpers act like bus-specific module helpers, such as module_pci_driver(), but respect additional parameters that control DRM driver registration.h]hXThis library provides helpers registering DRM drivers during module initialization and shutdown. The provided helpers act like bus-specific module helpers, such as module_pci_driver(), but respect additional parameters that control DRM driver registration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:75: ./include/drm/drm_module.hhK hjhhubh)}(hMBelow is an example of initializing a DRM driver for a device on the PCI bus.h]hMBelow is an example of initializing a DRM driver for a device on the PCI bus.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:75: ./include/drm/drm_module.hhKhjhhubh literal_block)}(hGstruct pci_driver my_pci_drv = { }; drm_module_pci_driver(my_pci_drv);h]hGstruct pci_driver my_pci_drv = { }; drm_module_pci_driver(my_pci_drv);}hj3sbah}(h]h ]h"]h$]h&] xml:spacepreserveforcelanguagej highlight_args}uh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:75: ./include/drm/drm_module.hhKhjhhubh)}(hThe generated code will test if DRM drivers are enabled and register the PCI driver my_pci_drv. For more complex module initialization, you can still use module_init() and module_exit() in your driver.h]hThe generated code will test if DRM drivers are enabled and register the PCI driver my_pci_drv. For more complex module initialization, you can still use module_init() and module_exit() in your driver.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:75: ./include/drm/drm_module.hhKhjhhubeh}(h]module-initializationah ]h"]module initializationah$]h&]uh1hhhhhhhhKIubh)}(hhh](h)}(h#Device Instance and Driver Handlingh]h#Device Instance and Driver Handling}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hhhhhKOubh)}(hXTA device instance for a drm driver is represented by :c:type:`struct drm_device `. This is allocated and initialized with devm_drm_dev_alloc(), usually from bus-specific ->probe() callbacks implemented by the driver. The driver then needs to initialize all the various subsystems for the drm device like memory management, vblank handling, modesetting support and initial output configuration plus obviously initialize all the corresponding hardware bits. Finally when everything is up and running and ready for userspace the device instance can be published using drm_dev_register().h](h5A device instance for a drm driver is represented by }(hjphhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjzh]hstruct drm_device}(hj|hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_deviceuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chM hjpubhX. This is allocated and initialized with devm_drm_dev_alloc(), usually from bus-specific ->probe() callbacks implemented by the driver. The driver then needs to initialize all the various subsystems for the drm device like memory management, vblank handling, modesetting support and initial output configuration plus obviously initialize all the corresponding hardware bits. Finally when everything is up and running and ready for userspace the device instance can be published using drm_dev_register().}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hj_hhubh)}(hXThere is also deprecated support for initializing device instances using bus-specific helpers and the :c:type:`drm_driver.load ` callback. But due to backwards-compatibility needs the device instance have to be published too early, which requires unpretty global locking to make safe and is therefore only support for existing drivers not yet converted to the new scheme.h](hfThere is also deprecated support for initializing device instances using bus-specific helpers and the }(hjhhhNhNubh)}(h&:c:type:`drm_driver.load `h]j)}(hjh]hdrm_driver.load}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_driveruh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chMhjubh callback. But due to backwards-compatibility needs the device instance have to be published too early, which requires unpretty global locking to make safe and is therefore only support for existing drivers not yet converted to the new scheme.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj_hhubh)}(hXWhen cleaning up a device instance everything needs to be done in reverse: First unpublish the device instance with drm_dev_unregister(). Then clean up any other resources allocated at device initialization and drop the driver's reference to :c:type:`drm_device` using drm_dev_put().h](hWhen cleaning up a device instance everything needs to be done in reverse: First unpublish the device instance with drm_dev_unregister(). Then clean up any other resources allocated at device initialization and drop the driver’s reference to }(hjhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjh]h drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_deviceuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chMhjubh using drm_dev_put().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj_hhubh)}(hXJNote that any allocation or resource which is visible to userspace must be released only when the final drm_dev_put() is called, and not when the driver is unbound from the underlying physical struct :c:type:`device`. Best to use :c:type:`drm_device` managed resources with drmm_add_action(), drmm_kmalloc() and related functions.h](hNote that any allocation or resource which is visible to userspace must be released only when the final drm_dev_put() is called, and not when the driver is unbound from the underlying physical struct }(hjhhhNhNubh)}(h:c:type:`device`h]j)}(hjh]hdevice}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjdeviceuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chMhjubh. Best to use }(hjhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj4h]h drm_device}(hj6hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnj drm_deviceuh1hhj-hMhjubhP managed resources with drmm_add_action(), drmm_kmalloc() and related functions.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj-hMhj_hhubh)}(hdevres managed resources like devm_kmalloc() can only be used for resources directly related to the underlying hardware device, and only used in code paths fully protected by drm_dev_enter() and drm_dev_exit().h]hdevres managed resources like devm_kmalloc() can only be used for resources directly related to the underlying hardware device, and only used in code paths fully protected by drm_dev_enter() and drm_dev_exit().}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chM$hj_hhubh)}(hhh](h)}(hDisplay driver exampleh]hDisplay driver example}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhNhNubh)}(hThe following example shows a typical structure of a DRM display driver. The example focus on the probe() function and the other functions that is almost always present and serves as a demonstration of devm_drm_dev_alloc().h]hThe following example shows a typical structure of a DRM display driver. The example focus on the probe() function and the other functions that is almost always present and serves as a demonstration of devm_drm_dev_alloc().}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chM+hjjubj2)}(hX struct driver_device { struct drm_device drm; void *userspace_facing; struct clk *pclk; }; static const struct drm_driver driver_drm_driver = { [...] }; static int driver_probe(struct platform_device *pdev) { struct driver_device *priv; struct drm_device *drm; int ret; priv = devm_drm_dev_alloc(&pdev->dev, &driver_drm_driver, struct driver_device, drm); if (IS_ERR(priv)) return PTR_ERR(priv); drm = &priv->drm; ret = drmm_mode_config_init(drm); if (ret) return ret; priv->userspace_facing = drmm_kzalloc(..., GFP_KERNEL); if (!priv->userspace_facing) return -ENOMEM; priv->pclk = devm_clk_get(dev, "PCLK"); if (IS_ERR(priv->pclk)) return PTR_ERR(priv->pclk); // Further setup, display pipeline etc platform_set_drvdata(pdev, drm); drm_mode_config_reset(drm); ret = drm_dev_register(drm); if (ret) return ret; drm_fbdev_{...}_setup(drm, 32); return 0; } // This function is called before the devm_ resources are released static int driver_remove(struct platform_device *pdev) { struct drm_device *drm = platform_get_drvdata(pdev); drm_dev_unregister(drm); drm_atomic_helper_shutdown(drm) return 0; } // This function is called on kernel restart and shutdown static void driver_shutdown(struct platform_device *pdev) { drm_atomic_helper_shutdown(platform_get_drvdata(pdev)); } static int __maybe_unused driver_pm_suspend(struct device *dev) { return drm_mode_config_helper_suspend(dev_get_drvdata(dev)); } static int __maybe_unused driver_pm_resume(struct device *dev) { drm_mode_config_helper_resume(dev_get_drvdata(dev)); return 0; } static const struct dev_pm_ops driver_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(driver_pm_suspend, driver_pm_resume) }; static struct platform_driver driver_driver = { .driver = { [...] .pm = &driver_pm_ops, }, .probe = driver_probe, .remove = driver_remove, .shutdown = driver_shutdown, }; module_platform_driver(driver_driver);h]hX struct driver_device { struct drm_device drm; void *userspace_facing; struct clk *pclk; }; static const struct drm_driver driver_drm_driver = { [...] }; static int driver_probe(struct platform_device *pdev) { struct driver_device *priv; struct drm_device *drm; int ret; priv = devm_drm_dev_alloc(&pdev->dev, &driver_drm_driver, struct driver_device, drm); if (IS_ERR(priv)) return PTR_ERR(priv); drm = &priv->drm; ret = drmm_mode_config_init(drm); if (ret) return ret; priv->userspace_facing = drmm_kzalloc(..., GFP_KERNEL); if (!priv->userspace_facing) return -ENOMEM; priv->pclk = devm_clk_get(dev, "PCLK"); if (IS_ERR(priv->pclk)) return PTR_ERR(priv->pclk); // Further setup, display pipeline etc platform_set_drvdata(pdev, drm); drm_mode_config_reset(drm); ret = drm_dev_register(drm); if (ret) return ret; drm_fbdev_{...}_setup(drm, 32); return 0; } // This function is called before the devm_ resources are released static int driver_remove(struct platform_device *pdev) { struct drm_device *drm = platform_get_drvdata(pdev); drm_dev_unregister(drm); drm_atomic_helper_shutdown(drm) return 0; } // This function is called on kernel restart and shutdown static void driver_shutdown(struct platform_device *pdev) { drm_atomic_helper_shutdown(platform_get_drvdata(pdev)); } static int __maybe_unused driver_pm_suspend(struct device *dev) { return drm_mode_config_helper_suspend(dev_get_drvdata(dev)); } static int __maybe_unused driver_pm_resume(struct device *dev) { drm_mode_config_helper_resume(dev_get_drvdata(dev)); return 0; } static const struct dev_pm_ops driver_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(driver_pm_suspend, driver_pm_resume) }; static struct platform_driver driver_driver = { .driver = { [...] .pm = &driver_pm_ops, }, .probe = driver_probe, .remove = driver_remove, .shutdown = driver_shutdown, }; module_platform_driver(driver_driver);}hjsbah}(h]h ]h"]h$]h&]jAjBjCjDj jE}uh1j1h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chM/hjjubh)}(hX<Drivers that want to support device unplugging (USB, DT overlay unload) should use drm_dev_unplug() instead of drm_dev_unregister(). The driver must protect regions that is accessing device resources to prevent use after they're released. This is done using drm_dev_enter() and drm_dev_exit(). There is one shortcoming however, drm_dev_unplug() marks the drm_device as unplugged before drm_atomic_helper_shutdown() is called. This means that if the disable code paths are protected, they will not run on regular driver module unload, possibly leaving the hardware enabled.h]hX>Drivers that want to support device unplugging (USB, DT overlay unload) should use drm_dev_unplug() instead of drm_dev_unregister(). The driver must protect regions that is accessing device resources to prevent use after they’re released. This is done using drm_dev_enter() and drm_dev_exit(). There is one shortcoming however, drm_dev_unplug() marks the drm_device as unplugged before drm_atomic_helper_shutdown() is called. This means that if the disable code paths are protected, they will not run on regular driver module unload, possibly leaving the hardware enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:81: ./drivers/gpu/drm/drm_drv.chMhjjubeh}(h]display-driver-exampleah ]h"]display driver exampleah$]h&]uh1hhj_hhhNhNubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleswitch_power_state (C enum)c.switch_power_statehNtauh1jhj_hhhNhNubhdesc)}(hhh](hdesc_signature)}(hswitch_power_stateh]hdesc_signature_line)}(henum switch_power_stateh](hdesc_sig_keyword)}(henumh]henum}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(hswitch_power_stateh]h desc_sig_name)}(hjh]hswitch_power_state}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jAjBuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jAjB add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(hpower state of drm deviceh]hpower state of drm device}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK"hj*hhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhKubeh}(h]h ](j enumeh"]h$]h&]domainj objtypejEdesctypejEnoindex noindexentrynocontentsentryuh1jhhhj_hNhNubh container)}(h**Constants** ``DRM_SWITCH_POWER_ON`` Power state is ON ``DRM_SWITCH_POWER_OFF`` Power state is OFF ``DRM_SWITCH_POWER_CHANGING`` Power state is changing ``DRM_SWITCH_POWER_DYNAMIC_OFF`` Suspendedh](h)}(h **Constants**h]hstrong)}(hjWh]h Constants}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjUubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK&hjQubhdefinition_list)}(hhh](hdefinition_list_item)}(h*``DRM_SWITCH_POWER_ON`` Power state is ON h](hterm)}(h``DRM_SWITCH_POWER_ON``h]j)}(hj~h]hDRM_SWITCH_POWER_ON}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK)hjvubh definition)}(hhh]h)}(hPower state is ONh]hPower state is ON}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK)hjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjhK)hjqubju)}(h,``DRM_SWITCH_POWER_OFF`` Power state is OFF h](j{)}(h``DRM_SWITCH_POWER_OFF``h]j)}(hjh]hDRM_SWITCH_POWER_OFF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK,hjubj)}(hhh]h)}(hPower state is OFFh]hPower state is OFF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhK,hjqubju)}(h6``DRM_SWITCH_POWER_CHANGING`` Power state is changing h](j{)}(h``DRM_SWITCH_POWER_CHANGING``h]j)}(hjh]hDRM_SWITCH_POWER_CHANGING}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK/hjubj)}(hhh]h)}(hPower state is changingh]hPower state is changing}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhK/hjqubju)}(h*``DRM_SWITCH_POWER_DYNAMIC_OFF`` Suspendedh](j{)}(h ``DRM_SWITCH_POWER_DYNAMIC_OFF``h]j)}(hj+h]hDRM_SWITCH_POWER_DYNAMIC_OFF}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK1hj%ubj)}(hhh]h)}(h Suspendedh]h Suspended}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK2hjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jthj@hK1hjqubeh}(h]h ]h"]h$]h&]uh1johjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_device (C struct) c.drm_devicehNtauh1jhj_hhhNhNubj)}(hhh](j)}(h drm_deviceh]j)}(hstruct drm_deviceh](j)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK7ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK7ubj)}(h drm_deviceh]j)}(hjh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhK7ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj}hhhjhK7ubah}(h]jxah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhK7hjzhhubj))}(hhh]h)}(hDRM device structureh]hDRM device structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK4hjhhubah}(h]h ]h"]h$]h&]uh1j(hjzhhhjhK7ubeh}(h]h ](j structeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhj_hNhNubjP)}(hXi**Definition**:: struct drm_device { int if_version; struct kref ref; struct device *dev; struct device *dma_dev; struct { struct list_head resources; void *final_kfree; spinlock_t lock; } managed; const struct drm_driver *driver; void *dev_private; struct drm_minor *primary; struct drm_minor *render; struct drm_minor *accel; bool registered; struct drm_master *master; u32 driver_features; bool unplugged; struct inode *anon_inode; char *unique; struct mutex struct_mutex; struct mutex master_mutex; atomic_t open_count; struct mutex filelist_mutex; struct list_head filelist; struct list_head filelist_internal; struct mutex clientlist_mutex; struct list_head clientlist; bool vblank_disable_immediate; struct drm_vblank_crtc *vblank; spinlock_t vblank_time_lock; spinlock_t vbl_lock; u32 max_vblank_count; struct list_head vblank_event_list; spinlock_t event_lock; unsigned int num_crtcs; struct drm_mode_config mode_config; struct mutex object_name_lock; struct idr object_name_idr; struct drm_vma_offset_manager *vma_offset_manager; struct drm_vram_mm *vram_mm; enum switch_power_state switch_power_state; struct drm_fb_helper *fb_helper; struct dentry *debugfs_root; }; **Members** ``if_version`` Highest interface version set ``ref`` Object ref-count ``dev`` Device structure of bus-device ``dma_dev`` Device for DMA operations. Only required if the device **dev** cannot perform DMA by itself. Should be NULL otherwise. Call drm_dev_dma_dev() to get the DMA device instead of using this field directly. Call drm_dev_set_dma_dev() to set this field. DRM devices are sometimes bound to virtual devices that cannot perform DMA by themselves. Drivers should set this field to the respective DMA controller. Devices on USB and other peripheral busses also cannot perform DMA by themselves. The **dma_dev** field should point the bus controller that does DMA on behalve of such a device. Required for importing buffers via dma-buf. If set, the DRM core automatically releases the reference on the device. ``managed`` Managed resources linked to the lifetime of this :c:type:`drm_device` as tracked by **ref**. ``driver`` DRM driver managing the device ``dev_private`` DRM driver private data. This is deprecated and should be left set to NULL. Instead of using this pointer it is recommended that drivers use devm_drm_dev_alloc() and embed struct :c:type:`drm_device` in their larger per-device structure. ``primary`` Primary node. Drivers should not interact with this directly. debugfs interfaces can be registered with drm_debugfs_add_file(), and sysfs should be directly added on the hardware (and not character device node) struct device **dev**. ``render`` Render node. Drivers should not interact with this directly ever. Drivers should not expose any additional interfaces in debugfs or sysfs on this node. ``accel`` Compute Acceleration node ``registered`` Internally used by drm_dev_register() and drm_connector_register(). ``master`` Currently active master for this device. Protected by :c:type:`master_mutex` ``driver_features`` per-device driver features Drivers can clear specific flags here to disallow certain features on a per-device basis while still sharing a single :c:type:`struct drm_driver ` instance across all devices. ``unplugged`` Flag to tell if the device has been unplugged. See drm_dev_enter() and drm_dev_is_unplugged(). ``anon_inode`` inode for private address-space ``unique`` Unique name of the device ``struct_mutex`` Lock for others (not :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master `) TODO: This lock used to be the BKL of the DRM subsystem. Move the lock into i915, which is the only remaining user. ``master_mutex`` Lock for :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master ` ``open_count`` Usage counter for outstanding files open, protected by drm_global_mutex ``filelist_mutex`` Protects **filelist**. ``filelist`` List of userspace clients, linked through :c:type:`drm_file.lhead `. ``filelist_internal`` List of open DRM files for in-kernel clients. Protected by :c:type:`filelist_mutex`. ``clientlist_mutex`` Protects :c:type:`clientlist` access. ``clientlist`` List of in-kernel clients. Protected by :c:type:`clientlist_mutex`. ``vblank_disable_immediate`` If true, vblank interrupt will be disabled immediately when the refcount drops to zero, as opposed to via the vblank disable timer. This can be set to true it the hardware has a working vblank counter with high-precision timestamping (otherwise there are races) and the driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() appropriately. Also, see **max_vblank_count**, :c:type:`drm_crtc_funcs.get_vblank_counter ` and :c:type:`drm_vblank_crtc_config.disable_immediate `. ``vblank`` Array of vblank tracking structures, one per :c:type:`struct drm_crtc `. For historical reasons (vblank support predates kernel modesetting) this is free-standing and not part of :c:type:`struct drm_crtc ` itself. It must be initialized explicitly by calling drm_vblank_init(). ``vblank_time_lock`` Protects vblank count and time updates during vblank enable/disable ``vbl_lock`` Top-level vblank references lock, wraps the low-level **vblank_time_lock**. ``max_vblank_count`` Maximum value of the vblank registers. This value +1 will result in a wrap-around of the vblank register. It is used by the vblank core to handle wrap-arounds. If set to zero the vblank core will try to guess the elapsed vblanks between times when the vblank interrupt is disabled through high-precision timestamps. That approach is suffering from small races and imprecision over longer time periods, hence exposing a hardware vblank counter is always recommended. This is the statically configured device wide maximum. The driver can instead choose to use a runtime configurable per-crtc value :c:type:`drm_vblank_crtc.max_vblank_count `, in which case **max_vblank_count** must be left at zero. See drm_crtc_set_max_vblank_count() on how to use the per-crtc value. If non-zero, :c:type:`drm_crtc_funcs.get_vblank_counter ` must be set. ``vblank_event_list`` List of vblank events ``event_lock`` Protects **vblank_event_list** and event delivery in general. See drm_send_event() and drm_send_event_locked(). ``num_crtcs`` Number of CRTCs on this device ``mode_config`` Current mode config ``object_name_lock`` GEM information ``object_name_idr`` GEM information ``vma_offset_manager`` GEM information ``vram_mm`` VRAM MM memory manager ``switch_power_state`` Power state of the client. Used by drivers supporting the switcheroo driver. The state is maintained in the :c:type:`vga_switcheroo_client_ops.set_gpu_state ` callback ``fb_helper`` Pointer to the fbdev emulation structure. Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini(). ``debugfs_root`` Root directory for debugfs files.h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK8hjubj2)}(hXDstruct drm_device { int if_version; struct kref ref; struct device *dev; struct device *dma_dev; struct { struct list_head resources; void *final_kfree; spinlock_t lock; } managed; const struct drm_driver *driver; void *dev_private; struct drm_minor *primary; struct drm_minor *render; struct drm_minor *accel; bool registered; struct drm_master *master; u32 driver_features; bool unplugged; struct inode *anon_inode; char *unique; struct mutex struct_mutex; struct mutex master_mutex; atomic_t open_count; struct mutex filelist_mutex; struct list_head filelist; struct list_head filelist_internal; struct mutex clientlist_mutex; struct list_head clientlist; bool vblank_disable_immediate; struct drm_vblank_crtc *vblank; spinlock_t vblank_time_lock; spinlock_t vbl_lock; u32 max_vblank_count; struct list_head vblank_event_list; spinlock_t event_lock; unsigned int num_crtcs; struct drm_mode_config mode_config; struct mutex object_name_lock; struct idr object_name_idr; struct drm_vma_offset_manager *vma_offset_manager; struct drm_vram_mm *vram_mm; enum switch_power_state switch_power_state; struct drm_fb_helper *fb_helper; struct dentry *debugfs_root; };h]hXDstruct drm_device { int if_version; struct kref ref; struct device *dev; struct device *dma_dev; struct { struct list_head resources; void *final_kfree; spinlock_t lock; } managed; const struct drm_driver *driver; void *dev_private; struct drm_minor *primary; struct drm_minor *render; struct drm_minor *accel; bool registered; struct drm_master *master; u32 driver_features; bool unplugged; struct inode *anon_inode; char *unique; struct mutex struct_mutex; struct mutex master_mutex; atomic_t open_count; struct mutex filelist_mutex; struct list_head filelist; struct list_head filelist_internal; struct mutex clientlist_mutex; struct list_head clientlist; bool vblank_disable_immediate; struct drm_vblank_crtc *vblank; spinlock_t vblank_time_lock; spinlock_t vbl_lock; u32 max_vblank_count; struct list_head vblank_event_list; spinlock_t event_lock; unsigned int num_crtcs; struct drm_mode_config mode_config; struct mutex object_name_lock; struct idr object_name_idr; struct drm_vma_offset_manager *vma_offset_manager; struct drm_vram_mm *vram_mm; enum switch_power_state switch_power_state; struct drm_fb_helper *fb_helper; struct dentry *debugfs_root; };}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK:hjubh)}(h **Members**h]jZ)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKihjubjp)}(hhh](ju)}(h-``if_version`` Highest interface version set h](j{)}(h``if_version``h]j)}(hj5h]h if_version}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK:hj/ubj)}(hhh]h)}(hHighest interface version seth]hHighest interface version set}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhK:hjKubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jthjJhK:hj,ubju)}(h``ref`` Object ref-count h](j{)}(h``ref``h]j)}(hjnh]href}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjhubj)}(hhh]h)}(hObject ref-counth]hObject ref-count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h'``dev`` Device structure of bus-device h](j{)}(h``dev``h]j)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hDevice structure of bus-deviceh]hDevice structure of bus-device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(hX``dma_dev`` Device for DMA operations. Only required if the device **dev** cannot perform DMA by itself. Should be NULL otherwise. Call drm_dev_dma_dev() to get the DMA device instead of using this field directly. Call drm_dev_set_dma_dev() to set this field. DRM devices are sometimes bound to virtual devices that cannot perform DMA by themselves. Drivers should set this field to the respective DMA controller. Devices on USB and other peripheral busses also cannot perform DMA by themselves. The **dma_dev** field should point the bus controller that does DMA on behalve of such a device. Required for importing buffers via dma-buf. If set, the DRM core automatically releases the reference on the device. h](j{)}(h ``dma_dev``h]j)}(hjh]hdma_dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKThjubj)}(hhh](h)}(hDevice for DMA operations. Only required if the device **dev** cannot perform DMA by itself. Should be NULL otherwise. Call drm_dev_dma_dev() to get the DMA device instead of using this field directly. Call drm_dev_set_dma_dev() to set this field.h](h7Device for DMA operations. Only required if the device }(hjhhhNhNubjZ)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh cannot perform DMA by itself. Should be NULL otherwise. Call drm_dev_dma_dev() to get the DMA device instead of using this field directly. Call drm_dev_set_dma_dev() to set this field.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKEhjubh)}(hDRM devices are sometimes bound to virtual devices that cannot perform DMA by themselves. Drivers should set this field to the respective DMA controller.h]hDRM devices are sometimes bound to virtual devices that cannot perform DMA by themselves. Drivers should set this field to the respective DMA controller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKJhjubh)}(hDevices on USB and other peripheral busses also cannot perform DMA by themselves. The **dma_dev** field should point the bus controller that does DMA on behalve of such a device. Required for importing buffers via dma-buf.h](hVDevices on USB and other peripheral busses also cannot perform DMA by themselves. The }(hj)hhhNhNubjZ)}(h **dma_dev**h]hdma_dev}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj)ubh} field should point the bus controller that does DMA on behalve of such a device. Required for importing buffers via dma-buf.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKNhjubh)}(hHIf set, the DRM core automatically releases the reference on the device.h]hHIf set, the DRM core automatically releases the reference on the device.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKShjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKThj,ubju)}(hi``managed`` Managed resources linked to the lifetime of this :c:type:`drm_device` as tracked by **ref**. h](j{)}(h ``managed``h]j)}(hjkh]hmanaged}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK\hjeubj)}(hhh]h)}(h\Managed resources linked to the lifetime of this :c:type:`drm_device` as tracked by **ref**.h](h1Managed resources linked to the lifetime of this }(hjhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjh]h drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarn c:parent_keysphinx.domains.c LookupKey)}data]sbj drm_deviceuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK[hjubh as tracked by }(hjhhhNhNubjZ)}(h**ref**h]href}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jthjhK\hj,ubju)}(h*``driver`` DRM driver managing the device h](j{)}(h ``driver``h]j)}(hjh]hdriver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hDRM driver managing the deviceh]hDRM driver managing the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h``dev_private`` DRM driver private data. This is deprecated and should be left set to NULL. Instead of using this pointer it is recommended that drivers use devm_drm_dev_alloc() and embed struct :c:type:`drm_device` in their larger per-device structure. h](j{)}(h``dev_private``h]j)}(hjh]h dev_private}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKrhjubj)}(hhh](h)}(hKDRM driver private data. This is deprecated and should be left set to NULL.h]hKDRM driver private data. This is deprecated and should be left set to NULL.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKmhj1ubh)}(hInstead of using this pointer it is recommended that drivers use devm_drm_dev_alloc() and embed struct :c:type:`drm_device` in their larger per-device structure.h](hgInstead of using this pointer it is recommended that drivers use devm_drm_dev_alloc() and embed struct }(hjChhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjMh]h drm_device}(hjOhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKphjCubh& in their larger per-device structure.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjjhKphj1ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj0hKrhj,ubju)}(h``primary`` Primary node. Drivers should not interact with this directly. debugfs interfaces can be registered with drm_debugfs_add_file(), and sysfs should be directly added on the hardware (and not character device node) struct device **dev**. h](j{)}(h ``primary``h]j)}(hjh]hprimary}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK|hjubj)}(hhh]h)}(hPrimary node. Drivers should not interact with this directly. debugfs interfaces can be registered with drm_debugfs_add_file(), and sysfs should be directly added on the hardware (and not character device node) struct device **dev**.h](hPrimary node. Drivers should not interact with this directly. debugfs interfaces can be registered with drm_debugfs_add_file(), and sysfs should be directly added on the hardware (and not character device node) struct device }(hjhhhNhNubjZ)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKyhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhK|hj,ubju)}(h``render`` Render node. Drivers should not interact with this directly ever. Drivers should not expose any additional interfaces in debugfs or sysfs on this node. h](j{)}(h ``render``h]j)}(hjh]hrender}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hRender node. Drivers should not interact with this directly ever. Drivers should not expose any additional interfaces in debugfs or sysfs on this node.h]hRender node. Drivers should not interact with this directly ever. Drivers should not expose any additional interfaces in debugfs or sysfs on this node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h$``accel`` Compute Acceleration node h](j{)}(h ``accel``h]j)}(hj h]haccel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hCompute Acceleration nodeh]hCompute Acceleration node}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj" hKhj# ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj" hKhj,ubju)}(hS``registered`` Internally used by drm_dev_register() and drm_connector_register(). h](j{)}(h``registered``h]j)}(hjF h]h registered}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj@ ubj)}(hhh]h)}(hCInternally used by drm_dev_register() and drm_connector_register().h]hCInternally used by drm_dev_register() and drm_connector_register().}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[ hKhj\ ubah}(h]h ]h"]h$]h&]uh1jhj@ ubeh}(h]h ]h"]h$]h&]uh1jthj[ hKhj,ubju)}(hX``master`` Currently active master for this device. Protected by :c:type:`master_mutex` h](j{)}(h ``master``h]j)}(hj h]hmaster}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj} ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjy ubj)}(hhh]h)}(hLCurrently active master for this device. Protected by :c:type:`master_mutex`h](h6Currently active master for this device. Protected by }(hj hhhNhNubh)}(h:c:type:`master_mutex`h]j)}(hj h]h master_mutex}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj master_mutexuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubeh}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhjy ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(h``driver_features`` per-device driver features Drivers can clear specific flags here to disallow certain features on a per-device basis while still sharing a single :c:type:`struct drm_driver ` instance across all devices. h](j{)}(h``driver_features``h]j)}(hj h]hdriver_features}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh](h)}(hper-device driver featuresh]hper-device driver features}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubh)}(hDrivers can clear specific flags here to disallow certain features on a per-device basis while still sharing a single :c:type:`struct drm_driver ` instance across all devices.h](hvDrivers can clear specific flags here to disallow certain features on a per-device basis while still sharing a single }(hj hhhNhNubh)}(h(:c:type:`struct drm_driver `h]j)}(hj h]hstruct drm_driver}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubh instance across all devices.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj' hKhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(hm``unplugged`` Flag to tell if the device has been unplugged. See drm_dev_enter() and drm_dev_is_unplugged(). h](j{)}(h ``unplugged``h]j)}(hjD h]h unplugged}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj> ubj)}(hhh]h)}(h^Flag to tell if the device has been unplugged. See drm_dev_enter() and drm_dev_is_unplugged().h]h^Flag to tell if the device has been unplugged. See drm_dev_enter() and drm_dev_is_unplugged().}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjZ ubah}(h]h ]h"]h$]h&]uh1jhj> ubeh}(h]h ]h"]h$]h&]uh1jthjY hKhj,ubju)}(h/``anon_inode`` inode for private address-space h](j{)}(h``anon_inode``h]j)}(hj~ h]h anon_inode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj| ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjx ubj)}(hhh]h)}(hinode for private address-spaceh]hinode for private address-space}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhjx ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(h%``unique`` Unique name of the device h](j{)}(h ``unique``h]j)}(hj h]hunique}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hUnique name of the deviceh]hUnique name of the device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(h``struct_mutex`` Lock for others (not :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master `) TODO: This lock used to be the BKL of the DRM subsystem. Move the lock into i915, which is the only remaining user. h](j{)}(h``struct_mutex``h]j)}(hj h]h struct_mutex}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh](h)}(hhLock for others (not :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master `)h](hLock for others (not }(hj hhhNhNubh)}(h&:c:type:`drm_minor.master `h]j)}(hj h]hdrm_minor.master}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_minoruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubh and }(hj hhhNhNubh)}(h':c:type:`drm_file.is_master `h]j)}(hj7 h]hdrm_file.is_master}(hj9 hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj5 ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhj0 hKhj ubh)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj0 hKhj ubjp)}(hhh]ju)}(htTODO: This lock used to be the BKL of the DRM subsystem. Move the lock into i915, which is the only remaining user. h](j{)}(hATODO: This lock used to be the BKL of the DRM subsystem. Move theh]hATODO: This lock used to be the BKL of the DRM subsystem. Move the}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1jzhj hKhja ubj)}(hhh]h)}(h1lock into i915, which is the only remaining user.h]h1lock into i915, which is the only remaining user.}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhjs ubah}(h]h ]h"]h$]h&]uh1jhja ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj^ ubah}(h]h ]h"]h$]h&]uh1johj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(hm``master_mutex`` Lock for :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master ` h](j{)}(h``master_mutex``h]j)}(hj h]h master_mutex}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(h[Lock for :c:type:`drm_minor.master ` and :c:type:`drm_file.is_master `h](h Lock for }(hj hhhNhNubh)}(h&:c:type:`drm_minor.master `h]j)}(hj h]hdrm_minor.master}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_minoruh1hhj hKhj ubh and }(hj hhhNhNubh)}(h':c:type:`drm_file.is_master `h]j)}(hj h]hdrm_file.is_master}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhj hKhj ubeh}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(hW``open_count`` Usage counter for outstanding files open, protected by drm_global_mutex h](j{)}(h``open_count``h]j)}(hj# h]h open_count}(hj% hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj! ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hGUsage counter for outstanding files open, protected by drm_global_mutexh]hGUsage counter for outstanding files open, protected by drm_global_mutex}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj9 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj8 hKhj,ubju)}(h*``filelist_mutex`` Protects **filelist**. h](j{)}(h``filelist_mutex``h]j)}(hj] h]hfilelist_mutex}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjW ubj)}(hhh]h)}(hProtects **filelist**.h](h Protects }(hjv hhhNhNubjZ)}(h **filelist**h]hfilelist}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjv ubh.}(hjv hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjr hKhjs ubah}(h]h ]h"]h$]h&]uh1jhjW ubeh}(h]h ]h"]h$]h&]uh1jthjr hKhj,ubju)}(h\``filelist`` List of userspace clients, linked through :c:type:`drm_file.lhead `. h](j{)}(h ``filelist``h]j)}(hj h]hfilelist}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hNList of userspace clients, linked through :c:type:`drm_file.lhead `.h](h*List of userspace clients, linked through }(hj hhhNhNubh)}(h#:c:type:`drm_file.lhead `h]j)}(hj h]hdrm_file.lhead}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhj hKhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(hk``filelist_internal`` List of open DRM files for in-kernel clients. Protected by :c:type:`filelist_mutex`. h](j{)}(h``filelist_internal``h]j)}(hj h]hfilelist_internal}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hTList of open DRM files for in-kernel clients. Protected by :c:type:`filelist_mutex`.h](h;List of open DRM files for in-kernel clients. Protected by }(hj hhhNhNubh)}(h:c:type:`filelist_mutex`h]j)}(hj' h]hfilelist_mutex}(hj) hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj% ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfilelist_mutexuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjD hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(h;``clientlist_mutex`` Protects :c:type:`clientlist` access. h](j{)}(h``clientlist_mutex``h]j)}(hja h]hclientlist_mutex}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj[ ubj)}(hhh]h)}(h%Protects :c:type:`clientlist` access.h](h Protects }(hjz hhhNhNubh)}(h:c:type:`clientlist`h]j)}(hj h]h clientlist}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj clientlistuh1hhjv hKhjz ubh access.}(hjz hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjv hKhjw ubah}(h]h ]h"]h$]h&]uh1jhj[ ubeh}(h]h ]h"]h$]h&]uh1jthjv hKhj,ubju)}(hS``clientlist`` List of in-kernel clients. Protected by :c:type:`clientlist_mutex`. h](j{)}(h``clientlist``h]j)}(hj h]h clientlist}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj ubj)}(hhh]h)}(hCList of in-kernel clients. Protected by :c:type:`clientlist_mutex`.h](h(List of in-kernel clients. Protected by }(hj hhhNhNubh)}(h:c:type:`clientlist_mutex`h]j)}(hj h]hclientlist_mutex}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjclientlist_mutexuh1hhj hKhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hKhj,ubju)}(hX$``vblank_disable_immediate`` If true, vblank interrupt will be disabled immediately when the refcount drops to zero, as opposed to via the vblank disable timer. This can be set to true it the hardware has a working vblank counter with high-precision timestamping (otherwise there are races) and the driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() appropriately. Also, see **max_vblank_count**, :c:type:`drm_crtc_funcs.get_vblank_counter ` and :c:type:`drm_vblank_crtc_config.disable_immediate `. h](j{)}(h``vblank_disable_immediate``h]j)}(hjh]hvblank_disable_immediate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh](h)}(hIf true, vblank interrupt will be disabled immediately when the refcount drops to zero, as opposed to via the vblank disable timer.h]hIf true, vblank interrupt will be disabled immediately when the refcount drops to zero, as opposed to via the vblank disable timer.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj/ubh)}(hXThis can be set to true it the hardware has a working vblank counter with high-precision timestamping (otherwise there are races) and the driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() appropriately. Also, see **max_vblank_count**, :c:type:`drm_crtc_funcs.get_vblank_counter ` and :c:type:`drm_vblank_crtc_config.disable_immediate `.h](hThis can be set to true it the hardware has a working vblank counter with high-precision timestamping (otherwise there are races) and the driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() appropriately. Also, see }(hjAhhhNhNubjZ)}(h**max_vblank_count**h]hmax_vblank_count}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjAubh, }(hjAhhhNhNubh)}(h<:c:type:`drm_crtc_funcs.get_vblank_counter `h]j)}(hj]h]h!drm_crtc_funcs.get_vblank_counter}(hj_hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_crtc_funcsuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjAubh and }(hjAhhhNhNubh)}(hK:c:type:`drm_vblank_crtc_config.disable_immediate `h]j)}(hjh]h(drm_vblank_crtc_config.disable_immediate}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_vblank_crtc_configuh1hhjzhKhjAubh.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjzhKhj/ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj.hKhj,ubju)}(hX5``vblank`` Array of vblank tracking structures, one per :c:type:`struct drm_crtc `. For historical reasons (vblank support predates kernel modesetting) this is free-standing and not part of :c:type:`struct drm_crtc ` itself. It must be initialized explicitly by calling drm_vblank_init(). h](j{)}(h ``vblank``h]j)}(hjh]hvblank}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjubj)}(hhh]h)}(hX)Array of vblank tracking structures, one per :c:type:`struct drm_crtc `. For historical reasons (vblank support predates kernel modesetting) this is free-standing and not part of :c:type:`struct drm_crtc ` itself. It must be initialized explicitly by calling drm_vblank_init().h](h-Array of vblank tracking structures, one per }(hjhhhNhNubh)}(h$:c:type:`struct drm_crtc `h]j)}(hjh]hstruct drm_crtc}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_crtcuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubhl. For historical reasons (vblank support predates kernel modesetting) this is free-standing and not part of }(hjhhhNhNubh)}(h$:c:type:`struct drm_crtc `h]j)}(hjh]hstruct drm_crtc}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_crtcuh1hhjhKhjubhH itself. It must be initialized explicitly by calling drm_vblank_init().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhj,ubju)}(hY``vblank_time_lock`` Protects vblank count and time updates during vblank enable/disable h](j{)}(h``vblank_time_lock``h]j)}(hj:h]hvblank_time_lock}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhj4ubj)}(hhh]h)}(hCProtects vblank count and time updates during vblank enable/disableh]hCProtects vblank count and time updates during vblank enable/disable}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jthjOhMhj,ubju)}(hY``vbl_lock`` Top-level vblank references lock, wraps the low-level **vblank_time_lock**. h](j{)}(h ``vbl_lock``h]j)}(hjsh]hvbl_lock}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjmubj)}(hhh]h)}(hKTop-level vblank references lock, wraps the low-level **vblank_time_lock**.h](h6Top-level vblank references lock, wraps the low-level }(hjhhhNhNubjZ)}(h**vblank_time_lock**h]hvblank_time_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jthjhMhj,ubju)}(hX``max_vblank_count`` Maximum value of the vblank registers. This value +1 will result in a wrap-around of the vblank register. It is used by the vblank core to handle wrap-arounds. If set to zero the vblank core will try to guess the elapsed vblanks between times when the vblank interrupt is disabled through high-precision timestamps. That approach is suffering from small races and imprecision over longer time periods, hence exposing a hardware vblank counter is always recommended. This is the statically configured device wide maximum. The driver can instead choose to use a runtime configurable per-crtc value :c:type:`drm_vblank_crtc.max_vblank_count `, in which case **max_vblank_count** must be left at zero. See drm_crtc_set_max_vblank_count() on how to use the per-crtc value. If non-zero, :c:type:`drm_crtc_funcs.get_vblank_counter ` must be set. h](j{)}(h``max_vblank_count``h]j)}(hjh]hmax_vblank_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhM$hjubj)}(hhh](h)}(hMaximum value of the vblank registers. This value +1 will result in a wrap-around of the vblank register. It is used by the vblank core to handle wrap-arounds.h]hMaximum value of the vblank registers. This value +1 will result in a wrap-around of the vblank register. It is used by the vblank core to handle wrap-arounds.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjubh)}(hX1If set to zero the vblank core will try to guess the elapsed vblanks between times when the vblank interrupt is disabled through high-precision timestamps. That approach is suffering from small races and imprecision over longer time periods, hence exposing a hardware vblank counter is always recommended.h]hX1If set to zero the vblank core will try to guess the elapsed vblanks between times when the vblank interrupt is disabled through high-precision timestamps. That approach is suffering from small races and imprecision over longer time periods, hence exposing a hardware vblank counter is always recommended.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjubh)}(hX>This is the statically configured device wide maximum. The driver can instead choose to use a runtime configurable per-crtc value :c:type:`drm_vblank_crtc.max_vblank_count `, in which case **max_vblank_count** must be left at zero. See drm_crtc_set_max_vblank_count() on how to use the per-crtc value.h](hThis is the statically configured device wide maximum. The driver can instead choose to use a runtime configurable per-crtc value }(hjhhhNhNubh)}(h<:c:type:`drm_vblank_crtc.max_vblank_count `h]j)}(hjh]h drm_vblank_crtc.max_vblank_count}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_vblank_crtcuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMhjubh, in which case }(hjhhhNhNubjZ)}(h**max_vblank_count**h]hmax_vblank_count}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh\ must be left at zero. See drm_crtc_set_max_vblank_count() on how to use the per-crtc value.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(hVIf non-zero, :c:type:`drm_crtc_funcs.get_vblank_counter ` must be set.h](h If non-zero, }(hj:hhhNhNubh)}(h<:c:type:`drm_crtc_funcs.get_vblank_counter `h]j)}(hjDh]h!drm_crtc_funcs.get_vblank_counter}(hjFhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_crtc_funcsuh1hhjhM$hj:ubh must be set.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM$hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM$hj,ubju)}(h,``vblank_event_list`` List of vblank events h](j{)}(h``vblank_event_list``h]j)}(hj}h]hvblank_event_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjwubj)}(hhh]h)}(hList of vblank eventsh]hList of vblank events}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h``event_lock`` Protects **vblank_event_list** and event delivery in general. See drm_send_event() and drm_send_event_locked(). h](j{)}(h``event_lock``h]j)}(hjh]h event_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhM/hjubj)}(hhh]h)}(hoProtects **vblank_event_list** and event delivery in general. See drm_send_event() and drm_send_event_locked().h](h Protects }(hjhhhNhNubjZ)}(h**vblank_event_list**h]hvblank_event_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubhQ and event delivery in general. See drm_send_event() and drm_send_event_locked().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhM.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM/hj,ubju)}(h-``num_crtcs`` Number of CRTCs on this device h](j{)}(h ``num_crtcs``h]j)}(hjh]h num_crtcs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hNumber of CRTCs on this deviceh]hNumber of CRTCs on this device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h$``mode_config`` Current mode config h](j{)}(h``mode_config``h]j)}(hj;h]h mode_config}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhj5ubj)}(hhh]h)}(hCurrent mode configh]hCurrent mode config}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhKhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jthjPhKhj,ubju)}(h%``object_name_lock`` GEM information h](j{)}(h``object_name_lock``h]j)}(hjth]hobject_name_lock}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjnubj)}(hhh]h)}(hGEM informationh]hGEM information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h$``object_name_idr`` GEM information h](j{)}(h``object_name_idr``h]j)}(hjh]hobject_name_idr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hGEM informationh]hGEM information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h'``vma_offset_manager`` GEM information h](j{)}(h``vma_offset_manager``h]j)}(hjh]hvma_offset_manager}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hGEM informationh]hGEM information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj,ubju)}(h#``vram_mm`` VRAM MM memory manager h](j{)}(h ``vram_mm``h]j)}(hjh]hvram_mm}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhKhjubj)}(hhh]h)}(hVRAM MM memory managerh]hVRAM MM memory manager}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hKhj5ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj4hKhj,ubju)}(h``switch_power_state`` Power state of the client. Used by drivers supporting the switcheroo driver. The state is maintained in the :c:type:`vga_switcheroo_client_ops.set_gpu_state ` callback h](j{)}(h``switch_power_state``h]j)}(hjXh]hswitch_power_state}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMKhjRubj)}(hhh]h)}(hPower state of the client. Used by drivers supporting the switcheroo driver. The state is maintained in the :c:type:`vga_switcheroo_client_ops.set_gpu_state ` callbackh](hlPower state of the client. Used by drivers supporting the switcheroo driver. The state is maintained in the }(hjqhhhNhNubh)}(hM:c:type:`vga_switcheroo_client_ops.set_gpu_state `h]j)}(hj{h]h'vga_switcheroo_client_ops.set_gpu_state}(hj}hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjvga_switcheroo_client_opsuh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMHhjqubh callback}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMHhjnubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jthjmhMKhj,ubju)}(hy``fb_helper`` Pointer to the fbdev emulation structure. Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini(). h](j{)}(h ``fb_helper``h]j)}(hjh]h fb_helper}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMShjubj)}(hhh]h)}(hjPointer to the fbdev emulation structure. Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini().h]hjPointer to the fbdev emulation structure. Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMRhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMShj,ubju)}(h2``debugfs_root`` Root directory for debugfs files.h](j{)}(h``debugfs_root``h]j)}(hjh]h debugfs_root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMYhjubj)}(hhh]h)}(h!Root directory for debugfs files.h]h!Root directory for debugfs files.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMYhj,ubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubh)}(h**Description**h]jZ)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj0ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhM]hj_hhubh)}(hIThis structure represent a complete card that may contain multiple heads.h]hIThis structure represent a complete card that may contain multiple heads.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhK5hj_hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_dma_dev (C function)c.drm_dev_dma_devhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h8struct device * drm_dev_dma_dev (struct drm_device *dev)h]j)}(h6struct device *drm_dev_dma_dev(struct drm_device *dev)h](j)}(hjh]hstruct}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMcubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhj}hMcubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftype identifier reftargetjmodnameN classnameNjj)}j]j ASTIdentifier)}jdrm_dev_dma_devsbc.drm_dev_dma_devasbuh1hhjlhhhj}hMcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhj}hMcubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjlhhhj}hMcubj)}(hdrm_dev_dma_devh]j)}(hjh]hdrm_dev_dma_dev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjlhhhj}hMcubhdesc_parameterlist)}(h(struct drm_device *dev)h]hdesc_parameter)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_dev_dma_devasbuh1hhjubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdevh]hdev}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubah}(h]h ]h"]h$]h&]jAjBuh1jhjlhhhj}hMcubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhhj}hMcubah}(h]jcah ](j j!eh"]h$]h&]j%j&)j'huh1jhj}hMchjehhubj))}(hhh]h)}(h'returns the DMA device for a DRM deviceh]h'returns the DMA device for a DRM device}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMchjshhubah}(h]h ]h"]h$]h&]uh1j(hjehhhj}hMcubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhj_hNhNubjP)}(h**Parameters** ``struct drm_device *dev`` DRM device **Description** Returns the DMA device of the given DRM device. By default, this the DRM device's parent. See drm_dev_set_dma_dev(). **Return** A DMA-capable device for the DRM device.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMghjubjp)}(hhh]ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjh]hstruct drm_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMdhjubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMdhjubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMfhjubh)}(htReturns the DMA device of the given DRM device. By default, this the DRM device's parent. See drm_dev_set_dma_dev().h]hvReturns the DMA device of the given DRM device. By default, this the DRM device’s parent. See drm_dev_set_dma_dev().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMfhjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMihjubh)}(h(A DMA-capable device for the DRM device.h]h(A DMA-capable device for the DRM device.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:84: ./include/drm/drm_device.hhMihjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_driver_feature (C enum)c.drm_driver_featurehNtauh1jhj_hhhNhNubj)}(hhh](j)}(hdrm_driver_featureh]j)}(henum drm_driver_featureh](j)}(hjh]henum}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjkhKubj)}(hdrm_driver_featureh]j)}(hjXh]hdrm_driver_feature}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjZhhhjkhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjVhhhjkhKubah}(h]jQah ](j j!eh"]h$]h&]j%j&)j'huh1jhjkhKhjShhubj))}(hhh]h)}(h feature flagsh]h feature flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK4hjhhubah}(h]h ]h"]h$]h&]uh1j(hjShhhjkhKubeh}(h]h ](j enumeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhj_hNhNubjP)}(hX**Constants** ``DRIVER_GEM`` Driver use the GEM memory manager. This should be set for all modern drivers. ``DRIVER_MODESET`` Driver supports mode setting interfaces (KMS). ``DRIVER_RENDER`` Driver supports dedicated render nodes. See also the :ref:`section on render nodes ` for details. ``DRIVER_ATOMIC`` Driver supports the full atomic modesetting userspace API. Drivers which only use atomic internally, but do not support the full userspace API (e.g. not all properties converted to atomic, or multi-plane updates are not guaranteed to be tear-free) should not set this flag. ``DRIVER_SYNCOBJ`` Driver supports :c:type:`drm_syncobj` for explicit synchronization of command submission. ``DRIVER_SYNCOBJ_TIMELINE`` Driver supports the timeline flavor of :c:type:`drm_syncobj` for explicit synchronization of command submission. ``DRIVER_COMPUTE_ACCEL`` Driver supports compute acceleration devices. This flag is mutually exclusive with **DRIVER_RENDER** and **DRIVER_MODESET**. Devices that support both graphics and compute acceleration should be handled by two drivers that are connected using auxiliary bus. ``DRIVER_GEM_GPUVA`` Driver supports user defined GPU VA bindings for GEM objects. ``DRIVER_CURSOR_HOTSPOT`` Driver supports and requires cursor hotspot information in the cursor plane (e.g. cursor plane has to actually track the mouse cursor and the clients are required to set hotspot in order for the cursor planes to work correctly). ``DRIVER_USE_AGP`` Set up DRM AGP support, see drm_agp_init(), the DRM core will manage AGP resources. New drivers don't need this. ``DRIVER_LEGACY`` Denote a legacy driver using shadow attach. Do not use. ``DRIVER_PCI_DMA`` Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace will be enabled. Only for legacy drivers. Do not use. ``DRIVER_SG`` Driver can perform scatter/gather DMA, allocation and mapping of scatter/gather buffers will be enabled. Only for legacy drivers. Do not use. ``DRIVER_HAVE_DMA`` Driver supports DMA, the userspace DMA API will be supported. Only for legacy drivers. Do not use. ``DRIVER_HAVE_IRQ`` Legacy irq support. Only for legacy drivers. Do not use.h](h)}(h **Constants**h]jZ)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK8hjubjp)}(hhh](ju)}(h]``DRIVER_GEM`` Driver use the GEM memory manager. This should be set for all modern drivers. h](j{)}(h``DRIVER_GEM``h]j)}(hjh]h DRIVER_GEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK` for details. h](j{)}(h``DRIVER_RENDER``h]j)}(hjTh]h DRIVER_RENDER}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKChjNubj)}(hhh]h)}(hrDriver supports dedicated render nodes. See also the :ref:`section on render nodes ` for details.h](h5Driver supports dedicated render nodes. See also the }(hjmhhhNhNubh)}(h0:ref:`section on render nodes `h]hinline)}(hjwh]hsection on render nodes}(hj{hhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjuubah}(h]h ]h"]h$]h&]refdocj refdomainjreftyperef refexplicitrefwarnjdrm_render_nodeuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKBhjmubh for details.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKBhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jthjihKChjubju)}(hX$``DRIVER_ATOMIC`` Driver supports the full atomic modesetting userspace API. Drivers which only use atomic internally, but do not support the full userspace API (e.g. not all properties converted to atomic, or multi-plane updates are not guaranteed to be tear-free) should not set this flag. h](j{)}(h``DRIVER_ATOMIC``h]j)}(hjh]h DRIVER_ATOMIC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKJhjubj)}(hhh]h)}(hXDriver supports the full atomic modesetting userspace API. Drivers which only use atomic internally, but do not support the full userspace API (e.g. not all properties converted to atomic, or multi-plane updates are not guaranteed to be tear-free) should not set this flag.h]hXDriver supports the full atomic modesetting userspace API. Drivers which only use atomic internally, but do not support the full userspace API (e.g. not all properties converted to atomic, or multi-plane updates are not guaranteed to be tear-free) should not set this flag.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKFhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKJhjubju)}(hm``DRIVER_SYNCOBJ`` Driver supports :c:type:`drm_syncobj` for explicit synchronization of command submission. h](j{)}(h``DRIVER_SYNCOBJ``h]j)}(hjh]hDRIVER_SYNCOBJ}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKNhjubj)}(hhh]h)}(hYDriver supports :c:type:`drm_syncobj` for explicit synchronization of command submission.h](hDriver supports }(hjhhhNhNubh)}(h:c:type:`drm_syncobj`h]j)}(hjh]h drm_syncobj}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_syncobjuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKMhjubh4 for explicit synchronization of command submission.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj.hKMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKNhjubju)}(h``DRIVER_SYNCOBJ_TIMELINE`` Driver supports the timeline flavor of :c:type:`drm_syncobj` for explicit synchronization of command submission. h](j{)}(h``DRIVER_SYNCOBJ_TIMELINE``h]j)}(hjKh]hDRIVER_SYNCOBJ_TIMELINE}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKRhjEubj)}(hhh]h)}(hpDriver supports the timeline flavor of :c:type:`drm_syncobj` for explicit synchronization of command submission.h](h'Driver supports the timeline flavor of }(hjdhhhNhNubh)}(h:c:type:`drm_syncobj`h]j)}(hjnh]h drm_syncobj}(hjphhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_syncobjuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKQhjdubh4 for explicit synchronization of command submission.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKQhjaubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jthj`hKRhjubju)}(hX``DRIVER_COMPUTE_ACCEL`` Driver supports compute acceleration devices. This flag is mutually exclusive with **DRIVER_RENDER** and **DRIVER_MODESET**. Devices that support both graphics and compute acceleration should be handled by two drivers that are connected using auxiliary bus. h](j{)}(h``DRIVER_COMPUTE_ACCEL``h]j)}(hjh]hDRIVER_COMPUTE_ACCEL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKWhjubj)}(hhh]h)}(hXDriver supports compute acceleration devices. This flag is mutually exclusive with **DRIVER_RENDER** and **DRIVER_MODESET**. Devices that support both graphics and compute acceleration should be handled by two drivers that are connected using auxiliary bus.h](hSDriver supports compute acceleration devices. This flag is mutually exclusive with }(hjhhhNhNubjZ)}(h**DRIVER_RENDER**h]h DRIVER_RENDER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh and }(hjhhhNhNubjZ)}(h**DRIVER_MODESET**h]hDRIVER_MODESET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh. Devices that support both graphics and compute acceleration should be handled by two drivers that are connected using auxiliary bus.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKUhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKWhjubju)}(hS``DRIVER_GEM_GPUVA`` Driver supports user defined GPU VA bindings for GEM objects. h](j{)}(h``DRIVER_GEM_GPUVA``h]j)}(hjh]hDRIVER_GEM_GPUVA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKZhjubj)}(hhh]h)}(h=Driver supports user defined GPU VA bindings for GEM objects.h]h=Driver supports user defined GPU VA bindings for GEM objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKZhjubju)}(h``DRIVER_CURSOR_HOTSPOT`` Driver supports and requires cursor hotspot information in the cursor plane (e.g. cursor plane has to actually track the mouse cursor and the clients are required to set hotspot in order for the cursor planes to work correctly). h](j{)}(h``DRIVER_CURSOR_HOTSPOT``h]j)}(hj?h]hDRIVER_CURSOR_HOTSPOT}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK`hj9ubj)}(hhh]h)}(hDriver supports and requires cursor hotspot information in the cursor plane (e.g. cursor plane has to actually track the mouse cursor and the clients are required to set hotspot in order for the cursor planes to work correctly).h]hDriver supports and requires cursor hotspot information in the cursor plane (e.g. cursor plane has to actually track the mouse cursor and the clients are required to set hotspot in order for the cursor planes to work correctly).}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK]hjUubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jthjThK`hjubju)}(h``DRIVER_USE_AGP`` Set up DRM AGP support, see drm_agp_init(), the DRM core will manage AGP resources. New drivers don't need this. h](j{)}(h``DRIVER_USE_AGP``h]j)}(hjyh]hDRIVER_USE_AGP}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKdhjsubj)}(hhh]h)}(hpSet up DRM AGP support, see drm_agp_init(), the DRM core will manage AGP resources. New drivers don't need this.h]hrSet up DRM AGP support, see drm_agp_init(), the DRM core will manage AGP resources. New drivers don’t need this.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKchjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jthjhKdhjubju)}(hJ``DRIVER_LEGACY`` Denote a legacy driver using shadow attach. Do not use. h](j{)}(h``DRIVER_LEGACY``h]j)}(hjh]h DRIVER_LEGACY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKghjubj)}(hhh]h)}(h7Denote a legacy driver using shadow attach. Do not use.h]h7Denote a legacy driver using shadow attach. Do not use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKghjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKghjubju)}(h``DRIVER_PCI_DMA`` Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace will be enabled. Only for legacy drivers. Do not use. h](j{)}(h``DRIVER_PCI_DMA``h]j)}(hjh]hDRIVER_PCI_DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKkhjubj)}(hhh]h)}(h{Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace will be enabled. Only for legacy drivers. Do not use.h]h{Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace will be enabled. Only for legacy drivers. Do not use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKjhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKkhjubju)}(h``DRIVER_SG`` Driver can perform scatter/gather DMA, allocation and mapping of scatter/gather buffers will be enabled. Only for legacy drivers. Do not use. h](j{)}(h ``DRIVER_SG``h]j)}(hj&h]h DRIVER_SG}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKphj ubj)}(hhh]h)}(hDriver can perform scatter/gather DMA, allocation and mapping of scatter/gather buffers will be enabled. Only for legacy drivers. Do not use.h]hDriver can perform scatter/gather DMA, allocation and mapping of scatter/gather buffers will be enabled. Only for legacy drivers. Do not use.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKnhj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj;hKphjubju)}(hw``DRIVER_HAVE_DMA`` Driver supports DMA, the userspace DMA API will be supported. Only for legacy drivers. Do not use. h](j{)}(h``DRIVER_HAVE_DMA``h]j)}(hj`h]hDRIVER_HAVE_DMA}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKthjZubj)}(hhh]h)}(hbDriver supports DMA, the userspace DMA API will be supported. Only for legacy drivers. Do not use.h]hbDriver supports DMA, the userspace DMA API will be supported. Only for legacy drivers. Do not use.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKshjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jthjuhKthjubju)}(hL``DRIVER_HAVE_IRQ`` Legacy irq support. Only for legacy drivers. Do not use.h](j{)}(h``DRIVER_HAVE_IRQ``h]j)}(hjh]hDRIVER_HAVE_IRQ}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKvhjubj)}(hhh]h)}(h8Legacy irq support. Only for legacy drivers. Do not use.h]h8Legacy irq support. Only for legacy drivers. Do not use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKwhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKvhjubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKyhj_hhubh)}(hoSee :c:type:`drm_driver.driver_features `, drm_device.driver_features and drm_core_check_feature().h](hSee }(hjhhhNhNubh)}(h1:c:type:`drm_driver.driver_features `h]j)}(hjh]hdrm_driver.driver_features}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK5hjubh:, drm_device.driver_features and drm_core_check_feature().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK5hj_hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_driver (C struct) c.drm_driverhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h drm_driverh]j)}(hstruct drm_driverh](j)}(hjh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhK;ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhjKhK;ubj)}(h drm_driverh]j)}(hj8h]h drm_driver}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj:hhhjKhK;ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj6hhhjKhK;ubah}(h]j1ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjKhK;hj3hhubj))}(hhh]h)}(hDRM driver structureh]hDRM driver structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhj}hhubah}(h]h ]h"]h$]h&]uh1j(hj3hhhjKhK;ubeh}(h]h ](j structeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhj_hNhNubjP)}(hX,**Definition**:: struct drm_driver { int (*load) (struct drm_device *, unsigned long flags); int (*open) (struct drm_device *, struct drm_file *); void (*postclose) (struct drm_device *, struct drm_file *); void (*unload) (struct drm_device *); void (*release) (struct drm_device *); void (*master_set)(struct drm_device *dev, struct drm_file *file_priv, bool from_open); void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv); void (*debugfs_init)(struct drm_minor *minor); struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, size_t size); int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, uint32_t handle, uint32_t flags, int *prime_fd); int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, int prime_fd, uint32_t *handle); struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, struct dma_buf *dma_buf); struct drm_gem_object *(*gem_prime_import_sg_table)(struct drm_device *dev,struct dma_buf_attachment *attach, struct sg_table *sgt); int (*dumb_create)(struct drm_file *file_priv,struct drm_device *dev, struct drm_mode_create_dumb *args); int (*dumb_map_offset)(struct drm_file *file_priv,struct drm_device *dev, uint32_t handle, uint64_t *offset); int (*fbdev_probe)(struct drm_fb_helper *fbdev_helper, struct drm_fb_helper_surface_size *sizes); void (*show_fdinfo)(struct drm_printer *p, struct drm_file *f); int major; int minor; int patchlevel; char *name; char *desc; u32 driver_features; const struct drm_ioctl_desc *ioctls; int num_ioctls; const struct file_operations *fops; }; **Members** ``load`` Backward-compatible driver callback to complete initialization steps after the driver is registered. For this reason, may suffer from race conditions and its use is deprecated for new drivers. It is therefore only supported for existing drivers not yet converted to the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for proper and race-free way to set up a :c:type:`struct drm_device `. This is deprecated, do not use! Returns: Zero on success, non-zero value on failure. ``open`` Driver callback when a new :c:type:`struct drm_file ` is opened. Useful for setting up driver-private data structures like buffer allocators, execution contexts or similar things. Such driver-private resources must be released again in **postclose**. Since the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to set up any modeset related resources in this callback. Doing so would be a driver design bug. Returns: 0 on success, a negative error code on failure, which will be promoted to userspace as the result of the open() system call. ``postclose`` One of the driver callbacks when a new :c:type:`struct drm_file ` is closed. Useful for tearing down driver-private data structures allocated in **open** like buffer allocators, execution contexts or similar things. Since the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to tear down any modeset related resources in this callback. Doing so would be a driver design bug. ``unload`` Reverse the effects of the driver load callback. Ideally, the clean up performed by the driver should happen in the reverse order of the initialization. Similarly to the load hook, this handler is deprecated and its usage should be dropped in favor of an open-coded teardown function at the driver layer. See drm_dev_unregister() and drm_dev_put() for the proper way to remove a :c:type:`struct drm_device `. The unload() hook is called right after unregistering the device. ``release`` Optional callback for destroying device data after the final reference is released, i.e. the device is being destroyed. This is deprecated, clean up all memory allocations associated with a :c:type:`drm_device` using drmm_add_action(), drmm_kmalloc() and related managed resources functions. ``master_set`` Called whenever the minor master is set. Only used by vmwgfx. ``master_drop`` Called whenever the minor master is dropped. Only used by vmwgfx. ``debugfs_init`` Allows drivers to create driver-specific debugfs files. ``gem_create_object`` constructor for gem objects Hook for allocating the GEM object struct, for use by the CMA and SHMEM GEM helpers. Returns a GEM object on success, or an ERR_PTR()-encoded error code otherwise. ``prime_handle_to_fd`` PRIME export function. Only used by vmwgfx. ``prime_fd_to_handle`` PRIME import function. Only used by vmwgfx. ``gem_prime_import`` Import hook for GEM drivers. This defaults to drm_gem_prime_import() if not set. ``gem_prime_import_sg_table`` Optional hook used by the PRIME helper functions drm_gem_prime_import() respectively drm_gem_prime_import_dev(). ``dumb_create`` This creates a new dumb buffer in the driver's backing storage manager (GEM, TTM or something else entirely) and returns the resulting buffer handle. This handle can then be wrapped up into a framebuffer modeset object. Note that userspace is not allowed to use such objects for render acceleration - drivers must create their own private ioctls for such a use case. Width, height and depth are specified in the :c:type:`drm_mode_create_dumb` argument. The callback needs to fill the handle, pitch and size for the created buffer. Called by the user via ioctl. Returns: Zero on success, negative errno on failure. ``dumb_map_offset`` Allocate an offset in the drm device node's address space to be able to memory map a dumb buffer. The default implementation is drm_gem_create_mmap_offset(). GEM based drivers must not overwrite this. Called by the user via ioctl. Returns: Zero on success, negative errno on failure. ``fbdev_probe`` Allocates and initialize the fb_info structure for fbdev emulation. Furthermore it also needs to allocate the DRM framebuffer used to back the fbdev. This callback is mandatory for fbdev support. Returns: 0 on success ot a negative error code otherwise. ``show_fdinfo`` Print device specific fdinfo. See Documentation/gpu/drm-usage-stats.rst. ``major`` driver major number ``minor`` driver minor number ``patchlevel`` driver patch level ``name`` driver name ``desc`` driver description ``driver_features`` Driver features, see :c:type:`enum drm_driver_feature `. Drivers can disable some features on a per-instance basis using :c:type:`drm_device.driver_features `. ``ioctls`` Array of driver-private IOCTL description entries. See the chapter on :ref:`IOCTL support in the userland interfaces chapter` for the full details. ``num_ioctls`` Number of entries in **ioctls**. ``fops`` File operations for the DRM device node. See the discussion in :ref:`file operations` for in-depth coverage and some examples.h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubj2)}(hXstruct drm_driver { int (*load) (struct drm_device *, unsigned long flags); int (*open) (struct drm_device *, struct drm_file *); void (*postclose) (struct drm_device *, struct drm_file *); void (*unload) (struct drm_device *); void (*release) (struct drm_device *); void (*master_set)(struct drm_device *dev, struct drm_file *file_priv, bool from_open); void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv); void (*debugfs_init)(struct drm_minor *minor); struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, size_t size); int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, uint32_t handle, uint32_t flags, int *prime_fd); int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, int prime_fd, uint32_t *handle); struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, struct dma_buf *dma_buf); struct drm_gem_object *(*gem_prime_import_sg_table)(struct drm_device *dev,struct dma_buf_attachment *attach, struct sg_table *sgt); int (*dumb_create)(struct drm_file *file_priv,struct drm_device *dev, struct drm_mode_create_dumb *args); int (*dumb_map_offset)(struct drm_file *file_priv,struct drm_device *dev, uint32_t handle, uint64_t *offset); int (*fbdev_probe)(struct drm_fb_helper *fbdev_helper, struct drm_fb_helper_surface_size *sizes); void (*show_fdinfo)(struct drm_printer *p, struct drm_file *f); int major; int minor; int patchlevel; char *name; char *desc; u32 driver_features; const struct drm_ioctl_desc *ioctls; int num_ioctls; const struct file_operations *fops; };h]hXstruct drm_driver { int (*load) (struct drm_device *, unsigned long flags); int (*open) (struct drm_device *, struct drm_file *); void (*postclose) (struct drm_device *, struct drm_file *); void (*unload) (struct drm_device *); void (*release) (struct drm_device *); void (*master_set)(struct drm_device *dev, struct drm_file *file_priv, bool from_open); void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv); void (*debugfs_init)(struct drm_minor *minor); struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, size_t size); int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, uint32_t handle, uint32_t flags, int *prime_fd); int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, int prime_fd, uint32_t *handle); struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, struct dma_buf *dma_buf); struct drm_gem_object *(*gem_prime_import_sg_table)(struct drm_device *dev,struct dma_buf_attachment *attach, struct sg_table *sgt); int (*dumb_create)(struct drm_file *file_priv,struct drm_device *dev, struct drm_mode_create_dumb *args); int (*dumb_map_offset)(struct drm_file *file_priv,struct drm_device *dev, uint32_t handle, uint64_t *offset); int (*fbdev_probe)(struct drm_fb_helper *fbdev_helper, struct drm_fb_helper_surface_size *sizes); void (*show_fdinfo)(struct drm_printer *p, struct drm_file *f); int major; int minor; int patchlevel; char *name; char *desc; u32 driver_features; const struct drm_ioctl_desc *ioctls; int num_ioctls; const struct file_operations *fops; };}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh)}(h **Members**h]jZ)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubjp)}(hhh](ju)}(hX``load`` Backward-compatible driver callback to complete initialization steps after the driver is registered. For this reason, may suffer from race conditions and its use is deprecated for new drivers. It is therefore only supported for existing drivers not yet converted to the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for proper and race-free way to set up a :c:type:`struct drm_device `. This is deprecated, do not use! Returns: Zero on success, non-zero value on failure. h](j{)}(h``load``h]j)}(hjh]hload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubj)}(hhh](h)}(hXBackward-compatible driver callback to complete initialization steps after the driver is registered. For this reason, may suffer from race conditions and its use is deprecated for new drivers. It is therefore only supported for existing drivers not yet converted to the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for proper and race-free way to set up a :c:type:`struct drm_device `.h](hXvBackward-compatible driver callback to complete initialization steps after the driver is registered. For this reason, may suffer from race conditions and its use is deprecated for new drivers. It is therefore only supported for existing drivers not yet converted to the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for proper and race-free way to set up a }(hjhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjh]hstruct drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj-hKhjubh)}(hThis is deprecated, do not use!h]hThis is deprecated, do not use!}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh)}(hReturns:h]hReturns:}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh)}(h+Zero on success, non-zero value on failure.h]h+Zero on success, non-zero value on failure.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubju)}(hX``open`` Driver callback when a new :c:type:`struct drm_file ` is opened. Useful for setting up driver-private data structures like buffer allocators, execution contexts or similar things. Such driver-private resources must be released again in **postclose**. Since the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to set up any modeset related resources in this callback. Doing so would be a driver design bug. Returns: 0 on success, a negative error code on failure, which will be promoted to userspace as the result of the open() system call. h](j{)}(h``open``h]j)}(hjvh]hopen}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjpubj)}(hhh](h)}(hXDriver callback when a new :c:type:`struct drm_file ` is opened. Useful for setting up driver-private data structures like buffer allocators, execution contexts or similar things. Such driver-private resources must be released again in **postclose**.h](hDriver callback when a new }(hjhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hjh]hstruct drm_file}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh is opened. Useful for setting up driver-private data structures like buffer allocators, execution contexts or similar things. Such driver-private resources must be released again in }(hjhhhNhNubjZ)}(h **postclose**h]h postclose}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubh)}(hXDSince the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to set up any modeset related resources in this callback. Doing so would be a driver design bug.h](hGSince the display/modeset side of DRM can only be owned by exactly one }(hjhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hjh]hstruct drm_file}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh (see }(hjhhhNhNubh)}(h':c:type:`drm_file.is_master `h]j)}(hjh]hdrm_file.is_master}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhjhKhjubh and }(hjhhhNhNubh)}(h(:c:type:`drm_device.master `h]j)}(hj$h]hdrm_device.master}(hj&hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjhKhjubh) there should never be a need to set up any modeset related resources in this callback. Doing so would be a driver design bug.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubh)}(hReturns:h]hReturns:}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh)}(h|0 on success, a negative error code on failure, which will be promoted to userspace as the result of the open() system call.h]h|0 on success, a negative error code on failure, which will be promoted to userspace as the result of the open() system call.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubju)}(hX9``postclose`` One of the driver callbacks when a new :c:type:`struct drm_file ` is closed. Useful for tearing down driver-private data structures allocated in **open** like buffer allocators, execution contexts or similar things. Since the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to tear down any modeset related resources in this callback. Doing so would be a driver design bug. h](j{)}(h ``postclose``h]j)}(hj{h]h postclose}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjuubj)}(hhh](h)}(hOne of the driver callbacks when a new :c:type:`struct drm_file ` is closed. Useful for tearing down driver-private data structures allocated in **open** like buffer allocators, execution contexts or similar things.h](h'One of the driver callbacks when a new }(hjhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hjh]hstruct drm_file}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubhP is closed. Useful for tearing down driver-private data structures allocated in }(hjhhhNhNubjZ)}(h**open**h]hopen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh> like buffer allocators, execution contexts or similar things.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubh)}(hXGSince the display/modeset side of DRM can only be owned by exactly one :c:type:`struct drm_file ` (see :c:type:`drm_file.is_master ` and :c:type:`drm_device.master `) there should never be a need to tear down any modeset related resources in this callback. Doing so would be a driver design bug.h](hGSince the display/modeset side of DRM can only be owned by exactly one }(hjhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hjh]hstruct drm_file}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh (see }(hjhhhNhNubh)}(h':c:type:`drm_file.is_master `h]j)}(hjh]hdrm_file.is_master}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhjhKhjubh and }(hjhhhNhNubh)}(h(:c:type:`drm_device.master `h]j)}(hj)h]hdrm_device.master}(hj+hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjhKhjubh) there should never be a need to tear down any modeset related resources in this callback. Doing so would be a driver design bug.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubju)}(hX``unload`` Reverse the effects of the driver load callback. Ideally, the clean up performed by the driver should happen in the reverse order of the initialization. Similarly to the load hook, this handler is deprecated and its usage should be dropped in favor of an open-coded teardown function at the driver layer. See drm_dev_unregister() and drm_dev_put() for the proper way to remove a :c:type:`struct drm_device `. The unload() hook is called right after unregistering the device. h](j{)}(h ``unload``h]j)}(hjbh]hunload}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhj\ubj)}(hhh](h)}(hXReverse the effects of the driver load callback. Ideally, the clean up performed by the driver should happen in the reverse order of the initialization. Similarly to the load hook, this handler is deprecated and its usage should be dropped in favor of an open-coded teardown function at the driver layer. See drm_dev_unregister() and drm_dev_put() for the proper way to remove a :c:type:`struct drm_device `.h](hX~Reverse the effects of the driver load callback. Ideally, the clean up performed by the driver should happen in the reverse order of the initialization. Similarly to the load hook, this handler is deprecated and its usage should be dropped in favor of an open-coded teardown function at the driver layer. See drm_dev_unregister() and drm_dev_put() for the proper way to remove a }(hj{hhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjh]hstruct drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjxubh)}(hAThe unload() hook is called right after unregistering the device.h]hAThe unload() hook is called right after unregistering the device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjxubeh}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jthjwhKhjubju)}(hX1``release`` Optional callback for destroying device data after the final reference is released, i.e. the device is being destroyed. This is deprecated, clean up all memory allocations associated with a :c:type:`drm_device` using drmm_add_action(), drmm_kmalloc() and related managed resources functions. h](j{)}(h ``release``h]j)}(hjh]hrelease}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjubj)}(hhh](h)}(hwOptional callback for destroying device data after the final reference is released, i.e. the device is being destroyed.h]hwOptional callback for destroying device data after the final reference is released, i.e. the device is being destroyed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhjubh)}(hThis is deprecated, clean up all memory allocations associated with a :c:type:`drm_device` using drmm_add_action(), drmm_kmalloc() and related managed resources functions.h](hFThis is deprecated, clean up all memory allocations associated with a }(hjhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjh]h drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjubhQ using drmm_add_action(), drmm_kmalloc() and related managed resources functions.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(hM``master_set`` Called whenever the minor master is set. Only used by vmwgfx. h](j{)}(h``master_set``h]j)}(hj:h]h master_set}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hj4ubj)}(hhh]h)}(h=Called whenever the minor master is set. Only used by vmwgfx.h]h=Called whenever the minor master is set. Only used by vmwgfx.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhM hjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jthjOhM hjubju)}(hR``master_drop`` Called whenever the minor master is dropped. Only used by vmwgfx. h](j{)}(h``master_drop``h]j)}(hjsh]h master_drop}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjmubj)}(hhh]h)}(hACalled whenever the minor master is dropped. Only used by vmwgfx.h]hACalled whenever the minor master is dropped. Only used by vmwgfx.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(hI``debugfs_init`` Allows drivers to create driver-specific debugfs files. h](j{)}(h``debugfs_init``h]j)}(hjh]h debugfs_init}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjubj)}(hhh]h)}(h7Allows drivers to create driver-specific debugfs files.h]h7Allows drivers to create driver-specific debugfs files.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(h``gem_create_object`` constructor for gem objects Hook for allocating the GEM object struct, for use by the CMA and SHMEM GEM helpers. Returns a GEM object on success, or an ERR_PTR()-encoded error code otherwise. h](j{)}(h``gem_create_object``h]j)}(hjh]hgem_create_object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM"hjubj)}(hhh](h)}(hconstructor for gem objectsh]hconstructor for gem objects}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjubh)}(hHook for allocating the GEM object struct, for use by the CMA and SHMEM GEM helpers. Returns a GEM object on success, or an ERR_PTR()-encoded error code otherwise.h]hHook for allocating the GEM object struct, for use by the CMA and SHMEM GEM helpers. Returns a GEM object on success, or an ERR_PTR()-encoded error code otherwise.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM"hjubju)}(hC``prime_handle_to_fd`` PRIME export function. Only used by vmwgfx. h](j{)}(h``prime_handle_to_fd``h]j)}(hj.h]hprime_handle_to_fd}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM(hj(ubj)}(hhh]h)}(h+PRIME export function. Only used by vmwgfx.h]h+PRIME export function. Only used by vmwgfx.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChM(hjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jthjChM(hjubju)}(hC``prime_fd_to_handle`` PRIME import function. Only used by vmwgfx. h](j{)}(h``prime_fd_to_handle``h]j)}(hjgh]hprime_fd_to_handle}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM/hjaubj)}(hhh]h)}(h+PRIME import function. Only used by vmwgfx.h]h+PRIME import function. Only used by vmwgfx.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM/hj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jthj|hM/hjubju)}(hg``gem_prime_import`` Import hook for GEM drivers. This defaults to drm_gem_prime_import() if not set. h](j{)}(h``gem_prime_import``h]j)}(hjh]hgem_prime_import}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM9hjubj)}(hhh](h)}(hImport hook for GEM drivers.h]hImport hook for GEM drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM7hjubh)}(h3This defaults to drm_gem_prime_import() if not set.h]h3This defaults to drm_gem_prime_import() if not set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM9hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM9hjubju)}(h``gem_prime_import_sg_table`` Optional hook used by the PRIME helper functions drm_gem_prime_import() respectively drm_gem_prime_import_dev(). h](j{)}(h``gem_prime_import_sg_table``h]j)}(hjh]hgem_prime_import_sg_table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMAhjubj)}(hhh]h)}(hpOptional hook used by the PRIME helper functions drm_gem_prime_import() respectively drm_gem_prime_import_dev().h]hpOptional hook used by the PRIME helper functions drm_gem_prime_import() respectively drm_gem_prime_import_dev().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM@hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMAhjubju)}(hX{``dumb_create`` This creates a new dumb buffer in the driver's backing storage manager (GEM, TTM or something else entirely) and returns the resulting buffer handle. This handle can then be wrapped up into a framebuffer modeset object. Note that userspace is not allowed to use such objects for render acceleration - drivers must create their own private ioctls for such a use case. Width, height and depth are specified in the :c:type:`drm_mode_create_dumb` argument. The callback needs to fill the handle, pitch and size for the created buffer. Called by the user via ioctl. Returns: Zero on success, negative errno on failure. h](j{)}(h``dumb_create``h]j)}(hj" h]h dumb_create}(hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM[hj ubj)}(hhh](h)}(hThis creates a new dumb buffer in the driver's backing storage manager (GEM, TTM or something else entirely) and returns the resulting buffer handle. This handle can then be wrapped up into a framebuffer modeset object.h]hThis creates a new dumb buffer in the driver’s backing storage manager (GEM, TTM or something else entirely) and returns the resulting buffer handle. This handle can then be wrapped up into a framebuffer modeset object.}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMKhj8 ubh)}(hNote that userspace is not allowed to use such objects for render acceleration - drivers must create their own private ioctls for such a use case.h]hNote that userspace is not allowed to use such objects for render acceleration - drivers must create their own private ioctls for such a use case.}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMOhj8 ubh)}(hWidth, height and depth are specified in the :c:type:`drm_mode_create_dumb` argument. The callback needs to fill the handle, pitch and size for the created buffer.h](h-Width, height and depth are specified in the }(hjY hhhNhNubh)}(h:c:type:`drm_mode_create_dumb`h]j)}(hjc h]hdrm_mode_create_dumb}(hje hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhja ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_mode_create_dumbuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMShjY ubhX argument. The callback needs to fill the handle, pitch and size for the created buffer.}(hjY hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMShj8 ubh)}(hCalled by the user via ioctl.h]hCalled by the user via ioctl.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMWhj8 ubh)}(hReturns:h]hReturns:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMYhj8 ubh)}(h+Zero on success, negative errno on failure.h]h+Zero on success, negative errno on failure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7 hM[hj8 ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj7 hM[hjubju)}(hX4``dumb_map_offset`` Allocate an offset in the drm device node's address space to be able to memory map a dumb buffer. The default implementation is drm_gem_create_mmap_offset(). GEM based drivers must not overwrite this. Called by the user via ioctl. Returns: Zero on success, negative errno on failure. h](j{)}(h``dumb_map_offset``h]j)}(hj h]hdumb_map_offset}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMmhj ubj)}(hhh](h)}(haAllocate an offset in the drm device node's address space to be able to memory map a dumb buffer.h]hcAllocate an offset in the drm device node’s address space to be able to memory map a dumb buffer.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMchj ubh)}(hfThe default implementation is drm_gem_create_mmap_offset(). GEM based drivers must not overwrite this.h]hfThe default implementation is drm_gem_create_mmap_offset(). GEM based drivers must not overwrite this.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMfhj ubh)}(hCalled by the user via ioctl.h]hCalled by the user via ioctl.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMihj ubh)}(hReturns:h]hReturns:}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMkhj ubh)}(h+Zero on success, negative errno on failure.h]h+Zero on success, negative errno on failure.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMmhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj hMmhjubju)}(hX``fbdev_probe`` Allocates and initialize the fb_info structure for fbdev emulation. Furthermore it also needs to allocate the DRM framebuffer used to back the fbdev. This callback is mandatory for fbdev support. Returns: 0 on success ot a negative error code otherwise. h](j{)}(h``fbdev_probe``h]j)}(hj>!h]h fbdev_probe}(hj@!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`. Drivers can disable some features on a per-instance basis using :c:type:`drm_device.driver_features `. h](j{)}(h``driver_features``h]j)}(hj"h]hdriver_features}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj"ubj)}(hhh]h)}(hDriver features, see :c:type:`enum drm_driver_feature `. Drivers can disable some features on a per-instance basis using :c:type:`drm_device.driver_features `.h](hDriver features, see }(hj#hhhNhNubh)}(h6:c:type:`enum drm_driver_feature `h]j)}(hj#h]henum drm_driver_feature}(hj#hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_driver_featureuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj#ubhB. Drivers can disable some features on a per-instance basis using }(hj#hhhNhNubh)}(h1:c:type:`drm_device.driver_features `h]j)}(hjA#h]hdrm_device.driver_features}(hjC#hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj?#ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj:#hMhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj:#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jthj#hMhjubju)}(h``ioctls`` Array of driver-private IOCTL description entries. See the chapter on :ref:`IOCTL support in the userland interfaces chapter` for the full details. h](j{)}(h ``ioctls``h]j)}(hjz#h]hioctls}(hj|#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx#ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhjt#ubj)}(hhh]h)}(hArray of driver-private IOCTL description entries. See the chapter on :ref:`IOCTL support in the userland interfaces chapter` for the full details.h](hFArray of driver-private IOCTL description entries. See the chapter on }(hj#hhhNhNubh)}(hI:ref:`IOCTL support in the userland interfaces chapter`h]jz)}(hj#h]h0IOCTL support in the userland interfaces chapter}(hj#hhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhj#ubah}(h]h ]h"]h$]h&]refdocj refdomainj#reftyperef refexplicitrefwarnjdrm_driver_ioctluh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj#ubh for the full details.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjt#ubeh}(h]h ]h"]h$]h&]uh1jthj#hMhjubju)}(h0``num_ioctls`` Number of entries in **ioctls**. h](j{)}(h``num_ioctls``h]j)}(hj#h]h num_ioctls}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhj#ubj)}(hhh]h)}(h Number of entries in **ioctls**.h](hNumber of entries in }(hj#hhhNhNubjZ)}(h **ioctls**h]hioctls}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj#hKhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jthj#hKhjubju)}(h``fops`` File operations for the DRM device node. See the discussion in :ref:`file operations` for in-depth coverage and some examples.h](j{)}(h``fops``h]j)}(hj#$h]hfops}(hj%$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!$ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj$ubj)}(hhh]h)}(hFile operations for the DRM device node. See the discussion in :ref:`file operations` for in-depth coverage and some examples.h](h?File operations for the DRM device node. See the discussion in }(hj<$hhhNhNubh)}(h':ref:`file operations`h]jz)}(hjF$h]hfile operations}(hjH$hhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjD$ubah}(h]h ]h"]h$]h&]refdocj refdomainjR$reftyperef refexplicitrefwarnjdrm_driver_fopsuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj<$ubh) for in-depth coverage and some examples.}(hj<$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjd$hMhj9$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jthj8$hMhjubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubh)}(h**Description**h]jZ)}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj$ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj_hhubh)}(hXdThis structure represent the common code for a family of cards. There will be one :c:type:`struct drm_device ` for each card present in this family. It contains lots of vfunc entries, and a pile of those probably should be moved to more appropriate places like :c:type:`drm_mode_config_funcs` or into a new operations structure for GEM drivers.h](hRThis structure represent the common code for a family of cards. There will be one }(hj$hhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hj$h]hstruct drm_device}(hj$hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhKhj$ubh for each card present in this family. It contains lots of vfunc entries, and a pile of those probably should be moved to more appropriate places like }(hj$hhhNhNubh)}(h:c:type:`drm_mode_config_funcs`h]j)}(hj$h]hdrm_mode_config_funcs}(hj$hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_mode_config_funcsuh1hhj$hKhj$ubh4 or into a new operations structure for GEM drivers.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj$hKhj_hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdevm_drm_dev_alloc (C macro)c.devm_drm_dev_allochNtauh1jhj_hhhNhNubj)}(hhh](j)}(hdevm_drm_dev_alloch]j)}(hdevm_drm_dev_alloch]j)}(hdevm_drm_dev_alloch]j)}(hj%h]hdevm_drm_dev_alloc}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj %hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhj%hhhj%%hMubah}(h]j%ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj%%hMhj%hhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hj%hhhj%%hMubeh}(h]h ](j macroeh"]h$]h&]jIj jJj>%jKj>%jLjMjNuh1jhhhj_hNhNubh)}(h5``devm_drm_dev_alloc (parent, driver, type, member)``h]j)}(hjD%h]h1devm_drm_dev_alloc (parent, driver, type, member)}(hjF%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB%ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj_hhubh block_quote)}(h?Resource managed allocation of a :c:type:`drm_device` instance h]h)}(h>Resource managed allocation of a :c:type:`drm_device` instanceh](h!Resource managed allocation of a }(hj`%hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjj%h]h drm_device}(hjl%hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjh%ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj`%ubh instance}(hj`%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj%hMhj\%ubah}(h]h ]h"]h$]h&]uh1jZ%hj%hMhj_hhubjP)}(hX**Parameters** ``parent`` Parent device object ``driver`` DRM driver ``type`` the type of the struct which contains struct :c:type:`drm_device` ``member`` the name of the :c:type:`drm_device` within **type**. **Description** This allocates and initialize a new DRM device. No device registration is done. Call drm_dev_register() to advertice the device to user space and register it with other core subsystems. This should be done last in the device initialization sequence to make sure userspace can't access an inconsistent state. The initial ref-count of the object is 1. Use drm_dev_get() and drm_dev_put() to take and drop further ref-counts. It is recommended that drivers embed :c:type:`struct drm_device ` into their own device structure. Note that this manages the lifetime of the resulting :c:type:`drm_device` automatically using devres. The DRM device initialized with this function is automatically put on driver detach using drm_dev_put(). **Return** Pointer to new DRM device, or ERR_PTR on failure.h](h)}(h**Parameters**h]jZ)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj%ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubjp)}(hhh](ju)}(h ``parent`` Parent device object h](j{)}(h ``parent``h]j)}(hj%h]hparent}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubj)}(hhh]h)}(hParent device objecth]hParent device object}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jthj%hMhj%ubju)}(h``driver`` DRM driver h](j{)}(h ``driver``h]j)}(hj%h]hdriver}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubj)}(hhh]h)}(h DRM driverh]h DRM driver}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj &hMhj &ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jthj &hMhj%ubju)}(hK``type`` the type of the struct which contains struct :c:type:`drm_device` h](j{)}(h``type``h]j)}(hj/&h]htype}(hj1&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-&ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj)&ubj)}(hhh]h)}(hAthe type of the struct which contains struct :c:type:`drm_device`h](h-the type of the struct which contains struct }(hjH&hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjR&h]h drm_device}(hjT&hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjP&ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjD&hMhjH&ubeh}(h]h ]h"]h$]h&]uh1hhjD&hMhjE&ubah}(h]h ]h"]h$]h&]uh1jhj)&ubeh}(h]h ]h"]h$]h&]uh1jthjD&hMhj%ubju)}(hA``member`` the name of the :c:type:`drm_device` within **type**. h](j{)}(h ``member``h]j)}(hj&h]hmember}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj&ubj)}(hhh]h)}(h5the name of the :c:type:`drm_device` within **type**.h](hthe name of the }(hj&hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj&h]h drm_device}(hj&hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj&hMhj&ubh within }(hj&hhhNhNubjZ)}(h**type**h]htype}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj&ubh.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jthj&hMhj%ubeh}(h]h ]h"]h$]h&]uh1johj%ubh)}(h**Description**h]jZ)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj&ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubh)}(hX3This allocates and initialize a new DRM device. No device registration is done. Call drm_dev_register() to advertice the device to user space and register it with other core subsystems. This should be done last in the device initialization sequence to make sure userspace can't access an inconsistent state.h]hX5This allocates and initialize a new DRM device. No device registration is done. Call drm_dev_register() to advertice the device to user space and register it with other core subsystems. This should be done last in the device initialization sequence to make sure userspace can’t access an inconsistent state.}(hj 'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubh)}(hrThe initial ref-count of the object is 1. Use drm_dev_get() and drm_dev_put() to take and drop further ref-counts.h]hrThe initial ref-count of the object is 1. Use drm_dev_get() and drm_dev_put() to take and drop further ref-counts.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubh)}(hnIt is recommended that drivers embed :c:type:`struct drm_device ` into their own device structure.h](h%It is recommended that drivers embed }(hj+'hhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hj5'h]hstruct drm_device}(hj7'hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj3'ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj+'ubh! into their own device structure.}(hj+'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjR'hMhj%ubh)}(hNote that this manages the lifetime of the resulting :c:type:`drm_device` automatically using devres. The DRM device initialized with this function is automatically put on driver detach using drm_dev_put().h](h5Note that this manages the lifetime of the resulting }(hj]'hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjg'h]h drm_device}(hji'hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhje'ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj]'ubh automatically using devres. The DRM device initialized with this function is automatically put on driver detach using drm_dev_put().}(hj]'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj'hMhj%ubh)}(h **Return**h]jZ)}(hj'h]hReturn}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj'ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubh)}(h1Pointer to new DRM device, or ERR_PTR on failure.h]h1Pointer to new DRM device, or ERR_PTR on failure.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_dev_is_unplugged (C function)c.drm_dev_is_unpluggedhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h2bool drm_dev_is_unplugged (struct drm_device *dev)h]j)}(h1bool drm_dev_is_unplugged(struct drm_device *dev)h](hdesc_sig_keyword_type)}(hboolh]hbool}(hj'hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j'hj'hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj'hMubj)}(hdrm_dev_is_unpluggedh]j)}(hdrm_dev_is_unpluggedh]hdrm_dev_is_unplugged}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj'hhhj'hMubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj#(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj4(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1(ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj6(modnameN classnameNjj)}j]j)}jj'sbc.drm_dev_is_unpluggedasbuh1hhj(ubj)}(h h]h }(hjT(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hjh]h*}(hjb(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hdevh]hdev}(hjo(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj(ubah}(h]h ]h"]h$]h&]jAjBuh1jhj'hhhj'hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj'hhhj'hMubah}(h]j'ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj'hMhj'hhubj))}(hhh]h)}(his a DRM device unpluggedh]his a DRM device unplugged}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(hhubah}(h]h ]h"]h$]h&]uh1j(hj'hhhj'hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj(jKj(jLjMjNuh1jhhhj_hNhNubjP)}(hX **Parameters** ``struct drm_device *dev`` DRM device **Description** This function can be called to check whether a hotpluggable is unplugged. Unplugging itself is singalled through drm_dev_unplug(). If a device is unplugged, these two functions guarantee that any store before calling drm_dev_unplug() is visible to callers of this function after it completes WARNING: This function fundamentally races against drm_dev_unplug(). It is recommended that drivers instead use the underlying drm_dev_enter() and drm_dev_exit() function pairs.h](h)}(h**Parameters**h]jZ)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj(ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(ubjp)}(hhh]ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj(h]hstruct drm_device *dev}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jthj(hMhj(ubah}(h]h ]h"]h$]h&]uh1johj(ubh)}(h**Description**h]jZ)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj)ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(ubh)}(hX#This function can be called to check whether a hotpluggable is unplugged. Unplugging itself is singalled through drm_dev_unplug(). If a device is unplugged, these two functions guarantee that any store before calling drm_dev_unplug() is visible to callers of this function after it completesh]hX#This function can be called to check whether a hotpluggable is unplugged. Unplugging itself is singalled through drm_dev_unplug(). If a device is unplugged, these two functions guarantee that any store before calling drm_dev_unplug() is visible to callers of this function after it completes}(hj+)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(ubh)}(hWARNING: This function fundamentally races against drm_dev_unplug(). It is recommended that drivers instead use the underlying drm_dev_enter() and drm_dev_exit() function pairs.h]hWARNING: This function fundamentally races against drm_dev_unplug(). It is recommended that drivers instead use the underlying drm_dev_enter() and drm_dev_exit() function pairs.}(hj:)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(drm_core_check_all_features (C function)c.drm_core_check_all_featureshNtauh1jhj_hhhNhNubj)}(hhh](j)}(hMbool drm_core_check_all_features (const struct drm_device *dev, u32 features)h]j)}(hLbool drm_core_check_all_features(const struct drm_device *dev, u32 features)h](j')}(hj'h]hbool}(hji)hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hje)hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMubj)}(h h]h }(hjw)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje)hhhjv)hMubj)}(hdrm_core_check_all_featuresh]j)}(hdrm_core_check_all_featuresh]hdrm_core_check_all_features}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhje)hhhjv)hMubj)}(h,(const struct drm_device *dev, u32 features)h](j)}(hconst struct drm_device *devh](j)}(hconsth]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]hstruct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj)modnameN classnameNjj)}j]j)}jj)sbc.drm_core_check_all_featuresasbuh1hhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]h*}(hj *hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hdevh]hdev}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj)ubj)}(h u32 featuresh](h)}(hhh]j)}(hu32h]hu32}(hj6*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3*ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj8*modnameN classnameNjj)}j]j)c.drm_core_check_all_featuresasbuh1hhj/*ubj)}(h h]h }(hjT*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/*ubj)}(hfeaturesh]hfeatures}(hjb*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/*ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj)ubeh}(h]h ]h"]h$]h&]jAjBuh1jhje)hhhjv)hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhja)hhhjv)hMubah}(h]j\)ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjv)hMhj^)hhubj))}(hhh]h)}(hcheck driver feature flags maskh]hcheck driver feature flags mask}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj*hhubah}(h]h ]h"]h$]h&]uh1j(hj^)hhhjv)hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj*jKj*jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``const struct drm_device *dev`` DRM device to check ``u32 features`` feature flag(s) mask **Description** This checks **dev** for driver features, see :c:type:`drm_driver.driver_features `, :c:type:`drm_device.driver_features `, and the various :c:type:`enum drm_driver_feature ` flags. Returns true if all features in the **features** mask are supported, false otherwise.h](h)}(h**Parameters**h]jZ)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj*ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hj*ubjp)}(hhh](ju)}(h5``const struct drm_device *dev`` DRM device to check h](j{)}(h ``const struct drm_device *dev``h]j)}(hj*h]hconst struct drm_device *dev}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj*ubj)}(hhh]h)}(hDRM device to checkh]hDRM device to check}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jthj*hMhj*ubju)}(h&``u32 features`` feature flag(s) mask h](j{)}(h``u32 features``h]j)}(hj+h]h u32 features}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj+ubj)}(hhh]h)}(hfeature flag(s) maskh]hfeature flag(s) mask}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jthj+hMhj*ubeh}(h]h ]h"]h$]h&]uh1johj*ubh)}(h**Description**h]jZ)}(hjA+h]h Description}(hjC+hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj?+ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hj*ubh)}(hThis checks **dev** for driver features, see :c:type:`drm_driver.driver_features `, :c:type:`drm_device.driver_features `, and the various :c:type:`enum drm_driver_feature ` flags.h](h This checks }(hjW+hhhNhNubjZ)}(h**dev**h]hdev}(hj_+hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjW+ubh for driver features, see }(hjW+hhhNhNubh)}(h1:c:type:`drm_driver.driver_features `h]j)}(hjs+h]hdrm_driver.driver_features}(hju+hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjq+ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hjW+ubh, }(hjW+hhhNhNubh)}(h1:c:type:`drm_device.driver_features `h]j)}(hj+h]hdrm_device.driver_features}(hj+hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj+hM hjW+ubh, and the various }(hjW+hhhNhNubh)}(h6:c:type:`enum drm_driver_feature `h]j)}(hj+h]henum drm_driver_feature}(hj+hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_driver_featureuh1hhj+hM hjW+ubh flags.}(hjW+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj+hM hj*ubh)}(hUReturns true if all features in the **features** mask are supported, false otherwise.h](h$Returns true if all features in the }(hj+hhhNhNubjZ)}(h **features**h]hfeatures}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj+ubh% mask are supported, false otherwise.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#drm_core_check_feature (C function)c.drm_core_check_featurehNtauh1jhj_hhhNhNubj)}(hhh](j)}(h[bool drm_core_check_feature (const struct drm_device *dev, enum drm_driver_feature feature)h]j)}(hZbool drm_core_check_feature(const struct drm_device *dev, enum drm_driver_feature feature)h](j')}(hj'h]hbool}(hj",hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj,hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMubj)}(h h]h }(hj0,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj/,hMubj)}(hdrm_core_check_featureh]j)}(hdrm_core_check_featureh]hdrm_core_check_feature}(hjB,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>,ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj,hhhj/,hMubj)}(h?(const struct drm_device *dev, enum drm_driver_feature feature)h](j)}(hconst struct drm_device *devh](j)}(hj)h]hconst}(hj^,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubj)}(h h]h }(hjk,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubj)}(hjh]hstruct}(hjy,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj,modnameN classnameNjj)}j]j)}jjD,sbc.drm_core_check_featureasbuh1hhjZ,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubj)}(hdevh]hdev}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ,ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjV,ubj)}(henum drm_driver_feature featureh](j)}(hjh]henum}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubh)}(hhh]j)}(hdrm_driver_featureh]hdrm_driver_feature}(hj -hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj -modnameN classnameNjj)}j]j,c.drm_core_check_featureasbuh1hhj,ubj)}(h h]h }(hj'-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hfeatureh]hfeature}(hj5-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjV,ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj,hhhj/,hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj,hhhj/,hMubah}(h]j,ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj/,hMhj,hhubj))}(hhh]h)}(hcheck driver feature flagsh]hcheck driver feature flags}(hj_-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj\-hhubah}(h]h ]h"]h$]h&]uh1j(hj,hhhj/,hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjw-jKjw-jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``const struct drm_device *dev`` DRM device to check ``enum drm_driver_feature feature`` feature flag **Description** This checks **dev** for driver features, see :c:type:`drm_driver.driver_features `, :c:type:`drm_device.driver_features `, and the various :c:type:`enum drm_driver_feature ` flags. Returns true if the **feature** is supported, false otherwise.h](h)}(h**Parameters**h]jZ)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj-ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj{-ubjp)}(hhh](ju)}(h5``const struct drm_device *dev`` DRM device to check h](j{)}(h ``const struct drm_device *dev``h]j)}(hj-h]hconst struct drm_device *dev}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj-ubj)}(hhh]h)}(hDRM device to checkh]hDRM device to check}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jthj-hMhj-ubju)}(h1``enum drm_driver_feature feature`` feature flag h](j{)}(h#``enum drm_driver_feature feature``h]j)}(hj-h]henum drm_driver_feature feature}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj-ubj)}(hhh]h)}(h feature flagh]h feature flag}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jthj-hMhj-ubeh}(h]h ]h"]h$]h&]uh1johj{-ubh)}(h**Description**h]jZ)}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj.ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj{-ubh)}(hThis checks **dev** for driver features, see :c:type:`drm_driver.driver_features `, :c:type:`drm_device.driver_features `, and the various :c:type:`enum drm_driver_feature ` flags.h](h This checks }(hj*.hhhNhNubjZ)}(h**dev**h]hdev}(hj2.hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj*.ubh for driver features, see }(hj*.hhhNhNubh)}(h1:c:type:`drm_driver.driver_features `h]j)}(hjF.h]hdrm_driver.driver_features}(hjH.hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjD.ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhMhj*.ubh, }(hj*.hhhNhNubh)}(h1:c:type:`drm_device.driver_features `h]j)}(hjj.h]hdrm_device.driver_features}(hjl.hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjh.ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjc.hMhj*.ubh, and the various }(hj*.hhhNhNubh)}(h6:c:type:`enum drm_driver_feature `h]j)}(hj.h]henum drm_driver_feature}(hj.hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_driver_featureuh1hhjc.hMhj*.ubh flags.}(hj*.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjc.hMhj{-ubh)}(h>Returns true if the **feature** is supported, false otherwise.h](hReturns true if the }(hj.hhhNhNubjZ)}(h **feature**h]hfeature}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj.ubh is supported, false otherwise.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM hj{-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(drm_drv_uses_atomic_modeset (C function)c.drm_drv_uses_atomic_modesethNtauh1jhj_hhhNhNubj)}(hhh](j)}(h9bool drm_drv_uses_atomic_modeset (struct drm_device *dev)h]j)}(h8bool drm_drv_uses_atomic_modeset(struct drm_device *dev)h](j')}(hj'h]hbool}(hj.hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj.hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM)ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhj/hM)ubj)}(hdrm_drv_uses_atomic_modeseth]j)}(hdrm_drv_uses_atomic_modeseth]hdrm_drv_uses_atomic_modeset}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj.hhhj/hM)ubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj1/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubj)}(h h]h }(hj>/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjO/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL/ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjQ/modnameN classnameNjj)}j]j)}jj/sbc.drm_drv_uses_atomic_modesetasbuh1hhj-/ubj)}(h h]h }(hjo/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubj)}(hjh]h*}(hj}/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubj)}(hdevh]hdev}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj)/ubah}(h]h ]h"]h$]h&]jAjBuh1jhj.hhhj/hM)ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj.hhhj/hM)ubah}(h]j.ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj/hM)hj.hhubj))}(hhh]h)}(h.check if the driver implements atomic_commit()h]h.check if the driver implements atomic_commit()}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM)hj/hhubah}(h]h ]h"]h$]h&]uh1j(hj.hhhj/hM)ubeh}(h]h ](j functioneh"]h$]h&]jIj jJj/jKj/jLjMjNuh1jhhhj_hNhNubjP)}(h**Parameters** ``struct drm_device *dev`` DRM device **Description** This check is useful if drivers do not have DRIVER_ATOMIC set but have atomic modesetting internally implemented.h](h)}(h**Parameters**h]jZ)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj/ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM-hj/ubjp)}(hhh]ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj/h]hstruct drm_device *dev}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jzhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM+hj/ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 0hM+hj 0ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jthj 0hM+hj/ubah}(h]h ]h"]h$]h&]uh1johj/ubh)}(h**Description**h]jZ)}(hj00h]h Description}(hj20hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj.0ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM-hj/ubh)}(hqThis check is useful if drivers do not have DRIVER_ATOMIC set but have atomic modesetting internally implemented.h]hqThis check is useful if drivers do not have DRIVER_ATOMIC set but have atomic modesetting internally implemented.}(hjF0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:87: ./include/drm/drm_drv.hhM-hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_put_dev (C function) c.drm_put_devhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h)void drm_put_dev (struct drm_device *dev)h]j)}(h(void drm_put_dev(struct drm_device *dev)h](j')}(hvoidh]hvoid}(hju0hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjq0hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq0hhhj0hMubj)}(h drm_put_devh]j)}(h drm_put_devh]h drm_put_dev}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjq0hhhj0hMubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj0modnameN classnameNjj)}j]j)}jj0sb c.drm_put_devasbuh1hhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hdevh]hdev}(hj 1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj0ubah}(h]h ]h"]h$]h&]jAjBuh1jhjq0hhhj0hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjm0hhhj0hMubah}(h]jh0ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj0hMhjj0hhubj))}(hhh]h)}(h#Unregister and release a DRM deviceh]h#Unregister and release a DRM device}(hj51hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj21hhubah}(h]h ]h"]h$]h&]uh1j(hjj0hhhj0hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjM1jKjM1jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device **Description** Called at module unload time or when a PCI device is unplugged. Cleans up all DRM device, calling drm_lastclose(). **Note** Use of this function is deprecated. It will eventually go away completely. Please use drm_dev_unregister() and drm_dev_put() explicitly instead to make sure that the device isn't userspace accessible any more while teardown is in progress, ensuring that userspace can't access an inconsistent state.h](h)}(h**Parameters**h]jZ)}(hjW1h]h Parameters}(hjY1hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjU1ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubjp)}(hhh]ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjv1h]hstruct drm_device *dev}(hjx1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt1ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjp1ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjp1ubeh}(h]h ]h"]h$]h&]uh1jthj1hMhjm1ubah}(h]h ]h"]h$]h&]uh1johjQ1ubh)}(h**Description**h]jZ)}(hj1h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj1ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubh)}(h?Called at module unload time or when a PCI device is unplugged.h]h?Called at module unload time or when a PCI device is unplugged.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubh)}(h2Cleans up all DRM device, calling drm_lastclose().h]h2Cleans up all DRM device, calling drm_lastclose().}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubh)}(h**Note**h]jZ)}(hj1h]hNote}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj1ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubh)}(hX,Use of this function is deprecated. It will eventually go away completely. Please use drm_dev_unregister() and drm_dev_put() explicitly instead to make sure that the device isn't userspace accessible any more while teardown is in progress, ensuring that userspace can't access an inconsistent state.h]hX0Use of this function is deprecated. It will eventually go away completely. Please use drm_dev_unregister() and drm_dev_put() explicitly instead to make sure that the device isn’t userspace accessible any more while teardown is in progress, ensuring that userspace can’t access an inconsistent state.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjQ1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_enter (C function)c.drm_dev_enterhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h5bool drm_dev_enter (struct drm_device *dev, int *idx)h]j)}(h4bool drm_dev_enter(struct drm_device *dev, int *idx)h](j')}(hj'h]hbool}(hj,2hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj(2hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hj:2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(2hhhj92hMubj)}(h drm_dev_enterh]j)}(h drm_dev_enterh]h drm_dev_enter}(hjL2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH2ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj(2hhhj92hMubj)}(h"(struct drm_device *dev, int *idx)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjh2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd2ubj)}(h h]h }(hju2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd2ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj2modnameN classnameNjj)}j]j)}jjN2sbc.drm_dev_enterasbuh1hhjd2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd2ubj)}(hdevh]hdev}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd2ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj`2ubj)}(hint *idxh](j')}(hinth]hint}(hj2hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hidxh]hidx}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj`2ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj(2hhhj92hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj$2hhhj92hMubah}(h]j2ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj92hMhj!2hhubj))}(hhh]h)}(hEnter device critical sectionh]hEnter device critical section}(hj-3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj*3hhubah}(h]h ]h"]h$]h&]uh1j(hj!2hhhj92hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjE3jKjE3jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``int *idx`` Pointer to index that will be passed to the matching drm_dev_exit() **Description** This function marks and protects the beginning of a section that should not be entered after the device has been unplugged. The section end is marked with drm_dev_exit(). Calls to this function can be nested. **Return** True if it is OK to enter the section, false otherwise.h](h)}(h**Parameters**h]jZ)}(hjO3h]h Parameters}(hjQ3hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjM3ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjI3ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjn3h]hstruct drm_device *dev}(hjp3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl3ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjh3ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhjh3ubeh}(h]h ]h"]h$]h&]uh1jthj3hMhje3ubju)}(hQ``int *idx`` Pointer to index that will be passed to the matching drm_dev_exit() h](j{)}(h ``int *idx``h]j)}(hj3h]hint *idx}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj3ubj)}(hhh]h)}(hCPointer to index that will be passed to the matching drm_dev_exit()h]hCPointer to index that will be passed to the matching drm_dev_exit()}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jthj3hMhje3ubeh}(h]h ]h"]h$]h&]uh1johjI3ubh)}(h**Description**h]jZ)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj3ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjI3ubh)}(hThis function marks and protects the beginning of a section that should not be entered after the device has been unplugged. The section end is marked with drm_dev_exit(). Calls to this function can be nested.h]hThis function marks and protects the beginning of a section that should not be entered after the device has been unplugged. The section end is marked with drm_dev_exit(). Calls to this function can be nested.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjI3ubh)}(h **Return**h]jZ)}(hj 4h]hReturn}(hj 4hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj4ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjI3ubh)}(h7True if it is OK to enter the section, false otherwise.h]h7True if it is OK to enter the section, false otherwise.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjI3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_exit (C function)c.drm_dev_exithNtauh1jhj_hhhNhNubj)}(hhh](j)}(hvoid drm_dev_exit (int idx)h]j)}(hvoid drm_dev_exit(int idx)h](j')}(hvoidh]hvoid}(hjN4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjJ4hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hj]4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ4hhhj\4hMubj)}(h drm_dev_exith]j)}(h drm_dev_exith]h drm_dev_exit}(hjo4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk4ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjJ4hhhj\4hMubj)}(h (int idx)h]j)}(hint idxh](j')}(hinth]hint}(hj4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hidxh]hidx}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj4ubah}(h]h ]h"]h$]h&]jAjBuh1jhjJ4hhhj\4hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjF4hhhj\4hMubah}(h]jA4ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj\4hMhjC4hhubj))}(hhh]h)}(hExit device critical sectionh]hExit device critical section}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj4hhubah}(h]h ]h"]h$]h&]uh1j(hjC4hhhj\4hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj4jKj4jLjMjNuh1jhhhj_hNhNubjP)}(h**Parameters** ``int idx`` index returned from drm_dev_enter() **Description** This function marks the end of a section that should not be entered after the device has been unplugged.h](h)}(h**Parameters**h]jZ)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj4ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj4ubjp)}(hhh]ju)}(h0``int idx`` index returned from drm_dev_enter() h](j{)}(h ``int idx``h]j)}(hj5h]hint idx}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj 5ubj)}(hhh]h)}(h#index returned from drm_dev_enter()h]h#index returned from drm_dev_enter()}(hj+5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'5hMhj(5ubah}(h]h ]h"]h$]h&]uh1jhj 5ubeh}(h]h ]h"]h$]h&]uh1jthj'5hMhj 5ubah}(h]h ]h"]h$]h&]uh1johj4ubh)}(h**Description**h]jZ)}(hjM5h]h Description}(hjO5hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjK5ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj4ubh)}(hhThis function marks the end of a section that should not be entered after the device has been unplugged.h]hhThis function marks the end of a section that should not be entered after the device has been unplugged.}(hjc5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_unplug (C function)c.drm_dev_unplughNtauh1jhj_hhhNhNubj)}(hhh](j)}(h,void drm_dev_unplug (struct drm_device *dev)h]j)}(h+void drm_dev_unplug(struct drm_device *dev)h](j')}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj5hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhj5hMubj)}(hdrm_dev_unplugh]j)}(hdrm_dev_unplugh]hdrm_dev_unplug}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj5hhhj5hMubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj5modnameN classnameNjj)}j]j)}jj5sbc.drm_dev_unplugasbuh1hhj5ubj)}(h h]h }(hj 6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hdevh]hdev}(hj(6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj5ubah}(h]h ]h"]h$]h&]jAjBuh1jhj5hhhj5hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj5hhhj5hMubah}(h]j5ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj5hMhj5hhubj))}(hhh]h)}(hunplug a DRM deviceh]hunplug a DRM device}(hjR6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjO6hhubah}(h]h ]h"]h$]h&]uh1j(hj5hhhj5hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjj6jKjj6jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device **Description** This unplugs a hotpluggable DRM device, which makes it inaccessible to userspace operations. Entry-points can use drm_dev_enter() and drm_dev_exit() to protect device resources in a race free manner. This essentially unregisters the device like drm_dev_unregister(), but can be called while there are still open users of **dev**.h](h)}(h**Parameters**h]jZ)}(hjt6h]h Parameters}(hjv6hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjr6ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjn6ubjp)}(hhh]ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj6h]hstruct drm_device *dev}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj6ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jthj6hMhj6ubah}(h]h ]h"]h$]h&]uh1johjn6ubh)}(h**Description**h]jZ)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj6ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjn6ubh)}(hXIThis unplugs a hotpluggable DRM device, which makes it inaccessible to userspace operations. Entry-points can use drm_dev_enter() and drm_dev_exit() to protect device resources in a race free manner. This essentially unregisters the device like drm_dev_unregister(), but can be called while there are still open users of **dev**.h](hXAThis unplugs a hotpluggable DRM device, which makes it inaccessible to userspace operations. Entry-points can use drm_dev_enter() and drm_dev_exit() to protect device resources in a race free manner. This essentially unregisters the device like drm_dev_unregister(), but can be called while there are still open users of }(hj6hhhNhNubjZ)}(h**dev**h]hdev}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj6ubh.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjn6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_dev_set_dma_dev (C function)c.drm_dev_set_dma_devhNtauh1jhj_hhhNhNubj)}(hhh](j)}(hIvoid drm_dev_set_dma_dev (struct drm_device *dev, struct device *dma_dev)h]j)}(hHvoid drm_dev_set_dma_dev(struct drm_device *dev, struct device *dma_dev)h](j')}(hvoidh]hvoid}(hj%7hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj!7hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hj47hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!7hhhj37hMubj)}(hdrm_dev_set_dma_devh]j)}(hdrm_dev_set_dma_devh]hdrm_dev_set_dma_dev}(hjF7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB7ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj!7hhhj37hMubj)}(h0(struct drm_device *dev, struct device *dma_dev)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjb7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^7ubj)}(h h]h }(hjo7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^7ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}7ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj7modnameN classnameNjj)}j]j)}jjH7sbc.drm_dev_set_dma_devasbuh1hhj^7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^7ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^7ubj)}(hdevh]hdev}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^7ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjZ7ubj)}(hstruct device *dma_devh](j)}(hjh]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(hdeviceh]hdevice}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj7modnameN classnameNjj)}j]j7c.drm_dev_set_dma_devasbuh1hhj7ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hdma_devh]hdma_dev}(hj+8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjZ7ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj!7hhhj37hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj7hhhj37hMubah}(h]j7ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj37hMhj7hhubj))}(hhh]h)}(h#set the DMA device for a DRM deviceh]h#set the DMA device for a DRM device}(hjU8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjR8hhubah}(h]h ]h"]h$]h&]uh1j(hj7hhhj37hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjm8jKjm8jLjMjNuh1jhhhj_hNhNubjP)}(hXc**Parameters** ``struct drm_device *dev`` DRM device ``struct device *dma_dev`` DMA device or NULL **Description** Sets the DMA device of the given DRM device. Only required if the DMA device is different from the DRM device's parent. After calling this function, the DRM device holds a reference on **dma_dev**. Pass NULL to clear the DMA device.h](h)}(h**Parameters**h]jZ)}(hjw8h]h Parameters}(hjy8hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhju8ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjq8ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj8h]hstruct drm_device *dev}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj8ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jthj8hMhj8ubju)}(h.``struct device *dma_dev`` DMA device or NULL h](j{)}(h``struct device *dma_dev``h]j)}(hj8h]hstruct device *dma_dev}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj8ubj)}(hhh]h)}(hDMA device or NULLh]hDMA device or NULL}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jthj8hMhj8ubeh}(h]h ]h"]h$]h&]uh1johjq8ubh)}(h**Description**h]jZ)}(hj 9h]h Description}(hj 9hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj9ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjq8ubh)}(hSets the DMA device of the given DRM device. Only required if the DMA device is different from the DRM device's parent. After calling this function, the DRM device holds a reference on **dma_dev**. Pass NULL to clear the DMA device.h](hSets the DMA device of the given DRM device. Only required if the DMA device is different from the DRM device’s parent. After calling this function, the DRM device holds a reference on }(hj 9hhhNhNubjZ)}(h **dma_dev**h]hdma_dev}(hj(9hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj 9ubh$. Pass NULL to clear the DMA device.}(hj 9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjq8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_dev_wedged_event (C function)c.drm_dev_wedged_eventhNtauh1jhj_hhhNhNubj)}(hhh](j)}(hGint drm_dev_wedged_event (struct drm_device *dev, unsigned long method)h]j)}(hFint drm_dev_wedged_event(struct drm_device *dev, unsigned long method)h](j')}(hinth]hint}(hja9hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj]9hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hjp9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]9hhhjo9hMubj)}(hdrm_dev_wedged_eventh]j)}(hdrm_dev_wedged_eventh]hdrm_dev_wedged_event}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~9ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj]9hhhjo9hMubj)}(h.(struct drm_device *dev, unsigned long method)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj9modnameN classnameNjj)}j]j)}jj9sbc.drm_dev_wedged_eventasbuh1hhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hdevh]hdev}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj9ubj)}(hunsigned long methodh](j')}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj :ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :ubj')}(hlongh]hlong}(hj,:hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj :ubj)}(h h]h }(hj::hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :ubj)}(hmethodh]hmethod}(hjH:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj9ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj]9hhhjo9hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjY9hhhjo9hMubah}(h]jT9ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjo9hMhjV9hhubj))}(hhh]h)}(hgenerate a device wedged ueventh]hgenerate a device wedged uevent}(hjr:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjo:hhubah}(h]h ]h"]h$]h&]uh1j(hjV9hhhjo9hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj:jKj:jLjMjNuh1jhhhj_hNhNubjP)}(hXh**Parameters** ``struct drm_device *dev`` DRM device ``unsigned long method`` method(s) to be used for recovery **Description** This generates a device wedged uevent for the DRM device specified by **dev**. Recovery **method**\(s) of choice will be sent in the uevent environment as ``WEDGED=[,..,]`` in order of less to more side-effects. If caller is unsure about recovery or **method** is unknown (0), ``WEDGED=unknown`` will be sent instead. Refer to "Device Wedging" chapter in Documentation/gpu/drm-uapi.rst for more details. **Return** 0 on success, negative error code otherwise.h](h)}(h**Parameters**h]jZ)}(hj:h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj:ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM"hj:ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj:h]hstruct drm_device *dev}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj:ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jthj:hMhj:ubju)}(h;``unsigned long method`` method(s) to be used for recovery h](j{)}(h``unsigned long method``h]j)}(hj:h]hunsigned long method}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM hj:ubj)}(hhh]h)}(h!method(s) to be used for recoveryh]h!method(s) to be used for recovery}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jthj;hM hj:ubeh}(h]h ]h"]h$]h&]uh1johj:ubh)}(h**Description**h]jZ)}(hj';h]h Description}(hj);hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj%;ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM"hj:ubh)}(hXOThis generates a device wedged uevent for the DRM device specified by **dev**. Recovery **method**\(s) of choice will be sent in the uevent environment as ``WEDGED=[,..,]`` in order of less to more side-effects. If caller is unsure about recovery or **method** is unknown (0), ``WEDGED=unknown`` will be sent instead.h](hFThis generates a device wedged uevent for the DRM device specified by }(hj=;hhhNhNubjZ)}(h**dev**h]hdev}(hjE;hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj=;ubh . Recovery }(hj=;hhhNhNubjZ)}(h **method**h]hmethod}(hjW;hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj=;ubh9(s) of choice will be sent in the uevent environment as }(hj=;hhhNhNubj)}(h#``WEDGED=[,..,]``h]hWEDGED=[,..,]}(hji;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=;ubhN in order of less to more side-effects. If caller is unsure about recovery or }(hj=;hhhNhNubjZ)}(h **method**h]hmethod}(hj{;hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj=;ubh is unknown (0), }(hj=;hhhNhNubj)}(h``WEDGED=unknown``h]hWEDGED=unknown}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=;ubh will be sent instead.}(hj=;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM"hj:ubh)}(hURefer to "Device Wedging" chapter in Documentation/gpu/drm-uapi.rst for more details.h]hYRefer to “Device Wedging” chapter in Documentation/gpu/drm-uapi.rst for more details.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM(hj:ubh)}(h **Return**h]jZ)}(hj;h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj;ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM+hj:ubh)}(h,0 on success, negative error code otherwise.h]h,0 on success, negative error code otherwise.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM+hj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j__drm_dev_alloc (C function)c.__drm_dev_allochNtauh1jhj_hhhNhNubj)}(hhh](j)}(hkvoid * __drm_dev_alloc (struct device *parent, const struct drm_driver *driver, size_t size, size_t offset)h]j)}(hivoid *__drm_dev_alloc(struct device *parent, const struct drm_driver *driver, size_t size, size_t offset)h](j')}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj;hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMAubj)}(h h]h }(hj <hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj <hMAubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj <hMAubj)}(h__drm_dev_alloch]j)}(h__drm_dev_alloch]h__drm_dev_alloc}(hj*<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&<ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj;hhhj <hMAubj)}(hT(struct device *parent, const struct drm_driver *driver, size_t size, size_t offset)h](j)}(hstruct device *parenth](j)}(hjh]hstruct}(hjF<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB<ubj)}(h h]h }(hjS<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB<ubh)}(hhh]j)}(hdeviceh]hdevice}(hjd<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja<ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjf<modnameN classnameNjj)}j]j)}jj,<sbc.__drm_dev_allocasbuh1hhjB<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB<ubj)}(hparenth]hparent}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB<ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj><ubj)}(hconst struct drm_driver *driverh](j)}(hj)h]hconst}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(h drm_driverh]h drm_driver}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj<modnameN classnameNjj)}j]j<c.__drm_dev_allocasbuh1hhj<ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hdriverh]hdriver}(hj*=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj><ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjF=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC=ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjH=modnameN classnameNjj)}j]j<c.__drm_dev_allocasbuh1hhj?=ubj)}(h h]h }(hjd=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?=ubj)}(hsizeh]hsize}(hjr=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?=ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj><ubj)}(h size_t offseth](h)}(hhh]j)}(hsize_th]hsize_t}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj=modnameN classnameNjj)}j]j<c.__drm_dev_allocasbuh1hhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hoffseth]hoffset}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj><ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj;hhhj <hMAubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj;hhhj <hMAubah}(h]j;ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj <hMAhj;hhubj))}(hhh]h)}(h-Allocation of a :c:type:`drm_device` instanceh](hAllocation of a }(hj=hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj=h]h drm_device}(hj=hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]j<c.__drm_dev_allocasbj drm_deviceuh1hhj0hMhj=ubh instance}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMAhj=hhubah}(h]h ]h"]h$]h&]uh1j(hj;hhhj <hMAubeh}(h]h ](j functioneh"]h$]h&]jIj jJj$>jKj$>jLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct device *parent`` Parent device object ``const struct drm_driver *driver`` DRM driver ``size_t size`` the size of the struct which contains struct drm_device ``size_t offset`` the offset of the :c:type:`drm_device` within the container. **Description** This should *NOT* be by any drivers, but is a dedicated interface for the corresponding Rust abstraction. This is the same as devm_drm_dev_alloc(), but without the corresponding resource management through the parent device, but not the same as drm_dev_alloc(), since the latter is the deprecated version, which does not support subclassing. **Return** A pointer to new DRM device, or an ERR_PTR on failure.h](h)}(h**Parameters**h]jZ)}(hj.>h]h Parameters}(hj0>hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj,>ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMEhj(>ubjp)}(hhh](ju)}(h/``struct device *parent`` Parent device object h](j{)}(h``struct device *parent``h]j)}(hjM>h]hstruct device *parent}(hjO>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK>ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMBhjG>ubj)}(hhh]h)}(hParent device objecth]hParent device object}(hjf>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb>hMBhjc>ubah}(h]h ]h"]h$]h&]uh1jhjG>ubeh}(h]h ]h"]h$]h&]uh1jthjb>hMBhjD>ubju)}(h/``const struct drm_driver *driver`` DRM driver h](j{)}(h#``const struct drm_driver *driver``h]j)}(hj>h]hconst struct drm_driver *driver}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMChj>ubj)}(hhh]h)}(h DRM driverh]h DRM driver}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMChj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jthj>hMChjD>ubju)}(hH``size_t size`` the size of the struct which contains struct drm_device h](j{)}(h``size_t size``h]j)}(hj>h]h size_t size}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMDhj>ubj)}(hhh]h)}(h7the size of the struct which contains struct drm_deviceh]h7the size of the struct which contains struct drm_device}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMDhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jthj>hMDhjD>ubju)}(hO``size_t offset`` the offset of the :c:type:`drm_device` within the container. h](j{)}(h``size_t offset``h]j)}(hj>h]h size_t offset}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMEhj>ubj)}(hhh]h)}(hubeh}(h]h ]h"]h$]h&]uh1jthj ?hMEhjD>ubeh}(h]h ]h"]h$]h&]uh1johj(>ubh)}(h**Description**h]jZ)}(hjV?h]h Description}(hjX?hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjT?ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMGhj(>ubh)}(hiThis should *NOT* be by any drivers, but is a dedicated interface for the corresponding Rust abstraction.h](h This should }(hjl?hhhNhNubhemphasis)}(h*NOT*h]hNOT}(hjv?hhhNhNubah}(h]h ]h"]h$]h&]uh1jt?hjl?ubhX be by any drivers, but is a dedicated interface for the corresponding Rust abstraction.}(hjl?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMGhj(>ubh)}(hThis is the same as devm_drm_dev_alloc(), but without the corresponding resource management through the parent device, but not the same as drm_dev_alloc(), since the latter is the deprecated version, which does not support subclassing.h]hThis is the same as devm_drm_dev_alloc(), but without the corresponding resource management through the parent device, but not the same as drm_dev_alloc(), since the latter is the deprecated version, which does not support subclassing.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMJhj(>ubh)}(h **Return**h]jZ)}(hj?h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj?ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMOhj(>ubh)}(h6A pointer to new DRM device, or an ERR_PTR on failure.h]h6A pointer to new DRM device, or an ERR_PTR on failure.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMOhj(>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_alloc (C function)c.drm_dev_allochNtauh1jhj_hhhNhNubj)}(hhh](j)}(hZstruct drm_device * drm_dev_alloc (const struct drm_driver *driver, struct device *parent)h]j)}(hXstruct drm_device *drm_dev_alloc(const struct drm_driver *driver, struct device *parent)h](j)}(hjh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMjubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMjubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj@modnameN classnameNjj)}j]j)}j drm_dev_allocsbc.drm_dev_allocasbuh1hhj?hhhj?hMjubj)}(h h]h }(hj%@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMjubj)}(hjh]h*}(hj3@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMjubj)}(h drm_dev_alloch]j)}(hj"@h]h drm_dev_alloc}(hjD@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@@ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj?hhhj?hMjubj)}(h8(const struct drm_driver *driver, struct device *parent)h](j)}(hconst struct drm_driver *driverh](j)}(hj)h]hconst}(hj_@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubj)}(h h]h }(hjl@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubj)}(hjh]hstruct}(hjz@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubh)}(hhh]j)}(h drm_driverh]h drm_driver}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj@modnameN classnameNjj)}j]j @c.drm_dev_allocasbuh1hhj[@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubj)}(hdriverh]hdriver}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[@ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjW@ubj)}(hstruct device *parenth](j)}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(hdeviceh]hdevice}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj AmodnameN classnameNjj)}j]j @c.drm_dev_allocasbuh1hhj@ubj)}(h h]h }(hj&AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hjh]h*}(hj4AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hparenth]hparent}(hjAAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjW@ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj?hhhj?hMjubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj?hhhj?hMjubah}(h]j?ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj?hMjhj?hhubj))}(hhh]h)}(hAllocate new DRM deviceh]hAllocate new DRM device}(hjkAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMjhjhAhhubah}(h]h ]h"]h$]h&]uh1j(hj?hhhj?hMjubeh}(h]h ](j functioneh"]h$]h&]jIj jJjAjKjAjLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``const struct drm_driver *driver`` DRM driver to allocate device for ``struct device *parent`` Parent device object **Description** This is the deprecated version of devm_drm_dev_alloc(), which does not support subclassing through embedding the struct :c:type:`drm_device` in a driver private structure, and which does not support automatic cleanup through devres. **Return** Pointer to new DRM device, or ERR_PTR on failure.h](h)}(h**Parameters**h]jZ)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjAubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMnhjAubjp)}(hhh](ju)}(hF``const struct drm_driver *driver`` DRM driver to allocate device for h](j{)}(h#``const struct drm_driver *driver``h]j)}(hjAh]hconst struct drm_driver *driver}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMkhjAubj)}(hhh]h)}(h!DRM driver to allocate device forh]h!DRM driver to allocate device for}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMkhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jthjAhMkhjAubju)}(h/``struct device *parent`` Parent device object h](j{)}(h``struct device *parent``h]j)}(hjAh]hstruct device *parent}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMlhjAubj)}(hhh]h)}(hParent device objecth]hParent device object}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMlhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jthjAhMlhjAubeh}(h]h ]h"]h$]h&]uh1johjAubh)}(h**Description**h]jZ)}(hj Bh]h Description}(hj"BhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjBubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMnhjAubh)}(hThis is the deprecated version of devm_drm_dev_alloc(), which does not support subclassing through embedding the struct :c:type:`drm_device` in a driver private structure, and which does not support automatic cleanup through devres.h](hxThis is the deprecated version of devm_drm_dev_alloc(), which does not support subclassing through embedding the struct }(hj6BhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj@Bh]h drm_device}(hjBBhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj>Bubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMnhj6Bubh\ in a driver private structure, and which does not support automatic cleanup through devres.}(hj6BhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj]BhMnhjAubh)}(h **Return**h]jZ)}(hjjBh]hReturn}(hjlBhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjhBubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMrhjAubh)}(h1Pointer to new DRM device, or ERR_PTR on failure.h]h1Pointer to new DRM device, or ERR_PTR on failure.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMrhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_get (C function) c.drm_dev_gethNtauh1jhj_hhhNhNubj)}(hhh](j)}(h)void drm_dev_get (struct drm_device *dev)h]j)}(h(void drm_dev_get(struct drm_device *dev)h](j')}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjBhhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhjBhMubj)}(h drm_dev_geth]j)}(h drm_dev_geth]h drm_dev_get}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjBhhhjBhMubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj CmodnameN classnameNjj)}j]j)}jjBsb c.drm_dev_getasbuh1hhjBubj)}(h h]h }(hj*ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hjh]h*}(hj8ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hdevh]hdev}(hjEChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjBubah}(h]h ]h"]h$]h&]jAjBuh1jhjBhhhjBhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjBhhhjBhMubah}(h]jBah ](j j!eh"]h$]h&]j%j&)j'huh1jhjBhMhjBhhubj))}(hhh]h)}(hTake reference of a DRM deviceh]hTake reference of a DRM device}(hjoChhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjlChhubah}(h]h ]h"]h$]h&]uh1j(hjBhhhjBhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjCjKjCjLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` device to take reference of or NULL **Description** This increases the ref-count of **dev** by one. You *must* already own a reference when calling this. Use drm_dev_put() to drop this reference again. This function never fails. However, this function does not provide *any* guarantee whether the device is alive or running. It only provides a reference to the object and the memory associated with it.h](h)}(h**Parameters**h]jZ)}(hjCh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjCubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjCubjp)}(hhh]ju)}(h?``struct drm_device *dev`` device to take reference of or NULL h](j{)}(h``struct drm_device *dev``h]j)}(hjCh]hstruct drm_device *dev}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjCubj)}(hhh]h)}(h#device to take reference of or NULLh]h#device to take reference of or NULL}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jthjChMhjCubah}(h]h ]h"]h$]h&]uh1johjCubh)}(h**Description**h]jZ)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjCubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjCubh)}(hThis increases the ref-count of **dev** by one. You *must* already own a reference when calling this. Use drm_dev_put() to drop this reference again.h](h This increases the ref-count of }(hjDhhhNhNubjZ)}(h**dev**h]hdev}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjDubh by one. You }(hjDhhhNhNubju?)}(h*must*h]hmust}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jt?hjDubh[ already own a reference when calling this. Use drm_dev_put() to drop this reference again.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjCubh)}(hThis function never fails. However, this function does not provide *any* guarantee whether the device is alive or running. It only provides a reference to the object and the memory associated with it.h](hCThis function never fails. However, this function does not provide }(hj4DhhhNhNubju?)}(h*any*h]hany}(hj` method after registering the device nodes, creating race conditions. Usage of the :c:type:`drm_driver.load ` methods is therefore deprecated, drivers must perform all initialization before calling drm_dev_register(). **Return** 0 on success, negative error code on failure.h](h)}(h**Parameters**h]jZ)}(hj Jh]h Parameters}(hj"JhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjJubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubjp)}(hhh](ju)}(h.``struct drm_device *dev`` Device to register h](j{)}(h``struct drm_device *dev``h]j)}(hj?Jh]hstruct drm_device *dev}(hjAJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Jubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj9Jubj)}(hhh]h)}(hDevice to registerh]hDevice to register}(hjXJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjTJhMhjUJubah}(h]h ]h"]h$]h&]uh1jhj9Jubeh}(h]h ]h"]h$]h&]uh1jthjTJhMhj6Jubju)}(hF``unsigned long flags`` Flags passed to the driver's .load() function h](j{)}(h``unsigned long flags``h]j)}(hjxJh]hunsigned long flags}(hjzJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvJubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjrJubj)}(hhh]h)}(h-Flags passed to the driver's .load() functionh]h/Flags passed to the driver’s .load() function}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjrJubeh}(h]h ]h"]h$]h&]uh1jthjJhMhj6Jubeh}(h]h ]h"]h$]h&]uh1johjJubh)}(h**Description**h]jZ)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjJubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubh)}(hRegister the DRM device **dev** with the system, advertise device to user-space and start normal device operation. **dev** must be initialized via drm_dev_init() previously.h](hRegister the DRM device }(hjJhhhNhNubjZ)}(h**dev**h]hdev}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjJubhT with the system, advertise device to user-space and start normal device operation. }(hjJhhhNhNubjZ)}(h**dev**h]hdev}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjJubh3 must be initialized via drm_dev_init() previously.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubh)}(h$Never call this twice on any device!h]h$Never call this twice on any device!}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM hjJubh)}(h**NOTE**h]jZ)}(hj Kh]hNOTE}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj Kubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubh)}(hXaTo ensure backward compatibility with existing drivers method this function calls the :c:type:`drm_driver.load ` method after registering the device nodes, creating race conditions. Usage of the :c:type:`drm_driver.load ` methods is therefore deprecated, drivers must perform all initialization before calling drm_dev_register().h](hVTo ensure backward compatibility with existing drivers method this function calls the }(hj#KhhhNhNubh)}(h&:c:type:`drm_driver.load `h]j)}(hj-Kh]hdrm_driver.load}(hj/KhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj+Kubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhj#KubhS method after registering the device nodes, creating race conditions. Usage of the }(hj#KhhhNhNubh)}(h&:c:type:`drm_driver.load `h]j)}(hjQKh]hdrm_driver.load}(hjSKhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjOKubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhjJKhMhj#Kubhl methods is therefore deprecated, drivers must perform all initialization before calling drm_dev_register().}(hj#KhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjJKhMhjJubh)}(h **Return**h]jZ)}(hjzKh]hReturn}(hj|KhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjxKubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubh)}(h-0 on success, negative error code on failure.h]h-0 on success, negative error code on failure.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dev_unregister (C function)c.drm_dev_unregisterhNtauh1jhj_hhhNhNubj)}(hhh](j)}(h0void drm_dev_unregister (struct drm_device *dev)h]j)}(h/void drm_dev_unregister(struct drm_device *dev)h](j')}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjKhhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM`ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhhjKhM`ubj)}(hdrm_dev_unregisterh]j)}(hdrm_dev_unregisterh]hdrm_dev_unregister}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjKhhhjKhM`ubj)}(h(struct drm_device *dev)h]j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hj LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjLmodnameN classnameNjj)}j]j)}jjKsbc.drm_dev_unregisterasbuh1hhjKubj)}(h h]h }(hj:LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hjh]h*}(hjHLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hdevh]hdev}(hjULhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjKubah}(h]h ]h"]h$]h&]jAjBuh1jhjKhhhjKhM`ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjKhhhjKhM`ubah}(h]jKah ](j j!eh"]h$]h&]j%j&)j'huh1jhjKhM`hjKhhubj))}(hhh]h)}(hUnregister DRM deviceh]hUnregister DRM device}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chM`hj|Lhhubah}(h]h ]h"]h$]h&]uh1j(hjKhhhjKhM`ubeh}(h]h ](j functioneh"]h$]h&]jIj jJjLjKjLjLjMjNuh1jhhhj_hNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` Device to unregister **Description** Unregister the DRM device from the system. This does the reverse of drm_dev_register() but does not deallocate the device. The caller must call drm_dev_put() to drop their final reference, unless it is managed with devres (as devices allocated with devm_drm_dev_alloc() are), in which case there is already an unwind action registered. A special form of unregistering for hotpluggable devices is drm_dev_unplug(), which can be called while there are still open users of **dev**. This should be called first in the device teardown code to make sure userspace can't access the device instance any more.h](h)}(h**Parameters**h]jZ)}(hjLh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjLubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMdhjLubjp)}(hhh]ju)}(h0``struct drm_device *dev`` Device to unregister h](j{)}(h``struct drm_device *dev``h]j)}(hjLh]hstruct drm_device *dev}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jzh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMahjLubj)}(hhh]h)}(hDevice to unregisterh]hDevice to unregister}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMahjLubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jthjLhMahjLubah}(h]h ]h"]h$]h&]uh1johjLubh)}(h**Description**h]jZ)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjLubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMchjLubh)}(hXOUnregister the DRM device from the system. This does the reverse of drm_dev_register() but does not deallocate the device. The caller must call drm_dev_put() to drop their final reference, unless it is managed with devres (as devices allocated with devm_drm_dev_alloc() are), in which case there is already an unwind action registered.h]hXOUnregister the DRM device from the system. This does the reverse of drm_dev_register() but does not deallocate the device. The caller must call drm_dev_put() to drop their final reference, unless it is managed with devres (as devices allocated with devm_drm_dev_alloc() are), in which case there is already an unwind action registered.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMchjLubh)}(hA special form of unregistering for hotpluggable devices is drm_dev_unplug(), which can be called while there are still open users of **dev**.h](hA special form of unregistering for hotpluggable devices is drm_dev_unplug(), which can be called while there are still open users of }(hj MhhhNhNubjZ)}(h**dev**h]hdev}(hj(MhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj Mubh.}(hj MhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMihjLubh)}(hyThis should be called first in the device teardown code to make sure userspace can't access the device instance any more.h]h{This should be called first in the device teardown code to make sure userspace can’t access the device instance any more.}(hjAMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:90: ./drivers/gpu/drm/drm_drv.chMlhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhj_hhhNhNubeh}(h]#device-instance-and-driver-handlingah ]h"]#device instance and driver handlingah$]h&]uh1hhhhhhhhKOubh)}(hhh](h)}(h Driver Loadh]h Driver Load}(hjbMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_MhhhhhK^ubh)}(hhh](h)}(hComponent Helper Usageh]hComponent Helper Usage}(hjsMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpMhhhhhKaubh)}(hXDRM drivers that drive hardware where a logical device consists of a pile of independent hardware blocks are recommended to use the :ref:`component helper library`. For consistency and better options for code reuse the following guidelines apply:h](hDRM drivers that drive hardware where a logical device consists of a pile of independent hardware blocks are recommended to use the }(hjMhhhNhNubh)}(h*:ref:`component helper library`h]jz)}(hjMh]hcomponent helper library}(hjMhhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjMubah}(h]h ]h"]h$]h&]refdocj refdomainjMreftyperef refexplicitrefwarnj componentuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:99: ./drivers/gpu/drm/drm_drv.chMhjMubhS. For consistency and better options for code reuse the following guidelines apply:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjMhMhjpMhhubj[%)}(hX^- The entire device initialization procedure should be run from the :c:type:`component_master_ops.master_bind ` callback, starting with devm_drm_dev_alloc(), then binding all components with component_bind_all() and finishing with drm_dev_register(). - The opaque pointer passed to all components through component_bind_all() should point at :c:type:`struct drm_device ` of the device instance, not some driver specific private structure. - The component helper fills the niche where further standardization of interfaces is not practical. When there already is, or will be, a standardized interface like :c:type:`drm_bridge` or :c:type:`drm_panel`, providing its own functions to find such components at driver load time, like drm_of_find_panel_or_bridge(), then the component helper should not be used. h]h bullet_list)}(hhh](h list_item)}(hXThe entire device initialization procedure should be run from the :c:type:`component_master_ops.master_bind ` callback, starting with devm_drm_dev_alloc(), then binding all components with component_bind_all() and finishing with drm_dev_register(). h]h)}(hXThe entire device initialization procedure should be run from the :c:type:`component_master_ops.master_bind ` callback, starting with devm_drm_dev_alloc(), then binding all components with component_bind_all() and finishing with drm_dev_register().h](hBThe entire device initialization procedure should be run from the }(hjMhhhNhNubh)}(hA:c:type:`component_master_ops.master_bind `h]j)}(hjMh]h component_master_ops.master_bind}(hjMhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjcomponent_master_opsuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:99: ./drivers/gpu/drm/drm_drv.chMhjMubh callback, starting with devm_drm_dev_alloc(), then binding all components with component_bind_all() and finishing with drm_dev_register().}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jMhjMubjM)}(hThe opaque pointer passed to all components through component_bind_all() should point at :c:type:`struct drm_device ` of the device instance, not some driver specific private structure. h]h)}(hThe opaque pointer passed to all components through component_bind_all() should point at :c:type:`struct drm_device ` of the device instance, not some driver specific private structure.h](hYThe opaque pointer passed to all components through component_bind_all() should point at }(hjMhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hj Nh]hstruct drm_device}(hj NhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:99: ./drivers/gpu/drm/drm_drv.chMhjMubhD of the device instance, not some driver specific private structure.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&NhMhjMubah}(h]h ]h"]h$]h&]uh1jMhjMubjM)}(hXmThe component helper fills the niche where further standardization of interfaces is not practical. When there already is, or will be, a standardized interface like :c:type:`drm_bridge` or :c:type:`drm_panel`, providing its own functions to find such components at driver load time, like drm_of_find_panel_or_bridge(), then the component helper should not be used. h]h)}(hXkThe component helper fills the niche where further standardization of interfaces is not practical. When there already is, or will be, a standardized interface like :c:type:`drm_bridge` or :c:type:`drm_panel`, providing its own functions to find such components at driver load time, like drm_of_find_panel_or_bridge(), then the component helper should not be used.h](hThe component helper fills the niche where further standardization of interfaces is not practical. When there already is, or will be, a standardized interface like }(hj;NhhhNhNubh)}(h:c:type:`drm_bridge`h]j)}(hjENh]h drm_bridge}(hjGNhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjCNubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_bridgeuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:99: ./drivers/gpu/drm/drm_drv.chMhj;Nubh or }(hj;NhhhNhNubh)}(h:c:type:`drm_panel`h]j)}(hjiNh]h drm_panel}(hjkNhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjgNubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_paneluh1hhjbNhMhj;Nubh, providing its own functions to find such components at driver load time, like drm_of_find_panel_or_bridge(), then the component helper should not be used.}(hj;NhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjbNhMhj7Nubah}(h]h ]h"]h$]h&]uh1jMhjMubeh}(h]h ]h"]h$]h&]bullet-uh1jMhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jZ%hjMhMhjpMhhubeh}(h]component-helper-usageah ]h"]component helper usageah$]h&]uh1hhj_MhhhhhKaubh)}(hhh](h)}(hMemory Manager Initializationh]hMemory Manager Initialization}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhKgubh)}(hXEvery DRM driver requires a memory manager which must be initialized at load time. DRM currently contains two memory managers, the Translation Table Manager (TTM) and the Graphics Execution Manager (GEM). This document describes the use of the GEM memory manager only. See ? for details.h]hXEvery DRM driver requires a memory manager which must be initialized at load time. DRM currently contains two memory managers, the Translation Table Manager (TTM) and the Graphics Execution Manager (GEM). This document describes the use of the GEM memory manager only. See ? for details.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjNhhubeh}(h]memory-manager-initializationah ]h"]memory manager initializationah$]h&]uh1hhj_MhhhhhKgubh)}(hhh](h)}(h"Miscellaneous Device Configurationh]h"Miscellaneous Device Configuration}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhKpubh)}(hXAnother task that may be necessary for PCI devices during configuration is mapping the video BIOS. On many devices, the VBIOS describes device configuration, LCD panel timings (if any), and contains flags indicating device state. Mapping the BIOS can be done using the pci_map_rom() call, a convenience function that takes care of mapping the actual ROM, whether it has been shadowed into memory (typically at address 0xc0000) or exists on the PCI device in the ROM BAR. Note that after the ROM has been mapped and any necessary information has been extracted, it should be unmapped; on many devices, the ROM address decoder is shared with other BARs, so leaving it mapped could cause undesired behaviour like hangs or memory corruption.h]hXAnother task that may be necessary for PCI devices during configuration is mapping the video BIOS. On many devices, the VBIOS describes device configuration, LCD panel timings (if any), and contains flags indicating device state. Mapping the BIOS can be done using the pci_map_rom() call, a convenience function that takes care of mapping the actual ROM, whether it has been shadowed into memory (typically at address 0xc0000) or exists on the PCI device in the ROM BAR. Note that after the ROM has been mapped and any necessary information has been extracted, it should be unmapped; on many devices, the ROM address decoder is shared with other BARs, so leaving it mapped could cause undesired behaviour like hangs or memory corruption.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjNhhubeh}(h]"miscellaneous-device-configurationah ]h"]"miscellaneous device configurationah$]h&]uh1hhj_MhhhhhKpubeh}(h] driver-loadah ]h"] driver loadah$]h&]uh1hhhhhhhhK^ubh)}(hhh](h)}(hManaged Resourcesh]hManaged Resources}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhhhhhKubh)}(hInspired by struct :c:type:`device` managed resources, but tied to the lifetime of struct :c:type:`drm_device`, which can outlive the underlying physical device, usually when userspace has some open files and other handles to resources still open.h](hInspired by struct }(hjOhhhNhNubh)}(h:c:type:`device`h]j)}(hjOh]hdevice}(hjOhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdeviceuh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:129: ./drivers/gpu/drm/drm_managed.chKhjOubh7 managed resources, but tied to the lifetime of struct }(hjOhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjAOh]h drm_device}(hjCOhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj?Oubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj:OhKhjOubh, which can outlive the underlying physical device, usually when userspace has some open files and other handles to resources still open.}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj:OhKhjOhhubh)}(hXTRelease actions can be added with drmm_add_action(), memory allocations can be done directly with drmm_kmalloc() and the related functions. Everything will be released on the final drm_dev_put() in reverse order of how the release actions have been added and memory has been allocated since driver loading started with devm_drm_dev_alloc().h]hXTRelease actions can be added with drmm_add_action(), memory allocations can be done directly with drmm_kmalloc() and the related functions. Everything will be released on the final drm_dev_put() in reverse order of how the release actions have been added and memory has been allocated since driver loading started with devm_drm_dev_alloc().}(hjhOhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:129: ./drivers/gpu/drm/drm_managed.chKhjOhhubh)}(hX3Note that release actions and managed memory can also be added and removed during the lifetime of the driver, all the functions are fully concurrent safe. But it is recommended to use managed resources only for resources that change rarely, if ever, during the lifetime of the :c:type:`drm_device` instance.h](hXNote that release actions and managed memory can also be added and removed during the lifetime of the driver, all the functions are fully concurrent safe. But it is recommended to use managed resources only for resources that change rarely, if ever, during the lifetime of the }(hjwOhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjOh]h drm_device}(hjOhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:129: ./drivers/gpu/drm/drm_managed.chKhjwOubh instance.}(hjwOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjOhKhjOhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j drmm_release_action (C function)c.drmm_release_actionhNtauh1jhjOhhhNhNubj)}(hhh](j)}(hVvoid drmm_release_action (struct drm_device *dev, drmres_release_t action, void *data)h]j)}(hUvoid drmm_release_action(struct drm_device *dev, drmres_release_t action, void *data)h](j')}(hvoidh]hvoid}(hjOhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjOhhh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjOhKubj)}(hdrmm_release_actionh]j)}(hdrmm_release_actionh]hdrmm_release_action}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjOhhhjOhKubj)}(h=(struct drm_device *dev, drmres_release_t action, void *data)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(h h]h }(hj PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjPmodnameN classnameNjj)}j]j)}jjOsbc.drmm_release_actionasbuh1hhjOubj)}(h h]h }(hj=PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hjh]h*}(hjKPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hdevh]hdev}(hjXPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjOubj)}(hdrmres_release_t actionh](h)}(hhh]j)}(hdrmres_release_th]hdrmres_release_t}(hjtPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqPubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjvPmodnameN classnameNjj)}j]j9Pc.drmm_release_actionasbuh1hhjmPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmPubj)}(hactionh]haction}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmPubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjOubj)}(h void *datah](j')}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hdatah]hdata}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjOubeh}(h]h ]h"]h$]h&]jAjBuh1jhjOhhhjOhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjOhhhjOhKubah}(h]jOah ](j j!eh"]h$]h&]j%j&)j'huh1jhjOhKhjOhhubj))}(hhh]h)}(h4release a managed action from a :c:type:`drm_device`h](h release a managed action from a }(hj QhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjQh]h drm_device}(hjQhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]j9Pc.drmm_release_actionasbj drm_deviceuh1hhjOhKhj Qubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhj Qhhubah}(h]h ]h"]h$]h&]uh1j(hjOhhhjOhKubeh}(h]h ](j functioneh"]h$]h&]jIj jJjHQjKjHQjLjMjNuh1jhhhjOhNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``drmres_release_t action`` function which would be called when **dev** is released ``void *data`` opaque pointer, passed to **action** **Description** This function calls the **action** previously added by drmm_add_action() immediately. The **action** is removed from the list of cleanup actions for **dev**, which means that it won't be called in the final drm_dev_put().h](h)}(h**Parameters**h]jZ)}(hjRQh]h Parameters}(hjTQhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjPQubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjLQubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjqQh]hstruct drm_device *dev}(hjsQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoQubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjkQubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhKhjQubah}(h]h ]h"]h$]h&]uh1jhjkQubeh}(h]h ]h"]h$]h&]uh1jthjQhKhjhQubju)}(hT``drmres_release_t action`` function which would be called when **dev** is released h](j{)}(h``drmres_release_t action``h]j)}(hjQh]hdrmres_release_t action}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjQubj)}(hhh]h)}(h7function which would be called when **dev** is releasedh](h$function which would be called when }(hjQhhhNhNubjZ)}(h**dev**h]hdev}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjQubh is released}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjQhKhjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jthjQhKhjhQubju)}(h4``void *data`` opaque pointer, passed to **action** h](j{)}(h``void *data``h]j)}(hjQh]h void *data}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjQubj)}(hhh]h)}(h$opaque pointer, passed to **action**h](hopaque pointer, passed to }(hjRhhhNhNubjZ)}(h **action**h]haction}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjRubeh}(h]h ]h"]h$]h&]uh1hhj RhKhj Rubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jthj RhKhjhQubeh}(h]h ]h"]h$]h&]uh1johjLQubh)}(h**Description**h]jZ)}(hj>Rh]h Description}(hj@RhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjUhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjHUh]h drm_device}(hjJUhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjFUubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhj>Uubh managed version of kmalloc(). The allocated memory is automatically freed on the final drm_dev_put(). Memory can also be freed before the final drm_dev_put() by calling drmm_kfree().}(hj>UhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjeUhKhjVTubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_kstrdup (C function)c.drmm_kstrduphNtauh1jhjOhhhNhNubj)}(hhh](j)}(hFchar * drmm_kstrdup (struct drm_device *dev, const char *s, gfp_t gfp)h]j)}(hDchar *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp)h](j')}(hcharh]hchar}(hjUhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjUhhh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjUhKubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjUhKubj)}(h drmm_kstrduph]j)}(h drmm_kstrduph]h drmm_kstrdup}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjUhhhjUhKubj)}(h2(struct drm_device *dev, const char *s, gfp_t gfp)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjUmodnameN classnameNjj)}j]j)}jjUsbc.drmm_kstrdupasbuh1hhjUubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjh]h*}(hj&VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hdevh]hdev}(hj3VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjUubj)}(h const char *sh](j)}(hj)h]hconst}(hjLVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHVubj)}(h h]h }(hjYVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHVubj')}(hcharh]hchar}(hjgVhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjHVubj)}(h h]h }(hjuVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHVubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHVubj)}(hsh]hs}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHVubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjUubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjVmodnameN classnameNjj)}j]jVc.drmm_kstrdupasbuh1hhjVubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hgfph]hgfp}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjUubeh}(h]h ]h"]h$]h&]jAjBuh1jhjUhhhjUhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjUhhhjUhKubah}(h]jUah ](j j!eh"]h$]h&]j%j&)j'huh1jhjUhKhjUhhubj))}(hhh]h)}(h&:c:type:`drm_device` managed kstrdup()h](h)}(h:c:type:`drm_device`h]j)}(hjWh]h drm_device}(hj WhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jVc.drmm_kstrdupasbj drm_deviceuh1hhjOhKhjWubh managed kstrdup()}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjVhhubah}(h]h ]h"]h$]h&]uh1j(hjUhhhjUhKubeh}(h]h ](j functioneh"]h$]h&]jIj jJj>WjKj>WjLjMjNuh1jhhhjOhNhNubjP)}(hXt**Parameters** ``struct drm_device *dev`` DRM device ``const char *s`` 0-terminated string to be duplicated ``gfp_t gfp`` GFP allocation flags **Description** This is a :c:type:`drm_device` managed version of kstrdup(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h)}(h**Parameters**h]jZ)}(hjHWh]h Parameters}(hjJWhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjFWubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjBWubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjgWh]hstruct drm_device *dev}(hjiWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeWubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjaWubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|WhKhj}Wubah}(h]h ]h"]h$]h&]uh1jhjaWubeh}(h]h ]h"]h$]h&]uh1jthj|WhKhj^Wubju)}(h7``const char *s`` 0-terminated string to be duplicated h](j{)}(h``const char *s``h]j)}(hjWh]h const char *s}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjWubj)}(hhh]h)}(h$0-terminated string to be duplicatedh]h$0-terminated string to be duplicated}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKhjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jthjWhKhj^Wubju)}(h#``gfp_t gfp`` GFP allocation flags h](j{)}(h ``gfp_t gfp``h]j)}(hjWh]h gfp_t gfp}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjWubj)}(hhh]h)}(hGFP allocation flagsh]hGFP allocation flags}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKhjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jthjWhKhj^Wubeh}(h]h ]h"]h$]h&]uh1johjBWubh)}(h**Description**h]jZ)}(hjXh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjXubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhjBWubh)}(hThis is a :c:type:`drm_device` managed version of kstrdup(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h This is a }(hj*XhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj4Xh]h drm_device}(hj6XhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj2Xubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chKhj*Xubh managed version of kstrdup(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().}(hj*XhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjQXhKhjBWubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_kfree (C function) c.drmm_kfreehNtauh1jhjOhhhNhNubj)}(hhh](j)}(h4void drmm_kfree (struct drm_device *dev, void *data)h]j)}(h3void drmm_kfree(struct drm_device *dev, void *data)h](j')}(hvoidh]hvoid}(hj|XhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjxXhhh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxXhhhjXhMubj)}(h drmm_kfreeh]j)}(h drmm_kfreeh]h drmm_kfree}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjxXhhhjXhMubj)}(h$(struct drm_device *dev, void *data)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjXmodnameN classnameNjj)}j]j)}jjXsb c.drmm_kfreeasbuh1hhjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hdevh]hdev}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjXubj)}(h void *datah](j')}(hvoidh]hvoid}(hj+YhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj'Yubj)}(h h]h }(hj9YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Yubj)}(hjh]h*}(hjGYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Yubj)}(hdatah]hdata}(hjTYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Yubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjXubeh}(h]h ]h"]h$]h&]jAjBuh1jhjxXhhhjXhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjtXhhhjXhMubah}(h]joXah ](j j!eh"]h$]h&]j%j&)j'huh1jhjXhMhjqXhhubj))}(hhh]h)}(h$:c:type:`drm_device` managed kfree()h](h)}(h:c:type:`drm_device`h]j)}(hjYh]h drm_device}(hjYhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jX c.drmm_kfreeasbj drm_deviceuh1hhjOhKhj~Yubh managed kfree()}(hj~YhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhj{Yhhubah}(h]h ]h"]h$]h&]uh1j(hjqXhhhjXhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjYjKjYjLjMjNuh1jhhhjOhNhNubjP)}(hXC**Parameters** ``struct drm_device *dev`` DRM device ``void *data`` memory allocation to be freed **Description** This is a :c:type:`drm_device` managed version of kfree() which can be used to release memory allocated through drmm_kmalloc() or any of its related functions before the final drm_dev_put() of **dev**.h](h)}(h**Parameters**h]jZ)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjYubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhjYubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjYh]hstruct drm_device *dev}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhjYubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jthjYhMhjYubju)}(h-``void *data`` memory allocation to be freed h](j{)}(h``void *data``h]j)}(hjZh]h void *data}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jzh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhjZubj)}(hhh]h)}(hmemory allocation to be freedh]hmemory allocation to be freed}(hj5ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1ZhMhj2Zubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jthj1ZhMhjYubeh}(h]h ]h"]h$]h&]uh1johjYubh)}(h**Description**h]jZ)}(hjWZh]h Description}(hjYZhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjUZubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhjYubh)}(hThis is a :c:type:`drm_device` managed version of kfree() which can be used to release memory allocated through drmm_kmalloc() or any of its related functions before the final drm_dev_put() of **dev**.h](h This is a }(hjmZhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjwZh]h drm_device}(hjyZhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjuZubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh`/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:132: ./drivers/gpu/drm/drm_managed.chMhjmZubh managed version of kfree() which can be used to release memory allocated through drmm_kmalloc() or any of its related functions before the final drm_dev_put() of }(hjmZhhhNhNubjZ)}(h**dev**h]hdev}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjmZubh.}(hjmZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjZhMhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_add_action (C macro)c.drmm_add_actionhNtauh1jhjOhhhNhNubj)}(hhh](j)}(hdrmm_add_actionh]j)}(hdrmm_add_actionh]j)}(hdrmm_add_actionh]j)}(hjZh]hdrmm_add_action}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjZhhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjZhhhjZhKubah}(h]jZah ](j j!eh"]h$]h&]j%j&)j'huh1jhjZhKhjZhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjZhhhjZhKubeh}(h]h ](j macroeh"]h$]h&]jIj jJj[jKj[jLjMjNuh1jhhhjOhNhNubh)}(h'``drmm_add_action (dev, action, data)``h]j)}(hj[h]h#drmm_add_action (dev, action, data)}(hj [hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhjOhhubj[%)}(h7add a managed release action to a :c:type:`drm_device` h]h)}(h6add a managed release action to a :c:type:`drm_device`h](h"add a managed release action to a }(hj![hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj+[h]h drm_device}(hj-[hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj)[ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhj![ubeh}(h]h ]h"]h$]h&]uh1hhjH[hKhj[ubah}(h]h ]h"]h$]h&]uh1jZ%hjH[hKhjOhhubjP)}(hX**Parameters** ``dev`` DRM device ``action`` function which should be called when **dev** is released ``data`` opaque pointer, passed to **action** **Description** This function adds the **release** action with optional parameter **data** to the list of cleanup actions for **dev**. The cleanup actions will be run in reverse order in the final drm_dev_put() call for **dev**.h](h)}(h**Parameters**h]jZ)}(hj[[h]h Parameters}(hj][hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjY[ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhjU[ubjp)}(hhh](ju)}(h``dev`` DRM device h](j{)}(h``dev``h]j)}(hjz[h]hdev}(hj|[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx[ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhjt[ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hKhj[ubah}(h]h ]h"]h$]h&]uh1jhjt[ubeh}(h]h ]h"]h$]h&]uh1jthj[hKhjq[ubju)}(hD``action`` function which should be called when **dev** is released h](j{)}(h ``action``h]j)}(hj[h]haction}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhj[ubj)}(hhh]h)}(h8function which should be called when **dev** is releasedh](h%function which should be called when }(hj[hhhNhNubjZ)}(h**dev**h]hdev}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj[ubh is released}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj[hKhj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jthj[hKhjq[ubju)}(h.``data`` opaque pointer, passed to **action** h](j{)}(h``data``h]j)}(hj[h]hdata}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhj[ubj)}(hhh]h)}(h$opaque pointer, passed to **action**h](hopaque pointer, passed to }(hj\hhhNhNubjZ)}(h **action**h]haction}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj\ubeh}(h]h ]h"]h$]h&]uh1hhj\hKhj\ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jthj\hKhjq[ubeh}(h]h ]h"]h$]h&]uh1johjU[ubh)}(h**Description**h]jZ)}(hjG\h]h Description}(hjI\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjE\ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhjU[ubh)}(hThis function adds the **release** action with optional parameter **data** to the list of cleanup actions for **dev**. The cleanup actions will be run in reverse order in the final drm_dev_put() call for **dev**.h](hThis function adds the }(hj]\hhhNhNubjZ)}(h **release**h]hrelease}(hje\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj]\ubh action with optional parameter }(hj]\hhhNhNubjZ)}(h**data**h]hdata}(hjw\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj]\ubh$ to the list of cleanup actions for }(hj]\hhhNhNubjZ)}(h**dev**h]hdev}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj]\ubhW. The cleanup actions will be run in reverse order in the final drm_dev_put() call for }(hj]\hhhNhNubjZ)}(h**dev**h]hdev}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj]\ubh.}(hj]\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKhjU[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"drmm_add_action_or_reset (C macro)c.drmm_add_action_or_resethNtauh1jhjOhhhNhNubj)}(hhh](j)}(hdrmm_add_action_or_reseth]j)}(hdrmm_add_action_or_reseth]j)}(hdrmm_add_action_or_reseth]j)}(hj\h]hdrmm_add_action_or_reset}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj\hhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK!ubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhj\hhhj\hK!ubah}(h]j\ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj\hK!hj\hhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hj\hhhj\hK!ubeh}(h]h ](j macroeh"]h$]h&]jIj jJj]jKj]jLjMjNuh1jhhhjOhNhNubh)}(h0``drmm_add_action_or_reset (dev, action, data)``h]j)}(hj ]h]h,drmm_add_action_or_reset (dev, action, data)}(hj ]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK#hjOhhubj[%)}(h7add a managed release action to a :c:type:`drm_device` h]h)}(h6add a managed release action to a :c:type:`drm_device`h](h"add a managed release action to a }(hj$]hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj.]h]h drm_device}(hj0]hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj,]ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK!hj$]ubeh}(h]h ]h"]h$]h&]uh1hhjK]hK!hj ]ubah}(h]h ]h"]h$]h&]uh1jZ%hjK]hK!hjOhhubjP)}(hXA**Parameters** ``dev`` DRM device ``action`` function which should be called when **dev** is released ``data`` opaque pointer, passed to **action** **Description** Similar to drmm_add_action(), with the only difference that upon failure **action** is directly called for any cleanup work necessary on failures.h](h)}(h**Parameters**h]jZ)}(hj^]h]h Parameters}(hj`]hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj\]ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK%hjX]ubjp)}(hhh](ju)}(h``dev`` DRM device h](j{)}(h``dev``h]j)}(hj}]h]hdev}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{]ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK"hjw]ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hK"hj]ubah}(h]h ]h"]h$]h&]uh1jhjw]ubeh}(h]h ]h"]h$]h&]uh1jthj]hK"hjt]ubju)}(hD``action`` function which should be called when **dev** is released h](j{)}(h ``action``h]j)}(hj]h]haction}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK#hj]ubj)}(hhh]h)}(h8function which should be called when **dev** is releasedh](h%function which should be called when }(hj]hhhNhNubjZ)}(h**dev**h]hdev}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj]ubh is released}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj]hK#hj]ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jthj]hK#hjt]ubju)}(h.``data`` opaque pointer, passed to **action** h](j{)}(h``data``h]j)}(hj^h]hdata}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK$hj]ubj)}(hhh]h)}(h$opaque pointer, passed to **action**h](hopaque pointer, passed to }(hj^hhhNhNubjZ)}(h **action**h]haction}(hj"^hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj^ubeh}(h]h ]h"]h$]h&]uh1hhj^hK$hj^ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jthj^hK$hjt]ubeh}(h]h ]h"]h$]h&]uh1johjX]ubh)}(h**Description**h]jZ)}(hjJ^h]h Description}(hjL^hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjH^ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK&hjX]ubh)}(hSimilar to drmm_add_action(), with the only difference that upon failure **action** is directly called for any cleanup work necessary on failures.h](hISimilar to drmm_add_action(), with the only difference that upon failure }(hj`^hhhNhNubjZ)}(h **action**h]haction}(hjh^hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj`^ubh? is directly called for any cleanup work necessary on failures.}(hj`^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK&hjX]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_kzalloc (C function)c.drmm_kzallochNtauh1jhjOhhhNhNubj)}(hhh](j)}(hDvoid * drmm_kzalloc (struct drm_device *dev, size_t size, gfp_t gfp)h]j)}(hBvoid *drmm_kzalloc(struct drm_device *dev, size_t size, gfp_t gfp)h](j')}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj^hhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK7ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhj^hK7ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhj^hK7ubj)}(h drmm_kzalloch]j)}(h drmm_kzalloch]h drmm_kzalloc}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj^hhhj^hK7ubj)}(h0(struct drm_device *dev, size_t size, gfp_t gfp)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj _hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj _modnameN classnameNjj)}j]j)}jj^sbc.drmm_kzallocasbuh1hhj^ubj)}(h h]h }(hj)_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hjh]h*}(hj7_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hdevh]hdev}(hjD_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj^ubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj`_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]_ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjb_modnameN classnameNjj)}j]j%_c.drmm_kzallocasbuh1hhjY_ubj)}(h h]h }(hj~_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY_ubj)}(hsizeh]hsize}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY_ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj^ubj)}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj_modnameN classnameNjj)}j]j%_c.drmm_kzallocasbuh1hhj_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hgfph]hgfp}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj^ubeh}(h]h ]h"]h$]h&]jAjBuh1jhj^hhhj^hK7ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj^hhhj^hK7ubah}(h]j^ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj^hK7hj^hhubj))}(hhh]h)}(h&:c:type:`drm_device` managed kzalloc()h](h)}(h:c:type:`drm_device`h]j)}(hj`h]h drm_device}(hj`hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]j%_c.drmm_kzallocasbj drm_deviceuh1hhjZhKhj_ubh managed kzalloc()}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK7hj_hhubah}(h]h ]h"]h$]h&]uh1j(hj^hhhj^hK7ubeh}(h]h ](j functioneh"]h$]h&]jIj jJj:`jKj:`jLjMjNuh1jhhhjOhNhNubjP)}(hXv**Parameters** ``struct drm_device *dev`` DRM device ``size_t size`` size of the memory allocation ``gfp_t gfp`` GFP allocation flags **Description** This is a :c:type:`drm_device` managed version of kzalloc(). The allocated memory is automatically freed on the final drm_dev_put(). Memory can also be freed before the final drm_dev_put() by calling drmm_kfree().h](h)}(h**Parameters**h]jZ)}(hjD`h]h Parameters}(hjF`hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjB`ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK;hj>`ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjc`h]hstruct drm_device *dev}(hje`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja`ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK8hj]`ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj|`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx`hK8hjy`ubah}(h]h ]h"]h$]h&]uh1jhj]`ubeh}(h]h ]h"]h$]h&]uh1jthjx`hK8hjZ`ubju)}(h.``size_t size`` size of the memory allocation h](j{)}(h``size_t size``h]j)}(hj`h]h size_t size}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK9hj`ubj)}(hhh]h)}(hsize of the memory allocationh]hsize of the memory allocation}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hK9hj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jthj`hK9hjZ`ubju)}(h#``gfp_t gfp`` GFP allocation flags h](j{)}(h ``gfp_t gfp``h]j)}(hj`h]h gfp_t gfp}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK:hj`ubj)}(hhh]h)}(hGFP allocation flagsh]hGFP allocation flags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hK:hj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jthj`hK:hjZ`ubeh}(h]h ]h"]h$]h&]uh1johj>`ubh)}(h**Description**h]jZ)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjaubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK`ubh)}(hThis is a :c:type:`drm_device` managed version of kzalloc(). The allocated memory is automatically freed on the final drm_dev_put(). Memory can also be freed before the final drm_dev_put() by calling drmm_kfree().h](h This is a }(hj&ahhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj0ah]h drm_device}(hj2ahhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj.aubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_kmalloc_array (C function)c.drmm_kmalloc_arrayhNtauh1jhjOhhhNhNubj)}(hhh](j)}(hVvoid * drmm_kmalloc_array (struct drm_device *dev, size_t n, size_t size, gfp_t flags)h]j)}(hTvoid *drmm_kmalloc_array(struct drm_device *dev, size_t n, size_t size, gfp_t flags)h](j')}(hvoidh]hvoid}(hjxahhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjtahhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKFubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtahhhjahKFubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtahhhjahKFubj)}(hdrmm_kmalloc_arrayh]j)}(hdrmm_kmalloc_arrayh]hdrmm_kmalloc_array}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjtahhhjahKFubj)}(h<(struct drm_device *dev, size_t n, size_t size, gfp_t flags)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjamodnameN classnameNjj)}j]j)}jjasbc.drmm_kmalloc_arrayasbuh1hhjaubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj)}(hdevh]hdev}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjaubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hj7bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4bubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj9bmodnameN classnameNjj)}j]jac.drmm_kmalloc_arrayasbuh1hhj0bubj)}(h h]h }(hjUbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0bubj)}(hjh]hn}(hjcbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0bubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjaubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj~bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{bubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjbmodnameN classnameNjj)}j]jac.drmm_kmalloc_arrayasbuh1hhjwbubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwbubj)}(hsizeh]hsize}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwbubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjaubj)}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjbmodnameN classnameNjj)}j]jac.drmm_kmalloc_arrayasbuh1hhjbubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(hflagsh]hflags}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjaubeh}(h]h ]h"]h$]h&]jAjBuh1jhjtahhhjahKFubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjpahhhjahKFubah}(h]jkaah ](j j!eh"]h$]h&]j%j&)j'huh1jhjahKFhjmahhubj))}(hhh]h)}(h,:c:type:`drm_device` managed kmalloc_array()h](h)}(h:c:type:`drm_device`h]j)}(hj"ch]h drm_device}(hj$chhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj cubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jac.drmm_kmalloc_arrayasbj drm_deviceuh1hhjZhKhjcubh managed kmalloc_array()}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKFhjchhubah}(h]h ]h"]h$]h&]uh1j(hjmahhhjahKFubeh}(h]h ](j functioneh"]h$]h&]jIj jJjXcjKjXcjLjMjNuh1jhhhjOhNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``size_t n`` number of array elements to allocate ``size_t size`` size of array member ``gfp_t flags`` GFP allocation flags **Description** This is a :c:type:`drm_device` managed version of kmalloc_array(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h)}(h**Parameters**h]jZ)}(hjbch]h Parameters}(hjdchhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj`cubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKJhj\cubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjch]hstruct drm_device *dev}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKGhj{cubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKGhjcubah}(h]h ]h"]h$]h&]uh1jhj{cubeh}(h]h ]h"]h$]h&]uh1jthjchKGhjxcubju)}(h2``size_t n`` number of array elements to allocate h](j{)}(h ``size_t n``h]j)}(hjch]hsize_t n}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKHhjcubj)}(hhh]h)}(h$number of array elements to allocateh]h$number of array elements to allocate}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchKHhjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jthjchKHhjxcubju)}(h%``size_t size`` size of array member h](j{)}(h``size_t size``h]j)}(hjch]h size_t size}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKIhjcubj)}(hhh]h)}(hsize of array memberh]hsize of array member}(hj dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhKIhj dubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jthjdhKIhjxcubju)}(h%``gfp_t flags`` GFP allocation flags h](j{)}(h``gfp_t flags``h]j)}(hj,dh]h gfp_t flags}(hj.dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*dubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKJhj&dubj)}(hhh]h)}(hGFP allocation flagsh]hGFP allocation flags}(hjEdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAdhKJhjBdubah}(h]h ]h"]h$]h&]uh1jhj&dubeh}(h]h ]h"]h$]h&]uh1jthjAdhKJhjxcubeh}(h]h ]h"]h$]h&]uh1johj\cubh)}(h**Description**h]jZ)}(hjgdh]h Description}(hjidhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjedubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKLhj\cubh)}(hThis is a :c:type:`drm_device` managed version of kmalloc_array(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h This is a }(hj}dhhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjdh]h drm_device}(hjdhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKLhj}dubh managed version of kmalloc_array(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().}(hj}dhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjdhKLhj\cubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_kcalloc (C function)c.drmm_kcallochNtauh1jhjOhhhNhNubj)}(hhh](j)}(hPvoid * drmm_kcalloc (struct drm_device *dev, size_t n, size_t size, gfp_t flags)h]j)}(hNvoid *drmm_kcalloc(struct drm_device *dev, size_t n, size_t size, gfp_t flags)h](j')}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjdhhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK\ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjdhK\ubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjdhK\ubj)}(h drmm_kcalloch]j)}(h drmm_kcalloch]h drmm_kcalloc}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjdhhhjdhK\ubj)}(h<(struct drm_device *dev, size_t n, size_t size, gfp_t flags)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(h h]h }(hj&ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj7ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4eubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj9emodnameN classnameNjj)}j]j)}jjdsbc.drmm_kcallocasbuh1hhjeubj)}(h h]h }(hjWehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hjh]h*}(hjeehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hdevh]hdev}(hjrehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjeubj)}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjemodnameN classnameNjj)}j]jSec.drmm_kcallocasbuh1hhjeubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hjh]hn}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjeubj)}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjemodnameN classnameNjj)}j]jSec.drmm_kcallocasbuh1hhjeubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hsizeh]hsize}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjeubj)}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjfmodnameN classnameNjj)}j]jSec.drmm_kcallocasbuh1hhjfubj)}(h h]h }(hj;fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hflagsh]hflags}(hjIfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjeubeh}(h]h ]h"]h$]h&]jAjBuh1jhjdhhhjdhK\ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjdhhhjdhK\ubah}(h]jdah ](j j!eh"]h$]h&]j%j&)j'huh1jhjdhK\hjdhhubj))}(hhh]h)}(h&:c:type:`drm_device` managed kcalloc()h](h)}(h:c:type:`drm_device`h]j)}(hjyfh]h drm_device}(hj{fhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjwfubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jSec.drmm_kcallocasbj drm_deviceuh1hhjZhKhjsfubh managed kcalloc()}(hjsfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK\hjpfhhubah}(h]h ]h"]h$]h&]uh1j(hjdhhhjdhK\ubeh}(h]h ](j functioneh"]h$]h&]jIj jJjfjKjfjLjMjNuh1jhhhjOhNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``size_t n`` number of array elements to allocate ``size_t size`` size of array member ``gfp_t flags`` GFP allocation flags **Description** This is a :c:type:`drm_device` managed version of kcalloc(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h)}(h**Parameters**h]jZ)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjfubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK`hjfubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjfh]hstruct drm_device *dev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK]hjfubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhK]hjfubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jthjfhK]hjfubju)}(h2``size_t n`` number of array elements to allocate h](j{)}(h ``size_t n``h]j)}(hjgh]hsize_t n}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK^hj gubj)}(hhh]h)}(h$number of array elements to allocateh]h$number of array elements to allocate}(hj*ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&ghK^hj'gubah}(h]h ]h"]h$]h&]uh1jhj gubeh}(h]h ]h"]h$]h&]uh1jthj&ghK^hjfubju)}(h%``size_t size`` size of array member h](j{)}(h``size_t size``h]j)}(hjJgh]h size_t size}(hjLghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHgubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK_hjDgubj)}(hhh]h)}(hsize of array memberh]hsize of array member}(hjcghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_ghK_hj`gubah}(h]h ]h"]h$]h&]uh1jhjDgubeh}(h]h ]h"]h$]h&]uh1jthj_ghK_hjfubju)}(h%``gfp_t flags`` GFP allocation flags h](j{)}(h``gfp_t flags``h]j)}(hjgh]h gfp_t flags}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhK`hj}gubj)}(hhh]h)}(hGFP allocation flagsh]hGFP allocation flags}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghK`hjgubah}(h]h ]h"]h$]h&]uh1jhj}gubeh}(h]h ]h"]h$]h&]uh1jthjghK`hjfubeh}(h]h ]h"]h$]h&]uh1johjfubh)}(h**Description**h]jZ)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjgubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKbhjfubh)}(hThis is a :c:type:`drm_device` managed version of kcalloc(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().h](h This is a }(hjghhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjgh]h drm_device}(hjghhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKbhjgubh managed version of kcalloc(). The allocated memory is automatically freed on the final drm_dev_put() and works exactly like a memory allocation obtained by drmm_kmalloc().}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjghKbhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrmm_mutex_init (C macro)c.drmm_mutex_inithNtauh1jhjOhhhNhNubj)}(hhh](j)}(hdrmm_mutex_inith]j)}(hdrmm_mutex_inith]j)}(hdrmm_mutex_inith]j)}(hj hh]hdrmm_mutex_init}(hj*hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj"hhhh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKsubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhhj=hhKsubah}(h]jhah ](j j!eh"]h$]h&]j%j&)j'huh1jhj=hhKshjhhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjhhhhj=hhKsubeh}(h]h ](j macroeh"]h$]h&]jIj jJjVhjKjVhjLjMjNuh1jhhhjOhNhNubh)}(h``drmm_mutex_init (dev, lock)``h]j)}(hj\hh]hdrmm_mutex_init (dev, lock)}(hj^hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKuhjOhhubj[%)}(h*:c:type:`drm_device`-managed mutex_init() h]h)}(h):c:type:`drm_device`-managed mutex_init()h](h)}(h:c:type:`drm_device`h]j)}(hj|hh]h drm_device}(hj~hhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjzhubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKshjvhubh-managed mutex_init()}(hjvhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhhKshjrhubah}(h]h ]h"]h$]h&]uh1jZ%hjhhKshjOhhubjP)}(hX$**Parameters** ``dev`` DRM device ``lock`` lock to be initialized **Return** 0 on success, or a negative errno code otherwise. **Description** This is a :c:type:`drm_device`-managed version of mutex_init(). The initialized lock is automatically destroyed on the final drm_dev_put().h](h)}(h**Parameters**h]jZ)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjhubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKwhjhubjp)}(hhh](ju)}(h``dev`` DRM device h](j{)}(h``dev``h]j)}(hjhh]hdev}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKthjhubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhKthjhubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jthjhhKthjhubju)}(h ``lock`` lock to be initialized h](j{)}(h``lock``h]j)}(hjih]hlock}(hj ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jzh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKuhjiubj)}(hhh]h)}(hlock to be initializedh]hlock to be initialized}(hj!ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihKuhjiubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jthjihKuhjhubeh}(h]h ]h"]h$]h&]uh1johjhubh)}(h **Return**h]jZ)}(hjCih]hReturn}(hjEihhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjAiubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKwhjhubh)}(h10 on success, or a negative errno code otherwise.h]h10 on success, or a negative errno code otherwise.}(hjYihhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKwhjhubh)}(h**Description**h]jZ)}(hjjih]h Description}(hjlihhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjhiubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKyhjhubh)}(hThis is a :c:type:`drm_device`-managed version of mutex_init(). The initialized lock is automatically destroyed on the final drm_dev_put().h](h This is a }(hjihhhNhNubh)}(h:c:type:`drm_device`h]j)}(hjih]h drm_device}(hjihhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh\/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:135: ./include/drm/drm_managed.hhKzhjiubhm-managed version of mutex_init(). The initialized lock is automatically destroyed on the final drm_dev_put().}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjihKzhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjOhhhNhNubeh}(h]managed-resourcesah ]h"]managed resourcesah$]h&]uh1hhhhhhhhKubeh}(h]driver-initializationah ]h"]driver initializationah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h&Open/Close, File Operations and IOCTLsh]h&Open/Close, File Operations and IOCTLs}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihhhhhKubhtarget)}(h.. _drm_driver_fops:h]h}(h]h ]h"]h$]h&]refiddrm-driver-fopsuh1jihKhjihhhhubh)}(hhh](h)}(hFile Operationsh]hFile Operations}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihhhhhKubh)}(hXDrivers must define the file operations structure that forms the DRM userspace API entry point, even though most of those operations are implemented in the DRM core. The resulting :c:type:`struct file_operations ` must be stored in the :c:type:`drm_driver.fops ` field. The mandatory functions are drm_open(), drm_read(), drm_ioctl() and drm_compat_ioctl() if CONFIG_COMPAT is enabled Note that drm_compat_ioctl will be NULL if CONFIG_COMPAT=n, so there's no need to sprinkle #ifdef into the code. Drivers which implement private ioctls that require 32/64 bit compatibility support must provide their own :c:type:`file_operations.compat_ioctl ` handler that processes private ioctls and calls drm_compat_ioctl() for core ioctls.h](hDrivers must define the file operations structure that forms the DRM userspace API entry point, even though most of those operations are implemented in the DRM core. The resulting }(hjihhhNhNubh)}(h2:c:type:`struct file_operations `h]j)}(hjjh]hstruct file_operations}(hjjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKFhjiubh must be stored in the }(hjihhhNhNubh)}(h&:c:type:`drm_driver.fops `h]j)}(hj'jh]hdrm_driver.fops}(hj)jhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj%jubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhj jhKFhjiubhXY field. The mandatory functions are drm_open(), drm_read(), drm_ioctl() and drm_compat_ioctl() if CONFIG_COMPAT is enabled Note that drm_compat_ioctl will be NULL if CONFIG_COMPAT=n, so there’s no need to sprinkle #ifdef into the code. Drivers which implement private ioctls that require 32/64 bit compatibility support must provide their own }(hjihhhNhNubh)}(h8:c:type:`file_operations.compat_ioctl `h]j)}(hjJjh]hfile_operations.compat_ioctl}(hjLjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjHjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hhj jhKFhjiubhT handler that processes private ioctls and calls drm_compat_ioctl() for core ioctls.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj jhKFhjihhubh)}(hX_In addition drm_read() and drm_poll() provide support for DRM events. DRM events are a generic and extensible means to send asynchronous events to userspace through the file descriptor. They are used to send vblank event and page flip completions by the KMS API. But drivers can also use it for their own needs, e.g. to signal completion of rendering.h]hX_In addition drm_read() and drm_poll() provide support for DRM events. DRM events are a generic and extensible means to send asynchronous events to userspace through the file descriptor. They are used to send vblank event and page flip completions by the KMS API. But drivers can also use it for their own needs, e.g. to signal completion of rendering.}(hjqjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKQhjihhubh)}(hrFor the driver-side event interface see drm_event_reserve_init() and drm_send_event() as the main starting points.h]hrFor the driver-side event interface see drm_event_reserve_init() and drm_send_event() as the main starting points.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKWhjihhubh)}(hThe memory mapping implementation will vary depending on how the driver manages memory. For GEM-based drivers this is drm_gem_mmap().h]hThe memory mapping implementation will vary depending on how the driver manages memory. For GEM-based drivers this is drm_gem_mmap().}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKZhjihhubh)}(hNo other file operations are supported by the DRM userspace API. Overall the following is an example :c:type:`file_operations` structure::h](heNo other file operations are supported by the DRM userspace API. Overall the following is an example }(hjjhhhNhNubh)}(h:c:type:`file_operations`h]j)}(hjjh]hfile_operations}(hjjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chK]hjjubh structure:}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjjhK]hjihhubj2)}(hX8static const example_drm_fops = { .owner = THIS_MODULE, .open = drm_open, .release = drm_release, .unlocked_ioctl = drm_ioctl, .compat_ioctl = drm_compat_ioctl, // NULL if CONFIG_COMPAT=n .poll = drm_poll, .read = drm_read, .mmap = drm_gem_mmap, };h]hX8static const example_drm_fops = { .owner = THIS_MODULE, .open = drm_open, .release = drm_release, .unlocked_ioctl = drm_ioctl, .compat_ioctl = drm_compat_ioctl, // NULL if CONFIG_COMPAT=n .poll = drm_poll, .read = drm_read, .mmap = drm_gem_mmap, };}hjjsbah}(h]h ]h"]h$]h&]jAjBuh1j1h]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chK`hjihhubh)}(hFor plain GEM based drivers there is the DEFINE_DRM_GEM_FOPS() macro, and for DMA based drivers there is the DEFINE_DRM_GEM_DMA_FOPS() macro to make this simpler.h]hFor plain GEM based drivers there is the DEFINE_DRM_GEM_FOPS() macro, and for DMA based drivers there is the DEFINE_DRM_GEM_DMA_FOPS() macro to make this simpler.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKkhjihhubh)}(h`The driver's :c:type:`file_operations` must be stored in :c:type:`drm_driver.fops `.h](hThe driver’s }(hjjhhhNhNubh)}(h:c:type:`file_operations`h]j)}(hjjh]hfile_operations}(hjjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKohjjubh must be stored in }(hjjhhhNhNubh)}(h&:c:type:`drm_driver.fops `h]j)}(hjkh]hdrm_driver.fops}(hjkhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhjkhKohjjubh.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjkhKohjihhubh)}(hFor driver-private IOCTL handling see the more detailed discussion in :ref:`IOCTL support in the userland interfaces chapter`.h](hFFor driver-private IOCTL handling see the more detailed discussion in }(hjCkhhhNhNubh)}(hI:ref:`IOCTL support in the userland interfaces chapter`h]jz)}(hjMkh]h0IOCTL support in the userland interfaces chapter}(hjOkhhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjKkubah}(h]h ]h"]h$]h&]refdocj refdomainjYkreftyperef refexplicitrefwarnjdrm_driver_ioctluh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:146: ./drivers/gpu/drm/drm_file.chKqhjCkubh.}(hjCkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjkkhKqhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_minor (C struct) c.drm_minorhNtauh1jhjihhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhNubj)}(hhh](j)}(h drm_minorh]j)}(hstruct drm_minorh](j)}(hjh]hstruct}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhjkhKubj)}(h drm_minorh]j)}(hjkh]h drm_minor}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjkhhhjkhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjkhhhjkhKubah}(h]jkah ](j j!eh"]h$]h&]j%j&)j'huh1jhjkhKhjkhhubj))}(hhh]h)}(hDRM device minor structureh]hDRM device minor structure}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKEhjkhhubah}(h]h ]h"]h$]h&]uh1j(hjkhhhjkhKubeh}(h]h ](j structeh"]h$]h&]jIj jJjkjKjkjLjMjNuh1jhhhjihjkhNubjP)}(h8**Definition**:: struct drm_minor { }; **Members**h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjkubh:}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKIhjkubj2)}(hstruct drm_minor { };h]hstruct drm_minor { };}hjlsbah}(h]h ]h"]h$]h&]jAjBuh1j1hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKKhjkubh)}(h **Members**h]jZ)}(hj lh]hMembers}(hj"lhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjlubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKNhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubh)}(h**Description**h]jZ)}(hj?lh]h Description}(hjAlhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj=lubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKQhjihhubh)}(hXeThis structure represents a DRM minor number for device nodes in /dev. Entirely opaque to drivers and should never be inspected directly by drivers. Drivers instead should only interact with :c:type:`struct drm_file ` and of course :c:type:`struct drm_device `, which is also where driver-private data and resources can be attached to.h](hThis structure represents a DRM minor number for device nodes in /dev. Entirely opaque to drivers and should never be inspected directly by drivers. Drivers instead should only interact with }(hjUlhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hj_lh]hstruct drm_file}(hjalhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj]lubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKFhjUlubh and of course }(hjUlhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjlh]hstruct drm_device}(hjlhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj|lhKFhjUlubhK, which is also where driver-private data and resources can be attached to.}(hjUlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj|lhKFhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_pending_event (C struct)c.drm_pending_eventhNtauh1jhjihhhjkhNubj)}(hhh](j)}(hdrm_pending_eventh]j)}(hstruct drm_pending_eventh](j)}(hjh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKOubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhjlhKOubj)}(hdrm_pending_eventh]j)}(hjlh]hdrm_pending_event}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjlhhhjlhKOubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjlhhhjlhKOubah}(h]jlah ](j j!eh"]h$]h&]j%j&)j'huh1jhjlhKOhjlhhubj))}(hhh]h)}(h%Event queued up for userspace to readh]h%Event queued up for userspace to read}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKYhjmhhubah}(h]h ]h"]h$]h&]uh1j(hjlhhhjlhKOubeh}(h]h ](j structeh"]h$]h&]jIj jJjmjKjmjLjMjNuh1jhhhjihjkhNubjP)}(hXu**Definition**:: struct drm_pending_event { struct completion *completion; void (*completion_release)(struct completion *completion); struct drm_event *event; struct dma_fence *fence; struct drm_file *file_priv; struct list_head link; struct list_head pending_link; }; **Members** ``completion`` Optional pointer to a kernel internal completion signalled when drm_send_event() is called, useful to internally synchronize with nonblocking operations. ``completion_release`` Optional callback currently only used by the atomic modeset helpers to clean up the reference count for the structure **completion** is stored in. ``event`` Pointer to the actual event that should be sent to userspace to be read using drm_read(). Can be optional, since nowadays events are also used to signal kernel internal threads with **completion** or DMA transactions using **fence**. ``fence`` Optional DMA fence to unblock other hardware transactions which depend upon the nonblocking DRM operation this event represents. ``file_priv`` :c:type:`struct drm_file ` where **event** should be delivered to. Only set when **event** is set. ``link`` Double-linked list to keep track of this event. Can be used by the driver up to the point when it calls drm_send_event(), after that this list entry is owned by the core for its own book-keeping. ``pending_link`` Entry on :c:type:`drm_file.pending_event_list `, to keep track of all pending events for **file_priv**, to allow correct unwinding of them when userspace closes the file before the event is delivered.h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hj)mhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj%mubh:}(hj%mhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhK]hj!mubj2)}(hXstruct drm_pending_event { struct completion *completion; void (*completion_release)(struct completion *completion); struct drm_event *event; struct dma_fence *fence; struct drm_file *file_priv; struct list_head link; struct list_head pending_link; };h]hXstruct drm_pending_event { struct completion *completion; void (*completion_release)(struct completion *completion); struct drm_event *event; struct dma_fence *fence; struct drm_file *file_priv; struct list_head link; struct list_head pending_link; };}hjBmsbah}(h]h ]h"]h$]h&]jAjBuh1j1hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhK_hj!mubh)}(h **Members**h]jZ)}(hjSmh]hMembers}(hjUmhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjQmubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKihj!mubjp)}(hhh](ju)}(h``completion`` Optional pointer to a kernel internal completion signalled when drm_send_event() is called, useful to internally synchronize with nonblocking operations. h](j{)}(h``completion``h]j)}(hjrmh]h completion}(hjtmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpmubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKdhjlmubj)}(hhh]h)}(hOptional pointer to a kernel internal completion signalled when drm_send_event() is called, useful to internally synchronize with nonblocking operations.h]hOptional pointer to a kernel internal completion signalled when drm_send_event() is called, useful to internally synchronize with nonblocking operations.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKbhjmubah}(h]h ]h"]h$]h&]uh1jhjlmubeh}(h]h ]h"]h$]h&]uh1jthjmhKdhjimubju)}(h``completion_release`` Optional callback currently only used by the atomic modeset helpers to clean up the reference count for the structure **completion** is stored in. h](j{)}(h``completion_release``h]j)}(hjmh]hcompletion_release}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKmhjmubj)}(hhh]h)}(hOptional callback currently only used by the atomic modeset helpers to clean up the reference count for the structure **completion** is stored in.h](hvOptional callback currently only used by the atomic modeset helpers to clean up the reference count for the structure }(hjmhhhNhNubjZ)}(h**completion**h]h completion}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjmubh is stored in.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKkhjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jthjmhKmhjimubju)}(h``event`` Pointer to the actual event that should be sent to userspace to be read using drm_read(). Can be optional, since nowadays events are also used to signal kernel internal threads with **completion** or DMA transactions using **fence**. h](j{)}(h ``event``h]j)}(hjmh]hevent}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKwhjmubj)}(hhh]h)}(hPointer to the actual event that should be sent to userspace to be read using drm_read(). Can be optional, since nowadays events are also used to signal kernel internal threads with **completion** or DMA transactions using **fence**.h](hPointer to the actual event that should be sent to userspace to be read using drm_read(). Can be optional, since nowadays events are also used to signal kernel internal threads with }(hjnhhhNhNubjZ)}(h**completion**h]h completion}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjnubh or DMA transactions using }(hjnhhhNhNubjZ)}(h **fence**h]hfence}(hj+nhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjnubh.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKthjnubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jthj nhKwhjimubju)}(h``fence`` Optional DMA fence to unblock other hardware transactions which depend upon the nonblocking DRM operation this event represents. h](j{)}(h ``fence``h]j)}(hjVnh]hfence}(hjXnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTnubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjPnubj)}(hhh]h)}(hOptional DMA fence to unblock other hardware transactions which depend upon the nonblocking DRM operation this event represents.h]hOptional DMA fence to unblock other hardware transactions which depend upon the nonblocking DRM operation this event represents.}(hjonhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhK~hjlnubah}(h]h ]h"]h$]h&]uh1jhjPnubeh}(h]h ]h"]h$]h&]uh1jthjknhKhjimubju)}(h{``file_priv`` :c:type:`struct drm_file ` where **event** should be delivered to. Only set when **event** is set. h](j{)}(h ``file_priv``h]j)}(hjnh]h file_priv}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjnubj)}(hhh]h)}(hl:c:type:`struct drm_file ` where **event** should be delivered to. Only set when **event** is set.h](h)}(h$:c:type:`struct drm_file `h]j)}(hjnh]hstruct drm_file}(hjnhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjnubh where }(hjnhhhNhNubjZ)}(h **event**h]hevent}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjnubh' should be delivered to. Only set when }(hjnhhhNhNubjZ)}(h **event**h]hevent}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjnubh is set.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjnhKhjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jthjnhKhjimubju)}(h``link`` Double-linked list to keep track of this event. Can be used by the driver up to the point when it calls drm_send_event(), after that this list entry is owned by the core for its own book-keeping. h](j{)}(h``link``h]j)}(hj oh]hlink}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj oubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjoubj)}(hhh]h)}(hDouble-linked list to keep track of this event. Can be used by the driver up to the point when it calls drm_send_event(), after that this list entry is owned by the core for its own book-keeping.h]hDouble-linked list to keep track of this event. Can be used by the driver up to the point when it calls drm_send_event(), after that this list entry is owned by the core for its own book-keeping.}(hj&ohhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj#oubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jthj"ohKhjimubju)}(h``pending_link`` Entry on :c:type:`drm_file.pending_event_list `, to keep track of all pending events for **file_priv**, to allow correct unwinding of them when userspace closes the file before the event is delivered.h](j{)}(h``pending_link``h]j)}(hjGoh]h pending_link}(hjIohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEoubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjAoubj)}(hhh]h)}(hEntry on :c:type:`drm_file.pending_event_list `, to keep track of all pending events for **file_priv**, to allow correct unwinding of them when userspace closes the file before the event is delivered.h](h Entry on }(hj`ohhhNhNubh)}(h0:c:type:`drm_file.pending_event_list `h]j)}(hjjoh]hdrm_file.pending_event_list}(hjlohhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjhoubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj`oubh*, to keep track of all pending events for }(hj`ohhhNhNubjZ)}(h **file_priv**h]h file_priv}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj`oubhb, to allow correct unwinding of them when userspace closes the file before the event is delivered.}(hj`ohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjohKhj]oubah}(h]h ]h"]h$]h&]uh1jhjAoubeh}(h]h ]h"]h$]h&]uh1jthj\ohKhjimubeh}(h]h ]h"]h$]h&]uh1johj!mubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubh)}(h**Description**h]jZ)}(hjoh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjoubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjihhubh)}(hXThis represents a DRM event. Drivers can use this as a generic completion mechanism, which supports kernel-internal :c:type:`struct completion `, :c:type:`struct dma_fence ` and also the DRM-specific :c:type:`struct drm_event ` delivery mechanism.h](htThis represents a DRM event. Drivers can use this as a generic completion mechanism, which supports kernel-internal }(hjohhhNhNubh)}(h(:c:type:`struct completion `h]j)}(hjoh]hstruct completion}(hjohhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj completionuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKZhjoubh, }(hjohhhNhNubh)}(h&:c:type:`struct dma_fence `h]j)}(hjph]hstruct dma_fence}(hjphhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj dma_fenceuh1hhjohKZhjoubh and also the DRM-specific }(hjohhhNhNubh)}(h&:c:type:`struct drm_event `h]j)}(hj&ph]hstruct drm_event}(hj(phhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj$pubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_eventuh1hhjohKZhjoubh delivery mechanism.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjohKZhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_file (C struct) c.drm_filehNtauh1jhjihhhjkhNubj)}(hhh](j)}(hdrm_fileh]j)}(hstruct drm_fileh](j)}(hjh]hstruct}(hjfphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbphhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKaubj)}(h h]h }(hjtphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbphhhjsphKaubj)}(hdrm_fileh]j)}(hj`ph]hdrm_file}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjbphhhjsphKaubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj^phhhjsphKaubah}(h]jYpah ](j j!eh"]h$]h&]j%j&)j'huh1jhjsphKahj[phhubj))}(hhh]h)}(hDRM file private datah]hDRM file private data}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjphhubah}(h]h ]h"]h$]h&]uh1j(hj[phhhjsphKaubeh}(h]h ](j structeh"]h$]h&]jIj jJjpjKjpjLjMjNuh1jhhhjihjkhNubjP)}(hX/**Definition**:: struct drm_file { bool authenticated; bool stereo_allowed; bool universal_planes; bool atomic; bool aspect_ratio_allowed; bool writeback_connectors; bool was_master; bool is_master; bool supports_virtualized_cursor_plane; struct drm_master *master; spinlock_t master_lookup_lock; struct pid __rcu *pid; u64 client_id; drm_magic_t magic; struct list_head lhead; struct drm_minor *minor; struct idr object_idr; spinlock_t table_lock; struct idr syncobj_idr; spinlock_t syncobj_table_lock; struct file *filp; void *driver_priv; struct list_head fbs; struct mutex fbs_lock; struct list_head blobs; wait_queue_head_t event_wait; struct list_head pending_event_list; struct list_head event_list; int event_space; struct mutex event_read_lock; struct drm_prime_file_private prime; const char *client_name; struct mutex client_name_lock; }; **Members** ``authenticated`` Whether the client is allowed to submit rendering, which for legacy nodes means it must be authenticated. See also the :ref:`section on primary nodes and authentication `. ``stereo_allowed`` True when the client has asked us to expose stereo 3D mode flags. ``universal_planes`` True if client understands CRTC primary planes and cursor planes in the plane list. Automatically set when **atomic** is set. ``atomic`` True if client understands atomic properties. ``aspect_ratio_allowed`` True, if client can handle picture aspect ratios, and has requested to pass this information along with the mode. ``writeback_connectors`` True if client understands writeback connectors ``was_master`` This client has or had, master capability. Protected by struct :c:type:`drm_device.master_mutex `. This is used to ensure that CAP_SYS_ADMIN is not enforced, if the client is or was master in the past. ``is_master`` This client is the creator of **master**. Protected by struct :c:type:`drm_device.master_mutex `. See also the :ref:`section on primary nodes and authentication `. ``supports_virtualized_cursor_plane`` This client is capable of handling the cursor plane with the restrictions imposed on it by the virtualized drivers. This implies that the cursor plane has to behave like a cursor i.e. track cursor movement. It also requires setting of the hotspot properties by the client on the cursor plane. ``master`` Master this node is currently associated with. Protected by struct :c:type:`drm_device.master_mutex `, and serialized by **master_lookup_lock**. Only relevant if drm_is_primary_client() returns true. Note that this only matches :c:type:`drm_device.master ` if the master is the currently active one. To update **master**, both :c:type:`drm_device.master_mutex ` and **master_lookup_lock** need to be held, therefore holding either of them is safe and enough for the read side. When dereferencing this pointer, either hold struct :c:type:`drm_device.master_mutex ` for the duration of the pointer's use, or use drm_file_get_master() if struct :c:type:`drm_device.master_mutex ` is not currently held and there is no other need to hold it. This prevents **master** from being freed during use. See also **authentication** and **is_master** and the :ref:`section on primary nodes and authentication `. ``master_lookup_lock`` Serializes **master**. ``pid`` Process that is using this file. Must only be dereferenced under a rcu_read_lock or equivalent. Updates are guarded with dev->filelist_mutex and reference must be dropped after a RCU grace period to accommodate lockless readers. ``client_id`` A unique id for fdinfo ``magic`` Authentication magic, see **authenticated**. ``lhead`` List of all open files of a DRM device, linked into :c:type:`drm_device.filelist `. Protected by :c:type:`drm_device.filelist_mutex `. ``minor`` :c:type:`struct drm_minor ` for this file. ``object_idr`` Mapping of mm object handles to object pointers. Used by the GEM subsystem. Protected by **table_lock**. Note that allocated entries might be NULL as a transient state when creating or deleting a handle. ``table_lock`` Protects **object_idr**. ``syncobj_idr`` Mapping of sync object handles to object pointers. ``syncobj_table_lock`` Protects **syncobj_idr**. ``filp`` Pointer to the core file structure. ``driver_priv`` Optional pointer for driver private data. Can be allocated in :c:type:`drm_driver.open ` and should be freed in :c:type:`drm_driver.postclose `. ``fbs`` List of :c:type:`struct drm_framebuffer ` associated with this file, using the :c:type:`drm_framebuffer.filp_head ` entry. Protected by **fbs_lock**. Note that the **fbs** list holds a reference on the framebuffer object to prevent it from untimely disappearing. ``fbs_lock`` Protects **fbs**. ``blobs`` User-created blob properties; this retains a reference on the property. Protected by **drm_mode_config.blob_lock**; ``event_wait`` Waitqueue for new events added to **event_list**. ``pending_event_list`` List of pending :c:type:`struct drm_pending_event `, used to clean up pending events in case this file gets closed before the event is signalled. Uses the :c:type:`drm_pending_event.pending_link ` entry. Protect by :c:type:`drm_device.event_lock `. ``event_list`` List of :c:type:`struct drm_pending_event `, ready for delivery to userspace through drm_read(). Uses the :c:type:`drm_pending_event.link ` entry. Protect by :c:type:`drm_device.event_lock `. ``event_space`` Available event space to prevent userspace from exhausting kernel memory. Currently limited to the fairly arbitrary value of 4KB. ``event_read_lock`` Serializes drm_read(). ``prime`` Per-file buffer caches used by the PRIME buffer sharing code. ``client_name`` Userspace-provided name; useful for accounting and debugging. ``client_name_lock`` Protects **client_name**.h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjpubh:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjpubj2)}(hXstruct drm_file { bool authenticated; bool stereo_allowed; bool universal_planes; bool atomic; bool aspect_ratio_allowed; bool writeback_connectors; bool was_master; bool is_master; bool supports_virtualized_cursor_plane; struct drm_master *master; spinlock_t master_lookup_lock; struct pid __rcu *pid; u64 client_id; drm_magic_t magic; struct list_head lhead; struct drm_minor *minor; struct idr object_idr; spinlock_t table_lock; struct idr syncobj_idr; spinlock_t syncobj_table_lock; struct file *filp; void *driver_priv; struct list_head fbs; struct mutex fbs_lock; struct list_head blobs; wait_queue_head_t event_wait; struct list_head pending_event_list; struct list_head event_list; int event_space; struct mutex event_read_lock; struct drm_prime_file_private prime; const char *client_name; struct mutex client_name_lock; };h]hXstruct drm_file { bool authenticated; bool stereo_allowed; bool universal_planes; bool atomic; bool aspect_ratio_allowed; bool writeback_connectors; bool was_master; bool is_master; bool supports_virtualized_cursor_plane; struct drm_master *master; spinlock_t master_lookup_lock; struct pid __rcu *pid; u64 client_id; drm_magic_t magic; struct list_head lhead; struct drm_minor *minor; struct idr object_idr; spinlock_t table_lock; struct idr syncobj_idr; spinlock_t syncobj_table_lock; struct file *filp; void *driver_priv; struct list_head fbs; struct mutex fbs_lock; struct list_head blobs; wait_queue_head_t event_wait; struct list_head pending_event_list; struct list_head event_list; int event_space; struct mutex event_read_lock; struct drm_prime_file_private prime; const char *client_name; struct mutex client_name_lock; };}hjpsbah}(h]h ]h"]h$]h&]jAjBuh1j1hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjpubh)}(h **Members**h]jZ)}(hjph]hMembers}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjpubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjpubjp)}(hhh](ju)}(h``authenticated`` Whether the client is allowed to submit rendering, which for legacy nodes means it must be authenticated. See also the :ref:`section on primary nodes and authentication `. h](j{)}(h``authenticated``h]j)}(hjqh]h authenticated}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjqubj)}(hhh](h)}(hiWhether the client is allowed to submit rendering, which for legacy nodes means it must be authenticated.h]hiWhether the client is allowed to submit rendering, which for legacy nodes means it must be authenticated.}(hj.qhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj+qubh)}(hSSee also the :ref:`section on primary nodes and authentication `.h](h See also the }(hj=qhhhNhNubh)}(hE:ref:`section on primary nodes and authentication `h]jz)}(hjGqh]h+section on primary nodes and authentication}(hjIqhhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjEqubah}(h]h ]h"]h$]h&]refdocj refdomainjSqreftyperef refexplicitrefwarnjdrm_primary_nodeuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj=qubh.}(hj=qhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjeqhKhj+qubeh}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jthj*qhKhj qubju)}(hU``stereo_allowed`` True when the client has asked us to expose stereo 3D mode flags. h](j{)}(h``stereo_allowed``h]j)}(hjqh]hstereo_allowed}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj|qubj)}(hhh]h)}(hATrue when the client has asked us to expose stereo 3D mode flags.h]hATrue when the client has asked us to expose stereo 3D mode flags.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhKhjqubah}(h]h ]h"]h$]h&]uh1jhj|qubeh}(h]h ]h"]h$]h&]uh1jthjqhKhj qubju)}(h``universal_planes`` True if client understands CRTC primary planes and cursor planes in the plane list. Automatically set when **atomic** is set. h](j{)}(h``universal_planes``h]j)}(hjqh]huniversal_planes}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjqubj)}(hhh]h)}(h}True if client understands CRTC primary planes and cursor planes in the plane list. Automatically set when **atomic** is set.h](hkTrue if client understands CRTC primary planes and cursor planes in the plane list. Automatically set when }(hjqhhhNhNubjZ)}(h **atomic**h]hatomic}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjqubh is set.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjqubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jthjqhKhj qubju)}(h9``atomic`` True if client understands atomic properties. h](j{)}(h ``atomic``h]j)}(hjrh]hatomic}(hj rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjrubj)}(hhh]h)}(h-True if client understands atomic properties.h]h-True if client understands atomic properties.}(hj rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhKhjrubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jthjrhKhj qubju)}(h``aspect_ratio_allowed`` True, if client can handle picture aspect ratios, and has requested to pass this information along with the mode. h](j{)}(h``aspect_ratio_allowed``h]j)}(hj@rh]haspect_ratio_allowed}(hjBrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>rubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj:rubj)}(hhh]h)}(hqTrue, if client can handle picture aspect ratios, and has requested to pass this information along with the mode.h]hqTrue, if client can handle picture aspect ratios, and has requested to pass this information along with the mode.}(hjYrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjVrubah}(h]h ]h"]h$]h&]uh1jhj:rubeh}(h]h ]h"]h$]h&]uh1jthjUrhKhj qubju)}(hI``writeback_connectors`` True if client understands writeback connectors h](j{)}(h``writeback_connectors``h]j)}(hjzrh]hwriteback_connectors}(hj|rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxrubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjtrubj)}(hhh]h)}(h/True if client understands writeback connectorsh]h/True if client understands writeback connectors}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhKhjrubah}(h]h ]h"]h$]h&]uh1jhjtrubeh}(h]h ]h"]h$]h&]uh1jthjrhKhj qubju)}(h``was_master`` This client has or had, master capability. Protected by struct :c:type:`drm_device.master_mutex `. This is used to ensure that CAP_SYS_ADMIN is not enforced, if the client is or was master in the past. h](j{)}(h``was_master``h]j)}(hjrh]h was_master}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjrubj)}(hhh](h)}(hnThis client has or had, master capability. Protected by struct :c:type:`drm_device.master_mutex `.h](h?This client has or had, master capability. Protected by struct }(hjrhhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjrh]hdrm_device.master_mutex}(hjrhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjrubh.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjrhKhjrubh)}(hfThis is used to ensure that CAP_SYS_ADMIN is not enforced, if the client is or was master in the past.h]hfThis is used to ensure that CAP_SYS_ADMIN is not enforced, if the client is or was master in the past.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjrubeh}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jthjrhKhj qubju)}(h``is_master`` This client is the creator of **master**. Protected by struct :c:type:`drm_device.master_mutex `. See also the :ref:`section on primary nodes and authentication `. h](j{)}(h ``is_master``h]j)}(hjsh]h is_master}(hj!shhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjsubj)}(hhh](h)}(hmThis client is the creator of **master**. Protected by struct :c:type:`drm_device.master_mutex `.h](hThis client is the creator of }(hj8shhhNhNubjZ)}(h **master**h]hmaster}(hj@shhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj8subh. Protected by struct }(hj8shhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjTsh]hdrm_device.master_mutex}(hjVshhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjRsubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj8subh.}(hj8shhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjqshKhj5subh)}(hSSee also the :ref:`section on primary nodes and authentication `.h](h See also the }(hj|shhhNhNubh)}(hE:ref:`section on primary nodes and authentication `h]jz)}(hjsh]h+section on primary nodes and authentication}(hjshhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjsubah}(h]h ]h"]h$]h&]refdocj refdomainjsreftyperef refexplicitrefwarnjdrm_primary_nodeuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj|subh.}(hj|shhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjshKhj5subeh}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jthj4shKhj qubju)}(hXL``supports_virtualized_cursor_plane`` This client is capable of handling the cursor plane with the restrictions imposed on it by the virtualized drivers. This implies that the cursor plane has to behave like a cursor i.e. track cursor movement. It also requires setting of the hotspot properties by the client on the cursor plane. h](j{)}(h%``supports_virtualized_cursor_plane``h]j)}(hjsh]h!supports_virtualized_cursor_plane}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjsubj)}(hhh](h)}(hsThis client is capable of handling the cursor plane with the restrictions imposed on it by the virtualized drivers.h]hsThis client is capable of handling the cursor plane with the restrictions imposed on it by the virtualized drivers.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjsubh)}(hThis implies that the cursor plane has to behave like a cursor i.e. track cursor movement. It also requires setting of the hotspot properties by the client on the cursor plane.h]hThis implies that the cursor plane has to behave like a cursor i.e. track cursor movement. It also requires setting of the hotspot properties by the client on the cursor plane.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjsubeh}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jthjshKhj qubju)}(hX``master`` Master this node is currently associated with. Protected by struct :c:type:`drm_device.master_mutex `, and serialized by **master_lookup_lock**. Only relevant if drm_is_primary_client() returns true. Note that this only matches :c:type:`drm_device.master ` if the master is the currently active one. To update **master**, both :c:type:`drm_device.master_mutex ` and **master_lookup_lock** need to be held, therefore holding either of them is safe and enough for the read side. When dereferencing this pointer, either hold struct :c:type:`drm_device.master_mutex ` for the duration of the pointer's use, or use drm_file_get_master() if struct :c:type:`drm_device.master_mutex ` is not currently held and there is no other need to hold it. This prevents **master** from being freed during use. See also **authentication** and **is_master** and the :ref:`section on primary nodes and authentication `. h](j{)}(h ``master``h]j)}(hj th]hmaster}(hj thhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjtubj)}(hhh](h)}(hMaster this node is currently associated with. Protected by struct :c:type:`drm_device.master_mutex `, and serialized by **master_lookup_lock**.h](hCMaster this node is currently associated with. Protected by struct }(hj#thhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hj-th]hdrm_device.master_mutex}(hj/thhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj+tubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj#tubh, and serialized by }(hj#thhhNhNubjZ)}(h**master_lookup_lock**h]hmaster_lookup_lock}(hjOthhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj#tubh.}(hj#thhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjJthKhj tubh)}(hOnly relevant if drm_is_primary_client() returns true. Note that this only matches :c:type:`drm_device.master ` if the master is the currently active one.h](hSOnly relevant if drm_is_primary_client() returns true. Note that this only matches }(hjgthhhNhNubh)}(h(:c:type:`drm_device.master `h]j)}(hjqth]hdrm_device.master}(hjsthhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjotubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjgtubh+ if the master is the currently active one.}(hjgthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjthKhj tubh)}(hTo update **master**, both :c:type:`drm_device.master_mutex ` and **master_lookup_lock** need to be held, therefore holding either of them is safe and enough for the read side.h](h To update }(hjthhhNhNubjZ)}(h **master**h]hmaster}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjtubh, both }(hjthhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjth]hdrm_device.master_mutex}(hjthhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjtubh and }(hjthhhNhNubjZ)}(h**master_lookup_lock**h]hmaster_lookup_lock}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjtubhX need to be held, therefore holding either of them is safe and enough for the read side.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjthKhj tubh)}(hXRWhen dereferencing this pointer, either hold struct :c:type:`drm_device.master_mutex ` for the duration of the pointer's use, or use drm_file_get_master() if struct :c:type:`drm_device.master_mutex ` is not currently held and there is no other need to hold it. This prevents **master** from being freed during use.h](h4When dereferencing this pointer, either hold struct }(hjthhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjth]hdrm_device.master_mutex}(hjthhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjtubhQ for the duration of the pointer’s use, or use drm_file_get_master() if struct }(hjthhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjuh]hdrm_device.master_mutex}(hjuhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjuhMhjtubhL is not currently held and there is no other need to hold it. This prevents }(hjthhhNhNubjZ)}(h **master**h]hmaster}(hj>uhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjtubh from being freed during use.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjuhMhj tubh)}(h|See also **authentication** and **is_master** and the :ref:`section on primary nodes and authentication `.h](h See also }(hjVuhhhNhNubjZ)}(h**authentication**h]hauthentication}(hj^uhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjVuubh and }(hjVuhhhNhNubjZ)}(h **is_master**h]h is_master}(hjpuhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjVuubh and the }(hjVuhhhNhNubh)}(hE:ref:`section on primary nodes and authentication `h]jz)}(hjuh]h+section on primary nodes and authentication}(hjuhhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjuubah}(h]h ]h"]h$]h&]refdocj refdomainjureftyperef refexplicitrefwarnjdrm_primary_nodeuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjVuubh.}(hjVuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjuhMhj tubeh}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jthjthMhj qubju)}(h.``master_lookup_lock`` Serializes **master**. h](j{)}(h``master_lookup_lock``h]j)}(hjuh]hmaster_lookup_lock}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjuubj)}(hhh]h)}(hSerializes **master**.h](h Serializes }(hjuhhhNhNubjZ)}(h **master**h]hmaster}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjuubh.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjuhKhjuubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jthjuhKhj qubju)}(h``pid`` Process that is using this file. Must only be dereferenced under a rcu_read_lock or equivalent. Updates are guarded with dev->filelist_mutex and reference must be dropped after a RCU grace period to accommodate lockless readers. h](j{)}(h``pid``h]j)}(hj vh]hpid}(hj vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjvubj)}(hhh](h)}(h Process that is using this file.h]h Process that is using this file.}(hj#vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj vubh)}(h>Must only be dereferenced under a rcu_read_lock or equivalent.h]h>Must only be dereferenced under a rcu_read_lock or equivalent.}(hj2vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj vubh)}(hUpdates are guarded with dev->filelist_mutex and reference must be dropped after a RCU grace period to accommodate lockless readers.h]hUpdates are guarded with dev->filelist_mutex and reference must be dropped after a RCU grace period to accommodate lockless readers.}(hjAvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj vubeh}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjvhMhj qubju)}(h%``client_id`` A unique id for fdinfo h](j{)}(h ``client_id``h]j)}(hjbvh]h client_id}(hjdvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`vubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj\vubj)}(hhh]h)}(hA unique id for fdinfoh]hA unique id for fdinfo}(hj{vhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwvhKhjxvubah}(h]h ]h"]h$]h&]uh1jhj\vubeh}(h]h ]h"]h$]h&]uh1jthjwvhKhj qubju)}(h7``magic`` Authentication magic, see **authenticated**. h](j{)}(h ``magic``h]j)}(hjvh]hmagic}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjvubj)}(hhh]h)}(h,Authentication magic, see **authenticated**.h](hAuthentication magic, see }(hjvhhhNhNubjZ)}(h**authenticated**h]h authenticated}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjvubh.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjvhKhjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjvhKhj qubju)}(h``lhead`` List of all open files of a DRM device, linked into :c:type:`drm_device.filelist `. Protected by :c:type:`drm_device.filelist_mutex `. h](j{)}(h ``lhead``h]j)}(hjvh]hlhead}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM"hjvubj)}(hhh]h)}(hList of all open files of a DRM device, linked into :c:type:`drm_device.filelist `. Protected by :c:type:`drm_device.filelist_mutex `.h](h4List of all open files of a DRM device, linked into }(hjvhhhNhNubh)}(h*:c:type:`drm_device.filelist `h]j)}(hj wh]hdrm_device.filelist}(hj whhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM!hjvubh. Protected by }(hjvhhhNhNubh)}(h0:c:type:`drm_device.filelist_mutex `h]j)}(hj-wh]hdrm_device.filelist_mutex}(hj/whhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj+wubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj&whM!hjvubh.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&whM!hjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjvhM"hj qubju)}(h@``minor`` :c:type:`struct drm_minor ` for this file. h](j{)}(h ``minor``h]j)}(hjfwh]hminor}(hjhwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdwubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj`wubj)}(hhh]h)}(h5:c:type:`struct drm_minor ` for this file.h](h)}(h&:c:type:`struct drm_minor `h]j)}(hjwh]hstruct drm_minor}(hjwhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_minoruh1hhj{whKhjwubh for this file.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{whKhj|wubah}(h]h ]h"]h$]h&]uh1jhj`wubeh}(h]h ]h"]h$]h&]uh1jthj{whKhj qubju)}(h``object_idr`` Mapping of mm object handles to object pointers. Used by the GEM subsystem. Protected by **table_lock**. Note that allocated entries might be NULL as a transient state when creating or deleting a handle. h](j{)}(h``object_idr``h]j)}(hjwh]h object_idr}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM0hjwubj)}(hhh](h)}(hhMapping of mm object handles to object pointers. Used by the GEM subsystem. Protected by **table_lock**.h](hYMapping of mm object handles to object pointers. Used by the GEM subsystem. Protected by }(hjwhhhNhNubjZ)}(h**table_lock**h]h table_lock}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjwubh.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM,hjwubh)}(hbNote that allocated entries might be NULL as a transient state when creating or deleting a handle.h]hbNote that allocated entries might be NULL as a transient state when creating or deleting a handle.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM/hjwubeh}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jthjwhM0hj qubju)}(h(``table_lock`` Protects **object_idr**. h](j{)}(h``table_lock``h]j)}(hjxh]h table_lock}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjxubj)}(hhh]h)}(hProtects **object_idr**.h](h Protects }(hj2xhhhNhNubjZ)}(h**object_idr**h]h object_idr}(hj:xhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj2xubh.}(hj2xhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj.xhKhj/xubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jthj.xhKhj qubju)}(hC``syncobj_idr`` Mapping of sync object handles to object pointers. h](j{)}(h``syncobj_idr``h]j)}(hjdxh]h syncobj_idr}(hjfxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbxubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj^xubj)}(hhh]h)}(h2Mapping of sync object handles to object pointers.h]h2Mapping of sync object handles to object pointers.}(hj}xhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyxhKhjzxubah}(h]h ]h"]h$]h&]uh1jhj^xubeh}(h]h ]h"]h$]h&]uh1jthjyxhKhj qubju)}(h1``syncobj_table_lock`` Protects **syncobj_idr**. h](j{)}(h``syncobj_table_lock``h]j)}(hjxh]hsyncobj_table_lock}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjxubj)}(hhh]h)}(hProtects **syncobj_idr**.h](h Protects }(hjxhhhNhNubjZ)}(h**syncobj_idr**h]h syncobj_idr}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjxubh.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjxhKhjxubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jthjxhKhj qubju)}(h-``filp`` Pointer to the core file structure. h](j{)}(h``filp``h]j)}(hjxh]hfilp}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjxubj)}(hhh]h)}(h#Pointer to the core file structure.h]h#Pointer to the core file structure.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhKhjxubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jthjxhKhj qubju)}(h``driver_priv`` Optional pointer for driver private data. Can be allocated in :c:type:`drm_driver.open ` and should be freed in :c:type:`drm_driver.postclose `. h](j{)}(h``driver_priv``h]j)}(hj!yh]h driver_priv}(hj#yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMChjyubj)}(hhh]h)}(hOptional pointer for driver private data. Can be allocated in :c:type:`drm_driver.open ` and should be freed in :c:type:`drm_driver.postclose `.h](h>Optional pointer for driver private data. Can be allocated in }(hj:yhhhNhNubh)}(h&:c:type:`drm_driver.open `h]j)}(hjDyh]hdrm_driver.open}(hjFyhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjByubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMBhj:yubh and should be freed in }(hj:yhhhNhNubh)}(h+:c:type:`drm_driver.postclose `h]j)}(hjhyh]hdrm_driver.postclose}(hjjyhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjfyubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhjayhMBhj:yubh.}(hj:yhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjayhMBhj7yubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jthj6yhMChj qubju)}(hX2``fbs`` List of :c:type:`struct drm_framebuffer ` associated with this file, using the :c:type:`drm_framebuffer.filp_head ` entry. Protected by **fbs_lock**. Note that the **fbs** list holds a reference on the framebuffer object to prevent it from untimely disappearing. h](j{)}(h``fbs``h]j)}(hjyh]hfbs}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMNhjyubj)}(hhh](h)}(hList of :c:type:`struct drm_framebuffer ` associated with this file, using the :c:type:`drm_framebuffer.filp_head ` entry.h](hList of }(hjyhhhNhNubh)}(h2:c:type:`struct drm_framebuffer `h]j)}(hjyh]hstruct drm_framebuffer}(hjyhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_framebufferuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMJhjyubh& associated with this file, using the }(hjyhhhNhNubh)}(h5:c:type:`drm_framebuffer.filp_head `h]j)}(hjyh]hdrm_framebuffer.filp_head}(hjyhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_framebufferuh1hhjyhMJhjyubh entry.}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjyhMJhjyubh)}(hProtected by **fbs_lock**. Note that the **fbs** list holds a reference on the framebuffer object to prevent it from untimely disappearing.h](h Protected by }(hjzhhhNhNubjZ)}(h **fbs_lock**h]hfbs_lock}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjzubh. Note that the }(hjzhhhNhNubjZ)}(h**fbs**h]hfbs}(hj)zhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjzubh[ list holds a reference on the framebuffer object to prevent it from untimely disappearing.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMMhjyubeh}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jthjyhMNhj qubju)}(h``fbs_lock`` Protects **fbs**. h](j{)}(h ``fbs_lock``h]j)}(hjTzh]hfbs_lock}(hjVzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRzubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjNzubj)}(hhh]h)}(hProtects **fbs**.h](h Protects }(hjmzhhhNhNubjZ)}(h**fbs**h]hfbs}(hjuzhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjmzubh.}(hjmzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjizhKhjjzubah}(h]h ]h"]h$]h&]uh1jhjNzubeh}(h]h ]h"]h$]h&]uh1jthjizhKhj qubju)}(h``blobs`` User-created blob properties; this retains a reference on the property. Protected by **drm_mode_config.blob_lock**; h](j{)}(h ``blobs``h]j)}(hjzh]hblobs}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM[hjzubj)}(hhh](h)}(hGUser-created blob properties; this retains a reference on the property.h]hGUser-created blob properties; this retains a reference on the property.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMXhjzubh)}(h+Protected by **drm_mode_config.blob_lock**;h](h Protected by }(hjzhhhNhNubjZ)}(h**drm_mode_config.blob_lock**h]hdrm_mode_config.blob_lock}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjzubh;}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjzhM[hjzubeh}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jthjzhM[hj qubju)}(hA``event_wait`` Waitqueue for new events added to **event_list**. h](j{)}(h``event_wait``h]j)}(hjzh]h event_wait}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjzubj)}(hhh]h)}(h1Waitqueue for new events added to **event_list**.h](h"Waitqueue for new events added to }(hj{hhhNhNubjZ)}(h**event_list**h]h event_list}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{hKhj{ubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jthj{hKhj qubju)}(hXC``pending_event_list`` List of pending :c:type:`struct drm_pending_event `, used to clean up pending events in case this file gets closed before the event is signalled. Uses the :c:type:`drm_pending_event.pending_link ` entry. Protect by :c:type:`drm_device.event_lock `. h](j{)}(h``pending_event_list``h]j)}(hjD{h]hpending_event_list}(hjF{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB{ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMihj>{ubj)}(hhh](h)}(hList of pending :c:type:`struct drm_pending_event `, used to clean up pending events in case this file gets closed before the event is signalled. Uses the :c:type:`drm_pending_event.pending_link ` entry.h](hList of pending }(hj]{hhhNhNubh)}(h6:c:type:`struct drm_pending_event `h]j)}(hjg{h]hstruct drm_pending_event}(hji{hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhje{ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_pending_eventuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMehj]{ubhh, used to clean up pending events in case this file gets closed before the event is signalled. Uses the }(hj]{hhhNhNubh)}(h<:c:type:`drm_pending_event.pending_link `h]j)}(hj{h]hdrm_pending_event.pending_link}(hj{hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_pending_eventuh1hhj{hMehj]{ubh entry.}(hj]{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{hMehjZ{ubh)}(h8Protect by :c:type:`drm_device.event_lock `.h](h Protect by }(hj{hhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hj{h]hdrm_device.event_lock}(hj{hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjY{hMihj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjY{hMihjZ{ubeh}(h]h ]h"]h$]h&]uh1jhj>{ubeh}(h]h ]h"]h$]h&]uh1jthjY{hMihj qubju)}(hX``event_list`` List of :c:type:`struct drm_pending_event `, ready for delivery to userspace through drm_read(). Uses the :c:type:`drm_pending_event.link ` entry. Protect by :c:type:`drm_device.event_lock `. h](j{)}(h``event_list``h]j)}(hj{h]h event_list}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMshj{ubj)}(hhh](h)}(hList of :c:type:`struct drm_pending_event `, ready for delivery to userspace through drm_read(). Uses the :c:type:`drm_pending_event.link ` entry.h](hList of }(hj|hhhNhNubh)}(h6:c:type:`struct drm_pending_event `h]j)}(hj|h]hstruct drm_pending_event}(hj|hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_pending_eventuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMphj|ubh?, ready for delivery to userspace through drm_read(). Uses the }(hj|hhhNhNubh)}(h4:c:type:`drm_pending_event.link `h]j)}(hj<|h]hdrm_pending_event.link}(hj>|hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj:|ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_pending_eventuh1hhj5|hMphj|ubh entry.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5|hMphj |ubh)}(h8Protect by :c:type:`drm_device.event_lock `.h](h Protect by }(hjc|hhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hjm|h]hdrm_device.event_lock}(hjo|hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjk|ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj |hMshjc|ubh.}(hjc|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj |hMshj |ubeh}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jthj |hMshj qubju)}(h``event_space`` Available event space to prevent userspace from exhausting kernel memory. Currently limited to the fairly arbitrary value of 4KB. h](j{)}(h``event_space``h]j)}(hj|h]h event_space}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhM|hj|ubj)}(hhh]h)}(hAvailable event space to prevent userspace from exhausting kernel memory. Currently limited to the fairly arbitrary value of 4KB.h]hAvailable event space to prevent userspace from exhausting kernel memory. Currently limited to the fairly arbitrary value of 4KB.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMzhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jthj|hM|hj qubju)}(h+``event_read_lock`` Serializes drm_read(). h](j{)}(h``event_read_lock``h]j)}(hj|h]hevent_read_lock}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhj|ubj)}(hhh]h)}(hSerializes drm_read().h]hSerializes drm_read().}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hKhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jthj|hKhj qubju)}(hH``prime`` Per-file buffer caches used by the PRIME buffer sharing code. h](j{)}(h ``prime``h]j)}(hj}h]hprime}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj}ubj)}(hhh]h)}(h=Per-file buffer caches used by the PRIME buffer sharing code.h]h=Per-file buffer caches used by the PRIME buffer sharing code.}(hj2}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.}hMhj/}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jthj.}hMhj qubju)}(hN``client_name`` Userspace-provided name; useful for accounting and debugging. h](j{)}(h``client_name``h]j)}(hjR}h]h client_name}(hjT}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP}ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjL}ubj)}(hhh]h)}(h=Userspace-provided name; useful for accounting and debugging.h]h=Userspace-provided name; useful for accounting and debugging.}(hjk}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg}hMhjh}ubah}(h]h ]h"]h$]h&]uh1jhjL}ubeh}(h]h ]h"]h$]h&]uh1jthjg}hMhj qubju)}(h.``client_name_lock`` Protects **client_name**.h](j{)}(h``client_name_lock``h]j)}(hj}h]hclient_name_lock}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj}ubj)}(hhh]h)}(hProtects **client_name**.h](h Protects }(hj}hhhNhNubjZ)}(h**client_name**h]h client_name}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj}ubh.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jthj}hMhj qubeh}(h]h ]h"]h$]h&]uh1johjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubh)}(h**Description**h]jZ)}(hj}h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj}ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjihhubh)}(h9This structure tracks DRM state per open file descriptor.h]h9This structure tracks DRM state per open file descriptor.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhKhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"drm_is_primary_client (C function)c.drm_is_primary_clienthNtauh1jhjihhhjkhNubj)}(hhh](j)}(h=bool drm_is_primary_client (const struct drm_file *file_priv)h]j)}(h~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:~ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj~hhhj+~hMubj)}(h"(const struct drm_file *file_priv)h]j)}(h const struct drm_file *file_privh](j)}(hj)h]hconst}(hjZ~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubj)}(h h]h }(hjg~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubj)}(hjh]hstruct}(hju~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj~modnameN classnameNjj)}j]j)}jj@~sbc.drm_is_primary_clientasbuh1hhjV~ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubj)}(h file_privh]h file_priv}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV~ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjR~ubah}(h]h ]h"]h$]h&]jAjBuh1jhj~hhhj+~hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj~hhhj+~hMubah}(h]j~ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj+~hMhj~hhubj))}(hhh]h)}(h(is this an open file of the primary nodeh]h(is this an open file of the primary node}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj~hhubah}(h]h ]h"]h$]h&]uh1j(hj~hhhj+~hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihjkhNubjP)}(hX.**Parameters** ``const struct drm_file *file_priv`` DRM file **Description** Returns true if this is an open file of the primary node, i.e. :c:type:`drm_file.minor ` of **file_priv** is a primary minor. See also the :ref:`section on primary nodes and authentication `.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubjp)}(hhh]ju)}(h.``const struct drm_file *file_priv`` DRM file h](j{)}(h$``const struct drm_file *file_priv``h]j)}(hj9h]h const struct drm_file *file_priv}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj3ubj)}(hhh]h)}(hDRM fileh]hDRM file}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jthjNhMhj0ubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjrubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh)}(hReturns true if this is an open file of the primary node, i.e. :c:type:`drm_file.minor ` of **file_priv** is a primary minor.h](h?Returns true if this is an open file of the primary node, i.e. }(hjhhhNhNubh)}(h#:c:type:`drm_file.minor `h]j)}(hjh]hdrm_file.minor}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh of }(hjhhhNhNubjZ)}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh is a primary minor.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(hSSee also the :ref:`section on primary nodes and authentication `.h](h See also the }(hjhhhNhNubh)}(hE:ref:`section on primary nodes and authentication `h]jz)}(hjh]h+section on primary nodes and authentication}(hjhhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftyperef refexplicitrefwarnjdrm_primary_nodeuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_is_render_client (C function)c.drm_is_render_clienthNtauh1jhjihhhjkhNubj)}(hhh](j)}(h` of **file_priv** is a render minor. See also the :ref:`section on render nodes `.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubjp)}(hhh]ju)}(h.``const struct drm_file *file_priv`` DRM file h](j{)}(h$``const struct drm_file *file_priv``h]j)}(hj<h]h const struct drm_file *file_priv}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj6ubj)}(hhh]h)}(hDRM fileh]hDRM file}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jthjQhMhj3ubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjuubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh)}(hReturns true if this is an open file of the render node, i.e. :c:type:`drm_file.minor ` of **file_priv** is a render minor.h](h>Returns true if this is an open file of the render node, i.e. }(hjhhhNhNubh)}(h#:c:type:`drm_file.minor `h]j)}(hjh]hdrm_file.minor}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh of }(hjhhhNhNubjZ)}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh is a render minor.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(h>See also the :ref:`section on render nodes `.h](h See also the }(hjсhhhNhNubh)}(h0:ref:`section on render nodes `h]jz)}(hjہh]hsection on render nodes}(hj݁hhhNhNubah}(h]h ](j stdstd-refeh"]h$]h&]uh1jyhjفubah}(h]h ]h"]h$]h&]refdocj refdomainjreftyperef refexplicitrefwarnjdrm_render_nodeuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjсubh.}(hjсhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_is_accel_client (C function)c.drm_is_accel_clienthNtauh1jhjihhhjkhNubj)}(hhh](j)}(h;bool drm_is_accel_client (const struct drm_file *file_priv)h]j)}(h:bool drm_is_accel_client(const struct drm_file *file_priv)h](j')}(hj'h]hbool}(hj$hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj1hMubj)}(hdrm_is_accel_clienth]j)}(hdrm_is_accel_clienth]hdrm_is_accel_client}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj hhhj1hMubj)}(h"(const struct drm_file *file_priv)h]j)}(h const struct drm_file *file_privh](j)}(hj)h]hconst}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hjh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjFsbc.drm_is_accel_clientasbuh1hhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hjh]h*}(hjǂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(h file_privh]h file_priv}(hjԂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjXubah}(h]h ]h"]h$]h&]jAjBuh1jhj hhhj1hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhj1hMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhj1hMhjhhubj))}(hhh]h)}(h5is this an open file of the compute acceleration nodeh]h5is this an open file of the compute acceleration node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhj1hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihjkhNubjP)}(hX;**Parameters** ``const struct drm_file *file_priv`` DRM file **Description** Returns true if this is an open file of the compute acceleration node, i.e. :c:type:`drm_file.minor ` of **file_priv** is a accel minor. See also :doc:`Introduction to compute accelerators subsystem `.h](h)}(h**Parameters**h]jZ)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubjp)}(hhh]ju)}(h.``const struct drm_file *file_priv`` DRM file h](j{)}(h$``const struct drm_file *file_priv``h]j)}(hj?h]h const struct drm_file *file_priv}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj9ubj)}(hhh]h)}(hDRM fileh]hDRM file}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThMhjUubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jthjThMhj6ubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjxubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh)}(hReturns true if this is an open file of the compute acceleration node, i.e. :c:type:`drm_file.minor ` of **file_priv** is a accel minor.h](hLReturns true if this is an open file of the compute acceleration node, i.e. }(hjhhhNhNubh)}(h#:c:type:`drm_file.minor `h]j)}(hjh]hdrm_file.minor}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrm_fileuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh of }(hjhhhNhNubjZ)}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh is a accel minor.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(hUSee also :doc:`Introduction to compute accelerators subsystem `.h](h See also }(hjԃhhhNhNubh)}(hK:doc:`Introduction to compute accelerators subsystem `h]jz)}(hjރh]h.Introduction to compute accelerators subsystem}(hjhhhNhNubah}(h]h ](j stdstd-doceh"]h$]h&]uh1jyhj܃ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypedoc refexplicitrefwarnj/accel/introductionuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjԃubh.}(hjԃhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_memory_stats (C struct)c.drm_memory_statshNtauh1jhjihhhjkhNubj)}(hhh](j)}(hdrm_memory_statsh]j)}(hstruct drm_memory_statsh](j)}(hjh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj4hMubj)}(hdrm_memory_statsh]j)}(hj!h]hdrm_memory_stats}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj#hhhj4hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhj4hMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhj4hMhjhhubj))}(hhh]h)}(hGEM object stats associatedh]hGEM object stats associated}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjfhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhj4hMubeh}(h]h ](j structeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihjkhNubjP)}(hX**Definition**:: struct drm_memory_stats { u64 shared; u64 private; u64 resident; u64 purgeable; u64 active; }; **Members** ``shared`` Total size of GEM objects shared between processes ``private`` Total size of GEM objects ``resident`` Total size of GEM objects backing pages ``purgeable`` Total size of GEM objects that can be purged (resident and not active) ``active`` Total size of GEM objects active on one or more enginesh](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubj2)}(hrstruct drm_memory_stats { u64 shared; u64 private; u64 resident; u64 purgeable; u64 active; };h]hrstruct drm_memory_stats { u64 shared; u64 private; u64 resident; u64 purgeable; u64 active; };}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubh)}(h **Members**h]jZ)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubjp)}(hhh](ju)}(h>``shared`` Total size of GEM objects shared between processes h](j{)}(h ``shared``h]j)}(hjքh]hshared}(hj؄hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԄubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjЄubj)}(hhh]h)}(h2Total size of GEM objects shared between processesh]h2Total size of GEM objects shared between processes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjЄubeh}(h]h ]h"]h$]h&]uh1jthjhMhj̈́ubju)}(h&``private`` Total size of GEM objects h](j{)}(h ``private``h]j)}(hjh]hprivate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj ubj)}(hhh]h)}(hTotal size of GEM objectsh]hTotal size of GEM objects}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj$hMhj̈́ubju)}(h5``resident`` Total size of GEM objects backing pages h](j{)}(h ``resident``h]j)}(hjHh]hresident}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjBubj)}(hhh]h)}(h'Total size of GEM objects backing pagesh]h'Total size of GEM objects backing pages}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jthj]hMhj̈́ubju)}(hU``purgeable`` Total size of GEM objects that can be purged (resident and not active) h](j{)}(h ``purgeable``h]j)}(hjh]h purgeable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhj{ubj)}(hhh]h)}(hFTotal size of GEM objects that can be purged (resident and not active)h]hFTotal size of GEM objects that can be purged (resident and not active)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jthjhMhj̈́ubju)}(hB``active`` Total size of GEM objects active on one or more enginesh](j{)}(h ``active``h]j)}(hjh]hactive}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjubj)}(hhh]h)}(h7Total size of GEM objects active on one or more enginesh]h7Total size of GEM objects active on one or more engines}(hjӅhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjЅubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjυhMhj̈́ubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhjkhNubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjihhubh)}(h Used by drm_print_memory_stats()h]h Used by drm_print_memory_stats()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:149: ./include/drm/drm_file.hhMhjihhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_open (C function) c.drm_openhNtauh1jhjihhhNhNubj)}(hhh](j)}(h5int drm_open (struct inode *inode, struct file *filp)h]j)}(h4int drm_open(struct inode *inode, struct file *filp)h](j')}(hinth]hint}(hj;hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj7hhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMZubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjIhMZubj)}(hdrm_openh]j)}(hdrm_openh]hdrm_open}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj7hhhjIhMZubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jj^sb c.drm_openasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hjh]h*}(hjĆhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hinodeh]hinode}(hjцhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjpubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj modnameN classnameNjj)}j]j c.drm_openasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfilph]hfilp}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjpubeh}(h]h ]h"]h$]h&]jAjBuh1jhj7hhhjIhMZubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj3hhhjIhMZubah}(h]j.ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjIhMZhj0hhubj))}(hhh]h)}(hopen method for DRM fileh]hopen method for DRM file}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMZhjhhhubah}(h]h ]h"]h$]h&]uh1j(hj0hhhjIhMZubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct inode *inode`` device inode ``struct file *filp`` file pointer. **Description** This function must be used by drivers as their :c:type:`file_operations.open ` method. It looks up the correct DRM device and instantiates all the per-file resources for it. It also calls the :c:type:`drm_driver.open ` driver callback. **Return** 0 on success or negative errno value on failure.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM^hjubjp)}(hhh](ju)}(h%``struct inode *inode`` device inode h](j{)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM[hjubj)}(hhh]h)}(h device inodeh]h device inode}(hjŇhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM[hj‡ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM[hjubju)}(h$``struct file *filp`` file pointer. h](j{)}(h``struct file *filp``h]j)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM\hj߇ubj)}(hhh]h)}(h file pointer.h]h file pointer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM\hjubah}(h]h ]h"]h$]h&]uh1jhj߇ubeh}(h]h ]h"]h$]h&]uh1jthjhM\hjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hj h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM^hjubh)}(hXThis function must be used by drivers as their :c:type:`file_operations.open ` method. It looks up the correct DRM device and instantiates all the per-file resources for it. It also calls the :c:type:`drm_driver.open ` driver callback.h](h/This function must be used by drivers as their }(hj6hhhNhNubh)}(h0:c:type:`file_operations.open `h]j)}(hj@h]hfile_operations.open}(hjBhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM^hj6ubhr method. It looks up the correct DRM device and instantiates all the per-file resources for it. It also calls the }(hj6hhhNhNubh)}(h&:c:type:`drm_driver.open `h]j)}(hjdh]hdrm_driver.open}(hjfhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hhj]hM^hj6ubh driver callback.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj]hM^hjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMbhjubh)}(h00 on success or negative errno value on failure.h]h00 on success or negative errno value on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMbhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_release (C function) c.drm_releasehNtauh1jhjihhhNhNubj)}(hhh](j)}(h8int drm_release (struct inode *inode, struct file *filp)h]j)}(h7int drm_release(struct inode *inode, struct file *filp)h](j')}(hinth]hint}(hj҈hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjΈhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΈhhhjhMubj)}(h drm_releaseh]j)}(h drm_releaseh]h drm_release}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjΈhhhjhMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hinodeh]hinode}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj/modnameN classnameNjj)}j]j)}jjsb c.drm_releaseasbuh1hhj ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hinodeh]hinode}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jI c.drm_releaseasbuh1hhj}ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hjh]h*}(hjˉhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubj)}(hfilph]hfilp}(hj؉hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjΈhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjʈhhhjhMubah}(h]jňah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjLjhhubj))}(hhh]h)}(hrelease method for DRM fileh]hrelease method for DRM file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjLjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct inode *inode`` device inode ``struct file *filp`` file pointer. **Description** This function must be used by drivers as their :c:type:`file_operations.release ` method. It frees any resources associated with the open file. If this is the last open file for the DRM device, it also restores the active in-kernel DRM client. **Return** Always succeeds and returns 0.h](h)}(h**Parameters**h]jZ)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj"ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubjp)}(hhh](ju)}(h%``struct inode *inode`` device inode h](j{)}(h``struct inode *inode``h]j)}(hjCh]hstruct inode *inode}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj=ubj)}(hhh]h)}(h device inodeh]h device inode}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jthjXhMhj:ubju)}(h$``struct file *filp`` file pointer. h](j{)}(h``struct file *filp``h]j)}(hj|h]hstruct file *filp}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjvubj)}(hhh]h)}(h file pointer.h]h file pointer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjhMhj:ubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hXThis function must be used by drivers as their :c:type:`file_operations.release ` method. It frees any resources associated with the open file. If this is the last open file for the DRM device, it also restores the active in-kernel DRM client.h](h/This function must be used by drivers as their }(hj͊hhhNhNubh)}(h3:c:type:`file_operations.release `h]j)}(hj׊h]hfile_operations.release}(hjيhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjՊubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj͊ubh method. It frees any resources associated with the open file. If this is the last open file for the DRM device, it also restores the active in-kernel DRM client.}(hj͊hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hAlways succeeds and returns 0.h]hAlways succeeds and returns 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_release_noglobal (C function)c.drm_release_noglobalhNtauh1jhjihhhNhNubj)}(hhh](j)}(hAint drm_release_noglobal (struct inode *inode, struct file *filp)h]j)}(h@int drm_release_noglobal(struct inode *inode, struct file *filp)h](j')}(hinth]hint}(hjFhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjBhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhjThMubj)}(hdrm_release_noglobalh]j)}(hdrm_release_noglobalh]hdrm_release_noglobal}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjBhhhjThMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjisbc.drm_release_noglobalasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjϋhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinodeh]hinode}(hj܋hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj{ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_release_noglobalasbuh1hhjubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfilph]hfilp}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj{ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjBhhhjThMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj>hhhjThMubah}(h]j9ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjThMhj;hhubj))}(hhh]h)}(hrelease method for DRM fileh]hrelease method for DRM file}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjshhubah}(h]h ]h"]h$]h&]uh1j(hj;hhhjThMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct inode *inode`` device inode ``struct file *filp`` file pointer. **Description** This function may be used by drivers as their :c:type:`file_operations.release ` method. It frees any resources associated with the open file prior to taking the drm_global_mutex. If this is the last open file for the DRM device, it then restores the active in-kernel DRM client. **Return** Always succeeds and returns 0.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubjp)}(hhh](ju)}(h%``struct inode *inode`` device inode h](j{)}(h``struct inode *inode``h]j)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h device inodeh]h device inode}(hjЌhhhNhNubah}(h]h ]h"]h$]h&]uh1hhǰhMhj͌ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthǰhMhjubju)}(h$``struct file *filp`` file pointer. h](j{)}(h``struct file *filp``h]j)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h file pointer.h]h file pointer.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj)ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hX(This function may be used by drivers as their :c:type:`file_operations.release ` method. It frees any resources associated with the open file prior to taking the drm_global_mutex. If this is the last open file for the DRM device, it then restores the active in-kernel DRM client.h](h.This function may be used by drivers as their }(hjAhhhNhNubh)}(h3:c:type:`file_operations.release `h]j)}(hjKh]hfile_operations.release}(hjMhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjAubh method. It frees any resources associated with the open file prior to taking the drm_global_mutex. If this is the last open file for the DRM device, it then restores the active in-kernel DRM client.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhhMhjubh)}(h **Return**h]jZ)}(hjuh]hReturn}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjsubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hAlways succeeds and returns 0.h]hAlways succeeds and returns 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_read (C function) c.drm_readhNtauh1jhjihhhNhNubj)}(hhh](j)}(hWssize_t drm_read (struct file *filp, char __user *buffer, size_t count, loff_t *offset)h]j)}(hVssize_t drm_read(struct file *filp, char __user *buffer, size_t count, loff_t *offset)h](h)}(hhh]j)}(hssize_th]hssize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jdrm_readsb c.drm_readasbuh1hhjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjߍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjލhMubj)}(hdrm_readh]j)}(hjۍh]hdrm_read}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjލhMubj)}(hF(struct file *filp, char __user *buffer, size_t count, loff_t *offset)h](j)}(hstruct file *filph](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj,modnameN classnameNjj)}j]jٍ c.drm_readasbuh1hhjubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfilph]hfilp}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hchar __user *bufferh](j')}(hcharh]hchar}(hj|hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjxubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubh__user}(hjxhhhNhNubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hbufferh]hbuffer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(h size_t counth](h)}(hhh]j)}(hsize_th]hsize_t}(hjӎhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЎubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjՎmodnameN classnameNjj)}j]jٍ c.drm_readasbuh1hhj̎ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̎ubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̎ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hloff_t *offseth](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jٍ c.drm_readasbuh1hhjubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hoffseth]hoffset}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjލhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjލhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjލhMhjhhubj))}(hhh]h)}(hread method for DRM fileh]hread method for DRM file}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj{hhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjލhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct file *filp`` file pointer ``char __user *buffer`` userspace destination pointer for the read ``size_t count`` count in bytes to read ``loff_t *offset`` offset to read **Description** This function must be used by drivers as their :c:type:`file_operations.read ` method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it. **offset** is ignored, DRM events are read like a pipe. Polling support is provided by drm_poll(). This function will only ever read a full event. Therefore userspace must supply a big enough buffer to fit any event to ensure forward progress. Since the maximum event space is currently 4K it's recommended to just use that for safety. **Return** Number of bytes read (always aligned to full events, and can be 0) or a negative error code on failure.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubjp)}(hhh](ju)}(h#``struct file *filp`` file pointer h](j{)}(h``struct file *filp``h]j)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h file pointerh]h file pointer}(hj؏hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjԏhMhjՏubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjԏhMhjubju)}(hC``char __user *buffer`` userspace destination pointer for the read h](j{)}(h``char __user *buffer``h]j)}(hjh]hchar __user *buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h*userspace destination pointer for the readh]h*userspace destination pointer for the read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hMhjubju)}(h(``size_t count`` count in bytes to read h](j{)}(h``size_t count``h]j)}(hj1h]h size_t count}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj+ubj)}(hhh]h)}(hcount in bytes to readh]hcount in bytes to read}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjGubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jthjFhMhjubju)}(h"``loff_t *offset`` offset to read h](j{)}(h``loff_t *offset``h]j)}(hjjh]hloff_t *offset}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjdubj)}(hhh]h)}(hoffset to readh]hoffset to read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hX#This function must be used by drivers as their :c:type:`file_operations.read ` method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it.h](h/This function must be used by drivers as their }(hjhhhNhNubh)}(h0:c:type:`file_operations.read `h]j)}(hjŐh]hfile_operations.read}(hjǐhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjÐubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(hb**offset** is ignored, DRM events are read like a pipe. Polling support is provided by drm_poll().h](jZ)}(h **offset**h]hoffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubhX is ignored, DRM events are read like a pipe. Polling support is provided by drm_poll().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hThis function will only ever read a full event. Therefore userspace must supply a big enough buffer to fit any event to ensure forward progress. Since the maximum event space is currently 4K it's recommended to just use that for safety.h]hThis function will only ever read a full event. Therefore userspace must supply a big enough buffer to fit any event to ensure forward progress. Since the maximum event space is currently 4K it’s recommended to just use that for safety.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM hjubh)}(hgNumber of bytes read (always aligned to full events, and can be 0) or a negative error code on failure.h]hgNumber of bytes read (always aligned to full events, and can be 0) or a negative error code on failure.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_poll (C function) c.drm_pollhNtauh1jhjihhhNhNubj)}(hhh](j)}(hE__poll_t drm_poll (struct file *filp, struct poll_table_struct *wait)h]j)}(hD__poll_t drm_poll(struct file *filp, struct poll_table_struct *wait)h](h)}(hhh]j)}(h__poll_th]h__poll_t}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjemodnameN classnameNjj)}j]j)}jdrm_pollsb c.drm_pollasbuh1hhj\hhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMVubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhjhMVubj)}(hdrm_pollh]j)}(hjh]hdrm_poll}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj\hhhjhMVubj)}(h3(struct file *filp, struct poll_table_struct *wait)h](j)}(hstruct file *filph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjБhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj͑ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjґmodnameN classnameNjj)}j]j c.drm_pollasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfilph]hfilp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hstruct poll_table_struct *waith](j)}(hjh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpoll_table_structh]hpoll_table_struct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjBmodnameN classnameNjj)}j]j c.drm_pollasbuh1hhjubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwaith]hwait}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhj\hhhjhMVubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjXhhhjhMVubah}(h]jSah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMVhjUhhubj))}(hhh]h)}(hpoll method for DRM fileh]hpoll method for DRM file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMVhjhhubah}(h]h ]h"]h$]h&]uh1j(hjUhhhjhMVubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct file *filp`` file pointer ``struct poll_table_struct *wait`` poll waiter table **Description** This function must be used by drivers as their :c:type:`file_operations.read ` method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it. See also drm_read(). **Return** Mask of POLL flags indicating the current status of the file.h](h)}(h**Parameters**h]jZ)}(hjŒh]h Parameters}(hjǒhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjÒubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMZhjubjp)}(hhh](ju)}(h#``struct file *filp`` file pointer h](j{)}(h``struct file *filp``h]j)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMWhjޒubj)}(hhh]h)}(h file pointerh]h file pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMWhjubah}(h]h ]h"]h$]h&]uh1jhjޒubeh}(h]h ]h"]h$]h&]uh1jthjhMWhjےubju)}(h5``struct poll_table_struct *wait`` poll waiter table h](j{)}(h"``struct poll_table_struct *wait``h]j)}(hjh]hstruct poll_table_struct *wait}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMXhjubj)}(hhh]h)}(hpoll waiter tableh]hpoll waiter table}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMXhj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj2hMXhjےubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjXh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjVubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMZhjubh)}(hX$This function must be used by drivers as their :c:type:`file_operations.read ` method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it.h](h/This function must be used by drivers as their }(hjnhhhNhNubh)}(h0:c:type:`file_operations.read `h]j)}(hjxh]hfile_operations.read}(hjzhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjfile_operationsuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMZhjnubh method if they use DRM events for asynchronous signalling to userspace. Since events are used by the KMS API for vblank and page flip completion this means all modern display drivers must use it.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMZhjubh)}(hSee also drm_read().h]hSee also drm_read().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM_hjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMahjubh)}(h=Mask of POLL flags indicating the current status of the file.h]h=Mask of POLL flags indicating the current status of the file.}(hjǓhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*drm_event_reserve_init_locked (C function)c.drm_event_reserve_init_lockedhNtauh1jhjihhhNhNubj)}(hhh](j)}(hint drm_event_reserve_init_locked (struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h]j)}(hint drm_event_reserve_init_locked(struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h](j')}(hinth]hint}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMsubj)}(hdrm_event_reserve_init_lockedh]j)}(hdrm_event_reserve_init_lockedh]hdrm_event_reserve_init_locked}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMsubj)}(hf(struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjSmodnameN classnameNjj)}j]j)}jjsbc.drm_event_reserve_init_lockedasbuh1hhj/ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj+ubj)}(hstruct drm_file *file_privh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hjÔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjŔmodnameN classnameNjj)}j]jmc.drm_event_reserve_init_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h file_privh]h file_priv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj+ubj)}(hstruct drm_pending_event *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj5modnameN classnameNjj)}j]jmc.drm_event_reserve_init_lockedasbuh1hhjubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj+ubj)}(hstruct drm_event *eh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_eventh]h drm_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jmc.drm_event_reserve_init_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjΕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(heh]he}(hjەhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj+ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMsubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMsubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMshjhhubj))}(hhh]h)}(h)init a DRM event and reserve space for ith]h)init a DRM event and reserve space for it}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMshjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMsubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_file *file_priv`` DRM file private data ``struct drm_pending_event *p`` tracking structure for the pending event ``struct drm_event *e`` actual event data to deliver to userspace **Description** This function prepares the passed in event for eventual delivery. If the event doesn't get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace. If callers embedded **p** into a larger structure it must be allocated with kmalloc and **p** must be the first member element. This is the locked version of drm_event_reserve_init() for callers which already hold :c:type:`drm_device.event_lock `. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]jZ)}(hj'h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj%ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMwhj!ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjFh]hstruct drm_device *dev}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMthj@ubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMthj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jthj[hMthj=ubju)}(h5``struct drm_file *file_priv`` DRM file private data h](j{)}(h``struct drm_file *file_priv``h]j)}(hjh]hstruct drm_file *file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMuhjyubj)}(hhh]h)}(hDRM file private datah]hDRM file private data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jthjhMuhj=ubju)}(hI``struct drm_pending_event *p`` tracking structure for the pending event h](j{)}(h``struct drm_pending_event *p``h]j)}(hjh]hstruct drm_pending_event *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMvhjubj)}(hhh]h)}(h(tracking structure for the pending eventh]h(tracking structure for the pending event}(hjіhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj͖hMvhjΖubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj͖hMvhj=ubju)}(hB``struct drm_event *e`` actual event data to deliver to userspace h](j{)}(h``struct drm_event *e``h]j)}(hjh]hstruct drm_event *e}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMwhjubj)}(hhh]h)}(h)actual event data to deliver to userspaceh]h)actual event data to deliver to userspace}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMwhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMwhj=ubeh}(h]h ]h"]h$]h&]uh1johj!ubh)}(h**Description**h]jZ)}(hj,h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj*ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMyhj!ubh)}(hXThis function prepares the passed in event for eventual delivery. If the event doesn't get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace.h]hXThis function prepares the passed in event for eventual delivery. If the event doesn’t get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMyhj!ubh)}(hIf callers embedded **p** into a larger structure it must be allocated with kmalloc and **p** must be the first member element.h](hIf callers embedded }(hjQhhhNhNubjZ)}(h**p**h]hp}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjQubh? into a larger structure it must be allocated with kmalloc and }(hjQhhhNhNubjZ)}(h**p**h]hp}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjQubh" must be the first member element.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj!ubh)}(hThis is the locked version of drm_event_reserve_init() for callers which already hold :c:type:`drm_device.event_lock `.h](hVThis is the locked version of drm_event_reserve_init() for callers which already hold }(hjhhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hjh]hdrm_device.event_lock}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj!ubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj!ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hjΗhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#drm_event_reserve_init (C function)c.drm_event_reserve_inithNtauh1jhjihhhNhNubj)}(hhh](j)}(hint drm_event_reserve_init (struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h]j)}(hint drm_event_reserve_init(struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h](j')}(hinth]hint}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubj)}(hdrm_event_reserve_inith]j)}(hdrm_event_reserve_inith]hdrm_event_reserve_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhj hMubj)}(hf(struct drm_device *dev, struct drm_file *file_priv, struct drm_pending_event *p, struct drm_event *e)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjZmodnameN classnameNjj)}j]j)}jj sbc.drm_event_reserve_initasbuh1hhj6ubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj2ubj)}(hstruct drm_file *file_privh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hjʘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǘubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj̘modnameN classnameNjj)}j]jtc.drm_event_reserve_initasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h file_privh]h file_priv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj2ubj)}(hstruct drm_pending_event *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj<modnameN classnameNjj)}j]jtc.drm_event_reserve_initasbuh1hhjubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj2ubj)}(hstruct drm_event *eh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_eventh]h drm_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jtc.drm_event_reserve_initasbuh1hhjubj)}(h h]h }(hjǙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjՙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjݕh]he}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj2ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhj hMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhj hMhjhhubj))}(hhh]h)}(h)init a DRM event and reserve space for ith]h)init a DRM event and reserve space for it}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhj hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj#jKj#jLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_file *file_priv`` DRM file private data ``struct drm_pending_event *p`` tracking structure for the pending event ``struct drm_event *e`` actual event data to deliver to userspace **Description** This function prepares the passed in event for eventual delivery. If the event doesn't get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace. If callers embedded **p** into a larger structure it must be allocated with kmalloc and **p** must be the first member element. Callers which already hold :c:type:`drm_device.event_lock ` should use drm_event_reserve_init_locked() instead. **Return** 0 on success or a negative error code on failure.h](h)}(h**Parameters**h]jZ)}(hj-h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj+ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjLh]hstruct drm_device *dev}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjFubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jthjahMhjCubju)}(h5``struct drm_file *file_priv`` DRM file private data h](j{)}(h``struct drm_file *file_priv``h]j)}(hjh]hstruct drm_file *file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(hDRM file private datah]hDRM file private data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjCubju)}(hI``struct drm_pending_event *p`` tracking structure for the pending event h](j{)}(h``struct drm_pending_event *p``h]j)}(hjh]hstruct drm_pending_event *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h(tracking structure for the pending eventh]h(tracking structure for the pending event}(hjךhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjӚhMhjԚubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjӚhMhjCubju)}(hB``struct drm_event *e`` actual event data to deliver to userspace h](j{)}(h``struct drm_event *e``h]j)}(hjh]hstruct drm_event *e}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h)actual event data to deliver to userspaceh]h)actual event data to deliver to userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hMhjCubeh}(h]h ]h"]h$]h&]uh1johj'ubh)}(h**Description**h]jZ)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj0ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubh)}(hXThis function prepares the passed in event for eventual delivery. If the event doesn't get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace.h]hXThis function prepares the passed in event for eventual delivery. If the event doesn’t get delivered (because the IOCTL fails later on, before queuing up anything) then the even must be cancelled and freed using drm_event_cancel_free(). Successfully initialized events should be sent out using drm_send_event() or drm_send_event_locked() to signal completion of the asynchronous event to userspace.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubh)}(hIf callers embedded **p** into a larger structure it must be allocated with kmalloc and **p** must be the first member element.h](hIf callers embedded }(hjWhhhNhNubjZ)}(h**p**h]hp}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjWubh? into a larger structure it must be allocated with kmalloc and }(hjWhhhNhNubjZ)}(h**p**h]hp}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjWubh" must be the first member element.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubh)}(h{Callers which already hold :c:type:`drm_device.event_lock ` should use drm_event_reserve_init_locked() instead.h](hCallers which already hold }(hjhhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hjh]hdrm_device.event_lock}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh4 should use drm_event_reserve_init_locked() instead.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj'ubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubh)}(h10 on success or a negative error code on failure.h]h10 on success or a negative error code on failure.}(hjԛhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"drm_event_cancel_free (C function)c.drm_event_cancel_freehNtauh1jhjihhhNhNubj)}(hhh](j)}(hPvoid drm_event_cancel_free (struct drm_device *dev, struct drm_pending_event *p)h]j)}(hOvoid drm_event_cancel_free(struct drm_device *dev, struct drm_pending_event *p)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hdrm_event_cancel_freeh]j)}(hdrm_event_cancel_freeh]hdrm_event_cancel_free}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMubj)}(h5(struct drm_device *dev, struct drm_pending_event *p)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj`modnameN classnameNjj)}j]j)}jj&sbc.drm_event_cancel_freeasbuh1hhj<ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj8ubj)}(hstruct drm_pending_event *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hjМhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj͜ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjҜmodnameN classnameNjj)}j]jzc.drm_event_cancel_freeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj8ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h)}(h&free a DRM event and release its spaceh]h&free a DRM event and release its space}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj/hhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjJjKjJjLjMjNuh1jhhhjihNhNubjP)}(hXs**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_pending_event *p`` tracking structure for the pending event **Description** This function frees the event **p** initialized with drm_event_reserve_init() and releases any allocated space. It is used to cancel an event when the nonblocking operation could not be submitted and needed to be aborted.h](h)}(h**Parameters**h]jZ)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjRubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjNubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjsh]hstruct drm_device *dev}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjmubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jthjhMhjjubju)}(hI``struct drm_pending_event *p`` tracking structure for the pending event h](j{)}(h``struct drm_pending_event *p``h]j)}(hjh]hstruct drm_pending_event *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h(tracking structure for the pending eventh]h(tracking structure for the pending event}(hjŝhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjjubeh}(h]h ]h"]h$]h&]uh1johjNubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjNubh)}(hThis function frees the event **p** initialized with drm_event_reserve_init() and releases any allocated space. It is used to cancel an event when the nonblocking operation could not be submitted and needed to be aborted.h](hThis function frees the event }(hjhhhNhNubjZ)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubh initialized with drm_event_reserve_init() and releases any allocated space. It is used to cancel an event when the nonblocking operation could not be submitted and needed to be aborted.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j,drm_send_event_timestamp_locked (C function)!c.drm_send_event_timestamp_lockedhNtauh1jhjihhhNhNubj)}(hhh](j)}(hmvoid drm_send_event_timestamp_locked (struct drm_device *dev, struct drm_pending_event *e, ktime_t timestamp)h]j)}(hlvoid drm_send_event_timestamp_locked(struct drm_device *dev, struct drm_pending_event *e, ktime_t timestamp)h](j')}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj:hhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhjLhMubj)}(hdrm_send_event_timestamp_lockedh]j)}(hdrm_send_event_timestamp_lockedh]hdrm_send_event_timestamp_locked}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj:hhhjLhMubj)}(hH(struct drm_device *dev, struct drm_pending_event *e, ktime_t timestamp)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjasb!c.drm_send_event_timestamp_lockedasbuh1hhjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hjh]h*}(hjǞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hdevh]hdev}(hjԞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjsubj)}(hstruct drm_pending_event *eh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj modnameN classnameNjj)}j]j!c.drm_send_event_timestamp_lockedasbuh1hhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjݕh]he}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjsubj)}(hktime_t timestamph](h)}(hhh]j)}(hktime_th]hktime_t}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjamodnameN classnameNjj)}j]j!c.drm_send_event_timestamp_lockedasbuh1hhjXubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(h timestamph]h timestamp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjsubeh}(h]h ]h"]h$]h&]jAjBuh1jhj:hhhjLhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj6hhhjLhMubah}(h]j1ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjLhMhj3hhubj))}(hhh]h)}(h!send DRM event to file descriptorh]h!send DRM event to file descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hj3hhhjLhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj͟jKj͟jLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_pending_event *e`` DRM event to deliver ``ktime_t timestamp`` timestamp to set for the fence event in kernel's CLOCK_MONOTONIC time domain **Description** This function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold :c:type:`drm_device.event_lock `. Note that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h](h)}(h**Parameters**h]jZ)}(hjןh]h Parameters}(hjٟhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj՟ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjџubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjh]hstruct drm_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hMhjubju)}(h5``struct drm_pending_event *e`` DRM event to deliver h](j{)}(h``struct drm_pending_event *e``h]j)}(hj/h]hstruct drm_pending_event *e}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj)ubj)}(hhh]h)}(hDRM event to deliverh]hDRM event to deliver}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjEubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jthjDhMhjubju)}(hc``ktime_t timestamp`` timestamp to set for the fence event in kernel's CLOCK_MONOTONIC time domain h](j{)}(h``ktime_t timestamp``h]j)}(hjhh]hktime_t timestamp}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjbubj)}(hhh]h)}(hLtimestamp to set for the fence event in kernel's CLOCK_MONOTONIC time domainh]hNtimestamp to set for the fence event in kernel’s CLOCK_MONOTONIC time domain}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jthj}hMhjubeh}(h]h ]h"]h$]h&]uh1johjџubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjџubh)}(hThis function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold :c:type:`drm_device.event_lock `.h](hThis function sends the event }(hjhhhNhNubjZ)}(h**e**h]he}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubhm, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold }(hjhhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hj֠h]hdrm_device.event_lock}(hjؠhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjԠubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjџubh)}(hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h]hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjџubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"drm_send_event_locked (C function)c.drm_send_event_lockedhNtauh1jhjihhhNhNubj)}(hhh](j)}(hPvoid drm_send_event_locked (struct drm_device *dev, struct drm_pending_event *e)h]j)}(hOvoid drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e)h](j')}(hvoidh]hvoid}(hj-hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj)hhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhj;hMubj)}(hdrm_send_event_lockedh]j)}(hdrm_send_event_lockedh]hdrm_send_event_locked}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj)hhhj;hMubj)}(h5(struct drm_device *dev, struct drm_pending_event *e)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjPsbc.drm_send_event_lockedasbuh1hhjfubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hdevh]hdev}(hjáhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjbubj)}(hstruct drm_pending_event *eh](j)}(hjh]hstruct}(hjܡhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjءubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjءubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_send_event_lockedasbuh1hhjءubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjءubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjءubj)}(hjݕh]he}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjءubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjbubeh}(h]h ]h"]h$]h&]jAjBuh1jhj)hhhj;hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj%hhhj;hMubah}(h]j ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj;hMhj"hhubj))}(hhh]h)}(h!send DRM event to file descriptorh]h!send DRM event to file descriptor}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjYhhubah}(h]h ]h"]h$]h&]uh1j(hj"hhhj;hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjtjKjtjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_pending_event *e`` DRM event to deliver **Description** This function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold :c:type:`drm_device.event_lock `, see drm_send_event() for the unlocked version. Note that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h](h)}(h**Parameters**h]jZ)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj|ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjxubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hjh]hstruct drm_device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(h5``struct drm_pending_event *e`` DRM event to deliver h](j{)}(h``struct drm_pending_event *e``h]j)}(hj֢h]hstruct drm_pending_event *e}(hjآhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԢubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjТubj)}(hhh]h)}(hDRM event to deliverh]hDRM event to deliver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjТubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjxubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjxubh)}(hThis function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold :c:type:`drm_device.event_lock `, see drm_send_event() for the unlocked version.h](hThis function sends the event }(hj'hhhNhNubjZ)}(h**e**h]he}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj'ubhm, initialized with drm_event_reserve_init(), to its associated userspace DRM file. Callers must already hold }(hj'hhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hjCh]hdrm_device.event_lock}(hjEhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj'ubh0, see drm_send_event() for the unlocked version.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj`hMhjxubh)}(hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h]hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_send_event (C function)c.drm_send_eventhNtauh1jhjihhhNhNubj)}(hhh](j)}(hIvoid drm_send_event (struct drm_device *dev, struct drm_pending_event *e)h]j)}(hHvoid drm_send_event(struct drm_device *dev, struct drm_pending_event *e)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM)ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM)ubj)}(hdrm_send_eventh]j)}(hdrm_send_eventh]hdrm_send_event}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhM)ubj)}(h5(struct drm_device *dev, struct drm_pending_event *e)h](j)}(hstruct drm_device *devh](j)}(hjh]hstruct}(hjףhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӣubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӣubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.drm_send_eventasbuh1hhjӣubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӣubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӣubj)}(hdevh]hdev}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӣubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjϣubj)}(hstruct drm_pending_event *eh](j)}(hjh]hstruct}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hdrm_pending_eventh]hdrm_pending_event}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjimodnameN classnameNjj)}j]jc.drm_send_eventasbuh1hhjEubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjݕh]he}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjϣubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhM)ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhM)ubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhM)hjhhubj))}(hhh]h)}(h!send DRM event to file descriptorh]h!send DRM event to file descriptor}(hjɤhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM)hjƤhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhM)ubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_device *dev`` DRM device ``struct drm_pending_event *e`` DRM event to deliver **Description** This function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. This function acquires :c:type:`drm_device.event_lock `, see drm_send_event_locked() for callers which already hold this lock. Note that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM-hjubjp)}(hhh](ju)}(h&``struct drm_device *dev`` DRM device h](j{)}(h``struct drm_device *dev``h]j)}(hj h]hstruct drm_device *dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM*hjubj)}(hhh]h)}(h DRM deviceh]h DRM device}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM*hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM*hjubju)}(h5``struct drm_pending_event *e`` DRM event to deliver h](j{)}(h``struct drm_pending_event *e``h]j)}(hjCh]hstruct drm_pending_event *e}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM+hj=ubj)}(hhh]h)}(hDRM event to deliverh]hDRM event to deliver}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhM+hjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jthjXhM+hjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj|ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM-hjubh)}(hXThis function sends the event **e**, initialized with drm_event_reserve_init(), to its associated userspace DRM file. This function acquires :c:type:`drm_device.event_lock `, see drm_send_event_locked() for callers which already hold this lock.h](hThis function sends the event }(hjhhhNhNubjZ)}(h**e**h]he}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubhj, initialized with drm_event_reserve_init(), to its associated userspace DRM file. This function acquires }(hjhhhNhNubh)}(h,:c:type:`drm_device.event_lock `h]j)}(hjh]hdrm_device.event_lock}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM-hjubhG, see drm_send_event_locked() for callers which already hold this lock.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjͥhM-hjubh)}(hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.h]hXNote that the core will take care of unlinking and disarming events when the corresponding DRM file is closed. Drivers need not worry about whether the DRM file for this event still exists and can call this function upon completion of the asynchronous work unconditionally.}(hjإhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM2hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#drm_print_memory_stats (C function)c.drm_print_memory_statshNtauh1jhjihhhNhNubj)}(hhh](j)}(hvoid drm_print_memory_stats (struct drm_printer *p, const struct drm_memory_stats *stats, enum drm_gem_object_status supported_status, const char *region)h]j)}(hvoid drm_print_memory_stats(struct drm_printer *p, const struct drm_memory_stats *stats, enum drm_gem_object_status supported_status, const char *region)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM`ubj)}(hdrm_print_memory_statsh]j)}(hdrm_print_memory_statsh]hdrm_print_memory_stats}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhM`ubj)}(h~(struct drm_printer *p, const struct drm_memory_stats *stats, enum drm_gem_object_status supported_status, const char *region)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjdmodnameN classnameNjj)}j]j)}jj*sbc.drm_print_memory_statsasbuh1hhj@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj<ubj)}(h$const struct drm_memory_stats *statsh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj¦hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hstruct}(hjЦhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjݦhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_memory_statsh]hdrm_memory_stats}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j~c.drm_print_memory_statsasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstatsh]hstats}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj<ubj)}(h+enum drm_gem_object_status supported_statush](j)}(hjh]henum}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(hdrm_gem_object_statush]hdrm_gem_object_status}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj`modnameN classnameNjj)}j]j~c.drm_print_memory_statsasbuh1hhj<ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hsupported_statush]hsupported_status}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj<ubj)}(hconst char *regionh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hj̧hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjڧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hregionh]hregion}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj<ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhM`ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhM`ubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhM`hjhhubj))}(hhh]h)}(hA helper to print memory statsh]hA helper to print memory stats}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chM`hjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhM`ubeh}(h]h ](j functioneh"]h$]h&]jIj jJj)jKj)jLjMjNuh1jhhhjihNhNubjP)}(hX**Parameters** ``struct drm_printer *p`` The printer to print output to ``const struct drm_memory_stats *stats`` The collected memory stats ``enum drm_gem_object_status supported_status`` Bitmask of optional stats which are available ``const char *region`` The memory regionh](h)}(h**Parameters**h]jZ)}(hj3h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj1ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMdhj-ubjp)}(hhh](ju)}(h9``struct drm_printer *p`` The printer to print output to h](j{)}(h``struct drm_printer *p``h]j)}(hjRh]hstruct drm_printer *p}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMahjLubj)}(hhh]h)}(hThe printer to print output toh]hThe printer to print output to}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMahjhubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jthjghMahjIubju)}(hD``const struct drm_memory_stats *stats`` The collected memory stats h](j{)}(h(``const struct drm_memory_stats *stats``h]j)}(hjh]h$const struct drm_memory_stats *stats}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMbhjubj)}(hhh]h)}(hThe collected memory statsh]hThe collected memory stats}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMbhjIubju)}(h^``enum drm_gem_object_status supported_status`` Bitmask of optional stats which are available h](j{)}(h/``enum drm_gem_object_status supported_status``h]j)}(hjĨh]h+enum drm_gem_object_status supported_status}(hjƨhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj¨ubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMchjubj)}(hhh]h)}(h-Bitmask of optional stats which are availableh]h-Bitmask of optional stats which are available}(hjݨhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj٨hMchjڨubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj٨hMchjIubju)}(h(``const char *region`` The memory regionh](j{)}(h``const char *region``h]j)}(hjh]hconst char *region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMehjubj)}(hhh]h)}(hThe memory regionh]hThe memory region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMehjIubeh}(h]h ]h"]h$]h&]uh1johj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"drm_show_memory_stats (C function)c.drm_show_memory_statshNtauh1jhjihhhNhNubj)}(hhh](j)}(hIvoid drm_show_memory_stats (struct drm_printer *p, struct drm_file *file)h]j)}(hHvoid drm_show_memory_stats(struct drm_printer *p, struct drm_file *file)h](j')}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjShhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjShhhjehMubj)}(hdrm_show_memory_statsh]j)}(hdrm_show_memory_statsh]hdrm_show_memory_stats}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjShhhjehMubj)}(h.(struct drm_printer *p, struct drm_file *file)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjzsbc.drm_show_memory_statsasbuh1hhjubj)}(h h]h }(hjҩhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hstruct drm_file *fileh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj%modnameN classnameNjj)}j]jΩc.drm_show_memory_statsasbuh1hhjubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfileh]hfile}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjShhhjehMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjOhhhjehMubah}(h]jJah ](j j!eh"]h$]h&]j%j&)j'huh1jhjehMhjLhhubj))}(hhh]h)}(h7Helper to collect and show standard fdinfo memory statsh]h7Helper to collect and show standard fdinfo memory stats}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjLhhhjehMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjihNhNubjP)}(h**Parameters** ``struct drm_printer *p`` the printer to print output to ``struct drm_file *file`` the DRM file **Description** Helper to iterate over GEM objects with a handle allocated in the specified file.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubjp)}(hhh](ju)}(h9``struct drm_printer *p`` the printer to print output to h](j{)}(h``struct drm_printer *p``h]j)}(hjǪh]hstruct drm_printer *p}(hjɪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŪubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(hthe printer to print output toh]hthe printer to print output to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjܪhMhjݪubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjܪhMhjubju)}(h'``struct drm_file *file`` the DRM file h](j{)}(h``struct drm_file *file``h]j)}(hjh]hstruct drm_file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h the DRM fileh]h the DRM file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj9ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubh)}(hQHelper to iterate over GEM objects with a handle allocated in the specified file.h]hQHelper to iterate over GEM objects with a handle allocated in the specified file.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_show_fdinfo (C function)c.drm_show_fdinfohNtauh1jhjihhhNhNubj)}(hhh](j)}(h9void drm_show_fdinfo (struct seq_file *m, struct file *f)h]j)}(h8void drm_show_fdinfo(struct seq_file *m, struct file *f)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj|hhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|hhhjhMubj)}(hdrm_show_fdinfoh]j)}(hdrm_show_fdinfoh]hdrm_show_fdinfo}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj|hhhjhMubj)}(h$(struct seq_file *m, struct file *f)h](j)}(hstruct seq_file *mh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjʫhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hseq_fileh]hseq_file}(hj۫hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjثubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjݫmodnameN classnameNjj)}j]j)}jjsbc.drm_show_fdinfoasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmh]hm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hstruct file *fh](j)}(hjh]hstruct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(hfileh]hfile}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjOmodnameN classnameNjj)}j]jc.drm_show_fdinfoasbuh1hhj+ubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hfh]hf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhj|hhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjxhhhjhMubah}(h]jsah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjuhhubj))}(hhh]h)}(hhelper for drm file fopsh]hhelper for drm file fops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjuhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjȬjKjȬjLjMjNuh1jhhhjihNhNubjP)}(hXf**Parameters** ``struct seq_file *m`` output stream ``struct file *f`` the device file instance **Description** Helper to implement fdinfo, for userspace to query usage stats, etc, of a process using the GPU. See also :c:type:`drm_driver.show_fdinfo `. For text output format description please see Documentation/gpu/drm-usage-stats.rsth](h)}(h**Parameters**h]jZ)}(hjҬh]h Parameters}(hjԬhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjЬubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj̬ubjp)}(hhh](ju)}(h%``struct seq_file *m`` output stream h](j{)}(h``struct seq_file *m``h]j)}(hjh]hstruct seq_file *m}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(h output streamh]h output stream}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(h,``struct file *f`` the device file instance h](j{)}(h``struct file *f``h]j)}(hj*h]hstruct file *f}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj$ubj)}(hhh]h)}(hthe device file instanceh]hthe device file instance}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMhj@ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jthj?hMhjubeh}(h]h ]h"]h$]h&]uh1johj̬ubh)}(h**Description**h]jZ)}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjcubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj̬ubh)}(hHelper to implement fdinfo, for userspace to query usage stats, etc, of a process using the GPU. See also :c:type:`drm_driver.show_fdinfo `.h](hkHelper to implement fdinfo, for userspace to query usage stats, etc, of a process using the GPU. See also }(hj{hhhNhNubh)}(h-:c:type:`drm_driver.show_fdinfo `h]j)}(hjh]hdrm_driver.show_fdinfo}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_driveruh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj̬ubh)}(hSFor text output format description please see Documentation/gpu/drm-usage-stats.rsth]hSFor text output format description please see Documentation/gpu/drm-usage-stats.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj̬ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_file_err (C function)c.drm_file_errhNtauh1jhjihhhNhNubj)}(hhh](j)}(hDvoid drm_file_err (struct drm_file *file_priv, const char *fmt, ...)h]j)}(hCvoid drm_file_err(struct drm_file *file_priv, const char *fmt, ...)h](j')}(hvoidh]hvoid}(hjܭhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjحhhh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjحhhhjhMubj)}(h drm_file_errh]j)}(h drm_file_errh]h drm_file_err}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjحhhhjhMubj)}(h2(struct drm_file *file_priv, const char *fmt, ...)h](j)}(hstruct drm_file *file_privh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_fileh]hdrm_file}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj9modnameN classnameNjj)}j]j)}jjsbc.drm_file_errasbuh1hhjubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h file_privh]h file_priv}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *fmth](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj®hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hjϮhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(h...h]j)}(h...h]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjحhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjԭhhhjhMubah}(h]jϭah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjѭhhubj))}(hhh]h)}(h@log process name, pid and client_name associated with a drm_fileh]h@log process name, pid and client_name associated with a drm_file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjѭhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJj*jKj*jLjMjNuh1jhhhjihNhNubjP)}(hX.**Parameters** ``struct drm_file *file_priv`` context of interest for process name and pid ``const char *fmt`` printf() like format string ``...`` variable arguments **Description** Helper function for clients which needs to log process details such as name and pid etc along with user logs.h](h)}(h**Parameters**h]jZ)}(hj4h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj2ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj.ubjp)}(hhh](ju)}(hL``struct drm_file *file_priv`` context of interest for process name and pid h](j{)}(h``struct drm_file *file_priv``h]j)}(hjSh]hstruct drm_file *file_priv}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjMubj)}(hhh]h)}(h,context of interest for process name and pidh]h,context of interest for process name and pid}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jthjhhMhjJubju)}(h0``const char *fmt`` printf() like format string h](j{)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhjubj)}(hhh]h)}(hprintf() like format stringh]hprintf() like format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjJubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hjůh]h...}(hjǯhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjïubah}(h]h ]h"]h$]h&]uh1jzh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chKhjubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjޯhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjگhKhjۯubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjگhKhjJubeh}(h]h ]h"]h$]h&]uh1johj.ubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chKhj.ubh)}(hmHelper function for clients which needs to log process details such as name and pid etc along with user logs.h]hmHelper function for clients which needs to log process details such as name and pid etc along with user logs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:152: ./drivers/gpu/drm/drm_file.chMhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjihhhNhNubeh}(h](file-operationsjieh ]h"](file operationsdrm_driver_fopseh$]h&]uh1hhjihhhhhKexpect_referenced_by_name}j2jisexpect_referenced_by_id}jijisubeh}(h]%open-close-file-operations-and-ioctlsah ]h"]&open/close, file operations and ioctlsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hMisc Utilitiesh]hMisc Utilities}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhhhhhKubh)}(hhh](h)}(hPrinterh]hPrinter}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhhhhhKubh)}(h}A simple wrapper for dev_printk(), seq_printf(), etc. Allows same debug code to be used for both debugfs and printk logging.h]h}A simple wrapper for dev_printk(), seq_printf(), etc. Allows same debug code to be used for both debugfs and printk logging.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:161: ./include/drm/drm_print.hhK-hjRhhubh)}(h For example::h]h For example:}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:161: ./include/drm/drm_print.hhK0hjRhhubj2)}(hXvoid log_some_info(struct drm_printer *p) { drm_printf(p, "foo=%d\n", foo); drm_printf(p, "bar=%d\n", bar); } #ifdef CONFIG_DEBUG_FS void debugfs_show(struct seq_file *f) { struct drm_printer p = drm_seq_file_printer(f); log_some_info(&p); } #endif void some_other_function(...) { struct drm_printer p = drm_info_printer(drm->dev); log_some_info(&p); }h]hXvoid log_some_info(struct drm_printer *p) { drm_printf(p, "foo=%d\n", foo); drm_printf(p, "bar=%d\n", bar); } #ifdef CONFIG_DEBUG_FS void debugfs_show(struct seq_file *f) { struct drm_printer p = drm_seq_file_printer(f); log_some_info(&p); } #endif void some_other_function(...) { struct drm_printer p = drm_info_printer(drm->dev); log_some_info(&p); }}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:161: ./include/drm/drm_print.hhK2hjRhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_debug_category (C enum)c.drm_debug_categoryhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hdrm_debug_categoryh]j)}(henum drm_debug_categoryh](j)}(hjh]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hdrm_debug_categoryh]j)}(hjh]hdrm_debug_category}(hjɰhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŰubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhKubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhKhjhhubj))}(hhh]h)}(hThe DRM debug categoriesh]hThe DRM debug categories}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKJhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhKubeh}(h]h ](j enumeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hXd**Constants** ``DRM_UT_CORE`` Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... ``DRM_UT_DRIVER`` Used in the vendor specific part of the driver: i915, radeon, ... macro. ``DRM_UT_KMS`` Used in the modesetting code. ``DRM_UT_PRIME`` Used in the prime code. ``DRM_UT_ATOMIC`` Used in the atomic code. ``DRM_UT_VBL`` Used for verbose debug message in the vblank code. ``DRM_UT_STATE`` Used for verbose atomic state debugging. ``DRM_UT_LEASE`` Used in the lease code. ``DRM_UT_DP`` Used in the DP code. ``DRM_UT_DRMRES`` Used in the drm managed resources code.h](h)}(h **Constants**h]jZ)}(hj h]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKNhjubjp)}(hhh](ju)}(hW``DRM_UT_CORE`` Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... h](j{)}(h``DRM_UT_CORE``h]j)}(hj,h]h DRM_UT_CORE}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKRhj&ubj)}(hhh]h)}(hFUsed in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...h]hFUsed in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKQhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jthjAhKRhj#ubju)}(h[``DRM_UT_DRIVER`` Used in the vendor specific part of the driver: i915, radeon, ... macro. h](j{)}(h``DRM_UT_DRIVER``h]j)}(hjfh]h DRM_UT_DRIVER}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKVhj`ubj)}(hhh]h)}(hHUsed in the vendor specific part of the driver: i915, radeon, ... macro.h]hHUsed in the vendor specific part of the driver: i915, radeon, ... macro.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKUhj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jthj{hKVhj#ubju)}(h-``DRM_UT_KMS`` Used in the modesetting code. h](j{)}(h``DRM_UT_KMS``h]j)}(hjh]h DRM_UT_KMS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKYhjubj)}(hhh]h)}(hUsed in the modesetting code.h]hUsed in the modesetting code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKYhj#ubju)}(h)``DRM_UT_PRIME`` Used in the prime code. h](j{)}(h``DRM_UT_PRIME``h]j)}(hjٱh]h DRM_UT_PRIME}(hj۱hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjױubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhK\hjӱubj)}(hhh]h)}(hUsed in the prime code.h]hUsed in the prime code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK\hjubah}(h]h ]h"]h$]h&]uh1jhjӱubeh}(h]h ]h"]h$]h&]uh1jthjhK\hj#ubju)}(h+``DRM_UT_ATOMIC`` Used in the atomic code. h](j{)}(h``DRM_UT_ATOMIC``h]j)}(hjh]h DRM_UT_ATOMIC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhK_hj ubj)}(hhh]h)}(hUsed in the atomic code.h]hUsed in the atomic code.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hK_hj(ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj'hK_hj#ubju)}(hB``DRM_UT_VBL`` Used for verbose debug message in the vblank code. h](j{)}(h``DRM_UT_VBL``h]j)}(hjKh]h DRM_UT_VBL}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKbhjEubj)}(hhh]h)}(h2Used for verbose debug message in the vblank code.h]h2Used for verbose debug message in the vblank code.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hKbhjaubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jthj`hKbhj#ubju)}(h:``DRM_UT_STATE`` Used for verbose atomic state debugging. h](j{)}(h``DRM_UT_STATE``h]j)}(hjh]h DRM_UT_STATE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKehj~ubj)}(hhh]h)}(h(Used for verbose atomic state debugging.h]h(Used for verbose atomic state debugging.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKehjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jthjhKehj#ubju)}(h)``DRM_UT_LEASE`` Used in the lease code. h](j{)}(h``DRM_UT_LEASE``h]j)}(hjh]h DRM_UT_LEASE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhhjubj)}(hhh]h)}(hUsed in the lease code.h]hUsed in the lease code.}(hjֲhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjҲhKhhjӲubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjҲhKhhj#ubju)}(h#``DRM_UT_DP`` Used in the DP code. h](j{)}(h ``DRM_UT_DP``h]j)}(hjh]h DRM_UT_DP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKkhjubj)}(hhh]h)}(hUsed in the DP code.h]hUsed in the DP code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKkhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hKkhj#ubju)}(h9``DRM_UT_DRMRES`` Used in the drm managed resources code.h](j{)}(h``DRM_UT_DRMRES``h]j)}(hj/h]h DRM_UT_DRMRES}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKmhj)ubj)}(hhh]h)}(h'Used in the drm managed resources code.h]h'Used in the drm managed resources code.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKnhjEubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jthjDhKmhj#ubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubh)}(h**Description**h]jZ)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjpubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKphjRhhubh)}(hEach of the DRM debug logging macros use a specific category, and the logging is filtered by the drm.debug module parameter. This enum specifies the values for the interface.h]hEach of the DRM debug logging macros use a specific category, and the logging is filtered by the drm.debug module parameter. This enum specifies the values for the interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKKhjRhhubh)}(hkEach DRM_DEBUG_ macro logs to DRM_UT_ category, except DRM_DEBUG() logs to DRM_UT_CORE.h]hkEach DRM_DEBUG_ macro logs to DRM_UT_ category, except DRM_DEBUG() logs to DRM_UT_CORE.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKOhjRhhubh)}(hnEnabling verbose debug messages is done through the drm.debug parameter, each category being enabled by a bit:h]hnEnabling verbose debug messages is done through the drm.debug parameter, each category being enabled by a bit:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKRhjRhhubj[%)}(h- drm.debug=0x1 will enable CORE messages - drm.debug=0x2 will enable DRIVER messages - drm.debug=0x3 will enable CORE and DRIVER messages - ... - drm.debug=0x1ff will enable all messages h]jM)}(hhh](jM)}(h'drm.debug=0x1 will enable CORE messagesh]h)}(hjh]h'drm.debug=0x1 will enable CORE messages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKUhjubah}(h]h ]h"]h$]h&]uh1jMhjubjM)}(h)drm.debug=0x2 will enable DRIVER messagesh]h)}(hjֳh]h)drm.debug=0x2 will enable DRIVER messages}(hjسhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKVhjԳubah}(h]h ]h"]h$]h&]uh1jMhjubjM)}(h2drm.debug=0x3 will enable CORE and DRIVER messagesh]h)}(hjh]h2drm.debug=0x3 will enable CORE and DRIVER messages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKWhjubah}(h]h ]h"]h$]h&]uh1jMhjubjM)}(h...h]h)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKXhjubah}(h]h ]h"]h$]h&]uh1jMhjubjM)}(h)drm.debug=0x1ff will enable all messages h]h)}(h(drm.debug=0x1ff will enable all messagesh]h(drm.debug=0x1ff will enable all messages}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKYhjubah}(h]h ]h"]h$]h&]uh1jMhjubeh}(h]h ]h"]h$]h&]jNjNuh1jMhjͳhKUhjubah}(h]h ]h"]h$]h&]uh1jZ%hjͳhKUhjRhhubh)}(hAn interesting feature is that it's possible to enable verbose logging at run-time by echoing the debug value in its sysfs node::h]hAn interesting feature is that it’s possible to enable verbose logging at run-time by echoing the debug value in its sysfs node:}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhK[hjRhhubj2)}(h-# echo 0xf > /sys/module/drm/parameters/debugh]h-# echo 0xf > /sys/module/drm/parameters/debug}hjPsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhK^hjRhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_printer (C struct) c.drm_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h drm_printerh]j)}(hstruct drm_printerh](j)}(hjh]hstruct}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjthhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjthhhjhKcubj)}(h drm_printerh]j)}(hjrh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjthhhjhKcubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjphhhjhKcubah}(h]jkah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhKchjmhhubj))}(hhh]h)}(hdrm output "stream"h]hdrm output “stream”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j(hjmhhhjhKcubeh}(h]h ](j structeh"]h$]h&]jIj jJjҴjKjҴjLjMjNuh1jhhhjRhNhNubjP)}(h:**Definition**:: struct drm_printer { }; **Members**h](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hj޴hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjڴubh:}(hjڴhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjִubj2)}(hstruct drm_printer { };h]hstruct drm_printer { };}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjִubh)}(h **Members**h]jZ)}(hjh]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjִubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubh)}(h**Description**h]jZ)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj%ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjRhhubh)}(hDo not use struct members directly. Use drm_printer_seq_file(), drm_printer_info(), etc to initialize. And drm_printf() for output.h]hDo not use struct members directly. Use drm_printer_seq_file(), drm_printer_info(), etc to initialize. And drm_printf() for output.}(hj=HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjRhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_vprintf (C function) c.drm_vprintfhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hFvoid drm_vprintf (struct drm_printer *p, const char *fmt, va_list *va)h]j)}(hEvoid drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va)h](j')}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjahhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjshKubj)}(h drm_vprintfh]j)}(h drm_vprintfh]h drm_vprintf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjahhhjshKubj)}(h5(struct drm_printer *p, const char *fmt, va_list *va)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjµmodnameN classnameNjj)}j]j)}jjsb c.drm_vprintfasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *fmth](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hj.hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(h va_list *vah](h)}(hhh]j)}(hva_listh]hva_list}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjumodnameN classnameNjj)}j]jܵ c.drm_vprintfasbuh1hhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hvah]hva}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjahhhjshKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj]hhhjshKubah}(h]jXah ](j j!eh"]h$]h&]j%j&)j'huh1jhjshKhjZhhubj))}(hhh]h)}(h'print to a :c:type:`drm_printer` streamh](h print to a }(hjֶhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj޶ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jܵ c.drm_vprintfasbj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjֶubh stream}(hjֶhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjӶhhubah}(h]h ]h"]h$]h&]uh1j(hjZhhhjshKubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct drm_printer *p`` the :c:type:`drm_printer` ``const char *fmt`` format string ``va_list *va`` the va_listh](h)}(h**Parameters**h]jZ)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubjp)}(hhh](ju)}(h4``struct drm_printer *p`` the :c:type:`drm_printer` h](j{)}(h``struct drm_printer *p``h]j)}(hj@h]hstruct drm_printer *p}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj:ubj)}(hhh]h)}(hthe :c:type:`drm_printer`h](hthe }(hjYhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjch]h drm_printer}(hjehhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhjUhKhjYubeh}(h]h ]h"]h$]h&]uh1hhjUhKhjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jthjUhKhj7ubju)}(h"``const char *fmt`` format string h](j{)}(h``const char *fmt``h]j)}(hjh]hconst char *fmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(h format stringh]h format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj7ubju)}(h``va_list *va`` the va_listh](j{)}(h``va_list *va``h]j)}(hjѷh]h va_list *va}(hjӷhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjϷubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj˷ubj)}(hhh]h)}(h the va_listh]h the va_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj˷ubeh}(h]h ]h"]h$]h&]uh1jthjhKhj7ubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_printf_indent (C macro)c.drm_printf_indenthNtauh1jhjRhhhNhNubj)}(hhh](j)}(hdrm_printf_indenth]j)}(hdrm_printf_indenth]j)}(hdrm_printf_indenth]j)}(hj%h]hdrm_printf_indent}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj'hhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhj#hhhjBhKubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjBhKhj hhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hj hhhjBhKubeh}(h]h ](j macroeh"]h$]h&]jIj jJj[jKj[jLjMjNuh1jhhhjRhNhNubh)}(h1``drm_printf_indent (printer, indent, fmt, ...)``h]j)}(hjah]h-drm_printf_indent (printer, indent, fmt, ...)}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjRhhubj[%)}(h9Print to a :c:type:`drm_printer` stream with indentation h]h)}(h8Print to a :c:type:`drm_printer` stream with indentationh](h Print to a }(hj{hhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj{ubh stream with indentation}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjwubah}(h]h ]h"]h$]h&]uh1jZ%hjhKhjRhhubjP)}(h**Parameters** ``printer`` DRM printer ``indent`` Tab indentation level (max 5) ``fmt`` Format string ``...`` variable argumentsh](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubjp)}(hhh](ju)}(h``printer`` DRM printer h](j{)}(h ``printer``h]j)}(hjظh]hprinter}(hjڸhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjָubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjҸubj)}(hhh]h)}(h DRM printerh]h DRM printer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjҸubeh}(h]h ]h"]h$]h&]uh1jthjhKhjϸubju)}(h)``indent`` Tab indentation level (max 5) h](j{)}(h ``indent``h]j)}(hjh]hindent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj ubj)}(hhh]h)}(hTab indentation level (max 5)h]hTab indentation level (max 5)}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hKhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj&hKhjϸubju)}(h``fmt`` Format string h](j{)}(h``fmt``h]j)}(hjJh]hfmt}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjDubj)}(hhh]h)}(h Format stringh]h Format string}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hKhj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jthj_hKhjϸubju)}(h``...`` variable argumentsh](j{)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj}ubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jthjhKhjϸubeh}(h]h ]h"]h$]h&]uh1johjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_print_iterator (C struct)c.drm_print_iteratorhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hdrm_print_iteratorh]j)}(hstruct drm_print_iteratorh](j)}(hjh]hstruct}(hjݹhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٹhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٹhhhjhKubj)}(hdrm_print_iteratorh]j)}(hj׹h]hdrm_print_iterator}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjٹhhhjhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjչhhhjhKubah}(h]jйah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhKhjҹhhubj))}(hhh]h)}(h+local struct used with drm_printer_coredumph]h+local struct used with drm_printer_coredump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j(hjҹhhhjhKubeh}(h]h ](j structeh"]h$]h&]jIj jJj7jKj7jLjMjNuh1jhhhjRhNhNubjP)}(hXz**Definition**:: struct drm_print_iterator { void *data; ssize_t start; ssize_t remain; }; **Members** ``data`` Pointer to the devcoredump output buffer, can be NULL if using drm_printer_coredump to determine size of devcoredump ``start`` The offset within the buffer to start writing ``remain`` The number of bytes to write for this iterationh](h)}(h**Definition**::h](jZ)}(h**Definition**h]h Definition}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj?ubh:}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj;ubj2)}(hUstruct drm_print_iterator { void *data; ssize_t start; ssize_t remain; };h]hUstruct drm_print_iterator { void *data; ssize_t start; ssize_t remain; };}hj\sbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj;ubh)}(h **Members**h]jZ)}(hjmh]hMembers}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjkubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj;ubjp)}(hhh](ju)}(h~``data`` Pointer to the devcoredump output buffer, can be NULL if using drm_printer_coredump to determine size of devcoredump h](j{)}(h``data``h]j)}(hjh]hdata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(htPointer to the devcoredump output buffer, can be NULL if using drm_printer_coredump to determine size of devcoredumph]htPointer to the devcoredump output buffer, can be NULL if using drm_printer_coredump to determine size of devcoredump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubju)}(h8``start`` The offset within the buffer to start writing h](j{)}(h ``start``h]j)}(hjƺh]hstart}(hjȺhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjĺubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(h-The offset within the buffer to start writingh]h-The offset within the buffer to start writing}(hjߺhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjۺhKhjܺubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjۺhKhjubju)}(h:``remain`` The number of bytes to write for this iterationh](j{)}(h ``remain``h]j)}(hjh]hremain}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(h/The number of bytes to write for this iterationh]h/The number of bytes to write for this iteration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubeh}(h]h ]h"]h$]h&]uh1johj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_coredump_printer (C function)c.drm_coredump_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hIstruct drm_printer drm_coredump_printer (struct drm_print_iterator *iter)h]j)}(hHstruct drm_printer drm_coredump_printer(struct drm_print_iterator *iter)h](j)}(hjh]hstruct}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjfhKubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjzmodnameN classnameNjj)}j]j)}jdrm_coredump_printersbc.drm_coredump_printerasbuh1hhjUhhhjfhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjfhKubj)}(hdrm_coredump_printerh]j)}(hjh]hdrm_coredump_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjUhhhjfhKubj)}(h!(struct drm_print_iterator *iter)h]j)}(hstruct drm_print_iterator *iterh](j)}(hjh]hstruct}(hjƻhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubj)}(h h]h }(hjӻhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubh)}(hhh]j)}(hdrm_print_iteratorh]hdrm_print_iterator}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_coredump_printerasbuh1hhj»ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubj)}(hiterh]hiter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj»ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubah}(h]h ]h"]h$]h&]jAjBuh1jhjUhhhjfhKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjQhhhjfhKubah}(h]jLah ](j j!eh"]h$]h&]j%j&)j'huh1jhjfhKhjNhhubj))}(hhh]h)}(hdconstruct a :c:type:`drm_printer` that can output to a buffer from the read function for devcoredumph](h construct a }(hjGhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjQh]h drm_printer}(hjShhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_coredump_printerasbj drm_printeruh1hhjhKhjGubhC that can output to a buffer from the read function for devcoredump}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjDhhubah}(h]h ]h"]h$]h&]uh1j(hjNhhhjfhKubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hX **Parameters** ``struct drm_print_iterator *iter`` A pointer to a struct drm_print_iterator for the read instance **Description** This wrapper extends drm_printf() to work with a dev_coredumpm() callback function. The passed in drm_print_iterator struct contains the buffer pointer, size and offset as passed in from devcoredump. For example:: void coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = offset; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); } void makecoredump(...) { ... dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, coredump_read, ...) } The above example has a time complexity of O(N^2), where N is the size of the devcoredump. This is acceptable for small devcoredumps but scales poorly for larger ones. Another use case for drm_coredump_printer is to capture the devcoredump into a saved buffer before the dev_coredump() callback. This involves two passes: one to determine the size of the devcoredump and another to print it to a buffer. Then, in dev_coredump(), copy from the saved buffer into the devcoredump read buffer. For example:: char *devcoredump_saved_buffer; ssize_t __coredump_print(char *buffer, ssize_t count, ...) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = 0; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); ... return count - iter.remain; } void coredump_print(...) { ssize_t count; count = __coredump_print(NULL, INT_MAX, ...); devcoredump_saved_buffer = kvmalloc(count, GFP_KERNEL); __coredump_print(devcoredump_saved_buffer, count, ...); } void coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { ... memcpy(buffer, devcoredump_saved_buffer + offset, count); ... } The above example has a time complexity of O(N*2), where N is the size of the devcoredump. This scales better than the previous example for larger devcoredumps. **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubjp)}(hhh]ju)}(hc``struct drm_print_iterator *iter`` A pointer to a struct drm_print_iterator for the read instance h](j{)}(h#``struct drm_print_iterator *iter``h]j)}(hjh]hstruct drm_print_iterator *iter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(h>A pointer to a struct drm_print_iterator for the read instanceh]h>A pointer to a struct drm_print_iterator for the read instance}(hjɼhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjżhKhjƼubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjżhKhjubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubh)}(hThis wrapper extends drm_printf() to work with a dev_coredumpm() callback function. The passed in drm_print_iterator struct contains the buffer pointer, size and offset as passed in from devcoredump.h]hThis wrapper extends drm_printf() to work with a dev_coredumpm() callback function. The passed in drm_print_iterator struct contains the buffer pointer, size and offset as passed in from devcoredump.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubh)}(h For example::h]h For example:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj2)}(hXvoid coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = offset; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); } void makecoredump(...) { ... dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, coredump_read, ...) }h]hXvoid coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = offset; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); } void makecoredump(...) { ... dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, coredump_read, ...) }}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(hThe above example has a time complexity of O(N^2), where N is the size of the devcoredump. This is acceptable for small devcoredumps but scales poorly for larger ones.h]hThe above example has a time complexity of O(N^2), where N is the size of the devcoredump. This is acceptable for small devcoredumps but scales poorly for larger ones.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(hXAAnother use case for drm_coredump_printer is to capture the devcoredump into a saved buffer before the dev_coredump() callback. This involves two passes: one to determine the size of the devcoredump and another to print it to a buffer. Then, in dev_coredump(), copy from the saved buffer into the devcoredump read buffer.h]hXAAnother use case for drm_coredump_printer is to capture the devcoredump into a saved buffer before the dev_coredump() callback. This involves two passes: one to determine the size of the devcoredump and another to print it to a buffer. Then, in dev_coredump(), copy from the saved buffer into the devcoredump read buffer.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h For example::h]h For example:}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM hjubj2)}(hX2char *devcoredump_saved_buffer; ssize_t __coredump_print(char *buffer, ssize_t count, ...) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = 0; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); ... return count - iter.remain; } void coredump_print(...) { ssize_t count; count = __coredump_print(NULL, INT_MAX, ...); devcoredump_saved_buffer = kvmalloc(count, GFP_KERNEL); __coredump_print(devcoredump_saved_buffer, count, ...); } void coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { ... memcpy(buffer, devcoredump_saved_buffer + offset, count); ... }h]hX2char *devcoredump_saved_buffer; ssize_t __coredump_print(char *buffer, ssize_t count, ...) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; iter.start = 0; iter.remain = count; p = drm_coredump_printer(&iter); drm_printf(p, "foo=%d\n", foo); ... return count - iter.remain; } void coredump_print(...) { ssize_t count; count = __coredump_print(NULL, INT_MAX, ...); devcoredump_saved_buffer = kvmalloc(count, GFP_KERNEL); __coredump_print(devcoredump_saved_buffer, count, ...); } void coredump_read(char *buffer, loff_t offset, size_t count, void *data, size_t datalen) { ... memcpy(buffer, devcoredump_saved_buffer + offset, count); ... }}hj[sbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM"hjubh)}(hThe above example has a time complexity of O(N*2), where N is the size of the devcoredump. This scales better than the previous example for larger devcoredumps.h]hThe above example has a time complexity of O(N*2), where N is the size of the devcoredump. This scales better than the previous example for larger devcoredumps.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMEhjubh)}(h **Return**h]jZ)}(hj{h]hReturn}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjyubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMIhjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMIhjubh object}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMIhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)drm_coredump_printer_is_full (C function)c.drm_coredump_printer_is_fullhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h9bool drm_coredump_printer_is_full (struct drm_printer *p)h]j)}(h8bool drm_coredump_printer_is_full(struct drm_printer *p)h](j')}(hj'h]hbool}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj߽hhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj߽hhhjhM\ubj)}(hdrm_coredump_printer_is_fullh]j)}(hdrm_coredump_printer_is_fullh]hdrm_coredump_printer_is_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj߽hhhjhM\ubj)}(h(struct drm_printer *p)h]j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj?modnameN classnameNjj)}j]j)}jjsbc.drm_coredump_printer_is_fullasbuh1hhjubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubah}(h]h ]h"]h$]h&]jAjBuh1jhj߽hhhjhM\ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj۽hhhjhM\ubah}(h]jֽah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhM\hjؽhhubj))}(hhh]h)}(h#DRM coredump printer output is fullh]h#DRM coredump printer output is full}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM\hjhhubah}(h]h ]h"]h$]h&]uh1j(hjؽhhhjhM\ubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct drm_printer *p`` DRM coredump printer **Description** DRM printer output is full, useful to short circuit coredump printing once printer is full. **Return** True if DRM coredump printer output buffer is full, False otherwiseh](h)}(h**Parameters**h]jZ)}(hjþh]h Parameters}(hjžhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM`hjubjp)}(hhh]ju)}(h/``struct drm_printer *p`` DRM coredump printer h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM]hjܾubj)}(hhh]h)}(hDRM coredump printerh]hDRM coredump printer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM]hjubah}(h]h ]h"]h$]h&]uh1jhjܾubeh}(h]h ]h"]h$]h&]uh1jthjhM]hjپubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM_hjubh)}(h[DRM printer output is full, useful to short circuit coredump printing once printer is full.h]h[DRM printer output is full, useful to short circuit coredump printing once printer is full.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM_hjubh)}(h **Return**h]jZ)}(hjDh]hReturn}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjBubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMbhjubh)}(hCTrue if DRM coredump printer output buffer is full, False otherwiseh]hCTrue if DRM coredump printer output buffer is full, False otherwise}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMbhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!drm_seq_file_printer (C function)c.drm_seq_file_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h` to output to **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMthjubjp)}(hhh]ju)}(hM``struct seq_file *f`` the :c:type:`struct seq_file ` to output to h](j{)}(h``struct seq_file *f``h]j)}(hjh]hstruct seq_file *f}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMqhjubj)}(hhh]h)}(h5the :c:type:`struct seq_file ` to output toh](hthe }(hjhhhNhNubh)}(h$:c:type:`struct seq_file `h]j)}(hj!h]hstruct seq_file}(hj#hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjseq_fileuh1hhjhMqhjubh to output to}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMqhjubah}(h]h ]h"]h$]h&]uh1johjubh)}(h **Return**h]jZ)}(hj\h]hReturn}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjZubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMshjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjrhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hj|h]h drm_printer}(hj~hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMshjrubh object}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMshjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_info_printer (C function)c.drm_info_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h8struct drm_printer drm_info_printer (struct device *dev)h]j)}(h7struct drm_printer drm_info_printer(struct device *dev)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jdrm_info_printersbc.drm_info_printerasbuh1hhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hdrm_info_printerh]j)}(hjh]hdrm_info_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMubj)}(h(struct device *dev)h]j)}(hstruct device *devh](j)}(hjh]hstruct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(hdeviceh]hdevice}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjQmodnameN classnameNjj)}j]jc.drm_info_printerasbuh1hhj-ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj)ubah}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h)}(h>construct a :c:type:`drm_printer` that outputs to dev_printk()h](h construct a }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_info_printerasbj drm_printeruh1hhjhKhjubh that outputs to dev_printk()}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct device *dev`` the :c:type:`struct device ` pointer **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubjp)}(hhh]ju)}(hD``struct device *dev`` the :c:type:`struct device ` pointer h](j{)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(h,the :c:type:`struct device ` pointerh](hthe }(hj4hhhNhNubh)}(h :c:type:`struct device `h]j)}(hj>h]h struct device}(hj@hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdeviceuh1hhj0hMhj4ubh pointer}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj0hMhjubah}(h]h ]h"]h$]h&]uh1johjubh)}(h **Return**h]jZ)}(hjyh]hReturn}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjwubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh object}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_dbg_printer (C function)c.drm_dbg_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hqstruct drm_printer drm_dbg_printer (struct drm_device *drm, enum drm_debug_category category, const char *prefix)h]j)}(hpstruct drm_printer drm_dbg_printer(struct drm_device *drm, enum drm_debug_category category, const char *prefix)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jdrm_dbg_printersbc.drm_dbg_printerasbuh1hhjhhhjhMubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hdrm_dbg_printerh]j)}(hjh]hdrm_dbg_printer}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMubj)}(hN(struct drm_device *drm, enum drm_debug_category category, const char *prefix)h](j)}(hstruct drm_device *drmh](j)}(hjh]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjnmodnameN classnameNjj)}j]jc.drm_dbg_printerasbuh1hhjJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hdrmh]hdrm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjFubj)}(h enum drm_debug_category categoryh](j)}(hjh]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdrm_debug_categoryh]hdrm_debug_category}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_dbg_printerasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcategoryh]hcategory}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjFubj)}(hconst char *prefixh](j)}(hj)h]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hj<hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hprefixh]hprefix}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjFubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h)}(h@construct a :c:type:`drm_printer` for drm device specific outputh](h construct a }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_dbg_printerasbj drm_printeruh1hhjhKhjubh for drm device specific output}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hX**Parameters** ``struct drm_device *drm`` the :c:type:`struct drm_device ` pointer, or NULL ``enum drm_debug_category category`` the debug category to use ``const char *prefix`` debug output prefix, or NULL for no prefix **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubjp)}(hhh](ju)}(hY``struct drm_device *drm`` the :c:type:`struct drm_device ` pointer, or NULL h](j{)}(h``struct drm_device *drm``h]j)}(hjh]hstruct drm_device *drm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(h=the :c:type:`struct drm_device ` pointer, or NULLh](hthe }(hjhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjh]hstruct drm_device}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhj hMhjubh pointer, or NULL}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hMhjubju)}(h?``enum drm_debug_category category`` the debug category to use h](j{)}(h$``enum drm_debug_category category``h]j)}(hjTh]h enum drm_debug_category category}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjNubj)}(hhh]h)}(hthe debug category to useh]hthe debug category to use}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jthjihMhjubju)}(hB``const char *prefix`` debug output prefix, or NULL for no prefix h](j{)}(h``const char *prefix``h]j)}(hjh]hconst char *prefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(h*debug output prefix, or NULL for no prefixh]h*debug output prefix, or NULL for no prefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h **Return**h]jZ)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh object}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_err_printer (C function)c.drm_err_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hOstruct drm_printer drm_err_printer (struct drm_device *drm, const char *prefix)h]j)}(hNstruct drm_printer drm_err_printer(struct drm_device *drm, const char *prefix)h](j)}(hjh]hstruct}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj=hMubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjQmodnameN classnameNjj)}j]j)}jdrm_err_printersbc.drm_err_printerasbuh1hhj,hhhj=hMubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj=hMubj)}(hdrm_err_printerh]j)}(hjmh]hdrm_err_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj,hhhj=hMubj)}(h,(struct drm_device *drm, const char *prefix)h](j)}(hstruct drm_device *drmh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_deviceh]h drm_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jkc.drm_err_printerasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdrmh]hdrm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *prefixh](j)}(hj)h]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj')}(hcharh]hchar}(hj(hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hprefixh]hprefix}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhj,hhhj=hMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhj(hhhj=hMubah}(h]j#ah ](j j!eh"]h$]h&]j%j&)j'huh1jhj=hMhj%hhubj))}(hhh]h)}(h;construct a :c:type:`drm_printer` that outputs to drm_err()h](h construct a }(hj{hhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jkc.drm_err_printerasbj drm_printeruh1hhjhKhj{ubh that outputs to drm_err()}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjxhhubah}(h]h ]h"]h$]h&]uh1j(hj%hhhj=hMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct drm_device *drm`` the :c:type:`struct drm_device ` pointer ``const char *prefix`` debug output prefix, or NULL for no prefix **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubjp)}(hhh](ju)}(hP``struct drm_device *drm`` the :c:type:`struct drm_device ` pointer h](j{)}(h``struct drm_device *drm``h]j)}(hjh]hstruct drm_device *drm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(h4the :c:type:`struct drm_device ` pointerh](hthe }(hjhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjh]hstruct drm_device}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_deviceuh1hhjhMhjubh pointer}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(hB``const char *prefix`` debug output prefix, or NULL for no prefix h](j{)}(h``const char *prefix``h]j)}(hj@h]hconst char *prefix}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj:ubj)}(hhh]h)}(h*debug output prefix, or NULL for no prefixh]h*debug output prefix, or NULL for no prefix}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMhjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jthjUhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h **Return**h]jZ)}(hj{h]hReturn}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjyubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hBhMhjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh object}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_line_printer (C function)c.drm_line_printerhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hdstruct drm_printer drm_line_printer (struct drm_printer *p, const char *prefix, unsigned int series)h]j)}(hcstruct drm_printer drm_line_printer(struct drm_printer *p, const char *prefix, unsigned int series)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jdrm_line_printersbc.drm_line_printerasbuh1hhjhhhjhMubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hdrm_line_printerh]j)}(hj h]hdrm_line_printer}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMubj)}(h@(struct drm_printer *p, const char *prefix, unsigned int series)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjpmodnameN classnameNjj)}j]jc.drm_line_printerasbuh1hhjLubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjHubj)}(hconst char *prefixh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hprefixh]hprefix}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjHubj)}(hunsigned int seriesh](j')}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hinth]hint}(hj8hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hseriesh]hseries}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjHubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h)}(hIconstruct a :c:type:`drm_printer` that prefixes outputs with line numbersh](h construct a }(hj~hhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_line_printerasbj drm_printeruh1hhjhKhj~ubh( that prefixes outputs with line numbers}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj{hhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hX**Parameters** ``struct drm_printer *p`` the :c:type:`struct drm_printer ` which actually generates the output ``const char *prefix`` optional output prefix, or NULL for no prefix ``unsigned int series`` optional unique series identifier, or 0 to omit identifier in the output **Description** This printer can be used to increase the robustness of the captured output to make sure we didn't lost any intermediate lines of the output. Helpful while capturing some crash data. Example 1:: void crash_dump(struct drm_device *drm) { static unsigned int id; struct drm_printer p = drm_err_printer(drm, "crash"); struct drm_printer lp = drm_line_printer(&p, "dump", ++id); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); } Above code will print into the dmesg something like:: [ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.1: foo [ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.2: bar Example 2:: void line_dump(struct device *dev) { struct drm_printer p = drm_info_printer(dev); struct drm_printer lp = drm_line_printer(&p, NULL, 0); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); } Above code will print:: [ ] 0000:00:00.0: [drm] 1: foo [ ] 0000:00:00.0: [drm] 2: bar **Return** The :c:type:`drm_printer` objecth](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubjp)}(hhh](ju)}(hm``struct drm_printer *p`` the :c:type:`struct drm_printer ` which actually generates the output h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(hRthe :c:type:`struct drm_printer ` which actually generates the outputh](hthe }(hjhhhNhNubh)}(h*:c:type:`struct drm_printer `h]j)}(hj h]hstruct drm_printer}(hj hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhjhMhjubh$ which actually generates the output}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(hE``const char *prefix`` optional output prefix, or NULL for no prefix h](j{)}(h``const char *prefix``h]j)}(hjCh]hconst char *prefix}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj=ubj)}(hhh]h)}(h-optional output prefix, or NULL for no prefixh]h-optional output prefix, or NULL for no prefix}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jthjXhMhjubju)}(ha``unsigned int series`` optional unique series identifier, or 0 to omit identifier in the output h](j{)}(h``unsigned int series``h]j)}(hj|h]hunsigned int series}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjvubj)}(hhh]h)}(hHoptional unique series identifier, or 0 to omit identifier in the outputh]hHoptional unique series identifier, or 0 to omit identifier in the output}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(hThis printer can be used to increase the robustness of the captured output to make sure we didn't lost any intermediate lines of the output. Helpful while capturing some crash data.h]hThis printer can be used to increase the robustness of the captured output to make sure we didn’t lost any intermediate lines of the output. Helpful while capturing some crash data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h Example 1::h]h Example 1:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj2)}(hXvoid crash_dump(struct drm_device *drm) { static unsigned int id; struct drm_printer p = drm_err_printer(drm, "crash"); struct drm_printer lp = drm_line_printer(&p, "dump", ++id); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); }h]hXvoid crash_dump(struct drm_device *drm) { static unsigned int id; struct drm_printer p = drm_err_printer(drm, "crash"); struct drm_printer lp = drm_line_printer(&p, "dump", ++id); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); }}hjsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h5Above code will print into the dmesg something like::h]h4Above code will print into the dmesg something like:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj2)}(hg[ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.1: foo [ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.2: barh]hg[ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.1: foo [ ] 0000:00:00.0: [drm] *ERROR* crash dump 1.2: bar}hj sbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h Example 2::h]h Example 2:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj2)}(hvoid line_dump(struct device *dev) { struct drm_printer p = drm_info_printer(dev); struct drm_printer lp = drm_line_printer(&p, NULL, 0); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); }h]hvoid line_dump(struct device *dev) { struct drm_printer p = drm_info_printer(dev); struct drm_printer lp = drm_line_printer(&p, NULL, 0); drm_printf(&lp, "foo"); drm_printf(&lp, "bar"); }}hj'sbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(hAbove code will print::h]hAbove code will print:}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj2)}(h=[ ] 0000:00:00.0: [drm] 1: foo [ ] 0000:00:00.0: [drm] 2: barh]h=[ ] 0000:00:00.0: [drm] 1: foo [ ] 0000:00:00.0: [drm] 2: bar}hjEsbah}(h]h ]h"]h$]h&]jAjBuh1j1hZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h **Return**h]jZ)}(hjVh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjTubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h The :c:type:`drm_printer` objecth](hThe }(hjlhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjvh]h drm_printer}(hjxhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjlubh object}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jDRM_DEV_ERROR (C macro)c.DRM_DEV_ERRORhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h DRM_DEV_ERRORh]j)}(h DRM_DEV_ERRORh]j)}(h DRM_DEV_ERRORh]j)}(hjh]h DRM_DEV_ERROR}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j macroeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubh)}(h!``DRM_DEV_ERROR (dev, fmt, ...)``h]j)}(hjh]hDRM_DEV_ERROR (dev, fmt, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjRhhubj[%)}(hError output. h]h)}(h Error output.h]h Error output.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj ubah}(h]h ]h"]h$]h&]uh1jZ%hjhMhjRhhubjP)}(h**Parameters** ``dev`` device pointer ``fmt`` printf() like format string. ``...`` variable arguments **NOTE** this is deprecated in favor of drm_err() or dev_err().h](h)}(h**Parameters**h]jZ)}(hj)h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj'ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj#ubjp)}(hhh](ju)}(h``dev`` device pointer h](j{)}(h``dev``h]j)}(hjHh]hdev}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjBubj)}(hhh]h)}(hdevice pointerh]hdevice pointer}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jthj]hMhj?ubju)}(h%``fmt`` printf() like format string. h](j{)}(h``fmt``h]j)}(hjh]hfmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM hj{ubj)}(hhh]h)}(hprintf() like format string.h]hprintf() like format string.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jthjhM hj?ubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj?ubeh}(h]h ]h"]h$]h&]uh1johj#ubh)}(h**NOTE**h]jZ)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj#ubh)}(h6this is deprecated in favor of drm_err() or dev_err().h]h6this is deprecated in favor of drm_err() or dev_err().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#DRM_DEV_ERROR_RATELIMITED (C macro)c.DRM_DEV_ERROR_RATELIMITEDhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hDRM_DEV_ERROR_RATELIMITEDh]j)}(hDRM_DEV_ERROR_RATELIMITEDh]j)}(hDRM_DEV_ERROR_RATELIMITEDh]j)}(hj4h]hDRM_DEV_ERROR_RATELIMITED}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhj6hhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhj2hhhjQhMubah}(h]j-ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjQhMhj/hhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hj/hhhjQhMubeh}(h]h ](j macroeh"]h$]h&]jIj jJjjjKjjjLjMjNuh1jhhhjRhNhNubh)}(h-``DRM_DEV_ERROR_RATELIMITED (dev, fmt, ...)``h]j)}(hjph]h)DRM_DEV_ERROR_RATELIMITED (dev, fmt, ...)}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjRhhubj[%)}(hRate limited error output. h]h)}(hRate limited error output.h]hRate limited error output.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubah}(h]h ]h"]h$]h&]uh1jZ%hjhMhjRhhubjP)}(hX**Parameters** ``dev`` device pointer ``fmt`` printf() like format string. ``...`` variable arguments **NOTE** this is deprecated in favor of drm_err_ratelimited() or dev_err_ratelimited(). **Description** Like DRM_ERROR() but won't flood the log.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubjp)}(hhh](ju)}(h``dev`` device pointer h](j{)}(h``dev``h]j)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(hdevice pointerh]hdevice pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(h%``fmt`` printf() like format string. h](j{)}(h``fmt``h]j)}(hjh]hfmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubj)}(hhh]h)}(hprintf() like format string.h]hprintf() like format string.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hj6h]h...}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj0ubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhKhjLubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jthjKhKhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**NOTE**h]jZ)}(hjqh]hNOTE}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjoubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubh)}(hNthis is deprecated in favor of drm_err_ratelimited() or dev_err_ratelimited().h]hNthis is deprecated in favor of drm_err_ratelimited() or dev_err_ratelimited().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubh)}(h)Like DRM_ERROR() but won't flood the log.h]h+Like DRM_ERROR() but won’t flood the log.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jDRM_DEV_DEBUG (C macro)c.DRM_DEV_DEBUGhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h DRM_DEV_DEBUGh]j)}(h DRM_DEV_DEBUGh]j)}(h DRM_DEV_DEBUGh]j)}(hjh]h DRM_DEV_DEBUG}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM;ubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhM;ubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhM;hjhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjhhhjhM;ubeh}(h]h ](j macroeh"]h$]h&]jIj jJj jKj jLjMjNuh1jhhhjRhNhNubh)}(h!``DRM_DEV_DEBUG (dev, fmt, ...)``h]j)}(hjh]hDRM_DEV_DEBUG (dev, fmt, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM=hjRhhubj[%)}(h"Debug output for generic drm code h]h)}(h!Debug output for generic drm codeh]h!Debug output for generic drm code}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM;hj)ubah}(h]h ]h"]h$]h&]uh1jZ%hj;hM;hjRhhubjP)}(h**Parameters** ``dev`` device pointer ``fmt`` printf() like format string. ``...`` variable arguments **NOTE** this is deprecated in favor of drm_dbg_core().h](h)}(h**Parameters**h]jZ)}(hjHh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjFubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM?hjBubjp)}(hhh](ju)}(h``dev`` device pointer h](j{)}(h``dev``h]j)}(hjgh]hdev}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM?hjaubj)}(hhh]h)}(hdevice pointerh]hdevice pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hM?hj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jthj|hM?hj^ubju)}(h%``fmt`` printf() like format string. h](j{)}(h``fmt``h]j)}(hjh]hfmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM@hjubj)}(hhh]h)}(hprintf() like format string.h]hprintf() like format string.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM@hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM@hj^ubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhj^ubeh}(h]h ]h"]h$]h&]uh1johjBubh)}(h**NOTE**h]jZ)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjBubh)}(h.this is deprecated in favor of drm_dbg_core().h]h.this is deprecated in favor of drm_dbg_core().}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhM=hjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jDRM_DEV_DEBUG_DRIVER (C macro)c.DRM_DEV_DEBUG_DRIVERhNtauh1jhjRhhhNhNubj)}(hhh](j)}(hDRM_DEV_DEBUG_DRIVERh]j)}(hDRM_DEV_DEBUG_DRIVERh]j)}(hDRM_DEV_DEBUG_DRIVERh]j)}(hjSh]hDRM_DEV_DEBUG_DRIVER}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjUhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMEubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjQhhhjphMEubah}(h]jLah ](j j!eh"]h$]h&]j%j&)j'huh1jhjphMEhjNhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjNhhhjphMEubeh}(h]h ](j macroeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubh)}(h(``DRM_DEV_DEBUG_DRIVER (dev, fmt, ...)``h]j)}(hjh]h$DRM_DEV_DEBUG_DRIVER (dev, fmt, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMGhjRhhubj[%)}(h4Debug output for vendor specific part of the driver h]h)}(h3Debug output for vendor specific part of the driverh]h3Debug output for vendor specific part of the driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMEhjubah}(h]h ]h"]h$]h&]uh1jZ%hjhMEhjRhhubjP)}(h**Parameters** ``dev`` device pointer ``fmt`` printf() like format string. ``...`` variable arguments **NOTE** this is deprecated in favor of drm_dbg() or dev_dbg().h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMIhjubjp)}(hhh](ju)}(h``dev`` device pointer h](j{)}(h``dev``h]j)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMIhjubj)}(hhh]h)}(hdevice pointerh]hdevice pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMIhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMIhjubju)}(h%``fmt`` printf() like format string. h](j{)}(h``fmt``h]j)}(hjh]hfmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMJhjubj)}(hhh]h)}(hprintf() like format string.h]hprintf() like format string.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMJhj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj1hMJhjubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hjUh]h...}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjOubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhKhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jthjjhKhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**NOTE**h]jZ)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubh)}(h6this is deprecated in favor of drm_dbg() or dev_dbg().h]h6this is deprecated in favor of drm_dbg() or dev_dbg().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMGhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jDRM_DEV_DEBUG_KMS (C macro)c.DRM_DEV_DEBUG_KMShNtauh1jhjRhhhNhNubj)}(hhh](j)}(hDRM_DEV_DEBUG_KMSh]j)}(hDRM_DEV_DEBUG_KMSh]j)}(hDRM_DEV_DEBUG_KMSh]j)}(hjh]hDRM_DEV_DEBUG_KMS}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMOubah}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMOubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMOhjhhubj))}(hhh]h}(h]h ]h"]h$]h&]uh1j(hjhhhjhMOubeh}(h]h ](j macroeh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubh)}(h%``DRM_DEV_DEBUG_KMS (dev, fmt, ...)``h]j)}(hj h]h!DRM_DEV_DEBUG_KMS (dev, fmt, ...)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMQhjRhhubj[%)}(h"Debug output for modesetting code h]h)}(h!Debug output for modesetting codeh]h!Debug output for modesetting code}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMOhj!ubah}(h]h ]h"]h$]h&]uh1jZ%hj3hMOhjRhhubjP)}(h**Parameters** ``dev`` device pointer ``fmt`` printf() like format string. ``...`` variable arguments **NOTE** this is deprecated in favor of drm_dbg_kms().h](h)}(h**Parameters**h]jZ)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj>ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMShj:ubjp)}(hhh](ju)}(h``dev`` device pointer h](j{)}(h``dev``h]j)}(hj_h]hdev}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMShjYubj)}(hhh]h)}(hdevice pointerh]hdevice pointer}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMShjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jthjthMShjVubju)}(h%``fmt`` printf() like format string. h](j{)}(h``fmt``h]j)}(hjh]hfmt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMThjubj)}(hhh]h)}(hprintf() like format string.h]hprintf() like format string.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMThjVubju)}(h``...`` variable arguments h](j{)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhjubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjVubeh}(h]h ]h"]h$]h&]uh1johj:ubh)}(h**NOTE**h]jZ)}(hj h]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj ubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhKhj:ubh)}(h-this is deprecated in favor of drm_dbg_kms().h]h-this is deprecated in favor of drm_dbg_kms().}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhZ/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:164: ./include/drm/drm_print.hhMQhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_puts (C function) c.drm_putshNtauh1jhjRhhhNhNubj)}(hhh](j)}(h6void drm_puts (struct drm_printer *p, const char *str)h]j)}(h5void drm_puts(struct drm_printer *p, const char *str)h](j')}(hvoidh]hvoid}(hjQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjMhhh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chKubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhj_hKubj)}(hdrm_putsh]j)}(hdrm_putsh]hdrm_puts}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjMhhhj_hKubj)}(h((struct drm_printer *p, const char *str)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjtsb c.drm_putsasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *strh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstrh]hstr}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjMhhhj_hKubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjIhhhj_hKubah}(h]jDah ](j j!eh"]h$]h&]j%j&)j'huh1jhj_hKhjFhhubj))}(hhh]h)}(h6print a const string to a :c:type:`drm_printer` streamh](hprint a const string to a }(hjmhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjwh]h drm_printer}(hjyhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]j c.drm_putsasbj drm_printeruh1hhj_hKhjmubh stream}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chKhjjhhubah}(h]h ]h"]h$]h&]uh1j(hjFhhhj_hKubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct drm_printer *p`` the :c:type:`drm` printer ``const char *str`` const string **Description** Allow :c:type:`drm_printer` types that have a constant string option to use it.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubjp)}(hhh](ju)}(h4``struct drm_printer *p`` the :c:type:`drm` printer h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chKhjubj)}(hhh]h)}(hthe :c:type:`drm` printerh](hthe }(hjhhhNhNubh)}(h :c:type:`drm`h]j)}(hjh]hdrm}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrmuh1hhjhKhjubh printer}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubju)}(h!``const char *str`` const string h](j{)}(h``const char *str``h]j)}(hj2h]hconst char *str}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chKhj,ubj)}(hhh]h)}(h const stringh]h const string}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhKhjHubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jthjGhKhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjmh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjkubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubh)}(hOAllow :c:type:`drm_printer` types that have a constant string option to use it.h](hAllow }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubh4 types that have a constant string option to use it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_printf (C function) c.drm_printfhNtauh1jhjRhhhNhNubj)}(hhh](j)}(h;void drm_printf (struct drm_printer *p, const char *f, ...)h]j)}(h:void drm_printf(struct drm_printer *p, const char *f, ...)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h drm_printfh]j)}(h drm_printfh]h drm_printf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMubj)}(h+(struct drm_printer *p, const char *f, ...)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetj2modnameN classnameNjj)}j]j)}jjsb c.drm_printfasbuh1hhjubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj ubj)}(h const char *fh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj ubj)}(h...h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjAjBuh1jhj ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjhhubj))}(hhh]h)}(h'print to a :c:type:`drm_printer` streamh](h print to a }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jL c.drm_printfasbj drm_printeruh1hhj_hKhjubh stream}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjhhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjHjKjHjLjMjNuh1jhhhjRhNhNubjP)}(h**Parameters** ``struct drm_printer *p`` the :c:type:`drm_printer` ``const char *f`` format string ``...`` variable argumentsh](h)}(h**Parameters**h]jZ)}(hjRh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjPubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjLubjp)}(hhh](ju)}(h4``struct drm_printer *p`` the :c:type:`drm_printer` h](j{)}(h``struct drm_printer *p``h]j)}(hjqh]hstruct drm_printer *p}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjkubj)}(hhh]h)}(hthe :c:type:`drm_printer`h](hthe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jthjhMhjhubju)}(h ``const char *f`` format string h](j{)}(h``const char *f``h]j)}(hjh]h const char *f}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubj)}(hhh]h)}(h format stringh]h format string}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjhubju)}(h``...`` variable argumentsh](j{)}(h``...``h]j)}(hjh]h...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubj)}(hhh]h)}(hvariable argumentsh]hvariable arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjhubeh}(h]h ]h"]h$]h&]uh1johjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_print_bits (C function)c.drm_print_bitshNtauh1jhjRhhhNhNubj)}(hhh](j)}(hovoid drm_print_bits (struct drm_printer *p, unsigned long value, const char * const bits[], unsigned int nbits)h]j)}(hmvoid drm_print_bits(struct drm_printer *p, unsigned long value, const char *const bits[], unsigned int nbits)h](j')}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjXhhh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhjjhMubj)}(hdrm_print_bitsh]j)}(hdrm_print_bitsh]hdrm_print_bits}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjXhhhjjhMubj)}(hZ(struct drm_printer *p, unsigned long value, const char *const bits[], unsigned int nbits)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.drm_print_bitsasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hunsigned long valueh](j')}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hlongh]hlong}(hj&hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalueh]hvalue}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *const bits[]h](j)}(hj)h]hconst}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj')}(hcharh]hchar}(hjvhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hbitsh]hbits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h[h]h[}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h]h]h]}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hunsigned int nbitsh](j')}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj')}(hinth]hint}(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnbitsh]hnbits}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjXhhhjjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjThhhjjhMubah}(h]jOah ](j j!eh"]h$]h&]j%j&)j'huh1jhjjhMhjQhhubj))}(hhh]h)}(h,print bits to a :c:type:`drm_printer` streamh](hprint bits to a }(hjQhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hj[h]h drm_printer}(hj]hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_print_bitsasbj drm_printeruh1hhj_hKhjQubh stream}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjNhhubah}(h]h ]h"]h$]h&]uh1j(hjQhhhjjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hX)**Parameters** ``struct drm_printer *p`` the :c:type:`drm_printer` ``unsigned long value`` field value. ``const char * const bits[]`` Array with bit names. ``unsigned int nbits`` Size of bit names array. **Description** Print bits (in flag fields for example) in human readable form.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM!hjubjp)}(hhh](ju)}(h4``struct drm_printer *p`` the :c:type:`drm_printer` h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM!hjubj)}(hhh]h)}(hthe :c:type:`drm_printer`h](hthe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhjhM!hjubeh}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhM!hjubju)}(h%``unsigned long value`` field value. h](j{)}(h``unsigned long value``h]j)}(hjh]hunsigned long value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM"hj ubj)}(hhh]h)}(h field value.h]h field value.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hM"hj(ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jthj'hM"hjubju)}(h4``const char * const bits[]`` Array with bit names. h](j{)}(h``const char * const bits[]``h]j)}(hjKh]hconst char * const bits[]}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM#hjEubj)}(hhh]h)}(hArray with bit names.h]hArray with bit names.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hM#hjaubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jthj`hM#hjubju)}(h0``unsigned int nbits`` Size of bit names array. h](j{)}(h``unsigned int nbits``h]j)}(hjh]hunsigned int nbits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM$hj~ubj)}(hhh]h)}(hSize of bit names array.h]hSize of bit names array.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM$hjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jthjhM$hjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chM&hjubh)}(h?Print bits (in flag fields for example) in human readable form.h]h?Print bits (in flag fields for example) in human readable form.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_print_regset32 (C function)c.drm_print_regset32hNtauh1jhjRhhhNhNubj)}(hhh](j)}(hPvoid drm_print_regset32 (struct drm_printer *p, struct debugfs_regset32 *regset)h]j)}(hOvoid drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset)h](j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjhhh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMoubj)}(hdrm_print_regset32h]j)}(hdrm_print_regset32h]hdrm_print_regset32}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjhhhjhMoubj)}(h8(struct drm_printer *p, struct debugfs_regset32 *regset)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjamodnameN classnameNjj)}j]j)}jj'sbc.drm_print_regset32asbuh1hhj=ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj9ubj)}(hstruct debugfs_regset32 *regseth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdebugfs_regset32h]hdebugfs_regset32}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j{c.drm_print_regset32asbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hregseth]hregset}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhj9ubeh}(h]h ]h"]h$]h&]jAjBuh1jhjhhhjhMoubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjhhhjhMoubah}(h]jah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMohjhhubj))}(hhh]h)}(hBprint the contents of registers to a :c:type:`drm_printer` stream.h](h%print the contents of registers to a }(hj3hhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hj=h]h drm_printer}(hj?hhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]j{c.drm_print_regset32asbj drm_printeruh1hhj_hKhj3ubh stream.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMohj0hhubah}(h]h ]h"]h$]h&]uh1j(hjhhhjhMoubeh}(h]h ](j functioneh"]h$]h&]jIj jJjsjKjsjLjMjNuh1jhhhjRhNhNubjP)}(hX**Parameters** ``struct drm_printer *p`` the :c:type:`drm` printer ``struct debugfs_regset32 *regset`` the list of registers to print. **Description** Often in driver debug, it's useful to be able to either capture the contents of registers in the steady state using debugfs or at specific points during operation. This lets the driver have a single list of registers for both.{h](h)}(h**Parameters**h]jZ)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj{ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMshjwubjp)}(hhh](ju)}(h4``struct drm_printer *p`` the :c:type:`drm` printer h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMrhjubj)}(hhh]h)}(hthe :c:type:`drm` printerh](hthe }(hjhhhNhNubh)}(h :c:type:`drm`h]j)}(hjh]hdrm}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjjdrmuh1hhjhMrhjubh printer}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMrhjubju)}(hD``struct debugfs_regset32 *regset`` the list of registers to print. h](j{)}(h#``struct debugfs_regset32 *regset``h]j)}(hjh]hstruct debugfs_regset32 *regset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMshjubj)}(hhh]h)}(hthe list of registers to print.h]hthe list of registers to print.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMshjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj hMshjubeh}(h]h ]h"]h$]h&]uh1johjwubh)}(h**Description**h]jZ)}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj1ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMuhjwubh)}(hOften in driver debug, it's useful to be able to either capture the contents of registers in the steady state using debugfs or at specific points during operation. This lets the driver have a single list of registers for both.h]hOften in driver debug, it’s useful to be able to either capture the contents of registers in the steady state using debugfs or at specific points during operation. This lets the driver have a single list of registers for both.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMuhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_print_hex_dump (C function)c.drm_print_hex_dumphNtauh1jhjRhhhNhNubj)}(hhh](j)}(h^void drm_print_hex_dump (struct drm_printer *p, const char *prefix, const u8 *buf, size_t len)h]j)}(h]void drm_print_hex_dump(struct drm_printer *p, const char *prefix, const u8 *buf, size_t len)h](j')}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjthhh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjthhhjhMubj)}(hdrm_print_hex_dumph]j)}(hdrm_print_hex_dumph]hdrm_print_hex_dump}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjthhhjhMubj)}(hF(struct drm_printer *p, const char *prefix, const u8 *buf, size_t len)h](j)}(hstruct drm_printer *ph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h drm_printerh]h drm_printer}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.drm_print_hex_dumpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(hconst char *prefixh](j)}(hj)h]hconst}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj')}(hcharh]hchar}(hjAhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hj"ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hprefixh]hprefix}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(h const u8 *bufh](j)}(hj)h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_print_hex_dumpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubj)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj reftypej reftargetjmodnameN classnameNjj)}j]jc.drm_print_hex_dumpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlenh]hlen}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjAjBuh1jhjubeh}(h]h ]h"]h$]h&]jAjBuh1jhjthhhjhMubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjphhhjhMubah}(h]jkah ](j j!eh"]h$]h&]j%j&)j'huh1jhjhMhjmhhubj))}(hhh]h)}(h2print a hex dump to a :c:type:`drm_printer` streamh](hprint a hex dump to a }(hjLhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjVh]h drm_printer}(hjXhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjj)}j]jc.drm_print_hex_dumpasbj drm_printeruh1hhj_hKhjLubh stream}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjIhhubah}(h]h ]h"]h$]h&]uh1j(hjmhhhjhMubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjRhNhNubjP)}(hX**Parameters** ``struct drm_printer *p`` The :c:type:`drm_printer` ``const char *prefix`` Prefix for each line, may be NULL for no prefix ``const u8 *buf`` Buffer to dump ``size_t len`` Length of buffer **Description** Print hex dump to :c:type:`drm_printer`, with 16 space-separated hex bytes per line, optionally with a prefix on each line. No separator is added after prefix.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubjp)}(hhh](ju)}(h4``struct drm_printer *p`` The :c:type:`drm_printer` h](j{)}(h``struct drm_printer *p``h]j)}(hjh]hstruct drm_printer *p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubj)}(hhh]h)}(hThe :c:type:`drm_printer`h](hThe }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubju)}(hG``const char *prefix`` Prefix for each line, may be NULL for no prefix h](j{)}(h``const char *prefix``h]j)}(hj h]hconst char *prefix}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubj)}(hhh]h)}(h/Prefix for each line, may be NULL for no prefixh]h/Prefix for each line, may be NULL for no prefix}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthj"hMhjubju)}(h!``const u8 *buf`` Buffer to dump h](j{)}(h``const u8 *buf``h]j)}(hjFh]h const u8 *buf}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhj@ubj)}(hhh]h)}(hBuffer to dumph]hBuffer to dump}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jthj[hMhjubju)}(h ``size_t len`` Length of buffer h](j{)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jzh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjyubj)}(hhh]h)}(hLength of bufferh]hLength of buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jthjhMhjubeh}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubh)}(hPrint hex dump to :c:type:`drm_printer`, with 16 space-separated hex bytes per line, optionally with a prefix on each line. No separator is added after prefix.h](hPrint hex dump to }(hjhhhNhNubh)}(h:c:type:`drm_printer`h]j)}(hjh]h drm_printer}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj drm_printeruh1hh^/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:167: ./drivers/gpu/drm/drm_print.chMhjubhx, with 16 space-separated hex bytes per line, optionally with a prefix on each line. No separator is added after prefix.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjRhhhNhNubeh}(h]printerah ]h"]printerah$]h&]uh1hhjAhhhhhKubh)}(hhh](h)}(h Utilitiesh]h Utilities}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hJMacros and inline functions that does not naturally belong in other placesh]hJMacros and inline functions that does not naturally belong in other places}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:173: ./include/drm/drm_util.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdrm_can_sleep (C function)c.drm_can_sleephNtauh1jhjhhhNhNubj)}(hhh](j)}(hbool drm_can_sleep (void)h]j)}(hbool drm_can_sleep(void)h](j')}(hj'h]hbool}(hjJhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjFhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK4ubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhjWhK4ubj)}(h drm_can_sleeph]j)}(h drm_can_sleeph]h drm_can_sleep}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jAjBuh1jhjFhhhjWhK4ubj)}(h(void)h]j)}(hvoidh]j')}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1j'hjubah}(h]h ]h"]h$]h&]noemphjAjBuh1jhj~ubah}(h]h ]h"]h$]h&]jAjBuh1jhjFhhhjWhK4ubeh}(h]h ]h"]h$]h&]jAjBjuh1jjjhjBhhhjWhK4ubah}(h]j=ah ](j j!eh"]h$]h&]j%j&)j'huh1jhjWhK4hj?hhubj))}(hhh]h)}(h'returns true if currently okay to sleeph]h'returns true if currently okay to sleep}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK4hjhhubah}(h]h ]h"]h$]h&]uh1j(hj?hhhjWhK4ubeh}(h]h ](j functioneh"]h$]h&]jIj jJjjKjjLjMjNuh1jhhhjhNhNubjP)}(hXK**Parameters** ``void`` no arguments **Description** This function shall not be used in new code. The check for running in atomic context may not work - see linux/preempt.h. FIXME: All users of drm_can_sleep should be removed (see todo.rst) **Return** False if kgdb is active, we are in atomic context or irqs are disabled.h](h)}(h**Parameters**h]jZ)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK8hjubjp)}(hhh]ju)}(h``void`` no arguments h](j{)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jzhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhKhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jthjhKhjubah}(h]h ]h"]h$]h&]uh1johjubh)}(h**Description**h]jZ)}(hj,h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj*ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhKhjubh)}(hxThis function shall not be used in new code. The check for running in atomic context may not work - see linux/preempt.h.h]hxThis function shall not be used in new code. The check for running in atomic context may not work - see linux/preempt.h.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK5hjubh)}(hBFIXME: All users of drm_can_sleep should be removed (see todo.rst)h]hBFIXME: All users of drm_can_sleep should be removed (see todo.rst)}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK8hjubh)}(h **Return**h]jZ)}(hjbh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jYhj`ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK:hjubh)}(hGFalse if kgdb is active, we are in atomic context or irqs are disabled.h]hGFalse if kgdb is active, we are in atomic context or irqs are disabled.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-internals:176: ./include/drm/drm_util.hhK;hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jOhjhhhNhNubeh}(h] utilitiesah ]h"] utilitiesah$]h&]uh1hhjAhhhhhKubeh}(h]misc-utilitiesah ]h"]misc utilitiesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Unit testingh]h Unit testing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hKUnith]hKUnit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hiKUnit (Kernel unit testing framework) provides a common framework for unit tests within the Linux kernel.h]hiKUnit (Kernel unit testing framework) provides a common framework for unit tests within the Linux kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hThis section covers the specifics for the DRM subsystem. For general information about KUnit, please refer to Documentation/dev-tools/kunit/start.rst.h]hThis section covers the specifics for the DRM subsystem. For general information about KUnit, please refer to Documentation/dev-tools/kunit/start.rst.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(hHow to run the tests?h]hHow to run the tests?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hIn order to facilitate running the test suite, a configuration file is present in ``drivers/gpu/drm/tests/.kunitconfig``. It can be used by ``kunit.py`` as follows:h](hRIn order to facilitate running the test suite, a configuration file is present in }(hjhhhNhNubj)}(h&``drivers/gpu/drm/tests/.kunitconfig``h]h"drivers/gpu/drm/tests/.kunitconfig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. It can be used by }(hjhhhNhNubj)}(h ``kunit.py``h]hkunit.py}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh as follows:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj2)}(h$ ./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests \ --kconfig_add CONFIG_VIRTIO_UML=y \ --kconfig_add CONFIG_UML_PCI_OVER_VIRTIO=yh]h$ ./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests \ --kconfig_add CONFIG_VIRTIO_UML=y \ --kconfig_add CONFIG_UML_PCI_OVER_VIRTIO=y}hjsbah}(h]h ]h"]h$]h&]jAjBjCjDbashjE}uh1j1hhhKhjhhubhnote)}(hThe configuration included in ``.kunitconfig`` should be as generic as possible. ``CONFIG_VIRTIO_UML`` and ``CONFIG_UML_PCI_OVER_VIRTIO`` are not included in it because they are only required for User Mode Linux.h]h)}(hThe configuration included in ``.kunitconfig`` should be as generic as possible. ``CONFIG_VIRTIO_UML`` and ``CONFIG_UML_PCI_OVER_VIRTIO`` are not included in it because they are only required for User Mode Linux.h](hThe configuration included in }(hj5hhhNhNubj)}(h``.kunitconfig``h]h .kunitconfig}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh# should be as generic as possible. }(hj5hhhNhNubj)}(h``CONFIG_VIRTIO_UML``h]hCONFIG_VIRTIO_UML}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh and }(hj5hhhNhNubj)}(h``CONFIG_UML_PCI_OVER_VIRTIO``h]hCONFIG_UML_PCI_OVER_VIRTIO}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubhK are not included in it because they are only required for User Mode Linux.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj1ubah}(h]h ]h"]h$]h&]uh1j/hjhhhhhNubeh}(h]how-to-run-the-testsah ]h"]how to run the tests?ah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hKUnit Coverage Rulesh]hKUnit Coverage Rules}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX*KUnit support is gradually added to the DRM framework and helpers. There's no general requirement for the framework and helpers to have KUnit tests at the moment. However, patches that are affecting a function or helper already covered by KUnit tests must provide tests if the change calls for one.h]hX,KUnit support is gradually added to the DRM framework and helpers. There’s no general requirement for the framework and helpers to have KUnit tests at the moment. However, patches that are affecting a function or helper already covered by KUnit tests must provide tests if the change calls for one.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]kunit-coverage-rulesah ]h"]kunit coverage rulesah$]h&]uh1hhjhhhhhKubeh}(h]kunitah ]h"]kunitah$]h&]uh1hhjhhhhhKubeh}(h] unit-testingah ]h"] unit testingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hLegacy Support Codeh]hLegacy Support Code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXaThe section very briefly covers some of the old legacy support code which is only used by old DRM drivers which have done a so-called shadow-attach to the underlying device instead of registering as a real driver. This also includes some of the old generic buffer management and command submission code. Do not use any of this in new and modern drivers.h]hXaThe section very briefly covers some of the old legacy support code which is only used by old DRM drivers which have done a so-called shadow-attach to the underlying device instead of registering as a real driver. This also includes some of the old generic buffer management and command submission code. Do not use any of this in new and modern drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(hLegacy Suspend/Resumeh]hLegacy Suspend/Resume}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX/The DRM core provides some suspend/resume code, but drivers wanting full suspend/resume support should provide save() and restore() functions. These are called at suspend, hibernate, or resume time, and should perform any state save or restore required by your device across suspend or hibernate states.h]hX/The DRM core provides some suspend/resume code, but drivers wanting full suspend/resume support should provide save() and restore() functions. These are called at suspend, hibernate, or resume time, and should perform any state save or restore required by your device across suspend or hibernate states.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXint (\*suspend) (struct drm_device \*, pm_message_t state); int (\*resume) (struct drm_device \*); Those are legacy suspend and resume methods which *only* work with the legacy shadow-attach driver registration functions. New driver should use the power management interface provided by their bus type (usually through the :c:type:`struct device_driver ` dev_pm_ops) and set these methods to NULL.h](hint (*suspend) (struct drm_device *, pm_message_t state); int (*resume) (struct drm_device *); Those are legacy suspend and resume methods which }(hjhhhNhNubju?)}(h*only*h]honly}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jt?hjubh work with the legacy shadow-attach driver registration functions. New driver should use the power management interface provided by their bus type (usually through the }(hjhhhNhNubh)}(h.:c:type:`struct device_driver `h]j)}(hjh]hstruct device_driver}(hjhhhNhNubah}(h]h ](j j c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftypetype refexplicitrefwarnjjj device_driveruh1hhhhKhjubh+ dev_pm_ops) and set these methods to NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]legacy-suspend-resumeah ]h"]legacy suspend/resumeah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hLegacy DMA Servicesh]hLegacy DMA Services}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhhhhhKubh)}(hwThis should cover how DMA mapping etc. is supported by the core. These functions are deprecated and should not be used.h]hwThis should cover how DMA mapping etc. is supported by the core. These functions are deprecated and should not be used.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjGhhubeh}(h]legacy-dma-servicesah ]h"]legacy dma servicesah$]h&]uh1hhjhhhhhKubeh}(h]legacy-support-codeah ]h"]legacy support codeah$]h&]uh1hhhhhhhhKubeh}(h] drm-internalsah ]h"] drm internalsah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}ji]jiasnameids}(j{jxjijijjjjjjj\jYj\MjYMjjjNjNjNjNjNjNjNjNjijij>j;j2jij1j.jjjj jjjjjjjjjjjsjpjDjAjkjhu nametypes}(j{jijjjj\j\MjjNjNjNjNjij>j2j1jjjjjjjjsjDjkuh}(jxhjihjjjjjjjYjjYMj_jjjjjjxj}jcjhjQjVj1j6j%j%j'j'j\)ja)j,j,j.j.jh0jm0j2j$2jA4jF4j5j5j7j7jT9jY9j;j;j?j?jBjBjhDjmDjEjFjHjHjKjKjNj_MjNjpMjNjNjNjNjijOjOjOjRjRjUjUjoXjtXjZjZj\j\j^j^jkajpajdjdjhjhj;jijijij.jijkjkjljljYpj^pj~j~jjjjjjj.j3jňjʈj9j>jjjSjXjjjjjjj1j6j j%jjjjjJjOjsjxjϭjԭjjAj jRjjjkjpjXj]jj#jйjչjLjQjֽj۽j|jjjjjj#j(jjjjj-j2jjjLjQjjjDjIjjjOjTjjjkjpjjj=jBjjjjjjjjjpjjAjjhjGu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]hsystem_message)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineKXsourcejuh1jhjubatransform_messages]j)}(hhh]h)}(hhh]h5Hyperlink target "drm-driver-fops" is not referenced.}hj'sbah}(h]h ]h"]h$]h&]uh1hhj$ubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKuh1juba transformerN include_log] decorationNhhub.