All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eugeni Dodonov <eugeni.dodonov@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Eugeni Dodonov <eugeni.dodonov@intel.com>
Subject: [PATCH 1/2] Enable SNA via a configuration file option.
Date: Mon, 31 Oct 2011 15:10:18 -0200	[thread overview]
Message-ID: <1320081019-2212-2-git-send-email-eugeni.dodonov@intel.com> (raw)
In-Reply-To: <1320081019-2212-1-git-send-email-eugeni.dodonov@intel.com>

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>
---
 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 6f23cdd..6b86801 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 24696da..09c306c 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 cd9c1a3..a39ce21 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 0df7ca0..4118cdd 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -396,7 +396,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 };
@@ -1019,10 +1019,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);
@@ -1044,12 +1042,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 97d5dd5..34022ba 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);
 
-- 
1.7.7.1

  reply	other threads:[~2011-10-31 17:10 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-31 17:10 [PATCH 0/2] Support SNA via a configuration option Eugeni Dodonov
2011-10-31 17:10 ` Eugeni Dodonov [this message]
2011-10-31 17:10 ` [PATCH 2/2] Unify options handling between UXA and SNA Eugeni Dodonov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1320081019-2212-2-git-send-email-eugeni.dodonov@intel.com \
    --to=eugeni.dodonov@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.