[Nouveau] [PATCH v2 2/4] gpio: fail if gpu external power is missing

Ilia Mirkin imirkin at alum.mit.edu
Mon Jul 15 12:26:02 UTC 2019


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


More information about the Nouveau mailing list