Commit:     51b58e3e26ebfb8cd56825c4b396ed251f51dec9
Parent:     773208946a132fb733ba273ee8562814f828cc28
Author:     Terry Loftin <[EMAIL PROTECTED]>
AuthorDate: Thu Jul 12 17:23:22 2007 -0600
Committer:  Tony Luck <[EMAIL PROTECTED]>
CommitDate: Fri Jul 13 09:16:50 2007 -0700

    [IA64] use machvec=dig on hpzx1 platforms
    On HP zx1 machines, the 'machvec=dig' parameter is needed for the
    kdump kernel to avoid problems with the HP sba iommu.  The problem
    is that during the boot of the kdump kernel, the iommu is re-initialized,
    so in-flight DMA from improperly shutdown drivers causes an IOTLB
    miss which leads to an MCA.  With kdump, the idea is to get into the
    kdump kernel with as little code as we can, so shutting down drivers
    properly is not an option.
    The workaround is to add 'machvec=dig' to the kdump kernel boot
    parameters.  This makes the kdump kernel avoid using the sba iommu
    altogether, leaving the IOTLB intact.  Any ongoing DMA falls
    harmlessly outside the kdump kernel.  After the kdump kernel reboots,
    all devices will have been shutdown properly and DMA stopped.
    This patch pushes that functionality into the sba iommu
    initialization code, so that users won't have to find the obscure
    documentation telling them about 'machvec=dig'.
    This patch only affects HP platforms.  It still includes one
    extern declaration in the file, because no applicable header file
    Signed-off-by: Terry Loftin <[EMAIL PROTECTED]>
    Signed-off-by: Alex Williamson <[EMAIL PROTECTED]>
    Signed-off-by: Tony Luck <[EMAIL PROTECTED]>
 arch/ia64/hp/common/sba_iommu.c |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
index c1dca22..cd4adf5 100644
--- a/arch/ia64/hp/common/sba_iommu.c
+++ b/arch/ia64/hp/common/sba_iommu.c
@@ -34,6 +34,7 @@
 #include <linux/efi.h>
 #include <linux/nodemask.h>
 #include <linux/bitops.h>         /* hweight64() */
+#include <linux/crash_dump.h>
 #include <asm/delay.h>         /* ia64_get_itc() */
 #include <asm/io.h>
@@ -43,6 +44,8 @@
 #include <asm/acpi-ext.h>
+extern int swiotlb_late_init_with_default_size (size_t size);
 #define PFX "IOC: "
@@ -2026,11 +2029,24 @@ sba_init(void)
        if (!ia64_platform_is("hpzx1") && !ia64_platform_is("hpzx1_swiotlb"))
                return 0;
+#if defined(CONFIG_IA64_GENERIC) && defined(CONFIG_CRASH_DUMP)
+       /* If we are booting a kdump kernel, the sba_iommu will
+        * cause devices that were not shutdown properly to MCA
+        * as soon as they are turned back on.  Our only option for
+        * a successful kdump kernel boot is to use the swiotlb.
+        */
+       if (elfcorehdr_addr < ELFCORE_ADDR_MAX) {
+               if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0)
+                       panic("Unable to initialize software I/O TLB:"
+                                 " Try machvec=dig boot option");
+               machvec_init("dig");
+               return 0;
+       }
        if (!ioc_list) {
-               extern int swiotlb_late_init_with_default_size (size_t size);
                 * If we didn't find something sba_iommu can claim, we
                 * need to setup the swiotlb and switch to the dig machvec.
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to