summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-10-23 07:51:04 +0100
committerDave Airlie <airlied@redhat.com>2011-10-23 07:51:04 +0100
commitbb4f5d8fc1f4e23da359840514c5d6557e9baf1d (patch)
treeb672172f6a580e8d14bebcb8d45e289189643f9c
parent15d5d6f3543aa9d02835ec0306d0e6af262a5901 (diff)
-rw-r--r--src/driver.c93
-rw-r--r--src/drmmode_drv_display.c12
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;
}
}