Commit 5939e39a authored by Dave Airlie's avatar Dave Airlie Committed by Keith Packard

xf86: allow for no outputs connected at startup operation.

When nothing is connected at startup and we canGrow, allow the server to start with a 1024x768 framebuffer, and when the drivers send hotplug events this will expand to the correct size dynamically.
Reviewed-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
parent b9f48d60
...@@ -46,6 +46,8 @@ ...@@ -46,6 +46,8 @@
#include "xf86xv.h" #include "xf86xv.h"
#define NO_OUTPUT_DEFAULT_WIDTH 1024
#define NO_OUTPUT_DEFAULT_HEIGHT 768
/* /*
* Initialize xf86CrtcConfig structure * Initialize xf86CrtcConfig structure
*/ */
...@@ -1923,7 +1925,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn) ...@@ -1923,7 +1925,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn)
#endif #endif
} }
static void static Bool
xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
Bool *enabled) Bool *enabled)
{ {
...@@ -1938,8 +1940,10 @@ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, ...@@ -1938,8 +1940,10 @@ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
"No outputs definitely connected, trying again...\n"); "No outputs definitely connected, trying again...\n");
for (o = 0; o < config->num_output; o++) for (o = 0; o < config->num_output; o++)
enabled[o] = xf86OutputEnabled(config->output[o], FALSE); any_enabled |= enabled[o] = xf86OutputEnabled(config->output[o], FALSE);
} }
return any_enabled;
} }
static Bool static Bool
...@@ -2339,6 +2343,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) ...@@ -2339,6 +2343,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
Bool *enabled; Bool *enabled;
int width, height; int width, height;
int i = scrn->scrnIndex; int i = scrn->scrnIndex;
Bool have_outputs = TRUE;
Bool ret;
/* Set up the device options */ /* Set up the device options */
config->options = xnfalloc (sizeof (xf86DeviceOptions)); config->options = xnfalloc (sizeof (xf86DeviceOptions));
...@@ -2364,18 +2370,23 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) ...@@ -2364,18 +2370,23 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
modes = xnfcalloc (config->num_output, sizeof (DisplayModePtr)); modes = xnfcalloc (config->num_output, sizeof (DisplayModePtr));
enabled = xnfcalloc (config->num_output, sizeof (Bool)); enabled = xnfcalloc (config->num_output, sizeof (Bool));
xf86CollectEnabledOutputs(scrn, config, enabled); ret = xf86CollectEnabledOutputs(scrn, config, enabled);
if (ret == FALSE && canGrow) {
if (xf86TargetUserpref(scrn, config, modes, enabled, width, height)) xf86DrvMsg(i, X_WARNING, "Unable to find connected outputs - setting %dx%d initial framebuffer\n",
xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n"); NO_OUTPUT_DEFAULT_WIDTH, NO_OUTPUT_DEFAULT_HEIGHT);
else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height)) have_outputs = FALSE;
xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n"); } else {
else if (xf86TargetAspect(scrn, config, modes, enabled, width, height)) if (xf86TargetUserpref(scrn, config, modes, enabled, width, height))
xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n"); xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n");
else if (xf86TargetFallback(scrn, config, modes, enabled, width, height)) else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height))
xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n"); xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n");
else else if (xf86TargetAspect(scrn, config, modes, enabled, width, height))
xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n"); xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n");
else if (xf86TargetFallback(scrn, config, modes, enabled, width, height))
xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n");
else
xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n");
}
for (o = -1; nextEnabledOutput(config, enabled, &o); ) { for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
if (!modes[o]) if (!modes[o])
...@@ -2406,7 +2417,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) ...@@ -2406,7 +2417,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
/* /*
* Assign CRTCs to fit output configuration * Assign CRTCs to fit output configuration
*/ */
if (!xf86PickCrtcs (scrn, crtcs, modes, 0, width, height)) if (have_outputs && !xf86PickCrtcs (scrn, crtcs, modes, 0, width, height))
{ {
free(crtcs); free(crtcs);
free(modes); free(modes);
...@@ -2468,6 +2479,13 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) ...@@ -2468,6 +2479,13 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
*/ */
xf86DefaultScreenLimits (scrn, &width, &height, canGrow); xf86DefaultScreenLimits (scrn, &width, &height, canGrow);
if (have_outputs == FALSE) {
if (width < NO_OUTPUT_DEFAULT_WIDTH && height < NO_OUTPUT_DEFAULT_HEIGHT) {
width = NO_OUTPUT_DEFAULT_WIDTH;
height = NO_OUTPUT_DEFAULT_HEIGHT;
}
}
scrn->display->virtualX = width; scrn->display->virtualX = width;
scrn->display->virtualY = height; scrn->display->virtualY = height;
} }
...@@ -2493,8 +2511,17 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) ...@@ -2493,8 +2511,17 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
width, height); width, height);
} }
/* Mirror output modes to scrn mode list */ if (have_outputs) {
xf86SetScrnInfoModes (scrn); /* Mirror output modes to scrn mode list */
xf86SetScrnInfoModes (scrn);
} else {
/* Clear any existing modes from scrn->modes */
while (scrn->modes != NULL)
xf86DeleteMode(&scrn->modes, scrn->modes);
scrn->modes = xf86ModesAdd(scrn->modes,
xf86CVTMode(width, height, 60, 0, 0));
}
free(crtcs); free(crtcs);
free(modes); free(modes);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment