From patchwork Wed Oct 20 08:18:56 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 68401 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id F4177B70D2 for ; Wed, 20 Oct 2010 19:43:01 +1100 (EST) Received: from localhost ([127.0.0.1]:39990 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P8U9F-0002U7-U0 for incoming@patchwork.ozlabs.org; Wed, 20 Oct 2010 04:35:50 -0400 Received: from [140.186.70.92] (port=43766 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P8Tyi-0004Ao-4R for qemu-devel@nongnu.org; Wed, 20 Oct 2010 04:25:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P8Tt4-0000WR-F1 for qemu-devel@nongnu.org; Wed, 20 Oct 2010 04:19:08 -0400 Received: from mail.valinux.co.jp ([210.128.90.3]:46427) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P8Tt3-0000Vz-Uq for qemu-devel@nongnu.org; Wed, 20 Oct 2010 04:19:06 -0400 Received: from ps.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by mail.valinux.co.jp (Postfix) with SMTP id 2F1B88740D; Wed, 20 Oct 2010 17:19:04 +0900 (JST) Received: (nullmailer pid 20056 invoked by uid 1000); Wed, 20 Oct 2010 08:19:01 -0000 From: Isaku Yamahata To: qemu-devel@nongnu.org Date: Wed, 20 Oct 2010 17:18:56 +0900 Message-Id: <2f5cb93039ab90a7b267334dd5e2e94b7a550b9f.1287562197.git.yamahata@valinux.co.jp> X-Mailer: git-send-email 1.7.1.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: skandasa@cisco.com, adnan@khaleel.us, wexu2@cisco.com, mst@redhat.com, yamahata@valinux.co.jp, etmartin@cisco.com Subject: [Qemu-devel] [PATCH v6 07/12] pcie/hotplug: introduce pushing attention button command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org glue pcie_push_attention_button command. Signed-off-by: Isaku Yamahata --- hw/pcie_port.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ qemu-monitor.hx | 14 +++++++++ sysemu.h | 4 +++ 3 files changed, 100 insertions(+), 0 deletions(-) diff --git a/hw/pcie_port.c b/hw/pcie_port.c index 117de61..f43a1c7 100644 --- a/hw/pcie_port.c +++ b/hw/pcie_port.c @@ -18,6 +18,10 @@ * with this program; if not, see . */ +#include "qemu-objects.h" +#include "sysemu.h" +#include "monitor.h" +#include "pcie.h" #include "pcie_port.h" void pcie_port_init_reg(PCIDevice *d) @@ -114,3 +118,81 @@ void pcie_chassis_del_slot(PCIESlot *s) { QLIST_REMOVE(s, next); } + +/************************************************************************** + * glue for qemu monitor + */ + +/* Parse [.], return -1 on error */ +static int pcie_parse_slot_addr(const char* slot_addr, + uint8_t *chassisp, uint16_t *slotp) +{ + const char *p; + char *e; + unsigned long val; + unsigned long chassis = 0; + unsigned long slot; + + p = slot_addr; + val = strtoul(p, &e, 0); + if (e == p) { + return -1; + } + if (*e == '.') { + chassis = val; + p = e + 1; + val = strtoul(p, &e, 0); + if (e == p) { + return -1; + } + } + slot = val; + + if (*e) { + return -1; + } + + if (chassis > 0xff || slot > 0xffff) { + return -1; + } + + *chassisp = chassis; + *slotp = slot; + return 0; +} + +void pcie_attention_button_push_print(Monitor *mon, const QObject *data) +{ + QDict *qdict; + + assert(qobject_type(data) == QTYPE_QDICT); + qdict = qobject_to_qdict(data); + + monitor_printf(mon, "OK chassis %d, slot %d\n", + (int) qdict_get_int(qdict, "chassis"), + (int) qdict_get_int(qdict, "slot")); +} + +int pcie_attention_button_push(Monitor *mon, const QDict *qdict, + QObject **ret_data) +{ + const char* pcie_slot = qdict_get_str(qdict, "pcie_slot"); + uint8_t chassis; + uint16_t slot; + PCIESlot *s; + + if (pcie_parse_slot_addr(pcie_slot, &chassis, &slot) < 0) { + monitor_printf(mon, "invalid pcie slot address %s\n", pcie_slot); + return -1; + } + s = pcie_chassis_find_slot(chassis, slot); + if (!s) { + monitor_printf(mon, "slot is not found. %s\n", pcie_slot); + return -1; + } + pcie_cap_slot_push_attention_button(&s->port.br.dev); + *ret_data = qobject_from_jsonf("{ 'chassis': %d, 'slot': %d}", + chassis, slot); + assert(*ret_data); + return 0; +} diff --git a/qemu-monitor.hx b/qemu-monitor.hx index 2af3de6..965c754 100644 --- a/qemu-monitor.hx +++ b/qemu-monitor.hx @@ -1154,6 +1154,20 @@ Hot remove PCI device. ETEXI { + .name = "pcie_push_attention_button", + .args_type = "pcie_slot:s", + .params = "[.]", + .help = "push pci express attention button", + .user_print = pcie_attention_button_push_print, + .mhandler.cmd_new = pcie_attention_button_push, + }, + +STEXI +@item pcie_abp +Push PCI express attention button +ETEXI + + { .name = "host_net_add", .args_type = "device:s,opts:s?", .params = "tap|user|socket|vde|dump [options]", diff --git a/sysemu.h b/sysemu.h index 9c988bb..cca411d 100644 --- a/sysemu.h +++ b/sysemu.h @@ -150,6 +150,10 @@ extern unsigned int nb_prom_envs; void pci_device_hot_add(Monitor *mon, const QDict *qdict); void drive_hot_add(Monitor *mon, const QDict *qdict); void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict); +/* pcie hotplug */ +void pcie_attention_button_push_print(Monitor *mon, const QObject *data); +int pcie_attention_button_push(Monitor *mon, const QDict *qdict, + QObject **ret_data); /* serial ports */