Mark Menzynski
2019-Jul-15 09:42 UTC
[Nouveau] [PATCH v2 0/4] Refuse to load if power cables are not connected
Trello: https://trello.com/c/admzDRvd/50-reduce-performance-refuse-to-boot-if-not-all-the-power-connectors-are-plugged Fixed commit messages. Mark Menzynski (4): bios/gpio: sort gpios by values gpio: fail if gpu external power is missing gpio: check the gpio function 16 in the power check as well gpio: check function 76 in the power check as well drm/nouveau/include/nvkm/subdev/bios/gpio.h | 5 ++++- drm/nouveau/nvkm/subdev/gpio/base.c | 25 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) -- 2.21.0
Mark Menzynski
2019-Jul-15 09:42 UTC
[Nouveau] [PATCH v2 1/4] bios/gpio: sort gpios by values
One gpio was in wrong place, moved it for better readability. Signed-off-by: Mark Menzynski <mmenzyns at redhat.com> --- drm/nouveau/include/nvkm/subdev/bios/gpio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drm/nouveau/include/nvkm/subdev/bios/gpio.h b/drm/nouveau/include/nvkm/subdev/bios/gpio.h index b71a3555..2f40935f 100644 --- a/drm/nouveau/include/nvkm/subdev/bios/gpio.h +++ b/drm/nouveau/include/nvkm/subdev/bios/gpio.h @@ -3,9 +3,9 @@ #define __NVBIOS_GPIO_H__ enum dcb_gpio_func_name { DCB_GPIO_PANEL_POWER = 0x01, + DCB_GPIO_FAN = 0x09, DCB_GPIO_TVDAC0 = 0x0c, DCB_GPIO_TVDAC1 = 0x2d, - DCB_GPIO_FAN = 0x09, DCB_GPIO_FAN_SENSE = 0x3d, DCB_GPIO_LOGO_LED_PWM = 0x84, DCB_GPIO_UNUSED = 0xff, -- 2.21.0
Mark Menzynski
2019-Jul-15 09:42 UTC
[Nouveau] [PATCH v2 2/4] 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. Tested on TU104, GP106 and GF100. Signed-off-by: Mark Menzynski <mmenzyns at redhat.com> --- drm/nouveau/include/nvkm/subdev/bios/gpio.h | 1 + drm/nouveau/nvkm/subdev/gpio/base.c | 23 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/drm/nouveau/include/nvkm/subdev/bios/gpio.h b/drm/nouveau/include/nvkm/subdev/bios/gpio.h index 2f40935f..a70ec9e8 100644 --- a/drm/nouveau/include/nvkm/subdev/bios/gpio.h +++ b/drm/nouveau/include/nvkm/subdev/bios/gpio.h @@ -7,6 +7,7 @@ enum dcb_gpio_func_name { DCB_GPIO_TVDAC0 = 0x0c, DCB_GPIO_TVDAC1 = 0x2d, DCB_GPIO_FAN_SENSE = 0x3d, + DCB_GPIO_EXT_POWER_LOW = 0x79, DCB_GPIO_LOGO_LED_PWM = 0x84, DCB_GPIO_UNUSED = 0xff, DCB_GPIO_VID0 = 0x04, diff --git a/drm/nouveau/nvkm/subdev/gpio/base.c b/drm/nouveau/nvkm/subdev/gpio/base.c index 1399d923..c4685807 100644 --- a/drm/nouveau/nvkm/subdev/gpio/base.c +++ b/drm/nouveau/nvkm/subdev/gpio/base.c @@ -182,12 +182,35 @@ static const struct dmi_system_id gpio_reset_ids[] = { { } }; +static enum dcb_gpio_func_name power_checks[] = { + DCB_GPIO_EXT_POWER_LOW, +}; + static int nvkm_gpio_init(struct nvkm_subdev *subdev) { struct nvkm_gpio *gpio = nvkm_gpio(subdev); + struct dcb_gpio_func func; + int ret; + int i; + if (dmi_check_system(gpio_reset_ids)) nvkm_gpio_reset(gpio, DCB_GPIO_UNUSED); + + 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) { + nvkm_error(&gpio->subdev, + "not enough power, check GPU power cable\n"); + return -EINVAL; + } + } + return 0; } -- 2.21.0
Mark Menzynski
2019-Jul-15 09:42 UTC
[Nouveau] [PATCH v2 3/4] gpio: check the gpio function 16 in the power check as well
Added GPIO is "Thermal and External Power Detect". It's uncertain if this GPIO is set on GPU initialization or only if a change is detected by the GPU at runtime. This GPIO can be found in Rankine and Curie and rarely on Tesla GPUs VBIOS. Untested, wrote according to documentation. Signed-off-by: Mark Menzynski <mmenzyns at redhat.com> --- drm/nouveau/include/nvkm/subdev/bios/gpio.h | 1 + drm/nouveau/nvkm/subdev/gpio/base.c | 1 + 2 files changed, 2 insertions(+) diff --git a/drm/nouveau/include/nvkm/subdev/bios/gpio.h b/drm/nouveau/include/nvkm/subdev/bios/gpio.h index a70ec9e8..fc2b5fb0 100644 --- a/drm/nouveau/include/nvkm/subdev/bios/gpio.h +++ b/drm/nouveau/include/nvkm/subdev/bios/gpio.h @@ -5,6 +5,7 @@ enum dcb_gpio_func_name { DCB_GPIO_PANEL_POWER = 0x01, DCB_GPIO_FAN = 0x09, DCB_GPIO_TVDAC0 = 0x0c, + DCB_GPIO_THERM_EXT_POWER_EVENT = 0x10, DCB_GPIO_TVDAC1 = 0x2d, DCB_GPIO_FAN_SENSE = 0x3d, DCB_GPIO_EXT_POWER_LOW = 0x79, diff --git a/drm/nouveau/nvkm/subdev/gpio/base.c b/drm/nouveau/nvkm/subdev/gpio/base.c index c4685807..0c886543 100644 --- a/drm/nouveau/nvkm/subdev/gpio/base.c +++ b/drm/nouveau/nvkm/subdev/gpio/base.c @@ -183,6 +183,7 @@ static const struct dmi_system_id gpio_reset_ids[] = { }; static enum dcb_gpio_func_name power_checks[] = { + DCB_GPIO_THERM_EXT_POWER_EVENT, DCB_GPIO_EXT_POWER_LOW, }; -- 2.21.0
Mark Menzynski
2019-Jul-15 09:42 UTC
[Nouveau] [PATCH v2 4/4] gpio: check function 76 in the power check as well
Added GPIO is "Power Alert". It's uncertain if this GPIO is set on GPU initialization or only if a change is detected by the GPU at runtime. This GPIO can be found on Tesla and sometimes on Fermi GPUs. Untested, wrote according to documentation. Signed-off-by: Mark Menzynski <mmenzyns at redhat.com> --- drm/nouveau/include/nvkm/subdev/bios/gpio.h | 1 + drm/nouveau/nvkm/subdev/gpio/base.c | 1 + 2 files changed, 2 insertions(+) diff --git a/drm/nouveau/include/nvkm/subdev/bios/gpio.h b/drm/nouveau/include/nvkm/subdev/bios/gpio.h index fc2b5fb0..784c5f22 100644 --- a/drm/nouveau/include/nvkm/subdev/bios/gpio.h +++ b/drm/nouveau/include/nvkm/subdev/bios/gpio.h @@ -8,6 +8,7 @@ enum dcb_gpio_func_name { DCB_GPIO_THERM_EXT_POWER_EVENT = 0x10, DCB_GPIO_TVDAC1 = 0x2d, DCB_GPIO_FAN_SENSE = 0x3d, + DCB_GPIO_POWER_ALERT = 0x4c, DCB_GPIO_EXT_POWER_LOW = 0x79, DCB_GPIO_LOGO_LED_PWM = 0x84, DCB_GPIO_UNUSED = 0xff, diff --git a/drm/nouveau/nvkm/subdev/gpio/base.c b/drm/nouveau/nvkm/subdev/gpio/base.c index 0c886543..755f016f 100644 --- a/drm/nouveau/nvkm/subdev/gpio/base.c +++ b/drm/nouveau/nvkm/subdev/gpio/base.c @@ -184,6 +184,7 @@ static const struct dmi_system_id gpio_reset_ids[] = { static enum dcb_gpio_func_name power_checks[] = { DCB_GPIO_THERM_EXT_POWER_EVENT, + DCB_GPIO_POWER_ALERT, DCB_GPIO_EXT_POWER_LOW, }; -- 2.21.0
Ilia Mirkin
2019-Jul-15 12:26 UTC
[Nouveau] [PATCH v2 2/4] gpio: fail if gpu external power is missing
Please add a config override to skip this, since we'll invariably get it wrong for some setup, and should be able to provide users with workarounds while the issue is being worked out. On Mon, Jul 15, 2019 at 5:43 AM Mark Menzynski <mmenzyns at redhat.com> wrote:> > 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. > > Tested on TU104, GP106 and GF100. > > Signed-off-by: Mark Menzynski <mmenzyns at redhat.com> > --- > drm/nouveau/include/nvkm/subdev/bios/gpio.h | 1 + > drm/nouveau/nvkm/subdev/gpio/base.c | 23 +++++++++++++++++++++ > 2 files changed, 24 insertions(+) > > diff --git a/drm/nouveau/include/nvkm/subdev/bios/gpio.h b/drm/nouveau/include/nvkm/subdev/bios/gpio.h > index 2f40935f..a70ec9e8 100644 > --- a/drm/nouveau/include/nvkm/subdev/bios/gpio.h > +++ b/drm/nouveau/include/nvkm/subdev/bios/gpio.h > @@ -7,6 +7,7 @@ enum dcb_gpio_func_name { > DCB_GPIO_TVDAC0 = 0x0c, > DCB_GPIO_TVDAC1 = 0x2d, > DCB_GPIO_FAN_SENSE = 0x3d, > + DCB_GPIO_EXT_POWER_LOW = 0x79, > DCB_GPIO_LOGO_LED_PWM = 0x84, > DCB_GPIO_UNUSED = 0xff, > DCB_GPIO_VID0 = 0x04, > diff --git a/drm/nouveau/nvkm/subdev/gpio/base.c b/drm/nouveau/nvkm/subdev/gpio/base.c > index 1399d923..c4685807 100644 > --- a/drm/nouveau/nvkm/subdev/gpio/base.c > +++ b/drm/nouveau/nvkm/subdev/gpio/base.c > @@ -182,12 +182,35 @@ static const struct dmi_system_id gpio_reset_ids[] = { > { } > }; > > +static enum dcb_gpio_func_name power_checks[] = { > + DCB_GPIO_EXT_POWER_LOW, > +}; > + > static int > nvkm_gpio_init(struct nvkm_subdev *subdev) > { > struct nvkm_gpio *gpio = nvkm_gpio(subdev); > + struct dcb_gpio_func func; > + int ret; > + int i; > + > if (dmi_check_system(gpio_reset_ids)) > nvkm_gpio_reset(gpio, DCB_GPIO_UNUSED); > + > + 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) { > + nvkm_error(&gpio->subdev, > + "not enough power, check GPU power cable\n"); > + return -EINVAL; > + } > + } > + > return 0; > } > > -- > 2.21.0 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau
Reasonably Related Threads
- [PATCH 2/4] gpio: checking if gpu power cable is connected
- [PATCH v2 2/4] gpio: fail if gpu external power is missing
- [PATCH v2 2/4] gpio: fail if gpu external power is missing
- [PATCH 3/4] gpio: added power check for another GPIO
- [PATCH v2 0/4] Refuse to load if power cables are not connected