diff options
Diffstat (limited to 'drivers/gpu/drm')
35 files changed, 168 insertions, 123 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 6870909da926..8c1db96be070 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
| @@ -816,17 +816,13 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, | |||
| 816 | if (ret) | 816 | if (ret) |
| 817 | return ret; | 817 | return ret; |
| 818 | 818 | ||
| 819 | /* warn the user if they mix atomic and non-atomic capable GPUs */ | ||
| 820 | if ((kms_driver.driver_features & DRIVER_ATOMIC) && !supports_atomic) | ||
| 821 | DRM_ERROR("Mixing atomic and non-atomic capable GPUs!\n"); | ||
| 822 | /* support atomic early so the atomic debugfs stuff gets created */ | ||
| 823 | if (supports_atomic) | ||
| 824 | kms_driver.driver_features |= DRIVER_ATOMIC; | ||
| 825 | |||
| 826 | dev = drm_dev_alloc(&kms_driver, &pdev->dev); | 819 | dev = drm_dev_alloc(&kms_driver, &pdev->dev); |
| 827 | if (IS_ERR(dev)) | 820 | if (IS_ERR(dev)) |
| 828 | return PTR_ERR(dev); | 821 | return PTR_ERR(dev); |
| 829 | 822 | ||
| 823 | if (!supports_atomic) | ||
| 824 | dev->driver_features &= ~DRIVER_ATOMIC; | ||
| 825 | |||
| 830 | ret = pci_enable_device(pdev); | 826 | ret = pci_enable_device(pdev); |
| 831 | if (ret) | 827 | if (ret) |
| 832 | goto err_free; | 828 | goto err_free; |
| @@ -1078,7 +1074,7 @@ amdgpu_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe, | |||
| 1078 | 1074 | ||
| 1079 | static struct drm_driver kms_driver = { | 1075 | static struct drm_driver kms_driver = { |
| 1080 | .driver_features = | 1076 | .driver_features = |
| 1081 | DRIVER_USE_AGP | | 1077 | DRIVER_USE_AGP | DRIVER_ATOMIC | |
| 1082 | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM | | 1078 | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM | |
| 1083 | DRIVER_PRIME | DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ, | 1079 | DRIVER_PRIME | DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ, |
| 1084 | .load = amdgpu_driver_load_kms, | 1080 | .load = amdgpu_driver_load_kms, |
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 26690a664ec6..d5b7f315098c 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c | |||
| @@ -1251,7 +1251,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, | |||
| 1251 | 1251 | ||
| 1252 | /* disallow for drivers not supporting atomic: */ | 1252 | /* disallow for drivers not supporting atomic: */ |
| 1253 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) | 1253 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) |
| 1254 | return -EINVAL; | 1254 | return -EOPNOTSUPP; |
| 1255 | 1255 | ||
| 1256 | /* disallow for userspace that has not enabled atomic cap (even | 1256 | /* disallow for userspace that has not enabled atomic cap (even |
| 1257 | * though this may be a bit overkill, since legacy userspace | 1257 | * though this may be a bit overkill, since legacy userspace |
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index ba8cfe65c65b..7412acaf3cde 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c | |||
| @@ -398,7 +398,7 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data, | |||
| 398 | 398 | ||
| 399 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 399 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 400 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 400 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 401 | return -EINVAL; | 401 | return -EOPNOTSUPP; |
| 402 | 402 | ||
| 403 | err = drm_addmap_core(dev, map->offset, map->size, map->type, | 403 | err = drm_addmap_core(dev, map->offset, map->size, map->type, |
| 404 | map->flags, &maplist); | 404 | map->flags, &maplist); |
| @@ -444,7 +444,7 @@ int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data, | |||
| 444 | 444 | ||
| 445 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 445 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 446 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 446 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 447 | return -EINVAL; | 447 | return -EOPNOTSUPP; |
| 448 | 448 | ||
| 449 | idx = map->offset; | 449 | idx = map->offset; |
| 450 | if (idx < 0) | 450 | if (idx < 0) |
| @@ -596,7 +596,7 @@ int drm_legacy_rmmap_ioctl(struct drm_device *dev, void *data, | |||
| 596 | 596 | ||
| 597 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 597 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 598 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 598 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 599 | return -EINVAL; | 599 | return -EOPNOTSUPP; |
| 600 | 600 | ||
| 601 | mutex_lock(&dev->struct_mutex); | 601 | mutex_lock(&dev->struct_mutex); |
| 602 | list_for_each_entry(r_list, &dev->maplist, head) { | 602 | list_for_each_entry(r_list, &dev->maplist, head) { |
| @@ -860,7 +860,7 @@ int drm_legacy_addbufs_pci(struct drm_device *dev, | |||
| 860 | struct drm_buf **temp_buflist; | 860 | struct drm_buf **temp_buflist; |
| 861 | 861 | ||
| 862 | if (!drm_core_check_feature(dev, DRIVER_PCI_DMA)) | 862 | if (!drm_core_check_feature(dev, DRIVER_PCI_DMA)) |
| 863 | return -EINVAL; | 863 | return -EOPNOTSUPP; |
| 864 | 864 | ||
| 865 | if (!dma) | 865 | if (!dma) |
| 866 | return -EINVAL; | 866 | return -EINVAL; |
| @@ -1064,7 +1064,7 @@ static int drm_legacy_addbufs_sg(struct drm_device *dev, | |||
| 1064 | struct drm_buf **temp_buflist; | 1064 | struct drm_buf **temp_buflist; |
| 1065 | 1065 | ||
| 1066 | if (!drm_core_check_feature(dev, DRIVER_SG)) | 1066 | if (!drm_core_check_feature(dev, DRIVER_SG)) |
| 1067 | return -EINVAL; | 1067 | return -EOPNOTSUPP; |
| 1068 | 1068 | ||
| 1069 | if (!dma) | 1069 | if (!dma) |
| 1070 | return -EINVAL; | 1070 | return -EINVAL; |
| @@ -1221,10 +1221,10 @@ int drm_legacy_addbufs(struct drm_device *dev, void *data, | |||
| 1221 | int ret; | 1221 | int ret; |
| 1222 | 1222 | ||
| 1223 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1223 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1224 | return -EINVAL; | 1224 | return -EOPNOTSUPP; |
| 1225 | 1225 | ||
| 1226 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) | 1226 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) |
| 1227 | return -EINVAL; | 1227 | return -EOPNOTSUPP; |
| 1228 | 1228 | ||
| 1229 | #if IS_ENABLED(CONFIG_AGP) | 1229 | #if IS_ENABLED(CONFIG_AGP) |
| 1230 | if (request->flags & _DRM_AGP_BUFFER) | 1230 | if (request->flags & _DRM_AGP_BUFFER) |
| @@ -1267,10 +1267,10 @@ int __drm_legacy_infobufs(struct drm_device *dev, | |||
| 1267 | int count; | 1267 | int count; |
| 1268 | 1268 | ||
| 1269 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1269 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1270 | return -EINVAL; | 1270 | return -EOPNOTSUPP; |
| 1271 | 1271 | ||
| 1272 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) | 1272 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) |
| 1273 | return -EINVAL; | 1273 | return -EOPNOTSUPP; |
| 1274 | 1274 | ||
| 1275 | if (!dma) | 1275 | if (!dma) |
| 1276 | return -EINVAL; | 1276 | return -EINVAL; |
| @@ -1352,10 +1352,10 @@ int drm_legacy_markbufs(struct drm_device *dev, void *data, | |||
| 1352 | struct drm_buf_entry *entry; | 1352 | struct drm_buf_entry *entry; |
| 1353 | 1353 | ||
| 1354 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1354 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1355 | return -EINVAL; | 1355 | return -EOPNOTSUPP; |
| 1356 | 1356 | ||
| 1357 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) | 1357 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) |
| 1358 | return -EINVAL; | 1358 | return -EOPNOTSUPP; |
| 1359 | 1359 | ||
| 1360 | if (!dma) | 1360 | if (!dma) |
| 1361 | return -EINVAL; | 1361 | return -EINVAL; |
| @@ -1400,10 +1400,10 @@ int drm_legacy_freebufs(struct drm_device *dev, void *data, | |||
| 1400 | struct drm_buf *buf; | 1400 | struct drm_buf *buf; |
| 1401 | 1401 | ||
| 1402 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1402 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1403 | return -EINVAL; | 1403 | return -EOPNOTSUPP; |
| 1404 | 1404 | ||
| 1405 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) | 1405 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) |
| 1406 | return -EINVAL; | 1406 | return -EOPNOTSUPP; |
| 1407 | 1407 | ||
| 1408 | if (!dma) | 1408 | if (!dma) |
| 1409 | return -EINVAL; | 1409 | return -EINVAL; |
| @@ -1455,10 +1455,10 @@ int __drm_legacy_mapbufs(struct drm_device *dev, void *data, int *p, | |||
| 1455 | int i; | 1455 | int i; |
| 1456 | 1456 | ||
| 1457 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1457 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1458 | return -EINVAL; | 1458 | return -EOPNOTSUPP; |
| 1459 | 1459 | ||
| 1460 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) | 1460 | if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) |
| 1461 | return -EINVAL; | 1461 | return -EOPNOTSUPP; |
| 1462 | 1462 | ||
| 1463 | if (!dma) | 1463 | if (!dma) |
| 1464 | return -EINVAL; | 1464 | return -EINVAL; |
| @@ -1545,7 +1545,7 @@ int drm_legacy_dma_ioctl(struct drm_device *dev, void *data, | |||
| 1545 | struct drm_file *file_priv) | 1545 | struct drm_file *file_priv) |
| 1546 | { | 1546 | { |
| 1547 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 1547 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 1548 | return -EINVAL; | 1548 | return -EOPNOTSUPP; |
| 1549 | 1549 | ||
| 1550 | if (dev->driver->dma_ioctl) | 1550 | if (dev->driver->dma_ioctl) |
| 1551 | return dev->driver->dma_ioctl(dev, data, file_priv); | 1551 | return dev->driver->dma_ioctl(dev, data, file_priv); |
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c index baff50a4c234..17d9a64e885e 100644 --- a/drivers/gpu/drm/drm_client.c +++ b/drivers/gpu/drm/drm_client.c | |||
| @@ -82,7 +82,7 @@ int drm_client_new(struct drm_device *dev, struct drm_client_dev *client, | |||
| 82 | 82 | ||
| 83 | if (!drm_core_check_feature(dev, DRIVER_MODESET) || | 83 | if (!drm_core_check_feature(dev, DRIVER_MODESET) || |
| 84 | !dev->driver->dumb_create || !dev->driver->gem_prime_vmap) | 84 | !dev->driver->dumb_create || !dev->driver->gem_prime_vmap) |
| 85 | return -ENOTSUPP; | 85 | return -EOPNOTSUPP; |
| 86 | 86 | ||
| 87 | if (funcs && !try_module_get(funcs->owner)) | 87 | if (funcs && !try_module_get(funcs->owner)) |
| 88 | return -ENODEV; | 88 | return -ENODEV; |
diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c index b97e2de2c029..581cc3788223 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c | |||
| @@ -242,7 +242,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev, | |||
| 242 | int ret = 0; | 242 | int ret = 0; |
| 243 | 243 | ||
| 244 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 244 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 245 | return -EINVAL; | 245 | return -EOPNOTSUPP; |
| 246 | 246 | ||
| 247 | crtc = drm_crtc_find(dev, file_priv, crtc_lut->crtc_id); | 247 | crtc = drm_crtc_find(dev, file_priv, crtc_lut->crtc_id); |
| 248 | if (!crtc) | 248 | if (!crtc) |
| @@ -320,7 +320,7 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev, | |||
| 320 | int ret = 0; | 320 | int ret = 0; |
| 321 | 321 | ||
| 322 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 322 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 323 | return -EINVAL; | 323 | return -EOPNOTSUPP; |
| 324 | 324 | ||
| 325 | crtc = drm_crtc_find(dev, file_priv, crtc_lut->crtc_id); | 325 | crtc = drm_crtc_find(dev, file_priv, crtc_lut->crtc_id); |
| 326 | if (!crtc) | 326 | if (!crtc) |
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 526619f963e5..1e40e5decbe9 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c | |||
| @@ -1725,7 +1725,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
| 1725 | LIST_HEAD(export_list); | 1725 | LIST_HEAD(export_list); |
| 1726 | 1726 | ||
| 1727 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 1727 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1728 | return -EINVAL; | 1728 | return -EOPNOTSUPP; |
| 1729 | 1729 | ||
| 1730 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); | 1730 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); |
| 1731 | 1731 | ||
diff --git a/drivers/gpu/drm/drm_context.c b/drivers/gpu/drm/drm_context.c index f973d287696a..506663c69b0a 100644 --- a/drivers/gpu/drm/drm_context.c +++ b/drivers/gpu/drm/drm_context.c | |||
| @@ -178,7 +178,7 @@ int drm_legacy_getsareactx(struct drm_device *dev, void *data, | |||
| 178 | 178 | ||
| 179 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 179 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 180 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 180 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 181 | return -EINVAL; | 181 | return -EOPNOTSUPP; |
| 182 | 182 | ||
| 183 | mutex_lock(&dev->struct_mutex); | 183 | mutex_lock(&dev->struct_mutex); |
| 184 | 184 | ||
| @@ -226,7 +226,7 @@ int drm_legacy_setsareactx(struct drm_device *dev, void *data, | |||
| 226 | 226 | ||
| 227 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 227 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 228 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 228 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 229 | return -EINVAL; | 229 | return -EOPNOTSUPP; |
| 230 | 230 | ||
| 231 | mutex_lock(&dev->struct_mutex); | 231 | mutex_lock(&dev->struct_mutex); |
| 232 | list_for_each_entry(r_list, &dev->maplist, head) { | 232 | list_for_each_entry(r_list, &dev->maplist, head) { |
| @@ -330,7 +330,7 @@ int drm_legacy_resctx(struct drm_device *dev, void *data, | |||
| 330 | 330 | ||
| 331 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 331 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 332 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 332 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 333 | return -EINVAL; | 333 | return -EOPNOTSUPP; |
| 334 | 334 | ||
| 335 | if (res->count >= DRM_RESERVED_CONTEXTS) { | 335 | if (res->count >= DRM_RESERVED_CONTEXTS) { |
| 336 | memset(&ctx, 0, sizeof(ctx)); | 336 | memset(&ctx, 0, sizeof(ctx)); |
| @@ -364,7 +364,7 @@ int drm_legacy_addctx(struct drm_device *dev, void *data, | |||
| 364 | 364 | ||
| 365 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 365 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 366 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 366 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 367 | return -EINVAL; | 367 | return -EOPNOTSUPP; |
| 368 | 368 | ||
| 369 | ctx->handle = drm_legacy_ctxbitmap_next(dev); | 369 | ctx->handle = drm_legacy_ctxbitmap_next(dev); |
| 370 | if (ctx->handle == DRM_KERNEL_CONTEXT) { | 370 | if (ctx->handle == DRM_KERNEL_CONTEXT) { |
| @@ -411,7 +411,7 @@ int drm_legacy_getctx(struct drm_device *dev, void *data, | |||
| 411 | 411 | ||
| 412 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 412 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 413 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 413 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 414 | return -EINVAL; | 414 | return -EOPNOTSUPP; |
| 415 | 415 | ||
| 416 | /* This is 0, because we don't handle any context flags */ | 416 | /* This is 0, because we don't handle any context flags */ |
| 417 | ctx->flags = 0; | 417 | ctx->flags = 0; |
| @@ -437,7 +437,7 @@ int drm_legacy_switchctx(struct drm_device *dev, void *data, | |||
| 437 | 437 | ||
| 438 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 438 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 439 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 439 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 440 | return -EINVAL; | 440 | return -EOPNOTSUPP; |
| 441 | 441 | ||
| 442 | DRM_DEBUG("%d\n", ctx->handle); | 442 | DRM_DEBUG("%d\n", ctx->handle); |
| 443 | return drm_context_switch(dev, dev->last_context, ctx->handle); | 443 | return drm_context_switch(dev, dev->last_context, ctx->handle); |
| @@ -461,7 +461,7 @@ int drm_legacy_newctx(struct drm_device *dev, void *data, | |||
| 461 | 461 | ||
| 462 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 462 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 463 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 463 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 464 | return -EINVAL; | 464 | return -EOPNOTSUPP; |
| 465 | 465 | ||
| 466 | DRM_DEBUG("%d\n", ctx->handle); | 466 | DRM_DEBUG("%d\n", ctx->handle); |
| 467 | drm_context_switch_complete(dev, file_priv, ctx->handle); | 467 | drm_context_switch_complete(dev, file_priv, ctx->handle); |
| @@ -487,7 +487,7 @@ int drm_legacy_rmctx(struct drm_device *dev, void *data, | |||
| 487 | 487 | ||
| 488 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && | 488 | if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && |
| 489 | !drm_core_check_feature(dev, DRIVER_LEGACY)) | 489 | !drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 490 | return -EINVAL; | 490 | return -EOPNOTSUPP; |
| 491 | 491 | ||
| 492 | DRM_DEBUG("%d\n", ctx->handle); | 492 | DRM_DEBUG("%d\n", ctx->handle); |
| 493 | if (ctx->handle != DRM_KERNEL_CONTEXT) { | 493 | if (ctx->handle != DRM_KERNEL_CONTEXT) { |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 2f6c877299e4..5f488aa80bcd 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -405,7 +405,7 @@ int drm_mode_getcrtc(struct drm_device *dev, | |||
| 405 | struct drm_plane *plane; | 405 | struct drm_plane *plane; |
| 406 | 406 | ||
| 407 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 407 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 408 | return -EINVAL; | 408 | return -EOPNOTSUPP; |
| 409 | 409 | ||
| 410 | crtc = drm_crtc_find(dev, file_priv, crtc_resp->crtc_id); | 410 | crtc = drm_crtc_find(dev, file_priv, crtc_resp->crtc_id); |
| 411 | if (!crtc) | 411 | if (!crtc) |
| @@ -580,7 +580,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
| 580 | int i; | 580 | int i; |
| 581 | 581 | ||
| 582 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 582 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 583 | return -EINVAL; | 583 | return -EOPNOTSUPP; |
| 584 | 584 | ||
| 585 | /* | 585 | /* |
| 586 | * Universal plane src offsets are only 16.16, prevent havoc for | 586 | * Universal plane src offsets are only 16.16, prevent havoc for |
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 8c6b9fd89f8a..37c01b6076ec 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c | |||
| @@ -1257,15 +1257,22 @@ EXPORT_SYMBOL(drm_dp_stop_crc); | |||
| 1257 | 1257 | ||
| 1258 | struct dpcd_quirk { | 1258 | struct dpcd_quirk { |
| 1259 | u8 oui[3]; | 1259 | u8 oui[3]; |
| 1260 | u8 device_id[6]; | ||
| 1260 | bool is_branch; | 1261 | bool is_branch; |
| 1261 | u32 quirks; | 1262 | u32 quirks; |
| 1262 | }; | 1263 | }; |
| 1263 | 1264 | ||
| 1264 | #define OUI(first, second, third) { (first), (second), (third) } | 1265 | #define OUI(first, second, third) { (first), (second), (third) } |
| 1266 | #define DEVICE_ID(first, second, third, fourth, fifth, sixth) \ | ||
| 1267 | { (first), (second), (third), (fourth), (fifth), (sixth) } | ||
| 1268 | |||
| 1269 | #define DEVICE_ID_ANY DEVICE_ID(0, 0, 0, 0, 0, 0) | ||
| 1265 | 1270 | ||
| 1266 | static const struct dpcd_quirk dpcd_quirk_list[] = { | 1271 | static const struct dpcd_quirk dpcd_quirk_list[] = { |
| 1267 | /* Analogix 7737 needs reduced M and N at HBR2 link rates */ | 1272 | /* Analogix 7737 needs reduced M and N at HBR2 link rates */ |
| 1268 | { OUI(0x00, 0x22, 0xb9), true, BIT(DP_DPCD_QUIRK_LIMITED_M_N) }, | 1273 | { OUI(0x00, 0x22, 0xb9), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_CONSTANT_N) }, |
| 1274 | /* LG LP140WF6-SPM1 eDP panel */ | ||
| 1275 | { OUI(0x00, 0x22, 0xb9), DEVICE_ID('s', 'i', 'v', 'a', 'r', 'T'), false, BIT(DP_DPCD_QUIRK_CONSTANT_N) }, | ||
| 1269 | }; | 1276 | }; |
| 1270 | 1277 | ||
| 1271 | #undef OUI | 1278 | #undef OUI |
| @@ -1284,6 +1291,7 @@ drm_dp_get_quirks(const struct drm_dp_dpcd_ident *ident, bool is_branch) | |||
| 1284 | const struct dpcd_quirk *quirk; | 1291 | const struct dpcd_quirk *quirk; |
| 1285 | u32 quirks = 0; | 1292 | u32 quirks = 0; |
| 1286 | int i; | 1293 | int i; |
| 1294 | u8 any_device[] = DEVICE_ID_ANY; | ||
| 1287 | 1295 | ||
| 1288 | for (i = 0; i < ARRAY_SIZE(dpcd_quirk_list); i++) { | 1296 | for (i = 0; i < ARRAY_SIZE(dpcd_quirk_list); i++) { |
| 1289 | quirk = &dpcd_quirk_list[i]; | 1297 | quirk = &dpcd_quirk_list[i]; |
| @@ -1294,12 +1302,19 @@ drm_dp_get_quirks(const struct drm_dp_dpcd_ident *ident, bool is_branch) | |||
| 1294 | if (memcmp(quirk->oui, ident->oui, sizeof(ident->oui)) != 0) | 1302 | if (memcmp(quirk->oui, ident->oui, sizeof(ident->oui)) != 0) |
| 1295 | continue; | 1303 | continue; |
| 1296 | 1304 | ||
| 1305 | if (memcmp(quirk->device_id, any_device, sizeof(any_device)) != 0 && | ||
| 1306 | memcmp(quirk->device_id, ident->device_id, sizeof(ident->device_id)) != 0) | ||
| 1307 | continue; | ||
| 1308 | |||
| 1297 | quirks |= quirk->quirks; | 1309 | quirks |= quirk->quirks; |
| 1298 | } | 1310 | } |
| 1299 | 1311 | ||
| 1300 | return quirks; | 1312 | return quirks; |
| 1301 | } | 1313 | } |
| 1302 | 1314 | ||
| 1315 | #undef DEVICE_ID_ANY | ||
| 1316 | #undef DEVICE_ID | ||
| 1317 | |||
| 1303 | /** | 1318 | /** |
| 1304 | * drm_dp_read_desc - read sink/branch descriptor from DPCD | 1319 | * drm_dp_read_desc - read sink/branch descriptor from DPCD |
| 1305 | * @aux: DisplayPort AUX channel | 1320 | * @aux: DisplayPort AUX channel |
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, | |||
| 506 | dev->dev = parent; | 506 | dev->dev = parent; |
| 507 | dev->driver = driver; | 507 | dev->driver = driver; |
| 508 | 508 | ||
| 509 | /* no per-device feature limits by default */ | ||
| 510 | dev->driver_features = ~0u; | ||
| 511 | |||
| 509 | INIT_LIST_HEAD(&dev->filelist); | 512 | INIT_LIST_HEAD(&dev->filelist); |
| 510 | INIT_LIST_HEAD(&dev->filelist_internal); | 513 | INIT_LIST_HEAD(&dev->filelist_internal); |
| 511 | INIT_LIST_HEAD(&dev->clientlist); | 514 | INIT_LIST_HEAD(&dev->clientlist); |
diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c index 273e1c59c54a..b694fb57eaa4 100644 --- a/drivers/gpu/drm/drm_encoder.c +++ b/drivers/gpu/drm/drm_encoder.c | |||
| @@ -222,7 +222,7 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, | |||
| 222 | struct drm_crtc *crtc; | 222 | struct drm_crtc *crtc; |
| 223 | 223 | ||
| 224 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 224 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 225 | return -EINVAL; | 225 | return -EOPNOTSUPP; |
| 226 | 226 | ||
| 227 | encoder = drm_encoder_find(dev, file_priv, enc_resp->encoder_id); | 227 | encoder = drm_encoder_find(dev, file_priv, enc_resp->encoder_id); |
| 228 | if (!encoder) | 228 | if (!encoder) |
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index 6eaacd4eb8cc..1ee3d6b44280 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c | |||
| @@ -113,6 +113,9 @@ int drm_mode_addfb(struct drm_device *dev, struct drm_mode_fb_cmd *or, | |||
| 113 | struct drm_mode_fb_cmd2 r = {}; | 113 | struct drm_mode_fb_cmd2 r = {}; |
| 114 | int ret; | 114 | int ret; |
| 115 | 115 | ||
| 116 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
| 117 | return -EOPNOTSUPP; | ||
| 118 | |||
| 116 | r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); | 119 | r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth); |
| 117 | if (r.pixel_format == DRM_FORMAT_INVALID) { | 120 | if (r.pixel_format == DRM_FORMAT_INVALID) { |
| 118 | DRM_DEBUG("bad {bpp:%d, depth:%d}\n", or->bpp, or->depth); | 121 | DRM_DEBUG("bad {bpp:%d, depth:%d}\n", or->bpp, or->depth); |
| @@ -352,7 +355,7 @@ int drm_mode_addfb2(struct drm_device *dev, | |||
| 352 | struct drm_framebuffer *fb; | 355 | struct drm_framebuffer *fb; |
| 353 | 356 | ||
| 354 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 357 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 355 | return -EINVAL; | 358 | return -EOPNOTSUPP; |
| 356 | 359 | ||
| 357 | fb = drm_internal_framebuffer_create(dev, r, file_priv); | 360 | fb = drm_internal_framebuffer_create(dev, r, file_priv); |
| 358 | if (IS_ERR(fb)) | 361 | if (IS_ERR(fb)) |
| @@ -387,7 +390,7 @@ int drm_mode_addfb2_ioctl(struct drm_device *dev, | |||
| 387 | * ADDFB. | 390 | * ADDFB. |
| 388 | */ | 391 | */ |
| 389 | DRM_DEBUG_KMS("addfb2 broken on bigendian"); | 392 | DRM_DEBUG_KMS("addfb2 broken on bigendian"); |
| 390 | return -EINVAL; | 393 | return -EOPNOTSUPP; |
| 391 | } | 394 | } |
| 392 | #endif | 395 | #endif |
| 393 | return drm_mode_addfb2(dev, data, file_priv); | 396 | return drm_mode_addfb2(dev, data, file_priv); |
| @@ -432,7 +435,7 @@ int drm_mode_rmfb(struct drm_device *dev, u32 fb_id, | |||
| 432 | int found = 0; | 435 | int found = 0; |
| 433 | 436 | ||
| 434 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 437 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 435 | return -EINVAL; | 438 | return -EOPNOTSUPP; |
| 436 | 439 | ||
| 437 | fb = drm_framebuffer_lookup(dev, file_priv, fb_id); | 440 | fb = drm_framebuffer_lookup(dev, file_priv, fb_id); |
| 438 | if (!fb) | 441 | if (!fb) |
| @@ -509,7 +512,7 @@ int drm_mode_getfb(struct drm_device *dev, | |||
| 509 | int ret; | 512 | int ret; |
| 510 | 513 | ||
| 511 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 514 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 512 | return -EINVAL; | 515 | return -EOPNOTSUPP; |
| 513 | 516 | ||
| 514 | fb = drm_framebuffer_lookup(dev, file_priv, r->fb_id); | 517 | fb = drm_framebuffer_lookup(dev, file_priv, r->fb_id); |
| 515 | if (!fb) | 518 | if (!fb) |
| @@ -582,7 +585,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, | |||
| 582 | int ret; | 585 | int ret; |
| 583 | 586 | ||
| 584 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 587 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 585 | return -EINVAL; | 588 | return -EOPNOTSUPP; |
| 586 | 589 | ||
| 587 | fb = drm_framebuffer_lookup(dev, file_priv, r->fb_id); | 590 | fb = drm_framebuffer_lookup(dev, file_priv, r->fb_id); |
| 588 | if (!fb) | 591 | if (!fb) |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index bf90625df3c5..512078ebd97b 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
| @@ -667,7 +667,7 @@ drm_gem_close_ioctl(struct drm_device *dev, void *data, | |||
| 667 | int ret; | 667 | int ret; |
| 668 | 668 | ||
| 669 | if (!drm_core_check_feature(dev, DRIVER_GEM)) | 669 | if (!drm_core_check_feature(dev, DRIVER_GEM)) |
| 670 | return -ENODEV; | 670 | return -EOPNOTSUPP; |
| 671 | 671 | ||
| 672 | ret = drm_gem_handle_delete(file_priv, args->handle); | 672 | ret = drm_gem_handle_delete(file_priv, args->handle); |
| 673 | 673 | ||
| @@ -694,7 +694,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, | |||
| 694 | int ret; | 694 | int ret; |
| 695 | 695 | ||
| 696 | if (!drm_core_check_feature(dev, DRIVER_GEM)) | 696 | if (!drm_core_check_feature(dev, DRIVER_GEM)) |
| 697 | return -ENODEV; | 697 | return -EOPNOTSUPP; |
| 698 | 698 | ||
| 699 | obj = drm_gem_object_lookup(file_priv, args->handle); | 699 | obj = drm_gem_object_lookup(file_priv, args->handle); |
| 700 | if (obj == NULL) | 700 | if (obj == NULL) |
| @@ -745,7 +745,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, | |||
| 745 | u32 handle; | 745 | u32 handle; |
| 746 | 746 | ||
| 747 | if (!drm_core_check_feature(dev, DRIVER_GEM)) | 747 | if (!drm_core_check_feature(dev, DRIVER_GEM)) |
| 748 | return -ENODEV; | 748 | return -EOPNOTSUPP; |
| 749 | 749 | ||
| 750 | mutex_lock(&dev->object_name_lock); | 750 | mutex_lock(&dev->object_name_lock); |
| 751 | obj = idr_find(&dev->object_name_idr, (int) args->name); | 751 | obj = idr_find(&dev->object_name_idr, (int) args->name); |
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 6b4a633b4240..60dfbfae6a02 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c | |||
| @@ -248,7 +248,7 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 248 | 248 | ||
| 249 | /* Other caps only work with KMS drivers */ | 249 | /* Other caps only work with KMS drivers */ |
| 250 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 250 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 251 | return -ENOTSUPP; | 251 | return -EOPNOTSUPP; |
| 252 | 252 | ||
| 253 | switch (req->capability) { | 253 | switch (req->capability) { |
| 254 | case DRM_CAP_DUMB_BUFFER: | 254 | case DRM_CAP_DUMB_BUFFER: |
| @@ -319,7 +319,7 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 319 | break; | 319 | break; |
| 320 | case DRM_CLIENT_CAP_ATOMIC: | 320 | case DRM_CLIENT_CAP_ATOMIC: |
| 321 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) | 321 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) |
| 322 | return -EINVAL; | 322 | return -EOPNOTSUPP; |
| 323 | if (req->value > 1) | 323 | if (req->value > 1) |
| 324 | return -EINVAL; | 324 | return -EINVAL; |
| 325 | file_priv->atomic = req->value; | 325 | file_priv->atomic = req->value; |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 3b04c25100ae..45a07652fa00 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -104,7 +104,7 @@ int drm_irq_install(struct drm_device *dev, int irq) | |||
| 104 | unsigned long sh_flags = 0; | 104 | unsigned long sh_flags = 0; |
| 105 | 105 | ||
| 106 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) | 106 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) |
| 107 | return -EINVAL; | 107 | return -EOPNOTSUPP; |
| 108 | 108 | ||
| 109 | if (irq == 0) | 109 | if (irq == 0) |
| 110 | return -EINVAL; | 110 | return -EINVAL; |
| @@ -175,7 +175,7 @@ int drm_irq_uninstall(struct drm_device *dev) | |||
| 175 | int i; | 175 | int i; |
| 176 | 176 | ||
| 177 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) | 177 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) |
| 178 | return -EINVAL; | 178 | return -EOPNOTSUPP; |
| 179 | 179 | ||
| 180 | irq_enabled = dev->irq_enabled; | 180 | irq_enabled = dev->irq_enabled; |
| 181 | dev->irq_enabled = false; | 181 | dev->irq_enabled = false; |
diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c index b54fb78a283c..5894b4e144d7 100644 --- a/drivers/gpu/drm/drm_lease.c +++ b/drivers/gpu/drm/drm_lease.c | |||
| @@ -506,7 +506,7 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, | |||
| 506 | 506 | ||
| 507 | /* Can't lease without MODESET */ | 507 | /* Can't lease without MODESET */ |
| 508 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 508 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 509 | return -EINVAL; | 509 | return -EOPNOTSUPP; |
| 510 | 510 | ||
| 511 | /* Do not allow sub-leases */ | 511 | /* Do not allow sub-leases */ |
| 512 | if (lessor->lessor) | 512 | if (lessor->lessor) |
| @@ -615,7 +615,7 @@ int drm_mode_list_lessees_ioctl(struct drm_device *dev, | |||
| 615 | 615 | ||
| 616 | /* Can't lease without MODESET */ | 616 | /* Can't lease without MODESET */ |
| 617 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 617 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 618 | return -EINVAL; | 618 | return -EOPNOTSUPP; |
| 619 | 619 | ||
| 620 | DRM_DEBUG_LEASE("List lessees for %d\n", lessor->lessee_id); | 620 | DRM_DEBUG_LEASE("List lessees for %d\n", lessor->lessee_id); |
| 621 | 621 | ||
| @@ -671,7 +671,7 @@ int drm_mode_get_lease_ioctl(struct drm_device *dev, | |||
| 671 | 671 | ||
| 672 | /* Can't lease without MODESET */ | 672 | /* Can't lease without MODESET */ |
| 673 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 673 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 674 | return -EINVAL; | 674 | return -EOPNOTSUPP; |
| 675 | 675 | ||
| 676 | DRM_DEBUG_LEASE("get lease for %d\n", lessee->lessee_id); | 676 | DRM_DEBUG_LEASE("get lease for %d\n", lessee->lessee_id); |
| 677 | 677 | ||
| @@ -726,7 +726,7 @@ int drm_mode_revoke_lease_ioctl(struct drm_device *dev, | |||
| 726 | 726 | ||
| 727 | /* Can't lease without MODESET */ | 727 | /* Can't lease without MODESET */ |
| 728 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 728 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 729 | return -EINVAL; | 729 | return -EOPNOTSUPP; |
| 730 | 730 | ||
| 731 | mutex_lock(&dev->mode_config.idr_mutex); | 731 | mutex_lock(&dev->mode_config.idr_mutex); |
| 732 | 732 | ||
diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c index 96bb6badb818..67a1a2ca7174 100644 --- a/drivers/gpu/drm/drm_lock.c +++ b/drivers/gpu/drm/drm_lock.c | |||
| @@ -166,7 +166,7 @@ int drm_legacy_lock(struct drm_device *dev, void *data, | |||
| 166 | int ret = 0; | 166 | int ret = 0; |
| 167 | 167 | ||
| 168 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 168 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 169 | return -EINVAL; | 169 | return -EOPNOTSUPP; |
| 170 | 170 | ||
| 171 | ++file_priv->lock_count; | 171 | ++file_priv->lock_count; |
| 172 | 172 | ||
| @@ -256,7 +256,7 @@ int drm_legacy_unlock(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 256 | struct drm_master *master = file_priv->master; | 256 | struct drm_master *master = file_priv->master; |
| 257 | 257 | ||
| 258 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 258 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 259 | return -EINVAL; | 259 | return -EOPNOTSUPP; |
| 260 | 260 | ||
| 261 | if (lock->context == DRM_KERNEL_CONTEXT) { | 261 | if (lock->context == DRM_KERNEL_CONTEXT) { |
| 262 | DRM_ERROR("Process %d using kernel context %d\n", | 262 | DRM_ERROR("Process %d using kernel context %d\n", |
diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c index 21e353bd3948..ee80788f2c40 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c | |||
| @@ -97,8 +97,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data, | |||
| 97 | struct drm_connector_list_iter conn_iter; | 97 | struct drm_connector_list_iter conn_iter; |
| 98 | 98 | ||
| 99 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 99 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 100 | return -EINVAL; | 100 | return -EOPNOTSUPP; |
| 101 | |||
| 102 | 101 | ||
| 103 | mutex_lock(&file_priv->fbs_lock); | 102 | mutex_lock(&file_priv->fbs_lock); |
| 104 | count = 0; | 103 | count = 0; |
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c index fcb0ab0abb75..be8b754eaf60 100644 --- a/drivers/gpu/drm/drm_mode_object.c +++ b/drivers/gpu/drm/drm_mode_object.c | |||
| @@ -381,7 +381,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data, | |||
| 381 | int ret = 0; | 381 | int ret = 0; |
| 382 | 382 | ||
| 383 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 383 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 384 | return -EINVAL; | 384 | return -EOPNOTSUPP; |
| 385 | 385 | ||
| 386 | drm_modeset_lock_all(dev); | 386 | drm_modeset_lock_all(dev); |
| 387 | 387 | ||
| @@ -504,7 +504,7 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data, | |||
| 504 | int ret = -EINVAL; | 504 | int ret = -EINVAL; |
| 505 | 505 | ||
| 506 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 506 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 507 | return -EINVAL; | 507 | return -EOPNOTSUPP; |
| 508 | 508 | ||
| 509 | arg_obj = drm_mode_object_find(dev, file_priv, arg->obj_id, arg->obj_type); | 509 | arg_obj = drm_mode_object_find(dev, file_priv, arg->obj_id, arg->obj_type); |
| 510 | if (!arg_obj) | 510 | if (!arg_obj) |
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index 896e42a34895..48f615d38931 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c | |||
| @@ -182,14 +182,14 @@ int drm_irq_by_busid(struct drm_device *dev, void *data, | |||
| 182 | struct drm_irq_busid *p = data; | 182 | struct drm_irq_busid *p = data; |
| 183 | 183 | ||
| 184 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 184 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 185 | return -EINVAL; | 185 | return -EOPNOTSUPP; |
| 186 | 186 | ||
| 187 | /* UMS was only ever support on PCI devices. */ | 187 | /* UMS was only ever support on PCI devices. */ |
| 188 | if (WARN_ON(!dev->pdev)) | 188 | if (WARN_ON(!dev->pdev)) |
| 189 | return -EINVAL; | 189 | return -EINVAL; |
| 190 | 190 | ||
| 191 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) | 191 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) |
| 192 | return -EINVAL; | 192 | return -EOPNOTSUPP; |
| 193 | 193 | ||
| 194 | return drm_pci_irq_by_busid(dev, p); | 194 | return drm_pci_irq_by_busid(dev, p); |
| 195 | } | 195 | } |
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 4a72c6829d73..1fa98bd12003 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c | |||
| @@ -477,7 +477,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data, | |||
| 477 | int count = 0; | 477 | int count = 0; |
| 478 | 478 | ||
| 479 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 479 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 480 | return -EINVAL; | 480 | return -EOPNOTSUPP; |
| 481 | 481 | ||
| 482 | plane_ptr = u64_to_user_ptr(plane_resp->plane_id_ptr); | 482 | plane_ptr = u64_to_user_ptr(plane_resp->plane_id_ptr); |
| 483 | 483 | ||
| @@ -514,7 +514,7 @@ int drm_mode_getplane(struct drm_device *dev, void *data, | |||
| 514 | uint32_t __user *format_ptr; | 514 | uint32_t __user *format_ptr; |
| 515 | 515 | ||
| 516 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 516 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 517 | return -EINVAL; | 517 | return -EOPNOTSUPP; |
| 518 | 518 | ||
| 519 | plane = drm_plane_find(dev, file_priv, plane_resp->plane_id); | 519 | plane = drm_plane_find(dev, file_priv, plane_resp->plane_id); |
| 520 | if (!plane) | 520 | if (!plane) |
| @@ -781,7 +781,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data, | |||
| 781 | int ret; | 781 | int ret; |
| 782 | 782 | ||
| 783 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 783 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 784 | return -EINVAL; | 784 | return -EOPNOTSUPP; |
| 785 | 785 | ||
| 786 | /* | 786 | /* |
| 787 | * First, find the plane, crtc, and fb objects. If not available, | 787 | * First, find the plane, crtc, and fb objects. If not available, |
| @@ -919,7 +919,7 @@ static int drm_mode_cursor_common(struct drm_device *dev, | |||
| 919 | int ret = 0; | 919 | int ret = 0; |
| 920 | 920 | ||
| 921 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 921 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 922 | return -EINVAL; | 922 | return -EOPNOTSUPP; |
| 923 | 923 | ||
| 924 | if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags)) | 924 | if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags)) |
| 925 | return -EINVAL; | 925 | return -EINVAL; |
| @@ -1023,7 +1023,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, | |||
| 1023 | int ret = -EINVAL; | 1023 | int ret = -EINVAL; |
| 1024 | 1024 | ||
| 1025 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 1025 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1026 | return -EINVAL; | 1026 | return -EOPNOTSUPP; |
| 1027 | 1027 | ||
| 1028 | if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS) | 1028 | if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS) |
| 1029 | return -EINVAL; | 1029 | return -EINVAL; |
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 186db2e4c57a..3f0205fc0a1a 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c | |||
| @@ -844,7 +844,7 @@ int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data, | |||
| 844 | struct drm_prime_handle *args = data; | 844 | struct drm_prime_handle *args = data; |
| 845 | 845 | ||
| 846 | if (!drm_core_check_feature(dev, DRIVER_PRIME)) | 846 | if (!drm_core_check_feature(dev, DRIVER_PRIME)) |
| 847 | return -EINVAL; | 847 | return -EOPNOTSUPP; |
| 848 | 848 | ||
| 849 | if (!dev->driver->prime_handle_to_fd) | 849 | if (!dev->driver->prime_handle_to_fd) |
| 850 | return -ENOSYS; | 850 | return -ENOSYS; |
| @@ -863,7 +863,7 @@ int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data, | |||
| 863 | struct drm_prime_handle *args = data; | 863 | struct drm_prime_handle *args = data; |
| 864 | 864 | ||
| 865 | if (!drm_core_check_feature(dev, DRIVER_PRIME)) | 865 | if (!drm_core_check_feature(dev, DRIVER_PRIME)) |
| 866 | return -EINVAL; | 866 | return -EOPNOTSUPP; |
| 867 | 867 | ||
| 868 | if (!dev->driver->prime_fd_to_handle) | 868 | if (!dev->driver->prime_fd_to_handle) |
| 869 | return -ENOSYS; | 869 | return -ENOSYS; |
diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c index cdb10f885a4f..79c77c3cad86 100644 --- a/drivers/gpu/drm/drm_property.c +++ b/drivers/gpu/drm/drm_property.c | |||
| @@ -464,7 +464,7 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev, | |||
| 464 | uint64_t __user *values_ptr; | 464 | uint64_t __user *values_ptr; |
| 465 | 465 | ||
| 466 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 466 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 467 | return -EINVAL; | 467 | return -EOPNOTSUPP; |
| 468 | 468 | ||
| 469 | property = drm_property_find(dev, file_priv, out_resp->prop_id); | 469 | property = drm_property_find(dev, file_priv, out_resp->prop_id); |
| 470 | if (!property) | 470 | if (!property) |
| @@ -757,7 +757,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, | |||
| 757 | int ret = 0; | 757 | int ret = 0; |
| 758 | 758 | ||
| 759 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 759 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 760 | return -EINVAL; | 760 | return -EOPNOTSUPP; |
| 761 | 761 | ||
| 762 | blob = drm_property_lookup_blob(dev, out_resp->blob_id); | 762 | blob = drm_property_lookup_blob(dev, out_resp->blob_id); |
| 763 | if (!blob) | 763 | if (!blob) |
| @@ -786,7 +786,7 @@ int drm_mode_createblob_ioctl(struct drm_device *dev, | |||
| 786 | int ret = 0; | 786 | int ret = 0; |
| 787 | 787 | ||
| 788 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 788 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 789 | return -EINVAL; | 789 | return -EOPNOTSUPP; |
| 790 | 790 | ||
| 791 | blob = drm_property_create_blob(dev, out_resp->length, NULL); | 791 | blob = drm_property_create_blob(dev, out_resp->length, NULL); |
| 792 | if (IS_ERR(blob)) | 792 | if (IS_ERR(blob)) |
| @@ -823,7 +823,7 @@ int drm_mode_destroyblob_ioctl(struct drm_device *dev, | |||
| 823 | int ret = 0; | 823 | int ret = 0; |
| 824 | 824 | ||
| 825 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 825 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 826 | return -EINVAL; | 826 | return -EOPNOTSUPP; |
| 827 | 827 | ||
| 828 | blob = drm_property_lookup_blob(dev, out_resp->blob_id); | 828 | blob = drm_property_lookup_blob(dev, out_resp->blob_id); |
| 829 | if (!blob) | 829 | if (!blob) |
diff --git a/drivers/gpu/drm/drm_scatter.c b/drivers/gpu/drm/drm_scatter.c index 275bca44f38c..bb829a115fc6 100644 --- a/drivers/gpu/drm/drm_scatter.c +++ b/drivers/gpu/drm/drm_scatter.c | |||
| @@ -89,10 +89,10 @@ int drm_legacy_sg_alloc(struct drm_device *dev, void *data, | |||
| 89 | DRM_DEBUG("\n"); | 89 | DRM_DEBUG("\n"); |
| 90 | 90 | ||
| 91 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 91 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 92 | return -EINVAL; | 92 | return -EOPNOTSUPP; |
| 93 | 93 | ||
| 94 | if (!drm_core_check_feature(dev, DRIVER_SG)) | 94 | if (!drm_core_check_feature(dev, DRIVER_SG)) |
| 95 | return -EINVAL; | 95 | return -EOPNOTSUPP; |
| 96 | 96 | ||
| 97 | if (dev->sg) | 97 | if (dev->sg) |
| 98 | return -EINVAL; | 98 | return -EINVAL; |
| @@ -202,10 +202,10 @@ int drm_legacy_sg_free(struct drm_device *dev, void *data, | |||
| 202 | struct drm_sg_mem *entry; | 202 | struct drm_sg_mem *entry; |
| 203 | 203 | ||
| 204 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) | 204 | if (!drm_core_check_feature(dev, DRIVER_LEGACY)) |
| 205 | return -EINVAL; | 205 | return -EOPNOTSUPP; |
| 206 | 206 | ||
| 207 | if (!drm_core_check_feature(dev, DRIVER_SG)) | 207 | if (!drm_core_check_feature(dev, DRIVER_SG)) |
| 208 | return -EINVAL; | 208 | return -EOPNOTSUPP; |
| 209 | 209 | ||
| 210 | entry = dev->sg; | 210 | entry = dev->sg; |
| 211 | dev->sg = NULL; | 211 | dev->sg = NULL; |
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index e9ce623d049e..497729202bfe 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c | |||
| @@ -573,7 +573,7 @@ drm_syncobj_create_ioctl(struct drm_device *dev, void *data, | |||
| 573 | struct drm_syncobj_create *args = data; | 573 | struct drm_syncobj_create *args = data; |
| 574 | 574 | ||
| 575 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 575 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 576 | return -ENODEV; | 576 | return -EOPNOTSUPP; |
| 577 | 577 | ||
| 578 | /* no valid flags yet */ | 578 | /* no valid flags yet */ |
| 579 | if (args->flags & ~DRM_SYNCOBJ_CREATE_SIGNALED) | 579 | if (args->flags & ~DRM_SYNCOBJ_CREATE_SIGNALED) |
| @@ -590,7 +590,7 @@ drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data, | |||
| 590 | struct drm_syncobj_destroy *args = data; | 590 | struct drm_syncobj_destroy *args = data; |
| 591 | 591 | ||
| 592 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 592 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 593 | return -ENODEV; | 593 | return -EOPNOTSUPP; |
| 594 | 594 | ||
| 595 | /* make sure padding is empty */ | 595 | /* make sure padding is empty */ |
| 596 | if (args->pad) | 596 | if (args->pad) |
| @@ -605,7 +605,7 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data, | |||
| 605 | struct drm_syncobj_handle *args = data; | 605 | struct drm_syncobj_handle *args = data; |
| 606 | 606 | ||
| 607 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 607 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 608 | return -ENODEV; | 608 | return -EOPNOTSUPP; |
| 609 | 609 | ||
| 610 | if (args->pad) | 610 | if (args->pad) |
| 611 | return -EINVAL; | 611 | return -EINVAL; |
| @@ -629,7 +629,7 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, | |||
| 629 | struct drm_syncobj_handle *args = data; | 629 | struct drm_syncobj_handle *args = data; |
| 630 | 630 | ||
| 631 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 631 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 632 | return -ENODEV; | 632 | return -EOPNOTSUPP; |
| 633 | 633 | ||
| 634 | if (args->pad) | 634 | if (args->pad) |
| 635 | return -EINVAL; | 635 | return -EINVAL; |
| @@ -921,7 +921,7 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, | |||
| 921 | int ret = 0; | 921 | int ret = 0; |
| 922 | 922 | ||
| 923 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 923 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 924 | return -ENODEV; | 924 | return -EOPNOTSUPP; |
| 925 | 925 | ||
| 926 | if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | | 926 | if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | |
| 927 | DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)) | 927 | DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)) |
| @@ -955,7 +955,7 @@ drm_syncobj_reset_ioctl(struct drm_device *dev, void *data, | |||
| 955 | int ret; | 955 | int ret; |
| 956 | 956 | ||
| 957 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 957 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 958 | return -ENODEV; | 958 | return -EOPNOTSUPP; |
| 959 | 959 | ||
| 960 | if (args->pad != 0) | 960 | if (args->pad != 0) |
| 961 | return -EINVAL; | 961 | return -EINVAL; |
| @@ -988,7 +988,7 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data, | |||
| 988 | int ret; | 988 | int ret; |
| 989 | 989 | ||
| 990 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) | 990 | if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) |
| 991 | return -ENODEV; | 991 | return -EOPNOTSUPP; |
| 992 | 992 | ||
| 993 | if (args->pad != 0) | 993 | if (args->pad != 0) |
| 994 | return -EINVAL; | 994 | return -EINVAL; |
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index ec2dcfdac8ef..98e091175921 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c | |||
| @@ -1771,7 +1771,7 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data, | |||
| 1771 | int ret; | 1771 | int ret; |
| 1772 | 1772 | ||
| 1773 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 1773 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1774 | return -EINVAL; | 1774 | return -EOPNOTSUPP; |
| 1775 | 1775 | ||
| 1776 | if (!dev->irq_enabled) | 1776 | if (!dev->irq_enabled) |
| 1777 | return -EINVAL; | 1777 | return -EINVAL; |
| @@ -1829,7 +1829,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data, | |||
| 1829 | unsigned long spin_flags; | 1829 | unsigned long spin_flags; |
| 1830 | 1830 | ||
| 1831 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 1831 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1832 | return -EINVAL; | 1832 | return -EOPNOTSUPP; |
| 1833 | 1833 | ||
| 1834 | if (!dev->irq_enabled) | 1834 | if (!dev->irq_enabled) |
| 1835 | return -EINVAL; | 1835 | return -EINVAL; |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 5dd7fc582e6f..2ddf8538cb47 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -1384,14 +1384,14 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1384 | struct drm_i915_private *dev_priv; | 1384 | struct drm_i915_private *dev_priv; |
| 1385 | int ret; | 1385 | int ret; |
| 1386 | 1386 | ||
| 1387 | /* Enable nuclear pageflip on ILK+ */ | ||
| 1388 | if (!i915_modparams.nuclear_pageflip && match_info->gen < 5) | ||
| 1389 | driver.driver_features &= ~DRIVER_ATOMIC; | ||
| 1390 | |||
| 1391 | dev_priv = i915_driver_create(pdev, ent); | 1387 | dev_priv = i915_driver_create(pdev, ent); |
| 1392 | if (!dev_priv) | 1388 | if (!dev_priv) |
| 1393 | return -ENOMEM; | 1389 | return -ENOMEM; |
| 1394 | 1390 | ||
| 1391 | /* Disable nuclear pageflip by default on pre-ILK */ | ||
| 1392 | if (!i915_modparams.nuclear_pageflip && match_info->gen < 5) | ||
| 1393 | dev_priv->drm.driver_features &= ~DRIVER_ATOMIC; | ||
| 1394 | |||
| 1395 | ret = pci_enable_device(pdev); | 1395 | ret = pci_enable_device(pdev); |
| 1396 | if (ret) | 1396 | if (ret) |
| 1397 | goto out_fini; | 1397 | goto out_fini; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index b2bab57cd113..5711cb701760 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -6685,22 +6685,20 @@ intel_reduce_m_n_ratio(uint32_t *num, uint32_t *den) | |||
| 6685 | 6685 | ||
| 6686 | static void compute_m_n(unsigned int m, unsigned int n, | 6686 | static void compute_m_n(unsigned int m, unsigned int n, |
| 6687 | uint32_t *ret_m, uint32_t *ret_n, | 6687 | uint32_t *ret_m, uint32_t *ret_n, |
| 6688 | bool reduce_m_n) | 6688 | bool constant_n) |
| 6689 | { | 6689 | { |
| 6690 | /* | 6690 | /* |
| 6691 | * Reduce M/N as much as possible without loss in precision. Several DP | 6691 | * Several DP dongles in particular seem to be fussy about |
| 6692 | * dongles in particular seem to be fussy about too large *link* M/N | 6692 | * too large link M/N values. Give N value as 0x8000 that |
| 6693 | * values. The passed in values are more likely to have the least | 6693 | * should be acceptable by specific devices. 0x8000 is the |
| 6694 | * significant bits zero than M after rounding below, so do this first. | 6694 | * specified fixed N value for asynchronous clock mode, |
| 6695 | * which the devices expect also in synchronous clock mode. | ||
| 6695 | */ | 6696 | */ |
| 6696 | if (reduce_m_n) { | 6697 | if (constant_n) |
| 6697 | while ((m & 1) == 0 && (n & 1) == 0) { | 6698 | *ret_n = 0x8000; |
| 6698 | m >>= 1; | 6699 | else |
| 6699 | n >>= 1; | 6700 | *ret_n = min_t(unsigned int, roundup_pow_of_two(n), DATA_LINK_N_MAX); |
| 6700 | } | ||
| 6701 | } | ||
| 6702 | 6701 | ||
| 6703 | *ret_n = min_t(unsigned int, roundup_pow_of_two(n), DATA_LINK_N_MAX); | ||
| 6704 | *ret_m = div_u64((uint64_t) m * *ret_n, n); | 6702 | *ret_m = div_u64((uint64_t) m * *ret_n, n); |
| 6705 | intel_reduce_m_n_ratio(ret_m, ret_n); | 6703 | intel_reduce_m_n_ratio(ret_m, ret_n); |
| 6706 | } | 6704 | } |
| @@ -6709,18 +6707,18 @@ void | |||
| 6709 | intel_link_compute_m_n(int bits_per_pixel, int nlanes, | 6707 | intel_link_compute_m_n(int bits_per_pixel, int nlanes, |
| 6710 | int pixel_clock, int link_clock, | 6708 | int pixel_clock, int link_clock, |
| 6711 | struct intel_link_m_n *m_n, | 6709 | struct intel_link_m_n *m_n, |
| 6712 | bool reduce_m_n) | 6710 | bool constant_n) |
| 6713 | { | 6711 | { |
| 6714 | m_n->tu = 64; | 6712 | m_n->tu = 64; |
| 6715 | 6713 | ||
| 6716 | compute_m_n(bits_per_pixel * pixel_clock, | 6714 | compute_m_n(bits_per_pixel * pixel_clock, |
| 6717 | link_clock * nlanes * 8, | 6715 | link_clock * nlanes * 8, |
| 6718 | &m_n->gmch_m, &m_n->gmch_n, | 6716 | &m_n->gmch_m, &m_n->gmch_n, |
| 6719 | reduce_m_n); | 6717 | constant_n); |
| 6720 | 6718 | ||
| 6721 | compute_m_n(pixel_clock, link_clock, | 6719 | compute_m_n(pixel_clock, link_clock, |
| 6722 | &m_n->link_m, &m_n->link_n, | 6720 | &m_n->link_m, &m_n->link_n, |
| 6723 | reduce_m_n); | 6721 | constant_n); |
| 6724 | } | 6722 | } |
| 6725 | 6723 | ||
| 6726 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | 6724 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) |
diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h index ed474da6c200..9fac67e31205 100644 --- a/drivers/gpu/drm/i915/intel_display.h +++ b/drivers/gpu/drm/i915/intel_display.h | |||
| @@ -405,7 +405,7 @@ struct intel_link_m_n { | |||
| 405 | void intel_link_compute_m_n(int bpp, int nlanes, | 405 | void intel_link_compute_m_n(int bpp, int nlanes, |
| 406 | int pixel_clock, int link_clock, | 406 | int pixel_clock, int link_clock, |
| 407 | struct intel_link_m_n *m_n, | 407 | struct intel_link_m_n *m_n, |
| 408 | bool reduce_m_n); | 408 | bool constant_n); |
| 409 | 409 | ||
| 410 | bool is_ccs_modifier(u64 modifier); | 410 | bool is_ccs_modifier(u64 modifier); |
| 411 | #endif | 411 | #endif |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 436c22de33b6..6b4c19123f2a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1998,8 +1998,8 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
| 1998 | struct intel_connector *intel_connector = intel_dp->attached_connector; | 1998 | struct intel_connector *intel_connector = intel_dp->attached_connector; |
| 1999 | struct intel_digital_connector_state *intel_conn_state = | 1999 | struct intel_digital_connector_state *intel_conn_state = |
| 2000 | to_intel_digital_connector_state(conn_state); | 2000 | to_intel_digital_connector_state(conn_state); |
| 2001 | bool reduce_m_n = drm_dp_has_quirk(&intel_dp->desc, | 2001 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, |
| 2002 | DP_DPCD_QUIRK_LIMITED_M_N); | 2002 | DP_DPCD_QUIRK_CONSTANT_N); |
| 2003 | 2003 | ||
| 2004 | if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A) | 2004 | if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A) |
| 2005 | pipe_config->has_pch_encoder = true; | 2005 | pipe_config->has_pch_encoder = true; |
| @@ -2064,7 +2064,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
| 2064 | adjusted_mode->crtc_clock, | 2064 | adjusted_mode->crtc_clock, |
| 2065 | pipe_config->port_clock, | 2065 | pipe_config->port_clock, |
| 2066 | &pipe_config->dp_m_n, | 2066 | &pipe_config->dp_m_n, |
| 2067 | reduce_m_n); | 2067 | constant_n); |
| 2068 | 2068 | ||
| 2069 | if (intel_connector->panel.downclock_mode != NULL && | 2069 | if (intel_connector->panel.downclock_mode != NULL && |
| 2070 | dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) { | 2070 | dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) { |
| @@ -2074,7 +2074,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
| 2074 | intel_connector->panel.downclock_mode->clock, | 2074 | intel_connector->panel.downclock_mode->clock, |
| 2075 | pipe_config->port_clock, | 2075 | pipe_config->port_clock, |
| 2076 | &pipe_config->dp_m2_n2, | 2076 | &pipe_config->dp_m2_n2, |
| 2077 | reduce_m_n); | 2077 | constant_n); |
| 2078 | } | 2078 | } |
| 2079 | 2079 | ||
| 2080 | if (!HAS_DDI(dev_priv)) | 2080 | if (!HAS_DDI(dev_priv)) |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 77920f1a3da1..43db2e9ac575 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
| @@ -45,8 +45,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
| 45 | int lane_count, slots; | 45 | int lane_count, slots; |
| 46 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; | 46 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; |
| 47 | int mst_pbn; | 47 | int mst_pbn; |
| 48 | bool reduce_m_n = drm_dp_has_quirk(&intel_dp->desc, | 48 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, |
| 49 | DP_DPCD_QUIRK_LIMITED_M_N); | 49 | DP_DPCD_QUIRK_CONSTANT_N); |
| 50 | 50 | ||
| 51 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) | 51 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) |
| 52 | return false; | 52 | return false; |
| @@ -87,7 +87,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
| 87 | adjusted_mode->crtc_clock, | 87 | adjusted_mode->crtc_clock, |
| 88 | pipe_config->port_clock, | 88 | pipe_config->port_clock, |
| 89 | &pipe_config->dp_m_n, | 89 | &pipe_config->dp_m_n, |
| 90 | reduce_m_n); | 90 | constant_n); |
| 91 | 91 | ||
| 92 | pipe_config->dp_m_n.tu = slots; | 92 | pipe_config->dp_m_n.tu = slots; |
| 93 | 93 | ||
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c index 82502b351aec..856124806353 100644 --- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c +++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | |||
| @@ -417,6 +417,14 @@ static const struct sun8i_hdmi_phy_variant sun8i_h3_hdmi_phy = { | |||
| 417 | .phy_config = &sun8i_hdmi_phy_config_h3, | 417 | .phy_config = &sun8i_hdmi_phy_config_h3, |
| 418 | }; | 418 | }; |
| 419 | 419 | ||
| 420 | static const struct sun8i_hdmi_phy_variant sun8i_r40_hdmi_phy = { | ||
| 421 | .has_phy_clk = true, | ||
| 422 | .has_second_pll = true, | ||
| 423 | .phy_init = &sun8i_hdmi_phy_init_h3, | ||
| 424 | .phy_disable = &sun8i_hdmi_phy_disable_h3, | ||
| 425 | .phy_config = &sun8i_hdmi_phy_config_h3, | ||
| 426 | }; | ||
| 427 | |||
| 420 | static const struct of_device_id sun8i_hdmi_phy_of_table[] = { | 428 | static const struct of_device_id sun8i_hdmi_phy_of_table[] = { |
| 421 | { | 429 | { |
| 422 | .compatible = "allwinner,sun50i-a64-hdmi-phy", | 430 | .compatible = "allwinner,sun50i-a64-hdmi-phy", |
| @@ -430,6 +438,10 @@ static const struct of_device_id sun8i_hdmi_phy_of_table[] = { | |||
| 430 | .compatible = "allwinner,sun8i-h3-hdmi-phy", | 438 | .compatible = "allwinner,sun8i-h3-hdmi-phy", |
| 431 | .data = &sun8i_h3_hdmi_phy, | 439 | .data = &sun8i_h3_hdmi_phy, |
| 432 | }, | 440 | }, |
| 441 | { | ||
| 442 | .compatible = "allwinner,sun8i-r40-hdmi-phy", | ||
| 443 | .data = &sun8i_r40_hdmi_phy, | ||
| 444 | }, | ||
| 433 | { /* sentinel */ } | 445 | { /* sentinel */ } |
| 434 | }; | 446 | }; |
| 435 | 447 | ||
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index f8f4a40dd1b8..a2d79e18bda7 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <drm/drm_atomic.h> | 36 | #include <drm/drm_atomic.h> |
| 37 | #include <drm/drm_crtc_helper.h> | 37 | #include <drm/drm_crtc_helper.h> |
| 38 | #include <drm/drm_encoder.h> | 38 | #include <drm/drm_encoder.h> |
| 39 | #include <drm/drm_fb_helper.h> | ||
| 39 | #include <drm/ttm/ttm_bo_api.h> | 40 | #include <drm/ttm/ttm_bo_api.h> |
| 40 | #include <drm/ttm/ttm_bo_driver.h> | 41 | #include <drm/ttm/ttm_bo_driver.h> |
| 41 | #include <drm/ttm/ttm_placement.h> | 42 | #include <drm/ttm/ttm_placement.h> |
| @@ -133,6 +134,13 @@ struct virtio_gpu_framebuffer { | |||
| 133 | #define to_virtio_gpu_framebuffer(x) \ | 134 | #define to_virtio_gpu_framebuffer(x) \ |
| 134 | container_of(x, struct virtio_gpu_framebuffer, base) | 135 | container_of(x, struct virtio_gpu_framebuffer, base) |
| 135 | 136 | ||
| 137 | struct virtio_gpu_fbdev { | ||
| 138 | struct drm_fb_helper helper; | ||
| 139 | struct virtio_gpu_framebuffer vgfb; | ||
| 140 | struct virtio_gpu_device *vgdev; | ||
| 141 | struct delayed_work work; | ||
| 142 | }; | ||
| 143 | |||
| 136 | struct virtio_gpu_mman { | 144 | struct virtio_gpu_mman { |
| 137 | struct ttm_bo_global_ref bo_global_ref; | 145 | struct ttm_bo_global_ref bo_global_ref; |
| 138 | struct drm_global_reference mem_global_ref; | 146 | struct drm_global_reference mem_global_ref; |
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c index b5cebc9a179a..b9678c4082ac 100644 --- a/drivers/gpu/drm/virtio/virtgpu_fb.c +++ b/drivers/gpu/drm/virtio/virtgpu_fb.c | |||
| @@ -29,13 +29,6 @@ | |||
| 29 | 29 | ||
| 30 | #define VIRTIO_GPU_FBCON_POLL_PERIOD (HZ / 60) | 30 | #define VIRTIO_GPU_FBCON_POLL_PERIOD (HZ / 60) |
| 31 | 31 | ||
| 32 | struct virtio_gpu_fbdev { | ||
| 33 | struct drm_fb_helper helper; | ||
| 34 | struct virtio_gpu_framebuffer vgfb; | ||
| 35 | struct virtio_gpu_device *vgdev; | ||
| 36 | struct delayed_work work; | ||
| 37 | }; | ||
| 38 | |||
| 39 | static int virtio_gpu_dirty_update(struct virtio_gpu_framebuffer *fb, | 32 | static int virtio_gpu_dirty_update(struct virtio_gpu_framebuffer *fb, |
| 40 | bool store, int x, int y, | 33 | bool store, int x, int y, |
| 41 | int width, int height) | 34 | int width, int height) |
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index 5784c3ea8767..df32811f2c3e 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c | |||
| @@ -490,6 +490,15 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, | |||
| 490 | { | 490 | { |
| 491 | struct virtio_gpu_transfer_to_host_2d *cmd_p; | 491 | struct virtio_gpu_transfer_to_host_2d *cmd_p; |
| 492 | struct virtio_gpu_vbuffer *vbuf; | 492 | struct virtio_gpu_vbuffer *vbuf; |
| 493 | struct virtio_gpu_fbdev *vgfbdev = vgdev->vgfbdev; | ||
| 494 | struct virtio_gpu_framebuffer *fb = &vgfbdev->vgfb; | ||
| 495 | struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->base.obj[0]); | ||
| 496 | bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev); | ||
| 497 | |||
| 498 | if (use_dma_api) | ||
| 499 | dma_sync_sg_for_device(vgdev->vdev->dev.parent, | ||
| 500 | obj->pages->sgl, obj->pages->nents, | ||
| 501 | DMA_TO_DEVICE); | ||
| 493 | 502 | ||
| 494 | cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); | 503 | cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); |
| 495 | memset(cmd_p, 0, sizeof(*cmd_p)); | 504 | memset(cmd_p, 0, sizeof(*cmd_p)); |
| @@ -789,6 +798,15 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, | |||
| 789 | { | 798 | { |
| 790 | struct virtio_gpu_transfer_host_3d *cmd_p; | 799 | struct virtio_gpu_transfer_host_3d *cmd_p; |
| 791 | struct virtio_gpu_vbuffer *vbuf; | 800 | struct virtio_gpu_vbuffer *vbuf; |
| 801 | struct virtio_gpu_fbdev *vgfbdev = vgdev->vgfbdev; | ||
| 802 | struct virtio_gpu_framebuffer *fb = &vgfbdev->vgfb; | ||
| 803 | struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->base.obj[0]); | ||
| 804 | bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev); | ||
| 805 | |||
| 806 | if (use_dma_api) | ||
| 807 | dma_sync_sg_for_device(vgdev->vdev->dev.parent, | ||
| 808 | obj->pages->sgl, obj->pages->nents, | ||
| 809 | DMA_TO_DEVICE); | ||
| 792 | 810 | ||
| 793 | cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); | 811 | cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); |
| 794 | memset(cmd_p, 0, sizeof(*cmd_p)); | 812 | memset(cmd_p, 0, sizeof(*cmd_p)); |
