On Mon, Feb 2, 2015 at 12:13 PM, <ville.syrjala at linux.intel.com> wrote: > From: Ville Syrjälä <ville.syrjala at linux.intel.com> > > 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 at linux.intel.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/drm_modes.c | 61 > +++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 59 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index 20d977a..487d0e3 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, > } > EXPORT_SYMBOL(drm_mode_validate_size); > > +#define MODE_STATUS(status) [MODE_ ## status + 3] = #status > + > +static const char * const drm_mode_status_names[] = { > + MODE_STATUS(OK), > + MODE_STATUS(HSYNC), > + MODE_STATUS(VSYNC), > + MODE_STATUS(H_ILLEGAL), > + MODE_STATUS(V_ILLEGAL), > + MODE_STATUS(BAD_WIDTH), > + MODE_STATUS(NOMODE), > + MODE_STATUS(NO_INTERLACE), > + MODE_STATUS(NO_DBLESCAN), > + MODE_STATUS(NO_VSCAN), > + MODE_STATUS(MEM), > + MODE_STATUS(VIRTUAL_X), > + MODE_STATUS(VIRTUAL_Y), > + MODE_STATUS(MEM_VIRT), > + MODE_STATUS(NOCLOCK), > + MODE_STATUS(CLOCK_HIGH), > + MODE_STATUS(CLOCK_LOW), > + MODE_STATUS(CLOCK_RANGE), > + MODE_STATUS(BAD_HVALUE), > + MODE_STATUS(BAD_VVALUE), > + MODE_STATUS(BAD_VSCAN), > + MODE_STATUS(HSYNC_NARROW), > + MODE_STATUS(HSYNC_WIDE), > + MODE_STATUS(HBLANK_NARROW), > + MODE_STATUS(HBLANK_WIDE), > + MODE_STATUS(VSYNC_NARROW), > + MODE_STATUS(VSYNC_WIDE), > + MODE_STATUS(VBLANK_NARROW), > + MODE_STATUS(VBLANK_WIDE), > + MODE_STATUS(PANEL), > + MODE_STATUS(INTERLACE_WIDTH), > + MODE_STATUS(ONE_WIDTH), > + MODE_STATUS(ONE_HEIGHT), > + MODE_STATUS(ONE_SIZE), > + MODE_STATUS(NO_REDUCED), > + MODE_STATUS(NO_STEREO), > + MODE_STATUS(UNVERIFIED), > + MODE_STATUS(BAD), > + MODE_STATUS(ERROR), > +}; > + > +#undef MODE_STATUS > + > +static const char *drm_get_mode_status_name(enum drm_mode_status status) > +{ > + int index = status + 3; > + > + if (WARN_ON(index < 0 || index >= ARRAY_SIZE(drm_mode_status_names))) > + return ""; > + > + return drm_mode_status_names[index]; > +} > + > /** > * drm_mode_prune_invalid - remove invalid modes from mode list > * @dev: DRM device > @@ -1032,8 +1088,9 @@ void drm_mode_prune_invalid(struct drm_device *dev, > list_del(&mode->head); > if (verbose) { > drm_mode_debug_printmodeline(mode); > - DRM_DEBUG_KMS("Not using %s mode %d\n", > - mode->name, mode->status); > + DRM_DEBUG_KMS("Not using %s mode: %s\n", > + mode->name, > + > drm_get_mode_status_name(mode->status)); > } > drm_mode_destroy(dev, mode); > } > -- > 2.0.5 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel