#include <irq_kern.h>
#include <init.h>
#include <os.h>
+#include "mconsole_kern.h"
#include "vhost_user.h"
#define MAX_SUPPORTED_QUEUE_SIZE 256
.release = vu_cmdline_release_dev,
};
+static DEFINE_MUTEX(vu_cmdline_lock);
static bool vu_cmdline_parent_registered;
static int vu_cmdline_id;
vu_unregister_cmdline_device(&pdata->pdev->dev, NULL);
}
-static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
+static int vu_cmdline_set_device(const char *device)
{
const char *ids = strchr(device, ':');
unsigned int virtio_device_id;
if (!ids || ids == device)
return -EINVAL;
+ guard(mutex)(&vu_cmdline_lock);
+
processed = sscanf(ids, ":%u%n:%d%n",
&virtio_device_id, &consumed,
&vu_cmdline_id, &consumed);
return err;
}
+static int vu_cmdline_set(const char *device, const struct kernel_param *kp)
+{
+ return vu_cmdline_set_device(device);
+}
+
static int vu_cmdline_get_device(struct device *dev, void *data)
{
struct platform_device *pdev = to_platform_device(dev);
static int vu_cmdline_get(char *buffer, const struct kernel_param *kp)
{
+ guard(mutex)(&vu_cmdline_lock);
+
buffer[0] = '\0';
if (vu_cmdline_parent_registered)
device_for_each_child(&vu_cmdline_parent, buffer,
static void vu_unregister_cmdline_devices(void)
{
+ guard(mutex)(&vu_cmdline_lock);
+
if (vu_cmdline_parent_registered) {
device_for_each_child(&vu_cmdline_parent, NULL,
vu_unregister_cmdline_device);
}
}
+static int vu_mc_config(char *str, char **error_out)
+{
+ if (*str != '=') {
+ *error_out = "Invalid config";
+ return -EINVAL;
+ }
+ str += 1;
+ return vu_cmdline_set_device(str);
+}
+
+static int vu_mc_id(char **str, int *start_out, int *end_out)
+{
+ return -EOPNOTSUPP;
+}
+
+static int vu_mc_remove(int n, char **error_out)
+{
+ return -EOPNOTSUPP;
+}
+
+static struct mc_device virtio_uml_mc = {
+ .list = LIST_HEAD_INIT(virtio_uml_mc.list),
+ .name = "virtio_uml.device",
+ .config = vu_mc_config,
+ .get_config = NULL,
+ .id = vu_mc_id,
+ .remove = vu_mc_remove,
+};
+
+static int __init virtio_uml_mc_init(void)
+{
+ mconsole_register_dev(&virtio_uml_mc);
+ return 0;
+}
+late_initcall(virtio_uml_mc_init);
+
/* Platform driver */
static const struct of_device_id virtio_uml_match[] = {