From nobody Mon Feb 9 19:05:18 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=philmd@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1635792190; cv=none; d=zohomail.com; s=zohoarc; b=m64As7y65zMl8aE/1feOmlmYn3YrUJxdO7oSFlIgv0EUhl7l/3x/enWf5sFpx9uZywYYpT06TDvlZy5vDjAoid0HFSGv40TiTzkEiVdhCMc8nDbJBrXeWvf78gd7gbehFRLz00rArKaU8sdZ7YBe2N829A50412ywhJSoxYu6z0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1635792190; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=SNHZNzBP1nSDzMaqDz3IAOQ774k1f3QsulMN2SnaIMo=; b=CWgowQO3gVhp/mU458cWXdETaCL74t7xvVyQQdScL+RpsGui0EyDsxirpl5XvYT03uZe8t2ShEJfdymFUYx4QFZVXpaXAbAftqN0qUnsVLEnPraYvW/EUXawYsp5foD1g+XgySiiKjcTdAY2MKbzVFSEUwR6VvYD6ZeVnIMHAFk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass header.from= (p=none dis=none) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1635792190973452.1483820092284; Mon, 1 Nov 2021 11:43:10 -0700 (PDT) Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-368-GPpoDayLM2yr9v4Ugb9znw-1; Mon, 01 Nov 2021 14:43:07 -0400 Received: by mail-wr1-f71.google.com with SMTP id c4-20020a056000184400b0016e0cc310b3so6543546wri.3 for ; Mon, 01 Nov 2021 11:43:07 -0700 (PDT) Return-Path: Return-Path: Received: from x1w.. (62.red-83-57-168.dynamicip.rima-tde.net. [83.57.168.62]) by smtp.gmail.com with ESMTPSA id w15sm5760475wrk.77.2021.11.01.11.43.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Nov 2021 11:43:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635792189; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SNHZNzBP1nSDzMaqDz3IAOQ774k1f3QsulMN2SnaIMo=; b=cDrHqgxB9nhoG4Cac84ItsZjgVpKUoVMWQzDsYEBFnXPhezMATrGByEqtp4HfxUk3fV2bt 0A/+N/zL5H5cGUKK3kIMiN4wA+kII5QtMXiaUz/ovHLZK4wl7HdSzCDzGToLv4kRX/nm0x /HD8PZyXxm4qePS05Sz1/Cx2bW/3vbA= X-MC-Unique: GPpoDayLM2yr9v4Ugb9znw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SNHZNzBP1nSDzMaqDz3IAOQ774k1f3QsulMN2SnaIMo=; b=7ZJi1j/FUzZp7VRdIbQCak5AgA65uTN+OUsqYmBgqgXQzKwfzdRS7MD4xRq8wXmk/Y Nu0cz1r8Wttc4KJLAa2Fx/2TmpV3AygID2tzg4c54Qqe4WF+nwiqg+720K7sXfTUisGH nWKi4gDIYROvRBUqMdtEfUrkPfeeMGKELXtdyX/fM9ZXW4qtyNYdRnr0J+dufwaXsV+f tz50ZQrqZwzvzTIDeDRosAunYGtrrgV0dx0B9llBIZse5+wFJ67n4XEP51ceII2ZDMgR eQEBoK9paXTroxjEOp23Z97roGd4qqw/fADopnRSpY2a0NyCGFqf0P3xloghFLWVPKqs L8Ag== X-Gm-Message-State: AOAM531aRN7MY6Z0W42Lcb8y6C66UE/qhXCsgZjHLC6CIEJ9D+w2/wGz BTg2pGkz9YF2kuHyyVWYotOJSa3xDEKO8s8WXneSLe7CjAD/yDgq7WBbZgnFFn7YqUFmmrcxpin aF3HG6UrcGREUhg== X-Received: by 2002:adf:ce0e:: with SMTP id p14mr18701250wrn.423.1635792186054; Mon, 01 Nov 2021 11:43:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwK0A4GsLFI09HL8uK4Dy9tYyGhnRz4MQ34BHU2niGUY0C7pJB23Whiez8jzowsMPR17s0s6A== X-Received: by 2002:adf:ce0e:: with SMTP id p14mr18701194wrn.423.1635792185774; Mon, 01 Nov 2021 11:43:05 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Eduardo Habkost , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Marcel Apfelbaum Subject: [PULL 01/10] machine: Move gpio code to hw/core/gpio.c Date: Mon, 1 Nov 2021 19:42:50 +0100 Message-Id: <20211101184259.2859090-2-philmd@redhat.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211101184259.2859090-1-philmd@redhat.com> References: <20211101184259.2859090-1-philmd@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1635792192391100001 From: Eduardo Habkost Only softmmu code uses gpio, so move gpio code from qdev.c to gpio.c and compile it only on softmmu mode. Signed-off-by: Eduardo Habkost Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20190425200051.19906-2-ehabkost@redhat.com> Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- hw/core/gpio.c | 197 ++++++++++++++++++++++++++++++++++++++++++++ hw/core/qdev.c | 174 -------------------------------------- hw/core/meson.build | 1 + 3 files changed, 198 insertions(+), 174 deletions(-) create mode 100644 hw/core/gpio.c diff --git a/hw/core/gpio.c b/hw/core/gpio.c new file mode 100644 index 00000000000..8e6b4f5edf3 --- /dev/null +++ b/hw/core/gpio.c @@ -0,0 +1,197 @@ +/* + * qdev GPIO helpers + * + * Copyright (c) 2009 CodeSourcery + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/qdev-core.h" +#include "hw/irq.h" +#include "qapi/error.h" + +static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, + const char *name) +{ + NamedGPIOList *ngl; + + QLIST_FOREACH(ngl, &dev->gpios, node) { + /* NULL is a valid and matchable name. */ + if (g_strcmp0(name, ngl->name) =3D=3D 0) { + return ngl; + } + } + + ngl =3D g_malloc0(sizeof(*ngl)); + ngl->name =3D g_strdup(name); + QLIST_INSERT_HEAD(&dev->gpios, ngl, node); + return ngl; +} + +void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, + qemu_irq_handler handler, + void *opaque, + const char *name, int n) +{ + int i; + NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); + + assert(gpio_list->num_out =3D=3D 0 || !name); + gpio_list->in =3D qemu_extend_irqs(gpio_list->in, gpio_list->num_in, h= andler, + opaque, n); + + if (!name) { + name =3D "unnamed-gpio-in"; + } + for (i =3D gpio_list->num_in; i < gpio_list->num_in + n; i++) { + gchar *propname =3D g_strdup_printf("%s[%u]", name, i); + + object_property_add_child(OBJECT(dev), propname, + OBJECT(gpio_list->in[i])); + g_free(propname); + } + + gpio_list->num_in +=3D n; +} + +void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) +{ + qdev_init_gpio_in_named(dev, handler, NULL, n); +} + +void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, + const char *name, int n) +{ + int i; + NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); + + assert(gpio_list->num_in =3D=3D 0 || !name); + + if (!name) { + name =3D "unnamed-gpio-out"; + } + memset(pins, 0, sizeof(*pins) * n); + for (i =3D 0; i < n; ++i) { + gchar *propname =3D g_strdup_printf("%s[%u]", name, + gpio_list->num_out + i); + + object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, + (Object **)&pins[i], + object_property_allow_set_link, + OBJ_PROP_LINK_STRONG); + g_free(propname); + } + gpio_list->num_out +=3D n; +} + +void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) +{ + qdev_init_gpio_out_named(dev, pins, NULL, n); +} + +qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) +{ + NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); + + assert(n >=3D 0 && n < gpio_list->num_in); + return gpio_list->in[n]; +} + +qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) +{ + return qdev_get_gpio_in_named(dev, NULL, n); +} + +void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, + qemu_irq pin) +{ + char *propname =3D g_strdup_printf("%s[%d]", + name ? name : "unnamed-gpio-out", n); + if (pin && !OBJECT(pin)->parent) { + /* We need a name for object_property_set_link to work */ + object_property_add_child(container_get(qdev_get_machine(), + "/unattached"), + "non-qdev-gpio[*]", OBJECT(pin)); + } + object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_ab= ort); + g_free(propname); +} + +qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, i= nt n) +{ + g_autofree char *propname =3D g_strdup_printf("%s[%d]", + name ? name : "unnamed-gpio-out", n); + + qemu_irq ret =3D (qemu_irq)object_property_get_link(OBJECT(dev), propn= ame, + NULL); + + return ret; +} + +/* disconnect a GPIO output, returning the disconnected input (if any) */ + +static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, + const char *name, int n) +{ + char *propname =3D g_strdup_printf("%s[%d]", + name ? name : "unnamed-gpio-out", n); + + qemu_irq ret =3D (qemu_irq)object_property_get_link(OBJECT(dev), propn= ame, + NULL); + if (ret) { + object_property_set_link(OBJECT(dev), propname, NULL, NULL); + } + g_free(propname); + return ret; +} + +qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, + const char *name, int n) +{ + qemu_irq disconnected =3D qdev_disconnect_gpio_out_named(dev, name, n); + qdev_connect_gpio_out_named(dev, name, n, icpt); + return disconnected; +} + +void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin) +{ + qdev_connect_gpio_out_named(dev, NULL, n, pin); +} + +void qdev_pass_gpios(DeviceState *dev, DeviceState *container, + const char *name) +{ + int i; + NamedGPIOList *ngl =3D qdev_get_named_gpio_list(dev, name); + + for (i =3D 0; i < ngl->num_in; i++) { + const char *nm =3D ngl->name ? ngl->name : "unnamed-gpio-in"; + char *propname =3D g_strdup_printf("%s[%d]", nm, i); + + object_property_add_alias(OBJECT(container), propname, + OBJECT(dev), propname); + g_free(propname); + } + for (i =3D 0; i < ngl->num_out; i++) { + const char *nm =3D ngl->name ? ngl->name : "unnamed-gpio-out"; + char *propname =3D g_strdup_printf("%s[%d]", nm, i); + + object_property_add_alias(OBJECT(container), propname, + OBJECT(dev), propname); + g_free(propname); + } + QLIST_REMOVE(ngl, node); + QLIST_INSERT_HEAD(&container->gpios, ngl, node); +} diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 7f06403752d..1e38f997245 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -436,180 +436,6 @@ BusState *qdev_get_parent_bus(DeviceState *dev) return dev->parent_bus; } =20 -static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, - const char *name) -{ - NamedGPIOList *ngl; - - QLIST_FOREACH(ngl, &dev->gpios, node) { - /* NULL is a valid and matchable name. */ - if (g_strcmp0(name, ngl->name) =3D=3D 0) { - return ngl; - } - } - - ngl =3D g_malloc0(sizeof(*ngl)); - ngl->name =3D g_strdup(name); - QLIST_INSERT_HEAD(&dev->gpios, ngl, node); - return ngl; -} - -void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, - qemu_irq_handler handler, - void *opaque, - const char *name, int n) -{ - int i; - NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); - - assert(gpio_list->num_out =3D=3D 0 || !name); - gpio_list->in =3D qemu_extend_irqs(gpio_list->in, gpio_list->num_in, h= andler, - opaque, n); - - if (!name) { - name =3D "unnamed-gpio-in"; - } - for (i =3D gpio_list->num_in; i < gpio_list->num_in + n; i++) { - gchar *propname =3D g_strdup_printf("%s[%u]", name, i); - - object_property_add_child(OBJECT(dev), propname, - OBJECT(gpio_list->in[i])); - g_free(propname); - } - - gpio_list->num_in +=3D n; -} - -void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) -{ - qdev_init_gpio_in_named(dev, handler, NULL, n); -} - -void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, - const char *name, int n) -{ - int i; - NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); - - assert(gpio_list->num_in =3D=3D 0 || !name); - - if (!name) { - name =3D "unnamed-gpio-out"; - } - memset(pins, 0, sizeof(*pins) * n); - for (i =3D 0; i < n; ++i) { - gchar *propname =3D g_strdup_printf("%s[%u]", name, - gpio_list->num_out + i); - - object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, - (Object **)&pins[i], - object_property_allow_set_link, - OBJ_PROP_LINK_STRONG); - g_free(propname); - } - gpio_list->num_out +=3D n; -} - -void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) -{ - qdev_init_gpio_out_named(dev, pins, NULL, n); -} - -qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) -{ - NamedGPIOList *gpio_list =3D qdev_get_named_gpio_list(dev, name); - - assert(n >=3D 0 && n < gpio_list->num_in); - return gpio_list->in[n]; -} - -qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) -{ - return qdev_get_gpio_in_named(dev, NULL, n); -} - -void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, - qemu_irq pin) -{ - char *propname =3D g_strdup_printf("%s[%d]", - name ? name : "unnamed-gpio-out", n); - if (pin && !OBJECT(pin)->parent) { - /* We need a name for object_property_set_link to work */ - object_property_add_child(container_get(qdev_get_machine(), - "/unattached"), - "non-qdev-gpio[*]", OBJECT(pin)); - } - object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_ab= ort); - g_free(propname); -} - -qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, i= nt n) -{ - g_autofree char *propname =3D g_strdup_printf("%s[%d]", - name ? name : "unnamed-gpio-out", n); - - qemu_irq ret =3D (qemu_irq)object_property_get_link(OBJECT(dev), propn= ame, - NULL); - - return ret; -} - -/* disconnect a GPIO output, returning the disconnected input (if any) */ - -static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, - const char *name, int n) -{ - char *propname =3D g_strdup_printf("%s[%d]", - name ? name : "unnamed-gpio-out", n); - - qemu_irq ret =3D (qemu_irq)object_property_get_link(OBJECT(dev), propn= ame, - NULL); - if (ret) { - object_property_set_link(OBJECT(dev), propname, NULL, NULL); - } - g_free(propname); - return ret; -} - -qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, - const char *name, int n) -{ - qemu_irq disconnected =3D qdev_disconnect_gpio_out_named(dev, name, n); - qdev_connect_gpio_out_named(dev, name, n, icpt); - return disconnected; -} - -void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) -{ - qdev_connect_gpio_out_named(dev, NULL, n, pin); -} - -void qdev_pass_gpios(DeviceState *dev, DeviceState *container, - const char *name) -{ - int i; - NamedGPIOList *ngl =3D qdev_get_named_gpio_list(dev, name); - - for (i =3D 0; i < ngl->num_in; i++) { - const char *nm =3D ngl->name ? ngl->name : "unnamed-gpio-in"; - char *propname =3D g_strdup_printf("%s[%d]", nm, i); - - object_property_add_alias(OBJECT(container), propname, - OBJECT(dev), propname); - g_free(propname); - } - for (i =3D 0; i < ngl->num_out; i++) { - const char *nm =3D ngl->name ? ngl->name : "unnamed-gpio-out"; - char *propname =3D g_strdup_printf("%s[%d]", nm, i); - - object_property_add_alias(OBJECT(container), propname, - OBJECT(dev), propname); - g_free(propname); - } - QLIST_REMOVE(ngl, node); - QLIST_INSERT_HEAD(&container->gpios, ngl, node); -} - BusState *qdev_get_child_bus(DeviceState *dev, const char *name) { BusState *bus; diff --git a/hw/core/meson.build b/hw/core/meson.build index 18f44fb7c24..86f26f0a60f 100644 --- a/hw/core/meson.build +++ b/hw/core/meson.build @@ -27,6 +27,7 @@ softmmu_ss.add(files( 'cpu-sysemu.c', 'fw-path-provider.c', + 'gpio.c', 'loader.c', 'machine-hmp-cmds.c', 'machine.c', --=20 2.31.1