2019-08-14 22:15:12

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 0/7] Adding a proper workaround for fixing RTD3 issues with Nouveau

First three patches are removing ACPI workarounds which should have never
landed.

The last four are adding a workaround to nouveau which seem to help quite
a lot with the RTD3 issues with Nouveau, so let's discuss and get wider
testing of those and see if there is any fallout or laptops where the
issues don't get fixed.

Karol Herbst (7):
Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"
Revert "ACPI / OSI: Add OEM _OSI string to enable NVidia HDMI audio"
Revert "ACPI / OSI: Add OEM _OSI strings to disable NVidia RTD3"
drm/nouveau/pci: enable pcie link changes for pascal
drm/nouveau/pci: add nvkm_pcie_get_speed
drm/nouveau/pci: save the boot pcie link speed and restore it on fini
drm/nouveau: abort runtime suspend if we hit an error

drivers/acpi/osi.c | 24 ----------
.../drm/nouveau/include/nvkm/core/device.h | 2 +
.../gpu/drm/nouveau/include/nvkm/subdev/pci.h | 9 ++--
drivers/gpu/drm/nouveau/nouveau_drm.c | 6 +++
.../gpu/drm/nouveau/nvkm/subdev/clk/base.c | 2 +-
.../gpu/drm/nouveau/nvkm/subdev/pci/base.c | 9 +++-
.../gpu/drm/nouveau/nvkm/subdev/pci/gk104.c | 8 ++--
.../gpu/drm/nouveau/nvkm/subdev/pci/gp100.c | 10 ++++
.../gpu/drm/nouveau/nvkm/subdev/pci/pcie.c | 46 +++++++++++++++++--
.../gpu/drm/nouveau/nvkm/subdev/pci/priv.h | 7 +++
10 files changed, 84 insertions(+), 39 deletions(-)

--
2.21.0


2019-08-14 22:15:12

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.

The original commit message didn't even make sense. AMD _does_ support it and
it works with Nouveau as well.

Also what was the issue being solved here? No references to any bugs and not
even explaining any issue at all isn't the way we do things.

And even if it means a muxed design, then the fix is to make it work inside the
driver, not adding some hacky workaround through ACPI tricks.

And what out of tree drivers do or do not support we don't care one bit anyway.

Signed-off-by: Karol Herbst <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/acpi/osi.c | 7 -------
1 file changed, 7 deletions(-)

diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
index bec0bebc7f52..9b20ac4d79a0 100644
--- a/drivers/acpi/osi.c
+++ b/drivers/acpi/osi.c
@@ -61,13 +61,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
* a BIOS workaround.
*/
{"Linux-Lenovo-NV-HDMI-Audio", true},
- /*
- * Linux-HPI-Hybrid-Graphics is used by BIOS to enable dGPU to
- * output video directly to external monitors on HP Inc. mobile
- * workstations as Nvidia and AMD VGA drivers provide limited
- * hybrid graphics supports.
- */
- {"Linux-HPI-Hybrid-Graphics", true},
};

static u32 acpi_osi_handler(acpi_string interface, u32 supported)
--
2.21.0

2019-08-14 22:15:40

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 4/7] drm/nouveau/pci: enable pcie link changes for pascal

Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Lyude Paul <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c | 8 ++++----
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c | 10 ++++++++++
drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h | 5 +++++
3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c
index e68030507d88..664890185e15 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c
@@ -23,7 +23,7 @@
*/
#include "priv.h"

-static int
+int
gk104_pcie_version_supported(struct nvkm_pci *pci)
{
return (nvkm_rd32(pci->subdev.device, 0x8c1c0) & 0x4) == 0x4 ? 2 : 1;
@@ -108,7 +108,7 @@ gk104_pcie_lnkctl_speed(struct nvkm_pci *pci)
return -1;
}

-static enum nvkm_pcie_speed
+enum nvkm_pcie_speed
gk104_pcie_max_speed(struct nvkm_pci *pci)
{
u32 max_speed = nvkm_rd32(pci->subdev.device, 0x8c1c0) & 0x300000;
@@ -146,7 +146,7 @@ gk104_pcie_set_link_speed(struct nvkm_pci *pci, enum nvkm_pcie_speed speed)
nvkm_mask(device, 0x8c040, 0x1, 0x1);
}

-static int
+int
gk104_pcie_init(struct nvkm_pci * pci)
{
enum nvkm_pcie_speed lnkctl_speed, max_speed, cap_speed;
@@ -178,7 +178,7 @@ gk104_pcie_init(struct nvkm_pci * pci)
return 0;
}

-static int
+int
gk104_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
{
struct nvkm_subdev *subdev = &pci->subdev;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c
index 82c5234a06ff..eb19c7a44561 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c
@@ -35,6 +35,16 @@ gp100_pci_func = {
.wr08 = nv40_pci_wr08,
.wr32 = nv40_pci_wr32,
.msi_rearm = gp100_pci_msi_rearm,
+
+ .pcie.init = gk104_pcie_init,
+ .pcie.set_link = gk104_pcie_set_link,
+
+ .pcie.max_speed = gk104_pcie_max_speed,
+ .pcie.cur_speed = g84_pcie_cur_speed,
+
+ .pcie.set_version = gf100_pcie_set_version,
+ .pcie.version = gf100_pcie_version,
+ .pcie.version_supported = gk104_pcie_version_supported,
};

int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
index 7009aad86b6e..162ed5dc6fc3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
@@ -54,6 +54,11 @@ int gf100_pcie_cap_speed(struct nvkm_pci *);
int gf100_pcie_init(struct nvkm_pci *);
int gf100_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8);

+int gk104_pcie_init(struct nvkm_pci *);
+int gk104_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width);
+enum nvkm_pcie_speed gk104_pcie_max_speed(struct nvkm_pci *);
+int gk104_pcie_version_supported(struct nvkm_pci *);
+
int nvkm_pcie_oneinit(struct nvkm_pci *);
int nvkm_pcie_init(struct nvkm_pci *);
#endif
--
2.21.0

2019-08-14 22:15:49

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 5/7] drm/nouveau/pci: add nvkm_pcie_get_speed

v2: fixed compilation error

Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Lyude Paul <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h | 1 +
drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c | 8 ++++++++
2 files changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
index 4803a4fad4a2..b29101e485f9 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
@@ -53,4 +53,5 @@ int gp100_pci_new(struct nvkm_device *, int, struct nvkm_pci **);

/* pcie functions */
int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width);
+enum nvkm_pcie_speed nvkm_pcie_get_speed(struct nvkm_pci *);
#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
index d71e5db5028a..03be24930c0e 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
@@ -163,3 +163,11 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)

return ret;
}
+
+enum nvkm_pcie_speed
+nvkm_pcie_get_speed(struct nvkm_pci *pci)
+{
+ if (!pci || !pci_is_pcie(pci->pdev) || !pci->func->pcie.cur_speed)
+ return -ENODEV;
+ return pci->func->pcie.cur_speed(pci);
+}
--
2.21.0

2019-08-14 22:16:43

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 3/7] Revert "ACPI / OSI: Add OEM _OSI strings to disable NVidia RTD3"

This reverts commit 9251a71db62ca9cc7e7cf364218610b0f018c291.

This was never discussed with anybody Nouveau related and we would have NACKed
this change immediately.

We have a better workaround, which makes it actually work with Nouveau. No idea
why the comment mentions the Nvidia driver and assumes it gives any weight to
the reasoning.... we don't care about out of tree drivers.

Nouveau does support RTD3, but we had some issues with that. And we even have
a better fix for this issue. Also, can we _please_ do it in a way worthy of an
upstream community the next time?

If some distribution feels like they have to please companies not wanting to
be part of the linux community, please do so downstream and don't try to push
something like this upstream.

Signed-off-by: Karol Herbst <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/acpi/osi.c | 9 ---------
1 file changed, 9 deletions(-)

diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
index 56cc95b6b724..f5d559a2ff14 100644
--- a/drivers/acpi/osi.c
+++ b/drivers/acpi/osi.c
@@ -44,15 +44,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
{"Processor Device", true},
{"3.0 _SCP Extensions", true},
{"Processor Aggregator Device", true},
- /*
- * Linux-Dell-Video is used by BIOS to disable RTD3 for NVidia graphics
- * cards as RTD3 is not supported by drivers now. Systems with NVidia
- * cards will hang without RTD3 disabled.
- *
- * Once NVidia drivers officially support RTD3, this _OSI strings can
- * be removed if both new and old graphics cards are supported.
- */
- {"Linux-Dell-Video", true},
};

static u32 acpi_osi_handler(acpi_string interface, u32 supported)
--
2.21.0

2019-08-14 22:17:37

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 6/7] drm/nouveau/pci: save the boot pcie link speed and restore it on fini

Apperantly things go south if we suspend the device with a different PCIE
link speed set than it got booted with. Fixes runtime suspend on my gp107.

This all looks like some bug inside the pci subsystem and I would prefer a
fix there instead of nouveau, but maybe there is no real nice way of doing
that outside of drivers?

v2: squashed together patch 4 and 5
v3: only restore pcie speed on machines with runpm
add NvRunpmWorkaround config option to disable the workaround

Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Lyude Paul <[email protected]> (v2)
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
.../drm/nouveau/include/nvkm/core/device.h | 2 +
.../gpu/drm/nouveau/include/nvkm/subdev/pci.h | 8 ++--
drivers/gpu/drm/nouveau/nouveau_drm.c | 1 +
.../gpu/drm/nouveau/nvkm/subdev/clk/base.c | 2 +-
.../gpu/drm/nouveau/nvkm/subdev/pci/base.c | 9 ++++-
.../gpu/drm/nouveau/nvkm/subdev/pci/pcie.c | 38 ++++++++++++++++---
.../gpu/drm/nouveau/nvkm/subdev/pci/priv.h | 2 +
7 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
index 6d55cd0476aa..4fb3f972ff97 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
@@ -125,6 +125,8 @@ struct nvkm_device {
u8 chiprev;
u32 crystal;

+ bool has_runpm;
+
struct {
struct notifier_block nb;
} acpi;
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
index b29101e485f9..56e73412fe4a 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h
@@ -26,8 +26,9 @@ struct nvkm_pci {
} agp;

struct {
- enum nvkm_pcie_speed speed;
- u8 width;
+ enum nvkm_pcie_speed cur_speed;
+ enum nvkm_pcie_speed def_speed;
+ u8 cur_width;
} pcie;

bool msi;
@@ -52,6 +53,7 @@ int gk104_pci_new(struct nvkm_device *, int, struct nvkm_pci **);
int gp100_pci_new(struct nvkm_device *, int, struct nvkm_pci **);

/* pcie functions */
-int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width);
+int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width,
+ bool save);
enum nvkm_pcie_speed nvkm_pcie_get_speed(struct nvkm_pci *);
#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 7c2fcaba42d6..16441c5bf29c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -675,6 +675,7 @@ static int nouveau_drm_probe(struct pci_dev *pdev,

if (nouveau_atomic)
driver_pci.driver_features |= DRIVER_ATOMIC;
+ device->has_runpm = nouveau_pmops_runtime();

drm_dev = drm_dev_alloc(&driver_pci, &pdev->dev);
if (IS_ERR(drm_dev)) {
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
index 40e564524b7a..1a524ffa77a3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
@@ -278,7 +278,7 @@ nvkm_pstate_prog(struct nvkm_clk *clk, int pstatei)
nvkm_debug(subdev, "setting performance state %d\n", pstatei);
clk->pstate = pstatei;

- nvkm_pcie_set_link(pci, pstate->pcie_speed, pstate->pcie_width);
+ nvkm_pcie_set_link(pci, pstate->pcie_speed, pstate->pcie_width, true);

if (fb && fb->ram && fb->ram->func->calc) {
struct nvkm_ram *ram = fb->ram;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
index ee2431a7804e..d9fb5a83f7d2 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
@@ -90,6 +90,8 @@ nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend)

if (pci->agp.bridge)
nvkm_agp_fini(pci);
+ else if (pci_is_pcie(pci->pdev))
+ nvkm_pcie_fini(pci);

return 0;
}
@@ -100,6 +102,8 @@ nvkm_pci_preinit(struct nvkm_subdev *subdev)
struct nvkm_pci *pci = nvkm_pci(subdev);
if (pci->agp.bridge)
nvkm_agp_preinit(pci);
+ else if (pci_is_pcie(pci->pdev))
+ nvkm_pcie_preinit(pci);
return 0;
}

@@ -193,8 +197,9 @@ nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device,
pci->func = func;
pci->pdev = device->func->pci(device)->pdev;
pci->irq = -1;
- pci->pcie.speed = -1;
- pci->pcie.width = -1;
+ pci->pcie.cur_speed = -1;
+ pci->pcie.def_speed = -1;
+ pci->pcie.cur_width = -1;

if (device->type == NVKM_DEVICE_AGP)
nvkm_agp_ctor(pci);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
index 03be24930c0e..d6b7ad6a8d0d 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c
@@ -23,6 +23,8 @@
*/
#include "priv.h"

+#include <core/option.h>
+
static char *nvkm_pcie_speeds[] = {
"2.5GT/s",
"5.0GT/s",
@@ -85,6 +87,13 @@ nvkm_pcie_oneinit(struct nvkm_pci *pci)
return 0;
}

+int
+nvkm_pcie_preinit(struct nvkm_pci *pci)
+{
+ pci->pcie.def_speed = nvkm_pcie_get_speed(pci);
+ return 0;
+}
+
int
nvkm_pcie_init(struct nvkm_pci *pci)
{
@@ -105,14 +114,31 @@ nvkm_pcie_init(struct nvkm_pci *pci)
if (pci->func->pcie.init)
pci->func->pcie.init(pci);

- if (pci->pcie.speed != -1)
- nvkm_pcie_set_link(pci, pci->pcie.speed, pci->pcie.width);
+ if (pci->pcie.cur_speed != -1)
+ nvkm_pcie_set_link(pci, pci->pcie.cur_speed,
+ pci->pcie.cur_width, false);
+
+ return 0;
+}
+
+int
+nvkm_pcie_fini(struct nvkm_pci *pci)
+{
+ struct nvkm_device *device = pci->subdev.device;
+ if (!device->has_runpm)
+ return 0;
+
+ if (!nvkm_boolopt(device->cfgopt, "NvRunpmWorkaround", true))
+ return 0;

+ if (!IS_ERR_VALUE(pci->pcie.def_speed))
+ return nvkm_pcie_set_link(pci, pci->pcie.def_speed, 16, false);
return 0;
}

int
-nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
+nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width,
+ bool save)
{
struct nvkm_subdev *subdev = &pci->subdev;
enum nvkm_pcie_speed cur_speed, max_speed;
@@ -146,8 +172,10 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
speed = max_speed;
}

- pci->pcie.speed = speed;
- pci->pcie.width = width;
+ if (save) {
+ pci->pcie.cur_speed = speed;
+ pci->pcie.cur_width = width;
+ }

if (speed == cur_speed) {
nvkm_debug(subdev, "requested matches current speed\n");
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
index 162ed5dc6fc3..85be0594f11b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h
@@ -60,5 +60,7 @@ enum nvkm_pcie_speed gk104_pcie_max_speed(struct nvkm_pci *);
int gk104_pcie_version_supported(struct nvkm_pci *);

int nvkm_pcie_oneinit(struct nvkm_pci *);
+int nvkm_pcie_preinit(struct nvkm_pci *);
int nvkm_pcie_init(struct nvkm_pci *);
+int nvkm_pcie_fini(struct nvkm_pci *);
#endif
--
2.21.0

2019-08-14 22:17:42

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 7/7] drm/nouveau: abort runtime suspend if we hit an error

Signed-off-by: Karol Herbst <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/gpu/drm/nouveau/nouveau_drm.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 16441c5bf29c..b16157a9c736 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -910,6 +910,7 @@ nouveau_pmops_runtime_suspend(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct drm_device *drm_dev = pci_get_drvdata(pdev);
+ struct nouveau_drm *drm = nouveau_drm(drm_dev);
int ret;

if (!nouveau_pmops_runtime()) {
@@ -919,6 +920,10 @@ nouveau_pmops_runtime_suspend(struct device *dev)

nouveau_switcheroo_optimus_dsm();
ret = nouveau_do_suspend(drm_dev, true);
+ if (ret) {
+ NV_ERROR(drm, "suspend failed with: %d\n", ret);
+ return ret;
+ }
pci_save_state(pdev);
pci_disable_device(pdev);
pci_ignore_hotplug(pdev);
--
2.21.0

2019-08-14 22:20:16

by Alex Hung

[permalink] [raw]
Subject: Re: [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

Thanks for the series of fixes. I will check whether these fixes work
on the original intended systems.

On Wed, Aug 14, 2019 at 3:31 PM Karol Herbst <[email protected]> wrote:
>
> This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
>
> The original commit message didn't even make sense. AMD _does_ support it and
> it works with Nouveau as well.
>
> Also what was the issue being solved here? No references to any bugs and not
> even explaining any issue at all isn't the way we do things.
>
> And even if it means a muxed design, then the fix is to make it work inside the
> driver, not adding some hacky workaround through ACPI tricks.
>
> And what out of tree drivers do or do not support we don't care one bit anyway.
>
> Signed-off-by: Karol Herbst <[email protected]>
> CC: Alex Hung <[email protected]>
> CC: Rafael J. Wysocki <[email protected]>
> CC: Dave Airlie <[email protected]>
> CC: Lyude Paul <[email protected]>
> CC: Ben Skeggs <[email protected]>
> ---
> drivers/acpi/osi.c | 7 -------
> 1 file changed, 7 deletions(-)
>
> diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
> index bec0bebc7f52..9b20ac4d79a0 100644
> --- a/drivers/acpi/osi.c
> +++ b/drivers/acpi/osi.c
> @@ -61,13 +61,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
> * a BIOS workaround.
> */
> {"Linux-Lenovo-NV-HDMI-Audio", true},
> - /*
> - * Linux-HPI-Hybrid-Graphics is used by BIOS to enable dGPU to
> - * output video directly to external monitors on HP Inc. mobile
> - * workstations as Nvidia and AMD VGA drivers provide limited
> - * hybrid graphics supports.
> - */
> - {"Linux-HPI-Hybrid-Graphics", true},
> };
>
> static u32 acpi_osi_handler(acpi_string interface, u32 supported)
> --
> 2.21.0
>


--
Cheers,
Alex Hung

2019-08-14 23:03:05

by Karol Herbst

[permalink] [raw]
Subject: [PATCH 2/7] Revert "ACPI / OSI: Add OEM _OSI string to enable NVidia HDMI audio"

This reverts commit 887532ca7ca59fcf0547a79211756791128030a3.

We have a better solution for this: b516ea586d717

And same as with the last commit: "NVidia Linux driver" that's Nouveau, any
out of tree driver does _not_ matter. And with Nouveau all of this works even
though it required a proper fix first, but we have that now.

Signed-off-by: Karol Herbst <[email protected]>
CC: Alex Hung <[email protected]>
CC: Rafael J. Wysocki <[email protected]>
CC: Dave Airlie <[email protected]>
CC: Lyude Paul <[email protected]>
CC: Ben Skeggs <[email protected]>
---
drivers/acpi/osi.c | 8 --------
1 file changed, 8 deletions(-)

diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
index 9b20ac4d79a0..56cc95b6b724 100644
--- a/drivers/acpi/osi.c
+++ b/drivers/acpi/osi.c
@@ -53,14 +53,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
* be removed if both new and old graphics cards are supported.
*/
{"Linux-Dell-Video", true},
- /*
- * Linux-Lenovo-NV-HDMI-Audio is used by BIOS to power on NVidia's HDMI
- * audio device which is turned off for power-saving in Windows OS.
- * This power management feature observed on some Lenovo Thinkpad
- * systems which will not be able to output audio via HDMI without
- * a BIOS workaround.
- */
- {"Linux-Lenovo-NV-HDMI-Audio", true},
};

static u32 acpi_osi_handler(acpi_string interface, u32 supported)
--
2.21.0

2019-08-15 00:17:19

by Dave Airlie

[permalink] [raw]
Subject: Re: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

On Thu, 15 Aug 2019 at 07:31, Karol Herbst <[email protected]> wrote:
>
> This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
>
> The original commit message didn't even make sense. AMD _does_ support it and
> it works with Nouveau as well.
>
> Also what was the issue being solved here? No references to any bugs and not
> even explaining any issue at all isn't the way we do things.
>
> And even if it means a muxed design, then the fix is to make it work inside the
> driver, not adding some hacky workaround through ACPI tricks.
>
> And what out of tree drivers do or do not support we don't care one bit anyway.
>

I think the reverts should be merged via Rafael's tree as the original
patches went in via there, and we should get them in asap.

Acked-by: Dave Airlie <[email protected]>
Dave.

2019-08-15 00:18:23

by Alex Hung

[permalink] [raw]
Subject: Re: [PATCH 3/7] Revert "ACPI / OSI: Add OEM _OSI strings to disable NVidia RTD3"

On Wed, Aug 14, 2019 at 3:31 PM Karol Herbst <[email protected]> wrote:
>
> This reverts commit 9251a71db62ca9cc7e7cf364218610b0f018c291.
>
> This was never discussed with anybody Nouveau related and we would have NACKed
> this change immediately.
>
> We have a better workaround, which makes it actually work with Nouveau. No idea
> why the comment mentions the Nvidia driver and assumes it gives any weight to
> the reasoning.... we don't care about out of tree drivers.
>
> Nouveau does support RTD3, but we had some issues with that. And we even have
> a better fix for this issue. Also, can we _please_ do it in a way worthy of an
> upstream community the next time?
>
> If some distribution feels like they have to please companies not wanting to
> be part of the linux community, please do so downstream and don't try to push
> something like this upstream.

Hi Karol,

A lot of appreciation for your hard-work on this issue, but unfriendly
comments aren't necessary. At the time this was discussed with
hardware vendors and platform vendors and it worked for many systems
and benefit for many people buying these platforms. Last but not
least, I do appreciate better fixes and want to retire the hacks too.

I am going to notify hardware owners to test these patches on the
original intended systems, and will report whether there are
regressions.


>
> Signed-off-by: Karol Herbst <[email protected]>
> CC: Alex Hung <[email protected]>
> CC: Rafael J. Wysocki <[email protected]>
> CC: Dave Airlie <[email protected]>
> CC: Lyude Paul <[email protected]>
> CC: Ben Skeggs <[email protected]>
> ---
> drivers/acpi/osi.c | 9 ---------
> 1 file changed, 9 deletions(-)
>
> diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
> index 56cc95b6b724..f5d559a2ff14 100644
> --- a/drivers/acpi/osi.c
> +++ b/drivers/acpi/osi.c
> @@ -44,15 +44,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
> {"Processor Device", true},
> {"3.0 _SCP Extensions", true},
> {"Processor Aggregator Device", true},
> - /*
> - * Linux-Dell-Video is used by BIOS to disable RTD3 for NVidia graphics
> - * cards as RTD3 is not supported by drivers now. Systems with NVidia
> - * cards will hang without RTD3 disabled.
> - *
> - * Once NVidia drivers officially support RTD3, this _OSI strings can
> - * be removed if both new and old graphics cards are supported.
> - */
> - {"Linux-Dell-Video", true},
> };
>
> static u32 acpi_osi_handler(acpi_string interface, u32 supported)
> --
> 2.21.0
>


--
Cheers,
Alex Hung

2019-08-15 04:46:53

by Karol Herbst

[permalink] [raw]
Subject: Re: [PATCH 3/7] Revert "ACPI / OSI: Add OEM _OSI strings to disable NVidia RTD3"

On Thu, Aug 15, 2019 at 1:35 AM Alex Hung <[email protected]> wrote:
>
> On Wed, Aug 14, 2019 at 3:31 PM Karol Herbst <[email protected]> wrote:
> >
> > This reverts commit 9251a71db62ca9cc7e7cf364218610b0f018c291.
> >
> > This was never discussed with anybody Nouveau related and we would have NACKed
> > this change immediately.
> >
> > We have a better workaround, which makes it actually work with Nouveau. No idea
> > why the comment mentions the Nvidia driver and assumes it gives any weight to
> > the reasoning.... we don't care about out of tree drivers.
> >
> > Nouveau does support RTD3, but we had some issues with that. And we even have
> > a better fix for this issue. Also, can we _please_ do it in a way worthy of an
> > upstream community the next time?
> >
> > If some distribution feels like they have to please companies not wanting to
> > be part of the linux community, please do so downstream and don't try to push
> > something like this upstream.
>
> Hi Karol,
>
> A lot of appreciation for your hard-work on this issue, but unfriendly
> comments aren't necessary. At the time this was discussed with
> hardware vendors and platform vendors and it worked for many systems
> and benefit for many people buying these platforms. Last but not
> least, I do appreciate better fixes and want to retire the hacks too.
>

sorry if that sounded too harsh, but the issue is not that it helped,
the issue is, that nobody talked with us about that. And those three
commits also sounded like they were mainly targeted against the Nvidia
driver (and please correct me if I am wrong here).

The situation would be completely different if we would have talked
about all this earlier (and I wouldn't get annoyed by all of this in
the first place).

I am well aware this is a super painful issue for a lot of users, but
even then disabling RTD3 (for a limited amount of hardware) inside
nouveau would be the only acceptable way to disable it.

I don't see how pushing vendors to add some firmware code to disable
certain features helps in any way, when there is a fast and easy way
to disable it and wouldn't draw resources away from actually fixing
it.

> I am going to notify hardware owners to test these patches on the
> original intended systems, and will report whether there are
> regressions.
>
>
> >
> > Signed-off-by: Karol Herbst <[email protected]>
> > CC: Alex Hung <[email protected]>
> > CC: Rafael J. Wysocki <[email protected]>
> > CC: Dave Airlie <[email protected]>
> > CC: Lyude Paul <[email protected]>
> > CC: Ben Skeggs <[email protected]>
> > ---
> > drivers/acpi/osi.c | 9 ---------
> > 1 file changed, 9 deletions(-)
> >
> > diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
> > index 56cc95b6b724..f5d559a2ff14 100644
> > --- a/drivers/acpi/osi.c
> > +++ b/drivers/acpi/osi.c
> > @@ -44,15 +44,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
> > {"Processor Device", true},
> > {"3.0 _SCP Extensions", true},
> > {"Processor Aggregator Device", true},
> > - /*
> > - * Linux-Dell-Video is used by BIOS to disable RTD3 for NVidia graphics
> > - * cards as RTD3 is not supported by drivers now. Systems with NVidia
> > - * cards will hang without RTD3 disabled.
> > - *
> > - * Once NVidia drivers officially support RTD3, this _OSI strings can
> > - * be removed if both new and old graphics cards are supported.
> > - */
> > - {"Linux-Dell-Video", true},
> > };
> >
> > static u32 acpi_osi_handler(acpi_string interface, u32 supported)
> > --
> > 2.21.0
> >
>
>
> --
> Cheers,
> Alex Hung

2019-08-15 14:12:10

by Daniel Vetter

[permalink] [raw]
Subject: Re: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

On Thu, Aug 15, 2019 at 12:47 AM Dave Airlie <[email protected]> wrote:
>
> On Thu, 15 Aug 2019 at 07:31, Karol Herbst <[email protected]> wrote:
> >
> > This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
> >
> > The original commit message didn't even make sense. AMD _does_ support it and
> > it works with Nouveau as well.
> >
> > Also what was the issue being solved here? No references to any bugs and not
> > even explaining any issue at all isn't the way we do things.
> >
> > And even if it means a muxed design, then the fix is to make it work inside the
> > driver, not adding some hacky workaround through ACPI tricks.
> >
> > And what out of tree drivers do or do not support we don't care one bit anyway.
> >
>
> I think the reverts should be merged via Rafael's tree as the original
> patches went in via there, and we should get them in asap.

+1

> Acked-by: Dave Airlie <[email protected]>

Acked-by: Daniel Vetter <[email protected]>

Also fully agreeing with Karol's reply further down, if this doesn't
work we need to improve the drivers, not pile stuff on top in some
ACPI hacks.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

2019-08-15 16:27:17

by Mario Limonciello

[permalink] [raw]
Subject: RE: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

> -----Original Message-----
> From: [email protected] <[email protected]> On
> Behalf Of Dave Airlie
> Sent: Wednesday, August 14, 2019 5:48 PM
> To: Karol Herbst
> Cc: LKML; Linux ACPI; dri-devel; nouveau; Rafael J . Wysocki; Alex Hung; Ben
> Skeggs; Dave Airlie
> Subject: Re: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to
> enable dGPU direct output"
>
> On Thu, 15 Aug 2019 at 07:31, Karol Herbst <[email protected]> wrote:
> >
> > This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
> >
> > The original commit message didn't even make sense. AMD _does_ support it and
> > it works with Nouveau as well.
> >
> > Also what was the issue being solved here? No references to any bugs and not
> > even explaining any issue at all isn't the way we do things.
> >
> > And even if it means a muxed design, then the fix is to make it work inside the
> > driver, not adding some hacky workaround through ACPI tricks.
> >
> > And what out of tree drivers do or do not support we don't care one bit anyway.
> >
>
> I think the reverts should be merged via Rafael's tree as the original
> patches went in via there, and we should get them in asap.
>
> Acked-by: Dave Airlie <[email protected]>
> Dave.

There are definitely going to be regressions on machines in the field with the
in tree drivers by reverting this. I think we should have an answer for all of those
before this revert is accepted.

Regarding systems with Intel+NVIDIA, we'll have to work with partners to collect
some information on the impact of reverting this.

When this is used on a system with Intel+AMD the ASL configures AMD GPU to use
"Hybrid Graphics" when on Windows and "Power Express" and "Switchable Graphics"
when on Linux.

I feel we need a knob and/or DMI detection to affect the changes that the ASL
normally performs.

2019-08-19 09:53:24

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

On Thursday, August 15, 2019 12:47:35 AM CEST Dave Airlie wrote:
> On Thu, 15 Aug 2019 at 07:31, Karol Herbst <[email protected]> wrote:
> >
> > This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
> >
> > The original commit message didn't even make sense. AMD _does_ support it and
> > it works with Nouveau as well.
> >
> > Also what was the issue being solved here? No references to any bugs and not
> > even explaining any issue at all isn't the way we do things.
> >
> > And even if it means a muxed design, then the fix is to make it work inside the
> > driver, not adding some hacky workaround through ACPI tricks.
> >
> > And what out of tree drivers do or do not support we don't care one bit anyway.
> >
>
> I think the reverts should be merged via Rafael's tree as the original
> patches went in via there, and we should get them in asap.
>
> Acked-by: Dave Airlie <[email protected]>

The _OSI strings are to be dropped when all of the needed support is there in
drivers, so they should go away along with the requisite driver changes.

I'm all for dropping then when that's the case, so please feel free to add ACKs
from me to the patches in question at that point.

Cheers,
Rafael



2019-09-05 20:50:56

by Karol Herbst

[permalink] [raw]
Subject: Re: [Nouveau] [PATCH 1/7] Revert "ACPI / OSI: Add OEM _OSI string to enable dGPU direct output"

is there any update on the testing with my patches? On the hardware I
had access to those patches helped, but I can't know if it also helped
on the hardware for which those workarounds where actually added.

On Mon, Aug 19, 2019 at 11:52 AM Rafael J. Wysocki <[email protected]> wrote:
>
> On Thursday, August 15, 2019 12:47:35 AM CEST Dave Airlie wrote:
> > On Thu, 15 Aug 2019 at 07:31, Karol Herbst <[email protected]> wrote:
> > >
> > > This reverts commit 28586a51eea666d5531bcaef2f68e4abbd87242c.
> > >
> > > The original commit message didn't even make sense. AMD _does_ support it and
> > > it works with Nouveau as well.
> > >
> > > Also what was the issue being solved here? No references to any bugs and not
> > > even explaining any issue at all isn't the way we do things.
> > >
> > > And even if it means a muxed design, then the fix is to make it work inside the
> > > driver, not adding some hacky workaround through ACPI tricks.
> > >
> > > And what out of tree drivers do or do not support we don't care one bit anyway.
> > >
> >
> > I think the reverts should be merged via Rafael's tree as the original
> > patches went in via there, and we should get them in asap.
> >
> > Acked-by: Dave Airlie <[email protected]>
>
> The _OSI strings are to be dropped when all of the needed support is there in
> drivers, so they should go away along with the requisite driver changes.
>

that goes beside the point. firmware level workarounds for GPU driver
issues were pushed without consulting with upstream GPU developers.
That's something which shouldn't have happened in the first place. And
yes, I am personally annoyed by the fact, that people know about
issues, but instead of contacting the proper persons and working on a
proper fix, we end up with stupid firmware level workarounds. I can't
see why we ever would have wanted such workarounds in the first place.

And I would be much happier if the next time something like that comes
up, that the drm mailing list will be contacted as well or somebody
involved.

We could have also just disable the feature inside the driver (and
probably we should have done that a long time ago, so that is
essentially our fault, but still....)

> I'm all for dropping then when that's the case, so please feel free to add ACKs
> from me to the patches in question at that point.
>
> Cheers,
> Rafael
>
>
>

2020-12-10 18:06:46

by Lyude Paul

[permalink] [raw]
Subject: Re: [PATCH 2/7] Revert "ACPI / OSI: Add OEM _OSI string to enable NVidia HDMI audio"

Hi, bumping the discussion again here because we just ran into this again, as we
just had a laptop OEM try to fix another issue by adding an OSI check for these
strings instead of helping us fix the issue in nouveau. Note as well the issue
I'm referring to is entirely independent of runtime D3, so we just got runtime
D3 broken again because of these hacks.

Why hasn't this patch been accepted into the kernel? These were added without
any sort of discussion with nouveau developers, and nouveau is the canonical
nvidia driver in the Linux kernel. These strings shouldn't be here without
discussion with the relevant driver maintainers, and need to be removed.

On Wed, 2019-08-14 at 23:31 +0200, Karol Herbst wrote:
> This reverts commit 887532ca7ca59fcf0547a79211756791128030a3.
>
> We have a better solution for this: b516ea586d717
>
> And same as with the last commit: "NVidia Linux driver" that's Nouveau, any
> out of tree driver does _not_ matter. And with Nouveau all of this works even
> though it required a proper fix first, but we have that now.
>
> Signed-off-by: Karol Herbst <[email protected]>
> CC: Alex Hung <[email protected]>
> CC: Rafael J. Wysocki <[email protected]>
> CC: Dave Airlie <[email protected]>
> CC: Lyude Paul <[email protected]>
> CC: Ben Skeggs <[email protected]>
> ---
>  drivers/acpi/osi.c | 8 --------
>  1 file changed, 8 deletions(-)
>
> diff --git a/drivers/acpi/osi.c b/drivers/acpi/osi.c
> index 9b20ac4d79a0..56cc95b6b724 100644
> --- a/drivers/acpi/osi.c
> +++ b/drivers/acpi/osi.c
> @@ -53,14 +53,6 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
>          * be removed if both new and old graphics cards are supported.
>          */
>         {"Linux-Dell-Video", true},
> -       /*
> -        * Linux-Lenovo-NV-HDMI-Audio is used by BIOS to power on NVidia's
> HDMI
> -        * audio device which is turned off for power-saving in Windows OS.
> -        * This power management feature observed on some Lenovo Thinkpad
> -        * systems which will not be able to output audio via HDMI without
> -        * a BIOS workaround.
> -        */
> -       {"Linux-Lenovo-NV-HDMI-Audio", true},
>  };
>  
>  static u32 acpi_osi_handler(acpi_string interface, u32 supported)

--
Sincerely,
Lyude Paul (she/her)
Software Engineer at Red Hat

Note: I deal with a lot of emails and have a lot of bugs on my plate. If you've
asked me a question, are waiting for a review/merge on a patch, etc. and I
haven't responded in a while, please feel free to send me another email to check
on my status. I don't bite!