Commit 72251fac authored by Mark Menzynski's avatar Mark Menzynski Committed by Ben Skeggs

drm/nouveau/gpio: fail if gpu external power is missing

Currently, nouveau doesn't check if GPU is missing power. This
patch makes nouveau fail when this happens on latest GPUs.

It checks GPIO function 121 (External Power Emergency), which
should detect power problems on GPU initialization.

This can be disabled with nouveau.config=NvPowerChecks=1

Tested on TU104, GP106 and GF100.

v3:
*  Add config override for disabling power checks
Signed-off-by: default avatarMark Menzynski <mmenzyns@redhat.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e79ef1c0
...@@ -7,6 +7,7 @@ enum dcb_gpio_func_name { ...@@ -7,6 +7,7 @@ enum dcb_gpio_func_name {
DCB_GPIO_TVDAC0 = 0x0c, DCB_GPIO_TVDAC0 = 0x0c,
DCB_GPIO_TVDAC1 = 0x2d, DCB_GPIO_TVDAC1 = 0x2d,
DCB_GPIO_FAN_SENSE = 0x3d, DCB_GPIO_FAN_SENSE = 0x3d,
DCB_GPIO_EXT_POWER_LOW = 0x79,
DCB_GPIO_LOGO_LED_PWM = 0x84, DCB_GPIO_LOGO_LED_PWM = 0x84,
DCB_GPIO_UNUSED = 0xff, DCB_GPIO_UNUSED = 0xff,
DCB_GPIO_VID0 = 0x04, DCB_GPIO_VID0 = 0x04,
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#include "priv.h" #include "priv.h"
#include <core/option.h>
#include <core/notify.h> #include <core/notify.h>
static int static int
...@@ -182,12 +183,41 @@ static const struct dmi_system_id gpio_reset_ids[] = { ...@@ -182,12 +183,41 @@ static const struct dmi_system_id gpio_reset_ids[] = {
{ } { }
}; };
static enum dcb_gpio_func_name power_checks[] = {
DCB_GPIO_EXT_POWER_LOW,
};
static int static int
nvkm_gpio_init(struct nvkm_subdev *subdev) nvkm_gpio_init(struct nvkm_subdev *subdev)
{ {
struct nvkm_gpio *gpio = nvkm_gpio(subdev); struct nvkm_gpio *gpio = nvkm_gpio(subdev);
struct dcb_gpio_func func;
int ret;
int i;
if (dmi_check_system(gpio_reset_ids)) if (dmi_check_system(gpio_reset_ids))
nvkm_gpio_reset(gpio, DCB_GPIO_UNUSED); nvkm_gpio_reset(gpio, DCB_GPIO_UNUSED);
if (nvkm_boolopt(subdev->device->cfgopt, "NvPowerChecks", true)) {
for (i = 0; i < ARRAY_SIZE(power_checks); ++i) {
ret = nvkm_gpio_find(gpio, 0, power_checks[i],
DCB_GPIO_UNUSED, &func);
if (ret)
continue;
ret = nvkm_gpio_get(gpio, 0, func.func, func.line);
if (!ret)
continue;
nvkm_error(&gpio->subdev,
"GPU is missing power, check its power "
"cables. Boot with "
"nouveau.config=NvPowerChecks=0 to "
"disable.\n");
return -EINVAL;
}
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment