aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2015-02-02 12:13:57 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-02-03 03:09:22 -0500
commitf79d1548b0fea94f2ccf089e49480da5202918bc (patch)
tree60a7c69213b512092e341257d8f673b54275be62
parenteb2ed66fe56f30c6ea841ac11681a2f51049b221 (diff)
drm/modes: Print the mode status in human readable form
Currently when a mode is rejected the reason is printed as a raw number. Having to manually decode that to a enum drm_mode_status value is tiresome. Have the code do the decoding instead and print the result in a human readable format. Just having an array of strings indexed with the mode status doesn't work since the enum includes negative values. So we offset the status by +3 which makes all the indexes non-negative. Also add a bit of paranoia into the code to catch out of bounds accesses in case someone adds more enum values but forgets to update the code. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/drm_modes.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 20d977a52c58..487d0e35c134 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -1011,6 +1011,62 @@ drm_mode_validate_size(const struct drm_display_mode *mode,
1011} 1011}
1012EXPORT_SYMBOL(drm_mode_validate_size); 1012EXPORT_SYMBOL(drm_mode_validate_size);
1013 1013
1014#define MODE_STATUS(status) [MODE_ ## status + 3] = #status
1015
1016static const char * const drm_mode_status_names[] = {
1017 MODE_STATUS(OK),
1018 MODE_STATUS(HSYNC),
1019 MODE_STATUS(VSYNC),
1020 MODE_STATUS(H_ILLEGAL),
1021 MODE_STATUS(V_ILLEGAL),
1022 MODE_STATUS(BAD_WIDTH),
1023 MODE_STATUS(NOMODE),
1024 MODE_STATUS(NO_INTERLACE),
1025 MODE_STATUS(NO_DBLESCAN),
1026 MODE_STATUS(NO_VSCAN),
1027 MODE_STATUS(MEM),
1028 MODE_STATUS(VIRTUAL_X),
1029 MODE_STATUS(VIRTUAL_Y),
1030 MODE_STATUS(MEM_VIRT),
1031 MODE_STATUS(NOCLOCK),
1032 MODE_STATUS(CLOCK_HIGH),
1033 MODE_STATUS(CLOCK_LOW),
1034 MODE_STATUS(CLOCK_RANGE),
1035 MODE_STATUS(BAD_HVALUE),
1036 MODE_STATUS(BAD_VVALUE),
1037 MODE_STATUS(BAD_VSCAN),
1038 MODE_STATUS(HSYNC_NARROW),
1039 MODE_STATUS(HSYNC_WIDE),
1040 MODE_STATUS(HBLANK_NARROW),
1041 MODE_STATUS(HBLANK_WIDE),
1042 MODE_STATUS(VSYNC_NARROW),
1043 MODE_STATUS(VSYNC_WIDE),
1044 MODE_STATUS(VBLANK_NARROW),
1045 MODE_STATUS(VBLANK_WIDE),
1046 MODE_STATUS(PANEL),
1047 MODE_STATUS(INTERLACE_WIDTH),
1048 MODE_STATUS(ONE_WIDTH),
1049 MODE_STATUS(ONE_HEIGHT),
1050 MODE_STATUS(ONE_SIZE),
1051 MODE_STATUS(NO_REDUCED),
1052 MODE_STATUS(NO_STEREO),
1053 MODE_STATUS(UNVERIFIED),
1054 MODE_STATUS(BAD),
1055 MODE_STATUS(ERROR),
1056};
1057
1058#undef MODE_STATUS
1059
1060static const char *drm_get_mode_status_name(enum drm_mode_status status)
1061{
1062 int index = status + 3;
1063
1064 if (WARN_ON(index < 0 || index >= ARRAY_SIZE(drm_mode_status_names)))
1065 return "";
1066
1067 return drm_mode_status_names[index];
1068}
1069
1014/** 1070/**
1015 * drm_mode_prune_invalid - remove invalid modes from mode list 1071 * drm_mode_prune_invalid - remove invalid modes from mode list
1016 * @dev: DRM device 1072 * @dev: DRM device
@@ -1032,8 +1088,9 @@ void drm_mode_prune_invalid(struct drm_device *dev,
1032 list_del(&mode->head); 1088 list_del(&mode->head);
1033 if (verbose) { 1089 if (verbose) {
1034 drm_mode_debug_printmodeline(mode); 1090 drm_mode_debug_printmodeline(mode);
1035 DRM_DEBUG_KMS("Not using %s mode %d\n", 1091 DRM_DEBUG_KMS("Not using %s mode: %s\n",
1036 mode->name, mode->status); 1092 mode->name,
1093 drm_get_mode_status_name(mode->status));
1037 } 1094 }
1038 drm_mode_destroy(dev, mode); 1095 drm_mode_destroy(dev, mode);
1039 } 1096 }