Signed-off-by: Qiang Yu <qiang...@amd.com> --- hw/xfree86/drivers/modesetting/driver.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index bce6346..a7b89cc 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -154,6 +154,8 @@ static XF86ModuleVersionInfo VersRec = { _X_EXPORT XF86ModuleData modesettingModuleData = { &VersRec, Setup, NULL }; +static Bool ms_all_in_one = FALSE; + static void * Setup(void *module, void *opts, int *errmaj, int *errmin) { @@ -240,7 +242,7 @@ check_outputs(int fd, int *count) } static Bool -probe_hw(const char *dev, struct xf86_platform_device *platform_dev) +probe_hw(const char *dev, struct xf86_platform_device *platform_dev, int *count) { int fd; @@ -249,13 +251,13 @@ probe_hw(const char *dev, struct xf86_platform_device *platform_dev) fd = xf86_platform_device_odev_attributes(platform_dev)->fd; if (fd == -1) return FALSE; - return check_outputs(fd, NULL); + return check_outputs(fd, count); } #endif fd = open_hw(dev); if (fd != -1) { - int ret = check_outputs(fd, NULL); + int ret = check_outputs(fd, count); close(fd); return ret; @@ -407,20 +409,31 @@ ms_platform_probe(DriverPtr driver, { ScrnInfoPtr scrn = NULL; const char *path = xf86_platform_device_odev_attributes(dev)->path; - int scr_flags = 0; + int scr_flags = 0, count = 0; if (flags & PLATFORM_PROBE_GPU_SCREEN) scr_flags = XF86_ALLOCATE_GPU_SCREEN; - if (probe_hw(path, dev)) { + if (probe_hw(path, dev, &count)) { static ScrnInfoPtr scrn_all = NULL; modesettingEntPtr ms_ent; + if (xf86IsEntitySharable(entity_num)) + xf86SetEntityShared(entity_num); + if (getenv("MS_ALL_IN_ONE")) { + ms_all_in_one = TRUE; if (!scrn_all) { scrn_all = xf86AllocateScreen(driver, 0); ms_setup_scrn_hooks(scrn_all); } + /* a display capable GPUScreen should be created */ + if (flags & PLATFORM_PROBE_GPU_SCREEN && count) { + scrn = xf86AllocateScreen(driver, scr_flags); + ms_setup_scrn_hooks(scrn); + xf86AddEntityToScreen(scrn, entity_num); + ms_setup_entity(scrn, entity_num); + } scrn = scrn_all; } else { @@ -428,8 +441,6 @@ ms_platform_probe(DriverPtr driver, ms_setup_scrn_hooks(scrn); } - if (xf86IsEntitySharable(entity_num)) - xf86SetEntityShared(entity_num); xf86AddEntityToScreen(scrn, entity_num); xf86DrvMsg(scrn->scrnIndex, X_INFO, @@ -471,7 +482,7 @@ Probe(DriverPtr drv, int flags) for (i = 0; i < numDevSections; i++) { int entity_num; dev = xf86FindOptionValue(devSections[i]->options, "kmsdev"); - if (probe_hw(dev, NULL)) { + if (probe_hw(dev, NULL, NULL)) { entity_num = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); scrn = xf86ConfigFbEntity(scrn, 0, entity_num, NULL, NULL, NULL, NULL); @@ -980,7 +991,7 @@ PreInit(ScrnInfoPtr pScrn, int flags) if (xf86IsEntityShared(primary_entity)) { if (xf86IsPrimInitDone(primary_entity)) - ms->drmmode.is_secondary = TRUE; + ms->drmmode.is_secondary = !ms_all_in_one; else xf86SetPrimInitDone(primary_entity); } -- 2.7.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel