Commit Graph

100 Commits

Author SHA1 Message Date
Ilia Mirkin
d31b11d858 drm/nouveau/bios: add proper support for opcode 0x59
More analysis shows that this is identical to 0x79 except that it loads
the frequency indirectly from elsewhere in the VBIOS.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91025
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:09 +10:00
Ilia Mirkin
360ccb8436 drm/nouveau/bios: add 0x59 and 0x5a opcodes
Opcode 0x5a is a register write for data looked up from another part of
the VBIOS image. 0x59 is a more complex opcode, but we may as well
recognize it. These occur on a single known instance of Riva TNT2
hardware.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91025
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:09 +10:00
Thierry Reding
1196bcf921 drm/nouveau/disp: Use NULL for pointers
The return type of exec_lookup() is struct nvkm_output *, so it should
return NULL rather than 0.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:09 +10:00
Samuel Pitoiset
305c1959ea drm/nouveau/pm: fix a potential race condition when creating an engine context
There is always the possiblity that the ppm->context pointer would get
partially updated and accidentally would equal ctx. This would allow two
contexts to co-exist, which is not acceptable. Moving the test to the
critical section takes care of this problem.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: Martin Peres <martin.peres@free.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:09 +10:00
Samuel Pitoiset
3693d54405 drm/nouveau/pm: prevent freeing the wrong engine context
This fixes a crash when multiple PM engine contexts are created.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Martin Peres <martin.peres@free.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:09 +10:00
Alexandre Courbot
4a8cf4513d drm/nouveau/gr/gf100: wait for GR idle after GO_IDLE bundle
After submitting a GO_IDLE bundle, one must wait for GR to effectively
be idle before submitting the next bundle. Failure to do so may result
in undefined behavior in some rare cases.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Reported-by: Kary Jin <karyj@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:08 +10:00
Alexandre Courbot
19bf09cecf drm/nouveau/gr/gf100: wait on bottom half of FE's pipeline
When emitting the ICMD bundle, wait on the bottom half (bit 3 of the
GR_STATUS register) instead of upper half (bit 2) to make sure methods
are effectively emitted.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:08 +10:00
Alexandre Courbot
1addc12648 drm/nouveau/fifo/gk104: kick channels when deactivating them
Kicking channels is part of their deactivation process. Maxwell chips
are particularly sensitive to this, and can start fetching the previous
pushbuffer of a recycled channel if this is not done.

While we are at it, improve the channel preemption code to only wait for
bit 20 of 0x002634 to turn to 0, as it is the bit indicating a
preempt is pending.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:08 +10:00
Alexandre Courbot
9c56be4cf3 drm/nouveau/ibus/gk20a: increase SM wait timeout
Increase clock timeout for SYS, FPB and GPC in order to avoid operation
failure at high gpcclk rate.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:08 +10:00
Roy Spliet
9694554691 drm/nouveau/clk/gt215: u32->s32 for difference in req. and set clock
This difference can of course be negative too...

Signed-off-by: Roy Spliet <rspliet@eclipso.eu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-07-27 18:56:07 +10:00
Kamil Dudka
7512223b1e drm/nouveau/drm/nv04-nv40/instmem: protect access to priv->heap by mutex
This fixes the list_del corruption reported
at <https://bugzilla.redhat.com/1205985>.

Signed-off-by: Kamil Dudka <kdudka@redhat.com>
2015-07-27 18:56:07 +10:00
Ben Skeggs
aaea3938b5 drm/nouveau/gr/gm204: remove a stray printk
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-05-29 10:59:32 +10:00
Ben Skeggs
4d4d6f7520 drm/nouveau/devinit/gm100-: force devinit table execution on boards without PDISP
Should fix fdo#89558

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-05-29 10:59:32 +10:00
Ben Skeggs
c9ab50d210 drm/nouveau/devinit/gf100: make the force-post condition more obvious
And also more generic, so it can be used on newer chipsets.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-05-29 10:59:32 +10:00
Jan Vesely
4195f40685 drm/nouveau/bios: fix fetching from acpi on certain systems
nvbios_extend() returns 1 to indicate "extended the array" and 0 to
indicate the array is already big enough.  This is used by the core
shadowing code to prevent re-fetching chunks of the image that have
already been shadowed.

The ACPI fetching code may possibly need to extend this further due
to requiring fetches to happen in 4KiB chunks.

Under certain circumstances (that happen if the total image size is
a multiple of 4KiB), the memory allocated to store the shadow will
already be big enough, causing the ACPI code's nvbios_extend() call
to return 0, which is misinterpreted as a failure.

The fix is simple, accept >= 0 as a successful condition here.  The
core will have already made sure that we're not re-fetching data we
already have.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89047

v2 (Ben Skeggs):
- dropped hunk which would cause unnecessary re-fetching
- more descriptive explanation

Signed-off-by: Jan Vesely <jano.vesely@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:59 +10:00
Ben Skeggs
426b20e42e drm/nouveau/gr/gm206: initial init+ctx code
Uncertain whether the GPC pack change is due to a newer driver version,
or a legitimate difference from GM204.  My GM204 has broken vram, so
can't currently try a newer binary driver on it to confirm.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:58 +10:00
Ben Skeggs
985826bccd drm/nouveau/ce/gm206: enable support via gm204 code
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:58 +10:00
Ben Skeggs
5dd7fb771a drm/nouveau/fifo/gm206: enable support via gm204 code
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:57 +10:00
Ben Skeggs
3fed3ea9fd drm/nouveau/gr/gm204: initial init+ctx code
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:57 +10:00
Ben Skeggs
b44881e453 drm/nouveau/ce/gm204: initial support
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:56 +10:00
Ben Skeggs
89025bd458 drm/nouveau/fifo/gm204: initial support
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:55 +10:00
Ben Skeggs
91c772ec12 drm/nouveau/gr/gk104-: prevent reading non-existent regs in intr handler
Under certain circumstances the trapped address will contain subc 7,
which GK104 GR doesn't have anymore.

Notice this case to avoid causing additional priv ring faults.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:55 +10:00
Ben Skeggs
ddec1a2b4c drm/nouveau/gr/gm107: very slightly demagic part of attrib cb setup
No idea if "3" is a constant or derived from something else, but the
value is unchanged in the limited traces of gm107/gm204 I have here.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:54 +10:00
Ben Skeggs
6eb7082621 drm/nouveau/gr/gk104-: correct crop/zrop num_active_fbps setting
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:54 +10:00
Ben Skeggs
3740c82590 drm/nouveau/gr/gf100-: add symbolic names for classes
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:54 +10:00
Ben Skeggs
8fd4b7d438 drm/nouveau/gr/gm107: support tpc "strand" ctxsw in gpccs ucode
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:53 +10:00
Ben Skeggs
2a19b3ed65 drm/nouveau/gr/gf100-: support mmio access with gpc offset from gpccs ucode
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:53 +10:00
Alexandre Courbot
7120908d12 drm/nouveau/pmu/gk20a: add some missing statics
Make static a few functions and structures that should be.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:52 +10:00
Ben Skeggs
ed22e68462 drm/nouveau/gr/gk104-gk20a: call pmu to disable any power-gating before ctor()
On some of these chipsets, reading NV_PGRAPH_GPC_GPM_PD_PES_TPC_ID_MASK
can trigger a PRI fault and return an error code instead of a TPC mask,
unless PGOB has been disabled first.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:51 +10:00
Ben Skeggs
f02a0e849d drm/nouveau/pmu/gk208: implement gr power-up magic with gk110_pmu_pgob()
Before we moved gk110's implementation of this to pmu, the functions were
identical.  This commit just switches GK208 to use the new (more complete)
implementation of the power-up sequence.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:50 +10:00
Ben Skeggs
e1fc44fb9d drm/nouveau/pmu/gk110: implement gr power-up magic like PGOB on earlier chips
Turns out the PTHERM part of this dance is bracketed by the same PMU
fiddling that occurs on GK104/6, let's assume it's also PGOB.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:50 +10:00
Roy Spliet
d9da545e10 drm/nouveau/pbus/hwsq: Make code size u16
So we can actually use the full 512 byte code space

Signed-off-by: Roy Spliet <rspliet@eclipso.eu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:49 +10:00
Roy Spliet
3834b632b2 drm/nouveau/pbus/hwsq: Support strided register writes
Signed-off-by: Roy Spliet <rspliet@eclipso.eu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:49 +10:00
Alexandre Courbot
df16896b86 drm/nouveau/instmem/gk20a: fix crash during error path
If a memory allocation fails when using the DMA allocator,
gk20a_instobj_dtor_dma() will be called on the failed instmem object.
At this time, node->handle might not be NULL despite the call to
dma_alloc_attrs() having failed. node->cpuaddr is the right member to
check for such a failure, so use it instead.

Reported-by: Vince Hsu <vinceh@nvidia.com>
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:49 +10:00
Ben Skeggs
b03eaa4d34 drm/nouveau/disp/gf110-: fix base channel update debug/error output
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:48 +10:00
Ben Skeggs
963e965033 drm/nouveau/disp/nv50-: fix push buffers in vram
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:47 +10:00
Alexandre Courbot
a7f6da6e75 drm/nouveau/instmem/gk20a: add IOMMU support
Let GK20A's instmem take advantage of the IOMMU if it is present. Having
an IOMMU means that instmem is no longer allocated using the DMA API,
but instead obtained through page_alloc and made contiguous to the GPU
by IOMMU mappings.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:45 +10:00
Alexandre Courbot
5dc240bcfe drm/nouveau/instmem/gk20a: use DMA attributes
instmem for GK20A is allocated using dma_alloc_coherent(), which
provides us with a coherent CPU mapping that we never use because
instmem objects are accessed through PRAMIN. Switch to
dma_alloc_attrs() which gives us the option to dismiss that CPU mapping
and free up some CPU virtual space.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:44 +10:00
Alexandre Courbot
1452087675 drm/nouveau/gk20a: remove RAM device
Now that Nouveau can operate even when there is no RAM device, remove
the dummy one used by GK20A.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:43 +10:00
Alexandre Courbot
a6ff85d386 drm/nouveau/instmem/gk20a: move memory allocation to instmem
GK20A does not have dedicated RAM, thus having a RAM device for it does
not make sense. Move the contiguous physical memory allocation to
instmem.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:42 +10:00
Alexandre Courbot
eaecf0326f make RAM device optional
Having a RAM device does not make sense for chips like GK20A which have
no dedicated video memory. The dummy RAM device that we used so far
works as a temporary band-aid, but in the longer term it is desirable
for the driver to be able to work without any kind of VRAM.

This patch adds a few conditionals in places where a RAM device was
assumed to be present and allows some more objects to be allocated from
the TT domain, allowing Nouveau to handle GPUs for which
pfb->ram == NULL.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:42 +10:00
Lauri Peltonen
c6a7b026a3 drm/nouveau/gr/gf100: Clear notify interrupt
Notify interrupt is only used for cyclestats. We can just clear it and
avoid an "unknown stat" error that gets printed to dmesg otherwise.

Signed-off-by: Lauri Peltonen <lpeltonen@nvidia.com>
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:41 +10:00
Lauri Peltonen
3d951c3800 drm/nouveau/graph/nvc0: Fix engine pointer retrieval
Other methods in this file suggest this is the correct way to retrieve
the engine pointer.

Signed-off-by: Lauri Peltonen <lpeltonen@nvidia.com>
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 17:00:40 +10:00
Ben Skeggs
30489c230a drm/nouveau/devinit/nv04: change owner to int
We use -1 to mean "not read from hw yet"

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 16:59:21 +10:00
Dan Carpenter
5dfe7a0179 drm/nouveau/mxm: indent an if statement
This if statement is correct but it wasn't indented, so it looked like
some code was missing.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 16:59:21 +10:00
Martin Peres
3e5ede1def drm/nouveau/fuse/gm107: simplify the return logic
Spotted by coccinelle:
drivers/gpu/drm/nouveau/core/subdev/fuse/gm107.c:50:5-8: WARNING: end returns can be simpified

Signed-off-by: Martin Peres <martin.peres@free.fr>
Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-04-14 16:59:21 +10:00
Stefan Huehner
5a6f690ca5 drm/nouveau/bios: fix i2c table parsing for dcb 4.1
Code before looked only at bit 31 to decide if a port is unused.
However dcb 4.1 spec says 0x1F in bits 31-27 and 26-22 means unused.

This fixed hdmi monitor detection on GM206.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-03-17 09:44:23 +10:00
Stefan Huehner
7e547adcea drm/nouveau/device/gm100: Basic GM206 bring up (as copy of GM204)
Enough to get VGA monitor on DVI-I output have output.
HDMI output not yet working

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-03-17 09:44:23 +10:00
Ben Skeggs
9fcaa149e7 drm/nouveau/device: post write to NV_PMC_BOOT_1 when flipping endian switch
fdo#88868

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-03-17 09:44:22 +10:00
Ben Skeggs
404ba3f790 drm/nouveau/gr/gf100: fix some accidental or'ing of buffer addresses
fdo#83992

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2015-03-17 09:44:22 +10:00