• K
    drm/i915: make compact dma scatter lists creation work with SWIOTLB backend. · 426729dc
    Konrad Rzeszutek Wilk 提交于
    Git commit 90797e6d
    ("drm/i915: create compact dma scatter lists for gem objects") makes
    certain assumptions about the under laying DMA API that are not always
    correct.
    
    On a ThinkPad X230 with an Intel HD 4000 with Xen during the bootup
    I see:
    
    [drm:intel_pipe_set_base] *ERROR* pin & fence failed
    [drm:intel_crtc_set_config] *ERROR* failed to set mode on [CRTC:3], err = -28
    
    Bit of debugging traced it down to dma_map_sg failing (in
    i915_gem_gtt_prepare_object) as some of the SG entries were huge (3MB).
    
    That unfortunately are sizes that the SWIOTLB is incapable of handling -
    the maximum it can handle is a an entry of 512KB of virtual contiguous
    memory for its bounce buffer. (See IO_TLB_SEGSIZE).
    
    Previous to the above mention git commit the SG entries were of 4KB, and
    the code introduced by above git commit squashed the CPU contiguous PFNs
    in one big virtual address provided to DMA API.
    
    This patch is a simple semi-revert - were we emulate the old behavior
    if we detect that SWIOTLB is online. If it is not online then we continue
    on with the new compact scatter gather mechanism.
    
    An alternative solution would be for the the '.get_pages' and the
    i915_gem_gtt_prepare_object to retry with smaller max gap of the
    amount of PFNs that can be combined together - but with this issue
    discovered during rc7 that might be too risky.
    Reported-and-Tested-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    CC: Chris Wilson <chris@chris-wilson.co.uk>
    CC: Imre Deak <imre.deak@intel.com>
    CC: Daniel Vetter <daniel.vetter@ffwll.ch>
    CC: David Airlie <airlied@linux.ie>
    CC: <dri-devel@lists.freedesktop.org>
    Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Signed-off-by: NDave Airlie <airlied@redhat.com>
    426729dc
i915_gem.c 111.5 KB