diff options
| author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-02-02 12:13:57 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-02-03 03:09:22 -0500 |
| commit | f79d1548b0fea94f2ccf089e49480da5202918bc (patch) | |
| tree | 60a7c69213b512092e341257d8f673b54275be62 | |
| parent | eb2ed66fe56f30c6ea841ac11681a2f51049b221 (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.c | 61 |
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 | } |
| 1012 | EXPORT_SYMBOL(drm_mode_validate_size); | 1012 | EXPORT_SYMBOL(drm_mode_validate_size); |
| 1013 | 1013 | ||
| 1014 | #define MODE_STATUS(status) [MODE_ ## status + 3] = #status | ||
| 1015 | |||
| 1016 | static 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 | |||
| 1060 | static 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 | } |
