aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch
new file mode 100644
index 00000000..fd37f8a4
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0712-drm-Introduce-per-device-driver_features.patch
@@ -0,0 +1,104 @@
+From 159837a24a804aa0dc55a1150d9a99f4b8bb5b13 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
+Date: Thu, 13 Sep 2018 16:16:21 +0300
+Subject: [PATCH 0712/2940] drm: Introduce per-device driver_features
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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>
+---
+ drivers/gpu/drm/drm_drv.c | 3 +++
+ include/drm/drm_device.h | 10 ++++++++++
+ include/drm/drm_drv.h | 8 ++++----
+ 3 files changed, 17 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
+index ea4941da9b27..36e8e9cbec52 100644
+--- a/drivers/gpu/drm/drm_drv.c
++++ b/drivers/gpu/drm/drm_drv.c
+@@ -506,6 +506,9 @@ int drm_dev_init(struct drm_device *dev,
+ dev->dev = parent;
+ dev->driver = driver;
+
++ /* no per-device feature limits by default */
++ dev->driver_features = ~0u;
++
+ INIT_LIST_HEAD(&dev->filelist);
+ INIT_LIST_HEAD(&dev->filelist_internal);
+ INIT_LIST_HEAD(&dev->clientlist);
+diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
+index f9c6e0e3aec7..42411b3ea0c8 100644
+--- a/include/drm/drm_device.h
++++ b/include/drm/drm_device.h
+@@ -45,6 +45,16 @@ struct drm_device {
+ /* currently active master for this device. Protected by master_mutex */
+ 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:
+ *
+diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
+index 152b3055e9e1..001836f7493a 100644
+--- a/include/drm/drm_drv.h
++++ b/include/drm/drm_drv.h
+@@ -654,14 +654,14 @@ static inline bool drm_dev_is_unplugged(struct drm_device *dev)
+ * @dev: DRM device to check
+ * @feature: feature flag
+ *
+- * This checks @dev for driver features, see &drm_driver.driver_features and the
+- * various DRIVER_\* flags.
++ * This checks @dev for driver features, see &drm_driver.driver_features,
++ * &drm_device.driver_features, and the various DRIVER_\* flags.
+ *
+ * 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;
+ }
+
+ /**
+--
+2.17.1
+