From ff9a52b07789b695859163be5b9aaed241767643 Mon Sep 17 00:00:00 2001 From: Eugeni Dodonov Date: Mon, 31 Oct 2011 11:50:33 -0200 Subject: Enable SNA via a configuration file option. This allows to use UXA and SNA from within the same driver, by setting an "UseSNA" option in the driver config - for example, by creating an /etc/X11/xorg.conf.d/99-intel-sna.conf: Section "Device" Identifier "intel" driver "intel" Option "UseSna" "True" EndSection This also allows to record the entity_num within the main intel driver, not only SNA. Signed-off-by: Eugeni Dodonov --- src/common.h | 2 +- src/intel_driver.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++-- src/intel_module.c | 6 +--- src/sna/sna_driver.c | 14 ++------ src/sna/sna_module.h | 3 +- 5 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/common.h b/src/common.h index 6b9c3151..b081a6f5 100644 --- a/src/common.h +++ b/src/common.h @@ -77,7 +77,7 @@ I830DPRINTF_stub(const char *filename, int line, const char *function, /* I830 hooks for the I810 driver setup/probe. */ extern const OptionInfoRec *I830AvailableOptions(int chipid, int busid); -extern void intel_init_scrn(ScrnInfoPtr scrn); +extern void intel_init_scrn(ScrnInfoPtr scrn, int entity_num); /* Symbol lists shared by the i810 and i830 parts. */ extern int I830EntityIndex; diff --git a/src/intel_driver.c b/src/intel_driver.c index 24696dac..09c306ce 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -101,6 +101,7 @@ typedef enum { OPTION_DEBUG_WAIT, OPTION_HOTPLUG, OPTION_RELAXED_FENCING, + OPTION_USE_SNA, } I830Opts; static OptionInfoRec I830Options[] = { @@ -122,6 +123,7 @@ static OptionInfoRec I830Options[] = { {OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_HOTPLUG, "HotPlug", OPTV_BOOLEAN, {0}, TRUE}, {OPTION_RELAXED_FENCING, "RelaxedFencing", OPTV_BOOLEAN, {0}, TRUE}, + {OPTION_USE_SNA, "UseSna", OPTV_BOOLEAN, {0}, FALSE}, {-1, NULL, OPTV_NONE, {0}, FALSE} }; /* *INDENT-ON* */ @@ -1326,9 +1328,91 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo) return TRUE; } -void intel_init_scrn(ScrnInfoPtr scrn) +/* + * Due to the nature of xserver drivers, we need to do a lot of + * things just to attempt to parse driver options. So we do it all + * here, check if we are supposed to use SNA, and call the corresponding + * real setup afterwards. + */ +static Bool intelPreInit(ScrnInfoPtr scrn, int flags) { - scrn->PreInit = I830PreInit; + rgb defaultWeight = { 0, 0, 0 }; + Bool use_sna; + EntityInfoPtr pEnt; + int flags24; + OptionInfoPtr Options; + + xf86DrvMsg(0, X_INFO, "Inside intelPreInit...\n"); + + if (scrn->numEntities != 1) + return FALSE; + + pEnt = xf86GetEntityInfo(scrn->entityList[0]); + + xf86DrvMsg(0, X_INFO, "Detecting monitor...\n"); + + scrn->monitor = scrn->confScreen->monitor; + scrn->progClock = TRUE; + scrn->rgbBits = 8; + + flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32; + + if (!xf86SetDepthBpp(scrn, 0, 0, 0, flags24)) + return FALSE; + + switch (scrn->depth) { + case 8: + case 15: + case 16: + case 24: + case 30: + break; + default: + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by intel driver\n", + scrn->depth); + return FALSE; + } + + if (!xf86SetWeight(scrn, defaultWeight, defaultWeight)) + return FALSE; + if (!xf86SetDefaultVisual(scrn, -1)) + return FALSE; + + /* Now the main trick - collecting driver option to find out if we + * need SNA... */ + xf86CollectOptions(scrn, NULL); + + if (!(Options = malloc(sizeof(I830Options)))) + return FALSE; + memcpy(Options, I830Options, sizeof(I830Options)); + xf86ProcessOptions(scrn->scrnIndex, scrn->options, Options); + + xf86DrvMsg(0, X_INFO, "Detecting SNA...\n"); + use_sna = xf86ReturnOptValBool(Options, + OPTION_USE_SNA, + FALSE); + + /* Clean up */ + free(Options); + PreInitCleanup(scrn); + if (use_sna) { + /* Using SNA, re-initialize function pointers */ + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Enabling SNA via option\n"); + sna_init_scrn(scrn); + return sna_pre_init(scrn, flags); + } + else { + xf86DrvMsg(scrn->scrnIndex, X_INFO, "SNA not enabled, using UXA\n"); + return I830PreInit(scrn, flags); + } +} + +void intel_init_scrn(ScrnInfoPtr scrn, int entity_num) +{ + EntityInfoPtr entity; + + scrn->PreInit = intelPreInit; scrn->ScreenInit = I830ScreenInit; scrn->SwitchMode = I830SwitchMode; scrn->AdjustFrame = i830AdjustFrame; @@ -1337,4 +1421,12 @@ void intel_init_scrn(ScrnInfoPtr scrn) scrn->FreeScreen = I830FreeScreen; scrn->ValidMode = I830ValidMode; scrn->PMEvent = I830PMEvent; + + xf86SetEntitySharable(scrn->entityList[0]); + + entity = xf86GetEntityInfo(entity_num); + xf86SetEntityInstanceForScreen(scrn, + entity->index, + xf86GetNumEntityInstances(entity->index)-1); + free(entity); } diff --git a/src/intel_module.c b/src/intel_module.c index 3a0ecc9a..0f4b84a2 100644 --- a/src/intel_module.c +++ b/src/intel_module.c @@ -344,11 +344,7 @@ static Bool intel_pci_probe(DriverPtr driver, #endif default: -#if USE_SNA - sna_init_scrn(scrn, entity_num); -#else - intel_init_scrn(scrn); -#endif + intel_init_scrn(scrn, entity_num); break; } } diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 98819f6d..bd20969a 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -415,7 +415,7 @@ static void sna_selftest(void) * As a result, we want to set up that server initialization once rather * that doing it per generation. */ -static Bool sna_pre_init(ScrnInfoPtr scrn, int flags) +Bool sna_pre_init(ScrnInfoPtr scrn, int flags) { struct sna *sna; rgb defaultWeight = { 0, 0, 0 }; @@ -1040,10 +1040,8 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo) return TRUE; } -void sna_init_scrn(ScrnInfoPtr scrn, int entity_num) +void sna_init_scrn(ScrnInfoPtr scrn) { - EntityInfoPtr entity; - #if defined(USE_GIT_DESCRIBE) xf86DrvMsg(scrn->scrnIndex, X_INFO, "SNA compiled from %s\n", git_version); @@ -1066,12 +1064,4 @@ void sna_init_scrn(ScrnInfoPtr scrn, int entity_num) scrn->FreeScreen = sna_free_screen; scrn->ValidMode = sna_valid_mode; scrn->PMEvent = sna_pm_event; - - xf86SetEntitySharable(scrn->entityList[0]); - - entity = xf86GetEntityInfo(entity_num); - xf86SetEntityInstanceForScreen(scrn, - entity->index, - xf86GetNumEntityInstances(entity->index)-1); - free(entity); } diff --git a/src/sna/sna_module.h b/src/sna/sna_module.h index 97d5dd5e..34022ba8 100644 --- a/src/sna/sna_module.h +++ b/src/sna/sna_module.h @@ -1,3 +1,4 @@ const OptionInfoRec *sna_available_options(int chipid, int busid); -void sna_init_scrn(ScrnInfoPtr scrn, int entity_num); +void sna_init_scrn(ScrnInfoPtr scrn); +Bool sna_pre_init(ScrnInfoPtr scrn, int flags); -- cgit v1.2.3