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$
|