summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2011-10-31 11:50:33 -0200
committerEugeni Dodonov <eugeni.dodonov@intel.com>2011-11-10 16:16:51 -0200
commitff9a52b07789b695859163be5b9aaed241767643 (patch)
tree2a189972d74bc44e8d0cbd8cb0acb13b931e58c5
parent3252b46e115e6cc46abbcc4f502feeb9edc31ad6 (diff)
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 <eugeni.dodonov@intel.com>
-rw-r--r--src/common.h2
-rw-r--r--src/intel_driver.c96
-rw-r--r--src/intel_module.c6
-rw-r--r--src/sna/sna_driver.c14
-rw-r--r--src/sna/sna_module.h3
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);