Reviewed by: Marty Conner <mdc@etherboot.org>, \
authorglenn_brown <glenn_brown>
Thu, 23 Mar 2006 21:20:54 +0000 (21:20 +0000)
committerglenn_brown <glenn_brown>
Thu, 23 Mar 2006 21:20:54 +0000 (21:20 +0000)
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

index cea69d3..e351a0c 100644 (file)
@@ -4,7 +4,6 @@
 
 /* Amount of relocation etherboot is experiencing */
 extern unsigned long virt_offset;
-#define HAVE_VIRT_OFFSET 1
 
 /* Don't require identity mapped physical memory,
  * osloader.c is the only valid user at the moment.
index 565dae7..d20846a 100644 (file)
  * 
  */
 
-/* Align any virt_offset on this power-of-two boundary, so
- * virt_to_phys() et al. will not alter the less significant bits.
- * This should match the maximum DMA alignment that might be required
- * by on the system, so drivers can assume that aligned virtual
- * addresses will be similarly aligned in bus address space.
- */
-#define VIRT_ALIGN 4096 /* PCI Express forbids DMA's across 4KB boundaries */
-
 void relocate(void)
 {
        unsigned long addr, eaddr, size;
@@ -38,11 +30,7 @@ void relocate(void)
        addr = virt_to_phys(_text);
        eaddr = virt_to_phys(_end);
        size = (eaddr - addr + 0xf) & ~0xf;
-#ifdef HAVE_VIRT_OFFSET
-       /* Allocate an oversized block so we can realign within it. */
-       size += VIRT_ALIGN;
-#endif /* HAVE_VIRT_OFFSET */
+
        /* If the current etherboot is beyond MAX_ADDR pretend it is
         * at the lowest possible address.
         */
@@ -97,26 +85,9 @@ void relocate(void)
                }
                if (eaddr < r_end - size) {
                        addr = r_end - size;
-                       eaddr = addr + (_end - _text);
+                       eaddr = r_end;
                }
        }
-
-#ifdef HAVE_VIRT_OFFSET
-       /* Adjust the relocation to align virt_offset.
-        *
-        * relocate_to(addr) sets virt_offset=addr-_text, so without
-        * any adjustment, the misalignment would be
-        * (addr-_text)&(VIRT_ALIGN-1).  We force this misalignment to
-        * be zero here.
-        */
-       {
-               unsigned long delta = (((unsigned long) _text - addr)
-                                      & (VIRT_ALIGN-1));
-               addr += delta;
-               eaddr += delta;
-       }
-#endif /* HAVE_VIRT_OFFSET */
-       
        if (addr != virt_to_phys(_text)) {
                unsigned long old_addr = virt_to_phys(_text);
                printf("Relocating _text from: [%lx,%lx) to [%lx,%lx)\n",