]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commit
drm/i915: Acquire PUNIT->PMIC bus for intel_uncore_forcewake_reset()
authorHans de Goede <j.w.r.degoede@gmail.com>
Thu, 19 Oct 2017 11:16:20 +0000 (13:16 +0200)
committerHans de Goede <hdegoede@redhat.com>
Fri, 10 Nov 2017 12:14:03 +0000 (13:14 +0100)
commita5266db4d31410fbfb4f40118e58085994e83dbc
treeb099422f48b315d1e9f83da9b80a722dd7fd36ec
parentaf0ab55ffe2467fab82bc0909e469cba7701fac7
drm/i915: Acquire PUNIT->PMIC bus for intel_uncore_forcewake_reset()

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: Imre Deak <imre.deak@intel.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171019111620.26761-3-hdegoede@redhat.com
drivers/gpu/drm/i915/intel_uncore.c
drivers/gpu/drm/i915/selftests/intel_uncore.c