Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp10430155ybi; Wed, 24 Jul 2019 23:04:45 -0700 (PDT) X-Google-Smtp-Source: APXvYqx1Hs/r4/4AYc0wigsgHPHzT57RFdb4artnIXtfSrWisGyAkY0+cn4LOUH0/gUm60QmbOQg X-Received: by 2002:a62:3895:: with SMTP id f143mr14773015pfa.116.1564034685127; Wed, 24 Jul 2019 23:04:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564034685; cv=none; d=google.com; s=arc-20160816; b=xFVMrvoBbvVUzu2IPmHidbIgGQWAIo3s7+IrALjTJKDDMBL8I0n7Hh8LFAtCK6pt0Q ITbB367W4RCW7xRGiQmlw5CadDbTd81QFkXcGgzefpK/3Ntr+fmALWLaDV6XAnHxlR2s FEYwpsWu4oiYqyTXXUOZnd/RY7L3K0TeaL3y3xBmsPyXvSCvgz6sr+54fQzsAKfxxVu/ OS3gfiyBh2ClxPFy4OVy0SdqP8twC7PqrGh2+yBg1tpCkK2c1XCyKxZtcYxQ1WO2NWl4 bJ00mreanUt8PpfqjG5aFGltStdjvxZMr2RNjzLjXWHfD2pSlqWVa3GoFbzrm3Lzv8L7 Ku5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ZJ0pF7Ram2rwxdecb3SWfR8O31u1o5s7qRLe0cpVobA=; b=qTEj2Sr78hLvb0iZHGT7dI6uVZ3tutNazkXmgij/k69NR2UUGZD3JSQIoMQ1pPvY9B 25DPL28U89aGyd84zgkPCZhRR8X1hEa0GUWElLqxvx74axhQ7hAB7S63HuBQQA7fi7l5 G1GRdaKmz4EPf2Y+nB1ToBoEc47nnSunYxQ4jksa0dupULO0ft64yW7sYBxWxyji7Zh3 4a388gjD2opStQesSd3rvEe9ZLKMhWuLL/Tw5nODSl6qEizTRDAr69X4G5MfwsoFL/Ir fMDgl8uEb4xl9chTAxpAZJ8IglMzkqWwaB06LUAxWd8goer146Eag7iWQ5AwJ8Y/uB/8 IUIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=i3uP1aIU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v8si16264573plp.179.2019.07.24.23.04.30; Wed, 24 Jul 2019 23:04:45 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=i3uP1aIU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391435AbfGYFqb (ORCPT + 99 others); Thu, 25 Jul 2019 01:46:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:34016 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391418AbfGYFqY (ORCPT ); Thu, 25 Jul 2019 01:46:24 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4D98420657; Thu, 25 Jul 2019 05:46:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564033583; bh=C3mhXCl2ZWYBLwyb38j1K9FbAQ3C3952L957kgeENwA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i3uP1aIUzNM+0jDtaBuqCLYaSYI3HUaLWqHk1keklPFQs5g+EmCwYa0bQ1gRrecGh D9sdZbwmMeffD3U227w0rjaw9Fzvv8oWpqru6ofhqrKzs+n7P7d42SYGStjMdepxew soMpxEy+0RvhV5npedHJrbmsFR5/Wudf9tPplVRw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lyude Paul , Marc Meledandri , Ben Skeggs Subject: [PATCH 4.19 217/271] drm/nouveau/i2c: Enable i2c pads & busses during preinit Date: Wed, 24 Jul 2019 21:21:26 +0200 Message-Id: <20190724191713.683472423@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190724191655.268628197@linuxfoundation.org> References: <20190724191655.268628197@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lyude Paul commit 7cb95eeea6706c790571042a06782e378b2561ea upstream. It turns out that while disabling i2c bus access from software when the GPU is suspended was a step in the right direction with: commit 342406e4fbba ("drm/nouveau/i2c: Disable i2c bus access after ->fini()") We also ended up accidentally breaking the vbios init scripts on some older Tesla GPUs, as apparently said scripts can actually use the i2c bus. Since these scripts are executed before initializing any subdevices, we end up failing to acquire access to the i2c bus which has left a number of cards with their fan controllers uninitialized. Luckily this doesn't break hardware - it just means the fan gets stuck at 100%. This also means that we've always been using our i2c busses before initializing them during the init scripts for older GPUs, we just didn't notice it until we started preventing them from being used until init. It's pretty impressive this never caused us any issues before! So, fix this by initializing our i2c pad and busses during subdev pre-init. We skip initializing aux busses during pre-init, as those are guaranteed to only ever be used by nouveau for DP aux transactions. Signed-off-by: Lyude Paul Tested-by: Marc Meledandri Fixes: 342406e4fbba ("drm/nouveau/i2c: Disable i2c bus access after ->fini()") Cc: stable@vger.kernel.org Signed-off-by: Ben Skeggs Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) --- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c @@ -185,6 +185,25 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev } static int +nvkm_i2c_preinit(struct nvkm_subdev *subdev) +{ + struct nvkm_i2c *i2c = nvkm_i2c(subdev); + struct nvkm_i2c_bus *bus; + struct nvkm_i2c_pad *pad; + + /* + * We init our i2c busses as early as possible, since they may be + * needed by the vbios init scripts on some cards + */ + list_for_each_entry(pad, &i2c->pad, head) + nvkm_i2c_pad_init(pad); + list_for_each_entry(bus, &i2c->bus, head) + nvkm_i2c_bus_init(bus); + + return 0; +} + +static int nvkm_i2c_init(struct nvkm_subdev *subdev) { struct nvkm_i2c *i2c = nvkm_i2c(subdev); @@ -238,6 +257,7 @@ nvkm_i2c_dtor(struct nvkm_subdev *subdev static const struct nvkm_subdev_func nvkm_i2c = { .dtor = nvkm_i2c_dtor, + .preinit = nvkm_i2c_preinit, .init = nvkm_i2c_init, .fini = nvkm_i2c_fini, .intr = nvkm_i2c_intr,