summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-08 08:35:29 +0100
committerDave Airlie <airlied@redhat.com>2012-05-08 08:35:29 +0100
commit883285df3a6cf82dbdd3549211fce296bf0bb181 (patch)
treebd90b1cb53b69c94e5fcb254736d0312c2b1f000
parent6760dfc692dd4d3f662cc82e5b7610f8ec2ebdc0 (diff)
WIP drvmodelv3
-rw-r--r--src/driver.c167
-rw-r--r--src/drmmode_display.c41
-rw-r--r--src/drmmode_display.h13
3 files changed, 168 insertions, 53 deletions
diff --git a/src/driver.c b/src/driver.c
index 87431ff..ff86c07 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -51,6 +51,7 @@
#include "dixstruct.h"
#include "shadow.h"
#include "xf86xv.h"
+#include "xf86udev.h"
#include <X11/extensions/Xv.h>
#include <xorg-server.h>
#if XSERVER_LIBPCIACCESS
@@ -63,17 +64,19 @@
#define DRM_CAP_DUMB_PREFER_SHADOW 4
#endif
-static void AdjustFrame(int scrnIndex, int x, int y, int flags);
-static Bool CloseScreen(int scrnIndex, ScreenPtr pScreen);
-static Bool EnterVT(int scrnIndex, int flags);
+DevPrivateKeyRec msPixmapPrivateKeyRec;
+
+static void AdjustFrame(ScrnInfoPtr pScrn, int x, int y, int flags);
+static Bool CloseScreen(ScreenPtr pScreen);
+static Bool EnterVT(ScrnInfoPtr pScrn, int flags);
static void Identify(int flags);
static const OptionInfoRec *AvailableOptions(int chipid, int busid);
-static ModeStatus ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose,
+static ModeStatus ValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool verbose,
int flags);
-static void FreeScreen(int scrnIndex, int flags);
-static void LeaveVT(int scrnIndex, int flags);
-static Bool SwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
-static Bool ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc,
+static void FreeScreen(ScrnInfoPtr pScrn, int flags);
+static void LeaveVT(ScrnInfoPtr pScrn, int flags);
+static Bool SwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int flags);
+static Bool ScreenInit(ScreenPtr pScreen, int argc,
char **argv);
static Bool PreInit(ScrnInfoPtr pScrn, int flags);
@@ -81,6 +84,7 @@ static Bool Probe(DriverPtr drv, int flags);
static Bool ms_pci_probe(DriverPtr driver,
int entity_num, struct pci_device *device,
intptr_t match_data);
+static Bool DriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr);
#ifdef XSERVER_LIBPCIACCESS
static const struct pci_id_match ms_device_match[] = {
@@ -93,6 +97,9 @@ static const struct pci_id_match ms_device_match[] = {
};
#endif
+static Bool ms_udev_probe(DriverPtr driver,
+ int entity_num, struct xf86_udev_device *device);
+
_X_EXPORT DriverRec modesetting = {
1,
"modesetting",
@@ -101,9 +108,10 @@ _X_EXPORT DriverRec modesetting = {
AvailableOptions,
NULL,
0,
- NULL,
+ DriverFunc,
ms_device_match,
- ms_pci_probe,
+ NULL,//ms_pci_probe,
+ ms_udev_probe,
};
static SymTabRec Chipsets[] = {
@@ -167,6 +175,16 @@ Setup(pointer module, pointer opts, int *errmaj, int *errmin)
}
}
+static Bool DriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr)
+{
+ switch(op) {
+ case GET_DRV_MODEL_V2_SUPPORT:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
static void
Identify(int flags)
{
@@ -250,6 +268,33 @@ ms_pci_probe(DriverPtr driver,
#endif
static Bool
+ms_udev_probe(DriverPtr driver,
+ int entity_num, struct xf86_udev_device *dev)
+{
+ ScrnInfoPtr scrn = NULL;
+
+ if (probe_hw(dev->path)) {
+ scrn = xf86AllocateGPUScreen(driver, 0);
+ xf86AddEntityToScreen(scrn, entity_num);
+
+ scrn->driverName = "modesetting";
+ scrn->name = "modesetting";
+ scrn->PreInit = PreInit;
+ scrn->ScreenInit = ScreenInit;
+ scrn->SwitchMode = SwitchMode;
+ scrn->AdjustFrame = AdjustFrame;
+ scrn->EnterVT = EnterVT;
+ scrn->LeaveVT = LeaveVT;
+ scrn->FreeScreen = FreeScreen;
+ scrn->ValidMode = ValidMode;
+ scrn->roles = ROLE_SLAVE_OUTPUT;
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "using drv %s\n", dev ? dev->path : "default device");
+ }
+ return scrn != NULL;
+}
+
+static Bool
Probe(DriverPtr drv, int flags)
{
int i, numDevSections;
@@ -318,7 +363,7 @@ GetRec(ScrnInfoPtr pScrn)
static void dispatch_dirty(ScreenPtr pScreen)
{
- ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
modesettingPtr ms = modesettingPTR(scrn);
RegionPtr dirty = DamageRegion(ms->damage);
unsigned num_cliprects = REGION_NUM_RECTS(dirty);
@@ -355,14 +400,13 @@ static void dispatch_dirty(ScreenPtr pScreen)
}
}
-static void msBlockHandler(int i, pointer blockData, pointer pTimeout,
+static void msBlockHandler(ScreenPtr pScreen, pointer blockData, pointer pTimeout,
pointer pReadmask)
{
- ScreenPtr pScreen = screenInfo.screens[i];
- modesettingPtr ms = modesettingPTR(xf86Screens[pScreen->myNum]);
+ modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
pScreen->BlockHandler = ms->BlockHandler;
- pScreen->BlockHandler(i, blockData, pTimeout, pReadmask);
+ pScreen->BlockHandler(pScreen, blockData, pTimeout, pReadmask);
pScreen->BlockHandler = msBlockHandler;
if (ms->dirty_enabled)
dispatch_dirty(pScreen);
@@ -458,21 +502,25 @@ PreInit(ScrnInfoPtr pScrn, int flags)
memcpy(ms->Options, Options, sizeof(Options));
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, ms->Options);
- ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
- if (ms->PciInfo) {
- BusID = malloc(64);
- sprintf(BusID, "PCI:%d:%d:%d",
+ if (pEnt->location.type == BUS_UDEV) {
+ devicename = pEnt->location.id.udev->path;
+ ms->fd = open_hw(devicename);
+ } else if (pEnt->location.type == BUS_PCI) {
+ ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
+ if (ms->PciInfo) {
+ BusID = malloc(64);
+ sprintf(BusID, "PCI:%d:%d:%d",
#if XSERVER_LIBPCIACCESS
- ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
- ms->PciInfo->dev, ms->PciInfo->func
+ ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
+ ms->PciInfo->dev, ms->PciInfo->func
#else
- ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
- ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
- ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
+ ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
+ ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
+ ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
#endif
- );
-
- ms->fd = drmOpen(NULL, BusID);
+ );
+ }
+ ms->fd = drmOpen(NULL, BusID);
} else {
devicename = xf86GetOptValString(ms->Options, OPTION_DEVICE_PATH);
ms->fd = open_hw(devicename);
@@ -544,7 +592,7 @@ static void *
msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
CARD32 *size, void *closure)
{
- ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
modesettingPtr ms = modesettingPTR(pScrn);
int stride;
@@ -557,7 +605,7 @@ msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
static Bool
CreateScreenResources(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap;
Bool ret;
@@ -616,9 +664,26 @@ msShadowInit(ScreenPtr pScreen)
}
static Bool
-ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+msSetSharedPixmapBacking(PixmapPtr ppix, int fd_handle)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ ScreenPtr screen = ppix->drawable.pScreen;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ modesettingPtr ms = modesettingPTR(scrn);
+ Bool ret;
+ int r;
+ int size = ppix->devKind * ppix->drawable.height;
+
+ ret = drmmode_SetSlaveBO(ppix, &ms->drmmode, fd_handle, ppix->devKind, size);
+ if (ret == FALSE)
+ return ret;
+
+ return TRUE;
+}
+
+static Bool
+ScreenInit(ScreenPtr pScreen, int argc, char **argv)
+{
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
modesettingPtr ms = modesettingPTR(pScrn);
VisualPtr visual;
int ret;
@@ -653,6 +718,10 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if (!miSetPixmapDepths())
return FALSE;
+ if (!dixRegisterPrivateKey(&msPixmapPrivateKeyRec, PRIVATE_PIXMAP, sizeof(msPixmapPrivRec))) {
+ return FALSE;
+ }
+
pScrn->memPhysBase = 0;
pScrn->fbOffset = 0;
@@ -662,6 +731,7 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pScrn->displayWidth, pScrn->bitsPerPixel))
return FALSE;
+#if 0
if (pScrn->bitsPerPixel > 8) {
/* Fixup RGB ordering */
visual = pScreen->visuals + pScreen->numVisuals;
@@ -676,11 +746,11 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
}
}
}
-
+#endif
fbPictureInit(pScreen, NULL, 0);
if (ms->drmmode.shadow_enable && !msShadowInit(pScreen)) {
- xf86DrvMsg(scrnIndex, X_ERROR,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"shadow fb init failed\n");
return FALSE;
}
@@ -712,6 +782,8 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
ms->BlockHandler = pScreen->BlockHandler;
pScreen->BlockHandler = msBlockHandler;
+ pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking;
+
if (!xf86CrtcScreenInit(pScreen))
return FALSE;
@@ -723,13 +795,12 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if (serverGeneration == 1)
xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
- return EnterVT(scrnIndex, 1);
+ return EnterVT(pScrn, 1);
}
static void
-AdjustFrame(int scrnIndex, int x, int y, int flags)
+AdjustFrame(ScrnInfoPtr pScrn, int x, int y, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
xf86OutputPtr output = config->output[config->compat_output];
xf86CrtcPtr crtc = output->crtc;
@@ -743,16 +814,14 @@ AdjustFrame(int scrnIndex, int x, int y, int flags)
}
static void
-FreeScreen(int scrnIndex, int flags)
+FreeScreen(ScrnInfoPtr pScrn, int flags)
{
- FreeRec(xf86Screens[scrnIndex]);
+ FreeRec(pScrn);
}
static void
-LeaveVT(int scrnIndex, int flags)
+LeaveVT(ScrnInfoPtr pScrn, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-
pScrn->vtSema = FALSE;
}
@@ -760,9 +829,8 @@ LeaveVT(int scrnIndex, int flags)
* This gets called when gaining control of the VT, and from ScreenInit().
*/
static Bool
-EnterVT(int scrnIndex, int flags)
+EnterVT(ScrnInfoPtr pScrn, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
modesettingPtr ms = modesettingPTR(pScrn);
pScrn->vtSema = TRUE;
@@ -774,17 +842,16 @@ EnterVT(int scrnIndex, int flags)
}
static Bool
-SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
+SwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
return xf86SetSingleMode(pScrn, mode, RR_Rotate_0);
}
static Bool
-CloseScreen(int scrnIndex, ScreenPtr pScreen)
+CloseScreen(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
modesettingPtr ms = modesettingPTR(pScrn);
if (ms->damage) {
@@ -803,7 +870,7 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
drmmode_free_bos(pScrn, &ms->drmmode);
if (pScrn->vtSema) {
- LeaveVT(scrnIndex, 0);
+ LeaveVT(pScrn, 0);
}
pScreen->CreateScreenResources = ms->createScreenResources;
@@ -813,11 +880,11 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
pScrn->vtSema = FALSE;
pScreen->CloseScreen = ms->CloseScreen;
- return (*pScreen->CloseScreen) (scrnIndex, pScreen);
+ return (*pScreen->CloseScreen) (pScreen);
}
static ModeStatus
-ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
+ValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool verbose, int flags)
{
return MODE_OK;
}
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 7fa933a..c140bfc 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -136,6 +136,41 @@ static int dumb_bo_destroy(int fd, struct dumb_bo *bo)
return 0;
}
+static struct dumb_bo *dumb_get_bo_from_handle(int fd, int handle, int pitch, int size)
+{
+ struct dumb_bo *bo;
+ int ret;
+
+ bo = calloc(1, sizeof(*bo));
+ if (!bo)
+ return NULL;
+
+ ret = drmPrimeFDToHandle(fd, handle, &bo->handle);
+ if (ret) {
+ free(bo);
+ return NULL;
+ }
+ bo->pitch = pitch;
+ bo->size = size;
+ return bo;
+}
+
+Bool drmmode_SetSlaveBO(PixmapPtr ppix,
+ drmmode_ptr drmmode,
+ int fd_handle, int pitch, int size)
+{
+ ScreenPtr screen = ppix->drawable.pScreen;
+ msPixmapPrivPtr ppriv = msGetPixmapPriv(ppix);
+
+ ppriv->backing_bo = dumb_get_bo_from_handle(drmmode->fd, fd_handle, pitch, size);
+ if (!ppriv->backing_bo)
+ return FALSE;
+
+ ErrorF("set shared pixmap backing %d\n", ppriv->backing_bo->handle);
+ close(fd_handle);
+ return TRUE;
+}
+
static void
drmmode_ConvertFromKMode(ScrnInfoPtr scrn,
drmModeModeInfo *kmode,
@@ -937,7 +972,7 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
drmmode_ptr drmmode = drmmode_crtc->drmmode;
struct dumb_bo *old_front = NULL;
Bool ret;
- ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
+ ScreenPtr screen = xf86ScrnToScreen(scrn);
uint32_t old_fb_id;
int i, pitch, old_width, old_height, old_pitch;
int cpp = (scrn->bitsPerPixel + 7) / 8;
@@ -1054,7 +1089,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, drmmode->mode_res->max_height);
for (i = 0; i < drmmode->mode_res->count_crtcs; i++)
- if (!xf86IsEntityShared(pScrn->entityList[0]) || pScrn->confScreen->device->screen == i)
+ if (!xf86IsEntityShared(pScrn->entityList[0]) || pScrn->confScreen->devices[0]->screen == i)
drmmode_crtc_init(pScrn, drmmode, i);
for (i = 0; i < drmmode->mode_res->count_connectors; i++)
@@ -1228,7 +1263,7 @@ drmmode_handle_uevents(int fd, void *closure)
if (!dev)
return;
- RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
+ RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
udev_device_unref(dev);
}
#endif
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index e83167b..259f01e 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -90,6 +90,15 @@ typedef struct {
int enc_clone_mask;
} drmmode_output_private_rec, *drmmode_output_private_ptr;
+typedef struct _msPixmapPriv {
+ int fb_id;
+ struct dumb_bo *backing_bo; /* if this pixmap is backed by a dumb bo */
+} msPixmapPrivRec, *msPixmapPrivPtr;
+
+extern DevPrivateKeyRec msPixmapPrivateKeyRec;
+#define msPixmapPrivateKey (&msPixmapPrivateKeyRec)
+
+#define msGetPixmapPriv(p) ((msPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, msPixmapPrivateKey))
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y, int flags);
@@ -103,4 +112,8 @@ Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void *drmmode_map_front_bo(drmmode_ptr drmmode);
Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
+
+Bool drmmode_SetSlaveBO(PixmapPtr ppix,
+ drmmode_ptr drmmode,
+ int fd_handle, int pitch, int size);
#endif