From patchwork Tue Nov 6 16:24:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 993812 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="HJyl0CSO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42qFHS6N1Yz9s9G for ; Wed, 7 Nov 2018 03:24:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389269AbeKGBuR (ORCPT ); Tue, 6 Nov 2018 20:50:17 -0500 Received: from mail-ed1-f68.google.com ([209.85.208.68]:38879 "EHLO mail-ed1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387685AbeKGBuR (ORCPT ); Tue, 6 Nov 2018 20:50:17 -0500 Received: by mail-ed1-f68.google.com with SMTP id a2-v6so6409835edi.5 for ; Tue, 06 Nov 2018 08:24:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=89wCfnKjUNxniCDAg5GHf1J6Fhcjz4+rL3T1rMaJdQk=; b=HJyl0CSOTzQrs4pMUraoUAp79/of18va7aKFhDxce1LbKc5tTh4rI7lIWsDa71P50r 0IWC+cgLqZ8BsJW2Xj59hPG4lOB9ojLUzqklXblp2TsVBQCceiZHjpGaND6SZ4vU1vhM 3LVgMEZcdR1KUEbdGQxySUoFWLImbaj2thQeOa1a64tsB4m9OMQES4ei1kp+T6YOPEMH mIH07kl8a7nn4gIgI80LLXJrf0f0FOnq+EYLABDD3Bs8HolwQljPawZ2cvB9M82BoLuL 8ZF19yk8m8tMRKasEk7Vah3cR/PCIwa63IlheZLRSGc9OulDorxUtlYoL6pOwL+/ueBD ixqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=89wCfnKjUNxniCDAg5GHf1J6Fhcjz4+rL3T1rMaJdQk=; b=Ehlk3zpDDL8WBmfUrE4mlR/kpkBt+ebao48qwfzjbjMpx7NutgPq6mviBMkp4qeiL+ x5rMlbXiK7G4HdY6QTRGNyZlT82lQxKfeL4uNiLuRMok8HSOeAxvwsp3usnmvKyINwE9 Gl4GTcdsrJWXyyr6Pkd+1ORnp5fHcXFMPTWCFpTzklrhG4nFs324MsT47weDMz5t1jBD npOvYyWXNzG9yKEQ+1Fw8SoffK7mmfmDyVOsLg6N6yuSO3JMdJquM+pON6viyGs4MIzq PLurAzWs55yhTayDDjNxKE6mdH0d0ATsIc54SrNUlNsLfa6jZvB1F3jCugO8NgBUAEMw wbqw== X-Gm-Message-State: AGRZ1gJARtMfMA6+666mjcEeGW2zBtx9zPv92wSlNvEjhFPplRTq9TQm Z/xnrhX9ljR7LdNm1mAwpTE= X-Google-Smtp-Source: AJdET5dApr07IBxbNurAlA184kEzfQDXwPxszBl6ILK7Y4s1TF5SG/7NJ1ueRFWKdYdvjUl+M5pS3A== X-Received: by 2002:aa7:cfc3:: with SMTP id r3-v6mr22639578edy.208.1541521457300; Tue, 06 Nov 2018 08:24:17 -0800 (PST) Received: from localhost (pD9E511F8.dip0.t-ipconnect.de. [217.229.17.248]) by smtp.gmail.com with ESMTPSA id s6-v6sm6980978edh.89.2018.11.06.08.24.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 06 Nov 2018 08:24:16 -0800 (PST) From: Thierry Reding To: Ben Skeggs Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org Subject: [PATCH] drm/nouveau: tegra: Initialize mode configuration Date: Tue, 6 Nov 2018 17:24:15 +0100 Message-Id: <20181106162415.3578-1-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Irrespective of whether or not the device has any usable outputs, the modesetting helpers will try to register all the resources such as CRTCs and planes. Unfortunately, the helpers rely on drm_mode_config_init() to properly set up internal data structures. Since the Tegra GPU does not have a display engine, the Nouveau driver doesn't set this up for Tegra, which results in the following oops on driver probe: [ 18.776221] Unable to handle kernel NULL pointer dereference at virtual address 0000006c [ 18.785401] pgd = 16bb93b7 [ 18.789331] [0000006c] *pgd=ad58c003, *pmd=00000000 [ 18.800757] Internal error: Oops: 206 [#1] PREEMPT SMP ARM [ 18.806233] Modules linked in: nouveau(+) ttm tegra_drm [ 18.811457] CPU: 1 PID: 245 Comm: systemd-udevd Not tainted 4.20.0-rc1 #36 [ 18.818324] Hardware name: NVIDIA Tegra SoC (Flattened Device Tree) [ 18.824596] PC is at drm_plane_register_all+0x18/0x50 [ 18.824601] LR is at drm_modeset_register_all+0xc/0x70 [ 18.824604] pc : [] lr : [] psr: a0000113 [ 18.824607] sp : ed5dfc70 ip : ed742d40 fp : 00000000 [ 18.824610] r10: 00000018 r9 : ed742d00 r8 : 00000000 [ 18.824613] r7 : bf26ac80 r6 : 00000000 r5 : ed155650 r4 : fffffffc [ 18.824616] r3 : 0002f000 r2 : ffffffff r1 : 2df30000 r0 : ed155400 [ 18.824621] Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user [ 18.824624] Control: 30c5387d Table: aeb18840 DAC: 55555555 [ 18.824628] Process systemd-udevd (pid: 245, stack limit = 0xc66954c3) [ 18.824633] Stack: (0xed5dfc70 to 0xed5e0000) [ 18.824636] fc60: ed155400 ed155400 00000000 c068e45c [ 18.824641] fc80: ed155400 00000000 00000000 c06751a4 00000001 00000001 ffffffff ffffffff [ 18.905936] fca0: ed5dfcc0 c1204c88 ed155400 00000000 00000000 00000000 bf268c5c bf1c5cd4 [ 18.914108] fcc0: ed710c08 9543847b 00000000 eea34810 00000000 bf268c5c 00000000 c06a3f64 [ 18.923651] fce0: c131dd70 eea34810 c131dd74 00000000 00000000 c06a2084 eea34810 bf268c5c [ 18.932934] fd00: eea34844 c06a23e0 00000000 c1204c88 bf26a980 c06a22d4 eefd093c c06a23e0 [ 18.941096] fd20: 00000000 eea34810 bf268c5c eea34844 c06a23e0 00000000 c1204c88 bf26a980 [ 18.949259] fd40: 00000000 c06a24bc eea387b4 c1204c88 bf268c5c c06a038c 00000000 ee88335c [ 18.957417] fd60: eea387b4 9543847b c1275a88 bf268c5c ed12b800 c1275a88 00000000 c06a1528 [ 18.965580] fd80: bf245be8 bf268ac8 ffffe000 bf268c5c bf268ac8 ffffe000 bf292000 c06a30d8 [ 18.973746] fda0: bf26ab80 bf268ac8 ffffe000 bf292170 c12cf160 c1204c88 ffffe000 c0202dbc [ 18.981913] fdc0: ed667700 006000c0 c02b2844 0000000c 600d0013 bf26a980 00000040 c03650f8 [ 18.990079] fde0: a00d0013 2defd000 ee800000 006000c0 006000c0 c02b2844 0000000c c03666f4 [ 18.998244] fe00: c0358254 a00d0013 bf26a980 9543847b bf26a980 00000001 ed667700 00000001 [ 19.006404] fe20: ed1d9ee4 c02b2880 c1204c88 bf26a980 00000000 ed5dff40 00000001 ed1d9ec0 [ 19.014569] fe40: 00000001 c02b48c8 bf26a98c 00007fff bf26a980 c02b1a00 00000000 c02b1214 [ 19.022735] fe60: bf26a9c8 bf26aa80 bf26ab5c bf26aab0 c0c0387c c0e62374 c0db80fc c0db8108 [ 19.030901] fe80: c0db8160 c1204c88 bf000000 ed1296c0 06c18a20 00000000 ed1296c0 c1204c88 [ 19.039068] fea0: 00000000 00000000 00000000 00000000 00000000 00000000 6e72656b 00006c65 [ 19.047228] fec0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 19.055393] fee0: 00000000 00000000 00000000 00000000 00000000 9543847b 7fffffff c1204c88 [ 19.063558] ff00: 00000000 0000000f b6c51c58 c0201204 ed5de000 0000017b bea73b0c c02b5188 [ 19.071723] ff20: 7fffffff 00000000 00000003 c0334b4c 00000002 f1bc1000 06c18a20 00000000 [ 19.079890] ff40: f1d0c3aa f1d24e80 f1bc1000 06c18a20 f87d90c0 f87d8e60 f70d7798 0016a000 [ 19.088056] ff60: 0017e730 00000000 00000000 00000000 00050ba8 00000039 0000003a 00000022 [ 19.096215] ff80: 00000000 00000013 00000000 9543847b 000000c0 00000000 b6c51c58 0000000f [ 19.104378] ffa0: 0000017b c02011d4 00000000 b6c51c58 0000000f b6c51c58 00000000 00559220 [ 19.112543] ffc0: 00000000 b6c51c58 0000000f 0000017b 00000000 00000000 00546958 bea73b0c [ 19.120708] ffe0: bea73af8 bea73ae8 b6c44c14 b6b4b710 600d0010 0000000f 00000000 00000000 [ 19.128884] [] (drm_plane_register_all) from [] (drm_modeset_register_all+0xc/0x70) [ 19.138273] [] (drm_modeset_register_all) from [] (drm_dev_register+0x168/0x1c4) [ 19.147581] [] (drm_dev_register) from [] (nouveau_platform_probe+0x6c/0x88 [nouveau]) [ 19.157434] [] (nouveau_platform_probe [nouveau]) from [] (platform_drv_probe+0x48/0x98) [ 19.167256] [] (platform_drv_probe) from [] (really_probe+0x1e0/0x2cc) [ 19.175516] [] (really_probe) from [] (driver_probe_device+0x60/0x16c) [ 19.183777] [] (driver_probe_device) from [] (__driver_attach+0xdc/0xe0) [ 19.192210] [] (__driver_attach) from [] (bus_for_each_dev+0x74/0xb4) [ 19.200383] [] (bus_for_each_dev) from [] (bus_add_driver+0x1c0/0x204) [ 19.208644] [] (bus_add_driver) from [] (driver_register+0x74/0x108) [ 19.216928] [] (driver_register) from [] (nouveau_drm_init+0x170/0x1000 [nouveau]) [ 19.226429] [] (nouveau_drm_init [nouveau]) from [] (do_one_initcall+0x54/0x284) [ 19.235557] [] (do_one_initcall) from [] (do_init_module+0x64/0x214) [ 19.243643] [] (do_init_module) from [] (load_module+0x1e30/0x24a8) [ 19.251643] [] (load_module) from [] (sys_finit_module+0xc4/0xdc) [ 19.259470] [] (sys_finit_module) from [] (__sys_trace_return+0x0/0x2c) [ 19.267807] Exception stack(0xed5dffa8 to 0xed5dfff0) [ 19.272853] ffa0: 00000000 b6c51c58 0000000f b6c51c58 00000000 00559220 [ 19.281018] ffc0: 00000000 b6c51c58 0000000f 0000017b 00000000 00000000 00546958 bea73b0c [ 19.289182] ffe0: bea73af8 bea73ae8 b6c44c14 b6b4b710 [ 19.294224] Code: e5b54250 e1550004 0a00000c e2444004 (e5943070) [ 19.300863] ---[ end trace 7cb25d313b9a3b9d ]--- Fix this by initializing the mode configuration structure in the Tegra case as well. No other modeset helper setup is required. Signed-off-by: Thierry Reding --- drivers/gpu/drm/nouveau/nouveau_platform.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/nouveau/nouveau_platform.c b/drivers/gpu/drm/nouveau/nouveau_platform.c index 039e23548e08..1d4c895b379d 100644 --- a/drivers/gpu/drm/nouveau/nouveau_platform.c +++ b/drivers/gpu/drm/nouveau/nouveau_platform.c @@ -34,6 +34,8 @@ static int nouveau_platform_probe(struct platform_device *pdev) if (IS_ERR(drm)) return PTR_ERR(drm); + drm_mode_config_init(drm); + ret = drm_dev_register(drm, 0); if (ret < 0) { drm_dev_put(drm); @@ -46,7 +48,10 @@ static int nouveau_platform_probe(struct platform_device *pdev) static int nouveau_platform_remove(struct platform_device *pdev) { struct drm_device *dev = platform_get_drvdata(pdev); + + drm_mode_config_cleanup(dev); nouveau_drm_device_remove(dev); + return 0; }