linux/include/drm/drm_client.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3#ifndef _DRM_CLIENT_H_
   4#define _DRM_CLIENT_H_
   5
   6#include <linux/lockdep.h>
   7#include <linux/mutex.h>
   8#include <linux/types.h>
   9
  10#include <drm/drm_connector.h>
  11#include <drm/drm_crtc.h>
  12
  13struct drm_client_dev;
  14struct drm_device;
  15struct drm_file;
  16struct drm_framebuffer;
  17struct drm_gem_object;
  18struct drm_minor;
  19struct module;
  20
  21/**
  22 * struct drm_client_funcs - DRM client callbacks
  23 */
  24struct drm_client_funcs {
  25        /**
  26         * @owner: The module owner
  27         */
  28        struct module *owner;
  29
  30        /**
  31         * @unregister:
  32         *
  33         * Called when &drm_device is unregistered. The client should respond by
  34         * releasing its resources using drm_client_release().
  35         *
  36         * This callback is optional.
  37         */
  38        void (*unregister)(struct drm_client_dev *client);
  39
  40        /**
  41         * @restore:
  42         *
  43         * Called on drm_lastclose(). The first client instance in the list that
  44         * returns zero gets the privilege to restore and no more clients are
  45         * called. This callback is not called after @unregister has been called.
  46         *
  47         * This callback is optional.
  48         */
  49        int (*restore)(struct drm_client_dev *client);
  50
  51        /**
  52         * @hotplug:
  53         *
  54         * Called on drm_kms_helper_hotplug_event().
  55         * This callback is not called after @unregister has been called.
  56         *
  57         * This callback is optional.
  58         */
  59        int (*hotplug)(struct drm_client_dev *client);
  60};
  61
  62/**
  63 * struct drm_client_dev - DRM client instance
  64 */
  65struct drm_client_dev {
  66        /**
  67         * @dev: DRM device
  68         */
  69        struct drm_device *dev;
  70
  71        /**
  72         * @name: Name of the client.
  73         */
  74        const char *name;
  75
  76        /**
  77         * @list:
  78         *
  79         * List of all clients of a DRM device, linked into
  80         * &drm_device.clientlist. Protected by &drm_device.clientlist_mutex.
  81         */
  82        struct list_head list;
  83
  84        /**
  85         * @funcs: DRM client functions (optional)
  86         */
  87        const struct drm_client_funcs *funcs;
  88
  89        /**
  90         * @file: DRM file
  91         */
  92        struct drm_file *file;
  93
  94        /**
  95         * @modeset_mutex: Protects @modesets.
  96         */
  97        struct mutex modeset_mutex;
  98
  99        /**
 100         * @modesets: CRTC configurations
 101         */
 102        struct drm_mode_set *modesets;
 103};
 104
 105int drm_client_init(struct drm_device *dev, struct drm_client_dev *client,
 106                    const char *name, const struct drm_client_funcs *funcs);
 107void drm_client_release(struct drm_client_dev *client);
 108void drm_client_register(struct drm_client_dev *client);
 109
 110void drm_client_dev_unregister(struct drm_device *dev);
 111void drm_client_dev_hotplug(struct drm_device *dev);
 112void drm_client_dev_restore(struct drm_device *dev);
 113
 114/**
 115 * struct drm_client_buffer - DRM client buffer
 116 */
 117struct drm_client_buffer {
 118        /**
 119         * @client: DRM client
 120         */
 121        struct drm_client_dev *client;
 122
 123        /**
 124         * @handle: Buffer handle
 125         */
 126        u32 handle;
 127
 128        /**
 129         * @pitch: Buffer pitch
 130         */
 131        u32 pitch;
 132
 133        /**
 134         * @gem: GEM object backing this buffer
 135         */
 136        struct drm_gem_object *gem;
 137
 138        /**
 139         * @vaddr: Virtual address for the buffer
 140         */
 141        void *vaddr;
 142
 143        /**
 144         * @fb: DRM framebuffer
 145         */
 146        struct drm_framebuffer *fb;
 147};
 148
 149struct drm_client_buffer *
 150drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
 151void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
 152void *drm_client_buffer_vmap(struct drm_client_buffer *buffer);
 153void drm_client_buffer_vunmap(struct drm_client_buffer *buffer);
 154
 155int drm_client_modeset_create(struct drm_client_dev *client);
 156void drm_client_modeset_free(struct drm_client_dev *client);
 157int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height);
 158bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation);
 159int drm_client_modeset_commit_force(struct drm_client_dev *client);
 160int drm_client_modeset_commit(struct drm_client_dev *client);
 161int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);
 162
 163/**
 164 * drm_client_for_each_modeset() - Iterate over client modesets
 165 * @modeset: &drm_mode_set loop cursor
 166 * @client: DRM client
 167 */
 168#define drm_client_for_each_modeset(modeset, client) \
 169        for (({ lockdep_assert_held(&(client)->modeset_mutex); }), \
 170             modeset = (client)->modesets; modeset->crtc; modeset++)
 171
 172/**
 173 * drm_client_for_each_connector_iter - connector_list iterator macro
 174 * @connector: &struct drm_connector pointer used as cursor
 175 * @iter: &struct drm_connector_list_iter
 176 *
 177 * This iterates the connectors that are useable for internal clients (excludes
 178 * writeback connectors).
 179 *
 180 * For more info see drm_for_each_connector_iter().
 181 */
 182#define drm_client_for_each_connector_iter(connector, iter) \
 183        drm_for_each_connector_iter(connector, iter) \
 184                if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
 185
 186int drm_client_debugfs_init(struct drm_minor *minor);
 187
 188#endif
 189