• Alex Williamson's avatar
    vgaarb: We can own non-decoded resources · 4e4e7dc5
    Alex Williamson authored
    The VGA arbiter does not allow devices to "own" resources that it
    doesn't "decode".  However, it does allow devices to "lock" resources
    that it doesn't decode.  This gets us into trouble because locking
    the resource goes through the same bridge routing updates regardless
    of whether we decode the resource.  This means that when a non-decoded
    resource is released, the bridge is left with VGA routing enabled and
    locking a different device won't clear it.
    
    This happens in the following scenario:
    
    VGA device 01:00.0 (VGA1) is owned by the radeon driver, which
    registers a set_vga_decode function which releases legacy VGA decodes.
    
    VGA device 02:00.0 (VGA2) is any VGA device.
    
    VGA1 user locks VGA resources triggering first_use callback of
    set_vga_decoded, clearing "decode" and "owns" of legacy resources
    on VGA1.
    
    VGA1 user unlocks VGA resources.
    
    VGA2 user locks VGA resources, which skips VGA1 as conflicting as it
    does not "own" legacy resources, although VGA routing is still enabled
    for the VGA1 bridge.  VGA routing is enabled on VGA2 bridge.
    
    VGA2 may or may not receive VGA transactions depending on the bus
    priority of VGA1 vs VGA2 bridge.
    
    To resolve this, we need to allow devices to "own" resources that they
    do not "decode".  This way we can track bus ownership of VGA.  When a
    device decodes VGA, it only means that we must update the command bits
    in cases where the conflicting device is on the same bus.
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Dave Airlie <airlied@redhat.com>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    4e4e7dc5
vgaarb.c 34.6 KB