cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_client.h (5056B)


      1/* SPDX-License-Identifier: GPL-2.0 or MIT */
      2
      3#ifndef _DRM_CLIENT_H_
      4#define _DRM_CLIENT_H_
      5
      6#include <linux/iosys-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 iosys_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,
    160			   struct iosys_map *map);
    161void drm_client_buffer_vunmap(struct drm_client_buffer *buffer);
    162
    163int drm_client_modeset_create(struct drm_client_dev *client);
    164void drm_client_modeset_free(struct drm_client_dev *client);
    165int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height);
    166bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation);
    167int drm_client_modeset_check(struct drm_client_dev *client);
    168int drm_client_modeset_commit_locked(struct drm_client_dev *client);
    169int drm_client_modeset_commit(struct drm_client_dev *client);
    170int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);
    171
    172/**
    173 * drm_client_for_each_modeset() - Iterate over client modesets
    174 * @modeset: &drm_mode_set loop cursor
    175 * @client: DRM client
    176 */
    177#define drm_client_for_each_modeset(modeset, client) \
    178	for (({ lockdep_assert_held(&(client)->modeset_mutex); }), \
    179	     modeset = (client)->modesets; modeset->crtc; modeset++)
    180
    181/**
    182 * drm_client_for_each_connector_iter - connector_list iterator macro
    183 * @connector: &struct drm_connector pointer used as cursor
    184 * @iter: &struct drm_connector_list_iter
    185 *
    186 * This iterates the connectors that are useable for internal clients (excludes
    187 * writeback connectors).
    188 *
    189 * For more info see drm_for_each_connector_iter().
    190 */
    191#define drm_client_for_each_connector_iter(connector, iter) \
    192	drm_for_each_connector_iter(connector, iter) \
    193		if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
    194
    195void drm_client_debugfs_init(struct drm_minor *minor);
    196
    197#endif