--- a/config/hal.c Fri Feb 20 12:38:27 2015
+++ b/config/hal.c Fri Feb 20 12:39:43 2015
@@ -1,7 +1,7 @@
/*
* Copyright © 2007 Daniel Stone
* Copyright © 2007 Red Hat, Inc.
- * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
+ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -152,7 +152,7 @@
char *ptr;
char disppath[PATH_MAX];
- if ((num_session_disp_dev == num_total_disp_dev) || !disp_dev_path[0])
+ if (((num_session_disp_dev & 0xFF) == num_total_disp_dev) || !disp_dev_path[0])
return FALSE;
if (lstat(path, &statbuf) == 0 &&
@@ -544,7 +544,7 @@
}
#if ((defined(__sparc__) || defined(__sparc)) && defined(SUNSOFT))
- if ((num_session_disp_dev < num_total_disp_dev) &&
+ if ((num_session_disp_dev < (num_total_disp_dev & 0x0FF)) &&
(!strcmp(name, "keyboard") || !strcmp(name, "mouse"))) {
int i;
--- a/hw/xfree86/common/xf86AutoConfig.c Fri Feb 20 12:24:38 2015
+++ b/hw/xfree86/common/xf86AutoConfig.c Fri Feb 20 12:36:48 2015
@@ -1,6 +1,7 @@
/*
* Copyright 2003 by David H. Dawes.
* Copyright 2003 by X-Oz Technologies.
+ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All Rights Reserved.
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -50,6 +51,11 @@
#include <ctype.h>
#endif
+#if (defined(__sparc__) || defined(__sparc))
+static Bool MultiSessionConfig (void);
+extern int num_total_disp_dev;
+#endif
+
/* Sections for the default built-in configuration. */
#define BUILTIN_DEVICE_NAME \
@@ -168,6 +174,11 @@
char buf[1024];
ConfigStatus ret;
+#if ((defined(__sparc__) || defined(__sparc)) && defined (sun))
+ /* Do not do MultiSessionConfig() when invoked with -isolateDevice option */
+ if ((num_total_disp_dev & 0x1000)|| !MultiSessionConfig()) {
+#endif
+
listPossibleVideoDrivers(deviceList, 20);
for (p = deviceList; *p; p++) {
@@ -196,6 +207,10 @@
free(*p);
}
+#if ((defined(__sparc__) || defined(__sparc)) && defined (sun))
+ }
+#endif
+
xf86MsgVerb(X_DEFAULT, 0,
"Using default built-in configuration (%d lines)\n",
builtinLines);
@@ -229,66 +244,6 @@
#ifdef XSERVER_PLATFORM_BUS
i = xf86PlatformMatchDriver(matches, nmatches);
#endif
-#ifdef sun
- /* Check for driver type based on /dev/fb type and if valid, use
- it instead of PCI bus probe results */
- if (xf86Info.consoleFd >= 0 && (i < (nmatches - 1))) {
- struct vis_identifier visid;
- const char *cp;
- int iret;
-
- SYSCALL(iret = ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid));
- if (iret < 0) {
- int fbfd;
-
- fbfd = open(xf86SolarisFbDev, O_RDONLY);
- if (fbfd >= 0) {
- SYSCALL(iret = ioctl(fbfd, VIS_GETIDENTIFIER, &visid));
- close(fbfd);
- }
- }
-
- if (iret < 0) {
- xf86Msg(X_WARNING,
- "could not get frame buffer identifier from %s\n",
- xf86SolarisFbDev);
- }
- else {
- xf86Msg(X_PROBED, "console driver: %s\n", visid.name);
-
- /* Special case from before the general case was set */
- if (strcmp(visid.name, "NVDAnvda") == 0) {
- matches[i++] = xnfstrdup("nvidia");
- }
-
- /* General case - split into vendor name (initial all-caps
- prefix) & driver name (rest of the string). */
- if (strcmp(visid.name, "SUNWtext") != 0) {
- for (cp = visid.name; (*cp != '\0') && isupper(*cp); cp++) {
- /* find end of all uppercase vendor section */
- }
- if ((cp != visid.name) && (*cp != '\0')) {
- char *driverName = xnfstrdup(cp);
- char *vendorName = xnfstrdup(visid.name);
-
- vendorName[cp - visid.name] = '\0';
-
- matches[i++] = vendorName;
- matches[i++] = driverName;
- }
- }
- }
- }
-#endif
-#ifdef __sparc__
- if (i < (nmatches - 1))
- {
- char *sbusDriver = sparcDriverName();
-
- if (sbusDriver)
- matches[i++] = xnfstrdup(sbusDriver);
- }
-#endif
#ifdef XSERVER_LIBPCIACCESS
if (i < (nmatches - 1))
i += xf86PciMatchDriver(&matches[i], nmatches - i);
@@ -448,3 +403,176 @@
return ptr;
}
+
+#if ((defined(__sparc__) || defined(__sparc)) && defined (sun))
+#include <libdevinfo.h>
+#include <xorg/xf86Pci.h>
+#include "pciaccess.h"
+#include <sys/utsname.h>
+
+#define MAX_DEV 16
+
+#define IS_VGA(c) \
+ (((c) & 0x00ffff00) \
+ == ((PCI_CLASS_DISPLAY << 16) | (PCI_SUBCLASS_DISPLAY_VGA << 8)))
+
+
+#define BUILTIN_MULTI_SERVERFLAGS_OPT1 \
+ "\tOption\t\"DefaultServerLayout\"\t\"Xsession0\"\n"
+
+#define BUILTIN_MULTI_SECTION_POST \
+ "EndSection\n\n"
+
+#define BUILTIN_MULTI_SERVERFLAGS_OPT2 \
+ "\tOption\t\"AutoAddDevices\"\t\"true\"\n"
+
+#define BUILTIN_MULTI_SERVERFLAGS_SECTION \
+ "Section \"ServerFlags\"\n" \
+ BUILTIN_MULTI_SERVERFLAGS_OPT1 \
+ BUILTIN_MULTI_SERVERFLAGS_OPT2 \
+ BUILTIN_MULTI_SECTION_POST
+
+#define BUILTIN_MULTI_LAYOUT_SECTION_PRE \
+ "Section \"ServerLayout\"\n" \
+ "\tIdentifier\t\"Xsession%d\"\n"
+
+#define BUILTIN_MULTI_LAYOUT_SECTION_LINE \
+ "\tScreen\t\t\"Screen%d\"\n"
+
+#define BUILTIN_MULTI_SCREEN_SECTION_PRE \
+ "Section \"Screen\"\n" \
+ "\tIdentifier\t\"Screen%d\"\n"
+
+#define BUILTIN_MULTI_SCREEN_SECTION_LINE \
+ "\tDevice\t\t\"Card%d\"\n"
+
+#define BUILTIN_MULTI_DEVICE_SECTION_PRE \
+ "Section \"Device\"\n" \
+ "\tIdentifier\t\"Card%d\"\n"
+
+#define BUILTIN_MULTI_DEVICE_SECTION_LINE \
+ "\tBusID\t\t\"%s\"\n\tDriver\t\t\"%s\"\n"
+
+static Bool
+MultiSessionConfig (void)
+{
+ di_node_t node;
+ struct pci_device_iterator * iter;
+ struct pci_device * dev;
+ typedef struct {
+ char busid[64];
+ char dev_path[PATH_MAX];
+ } disp_dev_type;
+ disp_dev_type disp_dev[MAX_DEV];
+ int num = 0;
+ char buf[1024];
+ int i;
+ struct utsname sys;
+ struct sol_device_private {
+ struct pci_device base;
+ const char * device_string;
+ };
+#define DEV_PATH(dev) (((struct sol_device_private *) dev)->device_string)
+
+ if (uname(&sys) < 0) {
+ xf86Msg(X_ERROR, "Error in uname call\n");
+ return FALSE;
+ }
+
+ if (strcmp(sys.machine, "sun4v"))
+ return FALSE;
+
+ iter = pci_slot_match_iterator_create( NULL );
+
+ while ( (dev = pci_device_next( iter )) != NULL ) {
+ if (IS_VGA(dev->device_class)) {
+ if (num > MAX_DEV) {
+ xf86Msg(X_ERROR, "Too many display devices: %d\n", num);
+ return FALSE;
+ }
+
+ memset(&disp_dev[num], 0, sizeof (disp_dev_type));
+
+ snprintf(disp_dev[num].busid, sizeof(disp_dev[num].busid),
+ "PCI:%d@%d:%d:%d", dev->bus, dev->domain,
+ dev->dev, dev->func);
+
+ strcpy(disp_dev[num].dev_path, "/devices");
+ strncat(disp_dev[num].dev_path, DEV_PATH(dev),
+ sizeof(disp_dev_type) - strlen("/devices"));
+
+ num++;
+ }
+ }
+
+ pci_iterator_destroy(iter);
+
+ /* Do not do multi-session configuration if dev number is 0 or 1 */
+ if (num <= 1)
+ return FALSE;
+
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SERVERFLAGS_SECTION);
+ AppendToConfig(buf);
+
+ for (i = 0; i < num; i++) {
+ char drv[32];
+
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_LAYOUT_SECTION_PRE, i);
+ AppendToConfig(buf);
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_LAYOUT_SECTION_LINE, i);
+ AppendToConfig(buf);
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SECTION_POST);
+ AppendToConfig(buf);
+
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SCREEN_SECTION_PRE, i);
+ AppendToConfig(buf);
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SCREEN_SECTION_LINE, i);
+ AppendToConfig(buf);
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SECTION_POST);
+ AppendToConfig(buf);
+
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_DEVICE_SECTION_PRE, i);
+ AppendToConfig(buf);
+
+ drv[0] = 0;
+ if (disp_dev[i].dev_path) {
+ int iret;
+ int fd;
+
+
+ fd = open(disp_dev[i].dev_path, O_RDONLY);
+ if (fd >= 0) {
+ struct vis_identifier visid;
+ const char *cp;
+
+ SYSCALL(iret = ioctl(fd, VIS_GETIDENTIFIER, &visid));
+ close (fd);
+
+ if (iret >= 0) {
+ if (strcmp(visid.name, "SUNWtext") != 0) {
+ for (cp = visid.name; (*cp != '\0') && isupper((uchar_t)*cp); cp++);
+ /* find end of all uppercase vendor section */
+ if ((cp != visid.name) && (*cp != '\0'))
+ strncpy (drv, cp, sizeof(drv));
+ }
+ }
+ }
+ }
+
+ if (drv[0] == 0) {
+ xf86Msg(X_ERROR, "Can't find driver for session %d\n", i);
+ FreeConfig();
+ return FALSE;
+ }
+
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_DEVICE_SECTION_LINE,
+ disp_dev[i].busid, drv);
+ AppendToConfig(buf);
+ snprintf(buf, sizeof(buf), BUILTIN_MULTI_SECTION_POST);
+ AppendToConfig(buf);
+ }
+
+ return TRUE;
+}
+#endif
+
--- a/hw/xfree86/common/xf86pciBus.c Wed May 20 08:27:14 2015
+++ b/hw/xfree86/common/xf86pciBus.c Wed May 20 08:28:57 2015
@@ -1,6 +1,6 @@
/*
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
+ * Copyright (c) 2013, 2015 Oracle and/or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -131,6 +131,27 @@
}
free(iter);
+#if ((defined(__sparc__) || defined(__sparc)) && defined (sun))
+ /*
+ * num_total_disp_dev does not reflect accurate number of display
+ * device when xf86IsolateDevice is set, redo it.
+ */
+ if (xf86IsolateDevice.domain != PCI_MATCH_ANY) {
+ num_total_disp_dev = 0x1000;
+
+ iter = pci_slot_match_iterator_create (NULL);
+ while ((info = pci_device_next(iter)) != NULL) {
+ if (PCIINFOCLASSES(info->device_class)) {
+ pci_device_probe(info);
+
+ if (IS_VGA(info->device_class))
+ num_total_disp_dev++;
+ }
+ }
+ }
+ free(iter);
+#endif
+
/* If we haven't found a primary device try a different heuristic */
if (primaryBus.type == BUS_NONE && num) {
for (i = 0; i < num; i++) {
@@ -1219,7 +1240,11 @@
#ifdef __linux__
driverList[idx++] = "nouveau";
#endif
+#ifdef sun
+ driverList[idx++] = "nvidia";
+#else
driverList[idx++] = "nv";
+#endif
break;
}
case 0x1106:
--- a/hw/xfree86/common/xf86Xinput.c Fri Feb 20 12:34:32 2015
+++ b/hw/xfree86/common/xf86Xinput.c Fri Feb 20 12:37:40 2015
@@ -46,7 +46,7 @@
* authorization from the copyright holder(s) and author(s).
*/
/*
- * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
+ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All Rights Reserved.
*/
#ifdef HAVE_XORG_CONFIG_H
@@ -1502,7 +1502,7 @@
}
#if ((defined(__sparc__) || defined(__sparc)) && defined(sun))
- if (num_session_disp_dev < num_total_disp_dev) {
+ if (num_session_disp_dev < (num_total_disp_dev & 0x0FFF)) {
int i;
for (i = 0; i < MAX_DEVICES; i++) {
--- a/hw/xfree86/common/xf86Bus.c Fri Feb 20 12:25:35 2015
+++ b/hw/xfree86/common/xf86Bus.c Fri Feb 20 12:26:02 2015
@@ -1,5 +1,6 @@
/*
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
+ * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -207,9 +208,6 @@
#ifdef XSERVER_LIBPCIACCESS
xf86PciProbe();
#endif
-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
- xf86SbusProbe();
-#endif
#ifdef XSERVER_PLATFORM_BUS
xf86platformPrimary();
#endif