160 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| The purpose of the changes described here is to implement a more general
 | |
| framework for multi-head on systems with more than one host-to-PCI bridge.
 | |
| The changes also implement a basic port of XFree86 to SPARC Solaris.
 | |
| 
 | |
| These changes are derived from David S. Miller's submission #4653 to the
 | |
| patch list.  David Andrew of Sun Microsystems was also kind enough to
 | |
| arrange for a hardware loan for development of these changes.
 | |
| 
 | |
| These changes are known to work on several SPARC SunOS and UltraSPARC
 | |
| Linux configurations.  Linux kernel work is in progress to port these
 | |
| changes to Linux/PowerPC.
 | |
| 
 | |
| Several loose ends still need to be addressed before these changes can be
 | |
| considered stable.  The bulk of this note is devoted to enumerating what
 | |
| remains to be done, along with other notes, broken down into various broad
 | |
| categories.
 | |
| 
 | |
| SPARC SunOS (aka Solaris)
 | |
| -------------------------
 | |
| - An overview of this XFree86 port is available in README.Solaris.
 | |
| - The keyboard map code in hw/xfree86/os-support/sunos/sun_kbdEv.c needs
 | |
|   to be extended to handle more than only the sun5 keyboard I targeted it
 | |
|   for.  Even for the sun5, the map is incomplete as several keys are not
 | |
|   mapped.  What is there is just barely usable.
 | |
| - On exit, the server will zero out /dev/fb, but that might not be the
 | |
|   right thing to do for all primary adapters.  This does however
 | |
|   appear to emulate the behaviour of Sun's commercial servers.  It also
 | |
|   eliminates the need for output drivers to save and restore video memory
 | |
|   contents.  (They still need to save/restore the mode timing however.)
 | |
|   This also chimes into a long-standing XFree86 policy to not save/restore
 | |
|   video memory contents if the mode on entry is found to be non-VGA, a
 | |
|   policy several existing drivers comply with.
 | |
| - The SBUS drivers (sunbw2, suncg14, suncg3, suncg6, sunffb, sunleo and
 | |
|   suntcx), the common layer's SBUS code and the fbdev driver have all
 | |
|   only been compile tested.  There are likely to be Linux'isms within
 | |
|   them that remain to be dealt with.
 | |
| - It still needs to be verified whether or not this work adversely
 | |
|   affected support for ix86 Solaris.
 | |
| 
 | |
| UltraSPARC Linux
 | |
| ----------------
 | |
| - Although this code can be compiled using any Linux/SPARC64 kernel, it
 | |
|   can only run successfully using 2.4.12 or later.
 | |
| - I haven't had time to sufficiently dig into XKB to properly configure it
 | |
|   for sun5 keyboards.  Given XFree86 on Linux/SPARC has been around for a
 | |
|   while, it's likely someone has already done this, and I'd appreciate
 | |
|   receiving a copy of a working XF86Config input section.
 | |
| 
 | |
| PowerPC Linux
 | |
| -------------
 | |
| - As mentioned above, kernel work is in progress to port this PCI scheme
 | |
|   to Linux/PowerPC.
 | |
| - Aside from kernel work, the inX() and outX() definitions in compiler.h
 | |
|   will need to be changed to do something akin to their SPARC definitions,
 | |
|   i.e. consider their port argument to be a virtual address.
 | |
| 
 | |
| Other Linux ports to multi-domain architectures
 | |
| -----------------------------------------------
 | |
| - Comments in os-support/bus/linuxPci.c document the kernel interface
 | |
|   required to port these changes.  In short, Linux ports, such as Alpha
 | |
|   and mips, should follow SPARC and PowerPC's lead in providing support to
 | |
|   mmap() PCI devices through their /proc/bus/pci pseudo-files and to treat
 | |
|   such requests for host bridges as requests to mmap() space provided by
 | |
|   these bridges.
 | |
| 
 | |
| Other OS's
 | |
| ----------
 | |
| - In the right hands, either linuxPci.c or sparcPci.c can be used as a
 | |
|   guide for what would need to be done to port this scheme to other OS's.
 | |
|   Perhaps the largest difference between the two (in terms of interface to
 | |
|   the common layer) is that the SunOS port includes internally generated
 | |
|   domain numbers in PCITAG's, whereas the Linux port doesn't need to.  The
 | |
|   remainder of the PCI code (which is OS-independent) can handle either
 | |
|   scheme.
 | |
| - Required entry points are xf86GetPciDomain(), xf86MapDomainMemory(),
 | |
|   xf86MapDomainIO() and xf86ReadDomainMemory().  Replacements for
 | |
|   xf86BusAccWindowsFromOS(), xf86PciBusAccWindowsFromOS() and
 | |
|   xf86AccResFromOS() might also be required.
 | |
| - Development of these changes has detected the fact that the XFree86 port
 | |
|   to the PowerMax OS is broken, and has been for some time, i.e. since
 | |
|   shortly after its introduction, back in the 3.9* days.
 | |
| 
 | |
| SPARC PCI (OS-independent)
 | |
| --------------------------
 | |
| - The "Simba" PCI-to-PCI bridge used in SPARC's does not implement VGA
 | |
|   routing, as defined in the PCI specs.  Fortunately, OpenPROM seems to
 | |
|   always route VGA resources to the bus with PCI connectors, but this also
 | |
|   causes the common layer to not mark any PCI adapter as primary.
 | |
| 
 | |
| Multiple PCI domains (architecture- and OS-independent)
 | |
| -------------------------------------------------------
 | |
| - This implementation assumes every host-to-PCI bridge provides access to
 | |
|   a separate PCI domain.  Each such domain provides three different
 | |
|   "address" spaces:  PCI configuration, I/O and memory.  The
 | |
|   implementation can also deal with situations where more than one PCI
 | |
|   domain share (different subsets of) the same PCI configuration space.  I
 | |
|   have unconfirmed information that suggests it might be necessary to also
 | |
|   allow the sharing of PCI memory spaces.
 | |
| - This implementation also assumes the CPU's physical address space
 | |
|   includes the entirety of each domain's I/O and memory spaces.  I know
 | |
|   this'll need to be changed to deal with the so-called UniNorth bridge,
 | |
|   found on PowerPC's, which allows access to only a subset of the memory
 | |
|   space behind it.
 | |
| - Ideally, the common layer should mark as primary up to one PCI adapter
 | |
|   per domain.  This has yet to be done.
 | |
| - Something needs to be done about PCI master aborts on primary buses.
 | |
|   For details on this, see my long-winded diatribe in sparcPci.c, and
 | |
|   related comments in linuxPci.c.  Suffice it to say here that I see the
 | |
|   eventual implementation of host bridge drivers within XFree86 as
 | |
|   unavoidable at this point.
 | |
| - DGA is broken on multi-domain platforms.  The information passed to the
 | |
|   client to locate the framebuffer still needs to be revised.  The best way
 | |
|   to deal with this is to change all drivers' OpenFramebuffer() function to
 | |
|   call a common layer routine to set the device name and displacements to be
 | |
|   returned to the DGA client.
 | |
| 
 | |
| Output drivers
 | |
| --------------
 | |
| Most drivers currently used on ix86 need(ed) source code changes.
 | |
| - Calls to xf86ReadBIOS() and xf86MapVidMem() were replaced with calls to
 | |
|   xf86ReadDomainMemory() and xf86MapDomainMemory() respectively.  Except
 | |
|   for the "ati" and "atimisc" modules, this has already been done.
 | |
| - All ix86-style I/O port numbers need to be declared as an IOADDRESS, a
 | |
|   type defined in xf86Pci.h as "unsigned long".  Such port numbers also
 | |
|   need to be offset by a displacement which is also defined as an
 | |
|   IOADDRESS.  Before a driver's PreInit() is called, the common layer
 | |
|   makes this displacement available in ScrnInfoRec.domainIOBase.  For
 | |
|   single-domain architectures, such as ix86, domainIOBase will always be
 | |
|   zero.  Current use of vgaHWRec.PIOOffset has also been adjusted
 | |
|   accordingly.  Some drivers have been changed to keep a copy of this
 | |
|   displacement in their private structure.  Internally, an IOADDRESS is
 | |
|   actually a pointer that has been recasted to an unsigned long, but the
 | |
|   common layer "hides" this fact from the driver ABI, which means that I/O
 | |
|   port numbers, as seen by drivers, remain as integers rather than
 | |
|   addresses.  Aside from the ati and atimisc modules, s3, sis and tseng
 | |
|   are the only modules left whose I/O still needs to be converted (I've
 | |
|   temporarily run out of steam).
 | |
| - Note that these conversions are not necessarily sufficient to produce
 | |
|   drivers that will work on any given multi-domain architecture.  A driver
 | |
|   that, for example, had endianness problems, still does.  But, at least,
 | |
|   these conversions, along with the supporting common layer changes, make
 | |
|   PCI drivers more widely amenable to porting.
 | |
| - rdinx(), wrinx(), modinx(), testrg(), testinx() and testinx2() are not
 | |
|   given enough information to allow for the relocation of their I/O.  They
 | |
|   are consequently being deleted.  The apm and ark drivers, the only
 | |
|   remaining callers of the first three, have been changed to use local
 | |
|   definitions instead.  The last three (test*()) were already unused.
 | |
| - As a temporary measure, these changes completely disable ISA-style
 | |
|   probing on SPARC's and PowerPC's.  This means that driver calls to
 | |
|   xf86MatchIsaInstances(), while still valid, will always return detection
 | |
|   failure on SPARC's and PowerPC's.  This will be dealt with when a more
 | |
|   general master abort handling scheme is implemented.
 | |
| - I need to make a decision about the master abort issues mentionned above
 | |
|   before I can convert the "ati" and "atimisc" modules.  Consequently,
 | |
|   these modules still need to be compiled with -DAVOID_CPIO on
 | |
|   multi-domain architectures, and support for Mach64 variants as
 | |
|   non-primary heads is not yet available.
 | |
| 
 | |
| $XFree86$
 |