xref: /openbmc/linux/include/drm/drm_auth.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
12197f55fSSam Ravnborg #ifndef _DRM_AUTH_H_
22197f55fSSam Ravnborg #define _DRM_AUTH_H_
32197f55fSSam Ravnborg 
43b96a0b1SDaniel Vetter /*
53b96a0b1SDaniel Vetter  * Internal Header for the Direct Rendering Manager
63b96a0b1SDaniel Vetter  *
73b96a0b1SDaniel Vetter  * Copyright 2016 Intel Corporation
83b96a0b1SDaniel Vetter  *
93b96a0b1SDaniel Vetter  * Author: Daniel Vetter <daniel.vetter@ffwll.ch>
103b96a0b1SDaniel Vetter  *
113b96a0b1SDaniel Vetter  * Permission is hereby granted, free of charge, to any person obtaining a
123b96a0b1SDaniel Vetter  * copy of this software and associated documentation files (the "Software"),
133b96a0b1SDaniel Vetter  * to deal in the Software without restriction, including without limitation
143b96a0b1SDaniel Vetter  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
153b96a0b1SDaniel Vetter  * and/or sell copies of the Software, and to permit persons to whom the
163b96a0b1SDaniel Vetter  * Software is furnished to do so, subject to the following conditions:
173b96a0b1SDaniel Vetter  *
183b96a0b1SDaniel Vetter  * The above copyright notice and this permission notice (including the next
193b96a0b1SDaniel Vetter  * paragraph) shall be included in all copies or substantial portions of the
203b96a0b1SDaniel Vetter  * Software.
213b96a0b1SDaniel Vetter  *
223b96a0b1SDaniel Vetter  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
233b96a0b1SDaniel Vetter  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
243b96a0b1SDaniel Vetter  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
253b96a0b1SDaniel Vetter  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
263b96a0b1SDaniel Vetter  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
273b96a0b1SDaniel Vetter  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
283b96a0b1SDaniel Vetter  * OTHER DEALINGS IN THE SOFTWARE.
293b96a0b1SDaniel Vetter  */
303b96a0b1SDaniel Vetter 
312197f55fSSam Ravnborg #include <linux/idr.h>
322197f55fSSam Ravnborg #include <linux/kref.h>
332197f55fSSam Ravnborg #include <linux/wait.h>
342197f55fSSam Ravnborg 
352197f55fSSam Ravnborg struct drm_file;
362197f55fSSam Ravnborg struct drm_hw_lock;
373b96a0b1SDaniel Vetter 
38d891b9c7SDaniel Vetter /*
39d891b9c7SDaniel Vetter  * Legacy DRI1 locking data structure. Only here instead of in drm_legacy.h for
40d891b9c7SDaniel Vetter  * include ordering reasons.
41d891b9c7SDaniel Vetter  *
42d891b9c7SDaniel Vetter  * DO NOT USE.
43d891b9c7SDaniel Vetter  */
44d891b9c7SDaniel Vetter struct drm_lock_data {
45d891b9c7SDaniel Vetter 	struct drm_hw_lock *hw_lock;
46d891b9c7SDaniel Vetter 	struct drm_file *file_priv;
47d891b9c7SDaniel Vetter 	wait_queue_head_t lock_queue;
48d891b9c7SDaniel Vetter 	unsigned long lock_time;
49d891b9c7SDaniel Vetter 	spinlock_t spinlock;
50d891b9c7SDaniel Vetter 	uint32_t kernel_waiters;
51d891b9c7SDaniel Vetter 	uint32_t user_waiters;
52d891b9c7SDaniel Vetter 	int idle_has_lock;
53d891b9c7SDaniel Vetter };
54d891b9c7SDaniel Vetter 
553b96a0b1SDaniel Vetter /**
563b96a0b1SDaniel Vetter  * struct drm_master - drm master structure
573b96a0b1SDaniel Vetter  *
583b96a0b1SDaniel Vetter  * @refcount: Refcount for this master object.
593b96a0b1SDaniel Vetter  * @dev: Link back to the DRM device
603b96a0b1SDaniel Vetter  * @driver_priv: Pointer to driver-private information.
613b96a0b1SDaniel Vetter  *
623b96a0b1SDaniel Vetter  * Note that master structures are only relevant for the legacy/primary device
633b96a0b1SDaniel Vetter  * nodes, hence there can only be one per device, not one per drm_minor.
643b96a0b1SDaniel Vetter  */
653b96a0b1SDaniel Vetter struct drm_master {
663b96a0b1SDaniel Vetter 	struct kref refcount;
673b96a0b1SDaniel Vetter 	struct drm_device *dev;
685acc614aSDaniel Vetter 	/**
69ef40cbf9SDaniel Vetter 	 * @unique: Unique identifier: e.g. busid. Protected by
70ef40cbf9SDaniel Vetter 	 * &drm_device.master_mutex.
715acc614aSDaniel Vetter 	 */
723b96a0b1SDaniel Vetter 	char *unique;
735acc614aSDaniel Vetter 	/**
74ef40cbf9SDaniel Vetter 	 * @unique_len: Length of unique field. Protected by
75ef40cbf9SDaniel Vetter 	 * &drm_device.master_mutex.
765acc614aSDaniel Vetter 	 */
773b96a0b1SDaniel Vetter 	int unique_len;
785acc614aSDaniel Vetter 	/**
79ef40cbf9SDaniel Vetter 	 * @magic_map: Map of used authentication tokens. Protected by
80ef40cbf9SDaniel Vetter 	 * &drm_device.master_mutex.
815acc614aSDaniel Vetter 	 */
823b96a0b1SDaniel Vetter 	struct idr magic_map;
833b96a0b1SDaniel Vetter 	void *driver_priv;
842ed077e4SKeith Packard 
85*d793b8f7SDesmond Cheong Zhi Xi 	/**
86*d793b8f7SDesmond Cheong Zhi Xi 	 * @lessor:
87*d793b8f7SDesmond Cheong Zhi Xi 	 *
88*d793b8f7SDesmond Cheong Zhi Xi 	 * Lease grantor, only set if this &struct drm_master represents a
89*d793b8f7SDesmond Cheong Zhi Xi 	 * lessee holding a lease of objects from @lessor. Full owners of the
90*d793b8f7SDesmond Cheong Zhi Xi 	 * device have this set to NULL.
91*d793b8f7SDesmond Cheong Zhi Xi 	 *
92*d793b8f7SDesmond Cheong Zhi Xi 	 * The lessor does not change once it's set in drm_lease_create(), and
93*d793b8f7SDesmond Cheong Zhi Xi 	 * each lessee holds a reference to its lessor that it releases upon
94*d793b8f7SDesmond Cheong Zhi Xi 	 * being destroyed in drm_lease_destroy().
95*d793b8f7SDesmond Cheong Zhi Xi 	 *
96*d793b8f7SDesmond Cheong Zhi Xi 	 * See also the :ref:`section on display resource leasing
97*d793b8f7SDesmond Cheong Zhi Xi 	 * <drm_leasing>`.
982ed077e4SKeith Packard 	 */
992ed077e4SKeith Packard 	struct drm_master *lessor;
100*d793b8f7SDesmond Cheong Zhi Xi 
101*d793b8f7SDesmond Cheong Zhi Xi 	/**
102*d793b8f7SDesmond Cheong Zhi Xi 	 * @lessee_id:
103*d793b8f7SDesmond Cheong Zhi Xi 	 *
104*d793b8f7SDesmond Cheong Zhi Xi 	 * ID for lessees. Owners (i.e. @lessor is NULL) always have ID 0.
105*d793b8f7SDesmond Cheong Zhi Xi 	 * Protected by &drm_device.mode_config's &drm_mode_config.idr_mutex.
106*d793b8f7SDesmond Cheong Zhi Xi 	 */
1072ed077e4SKeith Packard 	int	lessee_id;
108*d793b8f7SDesmond Cheong Zhi Xi 
109*d793b8f7SDesmond Cheong Zhi Xi 	/**
110*d793b8f7SDesmond Cheong Zhi Xi 	 * @lessee_list:
111*d793b8f7SDesmond Cheong Zhi Xi 	 *
112*d793b8f7SDesmond Cheong Zhi Xi 	 * List entry of lessees of @lessor, where they are linked to @lessees.
113*d793b8f7SDesmond Cheong Zhi Xi 	 * Not used for owners. Protected by &drm_device.mode_config's
114*d793b8f7SDesmond Cheong Zhi Xi 	 * &drm_mode_config.idr_mutex.
115*d793b8f7SDesmond Cheong Zhi Xi 	 */
1162ed077e4SKeith Packard 	struct list_head lessee_list;
117*d793b8f7SDesmond Cheong Zhi Xi 
118*d793b8f7SDesmond Cheong Zhi Xi 	/**
119*d793b8f7SDesmond Cheong Zhi Xi 	 * @lessees:
120*d793b8f7SDesmond Cheong Zhi Xi 	 *
121*d793b8f7SDesmond Cheong Zhi Xi 	 * List of drm_masters leasing from this one. Protected by
122*d793b8f7SDesmond Cheong Zhi Xi 	 * &drm_device.mode_config's &drm_mode_config.idr_mutex.
123*d793b8f7SDesmond Cheong Zhi Xi 	 *
124*d793b8f7SDesmond Cheong Zhi Xi 	 * This list is empty if no leases have been granted, or if all lessees
125*d793b8f7SDesmond Cheong Zhi Xi 	 * have been destroyed. Since lessors are referenced by all their
126*d793b8f7SDesmond Cheong Zhi Xi 	 * lessees, this master cannot be destroyed unless the list is empty.
127*d793b8f7SDesmond Cheong Zhi Xi 	 */
1282ed077e4SKeith Packard 	struct list_head lessees;
129*d793b8f7SDesmond Cheong Zhi Xi 
130*d793b8f7SDesmond Cheong Zhi Xi 	/**
131*d793b8f7SDesmond Cheong Zhi Xi 	 * @leases:
132*d793b8f7SDesmond Cheong Zhi Xi 	 *
133*d793b8f7SDesmond Cheong Zhi Xi 	 * Objects leased to this drm_master. Protected by
134*d793b8f7SDesmond Cheong Zhi Xi 	 * &drm_device.mode_config's &drm_mode_config.idr_mutex.
135*d793b8f7SDesmond Cheong Zhi Xi 	 *
136*d793b8f7SDesmond Cheong Zhi Xi 	 * Objects are leased all together in drm_lease_create(), and are
137*d793b8f7SDesmond Cheong Zhi Xi 	 * removed all together when the lease is revoked.
138*d793b8f7SDesmond Cheong Zhi Xi 	 */
1392ed077e4SKeith Packard 	struct idr leases;
140*d793b8f7SDesmond Cheong Zhi Xi 
141*d793b8f7SDesmond Cheong Zhi Xi 	/**
142*d793b8f7SDesmond Cheong Zhi Xi 	 * @lessee_idr:
143*d793b8f7SDesmond Cheong Zhi Xi 	 *
144*d793b8f7SDesmond Cheong Zhi Xi 	 * All lessees under this owner (only used where @lessor is NULL).
145*d793b8f7SDesmond Cheong Zhi Xi 	 * Protected by &drm_device.mode_config's &drm_mode_config.idr_mutex.
146*d793b8f7SDesmond Cheong Zhi Xi 	 */
1472ed077e4SKeith Packard 	struct idr lessee_idr;
148ee22f763SDave Airlie 	/* private: */
149ee22f763SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
150ee22f763SDave Airlie 	struct drm_lock_data lock;
151ee22f763SDave Airlie #endif
1523b96a0b1SDaniel Vetter };
1533b96a0b1SDaniel Vetter 
1543b96a0b1SDaniel Vetter struct drm_master *drm_master_get(struct drm_master *master);
15556f0729aSDesmond Cheong Zhi Xi struct drm_master *drm_file_get_master(struct drm_file *file_priv);
1563b96a0b1SDaniel Vetter void drm_master_put(struct drm_master **master);
1573b96a0b1SDaniel Vetter bool drm_is_current_master(struct drm_file *fpriv);
1583b96a0b1SDaniel Vetter 
1592ed077e4SKeith Packard struct drm_master *drm_master_create(struct drm_device *dev);
1602ed077e4SKeith Packard 
1613b96a0b1SDaniel Vetter #endif
162