mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-29 04:09:39 +00:00
drm: Turn off Legacy Context Functions
The context functions are not used by the i915 driver and should not be used by modeset drivers. These driver functions contain several bugs and security holes. This change makes these functions optional can be turned on by a setting, they are turned off by default for modeset driver with the exception of the nouvea driver that may require them with an old version of libdrm. The previous attempt was commit7c510133d9
Author: Daniel Vetter <daniel.vetter@ffwll.ch> Date: Thu Aug 8 15:41:21 2013 +0200 drm: mark context support as a legacy subsystem but this had to be reverted commitc21eb21cb5
Author: Dave Airlie <airlied@redhat.com> Date: Fri Sep 20 08:32:59 2013 +1000 Revert "drm: mark context support as a legacy subsystem" v2: remove returns from void function, and formatting (Daniel Vetter) v3: - s/Nova/nouveau/ in the commit message, and add references to the previous attempts - drop the part touching the drm hw lock, that should be a separate patch. Signed-off-by: Peter Antoine <peter.antoine@intel.com> (v2) Cc: Peter Antoine <peter.antoine@intel.com> (v2) Reviewed-by: Peter Antoine <peter.antoine@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
8b72ce158c
commit
0e975980d4
4 changed files with 70 additions and 17 deletions
|
@ -53,6 +53,10 @@ struct drm_ctx_list {
|
||||||
*/
|
*/
|
||||||
void drm_legacy_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
|
void drm_legacy_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
|
||||||
{
|
{
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
idr_remove(&dev->ctx_idr, ctx_handle);
|
idr_remove(&dev->ctx_idr, ctx_handle);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
@ -87,6 +91,10 @@ static int drm_legacy_ctxbitmap_next(struct drm_device * dev)
|
||||||
*/
|
*/
|
||||||
int drm_legacy_ctxbitmap_init(struct drm_device * dev)
|
int drm_legacy_ctxbitmap_init(struct drm_device * dev)
|
||||||
{
|
{
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
idr_init(&dev->ctx_idr);
|
idr_init(&dev->ctx_idr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +109,10 @@ int drm_legacy_ctxbitmap_init(struct drm_device * dev)
|
||||||
*/
|
*/
|
||||||
void drm_legacy_ctxbitmap_cleanup(struct drm_device * dev)
|
void drm_legacy_ctxbitmap_cleanup(struct drm_device * dev)
|
||||||
{
|
{
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
idr_destroy(&dev->ctx_idr);
|
idr_destroy(&dev->ctx_idr);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
|
@ -119,6 +131,10 @@ void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file)
|
||||||
{
|
{
|
||||||
struct drm_ctx_list *pos, *tmp;
|
struct drm_ctx_list *pos, *tmp;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&dev->ctxlist_mutex);
|
mutex_lock(&dev->ctxlist_mutex);
|
||||||
|
|
||||||
list_for_each_entry_safe(pos, tmp, &dev->ctxlist, head) {
|
list_for_each_entry_safe(pos, tmp, &dev->ctxlist, head) {
|
||||||
|
@ -161,6 +177,10 @@ int drm_legacy_getsareactx(struct drm_device *dev, void *data,
|
||||||
struct drm_local_map *map;
|
struct drm_local_map *map;
|
||||||
struct drm_map_list *_entry;
|
struct drm_map_list *_entry;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
map = idr_find(&dev->ctx_idr, request->ctx_id);
|
map = idr_find(&dev->ctx_idr, request->ctx_id);
|
||||||
|
@ -205,6 +225,10 @@ int drm_legacy_setsareactx(struct drm_device *dev, void *data,
|
||||||
struct drm_local_map *map = NULL;
|
struct drm_local_map *map = NULL;
|
||||||
struct drm_map_list *r_list = NULL;
|
struct drm_map_list *r_list = NULL;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
list_for_each_entry(r_list, &dev->maplist, head) {
|
list_for_each_entry(r_list, &dev->maplist, head) {
|
||||||
if (r_list->map
|
if (r_list->map
|
||||||
|
@ -305,6 +329,10 @@ int drm_legacy_resctx(struct drm_device *dev, void *data,
|
||||||
struct drm_ctx ctx;
|
struct drm_ctx ctx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (res->count >= DRM_RESERVED_CONTEXTS) {
|
if (res->count >= DRM_RESERVED_CONTEXTS) {
|
||||||
memset(&ctx, 0, sizeof(ctx));
|
memset(&ctx, 0, sizeof(ctx));
|
||||||
for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
|
for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
|
||||||
|
@ -335,6 +363,10 @@ int drm_legacy_addctx(struct drm_device *dev, void *data,
|
||||||
struct drm_ctx_list *ctx_entry;
|
struct drm_ctx_list *ctx_entry;
|
||||||
struct drm_ctx *ctx = data;
|
struct drm_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ctx->handle = drm_legacy_ctxbitmap_next(dev);
|
ctx->handle = drm_legacy_ctxbitmap_next(dev);
|
||||||
if (ctx->handle == DRM_KERNEL_CONTEXT) {
|
if (ctx->handle == DRM_KERNEL_CONTEXT) {
|
||||||
/* Skip kernel's context and get a new one. */
|
/* Skip kernel's context and get a new one. */
|
||||||
|
@ -378,6 +410,10 @@ int drm_legacy_getctx(struct drm_device *dev, void *data,
|
||||||
{
|
{
|
||||||
struct drm_ctx *ctx = data;
|
struct drm_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* This is 0, because we don't handle any context flags */
|
/* This is 0, because we don't handle any context flags */
|
||||||
ctx->flags = 0;
|
ctx->flags = 0;
|
||||||
|
|
||||||
|
@ -400,6 +436,10 @@ int drm_legacy_switchctx(struct drm_device *dev, void *data,
|
||||||
{
|
{
|
||||||
struct drm_ctx *ctx = data;
|
struct drm_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
DRM_DEBUG("%d\n", ctx->handle);
|
DRM_DEBUG("%d\n", ctx->handle);
|
||||||
return drm_context_switch(dev, dev->last_context, ctx->handle);
|
return drm_context_switch(dev, dev->last_context, ctx->handle);
|
||||||
}
|
}
|
||||||
|
@ -420,6 +460,10 @@ int drm_legacy_newctx(struct drm_device *dev, void *data,
|
||||||
{
|
{
|
||||||
struct drm_ctx *ctx = data;
|
struct drm_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
DRM_DEBUG("%d\n", ctx->handle);
|
DRM_DEBUG("%d\n", ctx->handle);
|
||||||
drm_context_switch_complete(dev, file_priv, ctx->handle);
|
drm_context_switch_complete(dev, file_priv, ctx->handle);
|
||||||
|
|
||||||
|
@ -442,6 +486,10 @@ int drm_legacy_rmctx(struct drm_device *dev, void *data,
|
||||||
{
|
{
|
||||||
struct drm_ctx *ctx = data;
|
struct drm_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
|
||||||
|
drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
DRM_DEBUG("%d\n", ctx->handle);
|
DRM_DEBUG("%d\n", ctx->handle);
|
||||||
if (ctx->handle != DRM_KERNEL_CONTEXT) {
|
if (ctx->handle != DRM_KERNEL_CONTEXT) {
|
||||||
if (dev->driver->context_dtor)
|
if (dev->driver->context_dtor)
|
||||||
|
|
|
@ -582,11 +582,14 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
|
||||||
if (drm_ht_create(&dev->map_hash, 12))
|
if (drm_ht_create(&dev->map_hash, 12))
|
||||||
goto err_minors;
|
goto err_minors;
|
||||||
|
|
||||||
ret = drm_legacy_ctxbitmap_init(dev);
|
if (drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) ||
|
||||||
if (ret) {
|
!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
DRM_ERROR("Cannot allocate memory for context bitmap.\n");
|
ret = drm_legacy_ctxbitmap_init(dev);
|
||||||
goto err_ht;
|
if (ret) {
|
||||||
}
|
DRM_ERROR(
|
||||||
|
"Cannot allocate memory for context bitmap.\n");
|
||||||
|
goto err_ht;
|
||||||
|
}
|
||||||
|
|
||||||
if (drm_core_check_feature(dev, DRIVER_GEM)) {
|
if (drm_core_check_feature(dev, DRIVER_GEM)) {
|
||||||
ret = drm_gem_init(dev);
|
ret = drm_gem_init(dev);
|
||||||
|
|
|
@ -941,7 +941,8 @@ static struct drm_driver
|
||||||
driver_stub = {
|
driver_stub = {
|
||||||
.driver_features =
|
.driver_features =
|
||||||
DRIVER_USE_AGP |
|
DRIVER_USE_AGP |
|
||||||
DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER,
|
DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER |
|
||||||
|
DRIVER_KMS_LEGACY_CONTEXT,
|
||||||
|
|
||||||
.load = nouveau_drm_load,
|
.load = nouveau_drm_load,
|
||||||
.unload = nouveau_drm_unload,
|
.unload = nouveau_drm_unload,
|
||||||
|
|
|
@ -137,17 +137,18 @@ void drm_err(const char *format, ...);
|
||||||
/*@{*/
|
/*@{*/
|
||||||
|
|
||||||
/* driver capabilities and requirements mask */
|
/* driver capabilities and requirements mask */
|
||||||
#define DRIVER_USE_AGP 0x1
|
#define DRIVER_USE_AGP 0x1
|
||||||
#define DRIVER_PCI_DMA 0x8
|
#define DRIVER_PCI_DMA 0x8
|
||||||
#define DRIVER_SG 0x10
|
#define DRIVER_SG 0x10
|
||||||
#define DRIVER_HAVE_DMA 0x20
|
#define DRIVER_HAVE_DMA 0x20
|
||||||
#define DRIVER_HAVE_IRQ 0x40
|
#define DRIVER_HAVE_IRQ 0x40
|
||||||
#define DRIVER_IRQ_SHARED 0x80
|
#define DRIVER_IRQ_SHARED 0x80
|
||||||
#define DRIVER_GEM 0x1000
|
#define DRIVER_GEM 0x1000
|
||||||
#define DRIVER_MODESET 0x2000
|
#define DRIVER_MODESET 0x2000
|
||||||
#define DRIVER_PRIME 0x4000
|
#define DRIVER_PRIME 0x4000
|
||||||
#define DRIVER_RENDER 0x8000
|
#define DRIVER_RENDER 0x8000
|
||||||
#define DRIVER_ATOMIC 0x10000
|
#define DRIVER_ATOMIC 0x10000
|
||||||
|
#define DRIVER_KMS_LEGACY_CONTEXT 0x20000
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/** \name Macros to make printk easier */
|
/** \name Macros to make printk easier */
|
||||||
|
|
Loading…
Reference in a new issue