• F
    x86: Handle HW IOMMU initialization failure gracefully · 75f1cdf1
    FUJITA Tomonori 提交于
    If HW IOMMU initialization fails (Intel VT-d often does this,
    typically due to BIOS bugs), we fall back to nommu. It doesn't
    work for the majority since nowadays we have more than 4GB
    memory so we must use swiotlb instead of nommu.
    
    The problem is that it's too late to initialize swiotlb when HW
    IOMMU initialization fails. We need to allocate swiotlb memory
    earlier from bootmem allocator. Chris explained the issue in
    detail:
    
      http://marc.info/?l=linux-kernel&m=125657444317079&w=2
    
    The current x86 IOMMU initialization sequence is too complicated
    and handling the above issue makes it more hacky.
    
    This patch changes x86 IOMMU initialization sequence to handle
    the above issue cleanly.
    
    The new x86 IOMMU initialization sequence are:
    
    1. we initialize the swiotlb (and setting swiotlb to 1) in the case
       of (max_pfn > MAX_DMA32_PFN && !no_iommu). dma_ops is set to
       swiotlb_dma_ops or nommu_dma_ops. if swiotlb usage is forced by
       the boot option, we finish here.
    
    2. we call the detection functions of all the IOMMUs
    
    3. the detection function sets x86_init.iommu.iommu_init to the
       IOMMU initialization function (so we can avoid calling the
       initialization functions of all the IOMMUs needlessly).
    
    4. if the IOMMU initialization function doesn't need to swiotlb
       then sets swiotlb to zero (e.g. the initialization is
       sucessful).
    
    5. if we find that swiotlb is set to zero, we free swiotlb
       resource.
    Signed-off-by: NFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
    Cc: chrisw@sous-sol.org
    Cc: dwmw2@infradead.org
    Cc: joerg.roedel@amd.com
    Cc: muli@il.ibm.com
    LKML-Reference: <1257849980-22640-10-git-send-email-fujita.tomonori@lab.ntt.co.jp>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    75f1cdf1
intel-iommu.c 91.2 KB