Module Name: src Committed By: jmcneill Date: Sat Nov 14 13:27:29 UTC 2015
Modified Files: src/sys/external/bsd/drm2/dist/drm: drm_fb_helper.c drm_modes.c Log Message: Support command-line modes by picking up connector modes from the device properties. The connector name is the key name in the device properties dictionary. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/drm_modes.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c diff -u src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.7 src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.8 --- src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.7 Thu Jul 24 21:36:39 2014 +++ src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c Sat Nov 14 13:27:29 2015 @@ -117,7 +117,6 @@ fail: } EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors); -#ifndef __NetBSD__ /* XXX fb command line */ static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper) { struct drm_fb_helper_connector *fb_helper_conn; @@ -133,8 +132,14 @@ static int drm_fb_helper_parse_command_l mode = &fb_helper_conn->cmdline_mode; /* do something on return - turn off connector maybe */ +#if defined(__NetBSD__) + prop_dictionary_t prop = device_properties(connector->dev->dev); + if (prop_dictionary_get_cstring(prop, drm_get_connector_name(connector), &option) == false) + continue; +#else if (fb_get_options(drm_get_connector_name(connector), &option)) continue; +#endif if (drm_mode_parse_command_line_for_connector(option, connector, @@ -171,7 +176,6 @@ static int drm_fb_helper_parse_command_l } return 0; } -#endif static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper) { @@ -1207,9 +1211,6 @@ static bool drm_has_cmdline_mode(struct struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, int width, int height) { -#ifdef __NetBSD__ /* XXX fb command line */ - return NULL; -#else struct drm_cmdline_mode *cmdline_mode; struct drm_display_mode *mode = NULL; bool prefer_non_interlace; @@ -1257,7 +1258,6 @@ create_mode: cmdline_mode); list_add(&mode->head, &fb_helper_conn->connector->modes); return mode; -#endif } EXPORT_SYMBOL(drm_pick_cmdline_mode); @@ -1601,9 +1601,7 @@ bool drm_fb_helper_initial_config(struct struct drm_device *dev = fb_helper->dev; int count = 0; -#ifndef __NetBSD__ /* XXX fb command line */ drm_fb_helper_parse_command_line(fb_helper); -#endif mutex_lock(&dev->mode_config.mutex); count = drm_fb_helper_probe_connector_modes(fb_helper, Index: src/sys/external/bsd/drm2/dist/drm/drm_modes.c diff -u src/sys/external/bsd/drm2/dist/drm/drm_modes.c:1.5 src/sys/external/bsd/drm2/dist/drm/drm_modes.c:1.6 --- src/sys/external/bsd/drm2/dist/drm/drm_modes.c:1.5 Wed Jul 16 20:56:24 2014 +++ src/sys/external/bsd/drm2/dist/drm/drm_modes.c Sat Nov 14 13:27:29 2015 @@ -1057,8 +1057,6 @@ void drm_mode_connector_list_update(stru } EXPORT_SYMBOL(drm_mode_connector_list_update); -#ifndef __NetBSD__ - /** * drm_mode_parse_command_line_for_connector - parse command line modeline for connector * @mode_option: optional per connector mode option @@ -1087,16 +1085,18 @@ bool drm_mode_parse_command_line_for_con const char *name; unsigned int namelen; bool res_specified = false, bpp_specified = false, refresh_specified = false; - unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; + long xres = 0, yres = 0, bpp = 32, refresh = 0; bool yres_specified = false, cvt = false, rb = false; bool interlace = false, margins = false, was_digit = false; int i; enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; +#if !defined(__NetBSD__) #ifdef CONFIG_FB if (!mode_option) mode_option = fb_mode_option; #endif +#endif if (!mode_option) { mode->specified = false; @@ -1110,26 +1110,35 @@ bool drm_mode_parse_command_line_for_con case '@': if (!refresh_specified && !bpp_specified && !yres_specified && !cvt && !rb && was_digit) { - refresh = simple_strtol(&name[i+1], NULL, 10); - refresh_specified = true; - was_digit = false; + if (kstrtol(&name[i+1], 10, &refresh) == 0) { + refresh_specified = true; + was_digit = false; + } else { + goto done; + } } else goto done; break; case '-': if (!bpp_specified && !yres_specified && !cvt && !rb && was_digit) { - bpp = simple_strtol(&name[i+1], NULL, 10); - bpp_specified = true; - was_digit = false; + if (kstrtol(&name[i+1], 10, &bpp) == 0) { + bpp_specified = true; + was_digit = false; + } else { + goto done; + } } else goto done; break; case 'x': if (!yres_specified && was_digit) { - yres = simple_strtol(&name[i+1], NULL, 10); - yres_specified = true; - was_digit = false; + if (kstrtol(&name[i+1], 10, &yres) == 0) { + yres_specified = true; + was_digit = false; + } else { + goto done; + } } else goto done; break; @@ -1187,8 +1196,8 @@ bool drm_mode_parse_command_line_for_con } if (i < 0 && yres_specified) { - char *ch; - xres = simple_strtol(name, &ch, 10); + char *ch = NULL; + xres = strtoll(name, &ch, 10); if ((ch != NULL) && (*ch == 'x')) res_specified = true; else @@ -1199,7 +1208,7 @@ bool drm_mode_parse_command_line_for_con } done: if (i >= 0) { - printk(KERN_WARNING + DRM_ERROR( "parse error at position %i in video mode '%s'\n", i, name); mode->specified = false; @@ -1264,5 +1273,3 @@ drm_mode_create_from_cmdline_mode(struct return mode; } EXPORT_SYMBOL(drm_mode_create_from_cmdline_mode); - -#endif