Reviewed by: Marty Conner <mdc@etherboot.org>, \
authorglenn_brown <glenn_brown>
Tue, 14 Mar 2006 23:31:59 +0000 (23:31 +0000)
committerglenn_brown <glenn_brown>
Tue, 14 Mar 2006 23:31:59 +0000 (23:31 +0000)
commit92ec79e885aa1b20a88730eb445d821786c3a28d
tree0f62cc15262342839561b25b3e8151e574bc285a
parentb0c143ed4c9b34fb8a385d7852a3cbdc484e055d
Reviewed by: Marty Conner <mdc@etherboot.org>, \
Michael Brown <mbrown@fensystems.co.uk>

[For the record: Michael Brown warns that any driver relying on the
 feature added here will not be compatible with gpxe's KEEP_IT_REAL
 options, and not be strictly PXE compliant.]

Increase i386 virt_offset alignment to 4kB, so the bottom 12 bits of
corresponding virt and bus addrs will be identical.

This change facilitates porting drivers to Etherboot, as the vast
majority of driver execution environments have this virt/bus alignment
relationship, and non-Etherboot drivers often assume bus addresses are
aligned if the corresponding virtual addrs are aligned.

PCI Express requires DMAs not cross 4kB boundaries, and this large
alignment is required by my forthcoming myri10ge.c 10Gb PCI Express
driver, which is a minimal port of Myricom's Linux driver.  Other Linux
driver ports in the future would also surely benefit from this patch.

I have successfully tested this approach with our myri10ge.c driver with
this pathis patch on all 8 PCI express motherboards I have available to
me, representing the following hardware:
    CPUs: AMD Opteron and Intel EM64T
    Chipsets: Serverworks, Invidia, VIA, Intel, SiS
    BIOSes: AMI, Award, IBM, Phoenix AwardBIOS, and Phoenix TrustedCore.

The "HAVE_VIRT_OFFSET" lines of the patch are not strictly necessary,
but are there for clarity and to avoid changing non-i386 behaviour,
since I have no way to test non-i386.

src/arch/i386/include/io.h
==========================

Define HAVE_VIRT_OFFSET.

src/core/relocate.c
===================

On architectures that HAVE_VIRT_OFFSET, align virt_offset on a
4KB boundary.
src/arch/i386/include/io.h
src/core/relocate.c