From patchwork Mon Nov 27 10:07:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 841569 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; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UkYejuH0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yljDL5RwFz9s9Y for ; Mon, 27 Nov 2017 21:08:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752146AbdK0KIQ (ORCPT ); Mon, 27 Nov 2017 05:08:16 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:45283 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751277AbdK0KIL (ORCPT ); Mon, 27 Nov 2017 05:08:11 -0500 Received: by mail-wm0-f67.google.com with SMTP id 9so32838765wme.4 for ; Mon, 27 Nov 2017 02:08:11 -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:in-reply-to:references; bh=J6EUhQ8NH7PU1+OJOxbxQTeTsdGygfF2H0s60zqzFB0=; b=UkYejuH03yXPa1F+upmRRPMmvghlgF57EdIQ57HCd9mHz9+YULaSTpd0o8T/3KSGNj rW2ueHCxv1iP6kDkj0ax6Kv5xXzim0wEZlhxJ8MFdmv6jIRRP/44F0mJJt/HBz8CqBhH uwuCsgx8VY8c3V5qGTuTEFBdz1gLn5OANcT+kJyWt0dcroYuvyf5DfNeIPvEDfra5hfJ 6G2EwgFzbuIBXC3RWyz6AXBpXZpdL3ihqSkWe5qcy5NJvCNoVGNgk1aEEOHfaK1p+bsM qJWhYVlzqMMg9Txry5IQcyctLPWS0iBdZh5VFTbBsPNtoT3/vuM1VEcbTvc+GkWAJ8xA ZwPQ== 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:in-reply-to :references; bh=J6EUhQ8NH7PU1+OJOxbxQTeTsdGygfF2H0s60zqzFB0=; b=pUf1ZeNVE0qfYLjbp99KOSFcW+f+/As1bBapGVaDjRCs0+nIHgESFKtdMCFEhHHldq madOgUM4QnzS+tWcND63sis5kW5Ut2HF2/ZN0ezFZpVqYfzRG84437iJ0uQvykmOk+Q8 tgAOkvYdoGPodsY35SvYLaTfW9ZdBa+nU+O34lFI0bs9XOWkIjaRMNZZnagmVbStYWyq VJnSWl0ELnzKRzKveBjHL0Zu8yJcS+m9VyWqgW/xuTf5uPesCyjVM11u0YwfRDsHhwz1 r8X3o/6IjuDUg3tYuKwBxqS1AhAaS8r2fGY8N1waDOIIV2bL1QWmlj0WN1qi1P0HIHEy mdMw== X-Gm-Message-State: AJaThX4j8dL0Vdn6GVMtvnZg4eWbTmNDJMdbr8Zy0ZZlAk/DGj+RLDsR JJpYdqArOuvQjs4XmN7PFNWmog== X-Google-Smtp-Source: AGs4zMbmpFEo3aAbjB7c7wSGFi7qDjdXLvuGMdcrrWdEBBWnJeVi4vWhyuIqT57hb2AqV9Hw1j03Kg== X-Received: by 10.28.19.1 with SMTP id 1mr14528127wmt.20.1511777290313; Mon, 27 Nov 2017 02:08:10 -0800 (PST) Received: from localhost (p200300E41F200F003F65F430A8AE2E44.dip0.t-ipconnect.de. [2003:e4:1f20:f00:3f65:f430:a8ae:2e44]) by smtp.gmail.com with ESMTPSA id d1sm8746271wra.44.2017.11.27.02.08.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 27 Nov 2017 02:08:09 -0800 (PST) From: Thierry Reding To: Thierry Reding Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org Subject: [PATCH 07/13] drm/tegra: dsi: Register debugfs in ->late_register() Date: Mon, 27 Nov 2017 11:07:52 +0100 Message-Id: <20171127100758.22149-8-thierry.reding@gmail.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171127100758.22149-1-thierry.reding@gmail.com> References: <20171127100758.22149-1-thierry.reding@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding The ->late_register() and ->early_unregister() callbacks are called at the right time to make sure userspace only accesses interfaces when it should. Move debugfs registration and unregistration to these callback functions to avoid potential races with userspace. Signed-off-by: Thierry Reding --- drivers/gpu/drm/tegra/dsi.c | 58 ++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c index 4a78af08df82..4d2ed966f9e3 100644 --- a/drivers/gpu/drm/tegra/dsi.c +++ b/drivers/gpu/drm/tegra/dsi.c @@ -65,8 +65,6 @@ struct tegra_dsi { struct clk *clk; struct drm_info_list *debugfs_files; - struct drm_minor *minor; - struct dentry *debugfs; unsigned long flags; enum mipi_dsi_pixel_format format; @@ -230,58 +228,46 @@ static struct drm_info_list debugfs_files[] = { { "regs", tegra_dsi_show_regs, 0, NULL }, }; -static int tegra_dsi_debugfs_init(struct tegra_dsi *dsi, - struct drm_minor *minor) +static int tegra_dsi_late_register(struct drm_connector *connector) { - const char *name = dev_name(dsi->dev); - unsigned int i; + struct tegra_output *output = connector_to_output(connector); + unsigned int i, count = ARRAY_SIZE(debugfs_files); + struct drm_minor *minor = connector->dev->primary; + struct dentry *root = connector->debugfs_entry; + struct tegra_dsi *dsi = to_dsi(output); int err; - dsi->debugfs = debugfs_create_dir(name, minor->debugfs_root); - if (!dsi->debugfs) - return -ENOMEM; - dsi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files), GFP_KERNEL); - if (!dsi->debugfs_files) { - err = -ENOMEM; - goto remove; - } + if (!dsi->debugfs_files) + return -ENOMEM; - for (i = 0; i < ARRAY_SIZE(debugfs_files); i++) + for (i = 0; i < count; i++) dsi->debugfs_files[i].data = dsi; - err = drm_debugfs_create_files(dsi->debugfs_files, - ARRAY_SIZE(debugfs_files), - dsi->debugfs, minor); + err = drm_debugfs_create_files(dsi->debugfs_files, count, root, minor); if (err < 0) goto free; - dsi->minor = minor; - return 0; free: kfree(dsi->debugfs_files); dsi->debugfs_files = NULL; -remove: - debugfs_remove(dsi->debugfs); - dsi->debugfs = NULL; return err; } -static void tegra_dsi_debugfs_exit(struct tegra_dsi *dsi) +static void tegra_dsi_early_unregister(struct drm_connector *connector) { - drm_debugfs_remove_files(dsi->debugfs_files, ARRAY_SIZE(debugfs_files), - dsi->minor); - dsi->minor = NULL; + struct tegra_output *output = connector_to_output(connector); + unsigned int count = ARRAY_SIZE(debugfs_files); + struct tegra_dsi *dsi = to_dsi(output); + drm_debugfs_remove_files(dsi->debugfs_files, count, + connector->dev->primary); kfree(dsi->debugfs_files); dsi->debugfs_files = NULL; - - debugfs_remove(dsi->debugfs); - dsi->debugfs = NULL; } #define PKT_ID0(id) ((((id) & 0x3f) << 3) | (1 << 9)) @@ -823,6 +809,8 @@ static const struct drm_connector_funcs tegra_dsi_connector_funcs = { .destroy = tegra_output_connector_destroy, .atomic_duplicate_state = tegra_dsi_connector_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + .late_register = tegra_dsi_late_register, + .early_unregister = tegra_dsi_early_unregister, }; static enum drm_mode_status @@ -1076,12 +1064,6 @@ static int tegra_dsi_init(struct host1x_client *client) dsi->output.encoder.possible_crtcs = 0x3; } - if (IS_ENABLED(CONFIG_DEBUG_FS)) { - err = tegra_dsi_debugfs_init(dsi, drm->primary); - if (err < 0) - dev_err(dsi->dev, "debugfs setup failed: %d\n", err); - } - return 0; } @@ -1090,10 +1072,6 @@ static int tegra_dsi_exit(struct host1x_client *client) struct tegra_dsi *dsi = host1x_client_to_dsi(client); tegra_output_exit(&dsi->output); - - if (IS_ENABLED(CONFIG_DEBUG_FS)) - tegra_dsi_debugfs_exit(dsi); - regulator_disable(dsi->vdd); return 0;