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