root/sys/dev/drm/include/drm/drm_client.h
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _DRM_CLIENT_H_
#define _DRM_CLIENT_H_

#include <linux/types.h>

struct drm_client_dev;
struct drm_device;
struct drm_file;
struct drm_framebuffer;
struct drm_gem_object;
struct drm_minor;
struct module;

/**
 * struct drm_client_funcs - DRM client callbacks
 */
struct drm_client_funcs {
        /**
         * @owner: The module owner
         */
        struct module *owner;

        /**
         * @unregister:
         *
         * Called when &drm_device is unregistered. The client should respond by
         * releasing it's resources using drm_client_release().
         *
         * This callback is optional.
         */
        void (*unregister)(struct drm_client_dev *client);

        /**
         * @restore:
         *
         * Called on drm_lastclose(). The first client instance in the list that
         * returns zero gets the privilege to restore and no more clients are
         * called. This callback is not called after @unregister has been called.
         *
         * This callback is optional.
         */
        int (*restore)(struct drm_client_dev *client);

        /**
         * @hotplug:
         *
         * Called on drm_kms_helper_hotplug_event().
         * This callback is not called after @unregister has been called.
         *
         * This callback is optional.
         */
        int (*hotplug)(struct drm_client_dev *client);
};

/**
 * struct drm_client_dev - DRM client instance
 */
struct drm_client_dev {
        /**
         * @dev: DRM device
         */
        struct drm_device *dev;

        /**
         * @name: Name of the client.
         */
        const char *name;

        /**
         * @list:
         *
         * List of all clients of a DRM device, linked into
         * &drm_device.clientlist. Protected by &drm_device.clientlist_mutex.
         */
        struct list_head list;

        /**
         * @funcs: DRM client functions (optional)
         */
        const struct drm_client_funcs *funcs;

        /**
         * @file: DRM file
         */
        struct drm_file *file;
};

#if 0 /* implementation GPL'ed until 5.7 */
int drm_client_init(struct drm_device *dev, struct drm_client_dev *client,
                    const char *name, const struct drm_client_funcs *funcs);
void drm_client_release(struct drm_client_dev *client);
void drm_client_add(struct drm_client_dev *client);

void drm_client_dev_unregister(struct drm_device *dev);
void drm_client_dev_hotplug(struct drm_device *dev);
void drm_client_dev_restore(struct drm_device *dev);
#endif

/**
 * struct drm_client_buffer - DRM client buffer
 */
struct drm_client_buffer {
        /**
         * @client: DRM client
         */
        struct drm_client_dev *client;

        /**
         * @handle: Buffer handle
         */
        u32 handle;

        /**
         * @pitch: Buffer pitch
         */
        u32 pitch;

        /**
         * @gem: GEM object backing this buffer
         */
        struct drm_gem_object *gem;

        /**
         * @vaddr: Virtual address for the buffer
         */
        void *vaddr;

        /**
         * @fb: DRM framebuffer
         */
        struct drm_framebuffer *fb;
};

#if 0 /* implementation GPL'ed until 5.7 */
struct drm_client_buffer *
drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);

int drm_client_debugfs_init(struct drm_minor *minor);
#endif

#endif