Merge commit 'c760fb0154848d47438908ba8b3da2fffc68a460' into server-1.14-branch

This commit is contained in:
Matt Dew 2013-05-23 14:49:33 -06:00
commit 348de79d8c
11 changed files with 88 additions and 11 deletions

View file

@ -243,6 +243,7 @@ extern _X_EXPORT void xf86InterceptSigIll(void (*sigillhandler) (void));
extern _X_EXPORT Bool xf86EnableVTSwitch(Bool new);
extern _X_EXPORT void xf86ProcessActionEvent(ActionEvent action, void *arg);
extern _X_EXPORT void xf86PrintBacktrace(void);
extern _X_EXPORT Bool xf86VTOwner(void);
/* xf86Helper.c */

View file

@ -84,6 +84,7 @@
#include "dpmsproc.h"
#endif
#include "xf86platformBus.h"
/*
* This is a toggling variable:
* FALSE = No VT switching keys have been pressed last time around
@ -428,7 +429,7 @@ xf86VTSwitch(void)
* Since all screens are currently all in the same state it is sufficient
* check the first. This might change in future.
*/
if (xf86Screens[0]->vtSema) {
if (xf86VTOwner()) {
DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
@ -561,6 +562,9 @@ xf86VTSwitch(void)
for (ih = InputHandlers; ih; ih = ih->next)
xf86EnableInputHandler(ih);
/* check for any new output devices */
xf86platformVTProbe();
OsReleaseSIGIO();
}
}
@ -769,3 +773,12 @@ DDXRingBell(int volume, int pitch, int duration)
{
xf86OSRingBell(volume, pitch, duration);
}
Bool
xf86VTOwner(void)
{
/* at system startup xf86Screens[0] won't be set - but we will own the VT */
if (xf86NumScreens == 0)
return TRUE;
return xf86Screens[0]->vtSema;
}

View file

@ -819,7 +819,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
if (serverGeneration != 1) {
xf86Resetting = TRUE;
/* All screens are in the same state, so just check the first */
if (!xf86Screens[0]->vtSema) {
if (!xf86VTOwner()) {
#ifdef HAS_USL_VTS
ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ);
#endif

View file

@ -870,7 +870,7 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
}
/* Enable it if it's properly initialised and we're currently in the VT */
if (enable && dev->inited && dev->startup && xf86Screens[0]->vtSema) {
if (enable && dev->inited && dev->startup && xf86VTOwner()) {
OsBlockSignals();
EnableDevice(dev, TRUE);
if (!dev->enabled) {

View file

@ -113,6 +113,11 @@ xf86_get_platform_device_attrib(struct xf86_platform_device *device, int attrib_
return NULL;
}
Bool
xf86_get_platform_device_unowned(int index)
{
return xf86_platform_devices[index].attribs->unowned;
}
/*
* xf86IsPrimaryPlatform() -- return TRUE if primary device
@ -498,4 +503,18 @@ xf86platformRemoveDevice(int index)
out:
return;
}
/* called on return from VT switch to find any new devices */
void xf86platformVTProbe(void)
{
int i;
for (i = 0; i < xf86_num_platform_devices; i++) {
if (xf86_platform_devices[i].attribs->unowned == FALSE)
continue;
xf86_platform_devices[i].attribs->unowned = FALSE;
xf86PlatformReprobeDevice(i, xf86_platform_devices[i].attribs);
}
}
#endif

View file

@ -46,6 +46,8 @@ extern int
xf86_remove_platform_device(int dev_index);
extern Bool
xf86_add_platform_device_attrib(int index, int attrib_id, char *attrib_str);
extern Bool
xf86_get_platform_device_unowned(int index);
extern int
xf86platformAddDevice(int index);
@ -59,6 +61,8 @@ xf86PlatformDeviceCheckBusID(struct xf86_platform_device *device, const char *bu
extern _X_EXPORT int
xf86PlatformMatchDriver(char *matches[], int nmatches);
extern void xf86platformVTProbe(void);
#endif
#endif

View file

@ -2598,8 +2598,8 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
xf86CrtcPtr crtc = config->crtc[0];
int enabled = 0, failed = 0;
int c;
int enabled = 0;
/* A driver with this hook will take care of this */
if (!crtc->funcs->set_mode_major) {
@ -2659,11 +2659,12 @@ xf86SetDesiredModes(ScrnInfoPtr scrn)
if (config->output[o]->crtc == crtc)
config->output[o]->crtc = NULL;
crtc->enabled = FALSE;
++failed;
}
}
xf86DisableUnusedFunctions(scrn);
return enabled != 0;
return enabled != 0 || failed == 0;
}
/**

View file

@ -18,7 +18,7 @@
#include "hotplug.h"
static Bool
get_drm_info(struct OdevAttributes *attribs, char *path)
get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
{
drmSetVersion sv;
char *buf;
@ -37,10 +37,14 @@ get_drm_info(struct OdevAttributes *attribs, char *path)
return FALSE;
}
xf86_add_platform_device(attribs);
/* for a delayed probe we've already added the device */
if (delayed_index == -1) {
xf86_add_platform_device(attribs);
delayed_index = xf86_num_platform_devices - 1;
}
buf = drmGetBusid(fd);
xf86_add_platform_device_attrib(xf86_num_platform_devices - 1,
xf86_add_platform_device_attrib(delayed_index,
ODEV_ATTRIB_BUSID, buf);
drmFreeBusid(buf);
close(fd);
@ -88,6 +92,23 @@ xf86PlatformDeviceCheckBusID(struct xf86_platform_device *device, const char *bu
return FALSE;
}
void
xf86PlatformReprobeDevice(int index, struct OdevAttributes *attribs)
{
Bool ret;
char *dpath;
dpath = xf86_get_platform_attrib(index, ODEV_ATTRIB_PATH);
ret = get_drm_info(attribs, dpath, index);
if (ret == FALSE) {
xf86_remove_platform_device(index);
return;
}
ret = xf86platformAddDevice(index);
if (ret == -1)
xf86_remove_platform_device(index);
}
void
xf86PlatformDeviceProbe(struct OdevAttributes *attribs)
{
@ -118,7 +139,15 @@ xf86PlatformDeviceProbe(struct OdevAttributes *attribs)
LogMessage(X_INFO, "xfree86: Adding drm device (%s)\n", path);
ret = get_drm_info(attribs, path);
if (!xf86VTOwner()) {
/* if we don't currently own the VT then don't probe the device,
just mark it as unowned for later use */
attribs->unowned = TRUE;
xf86_add_platform_device(attribs);
return;
}
ret = get_drm_info(attribs, path, -1);
if (ret == FALSE)
goto out_free;
@ -137,6 +166,9 @@ void NewGPUDeviceRequest(struct OdevAttributes *attribs)
if (old_num == xf86_num_platform_devices)
return;
if (xf86_get_platform_device_unowned(xf86_num_platform_devices - 1) == TRUE)
return;
ret = xf86platformAddDevice(xf86_num_platform_devices-1);
if (ret == -1)
xf86_remove_platform_device(xf86_num_platform_devices-1);
@ -170,7 +202,10 @@ void DeleteGPUDeviceRequest(struct OdevAttributes *attribs)
ErrorF("xf86: remove device %d %s\n", index, syspath);
xf86platformRemoveDevice(index);
if (xf86_get_platform_device_unowned(index) == TRUE)
xf86_remove_platform_device(index);
else
xf86platformRemoveDevice(index);
out:
config_odev_free_attribute_list(attribs);
}

View file

@ -274,7 +274,7 @@ xf86OpenConsole(void)
* this is to make sure we don't continue until the activate
* signal is received.
*/
if (!xf86Screens[0]->vtSema)
if (!xf86VTOwner())
sleep(5);
}
#endif /* HAS_USL_VTS */

View file

@ -223,6 +223,9 @@ extern _X_EXPORT void xf86InitVidMem(void);
#include "hotplug.h"
void
xf86PlatformDeviceProbe(struct OdevAttributes *attribs);
void
xf86PlatformReprobeDevice(int index, struct OdevAttributes *attribs);
#endif
_XFUNCPROTOEND

View file

@ -40,6 +40,7 @@ struct OdevAttribute {
struct OdevAttributes {
struct xorg_list list;
Bool unowned;
};
struct OdevAttributes *