• Hans de Goede's avatar
    drm/i915: Acquire PUNIT->PMIC bus for intel_uncore_forcewake_reset() · a5266db4
    Hans de Goede authored
    intel_uncore_forcewake_reset() does forcewake puts and gets as such
    we need to make sure that no-one tries to access the PUNIT->PMIC bus
    (on systems where this bus is shared) while it runs, otherwise bad
    things happen.
    
    Normally this is taken care of by the i915_pmic_bus_access_notifier()
    which does an intel_uncore_forcewake_get(FORCEWAKE_ALL) when some other
    driver tries to access the PMIC bus, so that later forcewake gets are
    no-ops (for the duration of the bus access).
    
    But intel_uncore_forcewake_reset gets called in 3 cases:
    1) Before registering the pmic_bus_access_notifier
    2) After unregistering the pmic_bus_access_notifier
    3) To reset forcewake state on a GPU reset
    
    In all 3 cases the i915_pmic_bus_access_notifier() protection is
    insufficient.
    
    This commit fixes this race by calling iosf_mbi_punit_acquire() before
    calling intel_uncore_forcewake_reset(). In the case where it is called
    directly after unregistering the pmic_bus_access_notifier, we need to
    hold the punit-lock over both calls to avoid a race where
    intel_uncore_fw_release_timer() may execute between the 2 calls.
    Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20171019111620.26761-3-hdegoede@redhat.com
    a5266db4
intel_uncore.c 57.4 KB