aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/drm_crtc.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c126
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
167static struct drm_prop_enum_list drm_encoder_enum_list[] = 167static 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
2726void 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}
2744EXPORT_SYMBOL(drm_mode_config_reset);
2745
2746int 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
2756int 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
2768int 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}