xfree86: Change the semantics of driverFunc(GET_REQUIRED_HW_INTERFACES)
This is a really awkward interface, since we're calling it well before the driver knows what device it's going to drive. Drivers with both KMS and UMS support therefore don't know whether to say they need I/O port access or not, and have to assume they do. With this change we now call it only to query whether port access might be needed; we don't use that to determine whether to call a driver's probe function or not, instead we call them unconditionally. If the driver doesn't check whether port access was enabled, they might crash ungracefully. To accomodate this, we move xorgHWAccess to be explicitly intentionally exported (sigh xf86Priv.h) so that drivers can check that before they attempt port access. v2: Move initial xf86EnableIO() nearer the logic that determines whether to call it, suggested by Simon Farnsworth. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk> Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
d88fb00d79
commit
245e7e0361
|
@ -55,6 +55,7 @@
|
|||
extern _X_EXPORT int xf86DoConfigure;
|
||||
extern _X_EXPORT int xf86DoShowOptions;
|
||||
extern _X_EXPORT Bool xf86DoConfigurePass1;
|
||||
extern _X_EXPORT Bool xorgHWAccess;
|
||||
|
||||
extern _X_EXPORT DevPrivateKeyRec xf86ScreenKeyRec;
|
||||
|
||||
|
|
|
@ -115,27 +115,12 @@ xf86BusConfig(void)
|
|||
screenLayoutPtr layout;
|
||||
int i, j;
|
||||
|
||||
/* Enable full I/O access */
|
||||
if (xorgHWAccess)
|
||||
xorgHWAccess = xf86EnableIO();
|
||||
|
||||
/*
|
||||
* Now call each of the Probe functions. Each successful probe will
|
||||
* result in an extra entry added to the xf86Screens[] list for each
|
||||
* instance of the hardware found.
|
||||
*/
|
||||
for (i = 0; i < xf86NumDrivers; i++) {
|
||||
xorgHWFlags flags;
|
||||
|
||||
if (!xorgHWAccess) {
|
||||
if (!xf86DriverList[i]->driverFunc
|
||||
|| !xf86DriverList[i]->driverFunc(NULL,
|
||||
GET_REQUIRED_HW_INTERFACES,
|
||||
&flags)
|
||||
|| NEED_IO_ENABLED(flags))
|
||||
continue;
|
||||
}
|
||||
|
||||
xf86CallDriverProbe(xf86DriverList[i], FALSE);
|
||||
}
|
||||
|
||||
|
|
|
@ -545,41 +545,16 @@ DoConfigure(void)
|
|||
|
||||
free(vlist);
|
||||
|
||||
for (i = 0; i < xf86NumDrivers; i++) {
|
||||
xorgHWFlags flags;
|
||||
|
||||
if (!xf86DriverList[i]->driverFunc
|
||||
|| !xf86DriverList[i]->driverFunc(NULL,
|
||||
GET_REQUIRED_HW_INTERFACES,
|
||||
&flags)
|
||||
|| NEED_IO_ENABLED(flags)) {
|
||||
xorgHWAccess = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Enable full I/O access */
|
||||
if (xorgHWAccess) {
|
||||
if (!xf86EnableIO())
|
||||
/* oops, we have failed */
|
||||
xorgHWAccess = FALSE;
|
||||
}
|
||||
xorgHWAccess = xf86EnableIO();
|
||||
|
||||
/* Create XF86Config file structure */
|
||||
xf86config = calloc(1, sizeof(XF86ConfigRec));
|
||||
|
||||
/* Call all of the probe functions, reporting the results. */
|
||||
for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
|
||||
xorgHWFlags flags;
|
||||
Bool found_screen;
|
||||
DriverRec *const drv = xf86DriverList[CurrentDriver];
|
||||
|
||||
if (!xorgHWAccess) {
|
||||
if (!drv->driverFunc
|
||||
|| !drv->driverFunc(NULL, GET_REQUIRED_HW_INTERFACES, &flags)
|
||||
|| NEED_IO_ENABLED(flags))
|
||||
continue;
|
||||
}
|
||||
|
||||
found_screen = xf86CallDriverProbe(drv, TRUE);
|
||||
if (found_screen && drv->Identify) {
|
||||
(*drv->Identify) (0);
|
||||
|
|
|
@ -402,6 +402,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
|||
Bool pix24Fail = FALSE;
|
||||
Bool autoconfig = FALSE;
|
||||
Bool sigio_blocked = FALSE;
|
||||
Bool want_hw_access = FALSE;
|
||||
GDevPtr configured_device;
|
||||
|
||||
xf86Initialising = TRUE;
|
||||
|
@ -530,23 +531,21 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
|||
*/
|
||||
|
||||
for (i = 0; i < xf86NumDrivers; i++) {
|
||||
xorgHWFlags flags = HW_IO;
|
||||
|
||||
if (xf86DriverList[i]->Identify != NULL)
|
||||
xf86DriverList[i]->Identify(0);
|
||||
|
||||
if (!xorgHWAccess || !xorgHWOpenConsole) {
|
||||
xorgHWFlags flags;
|
||||
if (xf86DriverList[i]->driverFunc)
|
||||
xf86DriverList[i]->driverFunc(NULL,
|
||||
GET_REQUIRED_HW_INTERFACES,
|
||||
&flags);
|
||||
|
||||
if (!xf86DriverList[i]->driverFunc
|
||||
|| !xf86DriverList[i]->driverFunc(NULL,
|
||||
GET_REQUIRED_HW_INTERFACES,
|
||||
&flags))
|
||||
flags = HW_IO;
|
||||
if (NEED_IO_ENABLED(flags))
|
||||
want_hw_access = TRUE;
|
||||
|
||||
if (NEED_IO_ENABLED(flags))
|
||||
xorgHWAccess = TRUE;
|
||||
if (!(flags & HW_SKIP_CONSOLE))
|
||||
xorgHWOpenConsole = TRUE;
|
||||
}
|
||||
if (!(flags & HW_SKIP_CONSOLE))
|
||||
xorgHWOpenConsole = TRUE;
|
||||
}
|
||||
|
||||
if (xorgHWOpenConsole)
|
||||
|
@ -554,6 +553,10 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
|
|||
else
|
||||
xf86Info.dontVTSwitch = TRUE;
|
||||
|
||||
/* Enable full I/O access */
|
||||
if (want_hw_access)
|
||||
xorgHWAccess = xf86EnableIO();
|
||||
|
||||
if (xf86BusConfig() == FALSE)
|
||||
return;
|
||||
|
||||
|
|
|
@ -91,7 +91,6 @@ extern _X_EXPORT int xf86NumScreens;
|
|||
extern _X_EXPORT const char *xf86VisualNames[];
|
||||
extern _X_EXPORT int xf86Verbose; /* verbosity level */
|
||||
extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */
|
||||
extern _X_EXPORT Bool xorgHWAccess;
|
||||
|
||||
extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user