xserver: Branch 'master'
Adam Jackson
ajax at kemper.freedesktop.org
Wed Feb 4 20:24:56 PST 2009
hw/xfree86/common/xf86.h | 3 +
hw/xfree86/common/xf86Bus.c | 70 ++++++++++++++++++++++++++++++++++++++++++++
hw/xfree86/common/xf86Bus.h | 2 +
hw/xfree86/common/xf86str.h | 6 +++
4 files changed, 81 insertions(+)
New commits:
commit db836715198a445dc3b32c3df0610f700930483f
Author: Adam Jackson <ajax at redhat.com>
Date: Wed Feb 4 23:27:32 2009 -0500
Revert "Bus: Remove xf86SetAccessFuncs() and related machinery"
This reverts commit 2fe79990e31ac684637ca3c47198ee0cead10abe.
Reminder: nvidia uses this, because other parts of RAC are broken in
worse ways, and it needs to disable that.
diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 7dd693f..ab0e045 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -1,3 +1,4 @@
+
/*
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
*
@@ -127,6 +128,8 @@ extern _X_EXPORT void xf86DeallocateResourcesForEntity(int entityIndex, unsigned
extern _X_EXPORT resPtr xf86RegisterResources(int entityIndex, resList list,
unsigned long Access);
extern _X_EXPORT Bool xf86CheckPciMemBase(struct pci_device * pPci, memType base);
+extern _X_EXPORT void xf86SetAccessFuncs(EntityInfoPtr pEnt, xf86SetAccessFuncPtr funcs,
+ xf86SetAccessFuncPtr oldFuncs);
extern _X_EXPORT Bool xf86IsEntityPrimary(int entityIndex);
extern _X_EXPORT resPtr xf86SetOperatingState(resList list, int entityIndex, int mask);
extern _X_EXPORT void xf86EnterServerState(xf86State state);
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index f5b535c..8040f58 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -792,6 +792,24 @@ xf86SetCurrentAccess(Bool Enable, ScrnInfoPtr pScrn)
}
}
+void
+xf86SetAccessFuncs(EntityInfoPtr pEnt, xf86SetAccessFuncPtr funcs,
+ xf86SetAccessFuncPtr oldFuncs)
+{
+ AccessFuncPtr rac;
+
+ if (!xf86Entities[pEnt->index]->rac)
+ xf86Entities[pEnt->index]->rac = xnfcalloc(1,sizeof(AccessFuncRec));
+
+ rac = xf86Entities[pEnt->index]->rac;
+
+ rac->mem_new = funcs->mem;
+ rac->io_new = funcs->io;
+ rac->io_mem_new = funcs->io_mem;
+
+ rac->old = oldFuncs;
+}
+
/*
* Conflict checking
*/
@@ -1374,11 +1392,30 @@ busTypeSpecific(EntityPtr pEnt, xf86AccessPtr *acc_mem,
static void
setAccess(EntityPtr pEnt, xf86State state)
{
+
xf86AccessPtr acc_mem, acc_io, acc_mem_io;
+ xf86AccessPtr org_mem = NULL, org_io = NULL, org_mem_io = NULL;
int prop;
busTypeSpecific(pEnt, &acc_mem, &acc_io, &acc_mem_io);
+ /* The replacement function needs to handle _all_ shared resources */
+ /* unless they are handeled locally and disabled otherwise */
+ if (pEnt->rac) {
+ if (pEnt->rac->io_new) {
+ org_io = acc_io;
+ acc_io = pEnt->rac->io_new;
+ }
+ if (pEnt->rac->mem_new) {
+ org_mem = acc_mem;
+ acc_mem = pEnt->rac->mem_new;
+ }
+ if (pEnt->rac->io_mem_new) {
+ org_mem_io = acc_mem_io;
+ acc_mem_io = pEnt->rac->io_mem_new;
+ }
+ }
+
if (state == OPERATING) {
prop = pEnt->entityProp;
switch(pEnt->entityProp & NEED_SHARED) {
@@ -1414,6 +1451,39 @@ setAccess(EntityPtr pEnt, xf86State state)
break;
}
+ if (org_io) {
+ /* does the driver want the old access func? */
+ if (pEnt->rac->old) {
+ /* give it to the driver, leave state disabled */
+ pEnt->rac->old->io = org_io;
+ } else {
+ /* driver doesn't want it - enable generic access */
+ org_io->AccessEnable(org_io->arg);
+ }
+ }
+
+ if (org_mem_io) {
+ /* does the driver want the old access func? */
+ if (pEnt->rac->old) {
+ /* give it to the driver, leave state disabled */
+ pEnt->rac->old->io_mem = org_mem_io;
+ } else {
+ /* driver doesn't want it - enable generic access */
+ org_mem_io->AccessEnable(org_mem_io->arg);
+ }
+ }
+
+ if (org_mem) {
+ /* does the driver want the old access func? */
+ if (pEnt->rac->old) {
+ /* give it to the driver, leave state disabled */
+ pEnt->rac->old->mem = org_mem;
+ } else {
+ /* driver doesn't want it - enable generic access */
+ org_mem->AccessEnable(org_mem->arg);
+ }
+ }
+
if (!(prop & NEED_MEM_SHARED)){
if (prop & NEED_MEM) {
if (acc_mem)
diff --git a/hw/xfree86/common/xf86Bus.h b/hw/xfree86/common/xf86Bus.h
index dfc4176..83ba83c 100644
--- a/hw/xfree86/common/xf86Bus.h
+++ b/hw/xfree86/common/xf86Bus.h
@@ -47,6 +47,7 @@ typedef struct racInfo {
xf86AccessPtr mem_new;
xf86AccessPtr io_new;
xf86AccessPtr io_mem_new;
+ xf86SetAccessFuncPtr old;
} AccessFuncRec, *AccessFuncPtr;
@@ -63,6 +64,7 @@ typedef struct {
Bool inUse;
BusRec bus;
EntityAccessPtr access;
+ AccessFuncPtr rac;
pointer busAcc;
int lastScrnFlag;
DevUnion * entityPrivates;
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index 511181f..904c369 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -582,6 +582,12 @@ typedef struct _AccessRec {
void *arg;
} xf86AccessRec, *xf86AccessPtr;
+typedef struct {
+ xf86AccessPtr mem;
+ xf86AccessPtr io;
+ xf86AccessPtr io_mem;
+} xf86SetAccessFuncRec, *xf86SetAccessFuncPtr;
+
/* bus-access-related types */
typedef enum {
NONE,
More information about the xorg-commit
mailing list