diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-08 08:35:29 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-05-08 08:35:29 +0100 |
commit | 883285df3a6cf82dbdd3549211fce296bf0bb181 (patch) | |
tree | bd90b1cb53b69c94e5fcb254736d0312c2b1f000 | |
parent | 6760dfc692dd4d3f662cc82e5b7610f8ec2ebdc0 (diff) |
WIP drvmodelv3
-rw-r--r-- | src/driver.c | 167 | ||||
-rw-r--r-- | src/drmmode_display.c | 41 | ||||
-rw-r--r-- | src/drmmode_display.h | 13 |
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 |