Commit Graph

3884 Commits

Author SHA1 Message Date
Ben Skeggs
e50fcff15f drm/nouveau/disp/gp102: fix cursor/overlay immediate channel indices
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:38 +10:00
Ben Skeggs
2a32b9b186 drm/nouveau/disp/nv50-: specify ctrl/user separately when constructing classes
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:38 +10:00
Ben Skeggs
4391d7f5c7 drm/nouveau/disp/nv50-: split chid into chid.ctrl and chid.user
GP102/GP104 make life difficult by redefining the channel indices for
some registers, but not others.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:38 +10:00
Hans de Goede
3a6536c51d drm/nouveau: Intercept ACPI_VIDEO_NOTIFY_PROBE
Various notebooks with nvidia GPUs generate an ACPI_VIDEO_NOTIFY_PROBE
acpi-video event when an external device gets plugged in (and again on
modesets on that connector), the default behavior in the acpi-video
driver for this is to send a KEY_SWITCHVIDEOMODE evdev event, which
causes e.g. gnome-settings-daemon to ask us to rescan the connectors
(good), but also causes g-s-d to switch to mirror mode on a newly plugged
monitor rather then using the monitor to extend the desktop (bad)
as KEY_SWITCHVIDEOMODE is supposed to switch between extend the desktop
vs mirror mode.

More troublesome are the repeated ACPI_VIDEO_NOTIFY_PROBE events on
changing the mode on the connector, which cause g-s-d to switch
between mirror/extend mode, which causes a new ACPI_VIDEO_NOTIFY_PROBE
event and we end up with an endless loop.

This commit fixes this by adding an acpi notifier block handler to
nouveau_display.c to intercept ACPI_VIDEO_NOTIFY_PROBE and:

1) Wake-up runtime suspended GPUs and call drm_helper_hpd_irq_event()
   on them, this is necessary in some cases for the GPU to detect connector
   hotplug events while runtime suspended
2) Return NOTIFY_BAD to stop acpi-video from emitting a bogus
   KEY_SWITCHVIDEOMODE key-press event

There already is another acpi notifier block handler registered in
drivers/gpu/drm/nouveau/nvkm/engine/device/acpi.c, but that is not
suitable since that one gets unregistered on runtime suspend, and
we also want to intercept ACPI_VIDEO_NOTIFY_PROBE when runtime suspended.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2016-11-17 09:50:37 +10:00
Ben Skeggs
dc2b655928 drm/nouveau/devinit/gm200: drop pmu reset sequence
This sequence is incorrect for GP102/GP104 boards.  This is now being
handled correctly by the PMU subdev during preinit();

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:37 +10:00
Ben Skeggs
920c58a711 drm/nouveau/devinit/gm200: replace while loops with PTIMER-based timeout loops
It appears to be safe to access PTIMER on an unposted board with newer
chipsets.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:37 +10:00
Ben Skeggs
d91ccec631 drm/nouveau/pmu/gp102: initial implementation
GP102/GP104 require a harder reset of PMU prior to DEVINIT, or the IFR
image will hang.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:37 +10:00
Ben Skeggs
41c7be6913 drm/nouveau/pmu/gp100: initial implementation
Just enough to hookup preinit reset(), which DEVINIT will depend on later.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:36 +10:00
Ben Skeggs
2f524aa0b7 drm/nouveau/pmu: execute reset before running devinit
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:36 +10:00
Ben Skeggs
da7d2062fc drm/nouveau/pmu: move ucode handling into gt215 implementation
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:36 +10:00
Ben Skeggs
17ff521d69 drm/nouveau/core: initial support for GP102
From visual inspection of traces, what we currently implement appears to
be identical to GP104.  Seems to work well enough too.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:35 +10:00
Ben Skeggs
9e38b13ea5 drm/nouveau/device/pci: fix oops if no mmu subdev present
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:35 +10:00
Ben Skeggs
3ca03cac39 drm/nouveau/kms/nv50: avoid touching DP_MSTM_CTRL if !DP_MST_CAP
Fixes certain displays not being detected due to DPAUX errors.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-17 09:50:35 +10:00
Ben Skeggs
b27add13f5 drm/nouveau/fifo/gf100-: protect channel preempt with subdev mutex
This avoids an issue that occurs when we're attempting to preempt multiple
channels simultaneously.  HW seems to ignore preempt requests while it's
still processing a previous one, which, well, makes sense.

Fixes random "fifo: SCHED_ERROR 0d []" + GPCCS page faults during parallel
piglit runs on (at least) GM107.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Cc: stable@vger.kernel.org
2016-11-07 14:05:13 +10:00
Alexandre Courbot
e137040e0d drm/nouveau/gr: fallback to legacy paths during firmware lookup
Look for firmware files using the legacy ("nouveau/nvxx_fucxxxx") path
if they cannot be found in the new, "official" path. User setups were
broken by the switch, which is bad.

There are only 4 firmware files we may want to look up that way, so
hardcode them into the lookup function. All new firmware files should
use the standard "nvidia/<chip>/gr/" path.

Fixes: 8539b37ace ("drm/nouveau/gr: use NVIDIA-provided external firmwares")
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Cc: stable@vger.kernel.org
2016-11-07 14:05:04 +10:00
Ben Skeggs
f479c0ba4a drm/nouveau/kms/nv50: initial support for DP 1.2 multi-stream
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:03 +10:00
Ben Skeggs
d665c7e914 drm/nouveau/kms/nv50: allow encoder update to be called from other modules
MST encoders will make use of this to share code with SOR>

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:03 +10:00
Ben Skeggs
9bfdee9a08 drm/nouveau/kms/nv50: rename remaining nv50_crtc to nv50_head
No code changes, just renames + shuffles.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:02 +10:00
Ben Skeggs
f00f0e218b drm/nouveau/kms/nv50: remove code to create ctxdma for every framebuffer
This is now handled by prepare_fb().  Legacy flips were the last user.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:02 +10:00
Ben Skeggs
e1ef6b42d9 drm/nouveau/kms/nv50: remove code to support non-atomic page flips
Made completely unreachable (and broken) by atomic commits.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:01 +10:00
Ben Skeggs
c2d926aacc drm/nouveau/kms/nv50: remove code to support non-atomic connector properties
Made completely unreachable by atomic commits.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:01 +10:00
Ben Skeggs
8896ceef78 drm/nouveau/kms/nv50: remove code to support non-atomic dpms
Made completely unreachable (and broken) by atomic commits.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:00 +10:00
Ben Skeggs
f7aa20e833 drm/nouveau/kms/nv50: remove code to support non-atomic modesets
Make completely unreachable (and broken) by atomic commits.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:05:00 +10:00
Ben Skeggs
839ca903f1 drm/nouveau/kms/nv50: transition to atomic interfaces internally
This commit implements the atomic commit interfaces, and implements the
legacy modeset and page flipping interfaces on top of them.

There's two major changes in behavior from before:

- We're now making use of interlocks between core and satellite EVO
  channels, which greatly improves our ability to keep their states
  synchronised.
- DPMS is now implemented as a full modeset to either tear down the
  entire pipe (or bring it back up).  This choice was made mostly
  to ease the initial implementation, but I'm also not sure what we
  gain by bring backing the old behaviour.  We shall see.

This does NOT currently expose the atomic ioctl by default, due to
limited testing having been performed.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:59 +10:00
Ben Skeggs
5f674a5c46 drm/nouveau/kms/nv50: turn mode_set_base_atomic() into a stub
This cannot currently be supported with atomic modesettting.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:59 +10:00
Ben Skeggs
d92c8adf80 drm/nouveau/kms/nv50: convert encoder mode_fixup into an atomic_check()
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:58 +10:00
Ben Skeggs
f20c665ca0 drm/nouveau/kms/nv50: clean-up encoder functions
Just a shuffle of blocks into an order consistent with the rest of the
code, renaming hdmi/audio funtions for atomic, and removal of unused
code.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:58 +10:00
Ben Skeggs
354d3508bc drm/nouveau/kms/nv50: ensure encoder normal power state is enabled at startup
To handle low-power DPMS states, we currently change an OR's (Output
Resource) normal (active) power state to be off, leaving the rest of
the display configured as usual.

Under atomic modesetting, we will instead be doing a full modeset to
tear down the pipe fully when entering a low-power state.

As we'll no longer be touching the OR's PWR registers during runtime
operation, we need to ensure the normal power state is set correctly
during initialisation.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:57 +10:00
Ben Skeggs
accdea2ef4 drm/nouveau/kms/nv50: prepare ctxdma interface to be usable with atomic
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:57 +10:00
Ben Skeggs
22e927d2f8 drm/nouveau/kms/nv50: separate out cursor channel commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:56 +10:00
Ben Skeggs
973f10c2d3 drm/nouveau/kms/nv50: separate out base channel commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:56 +10:00
Ben Skeggs
06ab282f13 drm/nouveau/kms/nv50: separate out vblank dmi commit
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:55 +10:00
Ben Skeggs
7e08d67c5f drm/nouveau/kms/nv50: separate out procamp commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:55 +10:00
Ben Skeggs
7e91833dfb drm/nouveau/kms/nv50: separate out dither commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:54 +10:00
Ben Skeggs
c4e6812c1c drm/nouveau/kms/nv50: separate out viewport commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:54 +10:00
Ben Skeggs
6bbab3b6b6 drm/nouveau/kms/nv50: separate out base/ovly channel usage bounds commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

We're no longer touching the overlay channel usage bounds as of this
commit.  The code to do so is in place for when overlay planes are
added.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:53 +10:00
Ben Skeggs
ea8ee39002 drm/nouveau/kms/nv50: separate out cursor surface commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:53 +10:00
Ben Skeggs
a7ae156190 drm/nouveau/kms/nv50: separate out lut commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:52 +10:00
Ben Skeggs
ad63361953 drm/nouveau/kms/nv50: separate out core surface commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

As of this commit, we're no longer bothering to point the core surface
at a valid framebuffer.  Prior to this, we'd initially point the core
channel to the framebuffer passed in a mode_set()/mode_set_base(), and
then use the base channel for any page-flip updates, leaving the core
channel pointing at stale information.

The important thing here is to configure the core surface parameters in
such a way that EVO's error checking is satisfied.

TL;DR: The situation isn't too much different to before.

There may be brief periods of times during modesets where the (garbage)
core surface will be showing.  This issue will be resolved once support
for atomic commits has been implemented and we're able to interlock the
updates that involve multiple channels.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:52 +10:00
Ben Skeggs
3dbd036b84 drm/nouveau/kms/nv50: separate out mode commit
This commit separates the calculation of EVO state from the commit, in
order to make the same code useful for atomic modesetting.

The legacy interfaces have been wrapped on top of them.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:51 +10:00
Ben Skeggs
5a223daccb drm/nouveau/kms/nv50: give more useful names to encoders
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:51 +10:00
Ben Skeggs
7f55a07293 drm/nouveau/kms/nv50: control evo trace output with DRM_UT_KMS
Will be useful in debugging the transition to atomic.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:50 +10:00
Ben Skeggs
52aa30f252 drm/nouveau/kms/nv50: switch mst sink back into sst mode
Sometimes we load with a sink already in MST mode.  If, however, we can't
or don't want to use MST, we need to be able to switch it back to SST.

This commit instantiates a stub topology manager for any output path that
we believe (the detection of this could use some improvement) has support
for MST, and adds the connector detect() logic for detecting sink support
and switching between modes.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:50 +10:00
Ben Skeggs
fc21a4a099 drm/nouveau/kms: never call drm_helper_disable_unused_functions() with atomic
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:49 +10:00
Ben Skeggs
b167db0e68 drm/nouveau/kms: prepare to support suspend/resume of display state with atomic
This is different from the equivilant functions in the atomic helpers in
that we fully disable the pipe instead of just setting it to inactive.

We do this (primarily) to ensure the framebuffer cleanup paths are hit,
allowing buffers to be un-pinned from memory so they can be evicted to
system memory and not lose their contents while suspended.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:49 +10:00
Ben Skeggs
986edb91b2 drm/nouveau/kms: prepare to support vbl timestamp calculation with atomic
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:48 +10:00
Ben Skeggs
d6455379a9 drm/nouveau/kms: prepare to support legacy connector set_property with atomic
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:48 +10:00
Ben Skeggs
b2b75eea57 drm/nouveau/kms: prepare to support legacy connector dpms with atomic
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:47 +10:00
Ben Skeggs
56182b8bd1 drm/nouveau/kms: separate connector property attach from nouveau_connector
These will also be used by MST connectors.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:47 +10:00
Ben Skeggs
616915ec76 drm/nouveau/kms: subclass atomic connector state
This commit implements the atomic property hooks for a connector, and
wraps the legacy interface handling on top of those.

For the moment, a full modeset will be done after any property change
in order to ease subsequent changes.  The optimised behaviour will be
restored for Tesla and later (earlier boards always do full modesets)
once atomic commits are implemented.

Some functions are put under the "nouveau_conn" namespace now, rather
than "nouveau_connector", to distinguish functions that will work for
(upcoming) MST connectors too.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2016-11-07 14:04:46 +10:00