diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/drm_crtc.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 126 |
1 files changed, 114 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 37e0b4fa482a..82db18506662 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -156,12 +156,12 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] = | |||
156 | { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, | 156 | { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, |
157 | { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, | 157 | { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, |
158 | { DRM_MODE_CONNECTOR_Component, "Component", 0 }, | 158 | { DRM_MODE_CONNECTOR_Component, "Component", 0 }, |
159 | { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN", 0 }, | 159 | { DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 }, |
160 | { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 }, | 160 | { DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 }, |
161 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, | 161 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 }, |
162 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, | 162 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 }, |
163 | { DRM_MODE_CONNECTOR_TV, "TV", 0 }, | 163 | { DRM_MODE_CONNECTOR_TV, "TV", 0 }, |
164 | { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 }, | 164 | { DRM_MODE_CONNECTOR_eDP, "eDP", 0 }, |
165 | }; | 165 | }; |
166 | 166 | ||
167 | static struct drm_prop_enum_list drm_encoder_enum_list[] = | 167 | static struct drm_prop_enum_list drm_encoder_enum_list[] = |
@@ -886,9 +886,6 @@ int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group) | |||
886 | total_objects += dev->mode_config.num_connector; | 886 | total_objects += dev->mode_config.num_connector; |
887 | total_objects += dev->mode_config.num_encoder; | 887 | total_objects += dev->mode_config.num_encoder; |
888 | 888 | ||
889 | if (total_objects == 0) | ||
890 | return -EINVAL; | ||
891 | |||
892 | group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); | 889 | group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); |
893 | if (!group->id_list) | 890 | if (!group->id_list) |
894 | return -ENOMEM; | 891 | return -ENOMEM; |
@@ -1073,6 +1070,9 @@ int drm_mode_getresources(struct drm_device *dev, void *data, | |||
1073 | uint32_t __user *encoder_id; | 1070 | uint32_t __user *encoder_id; |
1074 | struct drm_mode_group *mode_group; | 1071 | struct drm_mode_group *mode_group; |
1075 | 1072 | ||
1073 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1074 | return -EINVAL; | ||
1075 | |||
1076 | mutex_lock(&dev->mode_config.mutex); | 1076 | mutex_lock(&dev->mode_config.mutex); |
1077 | 1077 | ||
1078 | /* | 1078 | /* |
@@ -1110,7 +1110,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data, | |||
1110 | if (card_res->count_fbs >= fb_count) { | 1110 | if (card_res->count_fbs >= fb_count) { |
1111 | copied = 0; | 1111 | copied = 0; |
1112 | fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr; | 1112 | fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr; |
1113 | list_for_each_entry(fb, &file_priv->fbs, head) { | 1113 | list_for_each_entry(fb, &file_priv->fbs, filp_head) { |
1114 | if (put_user(fb->base.id, fb_id + copied)) { | 1114 | if (put_user(fb->base.id, fb_id + copied)) { |
1115 | ret = -EFAULT; | 1115 | ret = -EFAULT; |
1116 | goto out; | 1116 | goto out; |
@@ -1244,6 +1244,9 @@ int drm_mode_getcrtc(struct drm_device *dev, | |||
1244 | struct drm_mode_object *obj; | 1244 | struct drm_mode_object *obj; |
1245 | int ret = 0; | 1245 | int ret = 0; |
1246 | 1246 | ||
1247 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1248 | return -EINVAL; | ||
1249 | |||
1247 | mutex_lock(&dev->mode_config.mutex); | 1250 | mutex_lock(&dev->mode_config.mutex); |
1248 | 1251 | ||
1249 | obj = drm_mode_object_find(dev, crtc_resp->crtc_id, | 1252 | obj = drm_mode_object_find(dev, crtc_resp->crtc_id, |
@@ -1312,6 +1315,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
1312 | uint64_t __user *prop_values; | 1315 | uint64_t __user *prop_values; |
1313 | uint32_t __user *encoder_ptr; | 1316 | uint32_t __user *encoder_ptr; |
1314 | 1317 | ||
1318 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1319 | return -EINVAL; | ||
1320 | |||
1315 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); | 1321 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); |
1316 | 1322 | ||
1317 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); | 1323 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); |
@@ -1431,6 +1437,9 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, | |||
1431 | struct drm_encoder *encoder; | 1437 | struct drm_encoder *encoder; |
1432 | int ret = 0; | 1438 | int ret = 0; |
1433 | 1439 | ||
1440 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1441 | return -EINVAL; | ||
1442 | |||
1434 | mutex_lock(&dev->mode_config.mutex); | 1443 | mutex_lock(&dev->mode_config.mutex); |
1435 | obj = drm_mode_object_find(dev, enc_resp->encoder_id, | 1444 | obj = drm_mode_object_find(dev, enc_resp->encoder_id, |
1436 | DRM_MODE_OBJECT_ENCODER); | 1445 | DRM_MODE_OBJECT_ENCODER); |
@@ -1486,6 +1495,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
1486 | int ret = 0; | 1495 | int ret = 0; |
1487 | int i; | 1496 | int i; |
1488 | 1497 | ||
1498 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1499 | return -EINVAL; | ||
1500 | |||
1489 | mutex_lock(&dev->mode_config.mutex); | 1501 | mutex_lock(&dev->mode_config.mutex); |
1490 | obj = drm_mode_object_find(dev, crtc_req->crtc_id, | 1502 | obj = drm_mode_object_find(dev, crtc_req->crtc_id, |
1491 | DRM_MODE_OBJECT_CRTC); | 1503 | DRM_MODE_OBJECT_CRTC); |
@@ -1603,6 +1615,9 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, | |||
1603 | struct drm_crtc *crtc; | 1615 | struct drm_crtc *crtc; |
1604 | int ret = 0; | 1616 | int ret = 0; |
1605 | 1617 | ||
1618 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1619 | return -EINVAL; | ||
1620 | |||
1606 | if (!req->flags) { | 1621 | if (!req->flags) { |
1607 | DRM_ERROR("no operation set\n"); | 1622 | DRM_ERROR("no operation set\n"); |
1608 | return -EINVAL; | 1623 | return -EINVAL; |
@@ -1667,6 +1682,9 @@ int drm_mode_addfb(struct drm_device *dev, | |||
1667 | struct drm_framebuffer *fb; | 1682 | struct drm_framebuffer *fb; |
1668 | int ret = 0; | 1683 | int ret = 0; |
1669 | 1684 | ||
1685 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1686 | return -EINVAL; | ||
1687 | |||
1670 | if ((config->min_width > r->width) || (r->width > config->max_width)) { | 1688 | if ((config->min_width > r->width) || (r->width > config->max_width)) { |
1671 | DRM_ERROR("mode new framebuffer width not within limits\n"); | 1689 | DRM_ERROR("mode new framebuffer width not within limits\n"); |
1672 | return -EINVAL; | 1690 | return -EINVAL; |
@@ -1678,7 +1696,7 @@ int drm_mode_addfb(struct drm_device *dev, | |||
1678 | 1696 | ||
1679 | mutex_lock(&dev->mode_config.mutex); | 1697 | mutex_lock(&dev->mode_config.mutex); |
1680 | 1698 | ||
1681 | /* TODO check buffer is sufficently large */ | 1699 | /* TODO check buffer is sufficiently large */ |
1682 | /* TODO setup destructor callback */ | 1700 | /* TODO setup destructor callback */ |
1683 | 1701 | ||
1684 | fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); | 1702 | fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); |
@@ -1724,9 +1742,12 @@ int drm_mode_rmfb(struct drm_device *dev, | |||
1724 | int ret = 0; | 1742 | int ret = 0; |
1725 | int found = 0; | 1743 | int found = 0; |
1726 | 1744 | ||
1745 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1746 | return -EINVAL; | ||
1747 | |||
1727 | mutex_lock(&dev->mode_config.mutex); | 1748 | mutex_lock(&dev->mode_config.mutex); |
1728 | obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); | 1749 | obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); |
1729 | /* TODO check that we realy get a framebuffer back. */ | 1750 | /* TODO check that we really get a framebuffer back. */ |
1730 | if (!obj) { | 1751 | if (!obj) { |
1731 | DRM_ERROR("mode invalid framebuffer id\n"); | 1752 | DRM_ERROR("mode invalid framebuffer id\n"); |
1732 | ret = -EINVAL; | 1753 | ret = -EINVAL; |
@@ -1780,6 +1801,9 @@ int drm_mode_getfb(struct drm_device *dev, | |||
1780 | struct drm_framebuffer *fb; | 1801 | struct drm_framebuffer *fb; |
1781 | int ret = 0; | 1802 | int ret = 0; |
1782 | 1803 | ||
1804 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1805 | return -EINVAL; | ||
1806 | |||
1783 | mutex_lock(&dev->mode_config.mutex); | 1807 | mutex_lock(&dev->mode_config.mutex); |
1784 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); | 1808 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
1785 | if (!obj) { | 1809 | if (!obj) { |
@@ -1813,6 +1837,9 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, | |||
1813 | int num_clips; | 1837 | int num_clips; |
1814 | int ret = 0; | 1838 | int ret = 0; |
1815 | 1839 | ||
1840 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1841 | return -EINVAL; | ||
1842 | |||
1816 | mutex_lock(&dev->mode_config.mutex); | 1843 | mutex_lock(&dev->mode_config.mutex); |
1817 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); | 1844 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
1818 | if (!obj) { | 1845 | if (!obj) { |
@@ -1854,7 +1881,8 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, | |||
1854 | } | 1881 | } |
1855 | 1882 | ||
1856 | if (fb->funcs->dirty) { | 1883 | if (fb->funcs->dirty) { |
1857 | ret = fb->funcs->dirty(fb, flags, r->color, clips, num_clips); | 1884 | ret = fb->funcs->dirty(fb, file_priv, flags, r->color, |
1885 | clips, num_clips); | ||
1858 | } else { | 1886 | } else { |
1859 | ret = -ENOSYS; | 1887 | ret = -ENOSYS; |
1860 | goto out_err2; | 1888 | goto out_err2; |
@@ -1995,6 +2023,9 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev, | |||
1995 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; | 2023 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
1996 | int ret = 0; | 2024 | int ret = 0; |
1997 | 2025 | ||
2026 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2027 | return -EINVAL; | ||
2028 | |||
1998 | mutex_lock(&dev->mode_config.mutex); | 2029 | mutex_lock(&dev->mode_config.mutex); |
1999 | 2030 | ||
2000 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2031 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2041,6 +2072,9 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev, | |||
2041 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; | 2072 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
2042 | int ret = 0; | 2073 | int ret = 0; |
2043 | 2074 | ||
2075 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2076 | return -EINVAL; | ||
2077 | |||
2044 | mutex_lock(&dev->mode_config.mutex); | 2078 | mutex_lock(&dev->mode_config.mutex); |
2045 | 2079 | ||
2046 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2080 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2210,6 +2244,9 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev, | |||
2210 | uint64_t __user *values_ptr; | 2244 | uint64_t __user *values_ptr; |
2211 | uint32_t __user *blob_length_ptr; | 2245 | uint32_t __user *blob_length_ptr; |
2212 | 2246 | ||
2247 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2248 | return -EINVAL; | ||
2249 | |||
2213 | mutex_lock(&dev->mode_config.mutex); | 2250 | mutex_lock(&dev->mode_config.mutex); |
2214 | obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); | 2251 | obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); |
2215 | if (!obj) { | 2252 | if (!obj) { |
@@ -2332,6 +2369,9 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, | |||
2332 | int ret = 0; | 2369 | int ret = 0; |
2333 | void *blob_ptr; | 2370 | void *blob_ptr; |
2334 | 2371 | ||
2372 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2373 | return -EINVAL; | ||
2374 | |||
2335 | mutex_lock(&dev->mode_config.mutex); | 2375 | mutex_lock(&dev->mode_config.mutex); |
2336 | obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); | 2376 | obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); |
2337 | if (!obj) { | 2377 | if (!obj) { |
@@ -2392,6 +2432,9 @@ int drm_mode_connector_property_set_ioctl(struct drm_device *dev, | |||
2392 | int ret = -EINVAL; | 2432 | int ret = -EINVAL; |
2393 | int i; | 2433 | int i; |
2394 | 2434 | ||
2435 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2436 | return -EINVAL; | ||
2437 | |||
2395 | mutex_lock(&dev->mode_config.mutex); | 2438 | mutex_lock(&dev->mode_config.mutex); |
2396 | 2439 | ||
2397 | obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2440 | obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2508,6 +2551,9 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev, | |||
2508 | int size; | 2551 | int size; |
2509 | int ret = 0; | 2552 | int ret = 0; |
2510 | 2553 | ||
2554 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2555 | return -EINVAL; | ||
2556 | |||
2511 | mutex_lock(&dev->mode_config.mutex); | 2557 | mutex_lock(&dev->mode_config.mutex); |
2512 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); | 2558 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
2513 | if (!obj) { | 2559 | if (!obj) { |
@@ -2559,6 +2605,9 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev, | |||
2559 | int size; | 2605 | int size; |
2560 | int ret = 0; | 2606 | int ret = 0; |
2561 | 2607 | ||
2608 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2609 | return -EINVAL; | ||
2610 | |||
2562 | mutex_lock(&dev->mode_config.mutex); | 2611 | mutex_lock(&dev->mode_config.mutex); |
2563 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); | 2612 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
2564 | if (!obj) { | 2613 | if (!obj) { |
@@ -2673,3 +2722,56 @@ out: | |||
2673 | mutex_unlock(&dev->mode_config.mutex); | 2722 | mutex_unlock(&dev->mode_config.mutex); |
2674 | return ret; | 2723 | return ret; |
2675 | } | 2724 | } |
2725 | |||
2726 | void drm_mode_config_reset(struct drm_device *dev) | ||
2727 | { | ||
2728 | struct drm_crtc *crtc; | ||
2729 | struct drm_encoder *encoder; | ||
2730 | struct drm_connector *connector; | ||
2731 | |||
2732 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | ||
2733 | if (crtc->funcs->reset) | ||
2734 | crtc->funcs->reset(crtc); | ||
2735 | |||
2736 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) | ||
2737 | if (encoder->funcs->reset) | ||
2738 | encoder->funcs->reset(encoder); | ||
2739 | |||
2740 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) | ||
2741 | if (connector->funcs->reset) | ||
2742 | connector->funcs->reset(connector); | ||
2743 | } | ||
2744 | EXPORT_SYMBOL(drm_mode_config_reset); | ||
2745 | |||
2746 | int drm_mode_create_dumb_ioctl(struct drm_device *dev, | ||
2747 | void *data, struct drm_file *file_priv) | ||
2748 | { | ||
2749 | struct drm_mode_create_dumb *args = data; | ||
2750 | |||
2751 | if (!dev->driver->dumb_create) | ||
2752 | return -ENOSYS; | ||
2753 | return dev->driver->dumb_create(file_priv, dev, args); | ||
2754 | } | ||
2755 | |||
2756 | int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, | ||
2757 | void *data, struct drm_file *file_priv) | ||
2758 | { | ||
2759 | struct drm_mode_map_dumb *args = data; | ||
2760 | |||
2761 | /* call driver ioctl to get mmap offset */ | ||
2762 | if (!dev->driver->dumb_map_offset) | ||
2763 | return -ENOSYS; | ||
2764 | |||
2765 | return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset); | ||
2766 | } | ||
2767 | |||
2768 | int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, | ||
2769 | void *data, struct drm_file *file_priv) | ||
2770 | { | ||
2771 | struct drm_mode_destroy_dumb *args = data; | ||
2772 | |||
2773 | if (!dev->driver->dumb_destroy) | ||
2774 | return -ENOSYS; | ||
2775 | |||
2776 | return dev->driver->dumb_destroy(file_priv, dev, args->handle); | ||
2777 | } | ||