aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c190
-rw-r--r--drivers/gpu/drm/drm_drv.c4
-rw-r--r--include/drm/drm_crtc.h15
-rw-r--r--include/uapi/drm/drm.h4
4 files changed, 4 insertions, 209 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 287cd82f9d75..3a8f7e6db295 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -703,7 +703,6 @@ int drm_connector_init(struct drm_device *dev,
703 connector->connector_type = connector_type; 703 connector->connector_type = connector_type;
704 connector->connector_type_id = 704 connector->connector_type_id =
705 ++drm_connector_enum_list[connector_type].count; /* TODO */ 705 ++drm_connector_enum_list[connector_type].count; /* TODO */
706 INIT_LIST_HEAD(&connector->user_modes);
707 INIT_LIST_HEAD(&connector->probed_modes); 706 INIT_LIST_HEAD(&connector->probed_modes);
708 INIT_LIST_HEAD(&connector->modes); 707 INIT_LIST_HEAD(&connector->modes);
709 connector->edid_blob_ptr = NULL; 708 connector->edid_blob_ptr = NULL;
@@ -744,9 +743,6 @@ void drm_connector_cleanup(struct drm_connector *connector)
744 list_for_each_entry_safe(mode, t, &connector->modes, head) 743 list_for_each_entry_safe(mode, t, &connector->modes, head)
745 drm_mode_remove(connector, mode); 744 drm_mode_remove(connector, mode);
746 745
747 list_for_each_entry_safe(mode, t, &connector->user_modes, head)
748 drm_mode_remove(connector, mode);
749
750 drm_mode_object_put(dev, &connector->base); 746 drm_mode_object_put(dev, &connector->base);
751 list_del(&connector->head); 747 list_del(&connector->head);
752 dev->mode_config.num_connector--; 748 dev->mode_config.num_connector--;
@@ -2613,192 +2609,6 @@ void drm_fb_release(struct drm_file *priv)
2613 mutex_unlock(&priv->fbs_lock); 2609 mutex_unlock(&priv->fbs_lock);
2614} 2610}
2615 2611
2616/**
2617 * drm_mode_attachmode - add a mode to the user mode list
2618 * @dev: DRM device
2619 * @connector: connector to add the mode to
2620 * @mode: mode to add
2621 *
2622 * Add @mode to @connector's user mode list.
2623 */
2624static void drm_mode_attachmode(struct drm_device *dev,
2625 struct drm_connector *connector,
2626 struct drm_display_mode *mode)
2627{
2628 list_add_tail(&mode->head, &connector->user_modes);
2629}
2630
2631int drm_mode_attachmode_crtc(struct drm_device *dev, struct drm_crtc *crtc,
2632 const struct drm_display_mode *mode)
2633{
2634 struct drm_connector *connector;
2635 int ret = 0;
2636 struct drm_display_mode *dup_mode, *next;
2637 LIST_HEAD(list);
2638
2639 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2640 if (!connector->encoder)
2641 continue;
2642 if (connector->encoder->crtc == crtc) {
2643 dup_mode = drm_mode_duplicate(dev, mode);
2644 if (!dup_mode) {
2645 ret = -ENOMEM;
2646 goto out;
2647 }
2648 list_add_tail(&dup_mode->head, &list);
2649 }
2650 }
2651
2652 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2653 if (!connector->encoder)
2654 continue;
2655 if (connector->encoder->crtc == crtc)
2656 list_move_tail(list.next, &connector->user_modes);
2657 }
2658
2659 WARN_ON(!list_empty(&list));
2660
2661 out:
2662 list_for_each_entry_safe(dup_mode, next, &list, head)
2663 drm_mode_destroy(dev, dup_mode);
2664
2665 return ret;
2666}
2667EXPORT_SYMBOL(drm_mode_attachmode_crtc);
2668
2669static int drm_mode_detachmode(struct drm_device *dev,
2670 struct drm_connector *connector,
2671 struct drm_display_mode *mode)
2672{
2673 int found = 0;
2674 int ret = 0;
2675 struct drm_display_mode *match_mode, *t;
2676
2677 list_for_each_entry_safe(match_mode, t, &connector->user_modes, head) {
2678 if (drm_mode_equal(match_mode, mode)) {
2679 list_del(&match_mode->head);
2680 drm_mode_destroy(dev, match_mode);
2681 found = 1;
2682 break;
2683 }
2684 }
2685
2686 if (!found)
2687 ret = -EINVAL;
2688
2689 return ret;
2690}
2691
2692int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode)
2693{
2694 struct drm_connector *connector;
2695
2696 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
2697 drm_mode_detachmode(dev, connector, mode);
2698 }
2699 return 0;
2700}
2701EXPORT_SYMBOL(drm_mode_detachmode_crtc);
2702
2703/**
2704 * drm_fb_attachmode - Attach a user mode to an connector
2705 * @dev: drm device for the ioctl
2706 * @data: data pointer for the ioctl
2707 * @file_priv: drm file for the ioctl call
2708 *
2709 * This attaches a user specified mode to an connector.
2710 * Called by the user via ioctl.
2711 *
2712 * RETURNS:
2713 * Zero on success, errno on failure.
2714 */
2715int drm_mode_attachmode_ioctl(struct drm_device *dev,
2716 void *data, struct drm_file *file_priv)
2717{
2718 struct drm_mode_mode_cmd *mode_cmd = data;
2719 struct drm_connector *connector;
2720 struct drm_display_mode *mode;
2721 struct drm_mode_object *obj;
2722 struct drm_mode_modeinfo *umode = &mode_cmd->mode;
2723 int ret;
2724
2725 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2726 return -EINVAL;
2727
2728 drm_modeset_lock_all(dev);
2729
2730 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);
2731 if (!obj) {
2732 ret = -EINVAL;
2733 goto out;
2734 }
2735 connector = obj_to_connector(obj);
2736
2737 mode = drm_mode_create(dev);
2738 if (!mode) {
2739 ret = -ENOMEM;
2740 goto out;
2741 }
2742
2743 ret = drm_crtc_convert_umode(mode, umode);
2744 if (ret) {
2745 DRM_DEBUG_KMS("Invalid mode\n");
2746 drm_mode_destroy(dev, mode);
2747 goto out;
2748 }
2749
2750 drm_mode_attachmode(dev, connector, mode);
2751out:
2752 drm_modeset_unlock_all(dev);
2753 return ret;
2754}
2755
2756
2757/**
2758 * drm_fb_detachmode - Detach a user specified mode from an connector
2759 * @dev: drm device for the ioctl
2760 * @data: data pointer for the ioctl
2761 * @file_priv: drm file for the ioctl call
2762 *
2763 * Called by the user via ioctl.
2764 *
2765 * RETURNS:
2766 * Zero on success, errno on failure.
2767 */
2768int drm_mode_detachmode_ioctl(struct drm_device *dev,
2769 void *data, struct drm_file *file_priv)
2770{
2771 struct drm_mode_object *obj;
2772 struct drm_mode_mode_cmd *mode_cmd = data;
2773 struct drm_connector *connector;
2774 struct drm_display_mode mode;
2775 struct drm_mode_modeinfo *umode = &mode_cmd->mode;
2776 int ret;
2777
2778 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2779 return -EINVAL;
2780
2781 drm_modeset_lock_all(dev);
2782
2783 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);
2784 if (!obj) {
2785 ret = -EINVAL;
2786 goto out;
2787 }
2788 connector = obj_to_connector(obj);
2789
2790 ret = drm_crtc_convert_umode(&mode, umode);
2791 if (ret) {
2792 DRM_DEBUG_KMS("Invalid mode\n");
2793 goto out;
2794 }
2795
2796 ret = drm_mode_detachmode(dev, connector, &mode);
2797out:
2798 drm_modeset_unlock_all(dev);
2799 return ret;
2800}
2801
2802struct drm_property *drm_property_create(struct drm_device *dev, int flags, 2612struct drm_property *drm_property_create(struct drm_device *dev, int flags,
2803 const char *name, int num_values) 2613 const char *name, int num_values)
2804{ 2614{
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 80c68957e7cf..8d4f29075af5 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -150,8 +150,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
150 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED), 150 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_CONTROL_ALLOW|DRM_UNLOCKED), 151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_CONTROL_ALLOW|DRM_UNLOCKED), 152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_mode_attachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
154 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_mode_detachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 154 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
155 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED), 155 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
156 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 156 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
157 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED), 157 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index cf474498cee0..adb3f9b625f6 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -554,7 +554,6 @@ enum drm_connector_force {
554 * @probed_modes: list of modes derived directly from the display 554 * @probed_modes: list of modes derived directly from the display
555 * @display_info: information about attached display (e.g. from EDID) 555 * @display_info: information about attached display (e.g. from EDID)
556 * @funcs: connector control functions 556 * @funcs: connector control functions
557 * @user_modes: user added mode list
558 * @edid_blob_ptr: DRM property containing EDID if present 557 * @edid_blob_ptr: DRM property containing EDID if present
559 * @properties: property tracking for this connector 558 * @properties: property tracking for this connector
560 * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling 559 * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling
@@ -598,7 +597,6 @@ struct drm_connector {
598 struct drm_display_info display_info; 597 struct drm_display_info display_info;
599 const struct drm_connector_funcs *funcs; 598 const struct drm_connector_funcs *funcs;
600 599
601 struct list_head user_modes;
602 struct drm_property_blob *edid_blob_ptr; 600 struct drm_property_blob *edid_blob_ptr;
603 struct drm_object_properties properties; 601 struct drm_object_properties properties;
604 602
@@ -927,11 +925,6 @@ extern int drm_mode_width(const struct drm_display_mode *mode);
927extern int drm_mode_height(const struct drm_display_mode *mode); 925extern int drm_mode_height(const struct drm_display_mode *mode);
928 926
929/* for us by fb module */ 927/* for us by fb module */
930extern int drm_mode_attachmode_crtc(struct drm_device *dev,
931 struct drm_crtc *crtc,
932 const struct drm_display_mode *mode);
933extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode);
934
935extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); 928extern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
936extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); 929extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
937extern void drm_mode_list_concat(struct list_head *head, 930extern void drm_mode_list_concat(struct list_head *head,
@@ -1040,14 +1033,6 @@ extern int drm_mode_getfb(struct drm_device *dev,
1040 void *data, struct drm_file *file_priv); 1033 void *data, struct drm_file *file_priv);
1041extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev, 1034extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1042 void *data, struct drm_file *file_priv); 1035 void *data, struct drm_file *file_priv);
1043extern int drm_mode_addmode_ioctl(struct drm_device *dev,
1044 void *data, struct drm_file *file_priv);
1045extern int drm_mode_rmmode_ioctl(struct drm_device *dev,
1046 void *data, struct drm_file *file_priv);
1047extern int drm_mode_attachmode_ioctl(struct drm_device *dev,
1048 void *data, struct drm_file *file_priv);
1049extern int drm_mode_detachmode_ioctl(struct drm_device *dev,
1050 void *data, struct drm_file *file_priv);
1051 1036
1052extern int drm_mode_getproperty_ioctl(struct drm_device *dev, 1037extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
1053 void *data, struct drm_file *file_priv); 1038 void *data, struct drm_file *file_priv);
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 73a99e4664be..5a57be68bab7 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -711,8 +711,8 @@ struct drm_prime_handle {
711#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut) 711#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
712#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder) 712#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
713#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector) 713#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
714#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) 714#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) /* deprecated (never worked) */
715#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) 715#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) /* deprecated (never worked) */
716 716
717#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property) 717#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
718#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property) 718#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)