diff options
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 54 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 2 |
2 files changed, 52 insertions, 4 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index d3b92618246e..61714fdfc782 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
| @@ -872,16 +872,14 @@ static const struct drm_mode_config_funcs qxl_mode_funcs = { | |||
| 872 | .fb_create = qxl_user_framebuffer_create, | 872 | .fb_create = qxl_user_framebuffer_create, |
| 873 | }; | 873 | }; |
| 874 | 874 | ||
| 875 | int qxl_modeset_init(struct qxl_device *qdev) | 875 | int qxl_create_monitors_object(struct qxl_device *qdev) |
| 876 | { | 876 | { |
| 877 | int i; | ||
| 878 | int ret; | 877 | int ret; |
| 879 | struct drm_gem_object *gobj; | 878 | struct drm_gem_object *gobj; |
| 880 | int max_allowed = qxl_num_crtc; | 879 | int max_allowed = qxl_num_crtc; |
| 881 | int monitors_config_size = sizeof(struct qxl_monitors_config) + | 880 | int monitors_config_size = sizeof(struct qxl_monitors_config) + |
| 882 | max_allowed * sizeof(struct qxl_head); | 881 | max_allowed * sizeof(struct qxl_head); |
| 883 | 882 | ||
| 884 | drm_mode_config_init(qdev->ddev); | ||
| 885 | ret = qxl_gem_object_create(qdev, monitors_config_size, 0, | 883 | ret = qxl_gem_object_create(qdev, monitors_config_size, 0, |
| 886 | QXL_GEM_DOMAIN_VRAM, | 884 | QXL_GEM_DOMAIN_VRAM, |
| 887 | false, false, NULL, &gobj); | 885 | false, false, NULL, &gobj); |
| @@ -890,13 +888,59 @@ int qxl_modeset_init(struct qxl_device *qdev) | |||
| 890 | return -ENOMEM; | 888 | return -ENOMEM; |
| 891 | } | 889 | } |
| 892 | qdev->monitors_config_bo = gem_to_qxl_bo(gobj); | 890 | qdev->monitors_config_bo = gem_to_qxl_bo(gobj); |
| 891 | |||
| 892 | ret = qxl_bo_reserve(qdev->monitors_config_bo, false); | ||
| 893 | if (ret) | ||
| 894 | return ret; | ||
| 895 | |||
| 896 | ret = qxl_bo_pin(qdev->monitors_config_bo, QXL_GEM_DOMAIN_VRAM, NULL); | ||
| 897 | if (ret) { | ||
| 898 | qxl_bo_unreserve(qdev->monitors_config_bo); | ||
| 899 | return ret; | ||
| 900 | } | ||
| 901 | |||
| 902 | qxl_bo_unreserve(qdev->monitors_config_bo); | ||
| 903 | |||
| 893 | qxl_bo_kmap(qdev->monitors_config_bo, NULL); | 904 | qxl_bo_kmap(qdev->monitors_config_bo, NULL); |
| 905 | |||
| 894 | qdev->monitors_config = qdev->monitors_config_bo->kptr; | 906 | qdev->monitors_config = qdev->monitors_config_bo->kptr; |
| 895 | qdev->ram_header->monitors_config = | 907 | qdev->ram_header->monitors_config = |
| 896 | qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); | 908 | qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); |
| 897 | 909 | ||
| 898 | memset(qdev->monitors_config, 0, monitors_config_size); | 910 | memset(qdev->monitors_config, 0, monitors_config_size); |
| 899 | qdev->monitors_config->max_allowed = max_allowed; | 911 | qdev->monitors_config->max_allowed = max_allowed; |
| 912 | return 0; | ||
| 913 | } | ||
| 914 | |||
| 915 | int qxl_destroy_monitors_object(struct qxl_device *qdev) | ||
| 916 | { | ||
| 917 | int ret; | ||
| 918 | |||
| 919 | qdev->monitors_config = NULL; | ||
| 920 | qdev->ram_header->monitors_config = 0; | ||
| 921 | |||
| 922 | qxl_bo_kunmap(qdev->monitors_config_bo); | ||
| 923 | ret = qxl_bo_reserve(qdev->monitors_config_bo, false); | ||
| 924 | if (ret) | ||
| 925 | return ret; | ||
| 926 | |||
| 927 | qxl_bo_unpin(qdev->monitors_config_bo); | ||
| 928 | qxl_bo_unreserve(qdev->monitors_config_bo); | ||
| 929 | |||
| 930 | qxl_bo_unref(&qdev->monitors_config_bo); | ||
| 931 | return 0; | ||
| 932 | } | ||
| 933 | |||
| 934 | int qxl_modeset_init(struct qxl_device *qdev) | ||
| 935 | { | ||
| 936 | int i; | ||
| 937 | int ret; | ||
| 938 | |||
| 939 | drm_mode_config_init(qdev->ddev); | ||
| 940 | |||
| 941 | ret = qxl_create_monitors_object(qdev); | ||
| 942 | if (ret) | ||
| 943 | return ret; | ||
| 900 | 944 | ||
| 901 | qdev->ddev->mode_config.funcs = (void *)&qxl_mode_funcs; | 945 | qdev->ddev->mode_config.funcs = (void *)&qxl_mode_funcs; |
| 902 | 946 | ||
| @@ -924,6 +968,8 @@ int qxl_modeset_init(struct qxl_device *qdev) | |||
| 924 | void qxl_modeset_fini(struct qxl_device *qdev) | 968 | void qxl_modeset_fini(struct qxl_device *qdev) |
| 925 | { | 969 | { |
| 926 | qxl_fbdev_fini(qdev); | 970 | qxl_fbdev_fini(qdev); |
| 971 | |||
| 972 | qxl_destroy_monitors_object(qdev); | ||
| 927 | if (qdev->mode_info.mode_config_initialized) { | 973 | if (qdev->mode_info.mode_config_initialized) { |
| 928 | drm_mode_config_cleanup(qdev->ddev); | 974 | drm_mode_config_cleanup(qdev->ddev); |
| 929 | qdev->mode_info.mode_config_initialized = false; | 975 | qdev->mode_info.mode_config_initialized = false; |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 42ef0e2b5094..6a929258fff9 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
| @@ -374,6 +374,8 @@ qxl_framebuffer_init(struct drm_device *dev, | |||
| 374 | struct drm_gem_object *obj); | 374 | struct drm_gem_object *obj); |
| 375 | void qxl_display_read_client_monitors_config(struct qxl_device *qdev); | 375 | void qxl_display_read_client_monitors_config(struct qxl_device *qdev); |
| 376 | void qxl_send_monitors_config(struct qxl_device *qdev); | 376 | void qxl_send_monitors_config(struct qxl_device *qdev); |
| 377 | int qxl_create_monitors_object(struct qxl_device *qdev); | ||
| 378 | int qxl_destroy_monitors_object(struct qxl_device *qdev); | ||
| 377 | 379 | ||
| 378 | /* used by qxl_debugfs only */ | 380 | /* used by qxl_debugfs only */ |
| 379 | void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev); | 381 | void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev); |
