From daf27a993367792ad276cd243f4ca60da28b6170 Mon Sep 17 00:00:00 2001 From: Andrew Lassalle Date: Wed, 2 Sep 2020 13:10:58 -0700 Subject: kernel-device,qrtr: add MMKernelDeviceQrtr skeleton Add the skeleton of MMKernelDeviceQrtr and allow building it by the introduction of with-qrtr. --- src/Makefile.am | 7 + src/kerneldevice/mm-kernel-device-qrtr.c | 238 +++++++++++++++++++++++++++++++ src/kerneldevice/mm-kernel-device-qrtr.h | 62 ++++++++ src/mm-base-manager.c | 6 + 4 files changed, 313 insertions(+) create mode 100644 src/kerneldevice/mm-kernel-device-qrtr.c create mode 100644 src/kerneldevice/mm-kernel-device-qrtr.h diff --git a/src/Makefile.am b/src/Makefile.am index c00e8ac3..8de74a0b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -162,6 +162,13 @@ libkerneldevice_la_SOURCES = \ kerneldevice/mm-kernel-device-generic-rules.c \ $(NULL) +if WITH_QRTR +libkerneldevice_la_SOURCES += \ + kerneldevice/mm-kernel-device-qrtr.h \ + kerneldevice/mm-kernel-device-qrtr.c \ + $(NULL) +endif + if WITH_UDEV libkerneldevice_la_SOURCES += \ kerneldevice/mm-kernel-device-udev.h \ diff --git a/src/kerneldevice/mm-kernel-device-qrtr.c b/src/kerneldevice/mm-kernel-device-qrtr.c new file mode 100644 index 00000000..298d30ca --- /dev/null +++ b/src/kerneldevice/mm-kernel-device-qrtr.c @@ -0,0 +1,238 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright 2020 Google LLC + */ + +#include + +#define _LIBMM_INSIDE_MM +#include + +#include + +#include "mm-kernel-device-qrtr.h" + +G_DEFINE_TYPE (MMKernelDeviceQrtr, mm_kernel_device_qrtr, MM_TYPE_KERNEL_DEVICE) + +enum { + PROP_0, + PROP_QRTR_NODE, + PROP_LAST +}; + +static GParamSpec *properties[PROP_LAST]; + +struct _MMKernelDeviceQrtrPrivate { + QrtrNode *node; + gchar *name; + gchar *physdev_uid; +}; + +/*****************************************************************************/ + +gchar * +mm_kernel_device_qrtr_helper_build_name (guint32 node_id) +{ + return g_strdup_printf ("qrtr%u", node_id); +} + +/*****************************************************************************/ + +QrtrNode * +mm_kernel_device_qrtr_get_node (MMKernelDeviceQrtr *self) +{ + return g_object_ref (self->priv->node); +} + +/*****************************************************************************/ + +static gboolean +kernel_device_cmp (MMKernelDevice *_a, + MMKernelDevice *_b) +{ + MMKernelDeviceQrtr *a; + MMKernelDeviceQrtr *b; + + a = MM_KERNEL_DEVICE_QRTR (_a); + b = MM_KERNEL_DEVICE_QRTR (_b); + + return qrtr_node_get_id (a->priv->node) == qrtr_node_get_id (b->priv->node); +} + +static gboolean +kernel_device_has_property (MMKernelDevice *_self, + const gchar *property) +{ + MMKernelDeviceQrtr *self; + + self = MM_KERNEL_DEVICE_QRTR (_self); + + return !!g_object_get_data (G_OBJECT (self), property); +} + +static const gchar * +kernel_device_get_property (MMKernelDevice *_self, + const gchar *property) +{ + MMKernelDeviceQrtr *self; + + self = MM_KERNEL_DEVICE_QRTR (_self); + + return g_object_get_data (G_OBJECT (self), property); +} + +static const gchar * +kernel_device_get_driver (MMKernelDevice *_self) +{ + return MM_KERNEL_DEVICE_QRTR_DRIVER; +} + +static const gchar * +kernel_device_get_name (MMKernelDevice *_self) +{ + MMKernelDeviceQrtr *self; + + self = MM_KERNEL_DEVICE_QRTR (_self); + if (!self->priv->name) + self->priv->name = mm_kernel_device_qrtr_helper_build_name (qrtr_node_get_id (self->priv->node)); + + return self->priv->name; +} + +static const gchar * +kernel_device_get_physdev_uid (MMKernelDevice *_self) +{ + MMKernelDeviceQrtr *self; + + self = MM_KERNEL_DEVICE_QRTR (_self); + + if (!self->priv->physdev_uid) + self->priv->physdev_uid = g_strdup_printf ("qrtr%d", qrtr_node_get_id (self->priv->node)); + + return self->priv->physdev_uid; +} + +static const gchar * +kernel_device_get_subsystem (MMKernelDevice *_self) +{ + return MM_KERNEL_DEVICE_QRTR_SUBSYSTEM; +} +/*****************************************************************************/ + +MMKernelDevice * +mm_kernel_device_qrtr_new (QrtrNode *qrtr_node) +{ + MMKernelDevice *self; + + self = MM_KERNEL_DEVICE (g_object_new (MM_TYPE_KERNEL_DEVICE_QRTR, + "qrtr-node", qrtr_node, + NULL)); + return self; +} + +/*****************************************************************************/ + +static void +mm_kernel_device_qrtr_init (MMKernelDeviceQrtr *self) +{ + /* Initialize private data */ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_KERNEL_DEVICE_QRTR, MMKernelDeviceQrtrPrivate); + + /* Set properties*/ + g_object_set_data_full (G_OBJECT (self), ID_MM_PORT_TYPE_QMI, g_strdup ("true"), g_free); + g_object_set_data_full (G_OBJECT (self), ID_MM_CANDIDATE, g_strdup ("1"), g_free); + +} + +static void +set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MMKernelDeviceQrtr *self = MM_KERNEL_DEVICE_QRTR (object); + + switch (prop_id) { + case PROP_QRTR_NODE: + g_assert (!self->priv->node); + self->priv->node = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MMKernelDeviceQrtr *self = MM_KERNEL_DEVICE_QRTR (object); + + switch (prop_id) { + case PROP_QRTR_NODE: + g_value_set_object (value, self->priv->node); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +dispose (GObject *object) +{ + MMKernelDeviceQrtr *self = MM_KERNEL_DEVICE_QRTR (object); + + g_clear_pointer (&self->priv->name, g_free); + g_clear_pointer (&self->priv->physdev_uid, g_free); + g_object_unref (self->priv->node); + + G_OBJECT_CLASS (mm_kernel_device_qrtr_parent_class)->dispose (object); +} + +static void +mm_kernel_device_qrtr_class_init (MMKernelDeviceQrtrClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMKernelDeviceClass *kernel_device_class = MM_KERNEL_DEVICE_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (MMKernelDeviceQrtrPrivate)); + + object_class->dispose = dispose; + object_class->get_property = get_property; + object_class->set_property = set_property; + + kernel_device_class->get_driver = kernel_device_get_driver; + kernel_device_class->get_name = kernel_device_get_name; + kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid; + kernel_device_class->get_subsystem = kernel_device_get_subsystem; + kernel_device_class->cmp = kernel_device_cmp; + kernel_device_class->has_property = kernel_device_has_property; + kernel_device_class->get_property = kernel_device_get_property; + + /* Device-wide properties are stored per-port in the qrtr backend */ + kernel_device_class->has_global_property = kernel_device_has_property; + kernel_device_class->get_global_property = kernel_device_get_property; + + properties[PROP_QRTR_NODE] = + g_param_spec_object ("qrtr-node", + "qrtr node", + "Node object as reported by QrtrNode", + QRTR_TYPE_NODE, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, PROP_LAST, properties); +} diff --git a/src/kerneldevice/mm-kernel-device-qrtr.h b/src/kerneldevice/mm-kernel-device-qrtr.h new file mode 100644 index 00000000..7b163004 --- /dev/null +++ b/src/kerneldevice/mm-kernel-device-qrtr.h @@ -0,0 +1,62 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright 2020 Google LLC + */ + +#ifndef MM_KERNEL_DEVICE_QRTR_H +#define MM_KERNEL_DEVICE_QRTR_H + +#include +#include +#include + +#define _LIBMM_INSIDE_MM +#include + +#include "mm-kernel-device.h" + +/* Driver string reported for all QRTR nodes; not really a kernel driver */ +#define MM_KERNEL_DEVICE_QRTR_DRIVER "qrtr" + +/* Subsytem string reported for all QRTR nodes; not really a kernel subsystem */ +#define MM_KERNEL_DEVICE_QRTR_SUBSYSTEM "qrtr" + +/* Helper to create a unique device name from the QRTR node id */ +gchar *mm_kernel_device_qrtr_helper_build_name (guint32 node_id); + +#define MM_TYPE_KERNEL_DEVICE_QRTR (mm_kernel_device_qrtr_get_type ()) +#define MM_KERNEL_DEVICE_QRTR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_KERNEL_DEVICE_QRTR, MMKernelDeviceQrtr)) +#define MM_KERNEL_DEVICE_QRTR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MM_TYPE_KERNEL_DEVICE_QRTR, MMKernelDeviceQrtrClass)) +#define MM_IS_KERNEL_DEVICE_QRTR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_KERNEL_DEVICE_QRTR)) +#define MM_IS_KERNEL_DEVICE_QRTR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_KERNEL_DEVICE_QRTR)) +#define MM_KERNEL_DEVICE_QRTR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_KERNEL_DEVICE_QRTR, MMKernelDeviceQrtrClass)) + +typedef struct _MMKernelDeviceQrtr MMKernelDeviceQrtr; +typedef struct _MMKernelDeviceQrtrClass MMKernelDeviceQrtrClass; +typedef struct _MMKernelDeviceQrtrPrivate MMKernelDeviceQrtrPrivate; + +struct _MMKernelDeviceQrtr { + MMKernelDevice parent; + MMKernelDeviceQrtrPrivate *priv; +}; + +struct _MMKernelDeviceQrtrClass { + MMKernelDeviceClass parent; +}; + +QrtrNode *mm_kernel_device_qrtr_get_node (MMKernelDeviceQrtr *self); + +GType mm_kernel_device_qrtr_get_type (void); +MMKernelDevice *mm_kernel_device_qrtr_new (QrtrNode *qrtr_node); + +#endif /* MM_KERNEL_DEVICE_QRTR_H */ diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index 366fcc10..03a387c3 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -24,6 +24,12 @@ #include +#if defined WITH_QMI +# include +#endif +#if defined WITH_QMI && QMI_QRTR_SUPPORTED +# include "mm-kernel-device-qrtr.h" +#endif #if defined WITH_UDEV # include "mm-kernel-device-udev.h" #endif -- cgit v1.2.3