From nobody Tue Dec 16 23:29:00 2025 Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 487C023AE60 for ; Mon, 10 Feb 2025 14:57:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.190 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739199436; cv=none; b=dKIzTQ+uuzCkx9kXj2pZ4jY5bmXBhH1OyKeuvPssiom2zqEF9nK4IWqkqZ871CMi0jO5vYGlsTt8KFO/KtJJv08qIBC93CJ3GKJWH7eHu4Vi/FoFpg6Wk0eff5/noSHWzydmUoSpwtslWeBjp+ZObcNPesGA3njZ6J43TTtj088= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739199436; c=relaxed/simple; bh=yPDOVSvCwTTeGkyajdfv3OA7YEkFKbIRRUEe3Luktt0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Z1QLHiegRgU2WHPARc8Aux4QDV+Q4VledtnESQNnMw/HC4/EczP7NRXo7f1t9ejOCyPCur2ldPB/bbELuO1BJDKcOgqWluU3s8W2iwmOIVEs3VWWqS1Do4tMkNSCE9JDpmAQcI9yo4/+t7zKyc3QegeVi6S2aH5D7V83Zqu37Y4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.190 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Ys6yb16LBz2FctR; Mon, 10 Feb 2025 22:53:27 +0800 (CST) Received: from kwepemd500013.china.huawei.com (unknown [7.221.188.12]) by mail.maildlp.com (Postfix) with ESMTPS id AB3671A016C; Mon, 10 Feb 2025 22:57:10 +0800 (CST) Received: from localhost.huawei.com (10.169.71.169) by kwepemd500013.china.huawei.com (7.221.188.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1258.34; Mon, 10 Feb 2025 22:57:09 +0800 From: Yongbang Shi To: , , , , , , , CC: , , , , , , , , Subject: [PATCH v2 drm-dp 6/7] drm/hisilicon/hibmc: Add drm debugfs functions Date: Mon, 10 Feb 2025 22:49:58 +0800 Message-ID: <20250210144959.100551-7-shiyongbang@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250210144959.100551-1-shiyongbang@huawei.com> References: <20250210144959.100551-1-shiyongbang@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemd500013.china.huawei.com (7.221.188.12) Content-Type: text/plain; charset="utf-8" From: Baihan Li We use the previous two patches as our debug functions and generate two files. "hibmc-dp" and "color-bar". hibmc-dp: read only, print the dp link status and dpcd version color-bar: read/write write: cfg color bar and enable/disable it by your input read: print your current cfg info of color-bar Signed-off-by: Baihan Li Signed-off-by: Yongbang Shi --- ChangeLog: v1 -> v2: - deleting edid decoder and its debugfs, suggested by Dmitry Baryshkov. - using debugfs_init() callback, suggested by Dmitry Baryshkov. --- drivers/gpu/drm/hisilicon/hibmc/Makefile | 3 +- .../drm/hisilicon/hibmc/hibmc_drm_debugfs.c | 124 ++++++++++++++++++ .../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 1 + .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 2 + 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile b/drivers/gpu/drm/his= ilicon/hibmc/Makefile index 43de077d6769..1f65c683282f 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/Makefile +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only hibmc-drm-y :=3D hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_vdac.o hibmc_drm= _i2c.o \ - dp/dp_aux.o dp/dp_link.o dp/dp_hw.o dp/dp_serdes.o hibmc_drm_dp.o + dp/dp_aux.o dp/dp_link.o dp/dp_hw.o dp/dp_serdes.o hibmc_drm_dp.o \ + hibmc_drm_debugfs.o =20 obj-$(CONFIG_DRM_HISI_HIBMC) +=3D hibmc-drm.o diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c b/drivers/= gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c new file mode 100644 index 000000000000..af2efb70d6ea --- /dev/null +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Copyright (c) 2024 Hisilicon Limited. + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "hibmc_drm_drv.h" + +static int hibmc_dp_show(struct seq_file *m, void *arg) +{ + struct drm_info_node *node =3D m->private; + struct drm_device *dev =3D node->minor->dev; + struct hibmc_drm_private *priv =3D to_hibmc_drm_private(dev); + int idx; + + if (!drm_dev_enter(dev, &idx)) + return -ENODEV; + + seq_printf(m, "enable lanes: %u\n", hibmc_dp_get_lanes(&priv->dp)); + seq_printf(m, "link rate: %d\n", hibmc_dp_get_link_rate(&priv->dp) * 27); + seq_printf(m, "dpcd version: 0x%x\n", hibmc_dp_get_dpcd(&priv->dp)); + + drm_dev_exit(idx); + + return 0; +} + +static ssize_t hibmc_control_write(struct file *file, const char __user *u= ser_buf, + size_t size, loff_t *ppos) +{ + struct hibmc_drm_private *priv =3D file_inode(file)->i_private; + struct hibmc_dp_cbar_cfg *cfg =3D &priv->dp.cfg; + u32 input =3D 0; + int ret, idx; + u8 val; + + ret =3D kstrtou32_from_user(user_buf, size, 0, &input); + if (ret) + return ret; + + val =3D FIELD_GET(GENMASK(13, 10), input); + if (val > 9) + return -EINVAL; + cfg->pattern =3D val; + cfg->enable =3D FIELD_GET(BIT(0), input); + cfg->self_timing =3D FIELD_GET(BIT(1), input); + cfg->dynamic_rate =3D FIELD_GET(GENMASK(9, 2), input); + + ret =3D drm_dev_enter(&priv->dev, &idx); + if (!ret) + return -ENODEV; + + hibmc_dp_set_cbar(&priv->dp, cfg); + + drm_dev_exit(idx); + + return size; +} + +static int hibmc_dp_dbgfs_show(struct seq_file *m, void *arg) +{ + struct hibmc_drm_private *priv =3D m->private; + struct hibmc_dp_cbar_cfg *cfg =3D &priv->dp.cfg; + u32 output =3D 0; + int idx; + + if (!drm_dev_enter(&priv->dev, &idx)) + return -ENODEV; + + /* bit[0]: 0: enable colorbar, 1: disable colorbar + * bit[1]: 0: timing follows XDP, 1: internal self timing + * bit[2,9]: 0: static colorbar image, + * 1~255: right shifting a type of color per (1~255)frames + * bit[10,13]: 0~9: color bar, white, red, orange, + * yellow, green, cyan, bule, pupper, black + */ + output =3D cfg->enable | (cfg->self_timing << 1) | + (cfg->dynamic_rate << 2) | (cfg->pattern << 10); + + drm_dev_exit(idx); + + seq_printf(m, "hibmc dp colorbar cfg: %u\n", output); + + return 0; +} + +static int hibmc_open(struct inode *inode, struct file *filp) +{ + return single_open(filp, hibmc_dp_dbgfs_show, inode->i_private); +} + +static const struct file_operations hibmc_dbg_fops =3D { + .owner =3D THIS_MODULE, + .write =3D hibmc_control_write, + .read =3D seq_read, + .open =3D hibmc_open, + .llseek =3D seq_lseek, + .release =3D single_release, +}; + +static struct drm_info_list hibmc_debugfs_list[] =3D { + { "hibmc-dp", hibmc_dp_show }, +}; + +void hibmc_debugfs_init(struct drm_connector *connector, struct dentry *ro= ot) +{ + struct drm_device *dev =3D connector->dev; + struct hibmc_drm_private *priv =3D to_hibmc_drm_private(dev); + struct drm_minor *minor =3D dev->primary; + + /* create the file in drm directory, so we don't need to remove manually = */ + debugfs_create_file("colorbar-cfg", 0200, + root, priv, &hibmc_dbg_fops); + + drm_debugfs_create_files(hibmc_debugfs_list, ARRAY_SIZE(hibmc_debugfs_lis= t), + root, minor); +} diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c b/drivers/gpu/d= rm/hisilicon/hibmc/hibmc_drm_dp.c index 795c5b1a6b99..1f8f7b74f5b4 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c @@ -40,6 +40,7 @@ static const struct drm_connector_funcs hibmc_dp_conn_fun= cs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, .late_register =3D hibmc_dp_late_register, .early_unregister =3D hibmc_dp_early_unregister, + .debugfs_init =3D hibmc_debugfs_init, }; =20 static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display= _mode *mode) diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/= drm/hisilicon/hibmc/hibmc_drm_drv.h index 3ddd71aada66..bc89e4b9f4e3 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h @@ -69,4 +69,6 @@ int hibmc_ddc_create(struct drm_device *drm_dev, struct h= ibmc_vdac *connector); =20 int hibmc_dp_init(struct hibmc_drm_private *priv); =20 +void hibmc_debugfs_init(struct drm_connector *connector, struct dentry *ro= ot); + #endif --=20 2.33.0