Emil Velikov
2012-Nov-01 14:40 UTC
[Nouveau] [PATCH 0/4] nouveau: xserver 1.13 compat fixes
Here are a few patches adding some missing functions in
NvPlatformProbe, which iirc is being used as of xserver 1.13
First patch adds a nouveau_kernel_mode_enabled helper, similar
to xf86-video-radeon
Second and third use the function in Nv{Pci,Platform}Probe
And last one ensures we can still use ZaphodHead and relative
head positioning via xorg.conf
The coding style may be a bit off, despite my best attempts
Please review and comment
[PATCH 1/4] nouveau: add nouveau_kernel_mode_enabled()
[PATCH 2/4] nouveau: Use helper function
[PATCH 3/4] nouveau: Check for kms in NvPlatformProbe
[PATCH 4/4] nouveau: fix entity handling in NvPlatformProbe
Emil Velikov
2012-Nov-01 14:40 UTC
[Nouveau] [PATCH 1/4] nouveau: add nouveau_kernel_mode_enabled()
Used in later patch to remove code duplication and improve
NvPciProbe() and NvPlatformProbe()
Copied verbatim from xf86-video-radeon
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
src/nv_driver.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 9b5b9d6..eff0d47 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -252,6 +252,74 @@ NVDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void
*data)
}
static Bool
+nouveau_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev)
+{
+ struct nouveau_device *dev = NULL;
+ drmVersion *version;
+ char *busid;
+ int chipset, ret;
+
+ if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] No DRICreatePCIBusID symbol\n");
+ return FALSE;
+ }
+
+ busid = DRICreatePCIBusID(pci_dev);
+ ret = drmCheckModesettingSupported(busid);
+ if (ret) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] KMS not
enabled\n");
+ free(busid);
+ return FALSE;
+ }
+
+ ret = nouveau_device_open(busid, &dev);
+ if (ret) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] failed to open device\n");
+ free(busid);
+ return FALSE;
+ }
+ /* Check the version reported by the kernel module. In theory we
+ * shouldn't have to do this, as libdrm_nouveau will do its own checks.
+ * But, we're currently using the kernel patchlevel to also version
+ * the DRI interface.
+ */
+ version = drmGetVersion(dev->fd);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[drm] nouveau interface version: %d.%d.%d\n",
+ version->version_major, version->version_minor,
+ version->version_patchlevel);
+ drmFree(version);
+
+ chipset = dev->chipset;
+ nouveau_device_del(&dev);
+ free(busid);
+
+ switch (chipset & 0xf0) {
+ case 0x00:
+ case 0x10:
+ case 0x20:
+ case 0x30:
+ case 0x40:
+ case 0x60:
+ case 0x50:
+ case 0x80:
+ case 0x90:
+ case 0xa0:
+ case 0xc0:
+ case 0xd0:
+ case 0xe0:
+ break;
+ default:
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Unknown chipset: NV%02x\n", chipset);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+static Bool
NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
intptr_t match_data)
{
--
1.8.0
Emil Velikov
2012-Nov-01 14:40 UTC
[Nouveau] [PATCH 2/4] nouveau: Use helper function nouveau_kernel_mode_enabled()
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
src/nv_driver.c | 64 ++++++---------------------------------------------------
1 file changed, 6 insertions(+), 58 deletions(-)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index eff0d47..911b05d 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -319,6 +319,7 @@ nouveau_kernel_mode_enabled(ScrnInfoPtr pScrn, struct
pci_device *pci_dev)
return TRUE;
}
+
static Bool
NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
intptr_t match_data)
@@ -328,72 +329,19 @@ NVPciProbe(DriverPtr drv, int entity_num, struct
pci_device *pci_dev,
(pci_dev->vendor_id << 16) | pci_dev->device_id, NULL },
{ -1, -1, NULL }
};
- struct nouveau_device *dev = NULL;
EntityInfoPtr pEnt = NULL;
ScrnInfoPtr pScrn = NULL;
- drmVersion *version;
- int chipset, ret;
- char *busid;
-
- if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
- xf86DrvMsg(-1, X_ERROR, "[drm] No DRICreatePCIBusID symbol\n");
- return FALSE;
- }
- busid = DRICreatePCIBusID(pci_dev);
-
- ret = nouveau_device_open(busid, &dev);
- if (ret) {
- xf86DrvMsg(-1, X_ERROR, "[drm] failed to open device\n");
- free(busid);
- return FALSE;
- }
-
- /* Check the version reported by the kernel module. In theory we
- * shouldn't have to do this, as libdrm_nouveau will do its own checks.
- * But, we're currently using the kernel patchlevel to also version
- * the DRI interface.
- */
- version = drmGetVersion(dev->fd);
- xf86DrvMsg(-1, X_INFO, "[drm] nouveau interface version:
%d.%d.%d\n",
- version->version_major, version->version_minor,
- version->version_patchlevel);
- drmFree(version);
-
- chipset = dev->chipset;
- nouveau_device_del(&dev);
-
- ret = drmCheckModesettingSupported(busid);
- free(busid);
- if (ret) {
- xf86DrvMsg(-1, X_ERROR, "[drm] KMS not enabled\n");
- return FALSE;
- }
-
- switch (chipset & 0xf0) {
- case 0x00:
- case 0x10:
- case 0x20:
- case 0x30:
- case 0x40:
- case 0x60:
- case 0x50:
- case 0x80:
- case 0x90:
- case 0xa0:
- case 0xc0:
- case 0xd0:
- case 0xe0:
- break;
- default:
- xf86DrvMsg(-1, X_ERROR, "Unknown chipset: NV%02x\n", chipset);
- return FALSE;
- }
+ int ret;
pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, NVChipsets,
NULL, NULL, NULL, NULL, NULL);
if (!pScrn)
return FALSE;
+ if (!nouveau_kernel_mode_enabled(pScrn, pci_dev)) {
+ return FALSE;
+ }
+
pScrn->driverVersion = NV_VERSION;
pScrn->driverName = NV_DRIVER_NAME;
pScrn->name = NV_NAME;
--
1.8.0
Emil Velikov
2012-Nov-01 14:40 UTC
[Nouveau] [PATCH 3/4] nouveau: Check for kms in NvPlatformProbe
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
src/nv_driver.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 911b05d..c1a50cd 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -57,6 +57,8 @@ static void NVFreeScreen(FREE_SCREEN_ARGS_DECL);
static Bool NVMapMem(ScrnInfoPtr pScrn);
static Bool NVUnmapMem(ScrnInfoPtr pScrn);
+static Bool nouveau_kernel_mode_enabled(ScrnInfoPtr pScrn,
+ struct pci_device *pci_dev);
#define NOUVEAU_PCI_DEVICE(_vendor_id, _device_id)
\
{ (_vendor_id), (_device_id), PCI_MATCH_ANY, PCI_MATCH_ANY, \
@@ -76,7 +78,9 @@ static Bool NVPciProbe ( DriverPtr drv,
#ifdef XSERVER_PLATFORM_BUS
static Bool
NVPlatformProbe(DriverPtr driver,
- int entity_num, int flags, struct xf86_platform_device *dev,
intptr_t dev_match_data)
+ int entity_num, int flags,
+ struct xf86_platform_device *dev,
+ intptr_t dev_match_data)
{
ScrnInfoPtr scrn = NULL;
uint32_t scr_flags = 0;
@@ -84,12 +88,17 @@ NVPlatformProbe(DriverPtr driver,
if (!dev->pdev)
return FALSE;
- if (flags & PLATFORM_PROBE_GPU_SCREEN)
- scr_flags = XF86_ALLOCATE_GPU_SCREEN;
+ if (flags & PLATFORM_PROBE_GPU_SCREEN)
+ scr_flags = XF86_ALLOCATE_GPU_SCREEN;
scrn = xf86AllocateScreen(driver, scr_flags);
+ if (!scrn)
+ return FALSE;
xf86AddEntityToScreen(scrn, entity_num);
+ if (!nouveau_kernel_mode_enabled(scrn, dev->pdev))
+ return FALSE;
+
scrn->driverVersion = NV_VERSION;
scrn->driverName = NV_DRIVER_NAME;
scrn->name = NV_NAME;
@@ -102,7 +111,8 @@ NVPlatformProbe(DriverPtr driver,
scrn->EnterVT = NVEnterVT;
scrn->LeaveVT = NVLeaveVT;
scrn->FreeScreen = NVFreeScreen;
- return scrn != NULL;
+
+ return TRUE;
}
#endif
--
1.8.0
Emil Velikov
2012-Nov-01 14:40 UTC
[Nouveau] [PATCH 4/4] nouveau: fix entity handling in NvPlatformProbe
Ensure that the entity is shareable, making ZaphodHeads work again
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56347
Connect entity to screen - should fix relative screen positioning in xorg.conf
Reported-by: shox on IRC
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
src/nv_driver.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index c1a50cd..7c7f822 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -84,6 +84,7 @@ NVPlatformProbe(DriverPtr driver,
{
ScrnInfoPtr scrn = NULL;
uint32_t scr_flags = 0;
+ EntityInfoPtr pEnt = NULL;
if (!dev->pdev)
return FALSE;
@@ -112,6 +113,11 @@ NVPlatformProbe(DriverPtr driver,
scrn->LeaveVT = NVLeaveVT;
scrn->FreeScreen = NVFreeScreen;
+ xf86SetEntitySharable(entity_num);
+
+ pEnt = xf86GetEntityInfo(entity_num);
+ xf86SetEntityInstanceForScreen(scrn, pEnt->index,
xf86GetNumEntityInstances(pEnt->index) - 1);
+ free(pEnt);
return TRUE;
}
#endif
--
1.8.0
Emil Velikov
2012-Nov-02 00:51 UTC
[Nouveau] [PATCH 0/4] nouveau: xserver 1.13 compat fixes
On Thu, 01 Nov 2012 14:40:54 -0000, Emil Velikov wrote:> Here are a few patches adding some missing functions in > NvPlatformProbe, which iirc is being used as of xserver 1.13 > > First patch adds a nouveau_kernel_mode_enabled helper, similar > to xf86-video-radeon > Second and third use the function in Nv{Pci,Platform}Probe > And last one ensures we can still use ZaphodHead and relative > head positioning via xorg.conf > > The coding style may be a bit off, despite my best attempts > > Please review and commentA few notes * patch1 - it may be better to split the function to has_kms and is_gpu_supported * patch2 - introduced a minor memory leak, when has_kms fails * patch3 - is ok * patch4 - is incomplete, it turns out that we need to explicitly check if IsSharable and SetShared() it. Note radeon and others would need a similar fix. Intel is OK I'm planning to consolidate the common parts of Nv{Pci,Platform}Probe() into a common function, and send another series ~Emil> > [PATCH 1/4] nouveau: add nouveau_kernel_mode_enabled() > [PATCH 2/4] nouveau: Use helper function > [PATCH 3/4] nouveau: Check for kms in NvPlatformProbe > [PATCH 4/4] nouveau: fix entity handling in NvPlatformProbe
Reasonably Related Threads
- [PATCH (nouveau)] Add xwayland support
- Bugfix + dri1 cleanup patches
- [PATCH 1/2] present: Fixup return type of nouveau_present_init()
- [Patches][nouveau/ddx]: Improvements to bufferswap implementation and timestamping
- Nouveau fails to initialize G94GL / Quadro-FX1800 on aarch64 board