diff options
author | Dave Airlie <airlied@redhat.com> | 2011-10-23 07:51:04 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-10-23 07:51:04 +0100 |
commit | bb4f5d8fc1f4e23da359840514c5d6557e9baf1d (patch) | |
tree | b672172f6a580e8d14bebcb8d45e289189643f9c | |
parent | 15d5d6f3543aa9d02835ec0306d0e6af262a5901 (diff) |
WIPdrvmodel
-rw-r--r-- | src/driver.c | 93 | ||||
-rw-r--r-- | src/drmmode_drv_display.c | 12 |
2 files changed, 85 insertions, 20 deletions
diff --git a/src/driver.c b/src/driver.c index c77de31..1a3c1d2 100644 --- a/src/driver.c +++ b/src/driver.c @@ -56,6 +56,7 @@ #if XSERVER_LIBPCIACCESS #include <pciaccess.h> #endif +#include "xf86udev.h" #include "driver.h" @@ -75,11 +76,15 @@ static Bool DrvScreenInit(DrvScrnInfoPtr pDrvScrn); static Bool PreInit(ScrnInfoPtr pScrn, int flags); static Bool DrvPreInit(DrvScrnInfoPtr pScrn, int flags); static Bool DrvCloseScreen(DrvScreenPtr pScreen); +static void DrvFreeScreen(DrvScrnInfoPtr pDrvScrn, int flags); 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 ms_udev_probe(DriverPtr driver, + int entity_num, struct xf86_udev_device *device); + static Bool DriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr); @@ -104,7 +109,9 @@ _X_EXPORT DriverRec modesetting = { 0, DriverFunc, ms_device_match, - // ms_pci_probe, + NULL,// ms_pci_probe, + ms_udev_probe, + }; static SymTabRec Chipsets[] = { @@ -185,9 +192,13 @@ Identify(int flags) Chipsets); } -static Bool probe_hw(char *dev) +static Bool probe_hw(char *dev, char *busid) { - int fd; + int fd = -1; + + if (busid) { + fd = drmOpen(NULL, busid); + } else { if (dev) fd = open(dev, O_RDWR, 0); else { @@ -197,6 +208,7 @@ static Bool probe_hw(char *dev) fd = open(dev,O_RDWR, 0); } } + } if (fd == -1) { xf86DrvMsg(-1, X_ERROR,"open %s: %s\n", dev, strerror(errno)); return FALSE; @@ -212,6 +224,27 @@ AvailableOptions(int chipid, int busid) return Options; } +static Bool +ms_udev_probe(DriverPtr driver, + int entity_num, struct xf86_udev_device *dev) +{ + DrvScrnInfoPtr drvscrn = NULL; + + if (probe_hw(dev->path, NULL)) { + drvscrn = xf86AllocateDrvScreen(driver, 0); + xf86AddEntityToDrvScreen(drvscrn, entity_num); + + drvscrn->driverName = "modesetting"; + drvscrn->name = "modesetting"; + drvscrn->PreInit = DrvPreInit; + drvscrn->ScreenInit = DrvScreenInit; + drvscrn->FreeDrvScreen = DrvFreeScreen; + xf86DrvMsg(DRV_LOG_INDEX(drvscrn->drvScrnIndex), X_INFO, + "using drv %s\n", dev ? dev->path : "default device"); + } + return drvscrn != NULL; +} + #if XSERVER_LIBPCIACCESS static Bool ms_pci_probe(DriverPtr driver, @@ -227,7 +260,7 @@ ms_pci_probe(DriverPtr driver, scrn->entityInstanceList[0]); devpath = xf86FindOptionValue(devSection->options, "kmsdev"); - if (probe_hw(devpath)) { + if (probe_hw(devpath, NULL)) { scrn->driverVersion = 1; scrn->driverName = "modesetting"; scrn->name = "modeset"; @@ -262,6 +295,7 @@ Probe(DriverPtr drv, int flags) char *dev; ScrnInfoPtr scrn = NULL; DrvScrnInfoPtr drvscrn = NULL; + /* For now, just bail out for PROBE_DETECT. */ if (flags & PROBE_DETECT) return FALSE; @@ -281,7 +315,7 @@ Probe(DriverPtr drv, int flags) ErrorF("i is %d %p\n", i, devSections[i]->busID); dev = xf86FindOptionValue(devSections[i]->options,"kmsdev"); if (devSections[i]->busID) { - if (probe_hw(dev)) { + if (probe_hw(dev, devSections[i]->busID)) { int entity; entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); if (flags & PROBE_DRV_V2) { @@ -300,7 +334,7 @@ Probe(DriverPtr drv, int flags) drvscrn->PreInit = DrvPreInit; drvscrn->ScreenInit = DrvScreenInit; - xf86DrvV2Msg(drvscrn->drvScrnIndex, X_INFO, + xf86DrvMsg(DRV_LOG_INDEX(drvscrn->drvScrnIndex), X_INFO, "using drv %s\n", dev ? dev : "default device"); } } else if (scrn) { @@ -380,7 +414,7 @@ static void drv_dispatch_dirty(DrvScrnInfoPtr scrn) DrvDamageUnregister(drvscreen->screenPixmap, ms->drv_damage); DrvDamageDestroy(ms->drv_damage); ms->drv_damage = NULL; - xf86DrvV2Msg(scrn->drvScrnIndex, X_INFO, "Disabling kernel dirty updates, not required.\n"); + xf86DrvMsg(DRV_LOG_INDEX(scrn->drvScrnIndex), X_INFO, "Disabling kernel dirty updates, not required.\n"); return; } else ErrorF("%s: failed to send dirty (%i, %s)\n", @@ -473,6 +507,21 @@ FreeRec(ScrnInfoPtr pScrn) pScrn->driverPrivate = NULL; } + +static void +DrvFreeRec(DrvScrnInfoPtr pDrvScrn) +{ + if (!pDrvScrn) + return; + + if (!pDrvScrn->driverPrivate) + return; + + free(pDrvScrn->driverPrivate); + + pDrvScrn->driverPrivate = NULL; +} + static Bool DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) { @@ -481,7 +530,7 @@ DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) EntityInfoPtr pEnt; EntPtr msEnt = NULL; char *BusID, *devicename; - + int logIndex = DRV_LOG_INDEX(pDrvScrn->drvScrnIndex); if (pDrvScrn->numEntities != 1) return FALSE; @@ -518,7 +567,7 @@ DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) case 24: break; default: - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_ERROR, + xf86DrvMsg(logIndex, X_ERROR, "Given depth (%d) is not supported by the driver\n", pDrvScrn->depth); return FALSE; @@ -535,8 +584,11 @@ DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) if (!(ms->Options = malloc(sizeof(Options)))) return FALSE; memcpy(ms->Options, Options, sizeof(Options)); - xf86DrvProcessOptions(pDrvScrn->drvScrnIndex, pDrvScrn->options, ms->Options); + xf86ProcessOptions(DRV_LOG_INDEX(pDrvScrn->drvScrnIndex), pDrvScrn->options, ms->Options); + if (pEnt->location.type == BUS_UDEV) + devicename = pEnt->location.id.udev->path; + else devicename = xf86GetOptValString(ms->Options, OPTION_DEVICE_PATH); if (!devicename) { BusID = malloc(64); @@ -566,7 +618,7 @@ DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) ms->drmmodedrv.fd = ms->fd; if (drmmode_drv_pre_init(pDrvScrn, &ms->drmmodedrv, pDrvScrn->bitsPerPixel / 8) == FALSE) { - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_ERROR, "KMS setup failed\n"); + xf86DrvMsg(logIndex, X_ERROR, "KMS setup failed\n"); goto fail; } @@ -583,7 +635,7 @@ DrvPreInit(DrvScrnInfoPtr pDrvScrn, int flags) } #endif if (pDrvScrn->modes == NULL) { - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_ERROR, "No modes.\n"); + xf86DrvMsg(logIndex, X_ERROR, "No modes.\n"); return FALSE; } @@ -813,9 +865,9 @@ drvCreateScreenResources(DrvScreenPtr pDrvScreen) if (ms->drv_damage) { DrvDamageRegister(rootPixmap, ms->drv_damage); ms->dirty_enabled = TRUE; - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_INFO, "Damage tracking initialized\n"); + xf86DrvMsg(DRV_LOG_INDEX(pDrvScrn->drvScrnIndex), X_INFO, "Damage tracking initialized\n"); } else { - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_ERROR, + xf86DrvMsg(DRV_LOG_INDEX(pDrvScrn->drvScrnIndex), X_ERROR, "Failed to create screen damage record\n"); return FALSE; } @@ -1078,6 +1130,18 @@ AdjustFrame(int scrnIndex, int x, int y, int flags) } static void +DrvFreeScreen(DrvScrnInfoPtr pDrvScrn, int flags) +{ + modesettingPtr ms; + + ms = modesettingPTR(pDrvScrn); + + close(ms->fd); + + DrvFreeRec(pDrvScrn); +} + +static void FreeScreen(int scrnIndex, int flags) { FreeRec(xf86Screens[scrnIndex]); @@ -1133,6 +1197,7 @@ DrvCloseScreen(DrvScreenPtr pDrvScreen) pDrvScreen->CloseScreen = ms->drvCloseScreen; return (*pDrvScreen->CloseScreen) (pDrvScreen); } + static Bool CloseScreen(int scrnIndex, ScreenPtr pScreen) { diff --git a/src/drmmode_drv_display.c b/src/drmmode_drv_display.c index f2d4462..b89b79f 100644 --- a/src/drmmode_drv_display.c +++ b/src/drmmode_drv_display.c @@ -232,14 +232,14 @@ create_pixmap_for_fbcon(drmmodedrv_ptr drmmode, flink.handle = fbcon->handle; if (ioctl(drmmode->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) { - xf86DrvV2Msg(pScrn->drvScrnIndex, X_ERROR, + xf86DrvMsg(DRV_LOG_INDEX(pScrn->drvScrnIndex), X_ERROR, "Couldn't flink fbcon handle\n"); return NULL; } bo = radeon_bo_open(drmmode->bufmgr, flink.name, 0, 0, 0, 0); if (bo == NULL) { - xf86DrvV2Msg(pScrn->drvScrnIndex, X_ERROR, + xf86DrvMsg(DRV_LOG_INDEX(pScrn->drvScrnIndex), X_ERROR, "Couldn't allocate bo for fbcon handle\n"); return NULL; } @@ -343,7 +343,7 @@ drmmode_set_mode_major(xf86DrvCrtcPtr crtc, DisplayModePtr mode, ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, fb_id, x, y, output_ids, output_count, &kmode); if (ret) - xf86DrvV2Msg(crtc->drvscrn->drvScrnIndex, X_ERROR, + xf86DrvMsg(DRV_LOG_INDEX(crtc->drvscrn->drvScrnIndex), X_ERROR, "failed to set mode: %s", strerror(-ret)); else ret = TRUE; @@ -947,7 +947,7 @@ drmmode_xf86crtc_resize (DrvScrnInfoPtr scrn, int width, int height) if (scrn->virtualX == width && scrn->virtualY == height) return TRUE; - xf86DrvV2Msg(scrn->drvScrnIndex, X_INFO, + xf86DrvMsg(DRV_LOG_INDEX(scrn->drvScrnIndex), X_INFO, "Allocate new frame buffer %dx%d stride\n", width, height); @@ -974,7 +974,7 @@ drmmode_xf86crtc_resize (DrvScrnInfoPtr scrn, int width, int height) if (ret) goto fail; - new_pixels = drmmode_drv_map_front_bo(drmmode); + new_pixels = drmmode_drv_map_front_bo(drmmode); if (!new_pixels) goto fail; @@ -1028,7 +1028,7 @@ Bool drmmode_drv_pre_init(DrvScrnInfoPtr pDrvScrn, drmmodedrv_ptr drmmode, int c uint64_t value = 0; ret = drmGetCap(drmmode->fd, DRM_CAP_DUMB_BUFFER, &value); if (ret > 0 || value != 1) { - xf86DrvV2Msg(pDrvScrn->drvScrnIndex, X_ERROR, "KMS doesn't support dumb interface\n"); + xf86DrvMsg(DRV_LOG_INDEX(pDrvScrn->drvScrnIndex), X_ERROR, "KMS doesn't support dumb interface\n"); return FALSE; } } |