From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A38519A2AE for ; Tue, 13 Aug 2024 10:51:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546304; cv=none; b=m1O81GqXFYqrbLAkbLoXh7oZdP67O75UcZ8Of3+EaCLiYXoH804W86QJVQip50q6ELNqBJtPZ4yW8FQ2a2pUXgdZUBB4trCF7y7hSxQfky/VWzwBnN4O6QSU9AHLZRaAIT59QkUjW6WKa1A8Ffkx4aqJMNcA795+7T7JaPfgI5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546304; c=relaxed/simple; bh=h2aKLywDcxrx26bSDGNDkwfKp70bfyQsuzWfZ9E5phs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hFRZer8N0XOYXkELl7LNTD7NaFQzDGJkXoqVp1xAC61smBkcSf0IKoiLA2B7bnteZ1llfSEI6KUn0YBGisDoMcp/kP5LmWwhk6HQbQ9up1yIkcsobBP3ul7DecMscA4o/FzW720FKwE7uQQtepin8oOMrXvX1jgJwG2YVecaNSY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mTllW5BX; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mTllW5BX" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4280c55e488so31074825e9.0 for ; Tue, 13 Aug 2024 03:51:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546300; x=1724151100; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aX42+dlGnq5Uu/bZprAtS71gyG2lrM/6mSZ/7RZ5Qm0=; b=mTllW5BXcB3mTeSxkVBTv1529AafTOBR+m/geJ9LbPNaCDUrwmWE6zGZVNdbarH5C0 rwr2ZBbtg12OzknpaCnat0PTu+TN5PdXa0wXcKME5svrfgEM0a6bLUp3ZYKCa9lbkUMv Y4aTGXzXPzyLvt0k1Enwhdy/iFR7mAUjCgIEkAz9IB0bdfBCi58dOkU0NG1sKj/gNpww EKxQ+dJKszHcKpJPUabsdVc0wjdmEfWtcSVFWTHx25S35a2mrAIdfCAJCNPDorCKb4/i U1ZqJUn3S1EE78R3krHjwPvHBeCNnC6qq5E27YLGz2IVD6dVH3u9jl4yO9P+X/coGdKZ X6Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546300; x=1724151100; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aX42+dlGnq5Uu/bZprAtS71gyG2lrM/6mSZ/7RZ5Qm0=; b=OXYR9DzyVE7rZDqtZfY6z9nvJnGiXJZy/1bWpj+iO+iXsozQ8G7XMmY9f6NUJ6Ty98 GB5x4HWlNKqm8EhDByptl86gxZ0cqhvTLLGD7PYte5e+jTSed9b907gla0gkCxgHYnwa qSUn5KI3Zhozg5bYSLx9UjVKX7UbZmW+f85CIz0313DlhYFGXRx6ghoB9WUd+4YnGeKJ wsT0/l4rHyc08UL5/4lQPkO0jpgu2XPiK5OkoCwifNOrVPUymwzvrEajHtNwHbm9jKQN zTbOLH5Cxzx9of2FRt6hys4nlOS3F/so2WO1J3sGTW35vTlSKPKBQSHg4vdo3NwSk1E5 2kjg== X-Forwarded-Encrypted: i=1; AJvYcCUaPFgvbkkTpAKjHtJM2E30ZH5aDVZBfxuvj5lEfFSk4xurTSR70prSL/gp0qxFsf5oXZy9ynwm9hn2TX3IFI7/zN1A+Hz4XscMaq1o X-Gm-Message-State: AOJu0YyB13yvz4okGS2WqICl/K9wPi2Gk68oib+X4fNVnrFqImLztgGQ 1yyk9Py+c5EH+b2pIPqKHIKS577EndfBvfNySr5YX8Bg5eNQSx7+ X-Google-Smtp-Source: AGHT+IFnztvBdTmZK2l5Gnaz08NvYB3FWKUb0WnOFAD4K52NsHAruw7MbK8ufdnmNtvFmrN1DFmdNw== X-Received: by 2002:a05:600c:1552:b0:427:ee01:ebf0 with SMTP id 5b1f17b1804b1-429d62b74c7mr20852325e9.8.1723546299553; Tue, 13 Aug 2024 03:51:39 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:39 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 01/17] drm/vkms: Extract vkms_config header Date: Tue, 13 Aug 2024 12:44:12 +0200 Message-ID: <20240813105134.17439-2-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Creating a new vkms_config structure will be more complex once we start adding more options. Extract the vkms_config structure to its own header and source files and add functions to create and delete a vkms_config and to initialize debugfs. Refactor, no functional changes. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/Makefile | 3 +- drivers/gpu/drm/vkms/vkms_config.c | 48 ++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 25 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_drv.c | 34 +++++---------------- drivers/gpu/drm/vkms/vkms_drv.h | 10 +------ drivers/gpu/drm/vkms/vkms_output.c | 1 + 6 files changed, 84 insertions(+), 37 deletions(-) create mode 100644 drivers/gpu/drm/vkms/vkms_config.c create mode 100644 drivers/gpu/drm/vkms/vkms_config.h diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile index 1b28a6a32948..b371b5d70ee3 100644 --- a/drivers/gpu/drm/vkms/Makefile +++ b/drivers/gpu/drm/vkms/Makefile @@ -6,6 +6,7 @@ vkms-y :=3D \ vkms_formats.o \ vkms_crtc.o \ vkms_composer.o \ - vkms_writeback.o + vkms_writeback.o \ + vkms_config.o =20 obj-$(CONFIG_DRM_VKMS) +=3D vkms.o diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c new file mode 100644 index 000000000000..c58eda76c238 --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include + +#include +#include + +#include "vkms_config.h" +#include "vkms_drv.h" + +struct vkms_config *vkms_config_create(void) +{ + struct vkms_config *config; + + config =3D kzalloc(sizeof(*config), GFP_KERNEL); + if (!config) + return ERR_PTR(-ENOMEM); + + return config; +} + +void vkms_config_destroy(struct vkms_config *config) +{ + kfree(config); +} + +static int vkms_config_show(struct seq_file *m, void *data) +{ + struct drm_debugfs_entry *entry =3D m->private; + struct drm_device *dev =3D entry->dev; + struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + + seq_printf(m, "writeback=3D%d\n", vkmsdev->config->writeback); + seq_printf(m, "cursor=3D%d\n", vkmsdev->config->cursor); + seq_printf(m, "overlay=3D%d\n", vkmsdev->config->overlay); + + return 0; +} + +static const struct drm_debugfs_info vkms_config_debugfs_list[] =3D { + { "vkms_config", vkms_config_show, 0 }, +}; + +void vkms_config_debugfs_init(struct vkms_device *vkms_device) +{ + drm_debugfs_add_files(&vkms_device->drm, vkms_config_debugfs_list, + ARRAY_SIZE(vkms_config_debugfs_list)); +} diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h new file mode 100644 index 000000000000..65da8cd6ff96 --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef _VKMS_CONFIG_H_ +#define _VKMS_CONFIG_H_ + +#include + +struct vkms_device; + +struct vkms_config { + bool writeback; + bool cursor; + bool overlay; + /* only set when instantiated */ + struct vkms_device *dev; +}; + +/* VKMS Config */ +struct vkms_config *vkms_config_create(void); +void vkms_config_destroy(struct vkms_config *config); + +/* DebugFS */ +void vkms_config_debugfs_init(struct vkms_device *vkms_device); + +#endif /* _VKMS_CONFIG_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index 8dc9dc13896e..6bf462985731 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -26,11 +26,9 @@ #include #include =20 +#include "vkms_config.h" #include "vkms_drv.h" =20 -#include -#include - #define DRIVER_NAME "vkms" #define DRIVER_DESC "Virtual Kernel Mode Setting" #define DRIVER_DATE "20180514" @@ -90,23 +88,6 @@ static void vkms_atomic_commit_tail(struct drm_atomic_st= ate *old_state) drm_atomic_helper_cleanup_planes(dev, old_state); } =20 -static int vkms_config_show(struct seq_file *m, void *data) -{ - struct drm_debugfs_entry *entry =3D m->private; - struct drm_device *dev =3D entry->dev; - struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); - - seq_printf(m, "writeback=3D%d\n", vkmsdev->config->writeback); - seq_printf(m, "cursor=3D%d\n", vkmsdev->config->cursor); - seq_printf(m, "overlay=3D%d\n", vkmsdev->config->overlay); - - return 0; -} - -static const struct drm_debugfs_info vkms_config_debugfs_list[] =3D { - { "vkms_config", vkms_config_show, 0 }, -}; - static const struct drm_driver vkms_driver =3D { .driver_features =3D DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM, .release =3D vkms_release, @@ -216,8 +197,7 @@ static int vkms_create(struct vkms_config *config) if (ret) goto out_devres; =20 - drm_debugfs_add_files(&vkms_device->drm, vkms_config_debugfs_list, - ARRAY_SIZE(vkms_config_debugfs_list)); + vkms_config_debugfs_init(vkms_device); =20 ret =3D drm_dev_register(&vkms_device->drm, 0); if (ret) @@ -239,9 +219,9 @@ static int __init vkms_init(void) int ret; struct vkms_config *config; =20 - config =3D kmalloc(sizeof(*config), GFP_KERNEL); - if (!config) - return -ENOMEM; + config =3D vkms_config_create(); + if (IS_ERR(config)) + return PTR_ERR(config); =20 default_config =3D config; =20 @@ -251,7 +231,7 @@ static int __init vkms_init(void) =20 ret =3D vkms_create(config); if (ret) - kfree(config); + vkms_config_destroy(config); =20 return ret; } @@ -280,7 +260,7 @@ static void __exit vkms_exit(void) if (default_config->dev) vkms_destroy(default_config); =20 - kfree(default_config); + vkms_config_destroy(default_config); } =20 module_init(vkms_init); diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 5e46ea5b96dc..5c523ca27f22 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -115,15 +115,7 @@ struct vkms_output { spinlock_t composer_lock; }; =20 -struct vkms_device; - -struct vkms_config { - bool writeback; - bool cursor; - bool overlay; - /* only set when instantiated */ - struct vkms_device *dev; -}; +struct vkms_config; =20 struct vkms_device { struct drm_device drm; diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 5ce70dd946aa..afe3945c1962 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include "vkms_config.h" #include "vkms_drv.h" #include #include --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7242119A2BD for ; Tue, 13 Aug 2024 10:51:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546304; cv=none; b=guiIytzwX5T8ru6/jDlg/jR3NrWNa+7/UOX2Pw6Uq8uePsUzk2mKk5LBvD9wYQGBNIFOtk5pTFpYVQLrCZXzxtiACKL4X/xM6eO6F3LdlyRnjRgBzr7AEKD4BdEX3o1qyo5xljpPJRdzrC5rNTqgHZi7EhaJzCPo0ZAEVb8TFgI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546304; c=relaxed/simple; bh=UYVRK9fRkB+3IkiH7yMbBh6im7iaeZ+VrbiWQe8oV7s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EnwYCfgFRvFv8dR5KT66Jg03rB+NDz3v2cmQoOJIIrMWAPA+4mMboGZ7dwY44r3e0oQzGBfzaNNc6wM60cSguF+xp2QSWNtPGTfIVeXFpQS2XDvOMSKMjjPnCI2KU/4qbL7VEkXJmvPmpebhoVquSR5cd8nYpJAcdBDXH2rWqDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=N5v5gxaq; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="N5v5gxaq" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5320d8155b4so2458979e87.3 for ; Tue, 13 Aug 2024 03:51:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546300; x=1724151100; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lragSOY+WyXV5ZZ+AC/3nB1kh+DnIY/4SWizX87fSmc=; b=N5v5gxaqdHXopi+iXV6h4b0KDL4LM+VhqwQuK6T8Br8I0E8hlPbtbD20cCYxVKQ62C vSo3UYWenfBY/aw0bmmgDgYFmmGb9Ru76aV3Dz1UUEqVT62CAaoJ4FxAMXhNZ/0uWfJy 6Yp9z8fIKv7+HHKeks+8iRkXb9JO6X7sAyWM4mZb0vXbxwWTJmmCfZ6jzgIeXfMvAJRQ q4WeAIvFBsxUTlSyaLG+IEZaeRBvAFYg+nKfxuHGqQvAUPk/FQ9jaTsRIvo+xMvhYdzm Fgqz6McnEO/TPuDynb9SsElm2F/QqkVqzuvd9B00CC/UvSs5sduaBssLN51ZLRXdb/xV wcbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546300; x=1724151100; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lragSOY+WyXV5ZZ+AC/3nB1kh+DnIY/4SWizX87fSmc=; b=xTye1y9J9vKrVnYM3aDs9Ac/A5BwOZb6J6HAaieEMo5PvfNNRhkEQgSRmET12JiAAh EnVwHxBeV5pE4XVAXjhyfaFOe16fR9nB9hDoONhQqKkFEwSLEbLrDIxPvVRLdmXSv4jF CZdA1dQOV0aRjymCcnHZBvF05AHO6ZvFVZS5i6F/I/QuLTvWd1AckPb9hKNBGgHV1lP1 RF0zmIyu/5y4iinaS7P+JIiVSLys6wCPtIwdSdf0AA1y7JVTqONk8IU3tTiIZUsbV0kI 3NwN7zZq/JQ9lcT0VzBUTqIMEwBqDGGKjeyodtyi0urQw9uZ2j+LrE+VebDDEZjsPDul zrdg== X-Forwarded-Encrypted: i=1; AJvYcCVIHUHOiIvRb3Y+A6Oj+B+4E7TunXaeqFwH1VXbVNjDlyrUiWUGE+zHy3Cq/hBsznWuGHhpXG+AB4WkzSKrvMNkjj2WN2Dg1HiHGycL X-Gm-Message-State: AOJu0Yzaphw6BZMdaU6y1lbULcoamrGrqjogF7cZNrIjVioQF2+v7tUT MgoasPgwwX7SylGdwIM4K/pZ1uRMEVh4sigy5So6OZWGVVzKQEUR X-Google-Smtp-Source: AGHT+IFBmBPHwR0QDHZKoVinyy3tTqQhhWg3jOVvvlJ/Sxvq5wNS2shu8jAtd2HItIOh+bOK6z5ezA== X-Received: by 2002:a05:6512:10c6:b0:52e:95dd:a8ed with SMTP id 2adb3069b0e04-532136613e6mr2058293e87.35.1723546300375; Tue, 13 Aug 2024 03:51:40 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:40 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 02/17] drm/vkms: Move default_config creation to its own function Date: Tue, 13 Aug 2024 12:44:13 +0200 Message-ID: <20240813105134.17439-3-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Extract the initialization of the default configuration to a function. Refactor, no functional changes. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 17 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 3 +++ drivers/gpu/drm/vkms/vkms_drv.c | 6 +----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index c58eda76c238..4c7cda16dfd8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -19,6 +19,23 @@ struct vkms_config *vkms_config_create(void) return config; } =20 +struct vkms_config *vkms_config_default_create(bool enable_cursor, + bool enable_writeback, + bool enable_overlay) +{ + struct vkms_config *config; + + config =3D vkms_config_create(); + if (IS_ERR(config)) + return config; + + config->cursor =3D enable_cursor; + config->writeback =3D enable_writeback; + config->overlay =3D enable_overlay; + + return config; +} + void vkms_config_destroy(struct vkms_config *config) { kfree(config); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 65da8cd6ff96..83181760b02b 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -17,6 +17,9 @@ struct vkms_config { =20 /* VKMS Config */ struct vkms_config *vkms_config_create(void); +struct vkms_config *vkms_config_default_create(bool enable_cursor, + bool enable_writeback, + bool enable_overlay); void vkms_config_destroy(struct vkms_config *config); =20 /* DebugFS */ diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index 6bf462985731..4e36989589f9 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -219,16 +219,12 @@ static int __init vkms_init(void) int ret; struct vkms_config *config; =20 - config =3D vkms_config_create(); + config =3D vkms_config_default_create(enable_cursor, enable_writeback, en= able_overlay); if (IS_ERR(config)) return PTR_ERR(config); =20 default_config =3D config; =20 - config->cursor =3D enable_cursor; - config->writeback =3D enable_writeback; - config->overlay =3D enable_overlay; - ret =3D vkms_create(config); if (ret) vkms_config_destroy(config); --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5347F19AD73 for ; Tue, 13 Aug 2024 10:51:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546306; cv=none; b=UaRnbbfv4Ol6epUh2DC3UdNcf6pCD56uU64zLOEingAMNhIh78UqRb41LuDKdpasDgp2Jt6LG1k99jWddFfuZJxOsWttZJcv+iHqXV9WrNcFW5lK6/5/fKFkw5qy2MYv4ladiVJxutMIjeTqwtq/bbCTrHZD8xeE7TflG8qUjtw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546306; c=relaxed/simple; bh=vnoCN8F2NWikR+1epy2VJ5R0HpgEtOoZr6bzBa706dc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XSaHEmflZU//jxUO26qlwn7dnv1Ka1pecozSG7YBUxyrAetjnCPsj7wBZqI8bbRhoUs7fB0K2HN3+FFJq5xppZHpWaFbBc3lkQ4hA4mcO8qCnEM+T8Xg1JlAMri0xeDCuS+eGdiAnya/mkRLhx9XL795WZAp6KkkDoCodqMBZPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XrLVox5G; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XrLVox5G" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-52f04150796so6887051e87.3 for ; Tue, 13 Aug 2024 03:51:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546302; x=1724151102; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dQhdCIG6a+LBFR6SphoPahDGZ++LmLY0vx0sk4HKH/c=; b=XrLVox5G9ZqVQWpwf+SpVxE7hT/XjP2BiTzH/kF4EK+BaLLfITT2WkSYFtvN5EOW4J 2O2tkUgmKqNtEuH8mpyjgQ9DGtZn+YjhjOY/ecC+piAhEdwOSnlr+3B+ioALyyaHKsC3 9Ht6iAACrtBjk3yhl/v4sFeDdTZyF0IofzUTHe2vbN24mCGHVYrtirnbN9/llU++Q1B/ 0+nAxbRQnhPoesZ90DelSWUszrTTH3GC2+RamDOsgdLpQndRM+tvxxSsVd6TiodUOdAj LYhDaPRjJVp+1m4YmFkHihdHPSUcL5puxP3MKIieB65IerJfGNcI+rSBevw/n2/6d+++ i4JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546302; x=1724151102; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dQhdCIG6a+LBFR6SphoPahDGZ++LmLY0vx0sk4HKH/c=; b=F+9jsRhVKiOruO5z8clO7Mz8+yIHd8ao23Iv+MCCvHD/7Rxr7ha+2la1DeYOuHDQLP es99ZW1ES+XnF0jT0LU94ZuPZcGSJcQLbAseAjSwVa9lYAkCpP4ju2C5dHvcdT0c79SK RZm1mMILqpI4+KwgJo09vDP891pNus4gdUeNfldlhaelozjwbAsooxW2lbnxU7FW/Qgc p455uxJLRY3fjMuRaBQv4jMuLtCMsEhcLSXjFEC/oXFQJaTlAgd3PaCw+SJ6FEaAiXK2 OXe3ExUw8fave3sBs2TciZsC0hDe9KyTPP+u+YfvSZsPHlo+FW56zscBX3lV6PE900g1 ZyaQ== X-Forwarded-Encrypted: i=1; AJvYcCUgt2x0/W9xEn6rjrQIiiCqe3u2haiPRwlgd7Mt0JJPhToeNTV+GIW7KEyWqWIAl2LSr50jtIkFLREIdyA=@vger.kernel.org X-Gm-Message-State: AOJu0YwVxQNwZHjd3E/HHZN8FV0mhWq9YxjoUANxNZutFdi7dp+wUGqM L3QMy8h1LzuIyq/6wkuMP39fDohT6kHJHCRstTiH9Kar161Z7bGtvk9peIrL X-Google-Smtp-Source: AGHT+IGz72xfDrVPTMYgNZfRCFDLS7p2EH5rjzJWTApdrx62JJLa/NcdcQnhtxEsWIZrL7727HPLLA== X-Received: by 2002:a05:6512:282c:b0:52c:cd4f:b95b with SMTP id 2adb3069b0e04-53213657d99mr2098654e87.22.1723546302294; Tue, 13 Aug 2024 03:51:42 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:40 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 03/17] drm/vkms: Set device name from vkms_config Date: Tue, 13 Aug 2024 12:44:14 +0200 Message-ID: <20240813105134.17439-4-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable In order to be able to create multiple devices, the device name needs to be unique. Allow to set it in the VKMS configuration. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 7 +++++-- drivers/gpu/drm/vkms/vkms_config.h | 3 ++- drivers/gpu/drm/vkms/vkms_drv.c | 2 +- drivers/gpu/drm/vkms/vkms_drv.h | 2 ++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 4c7cda16dfd8..6ab8091bf72f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -8,7 +8,7 @@ #include "vkms_config.h" #include "vkms_drv.h" =20 -struct vkms_config *vkms_config_create(void) +struct vkms_config *vkms_config_create(char *dev_name) { struct vkms_config *config; =20 @@ -16,6 +16,8 @@ struct vkms_config *vkms_config_create(void) if (!config) return ERR_PTR(-ENOMEM); =20 + config->dev_name =3D dev_name; + return config; } =20 @@ -25,7 +27,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, { struct vkms_config *config; =20 - config =3D vkms_config_create(); + config =3D vkms_config_create(DEFAULT_DEVICE_NAME); if (IS_ERR(config)) return config; =20 @@ -47,6 +49,7 @@ static int vkms_config_show(struct seq_file *m, void *dat= a) struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); =20 + seq_printf(m, "dev_name=3D%s\n", vkmsdev->config->dev_name); seq_printf(m, "writeback=3D%d\n", vkmsdev->config->writeback); seq_printf(m, "cursor=3D%d\n", vkmsdev->config->cursor); seq_printf(m, "overlay=3D%d\n", vkmsdev->config->overlay); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 83181760b02b..ba06aad32799 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -8,6 +8,7 @@ struct vkms_device; =20 struct vkms_config { + char *dev_name; bool writeback; bool cursor; bool overlay; @@ -16,7 +17,7 @@ struct vkms_config { }; =20 /* VKMS Config */ -struct vkms_config *vkms_config_create(void); +struct vkms_config *vkms_config_create(char *dev_name); struct vkms_config *vkms_config_default_create(bool enable_cursor, bool enable_writeback, bool enable_overlay); diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index 4e36989589f9..2f9d1db0cfae 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -160,7 +160,7 @@ static int vkms_create(struct vkms_config *config) struct platform_device *pdev; struct vkms_device *vkms_device; =20 - pdev =3D platform_device_register_simple(DRIVER_NAME, -1, NULL, 0); + pdev =3D platform_device_register_simple(config->dev_name, -1, NULL, 0); if (IS_ERR(pdev)) return PTR_ERR(pdev); =20 diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 5c523ca27f22..87e44b51a03f 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -12,6 +12,8 @@ #include #include =20 +#define DEFAULT_DEVICE_NAME "vkms" + #define XRES_MIN 10 #define YRES_MIN 10 =20 --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E7AE19B3C6 for ; Tue, 13 Aug 2024 10:51:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546309; cv=none; b=izHMJE2OQo+ILN7htYXbz/a/DwK5bKmZ3Znw1L9uN/t0VJpniEuExT5CgdPaoYO54PwVAlnGcb4FPubDWS9twtyupXc5pgMnGDpWo12eeWQ2vY6mqn0Lt6ubt1/5r1+KFdMGliX6nVn20O7Vwd2nmNT1QFRohGL+0VJkW+RBme4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546309; c=relaxed/simple; bh=zDHGOERE1H51WQtZT5VOPCpSW43jM4U9T6Kcb075wlU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fBvgtdg4fxhYgbC9PASa92Cqwj8GpmHhvootqMBp0QHx6PcMKZdBTbL/Lw+vHokcjUfmVK15q3zqJbuNlr0y9QPhMdGd1sNtcW/f+gMmfkX8Q4b5Ayp0/T4K2QvIFBSkSYMmbOhHyHHci5Px44j5BtlDXwmJgSBA6rVJxMI1+jA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=T7qGXhd4; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="T7qGXhd4" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-428141be2ddso39971765e9.2 for ; Tue, 13 Aug 2024 03:51:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546304; x=1724151104; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Jy+nd+TAf4IESSyfkjPEUCiVjjMM3g7sHyZYE6lpLK4=; b=T7qGXhd4XMu+ZmTNCb81dBa19BjavmCBvHsQv3FrOXJZK9U/ApwES+8qBizp4Ykm/t Au8ieEAunmGefY+QuFoe4meVUZUnSKgWZuu9yLR/bfvzVIHG/RLcl523J2D4NLLokrIj VPf7VgieVEdqyJQEO7oH9FXVRM/q31wyFvQyrH+JWTkmpJ/GnewMSOeVuxjObERiqb69 6/XmwUhDM78fCKyFnqwibBNHNTiXI0PIXZoRurzNmv9c8OEwQUe8c5Ut0rHiO+a8eItR uYAegP695PsSiE5f2bFzfGdezux5MvUYo6RIUuxzP4BNxa+4bGrpOX7S1PyNwK6s6kLJ ZrPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546304; x=1724151104; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Jy+nd+TAf4IESSyfkjPEUCiVjjMM3g7sHyZYE6lpLK4=; b=NTXq77PVdi42nUKwFbpZiJLlfTjQIuDdlm0eDgwuysgA3EvdboVBeJgxVPLRNrS3gU yGQY5OsDgu+G1tJ7CEA+xejkgovJrQepmYyCrB895884Afluf+9m4cAuq0ZiWkSTXyPj UlULFq7ITOjE23l6N4+JiqSTxqYxPC0DNSxUxgZYjvVnLFr7+D0+3FuBvzI/8yD/xezA jQEyQ6qCW4h867QP75Vk9HEQry9QvbrK46MfUL3JgS9eGn9Yd0mIx9YVox0HKuHwoXjp c7d9cxUzRd0+mrl+lhVKZ7kO0FlIHRNpaaNkdTjKWM+g6OGxHqbMj9GZlpPRo4FDt0uY tRog== X-Forwarded-Encrypted: i=1; AJvYcCX9S5r1EdqwmahbfLH57QoimJPHvj2GtCHlSLv/1NrlI8DTPvXfGRWyrT7aZtxBT3Iu+mtemPQm/IcJM7qXaQj7Q+Ol8TiphJ0eUQqB X-Gm-Message-State: AOJu0YxnInA3B0s+6YL0N+gLjX+T8nPFA7/+kitKW8uM6OlDlEYg8xn5 ShE831IQfJlFMveAdWmH6UvtchbhExDI7gGAPyRbfeJij7nIso4s X-Google-Smtp-Source: AGHT+IF3l5a4JzrfLhkKB4hv+VwVgn6Mbv1kVLmbzNJj3J6TXJA+MNrPOXrNN/qld+ZDEq9xJpiUQQ== X-Received: by 2002:a05:600c:474d:b0:426:5ef5:bcb1 with SMTP id 5b1f17b1804b1-429d47f1e4emr20048745e9.6.1723546304134; Tue, 13 Aug 2024 03:51:44 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:42 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 04/17] drm/vkms: Allow to configure multiple CRTCs Date: Tue, 13 Aug 2024 12:44:15 +0200 Message-ID: <20240813105134.17439-5-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a list of CRTC configurations to vkms_config and add as many CRTCs as configured during output initialization. For backwards compatibility, create a single CRTC in the default configuration. Since writeback support, vblank and composer states are now per CRTC, extract all the fields to the vkms_crtc structure and allow each vkms_device to have a list of CRTCs. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_composer.c | 30 ++++---- drivers/gpu/drm/vkms/vkms_config.c | 54 ++++++++++++++- drivers/gpu/drm/vkms/vkms_config.h | 15 +++- drivers/gpu/drm/vkms/vkms_crtc.c | 99 ++++++++++++++------------- drivers/gpu/drm/vkms/vkms_drv.c | 10 ++- drivers/gpu/drm/vkms/vkms_drv.h | 35 +++++++--- drivers/gpu/drm/vkms/vkms_output.c | 38 +++++----- drivers/gpu/drm/vkms/vkms_writeback.c | 27 ++++---- 8 files changed, 197 insertions(+), 111 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vk= ms_composer.c index e7441b227b3c..b1723cf02ed3 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -306,13 +306,13 @@ void vkms_composer_worker(struct work_struct *work) composer_work); struct drm_crtc *crtc =3D crtc_state->base.crtc; struct vkms_writeback_job *active_wb =3D crtc_state->active_writeback; - struct vkms_output *out =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); bool crc_pending, wb_pending; u64 frame_start, frame_end; u32 crc32 =3D 0; int ret; =20 - spin_lock_irq(&out->composer_lock); + spin_lock_irq(&vkms_crtc->composer_lock); frame_start =3D crtc_state->frame_start; frame_end =3D crtc_state->frame_end; crc_pending =3D crtc_state->crc_pending; @@ -336,7 +336,7 @@ void vkms_composer_worker(struct work_struct *work) crtc_state->gamma_lut.base =3D NULL; } =20 - spin_unlock_irq(&out->composer_lock); + spin_unlock_irq(&vkms_crtc->composer_lock); =20 /* * We raced with the vblank hrtimer and previous work already computed @@ -354,10 +354,10 @@ void vkms_composer_worker(struct work_struct *work) return; =20 if (wb_pending) { - drm_writeback_signal_completion(&out->wb_connector, 0); - spin_lock_irq(&out->composer_lock); + drm_writeback_signal_completion(&vkms_crtc->wb_connector, 0); + spin_lock_irq(&vkms_crtc->composer_lock); crtc_state->wb_pending =3D false; - spin_unlock_irq(&out->composer_lock); + spin_unlock_irq(&vkms_crtc->composer_lock); } =20 /* @@ -407,31 +407,31 @@ int vkms_verify_crc_source(struct drm_crtc *crtc, con= st char *src_name, return 0; } =20 -void vkms_set_composer(struct vkms_output *out, bool enabled) +void vkms_set_composer(struct vkms_crtc *vkms_crtc, bool enabled) { bool old_enabled; =20 if (enabled) - drm_crtc_vblank_get(&out->crtc); + drm_crtc_vblank_get(&vkms_crtc->base); =20 - spin_lock_irq(&out->lock); - old_enabled =3D out->composer_enabled; - out->composer_enabled =3D enabled; - spin_unlock_irq(&out->lock); + spin_lock_irq(&vkms_crtc->lock); + old_enabled =3D vkms_crtc->composer_enabled; + vkms_crtc->composer_enabled =3D enabled; + spin_unlock_irq(&vkms_crtc->lock); =20 if (old_enabled) - drm_crtc_vblank_put(&out->crtc); + drm_crtc_vblank_put(&vkms_crtc->base); } =20 int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name) { - struct vkms_output *out =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); bool enabled =3D false; int ret =3D 0; =20 ret =3D vkms_crc_parse_source(src_name, &enabled); =20 - vkms_set_composer(out, enabled); + vkms_set_composer(vkms_crtc, enabled); =20 return ret; } diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6ab8091bf72f..3af750071f04 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -17,6 +17,7 @@ struct vkms_config *vkms_config_create(char *dev_name) return ERR_PTR(-ENOMEM); =20 config->dev_name =3D dev_name; + config->crtcs =3D (struct list_head)LIST_HEAD_INIT(config->crtcs); =20 return config; } @@ -26,20 +27,29 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, bool enable_overlay) { struct vkms_config *config; + struct vkms_config_crtc *crtc_cfg; =20 config =3D vkms_config_create(DEFAULT_DEVICE_NAME); if (IS_ERR(config)) return config; =20 config->cursor =3D enable_cursor; - config->writeback =3D enable_writeback; config->overlay =3D enable_overlay; =20 + crtc_cfg =3D vkms_config_add_crtc(config, enable_writeback); + if (IS_ERR(crtc_cfg)) + return ERR_CAST(crtc_cfg); + return config; } =20 void vkms_config_destroy(struct vkms_config *config) { + struct vkms_config_crtc *crtc_cfg, *crtc_tmp; + + list_for_each_entry_safe(crtc_cfg, crtc_tmp, &config->crtcs, list) + vkms_config_destroy_crtc(config, crtc_cfg); + kfree(config); } =20 @@ -48,12 +58,20 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) struct drm_debugfs_entry *entry =3D m->private; struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + struct vkms_config_crtc *crtc_cfg; + int n; =20 seq_printf(m, "dev_name=3D%s\n", vkmsdev->config->dev_name); - seq_printf(m, "writeback=3D%d\n", vkmsdev->config->writeback); seq_printf(m, "cursor=3D%d\n", vkmsdev->config->cursor); seq_printf(m, "overlay=3D%d\n", vkmsdev->config->overlay); =20 + n =3D 0; + list_for_each_entry(crtc_cfg, &vkmsdev->config->crtcs, list) { + seq_printf(m, "crtc(%d).writeback=3D%d\n", n, + crtc_cfg->writeback); + n++; + } + return 0; } =20 @@ -66,3 +84,35 @@ void vkms_config_debugfs_init(struct vkms_device *vkms_d= evice) drm_debugfs_add_files(&vkms_device->drm, vkms_config_debugfs_list, ARRAY_SIZE(vkms_config_debugfs_list)); } + +struct vkms_config_crtc *vkms_config_add_crtc(struct vkms_config *config, + bool enable_writeback) +{ + struct vkms_config_crtc *crtc_cfg; + + crtc_cfg =3D kzalloc(sizeof(*crtc_cfg), GFP_KERNEL); + if (!crtc_cfg) + return ERR_PTR(-ENOMEM); + + crtc_cfg->writeback =3D enable_writeback; + + crtc_cfg->index =3D 0; + if (!list_empty(&config->crtcs)) { + struct vkms_config_crtc *last; + + last =3D list_last_entry(&config->crtcs, struct vkms_config_crtc, + list); + crtc_cfg->index =3D last->index + 1; + } + + list_add_tail(&crtc_cfg->list, &config->crtcs); + + return crtc_cfg; +} + +void vkms_config_destroy_crtc(struct vkms_config *config, + struct vkms_config_crtc *crtc_cfg) +{ + list_del(&crtc_cfg->list); + kfree(crtc_cfg); +} diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index ba06aad32799..bc40a0e3859a 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -3,15 +3,22 @@ #ifndef _VKMS_CONFIG_H_ #define _VKMS_CONFIG_H_ =20 +#include #include =20 struct vkms_device; =20 +struct vkms_config_crtc { + struct list_head list; + unsigned int index; + bool writeback; +}; + struct vkms_config { char *dev_name; - bool writeback; bool cursor; bool overlay; + struct list_head crtcs; /* only set when instantiated */ struct vkms_device *dev; }; @@ -26,4 +33,10 @@ void vkms_config_destroy(struct vkms_config *config); /* DebugFS */ void vkms_config_debugfs_init(struct vkms_device *vkms_device); =20 +/* CRTCs */ +struct vkms_config_crtc *vkms_config_add_crtc(struct vkms_config *config, + bool enable_writeback); +void vkms_config_destroy_crtc(struct vkms_config *config, + struct vkms_config_crtc *crtc_cfg); + #endif /* _VKMS_CONFIG_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index 40b4d084e3ce..41ab8f47331c 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -11,35 +11,34 @@ =20 static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) { - struct vkms_output *output =3D container_of(timer, struct vkms_output, - vblank_hrtimer); - struct drm_crtc *crtc =3D &output->crtc; + struct vkms_crtc *vkms_crtc =3D timer_to_vkms_crtc(timer); + struct drm_crtc *crtc =3D &vkms_crtc->base; struct vkms_crtc_state *state; u64 ret_overrun; bool ret, fence_cookie; =20 fence_cookie =3D dma_fence_begin_signalling(); =20 - ret_overrun =3D hrtimer_forward_now(&output->vblank_hrtimer, - output->period_ns); + ret_overrun =3D hrtimer_forward_now(&vkms_crtc->vblank_hrtimer, + vkms_crtc->period_ns); if (ret_overrun !=3D 1) pr_warn("%s: vblank timer overrun\n", __func__); =20 - spin_lock(&output->lock); + spin_lock(&vkms_crtc->lock); ret =3D drm_crtc_handle_vblank(crtc); if (!ret) DRM_ERROR("vkms failure on handling vblank"); =20 - state =3D output->composer_state; - spin_unlock(&output->lock); + state =3D vkms_crtc->composer_state; + spin_unlock(&vkms_crtc->lock); =20 - if (state && output->composer_enabled) { + if (state && vkms_crtc->composer_enabled) { u64 frame =3D drm_crtc_accurate_vblank_count(crtc); =20 /* update frame_start only if a queued vkms_composer_worker() * has read the data */ - spin_lock(&output->composer_lock); + spin_lock(&vkms_crtc->composer_lock); if (!state->crc_pending) state->frame_start =3D frame; else @@ -47,9 +46,9 @@ static enum hrtimer_restart vkms_vblank_simulate(struct h= rtimer *timer) state->frame_start, frame); state->frame_end =3D frame; state->crc_pending =3D true; - spin_unlock(&output->composer_lock); + spin_unlock(&vkms_crtc->composer_lock); =20 - ret =3D queue_work(output->composer_workq, &state->composer_work); + ret =3D queue_work(vkms_crtc->composer_workq, &state->composer_work); if (!ret) DRM_DEBUG_DRIVER("Composer worker already queued\n"); } @@ -62,32 +61,30 @@ static enum hrtimer_restart vkms_vblank_simulate(struct= hrtimer *timer) static int vkms_enable_vblank(struct drm_crtc *crtc) { struct drm_vblank_crtc *vblank =3D drm_crtc_vblank_crtc(crtc); - struct vkms_output *out =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); =20 drm_calc_timestamping_constants(crtc, &crtc->mode); =20 - hrtimer_init(&out->vblank_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - out->vblank_hrtimer.function =3D &vkms_vblank_simulate; - out->period_ns =3D ktime_set(0, vblank->framedur_ns); - hrtimer_start(&out->vblank_hrtimer, out->period_ns, HRTIMER_MODE_REL); + hrtimer_init(&vkms_crtc->vblank_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_RE= L); + vkms_crtc->vblank_hrtimer.function =3D &vkms_vblank_simulate; + vkms_crtc->period_ns =3D ktime_set(0, vblank->framedur_ns); + hrtimer_start(&vkms_crtc->vblank_hrtimer, vkms_crtc->period_ns, HRTIMER_M= ODE_REL); =20 return 0; } =20 static void vkms_disable_vblank(struct drm_crtc *crtc) { - struct vkms_output *out =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); =20 - hrtimer_cancel(&out->vblank_hrtimer); + hrtimer_cancel(&vkms_crtc->vblank_hrtimer); } =20 static bool vkms_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error, ktime_t *vblank_time, bool in_vblank_irq) { - struct drm_device *dev =3D crtc->dev; - struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); - struct vkms_output *output =3D &vkmsdev->output; + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); struct drm_vblank_crtc *vblank =3D drm_crtc_vblank_crtc(crtc); =20 if (!READ_ONCE(vblank->enabled)) { @@ -95,7 +92,7 @@ static bool vkms_get_vblank_timestamp(struct drm_crtc *cr= tc, return true; } =20 - *vblank_time =3D READ_ONCE(output->vblank_hrtimer.node.expires); + *vblank_time =3D READ_ONCE(vkms_crtc->vblank_hrtimer.node.expires); =20 if (WARN_ON(*vblank_time =3D=3D vblank->time)) return true; @@ -107,7 +104,7 @@ static bool vkms_get_vblank_timestamp(struct drm_crtc *= crtc, * the vblank core expects. Therefore we need to always correct the * timestampe by one frame. */ - *vblank_time -=3D output->period_ns; + *vblank_time -=3D vkms_crtc->period_ns; =20 return true; } @@ -233,18 +230,18 @@ static void vkms_crtc_atomic_disable(struct drm_crtc = *crtc, static void vkms_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_atomic_state *state) { - struct vkms_output *vkms_output =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); =20 /* This lock is held across the atomic commit to block vblank timer * from scheduling vkms_composer_worker until the composer is updated */ - spin_lock_irq(&vkms_output->lock); + spin_lock_irq(&vkms_crtc->lock); } =20 static void vkms_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state) { - struct vkms_output *vkms_output =3D drm_crtc_to_vkms_output(crtc); + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(crtc); =20 if (crtc->state->event) { spin_lock(&crtc->dev->event_lock); @@ -259,9 +256,9 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crt= c, crtc->state->event =3D NULL; } =20 - vkms_output->composer_state =3D to_vkms_crtc_state(crtc->state); + vkms_crtc->composer_state =3D to_vkms_crtc_state(crtc->state); =20 - spin_unlock_irq(&vkms_output->lock); + spin_unlock_irq(&vkms_crtc->lock); } =20 static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs =3D { @@ -272,30 +269,38 @@ static const struct drm_crtc_helper_funcs vkms_crtc_h= elper_funcs =3D { .atomic_disable =3D vkms_crtc_atomic_disable, }; =20 -int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, - struct drm_plane *primary, struct drm_plane *cursor) +struct vkms_crtc *vkms_crtc_init(struct drm_device *dev, + struct drm_plane *primary, + struct drm_plane *cursor, + unsigned int index) { - struct vkms_output *vkms_out =3D drm_crtc_to_vkms_output(crtc); - int ret; + struct vkms_crtc *crtc; =20 - ret =3D drmm_crtc_init_with_planes(dev, crtc, primary, cursor, - &vkms_crtc_funcs, NULL); - if (ret) { - DRM_ERROR("Failed to init CRTC\n"); - return ret; + crtc =3D drmm_crtc_alloc_with_planes(dev, struct vkms_crtc, base, primary, + cursor, &vkms_crtc_funcs, NULL); + if (IS_ERR(crtc)) { + DRM_ERROR("Failed to alloc CRTC\n"); + return crtc; } =20 - drm_crtc_helper_add(crtc, &vkms_crtc_helper_funcs); + crtc->base.index =3D index; + primary->possible_crtcs =3D drm_crtc_mask(&crtc->base); + if (cursor) + cursor->possible_crtcs =3D drm_crtc_mask(&crtc->base); =20 - drm_mode_crtc_set_gamma_size(crtc, VKMS_LUT_SIZE); - drm_crtc_enable_color_mgmt(crtc, 0, false, VKMS_LUT_SIZE); + INIT_LIST_HEAD(&crtc->list); =20 - spin_lock_init(&vkms_out->lock); - spin_lock_init(&vkms_out->composer_lock); + drm_crtc_helper_add(&crtc->base, &vkms_crtc_helper_funcs); =20 - vkms_out->composer_workq =3D alloc_ordered_workqueue("vkms_composer", 0); - if (!vkms_out->composer_workq) - return -ENOMEM; + drm_mode_crtc_set_gamma_size(&crtc->base, VKMS_LUT_SIZE); + drm_crtc_enable_color_mgmt(&crtc->base, 0, false, VKMS_LUT_SIZE); + + spin_lock_init(&crtc->lock); + spin_lock_init(&crtc->composer_lock); + + crtc->composer_workq =3D alloc_ordered_workqueue("vkms_composer", 0); + if (!crtc->composer_workq) + return ERR_PTR(-ENOMEM); =20 - return ret; + return crtc; } diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index 2f9d1db0cfae..15a2ba26d190 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -54,9 +54,12 @@ DEFINE_DRM_GEM_FOPS(vkms_driver_fops); static void vkms_release(struct drm_device *dev) { struct vkms_device *vkms =3D drm_device_to_vkms_device(dev); + struct vkms_crtc *vkms_crtc; =20 - if (vkms->output.composer_workq) - destroy_workqueue(vkms->output.composer_workq); + list_for_each_entry(vkms_crtc, &vkms->crtcs, list) { + if (vkms_crtc->composer_workq) + destroy_workqueue(vkms_crtc->composer_workq); + } } =20 static void vkms_atomic_commit_tail(struct drm_atomic_state *old_state) @@ -177,6 +180,7 @@ static int vkms_create(struct vkms_config *config) } vkms_device->platform =3D pdev; vkms_device->config =3D config; + vkms_device->crtcs =3D (struct list_head)LIST_HEAD_INIT(vkms_device->crtc= s); config->dev =3D vkms_device; =20 ret =3D dma_coerce_mask_and_coherent(vkms_device->drm.dev, @@ -187,7 +191,7 @@ static int vkms_create(struct vkms_config *config) goto out_devres; } =20 - ret =3D drm_vblank_init(&vkms_device->drm, 1); + ret =3D drm_vblank_init(&vkms_device->drm, list_count_nodes(&config->crtc= s)); if (ret) { DRM_ERROR("Failed to vblank\n"); goto out_devres; diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 87e44b51a03f..3156ff896c33 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -4,6 +4,7 @@ #define _VKMS_DRV_H_ =20 #include +#include =20 #include #include @@ -98,10 +99,11 @@ struct vkms_crtc_state { u64 frame_end; }; =20 -struct vkms_output { - struct drm_crtc crtc; - struct drm_encoder encoder; - struct drm_connector connector; +struct vkms_crtc { + struct list_head list; + + struct drm_crtc base; + struct drm_writeback_connector wb_connector; struct hrtimer vblank_hrtimer; ktime_t period_ns; @@ -119,19 +121,28 @@ struct vkms_output { =20 struct vkms_config; =20 +struct vkms_output { + struct drm_encoder encoder; + struct drm_connector connector; +}; + struct vkms_device { struct drm_device drm; struct platform_device *platform; struct vkms_output output; + struct list_head crtcs; const struct vkms_config *config; }; =20 -#define drm_crtc_to_vkms_output(target) \ - container_of(target, struct vkms_output, crtc) - #define drm_device_to_vkms_device(target) \ container_of(target, struct vkms_device, drm) =20 +#define drm_crtc_to_vkms_crtc(crtc) \ + container_of(crtc, struct vkms_crtc, base) + +#define timer_to_vkms_crtc(timer) \ + container_of(timer, struct vkms_crtc, vblank_hrtimer) + #define to_vkms_crtc_state(target)\ container_of(target, struct vkms_crtc_state, base) =20 @@ -139,8 +150,10 @@ struct vkms_device { container_of(target, struct vkms_plane_state, base.base) =20 /* CRTC */ -int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, - struct drm_plane *primary, struct drm_plane *cursor); +struct vkms_crtc *vkms_crtc_init(struct drm_device *dev, + struct drm_plane *primary, + struct drm_plane *cursor, + unsigned int index); =20 int vkms_output_init(struct vkms_device *vkmsdev, int index); =20 @@ -156,11 +169,11 @@ int vkms_verify_crc_source(struct drm_crtc *crtc, con= st char *source_name, =20 /* Composer Support */ void vkms_composer_worker(struct work_struct *work); -void vkms_set_composer(struct vkms_output *out, bool enabled); +void vkms_set_composer(struct vkms_crtc *vkms_crtc, bool enabled); void vkms_compose_row(struct line_buffer *stage_buffer, struct vkms_plane_= state *plane, int y); void vkms_writeback_row(struct vkms_writeback_job *wb, const struct line_b= uffer *src_buffer, int y); =20 /* Writeback */ -int vkms_enable_writeback_connector(struct vkms_device *vkmsdev); +int vkms_enable_writeback_connector(struct vkms_crtc *vkms_crtc); =20 #endif /* _VKMS_DRV_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index afe3945c1962..dcd32bc30e17 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -32,8 +32,7 @@ static const struct drm_connector_helper_funcs vkms_conn_= helper_funcs =3D { .get_modes =3D vkms_conn_get_modes, }; =20 -static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, int index, - struct drm_crtc *crtc) +static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, int index) { struct vkms_plane *overlay; =20 @@ -42,7 +41,7 @@ static int vkms_add_overlay_plane(struct vkms_device *vkm= sdev, int index, return PTR_ERR(overlay); =20 if (!overlay->base.possible_crtcs) - overlay->base.possible_crtcs =3D drm_crtc_mask(crtc); + overlay->base.possible_crtcs =3D BIT(index); =20 return 0; } @@ -53,7 +52,8 @@ int vkms_output_init(struct vkms_device *vkmsdev, int ind= ex) struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector =3D &output->connector; struct drm_encoder *encoder =3D &output->encoder; - struct drm_crtc *crtc =3D &output->crtc; + struct vkms_crtc *vkms_crtc; + struct vkms_config_crtc *crtc_cfg; struct vkms_plane *primary, *cursor =3D NULL; int ret; int writeback; @@ -65,7 +65,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int ind= ex) =20 if (vkmsdev->config->overlay) { for (n =3D 0; n < NUM_OVERLAY_PLANES; n++) { - ret =3D vkms_add_overlay_plane(vkmsdev, index, crtc); + ret =3D vkms_add_overlay_plane(vkmsdev, index); if (ret) return ret; } @@ -77,15 +77,26 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) return PTR_ERR(cursor); } =20 - ret =3D vkms_crtc_init(dev, crtc, &primary->base, &cursor->base); - if (ret) - return ret; + list_for_each_entry(crtc_cfg, &vkmsdev->config->crtcs, list) { + vkms_crtc =3D vkms_crtc_init(dev, &primary->base, &cursor->base, + crtc_cfg->index); + if (IS_ERR(vkms_crtc)) + return PTR_ERR(vkms_crtc); + + list_add_tail(&vkms_crtc->list, &vkmsdev->crtcs); + + if (crtc_cfg->writeback) { + writeback =3D vkms_enable_writeback_connector(vkms_crtc); + if (writeback) + DRM_ERROR("Failed to init writeback connector\n"); + } + } =20 ret =3D drm_connector_init(dev, connector, &vkms_connector_funcs, DRM_MODE_CONNECTOR_VIRTUAL); if (ret) { DRM_ERROR("Failed to init connector\n"); - goto err_connector; + return ret; } =20 drm_connector_helper_add(connector, &vkms_conn_helper_funcs); @@ -104,12 +115,6 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) goto err_attach; } =20 - if (vkmsdev->config->writeback) { - writeback =3D vkms_enable_writeback_connector(vkmsdev); - if (writeback) - DRM_ERROR("Failed to init writeback connector\n"); - } - drm_mode_config_reset(dev); =20 return 0; @@ -120,8 +125,5 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) err_encoder: drm_connector_cleanup(connector); =20 -err_connector: - drm_crtc_cleanup(crtc); - return ret; } diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/v= kms_writeback.c index bc724cbd5e3a..b317cb291586 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -106,7 +106,7 @@ static void vkms_wb_cleanup_job(struct drm_writeback_co= nnector *connector, struct drm_writeback_job *job) { struct vkms_writeback_job *vkmsjob =3D job->priv; - struct vkms_device *vkmsdev; + struct vkms_crtc *vkms_crtc; =20 if (!job->fb) return; @@ -115,8 +115,8 @@ static void vkms_wb_cleanup_job(struct drm_writeback_co= nnector *connector, =20 drm_framebuffer_put(vkmsjob->wb_frame_info.fb); =20 - vkmsdev =3D drm_device_to_vkms_device(job->fb->dev); - vkms_set_composer(&vkmsdev->output, false); + vkms_crtc =3D container_of(connector, struct vkms_crtc, wb_connector); + vkms_set_composer(vkms_crtc, false); kfree(vkmsjob); } =20 @@ -125,11 +125,10 @@ static void vkms_wb_atomic_commit(struct drm_connecto= r *conn, { struct drm_connector_state *connector_state =3D drm_atomic_get_new_connec= tor_state(state, conn); - struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(conn->dev); - struct vkms_output *output =3D &vkmsdev->output; - struct drm_writeback_connector *wb_conn =3D &output->wb_connector; + struct vkms_crtc *vkms_crtc =3D drm_crtc_to_vkms_crtc(connector_state->cr= tc); + struct drm_writeback_connector *wb_conn =3D &vkms_crtc->wb_connector; struct drm_connector_state *conn_state =3D wb_conn->base.state; - struct vkms_crtc_state *crtc_state =3D output->composer_state; + struct vkms_crtc_state *crtc_state =3D vkms_crtc->composer_state; struct drm_framebuffer *fb =3D connector_state->writeback_job->fb; u16 crtc_height =3D crtc_state->base.crtc->mode.vdisplay; u16 crtc_width =3D crtc_state->base.crtc->mode.hdisplay; @@ -140,15 +139,15 @@ static void vkms_wb_atomic_commit(struct drm_connecto= r *conn, if (!conn_state) return; =20 - vkms_set_composer(&vkmsdev->output, true); + vkms_set_composer(vkms_crtc, true); =20 active_wb =3D conn_state->writeback_job->priv; wb_frame_info =3D &active_wb->wb_frame_info; =20 - spin_lock_irq(&output->composer_lock); + spin_lock_irq(&vkms_crtc->composer_lock); crtc_state->active_writeback =3D active_wb; crtc_state->wb_pending =3D true; - spin_unlock_irq(&output->composer_lock); + spin_unlock_irq(&vkms_crtc->composer_lock); =20 wb_frame_info->offset =3D fb->offsets[0]; wb_frame_info->pitch =3D fb->pitches[0]; @@ -168,16 +167,16 @@ static const struct drm_connector_helper_funcs vkms_w= b_conn_helper_funcs =3D { .atomic_check =3D vkms_wb_atomic_check, }; =20 -int vkms_enable_writeback_connector(struct vkms_device *vkmsdev) +int vkms_enable_writeback_connector(struct vkms_crtc *vkms_crtc) { - struct drm_writeback_connector *wb =3D &vkmsdev->output.wb_connector; + struct drm_writeback_connector *wb =3D &vkms_crtc->wb_connector; =20 drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs); =20 - return drm_writeback_connector_init(&vkmsdev->drm, wb, + return drm_writeback_connector_init(vkms_crtc->base.dev, wb, &vkms_wb_connector_funcs, NULL, vkms_wb_formats, ARRAY_SIZE(vkms_wb_formats), - 1); + drm_crtc_mask(&vkms_crtc->base)); } --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE47B19B3E3 for ; Tue, 13 Aug 2024 10:51:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546308; cv=none; b=RkWv9btknyjSnFm08o6Qqo298v8gTq49H8T/k8g+ktET2LZO2sS+Swi2ARYO1FNAypvWI+gFRld4BD9noFDAU2MZ6VDQh6MpkQ+reSb2nanhDc9Su6d/jijAHHqT/OcGDl+tlJHzvMqZwL0RboDNWqKpQKN0bXsHvkeiknXfoE0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546308; c=relaxed/simple; bh=WRQW85+YRd0SC11lbJ8BQt+pFhrRPczXl0WEAT1Lk6I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nPJWw6BXppGhZ5/CastghQuL+AVPlOfs6A/TCUzpHvGHhFAnluEvyBvq7NnQr7pmnjvKByYnK5YRUR38WBMsj2qNZhrNA27qcpoG1Gn9bmJoSdXkTP8pRq1RzUiqBDVX3JLhoVtsQ72Dz1D6AsGPm9iBnamWOL5IuU/3+5bIwpw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VbiZVP43; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VbiZVP43" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-42809d6e719so40947045e9.3 for ; Tue, 13 Aug 2024 03:51:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546305; x=1724151105; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KWE8rKtVdiKUJxK18Sz+dZAuEs9UiARix9m9SAPeTeE=; b=VbiZVP43n6iZXIu4C9qEjs2OtfTPvmGnxN7q6J9qIfkFoFq/8St+qw51MbPKjP8FUb DTf8GNLdLzdpikf421KRGnLBT3sZzMqJBPurFggAvicZL8Ugna73NCmftW1QWJGPSQ0P YSyTn/y7ftvDVhao3psZafUjwOuP3tsksQQ20KA1qxJ2z9I6y0PdnpDyG5chsX4eznaA Cids3r+m7C4P9fcEUsCii7+/on8afHWCmZGycjkRHv2Awz5olAMqm3en9mCZmWE1NvmF 9eBfOe63bEhcyEdvSOVA2NkkTZb0+vXrFqCMEeX9I9hSwvFEJGpgh8X3163jR4mOlfwF tKqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546305; x=1724151105; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KWE8rKtVdiKUJxK18Sz+dZAuEs9UiARix9m9SAPeTeE=; b=CSK+3XEcgmmqupVPrL2lCPxCmPStKF2Mx1CqbCJ9jn56zSpPvghTVny1fIyzr37Y09 4LowAIFV834nCAc4Q5dJbWC8VD6x3Eb6Y72nFvS/8o2sgEPhb9f4JlQwq2jp1yXact7q mX7syka2dCJyym6pbKsh1Keavj63+n91mkOp73E2R/xUOtepB3HO5ATKOea5K5FHP9j1 /mACfZVcxfXyhwT0nnnV/7O/kiwUH7hT3C8hS58fiA3wIIlT9UKxPnvwF529M9ZPFsIo QYUOT00K0Uq2d1UclsITpalBdP8eYQQgWLYy/k5wEhF3Hvn+Ut+tygITjt6sPAOY701W G/gw== X-Forwarded-Encrypted: i=1; AJvYcCXXIDURLYh2gQIRmbilMWJKMJ+6TX5ZLYNk4VUMxfeJhcXU1FIrZmpY9Mix4IxihVfhK4iiJQO5QHuRMUfc5nSs9oAwFP0wcGAm4hBT X-Gm-Message-State: AOJu0YyafsfiEuU7gWWpFrrMOrPCPMIl8xMqKKoDJ+cxkQ+M/AsqcvFq NhsXe0srdGfw4dvvsVyMFs28wnKbNM21lfaHW4wRhB0HWi4bpXFD X-Google-Smtp-Source: AGHT+IEOoGiAX7Jk7kFX/Cpb+81DazihuxVSJAl0cnfxJtAI3Kt5FKlL5DDzE+cNeO48UflBpAHuFQ== X-Received: by 2002:a05:600c:5246:b0:426:5b21:9801 with SMTP id 5b1f17b1804b1-429d486ec8amr25687205e9.27.1723546304967; Tue, 13 Aug 2024 03:51:44 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:44 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 05/17] drm/vkms: Use managed memory to create encoders Date: Tue, 13 Aug 2024 12:44:16 +0200 Message-ID: <20240813105134.17439-6-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable A future patch will allow to create multiple encoders. Use managed memory to simplify the code. Refactor, no functional changes. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_drv.h | 1 - drivers/gpu/drm/vkms/vkms_output.c | 45 ++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 3156ff896c33..2466e8b0231f 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -122,7 +122,6 @@ struct vkms_crtc { struct vkms_config; =20 struct vkms_output { - struct drm_encoder encoder; struct drm_connector connector; }; =20 diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index dcd32bc30e17..15f0b72af325 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -4,6 +4,7 @@ #include "vkms_drv.h" #include #include +#include #include =20 static const struct drm_connector_funcs vkms_connector_funcs =3D { @@ -14,10 +15,6 @@ static const struct drm_connector_funcs vkms_connector_f= uncs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, }; =20 -static const struct drm_encoder_funcs vkms_encoder_funcs =3D { - .destroy =3D drm_encoder_cleanup, -}; - static int vkms_conn_get_modes(struct drm_connector *connector) { int count; @@ -32,6 +29,31 @@ static const struct drm_connector_helper_funcs vkms_conn= _helper_funcs =3D { .get_modes =3D vkms_conn_get_modes, }; =20 +static struct drm_encoder *vkms_encoder_init(struct vkms_device *vkms_devi= ce, + uint32_t possible_crtcs) +{ + struct drm_encoder *encoder; + int ret; + + encoder =3D drmm_kzalloc(&vkms_device->drm, sizeof(*encoder), GFP_KERNEL); + if (!encoder) { + DRM_ERROR("Failed to allocate encoder\n"); + return ERR_PTR(-ENOMEM); + } + + ret =3D drmm_encoder_init(&vkms_device->drm, encoder, NULL, + DRM_MODE_ENCODER_VIRTUAL, NULL); + if (ret) { + DRM_ERROR("Failed to init encoder\n"); + kfree(encoder); + return ERR_PTR(ret); + } + + encoder->possible_crtcs =3D possible_crtcs; + + return encoder; +} + static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, int index) { struct vkms_plane *overlay; @@ -51,7 +73,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int ind= ex) struct vkms_output *output =3D &vkmsdev->output; struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector =3D &output->connector; - struct drm_encoder *encoder =3D &output->encoder; + struct drm_encoder *encoder; struct vkms_crtc *vkms_crtc; struct vkms_config_crtc *crtc_cfg; struct vkms_plane *primary, *cursor =3D NULL; @@ -101,13 +123,9 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) =20 drm_connector_helper_add(connector, &vkms_conn_helper_funcs); =20 - ret =3D drm_encoder_init(dev, encoder, &vkms_encoder_funcs, - DRM_MODE_ENCODER_VIRTUAL, NULL); - if (ret) { - DRM_ERROR("Failed to init encoder\n"); - goto err_encoder; - } - encoder->possible_crtcs =3D 1; + encoder =3D vkms_encoder_init(vkmsdev, BIT(0)); + if (IS_ERR(encoder)) + return PTR_ERR(encoder); =20 ret =3D drm_connector_attach_encoder(connector, encoder); if (ret) { @@ -120,9 +138,6 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) return 0; =20 err_attach: - drm_encoder_cleanup(encoder); - -err_encoder: drm_connector_cleanup(connector); =20 return ret; --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 27F2419AA43 for ; Tue, 13 Aug 2024 10:51:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546310; cv=none; b=QxvQB7xvQt2OAIUpGj+DQV4b/Bko5E1tcJLS09FRSIzZylkh0utLgys7hMYyiS4eZYUGBOB6Pg2ERL9jHLFwcU7TIey2/UwXbyL9+OJ9ST8AXC0imhwd4Yi0t/4i+I0AEbDyBgMaNVe0Yhhy+Q88EsEqMr10Ebuspkkj+FEnX1k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546310; c=relaxed/simple; bh=oxGcfz9/v3PDOEPDFfhhh25yuHAPufuIfyTlXKYirGc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=njHuy0RXEc2dpleeusTdXdMrRpFrhERo2683KXiJ7ycAEgVimcqti7M8FN0Vc1GkjnqZytuu+q2rkglXnGo1lBkRoNoeO4/UHujkeCDziXzypNVsgD5TQARS7/fc80xOQZ5iILeXzPOYvd/NcPGtRmIZRUS3lq7toddxIwH09W4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=f+dQBSrY; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f+dQBSrY" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-428243f928fso52923575e9.0 for ; Tue, 13 Aug 2024 03:51:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546306; x=1724151106; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=R6Mz2KhFZzROn/KIWb00LTNVvXvYG/m4Vfb07jwptv4=; b=f+dQBSrYuONNxDkLp8CMEZ+AosSuz0j4FRv2YztZBjawGZgsSOuaXyg4sio2U6lv33 f4I2nqULhW5/rfwUtQbM866UULkw3OD9sQ3gob8R02AKfv7LP+bixg6NdRRwyNjqItdq HylsMiWICFnUHqNeimVmkt/oYfYhZmM+mlWoPIMaD2H436wWUVPu0TIcJ79KaZZnjz1O BSEYWJvWGYBs+kYwYpeUBBiU6lYXM+SkNm176mp46o/tiKKYrYBM+Q2+4FqPe9snTNBx JoLgVihan4mEJeSXFw3A0ApkRRtLafgqCx/JQ0VYMGd7TUQdjDtvcmFcdP7J2Xdfla/A P7xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546306; x=1724151106; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R6Mz2KhFZzROn/KIWb00LTNVvXvYG/m4Vfb07jwptv4=; b=TGuKikqWu3j3Qd+0NTfWhHadHGL3Mqn9iKO+9UtoWeqqrfwue0hkkx0TP5Hh+LmCF3 k02B1Ke9lSBlW2l+2bqb0IH2Z/4DgzplGscVU/miFNK15Jl3d1FSK+Koe/2hpfL+MbJK BIhGFfo3guQSKFa/tApsTIzdJ3xnKpCScfLaUl6zjesrrehdO67Gly8NnSiNohfSy3Xy qdsEJ3mZqxEfAK9R5Z9ZeecOQMFQdQwuXsAJngtzOL3x4UBUw9r1BpmKy2nSSq78+A4u PDiyg5k1ynEB98DommAKNXP2OgFAyWxuAUVr1OxcXJNSl49K9oxdQwDH7F5T4bmD1G+8 +/Vw== X-Forwarded-Encrypted: i=1; AJvYcCU5ZQgowxoo7piQZ0mcJGLruPMPtbje2beAP5C0L9Bb3l2fI0DMHVHtfUeSqQ1dZahLFWPxZbH1CNZsJ8/da/qqrmOCVbJld72JEJ0o X-Gm-Message-State: AOJu0YyUrt92PMO/cTU7EVPGjIOMhhrOKqWdy73PciWafb8BnVwDcpBg yvXBeIOp5c+DDW+ectr3NpZ0tER8I9xLHZqYvRsGcVI58ybafPmG X-Google-Smtp-Source: AGHT+IFc1MxDOM9KHwmSg4MIeIUEJ0CdqAeobEZZY+JR1Ums0WJRTX2kswhgxVkQAvgh3eiXBXE65g== X-Received: by 2002:a05:600c:6d3:b0:426:59d3:8cae with SMTP id 5b1f17b1804b1-429d633e764mr21330055e9.13.1723546306306; Tue, 13 Aug 2024 03:51:46 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:45 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 06/17] drm/vkms: Allow to configure multiple encoders Date: Tue, 13 Aug 2024 12:44:17 +0200 Message-ID: <20240813105134.17439-7-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a list of encoder configurations to vkms_config and add as many encoders as configured during output initialization. For backwards compatibility, create a single encoder in the default configuration. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 50 ++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 13 ++++++++ drivers/gpu/drm/vkms/vkms_output.c | 14 ++++++--- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 3af750071f04..6a8dfebee24e 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -18,6 +18,7 @@ struct vkms_config *vkms_config_create(char *dev_name) =20 config->dev_name =3D dev_name; config->crtcs =3D (struct list_head)LIST_HEAD_INIT(config->crtcs); + config->encoders =3D (struct list_head)LIST_HEAD_INIT(config->encoders); =20 return config; } @@ -28,6 +29,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, { struct vkms_config *config; struct vkms_config_crtc *crtc_cfg; + struct vkms_config_encoder *encoder_cfg; =20 config =3D vkms_config_create(DEFAULT_DEVICE_NAME); if (IS_ERR(config)) @@ -40,16 +42,24 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, if (IS_ERR(crtc_cfg)) return ERR_CAST(crtc_cfg); =20 + encoder_cfg =3D vkms_config_add_encoder(config, BIT(0)); + if (IS_ERR(encoder_cfg)) + return ERR_CAST(encoder_cfg); + return config; } =20 void vkms_config_destroy(struct vkms_config *config) { struct vkms_config_crtc *crtc_cfg, *crtc_tmp; + struct vkms_config_encoder *encoder_cfg, *encoder_tmp; =20 list_for_each_entry_safe(crtc_cfg, crtc_tmp, &config->crtcs, list) vkms_config_destroy_crtc(config, crtc_cfg); =20 + list_for_each_entry_safe(encoder_cfg, encoder_tmp, &config->encoders, lis= t) + vkms_config_destroy_encoder(config, encoder_cfg); + kfree(config); } =20 @@ -59,6 +69,7 @@ static int vkms_config_show(struct seq_file *m, void *dat= a) struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); struct vkms_config_crtc *crtc_cfg; + struct vkms_config_encoder *encoder_cfg; int n; =20 seq_printf(m, "dev_name=3D%s\n", vkmsdev->config->dev_name); @@ -72,6 +83,13 @@ static int vkms_config_show(struct seq_file *m, void *da= ta) n++; } =20 + n =3D 0; + list_for_each_entry(encoder_cfg, &vkmsdev->config->encoders, list) { + seq_printf(m, "encoder(%d).possible_crtcs=3D%d\n", n, + encoder_cfg->possible_crtcs); + n++; + } + return 0; } =20 @@ -116,3 +134,35 @@ void vkms_config_destroy_crtc(struct vkms_config *conf= ig, list_del(&crtc_cfg->list); kfree(crtc_cfg); } + +struct vkms_config_encoder *vkms_config_add_encoder(struct vkms_config *co= nfig, + uint32_t possible_crtcs) +{ + struct vkms_config_encoder *encoder_cfg; + + encoder_cfg =3D kzalloc(sizeof(*encoder_cfg), GFP_KERNEL); + if (!encoder_cfg) + return ERR_PTR(-ENOMEM); + + encoder_cfg->possible_crtcs =3D possible_crtcs; + + encoder_cfg->index =3D 0; + if (!list_empty(&config->encoders)) { + struct vkms_config_encoder *last; + + last =3D list_last_entry(&config->encoders, + struct vkms_config_encoder, list); + encoder_cfg->index =3D last->index + 1; + } + + list_add_tail(&encoder_cfg->list, &config->encoders); + + return encoder_cfg; +} + +void vkms_config_destroy_encoder(struct vkms_config *config, + struct vkms_config_encoder *encoder_cfg) +{ + list_del(&encoder_cfg->list); + kfree(encoder_cfg); +} diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index bc40a0e3859a..b717b5c0d3d9 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -14,11 +14,18 @@ struct vkms_config_crtc { bool writeback; }; =20 +struct vkms_config_encoder { + struct list_head list; + unsigned int index; + uint32_t possible_crtcs; +}; + struct vkms_config { char *dev_name; bool cursor; bool overlay; struct list_head crtcs; + struct list_head encoders; /* only set when instantiated */ struct vkms_device *dev; }; @@ -39,4 +46,10 @@ struct vkms_config_crtc *vkms_config_add_crtc(struct vkm= s_config *config, void vkms_config_destroy_crtc(struct vkms_config *config, struct vkms_config_crtc *crtc_cfg); =20 +/* Encoders */ +struct vkms_config_encoder *vkms_config_add_encoder(struct vkms_config *co= nfig, + uint32_t possible_crtcs); +void vkms_config_destroy_encoder(struct vkms_config *config, + struct vkms_config_encoder *encoder_cfg); + #endif /* _VKMS_CONFIG_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 15f0b72af325..7afe37aea52d 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -30,7 +30,8 @@ static const struct drm_connector_helper_funcs vkms_conn_= helper_funcs =3D { }; =20 static struct drm_encoder *vkms_encoder_init(struct vkms_device *vkms_devi= ce, - uint32_t possible_crtcs) + uint32_t possible_crtcs, + unsigned int index) { struct drm_encoder *encoder; int ret; @@ -49,6 +50,7 @@ static struct drm_encoder *vkms_encoder_init(struct vkms_= device *vkms_device, return ERR_PTR(ret); } =20 + encoder->index =3D index; encoder->possible_crtcs =3D possible_crtcs; =20 return encoder; @@ -74,6 +76,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int ind= ex) struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector =3D &output->connector; struct drm_encoder *encoder; + struct vkms_config_encoder *encoder_cfg; struct vkms_crtc *vkms_crtc; struct vkms_config_crtc *crtc_cfg; struct vkms_plane *primary, *cursor =3D NULL; @@ -123,9 +126,12 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) =20 drm_connector_helper_add(connector, &vkms_conn_helper_funcs); =20 - encoder =3D vkms_encoder_init(vkmsdev, BIT(0)); - if (IS_ERR(encoder)) - return PTR_ERR(encoder); + list_for_each_entry(encoder_cfg, &vkmsdev->config->encoders, list) { + encoder =3D vkms_encoder_init(vkmsdev, encoder_cfg->possible_crtcs, + encoder_cfg->index); + if (IS_ERR(encoder)) + return PTR_ERR(encoder); + } =20 ret =3D drm_connector_attach_encoder(connector, encoder); if (ret) { --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81B3819CCF2 for ; Tue, 13 Aug 2024 10:51:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546311; cv=none; b=iuxaW09731bo/s0NbxLP//sUvFo45nXJ14upADwTRBN3AtBygKIdWwWvTlLAFhJx94mR61IIRPiOLfTCXBXm6DzosJpKdEUrQoduDWmwfnnNobRhdXoyxiVtL7rsdlKe5K7SswwpVTih/s/BY13cL+6CGWZaazqxmhFA3j/IUus= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546311; c=relaxed/simple; bh=5VTbR7iPQ9XE5cd0WXphMMLzFTYPblcphuvT2F/YhTQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=K0Gb9t02Z85x3YI2P+yU9Qrsf99Mb+Db7IuK5Y+7Hb84X/kZoRr3zeLg/d9XQ2sizhMhF9vqN3PRC3rI34dLOhoCaHA3VIKnzXa3uuJUqOTkjtFS0OHiLykYxukPXuvt14Y9vvuNMQHLufpG5Bqeoz8KATSb6wXHkMTvIFEh2Ws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AQN+FPPg; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AQN+FPPg" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-429d2d7be1eso9210345e9.1 for ; Tue, 13 Aug 2024 03:51:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546308; x=1724151108; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yPJvcbH5lYbi1tdr48EenmYPKkhD5TMeNHQFHVN3Exg=; b=AQN+FPPg/sbUKGcRfKikr/NhfH9ppc51WHRR4FBK9tMaMW8o1JQluzQ0FFHbcUJVyx so8+/qHm2X1S2vFNV0vSA4vC8JFHGyfRIt04Nqo4QLg2Ao0Bbk7QPZ7yA70vIIjJ7EdD F0LJwxp0P+8rQzkYytwqxnoY20+oaMDgwkhe3xQ5AKNXR5je7wdEBPwyyh2GrFaBWLI8 1F5jMPEWJqGc8JXJs8K9xyJL09rxeG6l3yIZh0umT5dS1icnNqJF6vX4HMx6ZFIPDqMd xydWoFIjp1JljpAouLf9ERYcVvYxeFushwsLeaZ25vvQB003uNZy0iBSmtvDAuug0Rf8 MQXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546308; x=1724151108; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yPJvcbH5lYbi1tdr48EenmYPKkhD5TMeNHQFHVN3Exg=; b=a4XjidlhQb8UhDqF4PDbpllm+zYDTYqaSo5D2PLSNSx5FJYQwLTTyN1d30e5BcdUBd CfchnfdR/pLVVwjuLWEFg7aOQcI1OfN5lliodvjIgiUGa4eVghMeOeFsntDj1s1q2ZLa BdvVklfk0StXJJcIB1/s6nYlfZvG+/z935q5yf67p08C1ApG9NRmgcc5nIMafkbr380Z t8c4Lds8ZZESXgy+lGw21xfEcdfHDNN2g+CKgQm+IBlvpQBeId59/DXaKPfdDeLwLRBw 3OMypGHFkDeweIJdulENje5xwYVddic9iIidHyRI0OpllXYxDeVfT6Ey94KYDBRuFHz9 hDLQ== X-Forwarded-Encrypted: i=1; AJvYcCWZhVP7i5XmoUj7ulVaR/9O5fYFxlnwcMWpPxmFhtAr2/HOxEdxF3/lJhMO1efOhIL35DKZu0e6rOEQFrQd5tnG1SRsqf70eUrpzFvE X-Gm-Message-State: AOJu0YwyF+Q+7alIZ8W5GajnMySeUiQwp2sRDgU64uLbC7Ufn7O8Eg0R oGI3gB0dQwub1zNlVc9Gc3yzr3hz/RMOv33lp+aMw5f7hFH800G4 X-Google-Smtp-Source: AGHT+IHcFaaF5NVEVnvtNiV476r9AqohxbQTNIubIsJ2CbGH8C94GlKmoddxaTxdje9PNBr2TQhbQA== X-Received: by 2002:a05:600c:1c17:b0:426:6981:1bd with SMTP id 5b1f17b1804b1-429d6280c76mr19765785e9.5.1723546307600; Tue, 13 Aug 2024 03:51:47 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:46 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 07/17] drm/vkms: Use managed memory to create connectors Date: Tue, 13 Aug 2024 12:44:18 +0200 Message-ID: <20240813105134.17439-8-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable A future patch will allow to create multiple connectors. Use managed memory to simplify the code. Refactor, no functional changes. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_drv.h | 5 --- drivers/gpu/drm/vkms/vkms_output.c | 53 +++++++++++++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 2466e8b0231f..cac37d21654a 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -121,14 +121,9 @@ struct vkms_crtc { =20 struct vkms_config; =20 -struct vkms_output { - struct drm_connector connector; -}; - struct vkms_device { struct drm_device drm; struct platform_device *platform; - struct vkms_output output; struct list_head crtcs; const struct vkms_config *config; }; diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 7afe37aea52d..4413cf88afc7 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -9,7 +9,6 @@ =20 static const struct drm_connector_funcs vkms_connector_funcs =3D { .fill_modes =3D drm_helper_probe_single_connector_modes, - .destroy =3D drm_connector_cleanup, .reset =3D drm_atomic_helper_connector_reset, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, @@ -29,6 +28,33 @@ static const struct drm_connector_helper_funcs vkms_conn= _helper_funcs =3D { .get_modes =3D vkms_conn_get_modes, }; =20 +static struct drm_connector *vkms_connector_init(struct vkms_device *vkms_= device, + uint32_t possible_encoders) +{ + struct drm_connector *connector; + int ret; + + connector =3D drmm_kzalloc(&vkms_device->drm, sizeof(*connector), GFP_KER= NEL); + if (!connector) { + DRM_ERROR("Failed to allocate connector\n"); + return ERR_PTR(-ENOMEM); + } + + ret =3D drmm_connector_init(&vkms_device->drm, connector, + &vkms_connector_funcs, + DRM_MODE_CONNECTOR_VIRTUAL, NULL); + if (ret) { + DRM_ERROR("Failed to init connector\n"); + kfree(connector); + return ERR_PTR(ret); + } + + connector->possible_encoders =3D possible_encoders; + drm_connector_helper_add(connector, &vkms_conn_helper_funcs); + + return connector; +} + static struct drm_encoder *vkms_encoder_init(struct vkms_device *vkms_devi= ce, uint32_t possible_crtcs, unsigned int index) @@ -72,9 +98,8 @@ static int vkms_add_overlay_plane(struct vkms_device *vkm= sdev, int index) =20 int vkms_output_init(struct vkms_device *vkmsdev, int index) { - struct vkms_output *output =3D &vkmsdev->output; struct drm_device *dev =3D &vkmsdev->drm; - struct drm_connector *connector =3D &output->connector; + struct drm_connector *connector; struct drm_encoder *encoder; struct vkms_config_encoder *encoder_cfg; struct vkms_crtc *vkms_crtc; @@ -117,14 +142,9 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) } } =20 - ret =3D drm_connector_init(dev, connector, &vkms_connector_funcs, - DRM_MODE_CONNECTOR_VIRTUAL); - if (ret) { - DRM_ERROR("Failed to init connector\n"); - return ret; - } - - drm_connector_helper_add(connector, &vkms_conn_helper_funcs); + connector =3D vkms_connector_init(vkmsdev, BIT(index)); + if (IS_ERR(connector)) + return PTR_ERR(connector); =20 list_for_each_entry(encoder_cfg, &vkmsdev->config->encoders, list) { encoder =3D vkms_encoder_init(vkmsdev, encoder_cfg->possible_crtcs, @@ -133,18 +153,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) return PTR_ERR(encoder); } =20 - ret =3D drm_connector_attach_encoder(connector, encoder); - if (ret) { - DRM_ERROR("Failed to attach connector to encoder\n"); - goto err_attach; - } - drm_mode_config_reset(dev); =20 return 0; - -err_attach: - drm_connector_cleanup(connector); - - return ret; } --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E79F19CD0A for ; Tue, 13 Aug 2024 10:51:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546313; cv=none; b=i+G1axXDDfy5RXEgmQuYYTfwFmr6bo+sxXWxvelJpqumAOyvtPSDBgLyiez96RTMejoVjBgzSJ995hZqVVmPNv7TbI2drNoTthLtG59Df2ODe9ZvlRZ+PxxVXlNgMwy9xOcL5BtVOa2dEMfcCmQF+l5JnpTy0iZ9Rgf7ZtVHIMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546313; c=relaxed/simple; bh=IEbzy0xiW/7I/kkCdKp6/fuhTTcrQvU7IOcSqo0GqmE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=of4vMOF4diJj8oXSPUhZvXFgY29K8XnbPiBEBy2IpJhBLPBMHWiEz/sOGCvjC06vL82MZJ4EjBI4PQdf4PAffeBA3o+Tl2A0geLxIWF1qkWFi7z87pflAy0Jh88h7p/KsKRXKiKVtz8edWELz4IION5xlfsocxF7X+rCPCfcHbY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=B1MerMkW; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B1MerMkW" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-52f01afa11cso6533752e87.0 for ; Tue, 13 Aug 2024 03:51:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546309; x=1724151109; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=z1b1Eswx9qL8T6Rd6UW0NQch1ATeb/MIAR8sy8FcP0k=; b=B1MerMkWpGwJsV2Maw99U9QckYDjO780MtYxW5UePmpwoFZ9te2Xanxa0BYWglSJ5C rJJUREx6TxmoIK7FQrZlk41NudSDE5bnyfLK/uKxdxP4i1pXNmioPGrvwPJBiVoWFQXY H7/MItszdVxFBUWV6nkx2XdEVaW/7EGj7Ru72kwpsLfzd1gm41/SRiAGTnUd9BsMo/IG bW1M1mv16IkbD+/mgcDtwEQzo3ai4ZhkbsVRC/dJ+Ujwu+6l6EGD1gLn1A+ayDCmTYS2 0BBHt/XE+ADXwultC+SmKNNB0q5eyvFtTlytbkbpu78/s0bmjBW2TKEzSKvCvXFiudZY rsDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546309; x=1724151109; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=z1b1Eswx9qL8T6Rd6UW0NQch1ATeb/MIAR8sy8FcP0k=; b=gDRRU6kHgJLRfjJjbki0Sv5xnfKJjrnoKG3/CRBaAbuXYsvk4gxWX8layaTpZF6wuN I5UDwxcBypxS7IFNirvTjffrF+zJ7PI+yWDyt3A7SMTYS+T1YuZveh2VqjDTPmO7WKSG d4pbmayJ72fnua/FvZY0TNSyYcnLyF4bTjGLmhRwPcEZHqY0pMm56zOMzlX/q0xZSMi6 2aVnlin/iVelYugnW6bk+rAIFFnGj/Lw9Pu4ug9XevevtBews3623PDysWW3RdEX1MWU EVNi293tJY9mDJEcghl9dpQrkyoBwIuz0a9LfNij9nOnvE0NkMsRYNcRjpSdY4FBEZfc GcWg== X-Forwarded-Encrypted: i=1; AJvYcCUAnwa+gMhe8hld5ln1ANvc7nKgOxY0KkBPzeqeSRrCPyY8BuAtUnLR/xz3tTymi0epRNuKdjVeYrZJ4XfPMSHxnEuzVPCB3hfHrVdV X-Gm-Message-State: AOJu0Ywv4VNUOvFwpm3cyz8qL6bAGhWr4FvRraUUxaaipRN9O2vFTdVj 48wIUHvCNENBi7ApRdehK92LcuxM5LhpibxONCvCxwffPav0bl1d X-Google-Smtp-Source: AGHT+IHDMdoPIt0vDtMzdf2vnVHY+f/UlarsLfOsG/b/9vpdwiWF/yN55OgcMzvIyUbn7rGva+IR1w== X-Received: by 2002:a05:6512:1592:b0:52b:bf8e:ffea with SMTP id 2adb3069b0e04-532136840a4mr1940424e87.40.1723546308846; Tue, 13 Aug 2024 03:51:48 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:48 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 08/17] drm/vkms: Allow to configure multiple connectors Date: Tue, 13 Aug 2024 12:44:19 +0200 Message-ID: <20240813105134.17439-9-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a list of connector configurations to vkms_config and add as many connector as configured during output initialization. For backwards compatibility, create a single connector in the default configuration. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 40 ++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 12 +++++++++ drivers/gpu/drm/vkms/vkms_output.c | 11 +++++--- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6a8dfebee24e..a456f9db3c66 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -19,6 +19,7 @@ struct vkms_config *vkms_config_create(char *dev_name) config->dev_name =3D dev_name; config->crtcs =3D (struct list_head)LIST_HEAD_INIT(config->crtcs); config->encoders =3D (struct list_head)LIST_HEAD_INIT(config->encoders); + config->connectors =3D (struct list_head)LIST_HEAD_INIT(config->connector= s); =20 return config; } @@ -30,6 +31,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, struct vkms_config *config; struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; + struct vkms_config_connector *connector_cfg; =20 config =3D vkms_config_create(DEFAULT_DEVICE_NAME); if (IS_ERR(config)) @@ -46,6 +48,10 @@ struct vkms_config *vkms_config_default_create(bool enab= le_cursor, if (IS_ERR(encoder_cfg)) return ERR_CAST(encoder_cfg); =20 + connector_cfg =3D vkms_config_add_connector(config, BIT(0)); + if (IS_ERR(connector_cfg)) + return ERR_CAST(connector_cfg); + return config; } =20 @@ -53,6 +59,7 @@ void vkms_config_destroy(struct vkms_config *config) { struct vkms_config_crtc *crtc_cfg, *crtc_tmp; struct vkms_config_encoder *encoder_cfg, *encoder_tmp; + struct vkms_config_connector *connector_cfg, *connector_tmp; =20 list_for_each_entry_safe(crtc_cfg, crtc_tmp, &config->crtcs, list) vkms_config_destroy_crtc(config, crtc_cfg); @@ -60,6 +67,9 @@ void vkms_config_destroy(struct vkms_config *config) list_for_each_entry_safe(encoder_cfg, encoder_tmp, &config->encoders, lis= t) vkms_config_destroy_encoder(config, encoder_cfg); =20 + list_for_each_entry_safe(connector_cfg, connector_tmp, &config->connector= s, list) + vkms_config_destroy_connector(config, connector_cfg); + kfree(config); } =20 @@ -70,6 +80,7 @@ static int vkms_config_show(struct seq_file *m, void *dat= a) struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; + struct vkms_config_connector *connector_cfg; int n; =20 seq_printf(m, "dev_name=3D%s\n", vkmsdev->config->dev_name); @@ -90,6 +101,13 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) n++; } =20 + n =3D 0; + list_for_each_entry(connector_cfg, &vkmsdev->config->connectors, list) { + seq_printf(m, "connector(%d).possible_encoders=3D%d\n", n, + connector_cfg->possible_encoders); + n++; + } + return 0; } =20 @@ -166,3 +184,25 @@ void vkms_config_destroy_encoder(struct vkms_config *c= onfig, list_del(&encoder_cfg->list); kfree(encoder_cfg); } + +struct vkms_config_connector *vkms_config_add_connector(struct vkms_config= *config, + uint32_t possible_encoders) +{ + struct vkms_config_connector *connector_cfg; + + connector_cfg =3D kzalloc(sizeof(*connector_cfg), GFP_KERNEL); + if (!connector_cfg) + return ERR_PTR(-ENOMEM); + + connector_cfg->possible_encoders =3D possible_encoders; + list_add_tail(&connector_cfg->list, &config->connectors); + + return connector_cfg; +} + +void vkms_config_destroy_connector(struct vkms_config *config, + struct vkms_config_connector *connector_cfg) +{ + list_del(&connector_cfg->list); + kfree(connector_cfg); +} diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index b717b5c0d3d9..f1dd59fc6300 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -20,12 +20,18 @@ struct vkms_config_encoder { uint32_t possible_crtcs; }; =20 +struct vkms_config_connector { + struct list_head list; + uint32_t possible_encoders; +}; + struct vkms_config { char *dev_name; bool cursor; bool overlay; struct list_head crtcs; struct list_head encoders; + struct list_head connectors; /* only set when instantiated */ struct vkms_device *dev; }; @@ -52,4 +58,10 @@ struct vkms_config_encoder *vkms_config_add_encoder(stru= ct vkms_config *config, void vkms_config_destroy_encoder(struct vkms_config *config, struct vkms_config_encoder *encoder_cfg); =20 +/* Connectors */ +struct vkms_config_connector *vkms_config_add_connector(struct vkms_config= *config, + uint32_t possible_encoders); +void vkms_config_destroy_connector(struct vkms_config *config, + struct vkms_config_connector *connector_cfg); + #endif /* _VKMS_CONFIG_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 4413cf88afc7..021a491de817 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -100,6 +100,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) { struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector; + struct vkms_config_connector *connector_cfg; struct drm_encoder *encoder; struct vkms_config_encoder *encoder_cfg; struct vkms_crtc *vkms_crtc; @@ -142,10 +143,6 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) } } =20 - connector =3D vkms_connector_init(vkmsdev, BIT(index)); - if (IS_ERR(connector)) - return PTR_ERR(connector); - list_for_each_entry(encoder_cfg, &vkmsdev->config->encoders, list) { encoder =3D vkms_encoder_init(vkmsdev, encoder_cfg->possible_crtcs, encoder_cfg->index); @@ -153,6 +150,12 @@ int vkms_output_init(struct vkms_device *vkmsdev, int = index) return PTR_ERR(encoder); } =20 + list_for_each_entry(connector_cfg, &vkmsdev->config->connectors, list) { + connector =3D vkms_connector_init(vkmsdev, connector_cfg->possible_encod= ers); + if (IS_ERR(connector)) + return PTR_ERR(connector); + } + drm_mode_config_reset(dev); =20 return 0; --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C1CD19CD11 for ; Tue, 13 Aug 2024 10:51:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546313; cv=none; b=QCJMjGRI5+HnbkWqtXq9pF9rzKsgW5uV1EIx204frFG+/1Q9Bd2QvUVDB7H4cTCjClHfAt1nVzGnYjKs4B73mrXwEa01XwH6eXw4TGug0vVrww7GTqJGu50jeEbmow7iWKI6+Rz69p3QFPDzaU/tJ2ezgIXoJBKJVtyv4fUwf4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546313; c=relaxed/simple; bh=y8C3C2ZCJMCiMbmIKhokCQgGEDGU78NAvmVul8hoE0g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ryKLGs6WzkBZnlOYaSI0289w3eiMpRqwh00v4/HKn0AtUBwKkaZCil+NH08zCCOg0Lfjkj5z5o0M+ktO2SoNbSCVJDjdRPFIqjRFwJp0EB0T+oVt1LiR9Uk0ae4jKo0aLsXud8izPiEp7SU25XlxMCCvot/8u+4ipe3ktra/0Yo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HQGCS6Od; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HQGCS6Od" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-428e3129851so39287905e9.3 for ; Tue, 13 Aug 2024 03:51:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546310; x=1724151110; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rMbXv874dHtsCrZeML3BpyopJo288L3/apBZJHbVOhk=; b=HQGCS6OduYqYD+z33BsjozuhsvmfHxRGYK/Hyspu7hEViDAPDTgU6bHNczypuhyaD4 w/tfMUUmka/KOK8RMYlzpDP2CGyHDTFll+/lQ5M/TCdiuiyZmZAj2+UsSYxDWgJcPjwm qFKNBAZTwQ5sSSeSHQ9f0WaMDtT/kabsFLfgO2WEiI3jHVnUmRD1Xw21ctGgU+n+aIF9 53CaeO0kZz/P9KZnvs8h0wWtRtJd+ARw02eQZE0TGWoTfrFK0VRkxXQFOPIAHBV+sMuc EQ/aPVKPCx9RxEI8JH/tF9+gm9sZE8Ub6DCpawEi+Os7ckEXLOSZlrJ3cb2KlxNIhuLl S5aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546310; x=1724151110; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rMbXv874dHtsCrZeML3BpyopJo288L3/apBZJHbVOhk=; b=wOb8n/cTR63vCrop1WDDgJFsZhUjS9zhBefDLmE8EQq66Z7JeRfIZMjeuxVRoFVHHe FbMl0uF9B5CQy+8fpTA5EjsKjjlD/vf2NEf2hnoJmhew55r1zvxh1hROQAHBvXRahVlM Z3jwg+bpu7edCVZ+oYF+uhByQm2Vem8SX4zgm8YYs9/uYJpcc1RSJdmx4BPBr6KsfjRk CcWp7cRAc/EFNBeCubRIfUe2XSWHCTXbA/n0GWdYhUpriCM9YrFftNMuJ4GqwIqyahw9 vYfmy8DQGnE79uxDvS7jRYJrs15petG6ZardpieiLGkQNipqv3kUw4UP27Dw+UBRVnpH grxQ== X-Forwarded-Encrypted: i=1; AJvYcCUrKLkhnTay5tFBisW01Qe5DQv8d6yZZynHCCgqrRCcVpA9WJ1WSfonAdSAWBwzsG9TJGhd39A6ybSiyQocAVKpQr7ZyjKNTKuseTw3 X-Gm-Message-State: AOJu0YxIvUe62ebNvjdJOBKtWMznjyDD77rYqOMns7sI2XDN1HgVdnow 7kk5NM1KzJnMuJecRrtc7KEzwsbb7/l9smSRdhhaMgeB33uAv9gL X-Google-Smtp-Source: AGHT+IFOCeWvoZuGjI44xpEIh5rro/qgNHo4B3FX450VGqDCj0qY+tfMZ7moOEUZum//780E8hV+lw== X-Received: by 2002:a05:600c:4f53:b0:426:6d1a:d497 with SMTP id 5b1f17b1804b1-429d480dcb2mr19574965e9.12.1723546309738; Tue, 13 Aug 2024 03:51:49 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:49 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 09/17] drm/vkms: Allow to configure multiple overlay planes Date: Tue, 13 Aug 2024 12:44:20 +0200 Message-ID: <20240813105134.17439-10-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a list of overlay planes to vkms_config and add as many overlay planes as configured during output initialization. For backwards compatibility, add NUM_OVERLAY_PLANES to the default configuration. Note that a primary plane is created for each CRTC and it is not possible to configure it. A cursor plane is added conditionally if it is enabled in the CRTC configuration. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 53 +++++++++++++++++++++++++++--- drivers/gpu/drm/vkms/vkms_config.h | 16 +++++++-- drivers/gpu/drm/vkms/vkms_drv.c | 2 +- drivers/gpu/drm/vkms/vkms_drv.h | 5 +-- drivers/gpu/drm/vkms/vkms_output.c | 43 ++++++++++++------------ drivers/gpu/drm/vkms/vkms_plane.c | 6 ++-- 6 files changed, 91 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index a456f9db3c66..d95a42a6745a 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -17,6 +17,7 @@ struct vkms_config *vkms_config_create(char *dev_name) return ERR_PTR(-ENOMEM); =20 config->dev_name =3D dev_name; + config->planes =3D (struct list_head)LIST_HEAD_INIT(config->planes); config->crtcs =3D (struct list_head)LIST_HEAD_INIT(config->crtcs); config->encoders =3D (struct list_head)LIST_HEAD_INIT(config->encoders); config->connectors =3D (struct list_head)LIST_HEAD_INIT(config->connector= s); @@ -32,15 +33,22 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; struct vkms_config_connector *connector_cfg; + struct vkms_config_plane *plane_cfg; + int n; =20 config =3D vkms_config_create(DEFAULT_DEVICE_NAME); if (IS_ERR(config)) return config; =20 - config->cursor =3D enable_cursor; - config->overlay =3D enable_overlay; + if (enable_overlay) { + for (n =3D 0; n < NUM_OVERLAY_PLANES; n++) { + plane_cfg =3D vkms_config_add_overlay_plane(config, BIT(0)); + if (IS_ERR(plane_cfg)) + return ERR_CAST(plane_cfg); + } + } =20 - crtc_cfg =3D vkms_config_add_crtc(config, enable_writeback); + crtc_cfg =3D vkms_config_add_crtc(config, enable_cursor, enable_writeback= ); if (IS_ERR(crtc_cfg)) return ERR_CAST(crtc_cfg); =20 @@ -57,10 +65,14 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 void vkms_config_destroy(struct vkms_config *config) { + struct vkms_config_plane *plane_cfg, *plane_tmp; struct vkms_config_crtc *crtc_cfg, *crtc_tmp; struct vkms_config_encoder *encoder_cfg, *encoder_tmp; struct vkms_config_connector *connector_cfg, *connector_tmp; =20 + list_for_each_entry_safe(plane_cfg, plane_tmp, &config->planes, list) + vkms_config_destroy_overlay_plane(config, plane_cfg); + list_for_each_entry_safe(crtc_cfg, crtc_tmp, &config->crtcs, list) vkms_config_destroy_crtc(config, crtc_cfg); =20 @@ -78,17 +90,24 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) struct drm_debugfs_entry *entry =3D m->private; struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; struct vkms_config_connector *connector_cfg; int n; =20 seq_printf(m, "dev_name=3D%s\n", vkmsdev->config->dev_name); - seq_printf(m, "cursor=3D%d\n", vkmsdev->config->cursor); - seq_printf(m, "overlay=3D%d\n", vkmsdev->config->overlay); + + n =3D 0; + list_for_each_entry(plane_cfg, &vkmsdev->config->planes, list) { + seq_printf(m, "plane(%d).possible_crtcs=3D%d\n", n, + plane_cfg->possible_crtcs); + n++; + } =20 n =3D 0; list_for_each_entry(crtc_cfg, &vkmsdev->config->crtcs, list) { + seq_printf(m, "crtc(%d).cursor=3D%d\n", n, crtc_cfg->cursor); seq_printf(m, "crtc(%d).writeback=3D%d\n", n, crtc_cfg->writeback); n++; @@ -121,7 +140,30 @@ void vkms_config_debugfs_init(struct vkms_device *vkms= _device) ARRAY_SIZE(vkms_config_debugfs_list)); } =20 +struct vkms_config_plane *vkms_config_add_overlay_plane(struct vkms_config= *config, + uint32_t possible_crtcs) +{ + struct vkms_config_plane *plane_cfg; + + plane_cfg =3D kzalloc(sizeof(*plane_cfg), GFP_KERNEL); + if (!plane_cfg) + return ERR_PTR(-ENOMEM); + + plane_cfg->possible_crtcs =3D possible_crtcs; + list_add_tail(&plane_cfg->list, &config->planes); + + return plane_cfg; +} + +void vkms_config_destroy_overlay_plane(struct vkms_config *config, + struct vkms_config_plane *plane_cfg) +{ + list_del(&plane_cfg->list); + kfree(plane_cfg); +} + struct vkms_config_crtc *vkms_config_add_crtc(struct vkms_config *config, + bool enable_cursor, bool enable_writeback) { struct vkms_config_crtc *crtc_cfg; @@ -130,6 +172,7 @@ struct vkms_config_crtc *vkms_config_add_crtc(struct vk= ms_config *config, if (!crtc_cfg) return ERR_PTR(-ENOMEM); =20 + crtc_cfg->cursor =3D enable_cursor; crtc_cfg->writeback =3D enable_writeback; =20 crtc_cfg->index =3D 0; diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index f1dd59fc6300..25dab63e7ae7 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -8,9 +8,15 @@ =20 struct vkms_device; =20 +struct vkms_config_plane { + struct list_head list; + uint32_t possible_crtcs; +}; + struct vkms_config_crtc { struct list_head list; unsigned int index; + bool cursor; bool writeback; }; =20 @@ -27,8 +33,7 @@ struct vkms_config_connector { =20 struct vkms_config { char *dev_name; - bool cursor; - bool overlay; + struct list_head planes; struct list_head crtcs; struct list_head encoders; struct list_head connectors; @@ -46,8 +51,15 @@ void vkms_config_destroy(struct vkms_config *config); /* DebugFS */ void vkms_config_debugfs_init(struct vkms_device *vkms_device); =20 +/* Planes */ +struct vkms_config_plane *vkms_config_add_overlay_plane(struct vkms_config= *config, + uint32_t possible_crtcs); +void vkms_config_destroy_overlay_plane(struct vkms_config *config, + struct vkms_config_plane *plane_cfg); + /* CRTCs */ struct vkms_config_crtc *vkms_config_add_crtc(struct vkms_config *config, + bool enable_cursor, bool enable_writeback); void vkms_config_destroy_crtc(struct vkms_config *config, struct vkms_config_crtc *crtc_cfg); diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index 15a2ba26d190..b0a079eb4598 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -154,7 +154,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsde= v) dev->mode_config.preferred_depth =3D 0; dev->mode_config.helper_private =3D &vkms_mode_config_helpers; =20 - return vkms_output_init(vkmsdev, 0); + return vkms_output_init(vkmsdev); } =20 static int vkms_create(struct vkms_config *config) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index cac37d21654a..76394285dc68 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -149,10 +149,11 @@ struct vkms_crtc *vkms_crtc_init(struct drm_device *d= ev, struct drm_plane *cursor, unsigned int index); =20 -int vkms_output_init(struct vkms_device *vkmsdev, int index); +int vkms_output_init(struct vkms_device *vkmsdev); =20 struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type, int index); + enum drm_plane_type type, + uint32_t possible_crtcs); =20 /* CRC Support */ const char *const *vkms_get_crc_sources(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 021a491de817..a5b1ab326cdd 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -82,21 +82,22 @@ static struct drm_encoder *vkms_encoder_init(struct vkm= s_device *vkms_device, return encoder; } =20 -static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, int index) +static int vkms_add_overlay_plane(struct vkms_device *vkmsdev, + uint32_t possible_crtcs) { struct vkms_plane *overlay; =20 - overlay =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_OVERLAY, index); + overlay =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_OVERLAY, possible_crt= cs); if (IS_ERR(overlay)) return PTR_ERR(overlay); =20 if (!overlay->base.possible_crtcs) - overlay->base.possible_crtcs =3D BIT(index); + overlay->base.possible_crtcs =3D possible_crtcs; =20 return 0; } =20 -int vkms_output_init(struct vkms_device *vkmsdev, int index) +int vkms_output_init(struct vkms_device *vkmsdev) { struct drm_device *dev =3D &vkmsdev->drm; struct drm_connector *connector; @@ -106,29 +107,27 @@ int vkms_output_init(struct vkms_device *vkmsdev, int= index) struct vkms_crtc *vkms_crtc; struct vkms_config_crtc *crtc_cfg; struct vkms_plane *primary, *cursor =3D NULL; + struct vkms_config_plane *plane_cfg; int ret; int writeback; - unsigned int n; =20 - primary =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, index); - if (IS_ERR(primary)) - return PTR_ERR(primary); - - if (vkmsdev->config->overlay) { - for (n =3D 0; n < NUM_OVERLAY_PLANES; n++) { - ret =3D vkms_add_overlay_plane(vkmsdev, index); - if (ret) - return ret; - } - } - - if (vkmsdev->config->cursor) { - cursor =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index); - if (IS_ERR(cursor)) - return PTR_ERR(cursor); + list_for_each_entry(plane_cfg, &vkmsdev->config->planes, list) { + ret =3D vkms_add_overlay_plane(vkmsdev, plane_cfg->possible_crtcs); + if (ret) + return ret; } =20 list_for_each_entry(crtc_cfg, &vkmsdev->config->crtcs, list) { + primary =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, 0); + if (IS_ERR(primary)) + return PTR_ERR(primary); + + if (crtc_cfg->cursor) { + cursor =3D vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, 0); + if (IS_ERR(cursor)) + return PTR_ERR(cursor); + } + vkms_crtc =3D vkms_crtc_init(dev, &primary->base, &cursor->base, crtc_cfg->index); if (IS_ERR(vkms_crtc)) @@ -141,6 +140,8 @@ int vkms_output_init(struct vkms_device *vkmsdev, int i= ndex) if (writeback) DRM_ERROR("Failed to init writeback connector\n"); } + + cursor =3D NULL; } =20 list_for_each_entry(encoder_cfg, &vkmsdev->config->encoders, list) { diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index e5c625ab8e3e..eb3edf4cb928 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -198,13 +198,13 @@ static const struct drm_plane_helper_funcs vkms_plane= _helper_funcs =3D { }; =20 struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type, int index) + enum drm_plane_type type, uint32_t possible_crtcs) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_plane *plane; =20 - plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 1 << i= ndex, - &vkms_plane_funcs, + plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, + possible_crtcs, &vkms_plane_funcs, vkms_formats, ARRAY_SIZE(vkms_formats), NULL, type, NULL); if (IS_ERR(plane)) --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9640819CCF7 for ; Tue, 13 Aug 2024 10:51:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546315; cv=none; b=P6nvGlKeys+cSfuYBxKLjmZCLwW8fQ8TsUGZ/huamDerCKTc52ok2drFn0MOT6Xi2lvy7dZXIwjwRoD/nedMsX5Es8WsakP1Iir8sb4NFOIJIvdAmuqS2sGx1eC74xxVoHGitYY2l6M2ZLXLTdOBJZHxN6bBj6bq9dIYQLjv+ew= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546315; c=relaxed/simple; bh=+ErXRFhQq6+0n0HTh/n2Xlvncgf68Nk9s6WH+laThEw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XUVN2NZByVmpLtN4/mOYwezC3LwWdCa3tjY0UqOWS+46XWoWZm6X0S0OzhyhHRSUkHKvxwKmWOjQnV91BFUJajShdon9mM/swD3mtI3XWd5kmdeEzD/XxSCVMn5BZeChaRmeycgE7oM+e0Jl+HQTtN3Lj07cl2IZxkzNiD7onSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iS/UqUa0; arc=none smtp.client-ip=209.85.208.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iS/UqUa0" Received: by mail-lj1-f181.google.com with SMTP id 38308e7fff4ca-2eeb1ba0468so67866721fa.0 for ; Tue, 13 Aug 2024 03:51:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546312; x=1724151112; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZqQI2pSvN1r3euYPp2vCyWNVjuvi3Z3cQv0iU7vYqtw=; b=iS/UqUa0beTSA7xdj5lUtVJk4RRU51wQXkKwIXzbro+1dA1P/AYcot54kmQDNRKoJk OhPdFgtciihicGTMyH7LpUDgcR5HxcmTxDrvJFOH0Ke48aiozhfwQUPdwMhLwPpZZRbB fz3MAbRB+kRIbdmuF5H/P2H1ldKnalu+HfIGehLFQUDjN1nFw10HfVibrJ9F43BMFXbO SA7cc1dSDJwvanDI33H9PUUfEWRR7s3iyf46LoeW0oeXZHVjYTcjJWYI8HCpUT2sMble 9ebszxWdYZJqVdfCadkg8gbvz1Erojy2/1Rdb0CV4PTmd+9Qi66yKZb2uZpydQjbpMLc 2KVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546312; x=1724151112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZqQI2pSvN1r3euYPp2vCyWNVjuvi3Z3cQv0iU7vYqtw=; b=Pk4mSfiRdOUY6BNYqEmLbQya5e9rpuJkuYqVkL0XBkvdASJ+i87V1N0iMeAolPUJOz nkwevPlblO3hy9lGXM6tXacyYhDIfLZuO6dOyxIXHaFyMIb9VslngexRUZDU3ET73cTJ SG+zJJ8EqveuDpcV40uORx52WXRIHbgt+GwRuMsVFqdBcNNjGIR2geclnZhuxDbRDw47 jEM88U91jp0i+g//4cfo6uHoxK+MHcc+uWD2DygYwbXIGvsaDvdUOL3uZ61Pl2hG63GL 0iAOIN0jTlIe1xEUx3OqFL7kTuwoJd1t3kxqwJlWYJKs32fLBdGZHd6WXVegEjDpW+vU YuNw== X-Forwarded-Encrypted: i=1; AJvYcCVG0ZXNjULLqtBcpn6PcSrSflRTQWGDTs5fXT+k7/hYHRxq0DsRBbSgVfF3NP13MkF66BbBR1VXwweuuawwW2+mYJ8C3gmWiSTvNl6h X-Gm-Message-State: AOJu0YwaiPRRfpVAaJkDs/os1UHtg4QJAYQwrTItb6rrCZ7eqiJltX0E lnkNRrqkeo8nrXoZ5p+ele0bl0bsBD3S8Xgirvfjid/CO3Pk5hjF X-Google-Smtp-Source: AGHT+IEE/5oIBKt+yDiQMW0HbZMqJpQ32z2JEVYHvnsw69984l4lJ/4s/IJTZ5H3jFbn7gTtOtW3Rw== X-Received: by 2002:a05:6512:114c:b0:52c:d80e:55a5 with SMTP id 2adb3069b0e04-53213693ec2mr2061169e87.41.1723546311208; Tue, 13 Aug 2024 03:51:51 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:50 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 10/17] drm/vkms: Allow to change connector status Date: Tue, 13 Aug 2024 12:44:21 +0200 Message-ID: <20240813105134.17439-11-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Store the connector status in vkms_config_connector and use the stored value to update the connector status in the drm_connector_funcs.detect() function. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_config.c | 18 ++++++++++++++++-- drivers/gpu/drm/vkms/vkms_config.h | 12 +++++++++++- drivers/gpu/drm/vkms/vkms_output.c | 20 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index d95a42a6745a..e8e5c02c9d43 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,6 +3,7 @@ #include =20 #include +#include #include =20 #include "vkms_config.h" @@ -56,7 +57,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, if (IS_ERR(encoder_cfg)) return ERR_CAST(encoder_cfg); =20 - connector_cfg =3D vkms_config_add_connector(config, BIT(0)); + connector_cfg =3D vkms_config_add_connector(config, BIT(0), connector_sta= tus_connected); if (IS_ERR(connector_cfg)) return ERR_CAST(connector_cfg); =20 @@ -124,6 +125,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) list_for_each_entry(connector_cfg, &vkmsdev->config->connectors, list) { seq_printf(m, "connector(%d).possible_encoders=3D%d\n", n, connector_cfg->possible_encoders); + seq_printf(m, "connector(%d).status=3D%d\n", n, + connector_cfg->status); n++; } =20 @@ -229,7 +232,8 @@ void vkms_config_destroy_encoder(struct vkms_config *co= nfig, } =20 struct vkms_config_connector *vkms_config_add_connector(struct vkms_config= *config, - uint32_t possible_encoders) + uint32_t possible_encoders, + enum drm_connector_status status) { struct vkms_config_connector *connector_cfg; =20 @@ -238,6 +242,7 @@ struct vkms_config_connector *vkms_config_add_connector= (struct vkms_config *conf return ERR_PTR(-ENOMEM); =20 connector_cfg->possible_encoders =3D possible_encoders; + connector_cfg->status =3D status; list_add_tail(&connector_cfg->list, &config->connectors); =20 return connector_cfg; @@ -249,3 +254,12 @@ void vkms_config_destroy_connector(struct vkms_config = *config, list_del(&connector_cfg->list); kfree(connector_cfg); } + +void vkms_update_connector_status(struct vkms_config *config, + struct vkms_config_connector *connector_cfg, + enum drm_connector_status status) +{ + connector_cfg->status =3D status; + if (config->dev) + drm_kms_helper_hotplug_event(&config->dev->drm); +} diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 25dab63e7ae7..3237406fa3a3 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -6,6 +6,8 @@ #include #include =20 +#include + struct vkms_device; =20 struct vkms_config_plane { @@ -29,6 +31,9 @@ struct vkms_config_encoder { struct vkms_config_connector { struct list_head list; uint32_t possible_encoders; + enum drm_connector_status status; + /* only set when instantiated */ + struct drm_connector *connector; }; =20 struct vkms_config { @@ -72,8 +77,13 @@ void vkms_config_destroy_encoder(struct vkms_config *con= fig, =20 /* Connectors */ struct vkms_config_connector *vkms_config_add_connector(struct vkms_config= *config, - uint32_t possible_encoders); + uint32_t possible_encoders, + enum drm_connector_status status); void vkms_config_destroy_connector(struct vkms_config *config, struct vkms_config_connector *connector_cfg); =20 +void vkms_update_connector_status(struct vkms_config *config, + struct vkms_config_connector *connector_cfg, + enum drm_connector_status status); + #endif /* _VKMS_CONFIG_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index a5b1ab326cdd..511cc2c14c44 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -7,7 +7,25 @@ #include #include =20 +static enum drm_connector_status vkms_connector_detect(struct drm_connecto= r *connector, + bool force) +{ + struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(connector->dev); + enum drm_connector_status status =3D connector->status; + struct vkms_config_connector *connector_cfg; + + list_for_each_entry(connector_cfg, &vkmsdev->config->connectors, list) { + if (connector_cfg->connector =3D=3D connector) { + status =3D connector_cfg->status; + break; + } + } + + return status; +} + static const struct drm_connector_funcs vkms_connector_funcs =3D { + .detect =3D vkms_connector_detect, .fill_modes =3D drm_helper_probe_single_connector_modes, .reset =3D drm_atomic_helper_connector_reset, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, @@ -155,6 +173,8 @@ int vkms_output_init(struct vkms_device *vkmsdev) connector =3D vkms_connector_init(vkmsdev, connector_cfg->possible_encod= ers); if (IS_ERR(connector)) return PTR_ERR(connector); + + connector_cfg->connector =3D connector; } =20 drm_mode_config_reset(dev); --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F08AE19D089 for ; Tue, 13 Aug 2024 10:51:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546316; cv=none; b=aD0bWa4oDSkVMJBHkaSXKPnhaUjOncyfqSKh//QM+jx4ySqpFr1AtsGiGeDu6t+/CAazf4sFp3EFwVzuvaeENGxW8R1bPjTPYtZi1pQncaUvN0c9IUmsIpA3vvC1qGtd/IQMrk4QvsOW/IXC9qqg3HskzGv/BWqaBKfVzHT0tkQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546316; c=relaxed/simple; bh=XAkTXSUnO8yKhxoft8vmT45KV7rwTDV6cptm5NVJy0g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=l9Zgm2+GL0mbStu7VQBGK7Sk0lGT2+dqB44RgpY8U/Qppi4Gbp2ib1+CMqz7Gk2l39ijAWEfS+uSXdBWizbRo/ScNJtJWWmhwOvUDTkzNJVnVrXAW6Rs9xQuxUKgqYXitfmgNJbeCfThSbk8kdNOPW9PDX89D1Y1+3rfxnJQVTQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=a2blu1h3; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="a2blu1h3" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-42817f1eb1fso37585065e9.1 for ; Tue, 13 Aug 2024 03:51:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546312; x=1724151112; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2DZ0yno09DV6vF4OePQpExTeBzGL+DurmJi2vCnaEVY=; b=a2blu1h3Jef8yLbTvXN4Lx1tkS6AMTWawlxK8jiI+6a/V5qHN4dS+vjC/EYBVZAJ+C z1XhVEU40oZuIzvpBPlAZhbn7iydc7VIKKn8vdFgl3uc6Dd+enowRQvhYoIzSJznwdxH 5BMwZ6TGrz0Exst15X3n5G5VnyhuMFvH+5dBgVQkviARdNjO0slI8n7lSKWZADozaryl 1gT7z4Kn3PXuMcWFe6BWnsRE4NetB8Q/HA0gYYnjX442dLoI+/a/iP8dKKTDdu+MhuVR MUqdOKqmjzi2K8ffSuwmhWPNmyhShWjWomaJfdyUDYKxP0OSy0eaLEHG7g69K0WIgW1a 8l5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546312; x=1724151112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2DZ0yno09DV6vF4OePQpExTeBzGL+DurmJi2vCnaEVY=; b=Spds5qJ/l0WBb22OVNnJHaDqxyiJFbipyiCsdO+m3KvtXpYlkgfWVupJ3VbnT2m73E eFDbayCSPBpXbO1muFcZelpDDfOtvhSBYrvGoPMpTzYbCuStPLdtsRJWjw1Lxbfdqqch vbjHPStSgMlLZaYdGQeIxu+OGD6jScwzGbi0OhwAZI31z+Jk634W4BIgskW1TE8iG9d2 zHGSUGDmiY5fX79TlIHreRu7l6aFNiLmEaMe1vO5FXMPQ0JzkrAbg0GmXwIcjJG3n8Uu NM2RE6XHpz9FZUiohjv22v+CkEB3sq7I+GAbS69YwIy7jq6PCP/3kHEldKiXpUMoQj/R xGLQ== X-Forwarded-Encrypted: i=1; AJvYcCWUmhKeW3pQpxTsraSDhxtK0yKzbwKFP+95ksGBx+fYKizk80ilcmdW1fSkurxXdbmZHADiiMr1rBdByiQjvYTObdiewcJIWIKLUqsr X-Gm-Message-State: AOJu0Yxr9jRRN3U577ljqWPUaMAaYW51Gh2WEn7v+Apz57A7x/7PiTth WzhgtOP6/kqD0jKzNG8lUVvv80GfBtVMMtmXJi5FECBi0gWGobQG X-Google-Smtp-Source: AGHT+IGgpvIqHt0WTDhpBJPlq78QSS4s/Hy1j9s/Fr8VBNAtgOUXDZ38YXLRqoUGqRmktkNgk0w2DQ== X-Received: by 2002:a05:600c:1391:b0:426:6416:aa73 with SMTP id 5b1f17b1804b1-429d4828df2mr20461065e9.12.1723546312199; Tue, 13 Aug 2024 03:51:52 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:51 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 11/17] drm/vkms: Add and remove VKMS instances via configfs Date: Tue, 13 Aug 2024 12:44:22 +0200 Message-ID: <20240813105134.17439-12-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Allow to create, enable, disable and destroy VKMS instances using configfs. For the moment, add one primary plane, one CRC, one encoder and one connector until we add support to configure them via configfs. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 32 +++++ drivers/gpu/drm/vkms/Kconfig | 1 + drivers/gpu/drm/vkms/Makefile | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 198 +++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_configfs.h | 9 ++ drivers/gpu/drm/vkms/vkms_drv.c | 19 ++- drivers/gpu/drm/vkms/vkms_drv.h | 4 + 7 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.c create mode 100644 drivers/gpu/drm/vkms/vkms_configfs.h diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index ba04ac7c2167..9895a9ae76f4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -51,6 +51,38 @@ To disable the driver, use :: =20 sudo modprobe -r vkms =20 +Configuring With Configfs +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +It is possible to create and configure multiple VKMS instances via configf= s. + +Start by mounting configfs and loading VKMS:: + + sudo mount -t configfs none /config + sudo modprobe vkms + +Once VKMS is loaded, ``/config/vkms`` is created automatically. Each direc= tory +under ``/config/vkms`` represents a VKMS instance, create a new one:: + + sudo mkdir /config/vkms/my-vkms + +By default, the instance is disabled:: + + cat /config/vkms/my-vkms/enabled + 0 + +Once you are done configuring the VKMS instance, enable it:: + + echo "1" | sudo tee /config/vkms/my-vkms/enabled + +Finally, you can remove the VKMS instance disabling it:: + + echo "0" | sudo tee /config/vkms/my-vkms/enabled + +Or removing the top level directory:: + + sudo rmdir /config/vkms/my-vkms + Testing With IGT =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 diff --git a/drivers/gpu/drm/vkms/Kconfig b/drivers/gpu/drm/vkms/Kconfig index b9ecdebecb0b..de218b21a579 100644 --- a/drivers/gpu/drm/vkms/Kconfig +++ b/drivers/gpu/drm/vkms/Kconfig @@ -6,6 +6,7 @@ config DRM_VKMS select DRM_KMS_HELPER select DRM_GEM_SHMEM_HELPER select CRC32 + select CONFIGFS_FS default n help Virtual Kernel Mode-Setting (VKMS) is used for testing or for diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile index b371b5d70ee3..81c257d37689 100644 --- a/drivers/gpu/drm/vkms/Makefile +++ b/drivers/gpu/drm/vkms/Makefile @@ -7,6 +7,7 @@ vkms-y :=3D \ vkms_crtc.o \ vkms_composer.o \ vkms_writeback.o \ - vkms_config.o + vkms_config.o \ + vkms_configfs.o =20 obj-$(CONFIG_DRM_VKMS) +=3D vkms.o diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c new file mode 100644 index 000000000000..3f25295f7788 --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include +#include +#include + +#include "vkms_drv.h" +#include "vkms_config.h" +#include "vkms_configfs.h" + +/* To avoid registering configfs more than once or unregistering on error = */ +static bool is_configfs_registered; + +/** + * struct vkms_configfs - Configfs configuration for a VKMS device + * + * @vkms_config: Configuration of the VKMS device + * @device_group: Top level configuration group that represents a VKMS dev= ice. + * Initialized when a new directory is created under "/config/vkms/" + * @lock: Lock used to project concurrent access to the configuration attr= ibutes + * @enabled: Protected by @lock. The device is created or destroyed when t= his + * option changes + */ +struct vkms_configfs { + struct vkms_config *vkms_config; + struct config_group device_group; + + /* protected by @lock */ + struct mutex lock; + bool enabled; +}; + +#define config_item_to_vkms_configfs(item) \ + container_of(to_config_group(item), struct vkms_configfs, device_group) + +static ssize_t device_enabled_show(struct config_item *item, char *page) +{ + struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); + + return sprintf(page, "%d\n", configfs->enabled); +} + +static ssize_t device_enabled_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); + bool enabled; + int ret =3D 0; + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + mutex_lock(&configfs->lock); + + if (!configfs->enabled && enabled) + ret =3D vkms_create(configfs->vkms_config); + else if (configfs->enabled && !enabled) + vkms_destroy(configfs->vkms_config); + + if (ret) + goto err_unlock; + + configfs->enabled =3D enabled; + + mutex_unlock(&configfs->lock); + + return (ssize_t)count; + +err_unlock: + mutex_unlock(&configfs->lock); + return ret; +} + +CONFIGFS_ATTR(device_, enabled); + +static struct configfs_attribute *device_group_attrs[] =3D { + &device_attr_enabled, + NULL, +}; + +static const struct config_item_type device_group_type =3D { + .ct_attrs =3D device_group_attrs, + .ct_owner =3D THIS_MODULE, +}; + +static struct config_group *make_device_group(struct config_group *group, + const char *name) +{ + struct vkms_configfs *configfs; + struct vkms_config_crtc *crtc_cfg =3D NULL; + struct vkms_config_encoder *encoder_cfg =3D NULL; + struct vkms_config_connector *connector_cfg =3D NULL; + char *config_name; + int ret; + + if (strcmp(name, DEFAULT_DEVICE_NAME) =3D=3D 0) + return ERR_PTR(-EINVAL); + + configfs =3D kzalloc(sizeof(*configfs), GFP_KERNEL); + if (!configfs) + return ERR_PTR(-ENOMEM); + + config_group_init_type_name(&configfs->device_group, name, &device_group_= type); + mutex_init(&configfs->lock); + + config_name =3D config_item_name(&configfs->device_group.cg_item); + configfs->vkms_config =3D vkms_config_create(config_name); + if (IS_ERR(configfs->vkms_config)) { + ret =3D PTR_ERR(configfs->vkms_config); + goto err_kfree; + } + + crtc_cfg =3D vkms_config_add_crtc(configfs->vkms_config, false, false); + if (IS_ERR(crtc_cfg)) { + ret =3D PTR_ERR(crtc_cfg); + goto err_kfree; + } + + encoder_cfg =3D vkms_config_add_encoder(configfs->vkms_config, BIT(0)); + if (IS_ERR(encoder_cfg)) { + ret =3D PTR_ERR(encoder_cfg); + goto err_kfree; + } + + connector_cfg =3D vkms_config_add_connector(configfs->vkms_config, BIT(0), + connector_status_connected); + if (IS_ERR(connector_cfg)) { + ret =3D PTR_ERR(connector_cfg); + goto err_kfree; + } + + return &configfs->device_group; + +err_kfree: + kfree(configfs); + kfree(crtc_cfg); + kfree(encoder_cfg); + kfree(connector_cfg); + return ERR_PTR(ret); +} + +static void drop_device_group(struct config_group *group, + struct config_item *item) +{ + struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); + + mutex_lock(&configfs->lock); + + if (configfs->enabled) + vkms_destroy(configfs->vkms_config); + + kfree(configfs->vkms_config); + + mutex_unlock(&configfs->lock); + + kfree(configfs); +} + +static struct configfs_group_operations device_group_ops =3D { + .make_group =3D &make_device_group, + .drop_item =3D &drop_device_group, +}; + +static struct config_item_type vkms_type =3D { + .ct_group_ops =3D &device_group_ops, + .ct_owner =3D THIS_MODULE, +}; + +static struct configfs_subsystem vkms_subsys =3D { + .su_group =3D { + .cg_item =3D { + .ci_name =3D "vkms", + .ci_type =3D &vkms_type, + }, + }, + .su_mutex =3D __MUTEX_INITIALIZER(vkms_subsys.su_mutex), +}; + +int vkms_configfs_register(void) +{ + int ret; + + if (is_configfs_registered) + return 0; + + config_group_init(&vkms_subsys.su_group); + ret =3D configfs_register_subsystem(&vkms_subsys); + + is_configfs_registered =3D ret =3D=3D 0; + + return ret; +} + +void vkms_configfs_unregister(void) +{ + if (is_configfs_registered) + configfs_unregister_subsystem(&vkms_subsys); +} diff --git a/drivers/gpu/drm/vkms/vkms_configfs.h b/drivers/gpu/drm/vkms/vk= ms_configfs.h new file mode 100644 index 000000000000..b5d7fab877d5 --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_configfs.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef _VKMS_CONFIGFS_H_ +#define _VKMS_CONFIGFS_H_ + +int vkms_configfs_register(void); +void vkms_configfs_unregister(void); + +#endif /* _VKMS_CONFIGFS_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index b0a079eb4598..f524a9550017 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -27,6 +27,7 @@ #include =20 #include "vkms_config.h" +#include "vkms_configfs.h" #include "vkms_drv.h" =20 #define DRIVER_NAME "vkms" @@ -157,7 +158,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsde= v) return vkms_output_init(vkmsdev); } =20 -static int vkms_create(struct vkms_config *config) +int vkms_create(struct vkms_config *config) { int ret; struct platform_device *pdev; @@ -231,12 +232,22 @@ static int __init vkms_init(void) =20 ret =3D vkms_create(config); if (ret) - vkms_config_destroy(config); + goto err_kfree; =20 + ret =3D vkms_configfs_register(); + if (ret) + goto err_destroy; + + return 0; + +err_destroy: + vkms_destroy(config); +err_kfree: + vkms_config_destroy(config); return ret; } =20 -static void vkms_destroy(struct vkms_config *config) +void vkms_destroy(struct vkms_config *config) { struct platform_device *pdev; =20 @@ -257,6 +268,8 @@ static void vkms_destroy(struct vkms_config *config) =20 static void __exit vkms_exit(void) { + vkms_configfs_unregister(); + if (default_config->dev) vkms_destroy(default_config); =20 diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 76394285dc68..eb32440e9f94 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -143,6 +143,10 @@ struct vkms_device { #define to_vkms_plane_state(target)\ container_of(target, struct vkms_plane_state, base.base) =20 +/* VKMS device */ +int vkms_create(struct vkms_config *config); +void vkms_destroy(struct vkms_config *config); + /* CRTC */ struct vkms_crtc *vkms_crtc_init(struct drm_device *dev, struct drm_plane *primary, --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC89E19D09B for ; Tue, 13 Aug 2024 10:51:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546316; cv=none; b=BxE3D2lT36lRge+zfVGjEz1yLIO40YYXjf/1JyjszrDKRJwK3WPDJdbl20q/SE9HpQfGR799C4g4wT23aSC0rmJGRhAp4jXDUn9Cm5zlFUmXrjr/oGqWFbn/PJjbE1whZ7r0IX2QoXBu8p0cg2WKQdhwJFJ17xQG6VRGtocARsI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546316; c=relaxed/simple; bh=YtSIWGW8LIFIsjcCZmIZ8UbzAbnVZGqRMTNplMa0an8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nI54KmqG/Xiiul0ChrwrX9/Yh1TmgkLT+wOTJDxF3IY1fVpeOJIZ1wn54TCYDlxyJDAaFHN2QaQvYWEeZ/i8ZyWkK7s4ZTepg1x3hEIYQ8DHQZpLGceY+HhLuP5i05YYXMuMWOieUYWfKu9fyXUIYnMeT3dcKLQIjSeI/a0/V4M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=He8OWeEC; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="He8OWeEC" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-42816ca797fso39301575e9.2 for ; Tue, 13 Aug 2024 03:51:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546313; x=1724151113; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HVBRH0DnuLVDwokIb7HrZrE7ZLWioaYtKcu7A5ZTgas=; b=He8OWeECEXbJ5WOASkrPMSnJx7fH8zP+dw3B4njcXehYhgMmbdU9eeTn5KofDseSdk HGsJ+zVm//tiimOlyDa3slG4gY2nBqJvx2c6DL5nDkI/1fpCjDSibVmum/Uzxg/xoBXF xpU53Ndq0yb2b5S3kqtEkXHqxfxdxsH7BCFRw3rJ6GWU7I9ostbvesTExAw9CjQr4jwW Lh/N5UaabKRZ1hnuPZ2NflHrWph5ucOdG7ZHzdf48AgajlJCkRABkILrWEz/mLx4XnNj pmlzcFYvWB6opYN7zqSZz0Ba6pu6O0khMzycRudSBiMpAoWhBrhVvI7K3nhuXzSU28rF U6aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546313; x=1724151113; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HVBRH0DnuLVDwokIb7HrZrE7ZLWioaYtKcu7A5ZTgas=; b=nyqrhpUQ4zCLR6FDTZUnjaRpH5PKC1SfSnMwVgagwspvb9m13s+32HyYNZA31f23S0 GtcsHkh/npHTAWjsFGE4QddzeBUfeAVhcp4gJXDzyAJgOBYQWy5+gcJoBwZtjC4qnodN zvSOKsdkaLEWG4dPfV63zZbv/n1vqJOHhgqpLy4GzQx/GYh/euitjqR12JeUNq9aRFBS 4k3FF/iz8jH/XLHU3EavYsQS43USCBL/MyPLn9v3fdfLqPEq3okumXs+Kn/RhoPRBso3 7HcYNd+vAPA7JlZN+nBUKhjXSg7bbfgy5DrwW7Cvps15xDd2606Wdky5D3NHSRmbmDbW CC9g== X-Forwarded-Encrypted: i=1; AJvYcCX3XDvAObVzpunHsPLSuszENSIrcH1Um+F8q2FbsHJW34+byjT76UVmU24Rc5qmq3gYuYVEpHxs3s6/8DJw0ElqWkZ2Lu6ZMnHtC9Lj X-Gm-Message-State: AOJu0YykzMfT5QjMIaJ4C3TKUEOaUDPaqpmllLF9Xba0kaEtssh/6KFI yN1dLpHfSustOJrMB1/UqcLYC4S6BRtvHlIAe0pubg8/HfCARIwZ X-Google-Smtp-Source: AGHT+IGx0zK/ifNLLcqjgImibQLg2NAxwokcq14IJSh6ZqPBkiUD5RKQjid95Vj2DBXdcE20rEuz4A== X-Received: by 2002:a05:600c:3b1f:b0:427:ffa4:32d0 with SMTP id 5b1f17b1804b1-429d48711f6mr24333315e9.28.1723546313053; Tue, 13 Aug 2024 03:51:53 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:52 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 12/17] drm/vkms: Allow to configure multiple CRTCs via configfs Date: Tue, 13 Aug 2024 12:44:23 +0200 Message-ID: <20240813105134.17439-13-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Create a default subgroup at /config/vkms/crtcs to allow to create as many CRTCs as required. When a CRTC is created, allow to configure the equivalent of the module parameters enable_cursor and enable_writeback. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 22 +++- drivers/gpu/drm/vkms/vkms_config.h | 3 + drivers/gpu/drm/vkms/vkms_configfs.c | 149 +++++++++++++++++++++++++-- 3 files changed, 166 insertions(+), 8 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 9895a9ae76f4..0886349ad4a0 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -71,6 +71,25 @@ By default, the instance is disabled:: cat /config/vkms/my-vkms/enabled 0 =20 +And directories are created for each configurable item of the display pipe= line:: + + tree /config/vkms/my-vkms + /config/vkms/my-vkms + =E2=94=9C=E2=94=80=E2=94=80 crtcs + =E2=94=94=E2=94=80=E2=94=80 enabled + +To add items to the display pipeline, create one or more directories under= the +available paths. + +Start by creating one or more CRTCs:: + + sudo mkdir /config/vkms/my-vkms/crtcs/crtc0 + +CRTCs have 2 configurable attributes: + +- cursor: Enable or disable cursor plane support +- writeback: Enable or disable writeback connector support + Once you are done configuring the VKMS instance, enable it:: =20 echo "1" | sudo tee /config/vkms/my-vkms/enabled @@ -79,8 +98,9 @@ Finally, you can remove the VKMS instance disabling it:: =20 echo "0" | sudo tee /config/vkms/my-vkms/enabled =20 -Or removing the top level directory:: +Or removing the top level directory and its subdirectories:: =20 + sudo rmdir /config/vkms/my-vkms/crtcs/* sudo rmdir /config/vkms/my-vkms =20 Testing With IGT diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 3237406fa3a3..f96a0456a3d7 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -3,6 +3,7 @@ #ifndef _VKMS_CONFIG_H_ #define _VKMS_CONFIG_H_ =20 +#include #include #include =20 @@ -20,6 +21,8 @@ struct vkms_config_crtc { unsigned int index; bool cursor; bool writeback; + /* only used if created from configfs */ + struct config_group crtc_group; }; =20 struct vkms_config_encoder { diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 3f25295f7788..04278a39cd3c 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -17,6 +17,8 @@ static bool is_configfs_registered; * @vkms_config: Configuration of the VKMS device * @device_group: Top level configuration group that represents a VKMS dev= ice. * Initialized when a new directory is created under "/config/vkms/" + * @crtcs_group: Default subgroup of @device_group at "/config/vkms/crtcs". + * Each of its items represent a CRTC * @lock: Lock used to project concurrent access to the configuration attr= ibutes * @enabled: Protected by @lock. The device is created or destroyed when t= his * option changes @@ -24,6 +26,7 @@ static bool is_configfs_registered; struct vkms_configfs { struct vkms_config *vkms_config; struct config_group device_group; + struct config_group crtcs_group; =20 /* protected by @lock */ struct mutex lock; @@ -33,6 +36,141 @@ struct vkms_configfs { #define config_item_to_vkms_configfs(item) \ container_of(to_config_group(item), struct vkms_configfs, device_group) =20 +#define crtcs_group_to_vkms_configfs(group) \ + container_of(group, struct vkms_configfs, crtcs_group) + +#define crtcs_item_to_vkms_configfs(item) \ + container_of(to_config_group(item), struct vkms_configfs, crtcs_group) + +#define crtcs_item_to_vkms_config_crtc(item) \ + container_of(to_config_group(item), struct vkms_config_crtc, crtc_group) + +static ssize_t crtc_cursor_show(struct config_item *item, char *page) +{ + struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); + + return sprintf(page, "%d\n", crtc_cfg->cursor); +} + +static ssize_t crtc_cursor_store(struct config_item *item, const char *pag= e, + size_t count) +{ + struct vkms_configfs *configfs =3D crtcs_item_to_vkms_configfs(item->ci_p= arent); + struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); + bool cursor; + + if (kstrtobool(page, &cursor)) + return -EINVAL; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + mutex_unlock(&configfs->lock); + return -EINVAL; + } + + crtc_cfg->cursor =3D cursor; + + mutex_unlock(&configfs->lock); + + return (ssize_t)count; +} + +static ssize_t crtc_writeback_show(struct config_item *item, char *page) +{ + struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); + + return sprintf(page, "%d\n", crtc_cfg->writeback); +} + +static ssize_t crtc_writeback_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs *configfs =3D crtcs_item_to_vkms_configfs(item->ci_p= arent); + struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); + bool writeback; + + if (kstrtobool(page, &writeback)) + return -EINVAL; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + mutex_unlock(&configfs->lock); + return -EINVAL; + } + + crtc_cfg->writeback =3D writeback; + + mutex_unlock(&configfs->lock); + + return (ssize_t)count; +} + +CONFIGFS_ATTR(crtc_, cursor); +CONFIGFS_ATTR(crtc_, writeback); + +static struct configfs_attribute *crtc_group_attrs[] =3D { + &crtc_attr_cursor, + &crtc_attr_writeback, + NULL, +}; + +static const struct config_item_type crtc_group_type =3D { + .ct_attrs =3D crtc_group_attrs, + .ct_owner =3D THIS_MODULE, +}; + +static struct config_group *make_crtcs_group(struct config_group *group, + const char *name) +{ + struct vkms_configfs *configfs =3D crtcs_group_to_vkms_configfs(group); + struct vkms_config_crtc *crtc_cfg; + int ret; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + ret =3D -EINVAL; + goto err_unlock; + } + + crtc_cfg =3D vkms_config_add_crtc(configfs->vkms_config, false, false); + if (IS_ERR(crtc_cfg)) { + ret =3D PTR_ERR(crtc_cfg); + goto err_unlock; + } + + config_group_init_type_name(&crtc_cfg->crtc_group, name, &crtc_group_type= ); + + mutex_unlock(&configfs->lock); + + return &crtc_cfg->crtc_group; + +err_unlock: + mutex_unlock(&configfs->lock); + return ERR_PTR(ret); +} + +static void drop_crtcs_group(struct config_group *group, + struct config_item *item) +{ + struct vkms_configfs *configfs =3D crtcs_group_to_vkms_configfs(group); + struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); + + vkms_config_destroy_crtc(configfs->vkms_config, crtc_cfg); +} + +static struct configfs_group_operations crtcs_group_ops =3D { + .make_group =3D &make_crtcs_group, + .drop_item =3D &drop_crtcs_group, +}; + +static struct config_item_type crtcs_group_type =3D { + .ct_group_ops =3D &crtcs_group_ops, + .ct_owner =3D THIS_MODULE, +}; + static ssize_t device_enabled_show(struct config_item *item, char *page) { struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); @@ -87,7 +225,6 @@ static struct config_group *make_device_group(struct con= fig_group *group, const char *name) { struct vkms_configfs *configfs; - struct vkms_config_crtc *crtc_cfg =3D NULL; struct vkms_config_encoder *encoder_cfg =3D NULL; struct vkms_config_connector *connector_cfg =3D NULL; char *config_name; @@ -110,11 +247,10 @@ static struct config_group *make_device_group(struct = config_group *group, goto err_kfree; } =20 - crtc_cfg =3D vkms_config_add_crtc(configfs->vkms_config, false, false); - if (IS_ERR(crtc_cfg)) { - ret =3D PTR_ERR(crtc_cfg); - goto err_kfree; - } + config_group_init_type_name(&configfs->crtcs_group, "crtcs", + &crtcs_group_type); + configfs_add_default_group(&configfs->crtcs_group, + &configfs->device_group); =20 encoder_cfg =3D vkms_config_add_encoder(configfs->vkms_config, BIT(0)); if (IS_ERR(encoder_cfg)) { @@ -133,7 +269,6 @@ static struct config_group *make_device_group(struct co= nfig_group *group, =20 err_kfree: kfree(configfs); - kfree(crtc_cfg); kfree(encoder_cfg); kfree(connector_cfg); return ERR_PTR(ret); --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6901619AD85 for ; Tue, 13 Aug 2024 10:51:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546318; cv=none; b=VWnuz3ixymnwT4Cg4Iuz6DmlNtBHo+JhXQ63wem+cXSX1GGOf2YXb5/4NA120MEJIyINSO0JAPsTZKNr/ssHrUqu6zKTo9jzgiw3mmPczwtRDW4fRabdyRePC0AT+nd3cNohwmSmANhxQMQJ0si/rvbyKju5JOzOHTlW4Rn3PDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546318; c=relaxed/simple; bh=g+Fb6g0AqYVQz0d1phWG6a23pwAL4co6gMWTvCwErmI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gBVaNBK/XcYMSN5JyNd3A7DxotoaIDEWeFht48FURczSBcgUlcyzvcUmK0Nn48E/9W3dbpyjMdU7NglQLc/hp/vZmCKYrnUXYczNAsQufzAALOuY47mwQPJPBmYcrBDCWmduyJZvurPeptzB9G8i8qyLQTQGcG+29xLQoJ9gY2s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DjZfRuHS; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DjZfRuHS" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4280ee5f1e3so40484115e9.0 for ; Tue, 13 Aug 2024 03:51:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546315; x=1724151115; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=F/G5AnsYa7zmUTR/MiH01m+WsCKhEwrbdAUk5c5JpIU=; b=DjZfRuHS53OBarTrPuz7ZfswpfeGmGf6IS6Z3z2ZdDe63pxm9YsGENtEXKd/X0EuNq NOtCI5sC/WcQFEwyJvP11kLv9Z/O8YQ2lfBeQawFRyExl8BLE0utflcYTWzbHGDrpHj0 NmzW49fqappy1/SH3hTQFpBX49IWJsjRV8NuRT0mNu/wbZWm2XAO+Xoeq4STz0b/loZ4 ZzLQpOg+xHOvCDkFV5Urm4+YQvd8x+bhiZkdRO1VCYIpHdzQ6Oa9hsjSOcWf2pwZp0mu VpsSENbquu4w2V/WJyN/3j2lDDS6XbUlcjEOhw557RGcQaml/iMeGJojObl8F4T7R4mQ NPtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546315; x=1724151115; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=F/G5AnsYa7zmUTR/MiH01m+WsCKhEwrbdAUk5c5JpIU=; b=NRSlEhsszfUnkFCZSjF4N8qOuMxCwohQOSNa7y9HxUuV60BL7BWoG9l7xmqyZXngEi PRNNb7N2Xanvjz90gF4Nm2vmQKsaFfqUs+yUXIcziHH64YjxS5FImapCSB3Y0YikG8aG FclIcUrTNJertFjGg6chBJnpXqQ+AsfyvDR3Rd3Ur1eRrTqjs+Wk0FeC03hpsuJUIkr/ vvV+M2HRbg2BDUxAgUtodWZqNSUZRtVgII+psKQAPmZ5srlcrvGq++OLeTIyEUnPTzJb i0USMWtzkbMqNqbmgEHE1Bi0OoTBE6fObI5g5CAbTq3NUmjZxh6Ksfi10VPWolmwBC48 Mp3w== X-Forwarded-Encrypted: i=1; AJvYcCUPhpIKDFyC75tUwg59kYKnJuKADAXFfFgc8WkYgO5b5PeHdmKpC7FN6CbNfYbsil6USNvs7+4YvVprT139VegQ+ik924QpIZvRYNlx X-Gm-Message-State: AOJu0YzOGAgfI6Q7vbPAbw5gT4rPkZqbOJfxOGIfLQS9RqWtlnq4iCzG 28/lRdu5681io3oLttVYLbzG85qxU6dLnUO+R5hDEUPN9dnyEAJzDiO3RJox X-Google-Smtp-Source: AGHT+IH8LR+1P5qUwpzWamxktmdZ24m1L+TeHAheXbr8p/lSB6gOBODyUIlICFjkqU13hylsNNiByA== X-Received: by 2002:a05:600c:450e:b0:425:7796:8e2c with SMTP id 5b1f17b1804b1-429d4805ac3mr20794595e9.12.1723546314557; Tue, 13 Aug 2024 03:51:54 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:53 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 13/17] drm/vkms: Allow to configure multiple encoders via configfs Date: Tue, 13 Aug 2024 12:44:24 +0200 Message-ID: <20240813105134.17439-14-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Create a default subgroup at /config/vkms/encoders to allow to create as many encoders as required. When the encoder is created the possible_crtcs subgroup is created allowing to link encoders and CRTCs. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 14 ++- drivers/gpu/drm/vkms/vkms_config.h | 3 + drivers/gpu/drm/vkms/vkms_configfs.c | 127 +++++++++++++++++++++++++-- 3 files changed, 136 insertions(+), 8 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 0886349ad4a0..c69be063d3b4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -76,7 +76,8 @@ And directories are created for each configurable item of= the display pipeline:: tree /config/vkms/my-vkms /config/vkms/my-vkms =E2=94=9C=E2=94=80=E2=94=80 crtcs - =E2=94=94=E2=94=80=E2=94=80 enabled + =E2=94=9C=E2=94=80=E2=94=80 enabled + =E2=94=94=E2=94=80=E2=94=80 encoders =20 To add items to the display pipeline, create one or more directories under= the available paths. @@ -90,6 +91,15 @@ CRTCs have 2 configurable attributes: - cursor: Enable or disable cursor plane support - writeback: Enable or disable writeback connector support =20 +Continue by creating one or more encoders:: + + sudo mkdir /config/vkms/my-vkms/encoders/encoder0 + +Encoders can be linked to CRTCs by creating a symbolic link under +``possible_crtcs``:: + + sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoder= s/encoder0/possible_crtcs + Once you are done configuring the VKMS instance, enable it:: =20 echo "1" | sudo tee /config/vkms/my-vkms/enabled @@ -100,6 +110,8 @@ Finally, you can remove the VKMS instance disabling it:: =20 Or removing the top level directory and its subdirectories:: =20 + sudo rm /config/vkms/my-vkms/encoders/*/possible_crtcs/* + sudo rmdir /config/vkms/my-vkms/encoders/* sudo rmdir /config/vkms/my-vkms/crtcs/* sudo rmdir /config/vkms/my-vkms =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index f96a0456a3d7..f9423533a7f3 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -29,6 +29,9 @@ struct vkms_config_encoder { struct list_head list; unsigned int index; uint32_t possible_crtcs; + /* only used if created from configfs */ + struct config_group encoder_group; + struct config_group possible_crtcs_group; }; =20 struct vkms_config_connector { diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 04278a39cd3c..c0b62fb93dc0 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -19,6 +19,8 @@ static bool is_configfs_registered; * Initialized when a new directory is created under "/config/vkms/" * @crtcs_group: Default subgroup of @device_group at "/config/vkms/crtcs". * Each of its items represent a CRTC + * @encoders_group: Default subgroup of @device_group at + * "/config/vkms/encoders". Each of its items represent a encoder * @lock: Lock used to project concurrent access to the configuration attr= ibutes * @enabled: Protected by @lock. The device is created or destroyed when t= his * option changes @@ -27,6 +29,7 @@ struct vkms_configfs { struct vkms_config *vkms_config; struct config_group device_group; struct config_group crtcs_group; + struct config_group encoders_group; =20 /* protected by @lock */ struct mutex lock; @@ -45,6 +48,15 @@ struct vkms_configfs { #define crtcs_item_to_vkms_config_crtc(item) \ container_of(to_config_group(item), struct vkms_config_crtc, crtc_group) =20 +#define encoders_group_to_vkms_configfs(group) \ + container_of(group, struct vkms_configfs, encoders_group) + +#define encoders_item_to_vkms_config_encoder(item) \ + container_of(to_config_group(item), struct vkms_config_encoder, encoder_g= roup) + +#define encoder_possible_crtcs_item_to_vkms_config_encoder(item) \ + container_of(to_config_group(item), struct vkms_config_encoder, possible_= crtcs_group) + static ssize_t crtc_cursor_show(struct config_item *item, char *page) { struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); @@ -171,6 +183,110 @@ static struct config_item_type crtcs_group_type =3D { .ct_owner =3D THIS_MODULE, }; =20 +static int encoder_possible_crtcs_allow_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + + if (target->ci_type !=3D &crtc_group_type) + return -EINVAL; + + encoder_cfg =3D encoder_possible_crtcs_item_to_vkms_config_encoder(src); + crtc_cfg =3D crtcs_item_to_vkms_config_crtc(target); + + if (encoder_cfg->possible_crtcs & BIT(crtc_cfg->index)) + return -EINVAL; + + encoder_cfg->possible_crtcs |=3D BIT(crtc_cfg->index); + + return 0; +} + +static void encoder_possible_crtcs_drop_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + + encoder_cfg =3D encoder_possible_crtcs_item_to_vkms_config_encoder(src); + crtc_cfg =3D crtcs_item_to_vkms_config_crtc(target); + + encoder_cfg->possible_crtcs &=3D ~BIT(crtc_cfg->index); +} + +static struct configfs_item_operations encoder_possible_crtcs_item_ops =3D= { + .allow_link =3D &encoder_possible_crtcs_allow_link, + .drop_link =3D &encoder_possible_crtcs_drop_link, +}; + +static struct config_item_type encoder_possible_crtcs_group_type =3D { + .ct_item_ops =3D &encoder_possible_crtcs_item_ops, + .ct_owner =3D THIS_MODULE, +}; + +static const struct config_item_type encoder_group_type =3D { + .ct_owner =3D THIS_MODULE, +}; + +static struct config_group *make_encoders_group(struct config_group *group, + const char *name) +{ + struct vkms_configfs *configfs =3D encoders_group_to_vkms_configfs(group); + struct vkms_config_encoder *encoder_cfg; + int ret; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + ret =3D -EINVAL; + goto err_unlock; + } + + encoder_cfg =3D vkms_config_add_encoder(configfs->vkms_config, 0); + if (IS_ERR(encoder_cfg)) { + ret =3D PTR_ERR(encoder_cfg); + goto err_unlock; + } + + config_group_init_type_name(&encoder_cfg->encoder_group, name, + &encoder_group_type); + + config_group_init_type_name(&encoder_cfg->possible_crtcs_group, + "possible_crtcs", + &encoder_possible_crtcs_group_type); + configfs_add_default_group(&encoder_cfg->possible_crtcs_group, + &encoder_cfg->encoder_group); + + mutex_unlock(&configfs->lock); + + return &encoder_cfg->encoder_group; + +err_unlock: + mutex_unlock(&configfs->lock); + return ERR_PTR(ret); +} + +static void drop_encoders_group(struct config_group *group, + struct config_item *item) +{ + struct vkms_configfs *configfs =3D encoders_group_to_vkms_configfs(group); + struct vkms_config_encoder *encoder_cfg =3D + encoders_item_to_vkms_config_encoder(item); + + vkms_config_destroy_encoder(configfs->vkms_config, encoder_cfg); +} + +static struct configfs_group_operations encoders_group_ops =3D { + .make_group =3D &make_encoders_group, + .drop_item =3D &drop_encoders_group, +}; + +static struct config_item_type encoders_group_type =3D { + .ct_group_ops =3D &encoders_group_ops, + .ct_owner =3D THIS_MODULE, +}; + static ssize_t device_enabled_show(struct config_item *item, char *page) { struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); @@ -225,7 +341,6 @@ static struct config_group *make_device_group(struct co= nfig_group *group, const char *name) { struct vkms_configfs *configfs; - struct vkms_config_encoder *encoder_cfg =3D NULL; struct vkms_config_connector *connector_cfg =3D NULL; char *config_name; int ret; @@ -252,11 +367,10 @@ static struct config_group *make_device_group(struct = config_group *group, configfs_add_default_group(&configfs->crtcs_group, &configfs->device_group); =20 - encoder_cfg =3D vkms_config_add_encoder(configfs->vkms_config, BIT(0)); - if (IS_ERR(encoder_cfg)) { - ret =3D PTR_ERR(encoder_cfg); - goto err_kfree; - } + config_group_init_type_name(&configfs->encoders_group, "encoders", + &encoders_group_type); + configfs_add_default_group(&configfs->encoders_group, + &configfs->device_group); =20 connector_cfg =3D vkms_config_add_connector(configfs->vkms_config, BIT(0), connector_status_connected); @@ -269,7 +383,6 @@ static struct config_group *make_device_group(struct co= nfig_group *group, =20 err_kfree: kfree(configfs); - kfree(encoder_cfg); kfree(connector_cfg); return ERR_PTR(ret); } --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B49119DF53 for ; Tue, 13 Aug 2024 10:51:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546320; cv=none; b=HDWghC78jdsPkjyU5u5TljZrKvT9JoJwxv6XrjylgO9ERTNtlY/9/S4+Wq5TdQcXmyK7Zofy9kIfxohpbmsFD1olFAxkeBgG/VydS/OICtmwa/UFB1g18xX566exBAKo5RWUB5R5xnHISMHUME/5sR7T+BfI1wV/Fq3T2YRd4to= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546320; c=relaxed/simple; bh=5wPY00ge369+Bs+WSOcxylUyUb+ORoaa5aka41GPk4g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=du2bs2W/RvLcaHr2i78neuPFPEaXRpNVzcLbddfd2UA7LdZ7wL9I5oJibmKOLbaf2g+N+4Pct+wX0qctQ1fULdDtwfE0fCcUAg/xft8FxBsEu32Gcr7pKxy4azmsricUq/E+S6XFud5r2Bef5nDOvMiCFoZy5FbbKBu0xKMrjwU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SGCdGkJl; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SGCdGkJl" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-530e2235688so5788202e87.3 for ; Tue, 13 Aug 2024 03:51:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546316; x=1724151116; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GIG00hBvhxwE6VfxQ1Dl1AavFjjBn2BviUu5FBbH+3g=; b=SGCdGkJlqMMCKeiiTMgzh2+LUU39+idAEJiEwH8B8YnXLvyy1My89i4j8jbO+oVkr9 DUUr1OrosPpr590qvv+GGBAKW15F7Rh2ON6TCisnBjEGlx9zTBf2t3hOUR+vh3VpVB3Z PFbEoToPxlMph0MJMNEnqy6kEyzSSBQpGJbmk6R11TdHHZ097pc9QVb7r0hVcvWfS7M9 jTBCmPfyQu96YNYXIVA52Lr0sMCME4kEFUpPOtBn1JNdpXXvqGTJKhP33Q5Pxgkc6RUw pl+/+6OpVxbf6EpciSlBwP7j4/T4DxYhPFXjAEP47N27E6zNeBYlGwR8zah7ITy02cA8 5Mxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546316; x=1724151116; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GIG00hBvhxwE6VfxQ1Dl1AavFjjBn2BviUu5FBbH+3g=; b=fd/RnI1w6+7GHTejKbdLvT7jjkVw89yfnOQbUq7NXBmyeJplouSi0L2X+XTCNbP/2F EMeWQNewBtowiNK3yhj9IzYGD3JVeZyUsoXU6VzEF6X5l1EgEz/FyJIgJq6NUxjY5Hjo QungNj100HjmFPgm3WXr3a3V04zJixkj6TtBANuQPcdMmZ79g28MjDPWIIo38LTadBIr L/ZYZjKUHiAyKBZU5pWmcjuyF6+3e3PHQUrlNc618Q5WxSAAxq14T5FQ+yR8xim6rUq2 3kjQsgU1bILHYo6JsjWdTuYMy79GeMcnnaO3R29E3s3g8Ni7mFQH7osMPZ4CPfgKAU5I Nngg== X-Forwarded-Encrypted: i=1; AJvYcCVtftVk/g+aZYz/JG7YYEKn2R7TfpY+wdPEJ5hkpF6RHof9kAOQWBxAj5zQ3xyO0/H0rgnyuubPCRSiMwArrQYrGECQunY1QbQOfmW+ X-Gm-Message-State: AOJu0Yxabj23Ui2s3pUu1caJvEtSqXDTx3JYZaF69oOcKXSXV0KldvTc flhdO2EY8Tpo1pJJzTjE0Di5WrVKG79485IsRUasE2TOpHQsy5g5 X-Google-Smtp-Source: AGHT+IHG61sFSXaG2KPmxHnV7dm/Gc1K15rhK/tEp3tOyYNwnbyxbnWi9QRN7AYcotU8SvHARdSFyw== X-Received: by 2002:a05:6512:31ce:b0:52e:9b15:1c60 with SMTP id 2adb3069b0e04-53213680d76mr1857158e87.48.1723546315942; Tue, 13 Aug 2024 03:51:55 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:55 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 14/17] drm/vkms: Allow to configure multiple encoders Date: Tue, 13 Aug 2024 12:44:25 +0200 Message-ID: <20240813105134.17439-15-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a list of encoder configurations to vkms_config and add as many encoders as configured during output initialization. For backwards compatibility, create a single encoder in the default configuration. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 16 +++ drivers/gpu/drm/vkms/vkms_config.h | 3 + drivers/gpu/drm/vkms/vkms_configfs.c | 184 ++++++++++++++++++++++++--- 3 files changed, 188 insertions(+), 15 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index c69be063d3b4..b6ceb8c48310 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -75,6 +75,7 @@ And directories are created for each configurable item of= the display pipeline:: =20 tree /config/vkms/my-vkms /config/vkms/my-vkms + =E2=94=9C=E2=94=80=E2=94=80 connectors =E2=94=9C=E2=94=80=E2=94=80 crtcs =E2=94=9C=E2=94=80=E2=94=80 enabled =E2=94=94=E2=94=80=E2=94=80 encoders @@ -100,16 +101,31 @@ Encoders can be linked to CRTCs by creating a symboli= c link under =20 sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoder= s/encoder0/possible_crtcs =20 +Next, create one or more connectors:: + + sudo mkdir /config/vkms/my-vkms/connectors/connector0 + +The status of the connector can be changed writing ``1`` (connected), ``2`` +(disconnected) or ``3`` (unknown) to the ``status`` attribute and they can= be +linked to encoders by creating a symbolic link under ``possible_encoders``= :: + + sudo ln -s /config/vkms/my-vkms/encoders/encoder0 /config/vkms/my-vkms/c= onnectors/connector0/possible_encoders + Once you are done configuring the VKMS instance, enable it:: =20 echo "1" | sudo tee /config/vkms/my-vkms/enabled =20 +Note that the connector ``status`` can be changed once the VKMS instance is +enabled to emulate hot-plug/unplug. + Finally, you can remove the VKMS instance disabling it:: =20 echo "0" | sudo tee /config/vkms/my-vkms/enabled =20 Or removing the top level directory and its subdirectories:: =20 + sudo rm /config/vkms/my-vkms/connectors/*/possible_encoders/* + sudo rmdir /config/vkms/my-vkms/connectors/* sudo rm /config/vkms/my-vkms/encoders/*/possible_crtcs/* sudo rmdir /config/vkms/my-vkms/encoders/* sudo rmdir /config/vkms/my-vkms/crtcs/* diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index f9423533a7f3..cf45e3f6ae92 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -40,6 +40,9 @@ struct vkms_config_connector { enum drm_connector_status status; /* only set when instantiated */ struct drm_connector *connector; + /* only used if created from configfs */ + struct config_group connector_group; + struct config_group possible_encoders_group; }; =20 struct vkms_config { diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index c0b62fb93dc0..d2369f53e2d8 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -21,6 +21,8 @@ static bool is_configfs_registered; * Each of its items represent a CRTC * @encoders_group: Default subgroup of @device_group at * "/config/vkms/encoders". Each of its items represent a encoder + * @connectors_group: Default subgroup of @device_group at + * "/config/vkms/connectors". Each of its items represent a connector * @lock: Lock used to project concurrent access to the configuration attr= ibutes * @enabled: Protected by @lock. The device is created or destroyed when t= his * option changes @@ -30,6 +32,7 @@ struct vkms_configfs { struct config_group device_group; struct config_group crtcs_group; struct config_group encoders_group; + struct config_group connectors_group; =20 /* protected by @lock */ struct mutex lock; @@ -57,6 +60,18 @@ struct vkms_configfs { #define encoder_possible_crtcs_item_to_vkms_config_encoder(item) \ container_of(to_config_group(item), struct vkms_config_encoder, possible_= crtcs_group) =20 +#define connectors_group_to_vkms_configfs(group) \ + container_of(group, struct vkms_configfs, connectors_group) + +#define connectors_item_to_vkms_configfs(item) \ + container_of(to_config_group(item), struct vkms_configfs, connectors_grou= p) + +#define connector_item_to_vkms_config_connector(item) \ + container_of(to_config_group(item), struct vkms_config_connector, connect= or_group) + +#define connector_possible_encoders_item_to_vkms_config_connector(item) \ + container_of(to_config_group(item), struct vkms_config_connector, possibl= e_encoders_group) + static ssize_t crtc_cursor_show(struct config_item *item, char *page) { struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); @@ -287,6 +302,154 @@ static struct config_item_type encoders_group_type = =3D { .ct_owner =3D THIS_MODULE, }; =20 +static int connector_possible_encoders_allow_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_connector *connector_cfg; + struct vkms_config_encoder *encoder_cfg; + + if (target->ci_type !=3D &encoder_group_type) + return -EINVAL; + + connector_cfg =3D connector_possible_encoders_item_to_vkms_config_connect= or(src); + encoder_cfg =3D encoders_item_to_vkms_config_encoder(target); + + if (connector_cfg->possible_encoders & BIT(encoder_cfg->index)) + return -EINVAL; + + connector_cfg->possible_encoders |=3D BIT(encoder_cfg->index); + + return 0; +} + +static void connector_possible_encoders_drop_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_connector *connector_cfg; + struct vkms_config_encoder *encoder_cfg; + + connector_cfg =3D connector_possible_encoders_item_to_vkms_config_connect= or(src); + encoder_cfg =3D encoders_item_to_vkms_config_encoder(target); + + connector_cfg->possible_encoders &=3D ~BIT(encoder_cfg->index); +} + +static struct configfs_item_operations connector_possible_encoders_item_op= s =3D { + .allow_link =3D &connector_possible_encoders_allow_link, + .drop_link =3D &connector_possible_encoders_drop_link, +}; + +static struct config_item_type connector_possible_encoders_group_type =3D { + .ct_item_ops =3D &connector_possible_encoders_item_ops, + .ct_owner =3D THIS_MODULE, +}; + +static ssize_t connector_status_show(struct config_item *item, char *page) +{ + struct vkms_config_connector *connector_cfg =3D + connector_item_to_vkms_config_connector(item); + + return sprintf(page, "%d\n", connector_cfg->status); +} + +static ssize_t connector_status_store(struct config_item *item, const char= *page, + size_t count) +{ + struct vkms_configfs *configfs; + struct vkms_config_connector *connector_cfg; + int status; + + if (kstrtoint(page, 10, &status)) + return -EINVAL; + + switch (status) { + case connector_status_connected: + case connector_status_disconnected: + case connector_status_unknown: + break; + default: + return -EINVAL; + } + + configfs =3D connectors_item_to_vkms_configfs(item->ci_parent); + connector_cfg =3D connector_item_to_vkms_config_connector(item); + + vkms_update_connector_status(configfs->vkms_config, connector_cfg, status= ); + + return (ssize_t)count; +} + +CONFIGFS_ATTR(connector_, status); + +static struct configfs_attribute *connector_group_attrs[] =3D { + &connector_attr_status, + NULL, +}; + +static const struct config_item_type connector_group_type =3D { + .ct_attrs =3D connector_group_attrs, + .ct_owner =3D THIS_MODULE, +}; + +static struct config_group *make_connectors_group(struct config_group *gro= up, + const char *name) +{ + struct vkms_configfs *configfs =3D connectors_group_to_vkms_configfs(grou= p); + struct vkms_config_connector *connector_cfg; + int ret; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + ret =3D -EINVAL; + goto err_unlock; + } + + connector_cfg =3D vkms_config_add_connector(configfs->vkms_config, 0, + connector_status_connected); + if (IS_ERR(connector_cfg)) { + ret =3D PTR_ERR(connector_cfg); + goto err_unlock; + } + + config_group_init_type_name(&connector_cfg->connector_group, name, + &connector_group_type); + + config_group_init_type_name(&connector_cfg->possible_encoders_group, + "possible_encoders", + &connector_possible_encoders_group_type); + configfs_add_default_group(&connector_cfg->possible_encoders_group, + &connector_cfg->connector_group); + + mutex_unlock(&configfs->lock); + + return &connector_cfg->connector_group; + +err_unlock: + mutex_unlock(&configfs->lock); + return ERR_PTR(ret); +} + +static void drop_connectors_group(struct config_group *group, + struct config_item *item) +{ + struct vkms_configfs *configfs =3D connectors_group_to_vkms_configfs(grou= p); + struct vkms_config_connector *connector_cfg =3D + connector_item_to_vkms_config_connector(item); + + vkms_config_destroy_connector(configfs->vkms_config, connector_cfg); +} + +static struct configfs_group_operations connectors_group_ops =3D { + .make_group =3D &make_connectors_group, + .drop_item =3D &drop_connectors_group, +}; + +static struct config_item_type connectors_group_type =3D { + .ct_group_ops =3D &connectors_group_ops, + .ct_owner =3D THIS_MODULE, +}; + static ssize_t device_enabled_show(struct config_item *item, char *page) { struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); @@ -341,9 +504,7 @@ static struct config_group *make_device_group(struct co= nfig_group *group, const char *name) { struct vkms_configfs *configfs; - struct vkms_config_connector *connector_cfg =3D NULL; char *config_name; - int ret; =20 if (strcmp(name, DEFAULT_DEVICE_NAME) =3D=3D 0) return ERR_PTR(-EINVAL); @@ -358,8 +519,8 @@ static struct config_group *make_device_group(struct co= nfig_group *group, config_name =3D config_item_name(&configfs->device_group.cg_item); configfs->vkms_config =3D vkms_config_create(config_name); if (IS_ERR(configfs->vkms_config)) { - ret =3D PTR_ERR(configfs->vkms_config); - goto err_kfree; + kfree(configfs); + return ERR_CAST(configfs->vkms_config); } =20 config_group_init_type_name(&configfs->crtcs_group, "crtcs", @@ -372,19 +533,12 @@ static struct config_group *make_device_group(struct = config_group *group, configfs_add_default_group(&configfs->encoders_group, &configfs->device_group); =20 - connector_cfg =3D vkms_config_add_connector(configfs->vkms_config, BIT(0), - connector_status_connected); - if (IS_ERR(connector_cfg)) { - ret =3D PTR_ERR(connector_cfg); - goto err_kfree; - } + config_group_init_type_name(&configfs->connectors_group, "connectors", + &connectors_group_type); + configfs_add_default_group(&configfs->connectors_group, + &configfs->device_group); =20 return &configfs->device_group; - -err_kfree: - kfree(configfs); - kfree(connector_cfg); - return ERR_PTR(ret); } =20 static void drop_device_group(struct config_group *group, --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A130A19DF61 for ; Tue, 13 Aug 2024 10:51:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546322; cv=none; b=i48dd70wXh7jDJK2nrn73ceeZkskGyL+jwHRIdrdUfom32xRwUOyexvIriLQxgQgFYfkZF9oD7wB78MKnxboi6C8sFaMBPsjgiKTQYFpbiEbmYsfvJ1IMI4ondwhukYeRzdNMM5dJHWc5PeDLm6vRKmrd+1AZaR2IuzEsxmvKfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546322; c=relaxed/simple; bh=wQ9fK3i1zgDOfY60KeE9Yp2jW98FcB3ewz+H13D5rJ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=C5Ky+ZA52E8cbEeNGMrDeemWJvzTUzhSzCNdCJpbSAk13ddIh++4/QKEQgiIimpBz5SRw/Jk+gqoe5BZfDqkyePnDblsn56Rz0UJGZHIANUIo+E+obFS6iyfYtbEu9cFQfd/qwxUNfRDv0n9r6KRoKTPC6wzhYlX6BcPhoRYGZc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=avpbTo0i; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="avpbTo0i" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-427fc97a88cso41139415e9.0 for ; Tue, 13 Aug 2024 03:51:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546317; x=1724151117; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bEJ3c0tbXkLCUVM8w2XGUoLlD36QVGf/XlmxenxbwBg=; b=avpbTo0i5L1CTNhHEKwn5KL+Mn7cIpQYTBumL0uiR4m3pY/SJs038R55Hl+WcQc2Fk ggK9qdILmtqINaYbVv8jmQ3+IYkX1My2Pzd4gtKOiGhLCJuGbmJQHacfef0tj6F4KEjt k94+agA0TECyVxIWHtj3gpx9Qj02cnBz+3LuOmga4xwllIfpRCOy884xDI4gx98fqEse RhZdYZOjbCnABc4Z2j/oQchLyg7R0+JwhCrlg/epcU2jSnop1AANDp6sgoEBVRe8ecJb pY5tqF6xB3UwyYBqcaIapwa2P0vX0yNN7jCg4KE6GWcyYIrG4L9fFwC/i+NRa6O/Iypd wXNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546317; x=1724151117; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bEJ3c0tbXkLCUVM8w2XGUoLlD36QVGf/XlmxenxbwBg=; b=YHbjb/b78L8U+L3hprb+GDquNPu/EIwwZRBIGID8TS2hG2vhLEixRuZZ8SzHTRFEiO H28na9kAwjDuQbfE5irizM/9JguK7Z6JipCXUBCx3Pny8EhuCRg3wSdTuYyeN/r0IoJJ mXba8LEEimt6UrdPu0+qzpQOTSgZePXjiCO3o+iTPAI3tZ2yJu3gLzLm79yvSPDq6Ww+ /2bUox/aYeoLWFHcIiOXXFpjT3OoT2vJqlD8i2nHzMkZGG+dLTARGVi1kf8UHpOdThN0 MQIK3ExswmTIRbjLxbGRHjbhR1bVtZOJP+FwRingx93YsmGfWrHfNNTpK3WcmvMQGrQ4 Tt3g== X-Forwarded-Encrypted: i=1; AJvYcCW9+CH0XvKjCpGN5+AV2SlGWCxQNJ5Rw3tXM91AOZZkErUimfHg6hAFFlFqjGvsOm7uWiClNhEnHjKNc6A=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2EcuEbtXfjTdgyNgkeevYJ0tXkGdYna9AhFrMwbe9W9dITqpJ 6W/0pzDVHBOmLZShku6F0DmEUKFsf5p1vTqPTYhiVsZR1Fab/ede X-Google-Smtp-Source: AGHT+IESV+wchjJ2FOAcWUm8UC3C3J1WBcWqWQE0yaBq8D5o1OiKaRZvZx0+aIIqhD8qLLziu5WRdw== X-Received: by 2002:a05:600c:2909:b0:428:e866:3933 with SMTP id 5b1f17b1804b1-429d4a5a815mr24149465e9.22.1723546316854; Tue, 13 Aug 2024 03:51:56 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:56 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 15/17] drm/vkms: Allow to configure multiple planes via configfs Date: Tue, 13 Aug 2024 12:44:26 +0200 Message-ID: <20240813105134.17439-16-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Create a default subgroup at /config/vkms/planes to allow to create as many overlay planes as required. When the plane is created the possible_crtcs subgroup is created allowing to link planes and CRTCs. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 13 ++- drivers/gpu/drm/vkms/vkms_config.h | 3 + drivers/gpu/drm/vkms/vkms_configfs.c | 121 +++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index b6ceb8c48310..ee71d1a569dd 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -78,7 +78,8 @@ And directories are created for each configurable item of= the display pipeline:: =E2=94=9C=E2=94=80=E2=94=80 connectors =E2=94=9C=E2=94=80=E2=94=80 crtcs =E2=94=9C=E2=94=80=E2=94=80 enabled - =E2=94=94=E2=94=80=E2=94=80 encoders + =E2=94=9C=E2=94=80=E2=94=80 encoders + =E2=94=94=E2=94=80=E2=94=80 planes =20 To add items to the display pipeline, create one or more directories under= the available paths. @@ -111,6 +112,14 @@ linked to encoders by creating a symbolic link under `= `possible_encoders``:: =20 sudo ln -s /config/vkms/my-vkms/encoders/encoder0 /config/vkms/my-vkms/c= onnectors/connector0/possible_encoders =20 +Finally, create zero or more overlay planes:: + + sudo mkdir /config/vkms/my-vkms/planes/plane0 + +And link them with their ``possible_crtcs``:: + + sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/= plane0/possible_crtcs + Once you are done configuring the VKMS instance, enable it:: =20 echo "1" | sudo tee /config/vkms/my-vkms/enabled @@ -128,6 +137,8 @@ Or removing the top level directory and its subdirector= ies:: sudo rmdir /config/vkms/my-vkms/connectors/* sudo rm /config/vkms/my-vkms/encoders/*/possible_crtcs/* sudo rmdir /config/vkms/my-vkms/encoders/* + sudo rm /config/vkms/my-vkms/planes/*/possible_crtcs/* + sudo rmdir /config/vkms/my-vkms/planes/* sudo rmdir /config/vkms/my-vkms/crtcs/* sudo rmdir /config/vkms/my-vkms =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index cf45e3f6ae92..2ec08bb58ec4 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -14,6 +14,9 @@ struct vkms_device; struct vkms_config_plane { struct list_head list; uint32_t possible_crtcs; + /* only used if created from configfs */ + struct config_group plane_group; + struct config_group possible_crtcs_group; }; =20 struct vkms_config_crtc { diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index d2369f53e2d8..0b5ac0767da0 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -23,6 +23,8 @@ static bool is_configfs_registered; * "/config/vkms/encoders". Each of its items represent a encoder * @connectors_group: Default subgroup of @device_group at * "/config/vkms/connectors". Each of its items represent a connector + * @planes_group: Default subgroup of @device_group at "/config/vkms/plane= s". + * Each of its items represent an overlay plane * @lock: Lock used to project concurrent access to the configuration attr= ibutes * @enabled: Protected by @lock. The device is created or destroyed when t= his * option changes @@ -33,6 +35,7 @@ struct vkms_configfs { struct config_group crtcs_group; struct config_group encoders_group; struct config_group connectors_group; + struct config_group planes_group; =20 /* protected by @lock */ struct mutex lock; @@ -72,6 +75,15 @@ struct vkms_configfs { #define connector_possible_encoders_item_to_vkms_config_connector(item) \ container_of(to_config_group(item), struct vkms_config_connector, possibl= e_encoders_group) =20 +#define planes_group_to_vkms_configfs(group) \ + container_of(group, struct vkms_configfs, planes_group) + +#define planes_item_to_vkms_config_plane(item) \ + container_of(to_config_group(item), struct vkms_config_plane, plane_group) + +#define plane_possible_crtcs_item_to_vkms_config_plane(item) \ + container_of(to_config_group(item), struct vkms_config_plane, possible_cr= tcs_group) + static ssize_t crtc_cursor_show(struct config_item *item, char *page) { struct vkms_config_crtc *crtc_cfg =3D crtcs_item_to_vkms_config_crtc(item= ); @@ -450,6 +462,110 @@ static struct config_item_type connectors_group_type = =3D { .ct_owner =3D THIS_MODULE, }; =20 +static int plane_possible_crtcs_allow_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_plane *plane_cfg; + struct vkms_config_crtc *crtc_cfg; + + if (target->ci_type !=3D &crtc_group_type) + return -EINVAL; + + plane_cfg =3D plane_possible_crtcs_item_to_vkms_config_plane(src); + crtc_cfg =3D crtcs_item_to_vkms_config_crtc(target); + + if (plane_cfg->possible_crtcs & BIT(crtc_cfg->index)) + return -EINVAL; + + plane_cfg->possible_crtcs |=3D BIT(crtc_cfg->index); + + return 0; +} + +static void plane_possible_crtcs_drop_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_config_plane *plane_cfg; + struct vkms_config_crtc *crtc_cfg; + + plane_cfg =3D plane_possible_crtcs_item_to_vkms_config_plane(src); + crtc_cfg =3D crtcs_item_to_vkms_config_crtc(target); + + plane_cfg->possible_crtcs &=3D ~BIT(crtc_cfg->index); +} + +static struct configfs_item_operations plane_possible_crtcs_item_ops =3D { + .allow_link =3D &plane_possible_crtcs_allow_link, + .drop_link =3D &plane_possible_crtcs_drop_link, +}; + +static struct config_item_type plane_possible_crtcs_group_type =3D { + .ct_item_ops =3D &plane_possible_crtcs_item_ops, + .ct_owner =3D THIS_MODULE, +}; + +static const struct config_item_type plane_group_type =3D { + .ct_owner =3D THIS_MODULE, +}; + +static struct config_group *make_planes_group(struct config_group *group, + const char *name) +{ + struct vkms_configfs *configfs =3D planes_group_to_vkms_configfs(group); + struct vkms_config_plane *plane_cfg; + int ret; + + mutex_lock(&configfs->lock); + + if (configfs->enabled) { + ret =3D -EINVAL; + goto err_unlock; + } + + plane_cfg =3D vkms_config_add_overlay_plane(configfs->vkms_config, 0); + if (IS_ERR(plane_cfg)) { + ret =3D PTR_ERR(plane_cfg); + goto err_unlock; + } + + config_group_init_type_name(&plane_cfg->plane_group, name, + &plane_group_type); + + config_group_init_type_name(&plane_cfg->possible_crtcs_group, + "possible_crtcs", + &plane_possible_crtcs_group_type); + configfs_add_default_group(&plane_cfg->possible_crtcs_group, + &plane_cfg->plane_group); + + mutex_unlock(&configfs->lock); + + return &plane_cfg->plane_group; + +err_unlock: + mutex_unlock(&configfs->lock); + return ERR_PTR(ret); +} + +static void drop_planes_group(struct config_group *group, + struct config_item *item) +{ + struct vkms_configfs *configfs =3D planes_group_to_vkms_configfs(group); + struct vkms_config_plane *plane_cfg =3D + planes_item_to_vkms_config_plane(item); + + vkms_config_destroy_overlay_plane(configfs->vkms_config, plane_cfg); +} + +static struct configfs_group_operations planes_group_ops =3D { + .make_group =3D &make_planes_group, + .drop_item =3D &drop_planes_group, +}; + +static struct config_item_type planes_group_type =3D { + .ct_group_ops =3D &planes_group_ops, + .ct_owner =3D THIS_MODULE, +}; + static ssize_t device_enabled_show(struct config_item *item, char *page) { struct vkms_configfs *configfs =3D config_item_to_vkms_configfs(item); @@ -538,6 +654,11 @@ static struct config_group *make_device_group(struct c= onfig_group *group, configfs_add_default_group(&configfs->connectors_group, &configfs->device_group); =20 + config_group_init_type_name(&configfs->planes_group, "planes", + &planes_group_type); + configfs_add_default_group(&configfs->planes_group, + &configfs->device_group); + return &configfs->device_group; } =20 --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C15A519D8BF for ; Tue, 13 Aug 2024 10:51:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546321; cv=none; b=fqSL8mmp3clKfGGOtx6lxRWndHxqdI0u21KoAvgwTnNvsuUdMw0GGQ6qUYkZaL/70inTMrQEJo314ZA4xsLg+rkRXUiXZXjmop4xv6AKIqvhAWttOTh2EV7xn4ZdPGbqZ6bGLkIrBJWCI4Yv5bW9veoqTN/9xQCm44nYTsitLuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546321; c=relaxed/simple; bh=1vPRXFGHzcZ8LTZc6EHWFkg+E/5uzKpBGeHasFIaYhA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=W39tP4NBWQr674k+83CqSqmH9aCxx7ssX4AipOY8x7YtEZ/erndXbghWEg3v+FMNPoVnMka9kZkG+dAkIqqWJ73gVvunRejIzHXSQwMu2QpRMmlWkm7xAx50k7ZDmfWJyiYtQX1Ga9QG3TFFLaKXoKRWekh3CBb+/DtkUsT68i4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IIrGndos; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IIrGndos" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-42809d6e719so40948275e9.3 for ; Tue, 13 Aug 2024 03:51:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546318; x=1724151118; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NDXFx9oyQqvcOYhB99pL1IoGdV1beOFs/38ZJyCSxSU=; b=IIrGndosh1LhzEkr+vdvwi+eodf1ig8Ggej2ko122tMYemFA819gAtPOz7F5XzMYA8 QWYJOH9nN9KILtT5N8S+tyu3pMcRvVmcfLuz2YOIUsVH+bbZN/0zQqRYfrQ9nO/l+NWq LgtVC55/kEVZySKF2eWe3Vr4HafEjuofgmtMkIQserB0YFu8lG2IEso50yGXndpWhPZ4 cVkBeddttGaiVyaCJGmwYu7ZL13pt04ZpbXFK+ZpU7lVjYh6O/4Ro+oLQb+Ho2j+0lnf MRL3Un+Ve/tBciuwmbDxI/Upmebv398P15hzmuITGfM27d2vMjmvMStbsHMaUbSoltCX dDdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546318; x=1724151118; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NDXFx9oyQqvcOYhB99pL1IoGdV1beOFs/38ZJyCSxSU=; b=hLnpehqYTuhsf61o8LNQU5nfjCxNNwkTvlbUhYnprH4/ZTgLFeJnn9Sq5e1b3E4/SX Ms3DvjKqoICnqFv7uuvWiMKEar+NZ9H63bKO5QwfEk8TCo52sWfVKMA2qOo4bUY6qx+d UAtP1vyk3iDRlesXfZ9dXtb9FdbZoyrOE9HNHuOaRYah2RBYUwNbaZdsbL8N6U6S2HeT Q1PQ+7M6NBnRW7fjswfUH4MHo/Hra7PQOIp+WUgfWarAqhYOwlaZ8nUtm98owO8I1G+U Tuq+R3ba1QmxBLKYk5udQbCI/z5yToYE4vrvg68C6D2WBn63PhjbYtgQSa31P3aJ8q2G OrZQ== X-Forwarded-Encrypted: i=1; AJvYcCXGbe/pgm+d4nwGpg5/IYkqT5TDX99KqCwBQzr7D1sWWFpKNn0UHvu64FWqI0CVtZAhl3B3+YeYCF9K2lDDHbHJa83r66jn/f/264sa X-Gm-Message-State: AOJu0YwlsewPiADLyT4K9mwdWPwuBwTpt5LaeRG5muQ+1pTfZXhSJwMz BeHnG1HQKkudKzhs7I5GlSSydxKYLgsHHx5dw4JhcZWrEKox+Heo X-Google-Smtp-Source: AGHT+IHLXkMedbpCr6hlAG1DdMuIvHHufBsDrmGhHYgCZ8y3pi5ipgfYN1AcQBwWX1VrGZkNd/p4RA== X-Received: by 2002:a05:600c:450d:b0:428:6f4:57ff with SMTP id 5b1f17b1804b1-429d48952demr21162335e9.35.1723546318022; Tue, 13 Aug 2024 03:51:58 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:57 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 16/17] drm/vkms: Allow to configure the default device creation Date: Tue, 13 Aug 2024 12:44:27 +0200 Message-ID: <20240813105134.17439-17-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add a new module param to allow to create or not the default VKMS instance. Useful when combined with configfs to avoid having additional VKMS instances. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/vkms/vkms_drv.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_dr= v.c index f524a9550017..248cb7166256 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -50,6 +50,10 @@ static bool enable_overlay; module_param_named(enable_overlay, enable_overlay, bool, 0444); MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support"); =20 +static bool create_default_dev =3D true; +module_param_named(create_default_dev, create_default_dev, bool, 0444); +MODULE_PARM_DESC(create_default_dev, "Create or not the default VKMS devic= e"); + DEFINE_DRM_GEM_FOPS(vkms_driver_fops); =20 static void vkms_release(struct drm_device *dev) @@ -230,9 +234,11 @@ static int __init vkms_init(void) =20 default_config =3D config; =20 - ret =3D vkms_create(config); - if (ret) - goto err_kfree; + if (create_default_dev) { + ret =3D vkms_create(config); + if (ret) + goto err_kfree; + } =20 ret =3D vkms_configfs_register(); if (ret) --=20 2.46.0 From nobody Sat Feb 7 16:00:15 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DB7C19DF9F for ; Tue, 13 Aug 2024 10:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546322; cv=none; b=O6UoPKJL0UqcjDluy3SqT4fQmL0HtLnaURWlIAzRuwKGHRTBw1NASQC2BGCYQWwmjWV9nhgbR2ql3jVJHpygtk1kezwY8JnI5guuOmhg0TrZ+9Su/HMeFkeihv1dqo3m/dDPOLzNwluha1lsG4jkyLWMAZnt0OK7HONvYvB9vQs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723546322; c=relaxed/simple; bh=20en9IvoseToki1ZM++avUf+aFbymKoGL2rG6HuSeIo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HE8OxPhApeL1jBxURaLcK2LWKUUVW7aJiPg8MSCrMxyql21AXGk3P9RzetBvyRy2UMwaArfoYxXUc1Kt78KotbxTT7QflQizfiTDczO/ed1W10ztOCMM63G391fKQzSae1utkJ4Ec9hiJ5+PhZBE1DAwNBQdlKVZ8l+54dVX75Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JJ/40GFM; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JJ/40GFM" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-428e0d18666so39544415e9.3 for ; Tue, 13 Aug 2024 03:52:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723546319; x=1724151119; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZftJBc7W5kwvvNABWDGPxvru4sevjwR+IU4HN2kbDT8=; b=JJ/40GFM/Y1zapAcSO3apH907Ke13qOQzT72G8h4Wu/EJNvFpiC4l5yOIcOfUISBA2 5xBCgtROuHkFc6jWrXcqDfU3hM6Z4y3y63foUI8ULKnB6A+goYN5UCWHz63gwRdwsAFb 4SuHIL1dlGicoC5b2XNJNaCEoy7vxvKvuQpqaxxawM+FJWUE+qOd9Vkk9PYNZRgiz8vI ibbGIQi4cVOGBn7T5VbdAASoFSjdx85AfBW4EMvsKChjLBVoaGVGv0ubQM2XuvulKOe8 b6dXraD8vQ1T/FyBoHF0W9iEMgS4Yl+dlhJGoZn/HhWSmRd7thxOE3M4enk7z6l/FE5J R3Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723546319; x=1724151119; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZftJBc7W5kwvvNABWDGPxvru4sevjwR+IU4HN2kbDT8=; b=rhUHqxB//1Bw7ULcJ1IUIW9oS5MTzJfBWLWvvpr1RRRmGU9e+s00e8Ic8blny6tJ6D IrQehwFN2pDCEe3Vf0LQWI20cd0Zmd2qBsRj2zmlK2HB21chkWz3irjzViPrqrxj7Ijh 9X4PX2uV7CIGTwz+/pj6CoAPC43xu+hi42sLNQq/FhH4biKiH1R8CY1QUK06bXNrJelS /hXcoaqLKPjnEfNW1M33wdLR8xL8bfsOcrc3iKsEPmAt8muheghKJeinidpxyuv+cgrs y0gewXbDabbdojOAnC79oZR2ei1pt3au1h30OpU8YH3z8s+WEiLm98p2x4vbjZ3l8b5I N8Fg== X-Forwarded-Encrypted: i=1; AJvYcCV854a62kQpD9WdbGveSj0/YOjiaitR9XhbrjffhSaTHoji4RMqFqT2v7TBe80OCTLWag6mqGprqXRb54X121SKBZzN2rmTeyaqr774 X-Gm-Message-State: AOJu0YyBkGiSeFBTEzmV/AsQqM6chkQgO33vmxxDGYSKj1rSM4RhsY2s 7hRB14CFARc4+0BWbl4l8YIQXWrhkmofZFX/yFbBOVx4siC6qveH X-Google-Smtp-Source: AGHT+IGmYYsdBOSQGdHs8roYpDqyGK4MJTVsNTujjltjUQNx3CKHicYkYjxIfPWC0fDyWxdLgRP2XA== X-Received: by 2002:a05:600c:4453:b0:428:f1b4:3473 with SMTP id 5b1f17b1804b1-429d486e85fmr22635355e9.26.1723546319268; Tue, 13 Aug 2024 03:51:59 -0700 (PDT) Received: from fedora.. ([213.94.26.172]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-429d877e066sm17290785e9.1.2024.08.13.03.51.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Aug 2024 03:51:58 -0700 (PDT) From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= To: rodrigosiqueiramelo@gmail.com Cc: melissa.srw@gmail.com, mairacanal@riseup.net, hamohammed.sa@gmail.com, daniel@ffwll.ch, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, louis.chauvet@bootlin.com, =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Subject: [RFC PATCH 17/17] drm/vkms: Remove completed task from the TODO list Date: Tue, 13 Aug 2024 12:44:28 +0200 Message-ID: <20240813105134.17439-18-jose.exposito89@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240813105134.17439-1-jose.exposito89@gmail.com> References: <20240813105134.17439-1-jose.exposito89@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Remove the configfs related TODO items from the "Runtime Configuration" section. Signed-off-by: Jos=C3=A9 Exp=C3=B3sito --- Documentation/gpu/vkms.rst | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index ee71d1a569dd..a8c187f6c0af 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -229,19 +229,12 @@ Runtime Configuration We want to be able to reconfigure vkms instance without having to reload t= he module. Use/Test-cases: =20 -- Hotplug/hotremove connectors on the fly (to be able to test DP MST handl= ing - of compositors). - -- Configure planes/crtcs/connectors (we'd need some code to have more than= 1 of - them first). +- Hotremove connectors on the fly (to be able to test DP MST handling of + compositors). =20 - Change output configuration: Plug/unplug screens, change EDID, allow cha= nging the refresh rate. =20 -The currently proposed solution is to expose vkms configuration through -configfs. All existing module options should be supported through configfs -too. - Writeback support ----------------- =20 --=20 2.46.0