From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
To: Elliot Berman <quic_eberman@quicinc.com>,
Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Murali Nalajala <quic_mnalajal@quicinc.com>,
Trilok Soni <quic_tsoni@quicinc.com>,
Srivatsa Vaddagiri <quic_svaddagi@quicinc.com>,
Carl van Schaik <quic_cvanscha@quicinc.com>,
Andy Gross <agross@kernel.org>,
linux-arm-kernel@lists.infradead.org,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Sudeep Holla <sudeep.holla@arm.com>,
Marc Zyngier <maz@kernel.org>, Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Jonathan Corbet <corbet@lwn.net>, Will Deacon <will@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
devicetree@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-msm@vger.kernel.org
Subject: Re: [PATCH v2 06/11] virt: gunyah: Add capabilities bus and devices
Date: Tue, 2 Aug 2022 11:20:45 +0300 [thread overview]
Message-ID: <95d86d1f-28dd-b373-ff5e-f8ce6f5bb55c@linaro.org> (raw)
In-Reply-To: <20220801211240.597859-7-quic_eberman@quicinc.com>
On 02/08/2022 00:12, Elliot Berman wrote:
> Some resources provided by the Gunyah hypervisor are described as
> objects. The objects are identified with a capability ID. For instance,
> Inter-VM communication is performed with doorbells and message queues.
> Each doorbell and message queue endpoint can be described consisely as a
> Linux device.
>
> These resources are discovered either on the devicetree or reported by
> the Resource Manager. Devices on the Gunyah bus are matched with drivers
> according to the type ID reported by resource manager. Most resources
> will be discovered directly from the resource manager, so matching
> directly on type ID seems like sensible design.
>
> Each resource may also optionally have an interrupt associated with it
> and a known partner VM (e.g. which VM is the receiver of a message
> queue).
>
> Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> ---
> drivers/virt/gunyah/Makefile | 2 +-
> drivers/virt/gunyah/device.c | 108 +++++++++++++++++++++++++++
> drivers/virt/gunyah/gunyah_private.h | 12 +++
> drivers/virt/gunyah/sysfs.c | 25 ++++++-
> include/linux/gunyah.h | 45 +++++++++++
> 5 files changed, 189 insertions(+), 3 deletions(-)
> create mode 100644 drivers/virt/gunyah/device.c
> create mode 100644 drivers/virt/gunyah/gunyah_private.h
>
> diff --git a/drivers/virt/gunyah/Makefile b/drivers/virt/gunyah/Makefile
> index 0aa086f9149f..3869fb7371df 100644
> --- a/drivers/virt/gunyah/Makefile
> +++ b/drivers/virt/gunyah/Makefile
> @@ -1,4 +1,4 @@
> # SPDX-License-Identifier: GPL-2.0-only
>
> -gunyah-y += sysfs.o
> +gunyah-y += sysfs.o device.o
> obj-$(CONFIG_GUNYAH) += gunyah.o
> \ No newline at end of file
Even git-format-patch warns you that should be a newline at the end of
the file.
> diff --git a/drivers/virt/gunyah/device.c b/drivers/virt/gunyah/device.c
> new file mode 100644
> index 000000000000..93595f9a65b9
> --- /dev/null
> +++ b/drivers/virt/gunyah/device.c
> @@ -0,0 +1,108 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#define pr_fmt(fmt) "ghdev: " fmt
> +
> +#include <linux/interrupt.h>
> +#include <linux/gunyah.h>
> +#include <linux/device.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +
> +#include "gunyah_private.h"
> +
> +static int gunyah_match(struct device *dev, struct device_driver *drv)
> +{
> + struct gunyah_device *ghdev = to_gunyah_device(dev);
> + struct gunyah_driver *ghdrv = to_gunyah_driver(drv);
> +
> + return ghdev->type == ghdrv->type;
> +}
> +
> +static int gunyah_probe(struct device *dev)
> +{
> + struct gunyah_device *ghdev = to_gunyah_device(dev);
> + struct gunyah_driver *ghdrv = to_gunyah_driver(dev->driver);
> +
> + return ghdrv->probe ? ghdrv->probe(ghdev) : 0;
> +}
> +
> +static void gunyah_remove(struct device *dev)
> +{
> + struct gunyah_device *ghdev = to_gunyah_device(dev);
> + struct gunyah_driver *ghdrv = to_gunyah_driver(dev->driver);
> +
> + if (ghdrv->remove)
> + ghdrv->remove(ghdev);
> +}
> +
> +static struct bus_type gunyah_bus = {
> + .name = "gunyah",
> + .match = gunyah_match,
> + .probe = gunyah_probe,
> + .remove = gunyah_remove,
> +};
> +
> +int gunyah_register_driver(struct gunyah_driver *ghdrv)
> +{
> + ghdrv->driver.bus = &gunyah_bus;
> + return driver_register(&ghdrv->driver);
> +}
> +
> +void gunyah_unregister_driver(struct gunyah_driver *ghdrv)
> +{
> + driver_unregister(&ghdrv->driver);
> +}
> +
> +static void gunyah_device_release(struct device *dev)
> +{
> + struct gunyah_device *ghdev = to_gunyah_device(dev);
> +
> + kfree(ghdev);
> +}
> +
> +struct gunyah_device *gunyah_device_alloc(struct device *parent, gh_capid_t capid, u8 type)
> +{
> + struct gunyah_device *ghdev;
> +
> + ghdev = kzalloc(sizeof(*ghdev), GFP_KERNEL);
> + if (!ghdev)
> + return NULL;
> +
> + ghdev->capid = capid;
> + ghdev->type = type;
> + ghdev->irq = IRQ_NOTCONNECTED;
> + ghdev->dev.parent = parent;
> + ghdev->dev.release = gunyah_device_release;
> + ghdev->dev.bus = &gunyah_bus;
> + device_initialize(&ghdev->dev);
> + return ghdev;
> +}
> +
> +int gunyah_device_add(struct gunyah_device *ghdev)
> +{
> + int ret;
> +
> + ret = dev_set_name(&ghdev->dev, "%u.%08llx", ghdev->type, ghdev->capid);
> + if (ret)
> + return ret;
> +
> + return device_add(&ghdev->dev);
> +}
Does your device need any additional setup between _alloc() and _add().
If not, it may be better to squash them together.
> +
> +void gunyah_device_remove(struct gunyah_device *ghdev)
> +{
> + device_unregister(&ghdev->dev);
> +}
> +
> +int __init gunyah_bus_init(void)
> +{
> + return bus_register(&gunyah_bus);
> +}
> +
> +void gunyah_bus_exit(void)
> +{
> + bus_unregister(&gunyah_bus);
> +}
> diff --git a/drivers/virt/gunyah/gunyah_private.h b/drivers/virt/gunyah/gunyah_private.h
> new file mode 100644
> index 000000000000..5f3832608020
> --- /dev/null
> +++ b/drivers/virt/gunyah/gunyah_private.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#ifndef _GUNYAH_PRIVATE_H
> +#define _GUNYAH_PRIVATE_H
> +
> +int __init gunyah_bus_init(void);
> +void gunyah_bus_exit(void);
> +
> +#endif
> diff --git a/drivers/virt/gunyah/sysfs.c b/drivers/virt/gunyah/sysfs.c
> index 253433a939cf..220560cb3b1c 100644
> --- a/drivers/virt/gunyah/sysfs.c
> +++ b/drivers/virt/gunyah/sysfs.c
> @@ -12,6 +12,8 @@
> #include <linux/init.h>
> #include <linux/of.h>
>
> +#include "gunyah_private.h"
> +
> #define QC_HYP_UID0 0x19bd54bd
> #define QC_HYP_UID1 0x0b37571b
> #define QC_HYP_UID2 0x946f609b
> @@ -67,7 +69,13 @@ static struct kobj_attribute variant_attr = __ATTR_RO(variant);
>
> static ssize_t features_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer)
> {
> - return sysfs_emit(buffer, "\n");
> + int len = 0;
> +
> + if (GH_IDENTIFY_PARTITION_CSPACE(gunyah_api.flags))
> + len += sysfs_emit_at(buffer, len, "cspace ");
How is this related to Linux gunyah bus implementation? Please move to
the sysfs patch.
> +
> + len += sysfs_emit_at(buffer, len, "\n");
> + return len;
> }
> static struct kobj_attribute features_attr = __ATTR_RO(features);
>
> @@ -105,6 +113,7 @@ static void gh_sysfs_unregister(void)
>
> static int __init gunyah_init(void)
> {
> + int ret;
> unsigned long uid[4];
>
> arch_gh_hypercall(GH_HYPERCALL_CALL_UID, 0, uid[0], uid[1], uid[2], uid[3]);
> @@ -125,12 +134,24 @@ static int __init gunyah_init(void)
> GH_API_INFO_API_VERSION(gunyah_api.api_info),
> GH_API_INFO_VARIANT(gunyah_api.api_info));
>
> - return gh_sysfs_register();
> + ret = gh_sysfs_register();
> + if (ret)
> + return ret;
> +
> + ret = gunyah_bus_init();
> + if (ret)
> + goto err_sysfs;
> +
> + return ret;
> +err_sysfs:
> + gh_sysfs_unregister();
> + return ret;
> }
> module_init(gunyah_init);
>
> static void __exit gunyah_exit(void)
> {
> + gunyah_bus_exit();
> gh_sysfs_unregister();
> }
> module_exit(gunyah_exit);
> diff --git a/include/linux/gunyah.h b/include/linux/gunyah.h
> index 69931a0f5736..ce35f4491773 100644
> --- a/include/linux/gunyah.h
> +++ b/include/linux/gunyah.h
> @@ -6,6 +6,7 @@
> #ifndef _GUNYAH_H
> #define _GUNYAH_H
>
> +#include <linux/device.h>
> #include <linux/types.h>
> #include <linux/errno.h>
> #include <asm/gunyah.h>
> @@ -72,4 +73,48 @@ static inline int gh_remap_error(int gh_error)
> }
> }
>
> +/* Follows resource manager's resource types for VM_GET_HYP_RESOURCES */
> +#define GUNYAH_DEVICE_TYPE_BELL_TX 0
> +#define GUNYAH_DEVICE_TYPE_BELL_RX 1
> +#define GUNYAH_DEVICE_TYPE_MSGQ_TX 2
> +#define GUNYAH_DEVICE_TYPE_MSGQ_RX 3
> +#define GUNYAH_DEVICE_TYPE_VCPU 4
> +
> +struct gunyah_device {
> + u8 type;
> + gh_capid_t capid;
> + int irq;
> +
> + struct device dev;
> +};
> +
> +#define to_gunyah_device(dev) container_of(dev, struct gunyah_device, dev)
> +
> +static inline void *ghdev_get_drvdata(const struct gunyah_device *ghdev)
> +{
> + return dev_get_drvdata(&ghdev->dev);
> +}
> +
> +static inline void ghdev_set_drvdata(struct gunyah_device *ghdev, void *data)
> +{
> + dev_set_drvdata(&ghdev->dev, data);
> +}
> +
> +struct gunyah_device *gunyah_device_alloc(struct device *parent, gh_capid_t capid, u8 type);
> +
> +int gunyah_device_add(struct gunyah_device *ghdev);
> +void gunyah_device_remove(struct gunyah_device *ghdev);
> +
> +struct gunyah_driver {
> + struct device_driver driver;
> + u8 type;
> + int (*probe)(struct gunyah_device *ghdev);
> + int (*remove)(struct gunyah_device *ghdev);
> +};
> +
> +#define to_gunyah_driver(drv) container_of(drv, struct gunyah_driver, driver)
> +
> +int gunyah_register_driver(struct gunyah_driver *ghdrv);
> +void gunyah_unregister_driver(struct gunyah_driver *ghdrv);
> +
> #endif
--
With best wishes
Dmitry
next prev parent reply other threads:[~2022-08-02 8:20 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-01 21:12 [PATCH v2 00/11] Drivers for gunyah hypervisor Elliot Berman
2022-08-01 21:12 ` [PATCH v2 01/11] docs: gunyah: Introduce Gunyah Hypervisor Elliot Berman
2022-08-01 21:29 ` Jeffrey Hugo
2022-08-05 3:18 ` Bagas Sanjaya
2022-08-05 15:48 ` Elliot Berman
2022-08-06 15:31 ` kernel test robot
2022-08-01 21:12 ` [PATCH v2 02/11] dt-bindings: Add binding for gunyah hypervisor Elliot Berman
2022-08-02 7:28 ` Dmitry Baryshkov
2022-08-02 10:54 ` Krzysztof Kozlowski
2022-08-01 21:12 ` [PATCH v2 03/11] arm64: gunyah: Add Gunyah hypercalls ABI Elliot Berman
2022-08-02 13:34 ` Dmitry Baryshkov
2022-08-03 21:15 ` Elliot Berman
2022-08-04 7:04 ` Dmitry Baryshkov
2022-08-01 21:12 ` [PATCH v2 04/11] gunyah: Common types and error codes for Gunyah hypercalls Elliot Berman
2022-08-02 7:33 ` Dmitry Baryshkov
2022-08-03 21:16 ` Elliot Berman
2022-08-02 7:51 ` Dmitry Baryshkov
2022-08-03 21:16 ` Elliot Berman
2022-08-01 21:12 ` [PATCH v2 05/11] virt: gunyah: Add sysfs nodes Elliot Berman
2022-08-02 7:42 ` Dmitry Baryshkov
2022-08-01 21:12 ` [PATCH v2 06/11] virt: gunyah: Add capabilities bus and devices Elliot Berman
2022-08-02 8:20 ` Dmitry Baryshkov [this message]
2022-08-01 21:12 ` [PATCH v2 07/11] gunyah: msgq: Add Gunyah message queues Elliot Berman
2022-08-02 8:14 ` Dmitry Baryshkov
2022-08-08 22:22 ` Elliot Berman
[not found] ` <87zggdven5.wl-maz@kernel.org>
2022-08-09 16:50 ` Elliot Berman
2022-08-23 7:57 ` Dmitry Baryshkov
2022-08-01 21:12 ` [PATCH v2 08/11] gunyah: rsc_mgr: Add resource manager RPC core Elliot Berman
2022-08-01 21:12 ` [PATCH v2 09/11] gunyah: rsc_mgr: Add auxiliary devices for console Elliot Berman
2022-08-02 8:38 ` Dmitry Baryshkov
2022-08-03 21:19 ` Elliot Berman
2022-08-01 21:12 ` [PATCH v2 10/11] gunyah: rsc_mgr: Add RPC for console services Elliot Berman
2022-08-01 21:12 ` [PATCH v2 11/11] gunyah: Add tty console driver for RM Console Serivces Elliot Berman
2022-08-02 8:31 ` Dmitry Baryshkov
2022-08-03 21:15 ` Elliot Berman
2022-08-01 21:27 ` [PATCH v2 00/11] Drivers for gunyah hypervisor Jeffrey Hugo
2022-08-01 21:31 ` Elliot Berman
2022-08-02 9:24 ` Dmitry Baryshkov
2022-08-08 23:38 ` Elliot Berman
2022-08-09 13:13 ` Robin Murphy
2022-08-10 0:07 ` Elliot Berman
2022-08-10 4:12 ` Jassi Brar
2022-08-18 18:10 ` Elliot Berman
2022-08-23 8:01 ` Dmitry Baryshkov
2022-08-04 8:26 ` Bagas Sanjaya
2022-08-04 21:48 ` Elliot Berman
2022-08-05 2:15 ` Bagas Sanjaya
2022-08-05 7:45 ` Marc Zyngier
[not found] <20220223233729.1571114-1-quic_eberman@quicinc.com>
2022-07-14 21:29 ` [PATCH v2 00/11] Gunyah Hypervisor drivers Elliot Berman
2022-07-14 21:29 ` [PATCH v2 06/11] virt: gunyah: Add capabilities bus and devices Elliot Berman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=95d86d1f-28dd-b373-ff5e-f8ce6f5bb55c@linaro.org \
--to=dmitry.baryshkov@linaro.org \
--cc=agross@kernel.org \
--cc=bjorn.andersson@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=maz@kernel.org \
--cc=quic_cvanscha@quicinc.com \
--cc=quic_eberman@quicinc.com \
--cc=quic_mnalajal@quicinc.com \
--cc=quic_svaddagi@quicinc.com \
--cc=quic_tsoni@quicinc.com \
--cc=robh+dt@kernel.org \
--cc=sudeep.holla@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).