drm: Introduce per-device driver_features
We wish to control certain driver_features flags on a per-device basis while still sharing a single drm_driver instance across all the devices. To that end introduce device.driver_features. By default it will be set to ~0 to not impose any limits beyond driver.driver_features. Drivers can then clear specific flags in the per-device bitmask to limit the capabilities of the device. An alternative approach would be to copy the driver_features from the driver into the device in drm_dev_init(), however that would require verifying that no driver is currently changing driver.driver_features after drm_dev_init(). Hence the ~0 apporach was easier. Ideally we'd also make drm_driver const but there is plenty of code left that wants to mutate it (eg. various vfunc assignments). We'll need to fix all that up before we can make it const. And while at it fix up the type of the feature flag passed to drm_core_check_feature(). v2: Streamline the && vs. & (Chris) s/int/u32/ in drm_core_check_feature() args Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180913131622.17690-1-ville.syrjala@linux.intel.com Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
169cc4c7a1
commit
18ace11f87
|
@ -506,6 +506,9 @@ int drm_dev_init(struct drm_device *dev,
|
||||||
dev->dev = parent;
|
dev->dev = parent;
|
||||||
dev->driver = driver;
|
dev->driver = driver;
|
||||||
|
|
||||||
|
/* no per-device feature limits by default */
|
||||||
|
dev->driver_features = ~0u;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&dev->filelist);
|
INIT_LIST_HEAD(&dev->filelist);
|
||||||
INIT_LIST_HEAD(&dev->filelist_internal);
|
INIT_LIST_HEAD(&dev->filelist_internal);
|
||||||
INIT_LIST_HEAD(&dev->clientlist);
|
INIT_LIST_HEAD(&dev->clientlist);
|
||||||
|
|
|
@ -45,6 +45,16 @@ struct drm_device {
|
||||||
/* currently active master for this device. Protected by master_mutex */
|
/* currently active master for this device. Protected by master_mutex */
|
||||||
struct drm_master *master;
|
struct drm_master *master;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @driver_features: per-device driver features
|
||||||
|
*
|
||||||
|
* Drivers can clear specific flags here to disallow
|
||||||
|
* certain features on a per-device basis while still
|
||||||
|
* sharing a single &struct drm_driver instance across
|
||||||
|
* all devices.
|
||||||
|
*/
|
||||||
|
u32 driver_features;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @unplugged:
|
* @unplugged:
|
||||||
*
|
*
|
||||||
|
|
|
@ -653,14 +653,14 @@ static inline bool drm_dev_is_unplugged(struct drm_device *dev)
|
||||||
* @dev: DRM device to check
|
* @dev: DRM device to check
|
||||||
* @feature: feature flag
|
* @feature: feature flag
|
||||||
*
|
*
|
||||||
* This checks @dev for driver features, see &drm_driver.driver_features and the
|
* This checks @dev for driver features, see &drm_driver.driver_features,
|
||||||
* various DRIVER_\* flags.
|
* &drm_device.driver_features, and the various DRIVER_\* flags.
|
||||||
*
|
*
|
||||||
* Returns true if the @feature is supported, false otherwise.
|
* Returns true if the @feature is supported, false otherwise.
|
||||||
*/
|
*/
|
||||||
static inline bool drm_core_check_feature(struct drm_device *dev, int feature)
|
static inline bool drm_core_check_feature(struct drm_device *dev, u32 feature)
|
||||||
{
|
{
|
||||||
return dev->driver->driver_features & feature;
|
return dev->driver->driver_features & dev->driver_features & feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue