--- a/hw/xfree86/os-support/solaris/sun_init.c Fri Jun 5 12:41:14 2015 +++ b/hw/xfree86/os-support/solaris/sun_init.c Fri Jun 5 12:48:06 2015 @@ -2,6 +2,7 @@ * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany * Copyright 1993 by David Wexelblat * Copyright 1999 by David Holland + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -64,6 +65,11 @@ Used by hw/xfree86/common/xf86AutoConfig.c for VIS_GETIDENTIFIER */ _X_HIDDEN char xf86SolarisFbDev[PATH_MAX] = "/dev/fb"; +#if (defined(__sparc__) || defined(__sparc)) +static void GetFbDevFromProbe(void); +static Bool xf86SolarisFbDevIsSet = FALSE; +#endif + static void switch_to(int vt, const char *from) { @@ -97,6 +103,16 @@ if (geteuid() != 0) FatalError("xf86OpenConsole: Server must be suid root\n"); +#if (defined(__sparc__) || defined(__sparc)) + { + struct stat buf; + + if (!xf86SolarisFbDevIsSet && (stat("/dev/fb", &buf) != 0) && + (xf86NumDrivers == 1)) + GetFbDevFromProbe(); + } +#endif + #ifdef HAS_USL_VTS /* @@ -376,6 +392,9 @@ if ((i + 1) < argc) { if (!strcmp(argv[i], "-dev")) { strlcpy(xf86SolarisFbDev, argv[i + 1], sizeof(xf86SolarisFbDev)); +#if (defined(__sparc__) || defined(__sparc)) + xf86SolarisFbDevIsSet = TRUE; +#endif return 2; } } @@ -383,6 +402,87 @@ return 0; } +#if (defined(__sparc__) || defined(__sparc)) +static void +GetFbDevFromProbe(void) { + unsigned numDevs; + GDevPtr *devList; + + numDevs = xf86MatchDevice(xf86DriverList[0]->driverName, &devList); + + if (numDevs != 1) + return; + else { + struct pci_device_iterator *iter; + unsigned device_id; + const struct pci_id_match *const devices = + xf86DriverList[0]->supported_devices; + int i; + Bool found = FALSE; + struct pci_device *pPci; + struct sol_device_private { + struct pci_device base; + const char * device_string; + }; +#define DEV_PATH(dev) (((struct sol_device_private *) dev)->device_string) +#define END_OF_MATCHES(m) \ + (((m).vendor_id == 0) && ((m).device_id == 0) && ((m).subvendor_id == 0)) + + /* Find the pciVideoRec associated with this device section. + */ + iter = pci_id_match_iterator_create(NULL); + while ((pPci = pci_device_next(iter)) != NULL) { + if (devList[0]->busID && *devList[0]->busID) { + if (xf86ComparePciBusString(devList[0]->busID, + ((pPci->domain << 8) + | pPci->bus), + pPci->dev, pPci->func)) { + break; + } + } + else if (xf86IsPrimaryPci(pPci)) { + break; + } + } + + pci_iterator_destroy(iter); + + if (pPci == NULL) + return; + + /* If driver provides supported_devices, then check if this + device is on the list. Otherwise skip check. + */ + if (!devices) + found = TRUE; + else { + device_id = (devList[0]->chipID > 0) + ? devList[0]->chipID : pPci->device_id; + + /* Once the pciVideoRec is found, determine if the device is supported + * by the driver. + */ + for (i = 0; !END_OF_MATCHES(devices[i]); i++) { + if (PCI_ID_COMPARE(devices[i].vendor_id, pPci->vendor_id) + && PCI_ID_COMPARE(devices[i].device_id, device_id) + && ((devices[i].device_class_mask & pPci->device_class) + == devices[i].device_class)) { + + found = TRUE; + break; + } + } + } + if (found) { + strcpy(xf86SolarisFbDev, "/devices"); + strcat(xf86SolarisFbDev, DEV_PATH(pPci)); + xf86Msg(X_INFO, "Got xf86SolarisFbDev From Probe: %s\n", xf86SolarisFbDev); + } + + } +} +#endif + void xf86UseMsg(void) {