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