From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390142; cv=none; d=zoho.com; s=zohoarc; b=T7e6a6+F8YCko1uAI2786Lcl6Yj6QrRVl7KtfyD1MPsuuEEXiEBzVytl13LrCJIwv4x+doxgeranaNe4h2hp/3H8c7Z4Y4OssD69uVS19hF0RJPrgp617GbZ0jOXHv5R0s0AmruxPDANKgYGPMm9+jxInfMdniMGPfxQpDCRXoU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390142; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=rT1mFjoAmZGXBaRSfUe9dmNILZo2BXxKtG61ZznOO94=; b=Fj37HMTBfPZD2HeecW/3bFdBD/HixUVAcSk+2kLpXp6LiLeS0d3sfkAxnykyddBwcNn0ekViQxPE9ETj6XwVCtNrGFMylWXeZHIwgcKA98W9ICWifQkk0rng5jfMNfoJthkO1u8R9Zvg7pGAb0ZRLdvyLFvvdFpfe9p4KdRiHKQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390142898293.7041331401217; Fri, 13 Sep 2019 08:55:42 -0700 (PDT) Received: from localhost ([::1]:45626 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nvA-0004hn-QM for importer@patchew.org; Fri, 13 Sep 2019 11:55:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57074) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npi-0007VU-7X for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npe-0000oE-Iu for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:02 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]:38735) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npe-0000o4-7T for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:49:58 -0400 Received: by mail-wm1-x330.google.com with SMTP id o184so3296778wme.3 for ; Fri, 13 Sep 2019 08:49:58 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.49.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:49:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=rT1mFjoAmZGXBaRSfUe9dmNILZo2BXxKtG61ZznOO94=; b=N8Pum4dGubKCv7GIoyHNpV0o0ubdNah90v0HJgR6xLzs/5BGG1nlRJJpCVrY9Vkvbf AGmHmTEVHK7PYrhgO+qlSxE9wecs11zqv8wM1elAd9VS+/bN0z3yl98GAmhx2/nhXyk1 ZNCSqBEP1pfhESmtE9isqjQ1F9s77CdAARlrYElDIZ6k8bYqeKtCONouoGx6uCTesV0U oVlYijHBfhw7XUfbFs3aTyazfuOFYEcXgUJmpLALwrYlzsr+N6EbOrGfn2uz+I3e71GM xSUbMk/iLLtLr/YEbiikkxqMOdy/1eOkUnhIsjarYBM5vpyCFV12glaFK/MWCXnozds9 a36A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rT1mFjoAmZGXBaRSfUe9dmNILZo2BXxKtG61ZznOO94=; b=Qxdi3ugtdq3IvQGq5nrjjAZTzLL/uTPBkFeB2gxbvaxLbP/dzjb+76Vld66K9pux0q c/jkZ3onVFynz/tTsmOw34pL5uCp9jJ+HFVUfG4JiBtvdAWyoNoSPlEQ1DzVj++3DVkp 5ZmkoAuzZ1A+6g9zTJ5JQZ0c3/2bQK7ZCNKp/whT95I3uR6Rrxnjv9cdjEaSESZD5h5Y TtRVdWg9uxdZkMBy5kRZqRtBGyKzuuVbW1oTBbqtVXbPPhC3/gLSO8tQTEPJTJhznFPh enyuw+Cxcg2rG9vOoDKqYudxWWfppW8dlNzBUy0UAKhn8yzmfFKlVOd9p4adESPmovT4 sYHg== X-Gm-Message-State: APjAAAU1EXiNqHlmlNmyrwPoQi9mdMzPph7crGIOoAS9a5e1nKr0Iba9 XHRmR2/gqwm+RX3DjyjzyEbir3btUVUlEg== X-Google-Smtp-Source: APXvYqw0GHn80a1XDSFxaaRsmL3Gm3JfSn57BP1J+uFpG/Hbs2BP3aD+k9uZlRYjuSLto+88taey+A== X-Received: by 2002:a1c:3c43:: with SMTP id j64mr3934905wma.65.1568389796432; Fri, 13 Sep 2019 08:49:56 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:41 +0100 Message-Id: <20190913154952.27724-2-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::330 Subject: [Qemu-devel] [PULL 01/12] hw/gpio: Add basic Aspeed GPIO model for AST2400 and AST2500 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: Rashmica Gupta GPIO pins are arranged in groups of 8 pins labeled A,B,..,Y,Z,AA,AB,AC. (Note that the ast2400 controller only goes up to group AB). A set has four groups (except set AC which only has one) and is referred to by the groups it is composed of (eg ABCD,EFGH,...,YZAAAB). Each set is accessed and controlled by a bank of 14 registers. These registers operate on a per pin level where each bit in the register corresponds to a pin, except for the command source registers. The command source registers operate on a per group level where bits 24, 16, 8 and 0 correspond to each group in the set. eg. registers for set ABCD: |D7...D0|C7...C0|B7...B0|A7...A0| <- GPIOs |31...24|23...16|15....8|7.....0| <- bit position Note that there are a couple of groups that only have 4 pins. There are two ways that this model deviates from the behaviour of the actual controller: (1) The only control source driving the GPIO pins in the model is the ARM model (as there currently aren't models for the LPC or Coprocessor). (2) None of the registers in the model are reset tolerant (needs integration with the watchdog). Signed-off-by: Rashmica Gupta Tested-by: Andrew Jeffery Reviewed-by: C=C3=A9dric Le Goater Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-2-clg@kaod.org [clg: fixed missing header files made use of HWADDR_PRIx to fix compilation on windows ] Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: Peter Maydell --- hw/gpio/Makefile.objs | 1 + include/hw/gpio/aspeed_gpio.h | 100 ++++ hw/gpio/aspeed_gpio.c | 884 ++++++++++++++++++++++++++++++++++ 3 files changed, 985 insertions(+) create mode 100644 include/hw/gpio/aspeed_gpio.h create mode 100644 hw/gpio/aspeed_gpio.c diff --git a/hw/gpio/Makefile.objs b/hw/gpio/Makefile.objs index e5da0cb54fe..d305b3b24b1 100644 --- a/hw/gpio/Makefile.objs +++ b/hw/gpio/Makefile.objs @@ -9,3 +9,4 @@ obj-$(CONFIG_OMAP) +=3D omap_gpio.o obj-$(CONFIG_IMX) +=3D imx_gpio.o obj-$(CONFIG_RASPI) +=3D bcm2835_gpio.o obj-$(CONFIG_NRF51_SOC) +=3D nrf51_gpio.o +obj-$(CONFIG_ASPEED_SOC) +=3D aspeed_gpio.o diff --git a/include/hw/gpio/aspeed_gpio.h b/include/hw/gpio/aspeed_gpio.h new file mode 100644 index 00000000000..a2deac046af --- /dev/null +++ b/include/hw/gpio/aspeed_gpio.h @@ -0,0 +1,100 @@ +/* + * ASPEED GPIO Controller + * + * Copyright (C) 2017-2018 IBM Corp. + * + * This code is licensed under the GPL version 2 or later. See + * the COPYING file in the top-level directory. + */ + +#ifndef ASPEED_GPIO_H +#define ASPEED_GPIO_H + +#include "hw/sysbus.h" + +#define TYPE_ASPEED_GPIO "aspeed.gpio" +#define ASPEED_GPIO(obj) OBJECT_CHECK(AspeedGPIOState, (obj), TYPE_ASPEED_= GPIO) +#define ASPEED_GPIO_CLASS(klass) \ + OBJECT_CLASS_CHECK(AspeedGPIOClass, (klass), TYPE_ASPEED_GPIO) +#define ASPEED_GPIO_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AspeedGPIOClass, (obj), TYPE_ASPEED_GPIO) + +#define ASPEED_GPIO_MAX_NR_SETS 8 +#define ASPEED_REGS_PER_BANK 14 +#define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR= _SETS) +#define ASPEED_GPIO_NR_PINS 228 +#define ASPEED_GROUPS_PER_SET 4 +#define ASPEED_GPIO_NR_DEBOUNCE_REGS 3 +#define ASPEED_CHARS_PER_GROUP_LABEL 4 + +typedef struct GPIOSets GPIOSets; + +typedef struct GPIOSetProperties { + uint32_t input; + uint32_t output; + char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL]; +} GPIOSetProperties; + +enum GPIORegType { + gpio_not_a_reg, + gpio_reg_data_value, + gpio_reg_direction, + gpio_reg_int_enable, + gpio_reg_int_sens_0, + gpio_reg_int_sens_1, + gpio_reg_int_sens_2, + gpio_reg_int_status, + gpio_reg_reset_tolerant, + gpio_reg_debounce_1, + gpio_reg_debounce_2, + gpio_reg_cmd_source_0, + gpio_reg_cmd_source_1, + gpio_reg_data_read, + gpio_reg_input_mask, +}; + +typedef struct AspeedGPIOReg { + uint16_t set_idx; + enum GPIORegType type; + } AspeedGPIOReg; + +typedef struct AspeedGPIOClass { + SysBusDevice parent_obj; + const GPIOSetProperties *props; + uint32_t nr_gpio_pins; + uint32_t nr_gpio_sets; + uint32_t gap; + const AspeedGPIOReg *reg_table; +} AspeedGPIOClass; + +typedef struct AspeedGPIOState { + /* */ + SysBusDevice parent; + + /*< public >*/ + MemoryRegion iomem; + int pending; + qemu_irq irq; + qemu_irq gpios[ASPEED_GPIO_NR_PINS]; + +/* Parallel GPIO Registers */ + uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS]; + struct GPIOSets { + uint32_t data_value; /* Reflects pin values */ + uint32_t data_read; /* Contains last value written to data value */ + uint32_t direction; + uint32_t int_enable; + uint32_t int_sens_0; + uint32_t int_sens_1; + uint32_t int_sens_2; + uint32_t int_status; + uint32_t reset_tol; + uint32_t cmd_source_0; + uint32_t cmd_source_1; + uint32_t debounce_1; + uint32_t debounce_2; + uint32_t input_mask; + } sets[ASPEED_GPIO_MAX_NR_SETS]; +} AspeedGPIOState; + +#endif /* _ASPEED_GPIO_H_ */ diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c new file mode 100644 index 00000000000..25fbfec3b84 --- /dev/null +++ b/hw/gpio/aspeed_gpio.c @@ -0,0 +1,884 @@ +/* + * ASPEED GPIO Controller + * + * Copyright (C) 2017-2019 IBM Corp. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include + +#include "qemu/osdep.h" +#include "qemu/host-utils.h" +#include "qemu/log.h" +#include "hw/gpio/aspeed_gpio.h" +#include "include/hw/misc/aspeed_scu.h" +#include "qapi/error.h" +#include "qapi/visitor.h" +#include "hw/irq.h" +#include "migration/vmstate.h" + +#define GPIOS_PER_REG 32 +#define GPIOS_PER_SET GPIOS_PER_REG +#define GPIO_PIN_GAP_SIZE 4 +#define GPIOS_PER_GROUP 8 +#define GPIO_GROUP_SHIFT 3 + +/* GPIO Source Types */ +#define ASPEED_CMD_SRC_MASK 0x01010101 +#define ASPEED_SOURCE_ARM 0 +#define ASPEED_SOURCE_LPC 1 +#define ASPEED_SOURCE_COPROCESSOR 2 +#define ASPEED_SOURCE_RESERVED 3 + +/* GPIO Interrupt Triggers */ +/* + * For each set of gpios there are three sensitivity registers that contr= ol + * the interrupt trigger mode. + * + * | 2 | 1 | 0 | trigger mode + * ----------------------------- + * | 0 | 0 | 0 | falling-edge + * | 0 | 0 | 1 | rising-edge + * | 0 | 1 | 0 | level-low + * | 0 | 1 | 1 | level-high + * | 1 | X | X | dual-edge + */ +#define ASPEED_FALLING_EDGE 0 +#define ASPEED_RISING_EDGE 1 +#define ASPEED_LEVEL_LOW 2 +#define ASPEED_LEVEL_HIGH 3 +#define ASPEED_DUAL_EDGE 4 + +/* GPIO Register Address Offsets */ +#define GPIO_ABCD_DATA_VALUE (0x000 >> 2) +#define GPIO_ABCD_DIRECTION (0x004 >> 2) +#define GPIO_ABCD_INT_ENABLE (0x008 >> 2) +#define GPIO_ABCD_INT_SENS_0 (0x00C >> 2) +#define GPIO_ABCD_INT_SENS_1 (0x010 >> 2) +#define GPIO_ABCD_INT_SENS_2 (0x014 >> 2) +#define GPIO_ABCD_INT_STATUS (0x018 >> 2) +#define GPIO_ABCD_RESET_TOLERANT (0x01C >> 2) +#define GPIO_EFGH_DATA_VALUE (0x020 >> 2) +#define GPIO_EFGH_DIRECTION (0x024 >> 2) +#define GPIO_EFGH_INT_ENABLE (0x028 >> 2) +#define GPIO_EFGH_INT_SENS_0 (0x02C >> 2) +#define GPIO_EFGH_INT_SENS_1 (0x030 >> 2) +#define GPIO_EFGH_INT_SENS_2 (0x034 >> 2) +#define GPIO_EFGH_INT_STATUS (0x038 >> 2) +#define GPIO_EFGH_RESET_TOLERANT (0x03C >> 2) +#define GPIO_ABCD_DEBOUNCE_1 (0x040 >> 2) +#define GPIO_ABCD_DEBOUNCE_2 (0x044 >> 2) +#define GPIO_EFGH_DEBOUNCE_1 (0x048 >> 2) +#define GPIO_EFGH_DEBOUNCE_2 (0x04C >> 2) +#define GPIO_DEBOUNCE_TIME_1 (0x050 >> 2) +#define GPIO_DEBOUNCE_TIME_2 (0x054 >> 2) +#define GPIO_DEBOUNCE_TIME_3 (0x058 >> 2) +#define GPIO_ABCD_COMMAND_SRC_0 (0x060 >> 2) +#define GPIO_ABCD_COMMAND_SRC_1 (0x064 >> 2) +#define GPIO_EFGH_COMMAND_SRC_0 (0x068 >> 2) +#define GPIO_EFGH_COMMAND_SRC_1 (0x06C >> 2) +#define GPIO_IJKL_DATA_VALUE (0x070 >> 2) +#define GPIO_IJKL_DIRECTION (0x074 >> 2) +#define GPIO_MNOP_DATA_VALUE (0x078 >> 2) +#define GPIO_MNOP_DIRECTION (0x07C >> 2) +#define GPIO_QRST_DATA_VALUE (0x080 >> 2) +#define GPIO_QRST_DIRECTION (0x084 >> 2) +#define GPIO_UVWX_DATA_VALUE (0x088 >> 2) +#define GPIO_UVWX_DIRECTION (0x08C >> 2) +#define GPIO_IJKL_COMMAND_SRC_0 (0x090 >> 2) +#define GPIO_IJKL_COMMAND_SRC_1 (0x094 >> 2) +#define GPIO_IJKL_INT_ENABLE (0x098 >> 2) +#define GPIO_IJKL_INT_SENS_0 (0x09C >> 2) +#define GPIO_IJKL_INT_SENS_1 (0x0A0 >> 2) +#define GPIO_IJKL_INT_SENS_2 (0x0A4 >> 2) +#define GPIO_IJKL_INT_STATUS (0x0A8 >> 2) +#define GPIO_IJKL_RESET_TOLERANT (0x0AC >> 2) +#define GPIO_IJKL_DEBOUNCE_1 (0x0B0 >> 2) +#define GPIO_IJKL_DEBOUNCE_2 (0x0B4 >> 2) +#define GPIO_IJKL_INPUT_MASK (0x0B8 >> 2) +#define GPIO_ABCD_DATA_READ (0x0C0 >> 2) +#define GPIO_EFGH_DATA_READ (0x0C4 >> 2) +#define GPIO_IJKL_DATA_READ (0x0C8 >> 2) +#define GPIO_MNOP_DATA_READ (0x0CC >> 2) +#define GPIO_QRST_DATA_READ (0x0D0 >> 2) +#define GPIO_UVWX_DATA_READ (0x0D4 >> 2) +#define GPIO_YZAAAB_DATA_READ (0x0D8 >> 2) +#define GPIO_AC_DATA_READ (0x0DC >> 2) +#define GPIO_MNOP_COMMAND_SRC_0 (0x0E0 >> 2) +#define GPIO_MNOP_COMMAND_SRC_1 (0x0E4 >> 2) +#define GPIO_MNOP_INT_ENABLE (0x0E8 >> 2) +#define GPIO_MNOP_INT_SENS_0 (0x0EC >> 2) +#define GPIO_MNOP_INT_SENS_1 (0x0F0 >> 2) +#define GPIO_MNOP_INT_SENS_2 (0x0F4 >> 2) +#define GPIO_MNOP_INT_STATUS (0x0F8 >> 2) +#define GPIO_MNOP_RESET_TOLERANT (0x0FC >> 2) +#define GPIO_MNOP_DEBOUNCE_1 (0x100 >> 2) +#define GPIO_MNOP_DEBOUNCE_2 (0x104 >> 2) +#define GPIO_MNOP_INPUT_MASK (0x108 >> 2) +#define GPIO_QRST_COMMAND_SRC_0 (0x110 >> 2) +#define GPIO_QRST_COMMAND_SRC_1 (0x114 >> 2) +#define GPIO_QRST_INT_ENABLE (0x118 >> 2) +#define GPIO_QRST_INT_SENS_0 (0x11C >> 2) +#define GPIO_QRST_INT_SENS_1 (0x120 >> 2) +#define GPIO_QRST_INT_SENS_2 (0x124 >> 2) +#define GPIO_QRST_INT_STATUS (0x128 >> 2) +#define GPIO_QRST_RESET_TOLERANT (0x12C >> 2) +#define GPIO_QRST_DEBOUNCE_1 (0x130 >> 2) +#define GPIO_QRST_DEBOUNCE_2 (0x134 >> 2) +#define GPIO_QRST_INPUT_MASK (0x138 >> 2) +#define GPIO_UVWX_COMMAND_SRC_0 (0x140 >> 2) +#define GPIO_UVWX_COMMAND_SRC_1 (0x144 >> 2) +#define GPIO_UVWX_INT_ENABLE (0x148 >> 2) +#define GPIO_UVWX_INT_SENS_0 (0x14C >> 2) +#define GPIO_UVWX_INT_SENS_1 (0x150 >> 2) +#define GPIO_UVWX_INT_SENS_2 (0x154 >> 2) +#define GPIO_UVWX_INT_STATUS (0x158 >> 2) +#define GPIO_UVWX_RESET_TOLERANT (0x15C >> 2) +#define GPIO_UVWX_DEBOUNCE_1 (0x160 >> 2) +#define GPIO_UVWX_DEBOUNCE_2 (0x164 >> 2) +#define GPIO_UVWX_INPUT_MASK (0x168 >> 2) +#define GPIO_YZAAAB_COMMAND_SRC_0 (0x170 >> 2) +#define GPIO_YZAAAB_COMMAND_SRC_1 (0x174 >> 2) +#define GPIO_YZAAAB_INT_ENABLE (0x178 >> 2) +#define GPIO_YZAAAB_INT_SENS_0 (0x17C >> 2) +#define GPIO_YZAAAB_INT_SENS_1 (0x180 >> 2) +#define GPIO_YZAAAB_INT_SENS_2 (0x184 >> 2) +#define GPIO_YZAAAB_INT_STATUS (0x188 >> 2) +#define GPIO_YZAAAB_RESET_TOLERANT (0x18C >> 2) +#define GPIO_YZAAAB_DEBOUNCE_1 (0x190 >> 2) +#define GPIO_YZAAAB_DEBOUNCE_2 (0x194 >> 2) +#define GPIO_YZAAAB_INPUT_MASK (0x198 >> 2) +#define GPIO_AC_COMMAND_SRC_0 (0x1A0 >> 2) +#define GPIO_AC_COMMAND_SRC_1 (0x1A4 >> 2) +#define GPIO_AC_INT_ENABLE (0x1A8 >> 2) +#define GPIO_AC_INT_SENS_0 (0x1AC >> 2) +#define GPIO_AC_INT_SENS_1 (0x1B0 >> 2) +#define GPIO_AC_INT_SENS_2 (0x1B4 >> 2) +#define GPIO_AC_INT_STATUS (0x1B8 >> 2) +#define GPIO_AC_RESET_TOLERANT (0x1BC >> 2) +#define GPIO_AC_DEBOUNCE_1 (0x1C0 >> 2) +#define GPIO_AC_DEBOUNCE_2 (0x1C4 >> 2) +#define GPIO_AC_INPUT_MASK (0x1C8 >> 2) +#define GPIO_ABCD_INPUT_MASK (0x1D0 >> 2) +#define GPIO_EFGH_INPUT_MASK (0x1D4 >> 2) +#define GPIO_YZAAAB_DATA_VALUE (0x1E0 >> 2) +#define GPIO_YZAAAB_DIRECTION (0x1E4 >> 2) +#define GPIO_AC_DATA_VALUE (0x1E8 >> 2) +#define GPIO_AC_DIRECTION (0x1EC >> 2) +#define GPIO_3_6V_MEM_SIZE 0x1F0 +#define GPIO_3_6V_REG_ARRAY_SIZE (GPIO_3_6V_MEM_SIZE >> 2) + +static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpi= o) +{ + uint32_t falling_edge =3D 0, rising_edge =3D 0; + uint32_t int_trigger =3D extract32(regs->int_sens_0, gpio, 1) + | extract32(regs->int_sens_1, gpio, 1) << 1 + | extract32(regs->int_sens_2, gpio, 1) << 2; + uint32_t gpio_curr_high =3D extract32(regs->data_value, gpio, 1); + uint32_t gpio_int_enabled =3D extract32(regs->int_enable, gpio, 1); + + if (!gpio_int_enabled) { + return 0; + } + + /* Detect edges */ + if (gpio_curr_high && !gpio_prev_high) { + rising_edge =3D 1; + } else if (!gpio_curr_high && gpio_prev_high) { + falling_edge =3D 1; + } + + if (((int_trigger =3D=3D ASPEED_FALLING_EDGE) && falling_edge) || + ((int_trigger =3D=3D ASPEED_RISING_EDGE) && rising_edge) || + ((int_trigger =3D=3D ASPEED_LEVEL_LOW) && !gpio_curr_high) || + ((int_trigger =3D=3D ASPEED_LEVEL_HIGH) && gpio_curr_high) || + ((int_trigger >=3D ASPEED_DUAL_EDGE) && (rising_edge || falling_e= dge))) + { + regs->int_status =3D deposit32(regs->int_status, gpio, 1, 1); + return 1; + } + return 0; +} + +#define nested_struct_index(ta, pa, m, tb, pb) \ + (pb - ((tb *)(((char *)pa) + offsetof(ta, m)))) + +static ptrdiff_t aspeed_gpio_set_idx(AspeedGPIOState *s, GPIOSets *regs) +{ + return nested_struct_index(AspeedGPIOState, s, sets, GPIOSets, regs); +} + +static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs, + uint32_t value) +{ + uint32_t input_mask =3D regs->input_mask; + uint32_t direction =3D regs->direction; + uint32_t old =3D regs->data_value; + uint32_t new =3D value; + uint32_t diff; + int gpio; + + diff =3D old ^ new; + if (diff) { + for (gpio =3D 0; gpio < GPIOS_PER_REG; gpio++) { + uint32_t mask =3D 1 << gpio; + + /* If the gpio needs to be updated... */ + if (!(diff & mask)) { + continue; + } + + /* ...and we're output or not input-masked... */ + if (!(direction & mask) && (input_mask & mask)) { + continue; + } + + /* ...then update the state. */ + if (mask & new) { + regs->data_value |=3D mask; + } else { + regs->data_value &=3D ~mask; + } + + /* If the gpio is set to output... */ + if (direction & mask) { + /* ...trigger the line-state IRQ */ + ptrdiff_t set =3D aspeed_gpio_set_idx(s, regs); + size_t offset =3D set * GPIOS_PER_SET + gpio; + qemu_set_irq(s->gpios[offset], !!(new & mask)); + } else { + /* ...otherwise if we meet the line's current IRQ policy..= . */ + if (aspeed_evaluate_irq(regs, old & mask, gpio)) { + /* ...trigger the VIC IRQ */ + s->pending++; + } + } + } + } + qemu_set_irq(s->irq, !!(s->pending)); +} + +static uint32_t aspeed_adjust_pin(AspeedGPIOState *s, uint32_t pin) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + /* + * The 2500 has a 4 pin gap in group AB and the 2400 has a 4 pin + * gap in group Y (and only four pins in AB but this is the last group= so + * it doesn't matter). + */ + if (agc->gap && pin >=3D agc->gap) { + pin +=3D GPIO_PIN_GAP_SIZE; + } + + return pin; +} + +static bool aspeed_gpio_get_pin_level(AspeedGPIOState *s, uint32_t set_idx, + uint32_t pin) +{ + uint32_t reg_val; + uint32_t pin_mask =3D 1 << pin; + + reg_val =3D s->sets[set_idx].data_value; + + return !!(reg_val & pin_mask); +} + +static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx, + uint32_t pin, bool level) +{ + uint32_t value =3D s->sets[set_idx].data_value; + uint32_t pin_mask =3D 1 << pin; + + if (level) { + value |=3D pin_mask; + } else { + value &=3D !pin_mask; + } + + aspeed_gpio_update(s, &s->sets[set_idx], value); +} + +/* + * | src_1 | src_2 | source | + * |-----------------------------| + * | 0 | 0 | ARM | + * | 0 | 1 | LPC | + * | 1 | 0 | Coprocessor| + * | 1 | 1 | Reserved | + * + * Once the source of a set is programmed, corresponding bits in the + * data_value, direction, interrupt [enable, sens[0-2]], reset_tol and + * debounce registers can only be written by the source. + * + * Source is ARM by default + * only bits 24, 16, 8, and 0 can be set + * + * we don't currently have a model for the LPC or Coprocessor + */ +static uint32_t update_value_control_source(GPIOSets *regs, uint32_t old_v= alue, + uint32_t value) +{ + int i; + int cmd_source; + + /* assume the source is always ARM for now */ + int source =3D ASPEED_SOURCE_ARM; + + uint32_t new_value =3D 0; + + /* for each group in set */ + for (i =3D 0; i < GPIOS_PER_REG; i +=3D GPIOS_PER_GROUP) { + cmd_source =3D extract32(regs->cmd_source_0, i, 1) + | (extract32(regs->cmd_source_1, i, 1) << 1); + + if (source =3D=3D cmd_source) { + new_value |=3D (0xff << i) & value; + } else { + new_value |=3D (0xff << i) & old_value; + } + } + return new_value; +} + +static const AspeedGPIOReg aspeed_3_6v_gpios[GPIO_3_6V_REG_ARRAY_SIZE] =3D= { + /* Set ABCD */ + [GPIO_ABCD_DATA_VALUE] =3D { 0, gpio_reg_data_value }, + [GPIO_ABCD_DIRECTION] =3D { 0, gpio_reg_direction }, + [GPIO_ABCD_INT_ENABLE] =3D { 0, gpio_reg_int_enable }, + [GPIO_ABCD_INT_SENS_0] =3D { 0, gpio_reg_int_sens_0 }, + [GPIO_ABCD_INT_SENS_1] =3D { 0, gpio_reg_int_sens_1 }, + [GPIO_ABCD_INT_SENS_2] =3D { 0, gpio_reg_int_sens_2 }, + [GPIO_ABCD_INT_STATUS] =3D { 0, gpio_reg_int_status }, + [GPIO_ABCD_RESET_TOLERANT] =3D { 0, gpio_reg_reset_tolerant }, + [GPIO_ABCD_DEBOUNCE_1] =3D { 0, gpio_reg_debounce_1 }, + [GPIO_ABCD_DEBOUNCE_2] =3D { 0, gpio_reg_debounce_2 }, + [GPIO_ABCD_COMMAND_SRC_0] =3D { 0, gpio_reg_cmd_source_0 }, + [GPIO_ABCD_COMMAND_SRC_1] =3D { 0, gpio_reg_cmd_source_1 }, + [GPIO_ABCD_DATA_READ] =3D { 0, gpio_reg_data_read }, + [GPIO_ABCD_INPUT_MASK] =3D { 0, gpio_reg_input_mask }, + /* Set EFGH */ + [GPIO_EFGH_DATA_VALUE] =3D { 1, gpio_reg_data_value }, + [GPIO_EFGH_DIRECTION] =3D { 1, gpio_reg_direction }, + [GPIO_EFGH_INT_ENABLE] =3D { 1, gpio_reg_int_enable }, + [GPIO_EFGH_INT_SENS_0] =3D { 1, gpio_reg_int_sens_0 }, + [GPIO_EFGH_INT_SENS_1] =3D { 1, gpio_reg_int_sens_1 }, + [GPIO_EFGH_INT_SENS_2] =3D { 1, gpio_reg_int_sens_2 }, + [GPIO_EFGH_INT_STATUS] =3D { 1, gpio_reg_int_status }, + [GPIO_EFGH_RESET_TOLERANT] =3D { 1, gpio_reg_reset_tolerant }, + [GPIO_EFGH_DEBOUNCE_1] =3D { 1, gpio_reg_debounce_1 }, + [GPIO_EFGH_DEBOUNCE_2] =3D { 1, gpio_reg_debounce_2 }, + [GPIO_EFGH_COMMAND_SRC_0] =3D { 1, gpio_reg_cmd_source_0 }, + [GPIO_EFGH_COMMAND_SRC_1] =3D { 1, gpio_reg_cmd_source_1 }, + [GPIO_EFGH_DATA_READ] =3D { 1, gpio_reg_data_read }, + [GPIO_EFGH_INPUT_MASK] =3D { 1, gpio_reg_input_mask }, + /* Set IJKL */ + [GPIO_IJKL_DATA_VALUE] =3D { 2, gpio_reg_data_value }, + [GPIO_IJKL_DIRECTION] =3D { 2, gpio_reg_direction }, + [GPIO_IJKL_INT_ENABLE] =3D { 2, gpio_reg_int_enable }, + [GPIO_IJKL_INT_SENS_0] =3D { 2, gpio_reg_int_sens_0 }, + [GPIO_IJKL_INT_SENS_1] =3D { 2, gpio_reg_int_sens_1 }, + [GPIO_IJKL_INT_SENS_2] =3D { 2, gpio_reg_int_sens_2 }, + [GPIO_IJKL_INT_STATUS] =3D { 2, gpio_reg_int_status }, + [GPIO_IJKL_RESET_TOLERANT] =3D { 2, gpio_reg_reset_tolerant }, + [GPIO_IJKL_DEBOUNCE_1] =3D { 2, gpio_reg_debounce_1 }, + [GPIO_IJKL_DEBOUNCE_2] =3D { 2, gpio_reg_debounce_2 }, + [GPIO_IJKL_COMMAND_SRC_0] =3D { 2, gpio_reg_cmd_source_0 }, + [GPIO_IJKL_COMMAND_SRC_1] =3D { 2, gpio_reg_cmd_source_1 }, + [GPIO_IJKL_DATA_READ] =3D { 2, gpio_reg_data_read }, + [GPIO_IJKL_INPUT_MASK] =3D { 2, gpio_reg_input_mask }, + /* Set MNOP */ + [GPIO_MNOP_DATA_VALUE] =3D { 3, gpio_reg_data_value }, + [GPIO_MNOP_DIRECTION] =3D { 3, gpio_reg_direction }, + [GPIO_MNOP_INT_ENABLE] =3D { 3, gpio_reg_int_enable }, + [GPIO_MNOP_INT_SENS_0] =3D { 3, gpio_reg_int_sens_0 }, + [GPIO_MNOP_INT_SENS_1] =3D { 3, gpio_reg_int_sens_1 }, + [GPIO_MNOP_INT_SENS_2] =3D { 3, gpio_reg_int_sens_2 }, + [GPIO_MNOP_INT_STATUS] =3D { 3, gpio_reg_int_status }, + [GPIO_MNOP_RESET_TOLERANT] =3D { 3, gpio_reg_reset_tolerant }, + [GPIO_MNOP_DEBOUNCE_1] =3D { 3, gpio_reg_debounce_1 }, + [GPIO_MNOP_DEBOUNCE_2] =3D { 3, gpio_reg_debounce_2 }, + [GPIO_MNOP_COMMAND_SRC_0] =3D { 3, gpio_reg_cmd_source_0 }, + [GPIO_MNOP_COMMAND_SRC_1] =3D { 3, gpio_reg_cmd_source_1 }, + [GPIO_MNOP_DATA_READ] =3D { 3, gpio_reg_data_read }, + [GPIO_MNOP_INPUT_MASK] =3D { 3, gpio_reg_input_mask }, + /* Set QRST */ + [GPIO_QRST_DATA_VALUE] =3D { 4, gpio_reg_data_value }, + [GPIO_QRST_DIRECTION] =3D { 4, gpio_reg_direction }, + [GPIO_QRST_INT_ENABLE] =3D { 4, gpio_reg_int_enable }, + [GPIO_QRST_INT_SENS_0] =3D { 4, gpio_reg_int_sens_0 }, + [GPIO_QRST_INT_SENS_1] =3D { 4, gpio_reg_int_sens_1 }, + [GPIO_QRST_INT_SENS_2] =3D { 4, gpio_reg_int_sens_2 }, + [GPIO_QRST_INT_STATUS] =3D { 4, gpio_reg_int_status }, + [GPIO_QRST_RESET_TOLERANT] =3D { 4, gpio_reg_reset_tolerant }, + [GPIO_QRST_DEBOUNCE_1] =3D { 4, gpio_reg_debounce_1 }, + [GPIO_QRST_DEBOUNCE_2] =3D { 4, gpio_reg_debounce_2 }, + [GPIO_QRST_COMMAND_SRC_0] =3D { 4, gpio_reg_cmd_source_0 }, + [GPIO_QRST_COMMAND_SRC_1] =3D { 4, gpio_reg_cmd_source_1 }, + [GPIO_QRST_DATA_READ] =3D { 4, gpio_reg_data_read }, + [GPIO_QRST_INPUT_MASK] =3D { 4, gpio_reg_input_mask }, + /* Set UVWX */ + [GPIO_UVWX_DATA_VALUE] =3D { 5, gpio_reg_data_value }, + [GPIO_UVWX_DIRECTION] =3D { 5, gpio_reg_direction }, + [GPIO_UVWX_INT_ENABLE] =3D { 5, gpio_reg_int_enable }, + [GPIO_UVWX_INT_SENS_0] =3D { 5, gpio_reg_int_sens_0 }, + [GPIO_UVWX_INT_SENS_1] =3D { 5, gpio_reg_int_sens_1 }, + [GPIO_UVWX_INT_SENS_2] =3D { 5, gpio_reg_int_sens_2 }, + [GPIO_UVWX_INT_STATUS] =3D { 5, gpio_reg_int_status }, + [GPIO_UVWX_RESET_TOLERANT] =3D { 5, gpio_reg_reset_tolerant }, + [GPIO_UVWX_DEBOUNCE_1] =3D { 5, gpio_reg_debounce_1 }, + [GPIO_UVWX_DEBOUNCE_2] =3D { 5, gpio_reg_debounce_2 }, + [GPIO_UVWX_COMMAND_SRC_0] =3D { 5, gpio_reg_cmd_source_0 }, + [GPIO_UVWX_COMMAND_SRC_1] =3D { 5, gpio_reg_cmd_source_1 }, + [GPIO_UVWX_DATA_READ] =3D { 5, gpio_reg_data_read }, + [GPIO_UVWX_INPUT_MASK] =3D { 5, gpio_reg_input_mask }, + /* Set YZAAAB */ + [GPIO_YZAAAB_DATA_VALUE] =3D { 6, gpio_reg_data_value }, + [GPIO_YZAAAB_DIRECTION] =3D { 6, gpio_reg_direction }, + [GPIO_YZAAAB_INT_ENABLE] =3D { 6, gpio_reg_int_enable }, + [GPIO_YZAAAB_INT_SENS_0] =3D { 6, gpio_reg_int_sens_0 }, + [GPIO_YZAAAB_INT_SENS_1] =3D { 6, gpio_reg_int_sens_1 }, + [GPIO_YZAAAB_INT_SENS_2] =3D { 6, gpio_reg_int_sens_2 }, + [GPIO_YZAAAB_INT_STATUS] =3D { 6, gpio_reg_int_status }, + [GPIO_YZAAAB_RESET_TOLERANT] =3D { 6, gpio_reg_reset_tolerant }, + [GPIO_YZAAAB_DEBOUNCE_1] =3D { 6, gpio_reg_debounce_1 }, + [GPIO_YZAAAB_DEBOUNCE_2] =3D { 6, gpio_reg_debounce_2 }, + [GPIO_YZAAAB_COMMAND_SRC_0] =3D { 6, gpio_reg_cmd_source_0 }, + [GPIO_YZAAAB_COMMAND_SRC_1] =3D { 6, gpio_reg_cmd_source_1 }, + [GPIO_YZAAAB_DATA_READ] =3D { 6, gpio_reg_data_read }, + [GPIO_YZAAAB_INPUT_MASK] =3D { 6, gpio_reg_input_mask }, + /* Set AC (ast2500 only) */ + [GPIO_AC_DATA_VALUE] =3D { 7, gpio_reg_data_value }, + [GPIO_AC_DIRECTION] =3D { 7, gpio_reg_direction }, + [GPIO_AC_INT_ENABLE] =3D { 7, gpio_reg_int_enable }, + [GPIO_AC_INT_SENS_0] =3D { 7, gpio_reg_int_sens_0 }, + [GPIO_AC_INT_SENS_1] =3D { 7, gpio_reg_int_sens_1 }, + [GPIO_AC_INT_SENS_2] =3D { 7, gpio_reg_int_sens_2 }, + [GPIO_AC_INT_STATUS] =3D { 7, gpio_reg_int_status }, + [GPIO_AC_RESET_TOLERANT] =3D { 7, gpio_reg_reset_tolerant }, + [GPIO_AC_DEBOUNCE_1] =3D { 7, gpio_reg_debounce_1 }, + [GPIO_AC_DEBOUNCE_2] =3D { 7, gpio_reg_debounce_2 }, + [GPIO_AC_COMMAND_SRC_0] =3D { 7, gpio_reg_cmd_source_0 }, + [GPIO_AC_COMMAND_SRC_1] =3D { 7, gpio_reg_cmd_source_1 }, + [GPIO_AC_DATA_READ] =3D { 7, gpio_reg_data_read }, + [GPIO_AC_INPUT_MASK] =3D { 7, gpio_reg_input_mask }, +}; + +static uint64_t aspeed_gpio_read(void *opaque, hwaddr offset, uint32_t siz= e) +{ + AspeedGPIOState *s =3D ASPEED_GPIO(opaque); + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + uint64_t idx =3D -1; + const AspeedGPIOReg *reg; + GPIOSets *set; + + idx =3D offset >> 2; + if (idx >=3D GPIO_DEBOUNCE_TIME_1 && idx <=3D GPIO_DEBOUNCE_TIME_3) { + idx -=3D GPIO_DEBOUNCE_TIME_1; + return (uint64_t) s->debounce_regs[idx]; + } + + reg =3D &agc->reg_table[idx]; + if (reg->set_idx >=3D agc->nr_gpio_sets) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: no getter for offset 0x%" + HWADDR_PRIx"\n", __func__, offset); + return 0; + } + + set =3D &s->sets[reg->set_idx]; + switch (reg->type) { + case gpio_reg_data_value: + return set->data_value; + case gpio_reg_direction: + return set->direction; + case gpio_reg_int_enable: + return set->int_enable; + case gpio_reg_int_sens_0: + return set->int_sens_0; + case gpio_reg_int_sens_1: + return set->int_sens_1; + case gpio_reg_int_sens_2: + return set->int_sens_2; + case gpio_reg_int_status: + return set->int_status; + case gpio_reg_reset_tolerant: + return set->reset_tol; + case gpio_reg_debounce_1: + return set->debounce_1; + case gpio_reg_debounce_2: + return set->debounce_2; + case gpio_reg_cmd_source_0: + return set->cmd_source_0; + case gpio_reg_cmd_source_1: + return set->cmd_source_1; + case gpio_reg_data_read: + return set->data_read; + case gpio_reg_input_mask: + return set->input_mask; + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: no getter for offset 0x%" + HWADDR_PRIx"\n", __func__, offset); + return 0; + }; +} + +static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data, + uint32_t size) +{ + AspeedGPIOState *s =3D ASPEED_GPIO(opaque); + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + const GPIOSetProperties *props; + uint64_t idx =3D -1; + const AspeedGPIOReg *reg; + GPIOSets *set; + uint32_t cleared; + + idx =3D offset >> 2; + if (idx >=3D GPIO_DEBOUNCE_TIME_1 && idx <=3D GPIO_DEBOUNCE_TIME_3) { + idx -=3D GPIO_DEBOUNCE_TIME_1; + s->debounce_regs[idx] =3D (uint32_t) data; + return; + } + + reg =3D &agc->reg_table[idx]; + if (reg->set_idx >=3D agc->nr_gpio_sets) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: no setter for offset 0x%" + HWADDR_PRIx"\n", __func__, offset); + return; + } + + set =3D &s->sets[reg->set_idx]; + props =3D &agc->props[reg->set_idx]; + + switch (reg->type) { + case gpio_reg_data_value: + data &=3D props->output; + data =3D update_value_control_source(set, set->data_value, data); + set->data_read =3D data; + aspeed_gpio_update(s, set, data); + return; + case gpio_reg_direction: + /* + * where data is the value attempted to be written to the pin: + * pin type | input mask | output mask | expected value + * ------------------------------------------------------------ + * bidirectional | 1 | 1 | data + * input only | 1 | 0 | 0 + * output only | 0 | 1 | 1 + * no pin / gap | 0 | 0 | 0 + * + * which is captured by: + * data =3D ( data | ~input) & output; + */ + data =3D (data | ~props->input) & props->output; + set->direction =3D update_value_control_source(set, set->direction= , data); + break; + case gpio_reg_int_enable: + set->int_enable =3D update_value_control_source(set, set->int_enab= le, + data); + break; + case gpio_reg_int_sens_0: + set->int_sens_0 =3D update_value_control_source(set, set->int_sens= _0, + data); + break; + case gpio_reg_int_sens_1: + set->int_sens_1 =3D update_value_control_source(set, set->int_sens= _1, + data); + break; + case gpio_reg_int_sens_2: + set->int_sens_2 =3D update_value_control_source(set, set->int_sens= _2, + data); + break; + case gpio_reg_int_status: + cleared =3D ctpop32(data & set->int_status); + if (s->pending && cleared) { + assert(s->pending >=3D cleared); + s->pending -=3D cleared; + } + set->int_status &=3D ~data; + break; + case gpio_reg_reset_tolerant: + set->reset_tol =3D update_value_control_source(set, set->reset_tol, + data); + return; + case gpio_reg_debounce_1: + set->debounce_1 =3D update_value_control_source(set, set->debounce= _1, + data); + return; + case gpio_reg_debounce_2: + set->debounce_2 =3D update_value_control_source(set, set->debounce= _2, + data); + return; + case gpio_reg_cmd_source_0: + set->cmd_source_0 =3D data & ASPEED_CMD_SRC_MASK; + return; + case gpio_reg_cmd_source_1: + set->cmd_source_1 =3D data & ASPEED_CMD_SRC_MASK; + return; + case gpio_reg_data_read: + /* Read only register */ + return; + case gpio_reg_input_mask: + /* + * feeds into interrupt generation + * 0: read from data value reg will be updated + * 1: read from data value reg will not be updated + */ + set->input_mask =3D data & props->input; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: no setter for offset 0x%" + HWADDR_PRIx"\n", __func__, offset); + return; + } + aspeed_gpio_update(s, set, set->data_value); + return; +} + +static int get_set_idx(AspeedGPIOState *s, const char *group, int *group_i= dx) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + int set_idx, g_idx =3D *group_idx; + + for (set_idx =3D 0; set_idx < agc->nr_gpio_sets; set_idx++) { + const GPIOSetProperties *set_props =3D &agc->props[set_idx]; + for (g_idx =3D 0; g_idx < ASPEED_GROUPS_PER_SET; g_idx++) { + if (!strncmp(group, set_props->group_label[g_idx], strlen(grou= p))) { + *group_idx =3D g_idx; + return set_idx; + } + } + } + return -1; +} + +static void aspeed_gpio_get_pin(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + int pin =3D 0xfff; + bool level =3D true; + char group[3]; + AspeedGPIOState *s =3D ASPEED_GPIO(obj); + int set_idx, group_idx =3D 0; + + if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) !=3D 2) { + error_setg(errp, "%s: error reading %s", __func__, name); + return; + } + set_idx =3D get_set_idx(s, group, &group_idx); + if (set_idx =3D=3D -1) { + error_setg(errp, "%s: invalid group %s", __func__, group); + return; + } + pin =3D pin + group_idx * GPIOS_PER_GROUP; + level =3D aspeed_gpio_get_pin_level(s, set_idx, pin); + visit_type_bool(v, name, &level, errp); +} + +static void aspeed_gpio_set_pin(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + Error *local_err =3D NULL; + bool level; + int pin =3D 0xfff; + char group[3]; + AspeedGPIOState *s =3D ASPEED_GPIO(obj); + int set_idx, group_idx =3D 0; + + visit_type_bool(v, name, &level, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) !=3D 2) { + error_setg(errp, "%s: error reading %s", __func__, name); + return; + } + set_idx =3D get_set_idx(s, group, &group_idx); + if (set_idx =3D=3D -1) { + error_setg(errp, "%s: invalid group %s", __func__, group); + return; + } + pin =3D pin + group_idx * GPIOS_PER_GROUP; + aspeed_gpio_set_pin_level(s, set_idx, pin, level); +} + +/****************** Setup functions ******************/ +static const GPIOSetProperties ast2400_set_props[] =3D { + [0] =3D {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} }, + [1] =3D {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} }, + [2] =3D {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} }, + [3] =3D {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} }, + [4] =3D {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} }, + [5] =3D {0xffffffff, 0x0000ffff, {"U", "V", "W", "X"} }, + [6] =3D {0x0000000f, 0x0fffff0f, {"Y", "Z", "AA", "AB"} }, +}; + +static const GPIOSetProperties ast2500_set_props[] =3D { + [0] =3D {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} }, + [1] =3D {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} }, + [2] =3D {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} }, + [3] =3D {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} }, + [4] =3D {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} }, + [5] =3D {0xffffffff, 0x0000ffff, {"U", "V", "W", "X"} }, + [6] =3D {0xffffff0f, 0x0fffff0f, {"Y", "Z", "AA", "AB"} }, + [7] =3D {0x000000ff, 0x000000ff, {"AC"} }, +}; + +static const MemoryRegionOps aspeed_gpio_ops =3D { + .read =3D aspeed_gpio_read, + .write =3D aspeed_gpio_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, +}; + +static void aspeed_gpio_reset(DeviceState *dev) +{ + AspeedGPIOState *s =3D ASPEED_GPIO(dev); + + /* TODO: respect the reset tolerance registers */ + memset(s->sets, 0, sizeof(s->sets)); +} + +static void aspeed_gpio_realize(DeviceState *dev, Error **errp) +{ + AspeedGPIOState *s =3D ASPEED_GPIO(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + int pin; + + /* Interrupt parent line */ + sysbus_init_irq(sbd, &s->irq); + + /* Individual GPIOs */ + for (pin =3D 0; pin < agc->nr_gpio_pins; pin++) { + sysbus_init_irq(sbd, &s->gpios[pin]); + } + + memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s, + TYPE_ASPEED_GPIO, GPIO_3_6V_MEM_SIZE); + + sysbus_init_mmio(sbd, &s->iomem); +} + +static void aspeed_gpio_init(Object *obj) +{ + AspeedGPIOState *s =3D ASPEED_GPIO(obj); + AspeedGPIOClass *agc =3D ASPEED_GPIO_GET_CLASS(s); + int pin; + + for (pin =3D 0; pin < agc->nr_gpio_pins; pin++) { + char *name; + int set_idx =3D pin / GPIOS_PER_SET; + int pin_idx =3D aspeed_adjust_pin(s, pin) - (set_idx * GPIOS_PER_S= ET); + int group_idx =3D pin_idx >> GPIO_GROUP_SHIFT; + const GPIOSetProperties *props =3D &agc->props[set_idx]; + + name =3D g_strdup_printf("gpio%s%d", props->group_label[group_idx], + pin_idx % GPIOS_PER_GROUP); + object_property_add(obj, name, "bool", aspeed_gpio_get_pin, + aspeed_gpio_set_pin, NULL, NULL, NULL); + } +} + +static const VMStateDescription vmstate_gpio_regs =3D { + .name =3D TYPE_ASPEED_GPIO"/regs", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(data_value, GPIOSets), + VMSTATE_UINT32(data_read, GPIOSets), + VMSTATE_UINT32(direction, GPIOSets), + VMSTATE_UINT32(int_enable, GPIOSets), + VMSTATE_UINT32(int_sens_0, GPIOSets), + VMSTATE_UINT32(int_sens_1, GPIOSets), + VMSTATE_UINT32(int_sens_2, GPIOSets), + VMSTATE_UINT32(int_status, GPIOSets), + VMSTATE_UINT32(reset_tol, GPIOSets), + VMSTATE_UINT32(cmd_source_0, GPIOSets), + VMSTATE_UINT32(cmd_source_1, GPIOSets), + VMSTATE_UINT32(debounce_1, GPIOSets), + VMSTATE_UINT32(debounce_2, GPIOSets), + VMSTATE_UINT32(input_mask, GPIOSets), + VMSTATE_END_OF_LIST(), + } +}; + +static const VMStateDescription vmstate_aspeed_gpio =3D { + .name =3D TYPE_ASPEED_GPIO, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT_ARRAY(sets, AspeedGPIOState, ASPEED_GPIO_MAX_NR_SET= S, + 1, vmstate_gpio_regs, GPIOSets), + VMSTATE_UINT32_ARRAY(debounce_regs, AspeedGPIOState, + ASPEED_GPIO_NR_DEBOUNCE_REGS), + VMSTATE_END_OF_LIST(), + } +}; + +static void aspeed_gpio_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D aspeed_gpio_realize; + dc->reset =3D aspeed_gpio_reset; + dc->desc =3D "Aspeed GPIO Controller"; + dc->vmsd =3D &vmstate_aspeed_gpio; +} + +static void aspeed_gpio_ast2400_class_init(ObjectClass *klass, void *data) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_CLASS(klass); + + agc->props =3D ast2400_set_props; + agc->nr_gpio_pins =3D 216; + agc->nr_gpio_sets =3D 7; + agc->gap =3D 196; + agc->reg_table =3D aspeed_3_6v_gpios; +} + +static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_CLASS(klass); + + agc->props =3D ast2500_set_props; + agc->nr_gpio_pins =3D 228; + agc->nr_gpio_sets =3D 8; + agc->gap =3D 220; + agc->reg_table =3D aspeed_3_6v_gpios; +} + +static const TypeInfo aspeed_gpio_info =3D { + .name =3D TYPE_ASPEED_GPIO, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(AspeedGPIOState), + .class_size =3D sizeof(AspeedGPIOClass), + .class_init =3D aspeed_gpio_class_init, + .abstract =3D true, +}; + +static const TypeInfo aspeed_gpio_ast2400_info =3D { + .name =3D TYPE_ASPEED_GPIO "-ast2400", + .parent =3D TYPE_ASPEED_GPIO, + .class_init =3D aspeed_gpio_ast2400_class_init, + .instance_init =3D aspeed_gpio_init, +}; + +static const TypeInfo aspeed_gpio_ast2500_info =3D { + .name =3D TYPE_ASPEED_GPIO "-ast2500", + .parent =3D TYPE_ASPEED_GPIO, + .class_init =3D aspeed_gpio_2500_class_init, + .instance_init =3D aspeed_gpio_init, +}; + +static void aspeed_gpio_register_types(void) +{ + type_register_static(&aspeed_gpio_info); + type_register_static(&aspeed_gpio_ast2400_info); + type_register_static(&aspeed_gpio_ast2500_info); +} + +type_init(aspeed_gpio_register_types); --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390253; cv=none; d=zoho.com; s=zohoarc; b=C0eBSL/YjMiD0PdHP9FMvKVUFJSTbXKZHuWeNTQQtcnb4A7JA9Hf7598G3PPy63MBFd/s/uemYwhBHtfJ8q+L5dJGCvqfhgfQSqXVXV3qOAObvDL9snvPsdA85EUj/Tyi7IQiv/1qWd18Jcwguv3zFEaZBPfiWMfBzOlVo2LZkM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390253; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=uHZA8KFnqOxLTuKflwQzeztC2aQqMkyk+quC2gNviAE=; b=g8Xugg6xcKRr9iT3nyXgi+YN1bRWtSi+EzFVMr9HmipBCP7tJlDxx56cW1gvR0NdC5GVqCekDx30V3Sr+JRsJmjhNp4hzcXtbMEW+WpjeCzW/vSeYHg+AYBZMS+Dz67dIUCqE7kKub3vCSKdKqiNvzwiTVFX2LuzSnpvvSsJ2xw= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390253935794.5857300697446; Fri, 13 Sep 2019 08:57:33 -0700 (PDT) Received: from localhost ([::1]:45668 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nwy-0006sm-1M for importer@patchew.org; Fri, 13 Sep 2019 11:57:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57052) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npg-0007Tu-QF for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npf-0000oc-J3 for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:00 -0400 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:50224) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npf-0000oK-DC for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:49:59 -0400 Received: by mail-wm1-x343.google.com with SMTP id c10so3312201wmc.0 for ; Fri, 13 Sep 2019 08:49:59 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.49.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:49:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=uHZA8KFnqOxLTuKflwQzeztC2aQqMkyk+quC2gNviAE=; b=d1pbBjBsNrzLO/MoffckZZXeEMOG+IcEb0gzU+5AC57jAqc+Gjcizq94fRK94czNjy +NPqAuuj93wGEZe/cFxR49NyZGShV419OzqNg1ffiuS9dY6hmijRh9vkNryG84Jq+wL1 YBdBY3uaIF/Gke+GbrsZCG4ckSWnDIOS89RMEepqMFZz3DOBfQ1gXla8hx1AdtSArNHb yv+bWnhOb/sMk7a7Lh9cjCZMEMRrJ4OrR5Hp6OeoC6VzOCSEihfOsX18xt93LpQ6YpbF 8dxPp7EopisHZkCW6J0fFRufe4sNOEpzJXhon/3sRVSpDJqJqms9A12Z/8Qo9BpKWErj KUpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uHZA8KFnqOxLTuKflwQzeztC2aQqMkyk+quC2gNviAE=; b=rc+xt+jh3G8nkbh26kqWTwAVkpndvDeVNy+ywoZNLxuwWnY5Pn8NTxwq4zUVCDppN4 2mbLZ/qRnarUAzan1wqXPKTuhpaK6jFCY2thVH43YyCvBBAV2McJC6gVto/XENcskzKo FNZrSmiHGcjwjGlVjeLNB30i/vutE9ZnHTndPB+/S6NDZQP2qjxYTRwUiVB3Yt46fhhC /z+Wgjr9TaGYcmEQKBK3a8fngruvr2dkF+wj85nJAHDk5LV+KbhuzXp/QBX93YJTjIb9 GSJf0j9ftsaXpYExFbMz8DNkFFm6j1JPtjA+LyOcjbIVbJHuZfuZtXP+pxKaeEjqTGVR z94w== X-Gm-Message-State: APjAAAX7R5CXz1UDyvIyIXPnbbQauFrxWSPkD0gfWCxednZ7ptOxP4Wl MBex3KT7l5KCcPjyOeBK/kSN40YJyWXvlA== X-Google-Smtp-Source: APXvYqw1mfdYLYc+mDZfb4AS/CB4hVZwqWIwJ/0IcuKybz/bEADMFQGiRdET/aaTSWWap1c3WVXTsA== X-Received: by 2002:a1c:4108:: with SMTP id o8mr4170354wma.129.1568389797390; Fri, 13 Sep 2019 08:49:57 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:42 +0100 Message-Id: <20190913154952.27724-3-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::343 Subject: [Qemu-devel] [PULL 02/12] aspeed: add a GPIO controller to the SoC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: Rashmica Gupta Signed-off-by: Rashmica Gupta Reviewed-by: C=C3=A9dric Le Goater Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-3-clg@kaod.org Signed-off-by: Peter Maydell --- include/hw/arm/aspeed_soc.h | 3 +++ hw/arm/aspeed_soc.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 976fd6be93f..a56effebc16 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -23,6 +23,7 @@ #include "hw/watchdog/wdt_aspeed.h" #include "hw/net/ftgmac100.h" #include "target/arm/cpu.h" +#include "hw/gpio/aspeed_gpio.h" =20 #define ASPEED_SPIS_NUM 2 #define ASPEED_WDTS_NUM 3 @@ -48,6 +49,7 @@ typedef struct AspeedSoCState { AspeedSDMCState sdmc; AspeedWDTState wdt[ASPEED_WDTS_NUM]; FTGMAC100State ftgmac100[ASPEED_MACS_NUM]; + AspeedGPIOState gpio; } AspeedSoCState; =20 #define TYPE_ASPEED_SOC "aspeed-soc" @@ -61,6 +63,7 @@ typedef struct AspeedSoCInfo { int spis_num; const char *fmc_typename; const char **spi_typename; + const char *gpio_typename; int wdts_num; const int *irqmap; const hwaddr *memmap; diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 9ee81048326..04480875d0d 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -125,6 +125,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .spis_num =3D 1, .fmc_typename =3D "aspeed.smc.fmc", .spi_typename =3D aspeed_soc_ast2400_typenames, + .gpio_typename =3D "aspeed.gpio-ast2400", .wdts_num =3D 2, .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, @@ -137,6 +138,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .spis_num =3D 1, .fmc_typename =3D "aspeed.smc.fmc", .spi_typename =3D aspeed_soc_ast2400_typenames, + .gpio_typename =3D "aspeed.gpio-ast2400", .wdts_num =3D 2, .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, @@ -149,6 +151,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .spis_num =3D 1, .fmc_typename =3D "aspeed.smc.fmc", .spi_typename =3D aspeed_soc_ast2400_typenames, + .gpio_typename =3D "aspeed.gpio-ast2400", .wdts_num =3D 2, .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, @@ -161,6 +164,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .spis_num =3D 2, .fmc_typename =3D "aspeed.smc.ast2500-fmc", .spi_typename =3D aspeed_soc_ast2500_typenames, + .gpio_typename =3D "aspeed.gpio-ast2500", .wdts_num =3D 3, .irqmap =3D aspeed_soc_ast2500_irqmap, .memmap =3D aspeed_soc_ast2500_memmap, @@ -247,6 +251,9 @@ static void aspeed_soc_init(Object *obj) =20 sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma), TYPE_ASPEED_XDMA); + + sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio), + sc->info->gpio_typename); } =20 static void aspeed_soc_realize(DeviceState *dev, Error **errp) @@ -426,6 +433,16 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) sc->info->memmap[ASPEED_XDMA]); sysbus_connect_irq(SYS_BUS_DEVICE(&s->xdma), 0, aspeed_soc_get_irq(s, ASPEED_XDMA)); + + /* GPIO */ + object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->info->memmap[ASPEED_G= PIO]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0, + aspeed_soc_get_irq(s, ASPEED_GPIO)); } static Property aspeed_soc_properties[] =3D { DEFINE_PROP_UINT32("num-cpus", AspeedSoCState, num_cpus, 0), --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568389962; cv=none; d=zoho.com; s=zohoarc; b=RIRqTfwKVVt2Qu+6MA5Pm5yf1iAp8GERgtECkh7qngwEZE1xjLU4P/6kvecBMQYt9B8Qz7E8Chd82xW+ec+z9jJ/rmf9RsIUevevZO/zO539O1Q470fy6JkRdL20NV3WjIiWMgH6/sqw8Suovq4pYCF+adsbN+7wJg8zkCcCwLM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568389962; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=HwYqxy/bmpDz5O1ucFFc7CGqvNwTRTsg+04HLrtha5U=; b=awBlXX2Z40EcL0sqZ6KwLbHdJeDHLsOftE6ZHi7jsAH931Ns24RasW11t6LUCWNpVh1+r2DKOICKU3CPdDhRc6kkYPPB+/JStU4G7qsD6rQLPzvjuJ3TE1b20HLZfIAE03tzuq/zaQDzB5n95UCUoWZ5yTBPOmiiXEp3PP5iS6M= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568389962124730.37289268787; Fri, 13 Sep 2019 08:52:42 -0700 (PDT) Received: from localhost ([::1]:45586 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8ns8-0000vl-E3 for importer@patchew.org; Fri, 13 Sep 2019 11:52:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57051) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npg-0007Ts-QF for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npf-0000oj-OO for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:00 -0400 Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]:53150) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npf-0000oM-Ij for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:49:59 -0400 Received: by mail-wm1-x32c.google.com with SMTP id x2so3297607wmj.2 for ; Fri, 13 Sep 2019 08:49:59 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.49.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:49:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=HwYqxy/bmpDz5O1ucFFc7CGqvNwTRTsg+04HLrtha5U=; b=fScq1Bf1Nzy077kbEzY2l5n4O+oGu/ukLdXJFFof25g9IX+5pPWN3u40lYuvE6vyi2 UAYD041+EbrjU0UnPOqrhzCsljCpkqx6MgnMPpd/hbKeMM+CA/lAci0mEFyI01n5Hqtp 5RzXWff2DQbHh8L4NSvvJYZSCWb6wrD4gMwp4Drlhg1Vr0gK4Y3mq320ARfPKE4CUVIp 5qfVYN3EjvYKfubmFTASg7dUL8kJ0I2Mrs1L3bzIlhHfWvN8L8IVT/DS3Eh6g+VSLDGM xMoI/JauwWWijqNnWSGMhCvk2AjRFM9i7rlFrXH7vK4pewjmXGP7UDggJCdwXuKcTQms yvBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HwYqxy/bmpDz5O1ucFFc7CGqvNwTRTsg+04HLrtha5U=; b=N0ePXCbyKddh214BcqY0tsGAmyoW5B4n6jvKerJbqE4XjZ6hXbs6rLG3OZApGO9yd6 Vmw9Rua3rsTa68tB1e2mklG5zYI3c/qb9pxOUXrk6JORWwgSKiQJB9ouOukeh+oXvBG3 78rh+IQiitS7Lgn1XtVHTr+9ZUt7iKBDDnhpKWxsiJt9jz0RXEUZB2dtUmBWGdu1J1HU RGJajSV3/aMIAbiluB5Udd8Im65ul1WRSQA2CfDTbnF0w9ympm4GL4XpEHdtnISyBbrr lkAsWgfPBXb1iOVv/mWB4tgTO6XlO++LdBhINDVPNsz68l+r121wKPZAFndM6wPURZio fc9Q== X-Gm-Message-State: APjAAAVJus9blwx4EtRxti5IPVLhlxIxRRG+PLZx7/PtgFqhAzcVgJp5 DyV2LRhtgPYVKB6zQDSMko+cgbPdKllgYA== X-Google-Smtp-Source: APXvYqzwdeENPcz7n70WLRy0FzuYbRPzdvUjHATdKsvdvOj8jlQgJZfJZutes77ZXQVXcP0Rhq0qdg== X-Received: by 2002:a05:600c:290c:: with SMTP id i12mr3995936wmd.19.1568389798380; Fri, 13 Sep 2019 08:49:58 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:43 +0100 Message-Id: <20190913154952.27724-4-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::32c Subject: [Qemu-devel] [PULL 03/12] aspeed: Remove unused SoC definitions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater There are no QEMU Aspeed machines using the SoCs "ast2400-a0" or "ast2400". Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-4-clg@kaod.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- hw/arm/aspeed_soc.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 04480875d0d..3aa73d2438e 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -118,19 +118,6 @@ static const char *aspeed_soc_ast2500_typenames[] =3D { =20 static const AspeedSoCInfo aspeed_socs[] =3D { { - .name =3D "ast2400-a0", - .cpu_type =3D ARM_CPU_TYPE_NAME("arm926"), - .silicon_rev =3D AST2400_A0_SILICON_REV, - .sram_size =3D 0x8000, - .spis_num =3D 1, - .fmc_typename =3D "aspeed.smc.fmc", - .spi_typename =3D aspeed_soc_ast2400_typenames, - .gpio_typename =3D "aspeed.gpio-ast2400", - .wdts_num =3D 2, - .irqmap =3D aspeed_soc_ast2400_irqmap, - .memmap =3D aspeed_soc_ast2400_memmap, - .num_cpus =3D 1, - }, { .name =3D "ast2400-a1", .cpu_type =3D ARM_CPU_TYPE_NAME("arm926"), .silicon_rev =3D AST2400_A1_SILICON_REV, @@ -143,19 +130,6 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, .num_cpus =3D 1, - }, { - .name =3D "ast2400", - .cpu_type =3D ARM_CPU_TYPE_NAME("arm926"), - .silicon_rev =3D AST2400_A0_SILICON_REV, - .sram_size =3D 0x8000, - .spis_num =3D 1, - .fmc_typename =3D "aspeed.smc.fmc", - .spi_typename =3D aspeed_soc_ast2400_typenames, - .gpio_typename =3D "aspeed.gpio-ast2400", - .wdts_num =3D 2, - .irqmap =3D aspeed_soc_ast2400_irqmap, - .memmap =3D aspeed_soc_ast2400_memmap, - .num_cpus =3D 1, }, { .name =3D "ast2500-a1", .cpu_type =3D ARM_CPU_TYPE_NAME("arm1176"), --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568389955; cv=none; d=zoho.com; s=zohoarc; b=Tb5jfbLdjQySydjlq88V63U2bx5R8dQQn4k3LYcp6G9qQTKj1004fsQBU6BbyP+tdPeQWWpxmDeksbK1PmupuCMwP0vPrjFVFtr2vuPfvP/mA9/NxftIXxnH8jm556RvLszC6KJPrz6cZep+RUyA6yqLK0refTxcK7NDGYCZLps= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568389955; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=1Sl1J/OS8LWghz5QlTGlE0bH3B4/gCCk6zhNctlDdKI=; b=JnfGb/5QQiNzldVpQSSqyB4UJRYyhnf+J5CMDI+50NZ3oNyIFOv+mUmyYiZbz9Ajw/PRyLpkQQ0LAc3MA6alibZBJvU3+zYp4lIc82VvTuQgZgfBwWUM1Jl/kbS2BCVgifPbTSqwmvQkJ/yjcSk7SDZwy75n0FpLmLULbhGA9kg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568389955208413.99805666890825; Fri, 13 Sep 2019 08:52:35 -0700 (PDT) Received: from localhost ([::1]:45590 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8ns9-0000wt-7E for importer@patchew.org; Fri, 13 Sep 2019 11:52:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57072) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npi-0007VM-4K for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npg-0000pB-OM for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:01 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]:53154) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npg-0000or-HA for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:00 -0400 Received: by mail-wm1-x330.google.com with SMTP id x2so3297654wmj.2 for ; Fri, 13 Sep 2019 08:50:00 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.49.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:49:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=1Sl1J/OS8LWghz5QlTGlE0bH3B4/gCCk6zhNctlDdKI=; b=RZqwTmuygmTqha5mtmiUtypoF+2weJ8VVHIQVqOspstHunFDXx6JUpimxT/E0jkt26 /bxn/e278dk3vV76pqJ0cK/Cl4uSpX2tPS9mGS5daRTpAgxq+wJAWoSGRRfpUtmxFsIZ PDla4jDxpNeIiC5Q1cRB7CAe56Ekk367YslTGqnl8KbbGByo3dw0bZDGOFsv6nUYtHMm tic58LIOt2uJ/sCjXkZ2nEQEUnhyrhhE5AjpUwmYtwfHA5nUjp3YvCtxLcpN24EbDrSy Xgv7qsknKhoRYPix3nPp8jfNfCC9zJ8iSgoBEOuVzjFxcZ9CmipEKMXiYXPf0+zZzCql UH0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1Sl1J/OS8LWghz5QlTGlE0bH3B4/gCCk6zhNctlDdKI=; b=iBjVtxFXTIStTnjqyIIbOIORIyg+xv4W5J5q3Wr94gEWKUY/sgguUR64hW9BQYGC9h wC9MP+fEnFGpSHelSqO8bJ9t+ZpKmVMn6KCfNe/IFrJwwehK8g4zqk8uSQPDGny8SDfC co5Ga7f2djnXvII/q59/v4cDDKTduqL6lwyxq6LVhdyRvmASFK2qlMcT5uFJV8DZ3nyG DTWrwc8O6WnhCobsor6iQTKTPMj+noXfnVCuIclOcRzJAASvFiMTa7cdszhL1cTfM3gU kLUJ2/h20LHRTWvUb2bX6snZtP29R01GtlF8Eh98QhlhCSYe3ZNiY0bchPs3clMheyj6 3m8w== X-Gm-Message-State: APjAAAUAdI1WCd6SbUENzwOFSAj7a1Jk1gC57BimYf48GveLFcKEfecn dix+1/R2baUfqLIe2deenaikl2RQoKjKYA== X-Google-Smtp-Source: APXvYqykAz1sOPM1rQo4wiKKb+Ry8fQR6Q0+rf9KJ7seZn0tXFxbzPy9z5YzJwCR50i1LKC4nUlV5A== X-Received: by 2002:a1c:7319:: with SMTP id d25mr3901877wmb.56.1568389799314; Fri, 13 Sep 2019 08:49:59 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:44 +0100 Message-Id: <20190913154952.27724-5-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::330 Subject: [Qemu-devel] [PULL 04/12] aspeed: Use consistent typenames X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater Improve the naming of the different controller models to ease their generation when initializing the SoC. The rename of the SMC types is breaking migration compatibility. Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-5-clg@kaod.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- include/hw/arm/aspeed_soc.h | 3 --- hw/arm/aspeed_soc.c | 25 ++++++++++++------------- hw/ssi/aspeed_smc.c | 12 ++++++------ 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index a56effebc16..ab5052b12cb 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -61,9 +61,6 @@ typedef struct AspeedSoCInfo { uint32_t silicon_rev; uint64_t sram_size; int spis_num; - const char *fmc_typename; - const char **spi_typename; - const char *gpio_typename; int wdts_num; const int *irqmap; const hwaddr *memmap; diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 3aa73d2438e..25dbc409d35 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -112,10 +112,6 @@ static const int aspeed_soc_ast2400_irqmap[] =3D { =20 #define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap =20 -static const char *aspeed_soc_ast2400_typenames[] =3D { "aspeed.smc.spi" }; -static const char *aspeed_soc_ast2500_typenames[] =3D { - "aspeed.smc.ast2500-spi1", "aspeed.smc.ast2500-spi2" }; - static const AspeedSoCInfo aspeed_socs[] =3D { { .name =3D "ast2400-a1", @@ -123,9 +119,6 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .silicon_rev =3D AST2400_A1_SILICON_REV, .sram_size =3D 0x8000, .spis_num =3D 1, - .fmc_typename =3D "aspeed.smc.fmc", - .spi_typename =3D aspeed_soc_ast2400_typenames, - .gpio_typename =3D "aspeed.gpio-ast2400", .wdts_num =3D 2, .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, @@ -136,9 +129,6 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .silicon_rev =3D AST2500_A1_SILICON_REV, .sram_size =3D 0x9000, .spis_num =3D 2, - .fmc_typename =3D "aspeed.smc.ast2500-fmc", - .spi_typename =3D aspeed_soc_ast2500_typenames, - .gpio_typename =3D "aspeed.gpio-ast2500", .wdts_num =3D 3, .irqmap =3D aspeed_soc_ast2500_irqmap, .memmap =3D aspeed_soc_ast2500_memmap, @@ -158,6 +148,12 @@ static void aspeed_soc_init(Object *obj) AspeedSoCState *s =3D ASPEED_SOC(obj); AspeedSoCClass *sc =3D ASPEED_SOC_GET_CLASS(s); int i; + char socname[8]; + char typename[64]; + + if (sscanf(sc->info->name, "%7s", socname) !=3D 1) { + g_assert_not_reached(); + } =20 for (i =3D 0; i < sc->info->num_cpus; i++) { object_initialize_child(obj, "cpu[*]", OBJECT(&s->cpu[i]), @@ -190,14 +186,16 @@ static void aspeed_soc_init(Object *obj) sysbus_init_child_obj(obj, "i2c", OBJECT(&s->i2c), sizeof(s->i2c), TYPE_ASPEED_I2C); =20 + snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname); sysbus_init_child_obj(obj, "fmc", OBJECT(&s->fmc), sizeof(s->fmc), - sc->info->fmc_typename); + typename); object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs", &error_abort); =20 for (i =3D 0; i < sc->info->spis_num; i++) { + snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, soc= name); sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]), - sizeof(s->spi[i]), sc->info->spi_typename[i]= ); + sizeof(s->spi[i]), typename); } =20 sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc), @@ -226,8 +224,9 @@ static void aspeed_soc_init(Object *obj) sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma), TYPE_ASPEED_XDMA); =20 + snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname); sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio), - sc->info->gpio_typename); + typename); } =20 static void aspeed_soc_realize(DeviceState *dev, Error **errp) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 9f3cff5fb6f..f4f7c181830 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -190,7 +190,7 @@ static const AspeedSegments aspeed_segments_ast2500_spi= 2[] =3D { =20 static const AspeedSMCController controllers[] =3D { { - .name =3D "aspeed.smc.smc", + .name =3D "aspeed.smc-ast2400", .r_conf =3D R_CONF, .r_ce_ctrl =3D R_CE_CTRL, .r_ctrl0 =3D R_CTRL0, @@ -203,7 +203,7 @@ static const AspeedSMCController controllers[] =3D { .has_dma =3D false, .nregs =3D ASPEED_SMC_R_SMC_MAX, }, { - .name =3D "aspeed.smc.fmc", + .name =3D "aspeed.fmc-ast2400", .r_conf =3D R_CONF, .r_ce_ctrl =3D R_CE_CTRL, .r_ctrl0 =3D R_CTRL0, @@ -216,7 +216,7 @@ static const AspeedSMCController controllers[] =3D { .has_dma =3D true, .nregs =3D ASPEED_SMC_R_MAX, }, { - .name =3D "aspeed.smc.spi", + .name =3D "aspeed.spi1-ast2400", .r_conf =3D R_SPI_CONF, .r_ce_ctrl =3D 0xff, .r_ctrl0 =3D R_SPI_CTRL0, @@ -229,7 +229,7 @@ static const AspeedSMCController controllers[] =3D { .has_dma =3D false, .nregs =3D ASPEED_SMC_R_SPI_MAX, }, { - .name =3D "aspeed.smc.ast2500-fmc", + .name =3D "aspeed.fmc-ast2500", .r_conf =3D R_CONF, .r_ce_ctrl =3D R_CE_CTRL, .r_ctrl0 =3D R_CTRL0, @@ -242,7 +242,7 @@ static const AspeedSMCController controllers[] =3D { .has_dma =3D true, .nregs =3D ASPEED_SMC_R_MAX, }, { - .name =3D "aspeed.smc.ast2500-spi1", + .name =3D "aspeed.spi1-ast2500", .r_conf =3D R_CONF, .r_ce_ctrl =3D R_CE_CTRL, .r_ctrl0 =3D R_CTRL0, @@ -255,7 +255,7 @@ static const AspeedSMCController controllers[] =3D { .has_dma =3D false, .nregs =3D ASPEED_SMC_R_MAX, }, { - .name =3D "aspeed.smc.ast2500-spi2", + .name =3D "aspeed.spi2-ast2500", .r_conf =3D R_CONF, .r_ce_ctrl =3D R_CE_CTRL, .r_ctrl0 =3D R_CTRL0, --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390550; cv=none; d=zoho.com; s=zohoarc; b=S7xra4WZyjBRQ6lj0nt4ZtPVaYY/IYViX9XD30hfYQwa+5wTRpK1cJh5Z3wkfrGOgr6Tc//Xgfae4uh3HyoOXCCZy5nOUUBkjxUm4UaY8shJ28vsk3kbqB2dMn04n8YN/IuJw3CjwnigL3ZrlKZ0EDg1KMdFl0ih7lJHkNF96q4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390550; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=8mk0cHv84jDjRbcOm9wISaW6Wkm9Gb3IGBK+4Yevgv8=; b=K/8ya4JFM4DsaaaYDeBQd3mf0MkxzMxlK2ivIY1JEYhbnViqI8qP2LV5jLVtV0JPqRull3irbk187llMIfBPsW8YlX8vPvGZ6Rw2W+djqWULIM6CBeeaSrEyPqYwIsqd9kbqWxld9N0xLkJCNhbDkj1CQE2ORB2sTZwlvL847AY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390550914191.77203564323327; Fri, 13 Sep 2019 09:02:30 -0700 (PDT) Received: from localhost ([::1]:45714 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8o1h-0002lf-Lt for importer@patchew.org; Fri, 13 Sep 2019 12:02:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57088) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npk-0007Zh-90 for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npi-0000pj-4r for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:04 -0400 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:34700) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8nph-0000pN-SW for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:02 -0400 Received: by mail-wm1-x341.google.com with SMTP id y135so2173897wmc.1 for ; Fri, 13 Sep 2019 08:50:01 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.49.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:49:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8mk0cHv84jDjRbcOm9wISaW6Wkm9Gb3IGBK+4Yevgv8=; b=BuE+ZIIRktK5uV66GKo3WquAG4rKDoAzCoWWi5zeql/AWa/gS7uRaaDM2UJ3GeQ3lN ppvjpQKM/KuTe0oXDlB573bn+kgqDbJZ6FTNBm+TrE/ptb3SKHO2F25wVSYnze47wQez CyAQUcNLiyIFeMF2/WZe978h19dH5QwAEFNmJlrps3JmcXMap7A1UB+0q6z+kDeXxzAA 3icV8yhbKOJDau6dEipkzq6kD0JtQ9b2SfZIxHOsYNwV4b0fHkr5Y7Yv8XeHNUOgVCp8 295J4ytYRjL9mDSKsB/C0scPvD9ET2Q5BP4XO2PUR3j9aWCZb3VdwV/qtjTf9Y2jjGcw CaNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8mk0cHv84jDjRbcOm9wISaW6Wkm9Gb3IGBK+4Yevgv8=; b=piOOYtlnYt4wMIfRsQgMKlXcnYOOJm3r0PkC/tJfRLmUx+V//TovvP3BwL2Yzja7lk OWVBeZgzfOkz1m9NDLlq7/PNDn5SzBej1ihuLNDJ7pL6uGy9beLT8tK/SDyiRXZez6dJ i59Z2JKqgxzhtPF+8s8xYOcoyNlKqdzwXc7vm5zMBQjqwvjEODmSwaxXeSuFf1EbOMm5 mSL2wtPKs1c25RNglMoe+d/zq+5PgPtErA/K4DRJWHcPwpaQQxTTLpbo2lMo+VXSEhmI G2Jn+JQEBL9YM/vdk+kQc+3KkOoUSrlzw2VPVHqOV0TjAC7x7rvWcqcD8kkiKrYr4gfh /CsA== X-Gm-Message-State: APjAAAXLIP98vFjZN1rbggoCNOobKOeY3deqNyPN+yJj8Ypm7YqJqkuI a/co31ZUHR5WuC9SFg3eq8g6B3zpkHrk8Q== X-Google-Smtp-Source: APXvYqwXTAw9CTqQCBNuIMeBOn+GEKbug1CpWSCiuY/d+Id3JjFbvdR5cX428fNgYtLsQtwJ1La4iQ== X-Received: by 2002:a1c:2546:: with SMTP id l67mr4189025wml.10.1568389800388; Fri, 13 Sep 2019 08:50:00 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:45 +0100 Message-Id: <20190913154952.27724-6-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 Subject: [Qemu-devel] [PULL 05/12] aspeed/smc: Add support for DMAs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater The FMC controller on the Aspeed SoCs support DMA to access the flash modules. It can operate in a normal mode, to copy to or from the flash module mapping window, or in a checksum calculation mode, to evaluate the best clock settings for reads. The model introduces two custom address spaces for DMAs: one for the AHB window of the FMC flash devices and one for the DRAM. The latter is populated using a "dram" link set from the machine with the RAM container region. Signed-off-by: C=C3=A9dric Le Goater Acked-by: Joel Stanley Message-id: 20190904070506.1052-6-clg@kaod.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- include/hw/ssi/aspeed_smc.h | 6 + hw/arm/aspeed.c | 2 + hw/arm/aspeed_soc.c | 2 + hw/ssi/aspeed_smc.c | 222 +++++++++++++++++++++++++++++++++++- 4 files changed, 226 insertions(+), 6 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index aa07dac4fe3..32ce6916f6c 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -46,6 +46,8 @@ typedef struct AspeedSMCController { hwaddr flash_window_base; uint32_t flash_window_size; bool has_dma; + hwaddr dma_flash_mask; + hwaddr dma_dram_mask; uint32_t nregs; } AspeedSMCController; =20 @@ -101,6 +103,10 @@ typedef struct AspeedSMCState { /* for DMA support */ uint64_t sdram_base; =20 + AddressSpace flash_as; + MemoryRegion *dram_mr; + AddressSpace dram_as; + AspeedSMCFlash *flashes; =20 uint8_t snoop_index; diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index 13e208c78cc..aa72be309da 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -190,6 +190,8 @@ static void aspeed_board_init(MachineState *machine, &error_abort); object_property_set_int(OBJECT(&bmc->soc), machine->smp.cpus, "num-cpu= s", &error_abort); + object_property_set_link(OBJECT(&bmc->soc), OBJECT(&bmc->ram_container= ), + "dram", &error_abort); if (machine->kernel_filename) { /* * When booting with a -kernel command line there is no u-boot diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 25dbc409d35..da508c99c33 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -191,6 +191,8 @@ static void aspeed_soc_init(Object *obj) typename); object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs", &error_abort); + object_property_add_alias(obj, "dram", OBJECT(&s->fmc), "dram", + &error_abort); =20 for (i =3D 0; i < sc->info->spis_num; i++) { snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, soc= name); diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index f4f7c181830..c1a45c10dc1 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -28,6 +28,8 @@ #include "qemu/log.h" #include "qemu/module.h" #include "qemu/error-report.h" +#include "qapi/error.h" +#include "exec/address-spaces.h" =20 #include "hw/irq.h" #include "hw/qdev-properties.h" @@ -112,8 +114,8 @@ #define DMA_CTRL_FREQ_SHIFT 4 #define DMA_CTRL_MODE (1 << 3) #define DMA_CTRL_CKSUM (1 << 2) -#define DMA_CTRL_DIR (1 << 1) -#define DMA_CTRL_EN (1 << 0) +#define DMA_CTRL_WRITE (1 << 1) +#define DMA_CTRL_ENABLE (1 << 0) =20 /* DMA Flash Side Address */ #define R_DMA_FLASH_ADDR (0x84 / 4) @@ -145,6 +147,24 @@ #define ASPEED_SOC_SPI_FLASH_BASE 0x30000000 #define ASPEED_SOC_SPI2_FLASH_BASE 0x38000000 =20 +/* + * DMA DRAM addresses should be 4 bytes aligned and the valid address + * range is 0x40000000 - 0x5FFFFFFF (AST2400) + * 0x80000000 - 0xBFFFFFFF (AST2500) + * + * DMA flash addresses should be 4 bytes aligned and the valid address + * range is 0x20000000 - 0x2FFFFFFF. + * + * DMA length is from 4 bytes to 32MB + * 0: 4 bytes + * 0x7FFFFF: 32M bytes + */ +#define DMA_DRAM_ADDR(s, val) ((s)->sdram_base | \ + ((val) & (s)->ctrl->dma_dram_mask)) +#define DMA_FLASH_ADDR(s, val) ((s)->ctrl->flash_window_base | \ + ((val) & (s)->ctrl->dma_flash_mask)) +#define DMA_LENGTH(val) ((val) & 0x01FFFFFC) + /* Flash opcodes. */ #define SPI_OP_READ 0x03 /* Read data bytes (low frequency) */ =20 @@ -214,6 +234,8 @@ static const AspeedSMCController controllers[] =3D { .flash_window_base =3D ASPEED_SOC_FMC_FLASH_BASE, .flash_window_size =3D 0x10000000, .has_dma =3D true, + .dma_flash_mask =3D 0x0FFFFFFC, + .dma_dram_mask =3D 0x1FFFFFFC, .nregs =3D ASPEED_SMC_R_MAX, }, { .name =3D "aspeed.spi1-ast2400", @@ -240,6 +262,8 @@ static const AspeedSMCController controllers[] =3D { .flash_window_base =3D ASPEED_SOC_FMC_FLASH_BASE, .flash_window_size =3D 0x10000000, .has_dma =3D true, + .dma_flash_mask =3D 0x0FFFFFFC, + .dma_dram_mask =3D 0x3FFFFFFC, .nregs =3D ASPEED_SMC_R_MAX, }, { .name =3D "aspeed.spi1-ast2500", @@ -732,9 +756,6 @@ static void aspeed_smc_reset(DeviceState *d) =20 memset(s->regs, 0, sizeof s->regs); =20 - /* Pretend DMA is done (u-boot initialization) */ - s->regs[R_INTR_CTRL] =3D INTR_CTRL_DMA_STATUS; - /* Unselect all slaves */ for (i =3D 0; i < s->num_cs; ++i) { s->regs[s->r_ctrl0 + i] |=3D CTRL_CE_STOP_ACTIVE; @@ -775,6 +796,11 @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr a= ddr, unsigned int size) addr =3D=3D s->r_ce_ctrl || addr =3D=3D R_INTR_CTRL || addr =3D=3D R_DUMMY_DATA || + (s->ctrl->has_dma && addr =3D=3D R_DMA_CTRL) || + (s->ctrl->has_dma && addr =3D=3D R_DMA_FLASH_ADDR) || + (s->ctrl->has_dma && addr =3D=3D R_DMA_DRAM_ADDR) || + (s->ctrl->has_dma && addr =3D=3D R_DMA_LEN) || + (s->ctrl->has_dma && addr =3D=3D R_DMA_CHECKSUM) || (addr >=3D R_SEG_ADDR0 && addr < R_SEG_ADDR0 + s->ctrl->max_slaves= ) || (addr >=3D s->r_ctrl0 && addr < s->r_ctrl0 + s->ctrl->max_slaves))= { return s->regs[addr]; @@ -785,6 +811,149 @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr = addr, unsigned int size) } } =20 +/* + * Accumulate the result of the reads to provide a checksum that will + * be used to validate the read timing settings. + */ +static void aspeed_smc_dma_checksum(AspeedSMCState *s) +{ + MemTxResult result; + uint32_t data; + + if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid direction for DMA checksum\n", __func_= _); + return; + } + + while (s->regs[R_DMA_LEN]) { + data =3D address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_AD= DR], + MEMTXATTRS_UNSPECIFIED, &result); + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08x\n", + __func__, s->regs[R_DMA_FLASH_ADDR]); + return; + } + + /* + * When the DMA is on-going, the DMA registers are updated + * with the current working addresses and length. + */ + s->regs[R_DMA_CHECKSUM] +=3D data; + s->regs[R_DMA_FLASH_ADDR] +=3D 4; + s->regs[R_DMA_LEN] -=3D 4; + } +} + +static void aspeed_smc_dma_rw(AspeedSMCState *s) +{ + MemTxResult result; + uint32_t data; + + while (s->regs[R_DMA_LEN]) { + if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) { + data =3D address_space_ldl_le(&s->dram_as, s->regs[R_DMA_DRAM_= ADDR], + MEMTXATTRS_UNSPECIFIED, &result); + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM read failed @%08x= \n", + __func__, s->regs[R_DMA_DRAM_ADDR]); + return; + } + + address_space_stl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR], + data, MEMTXATTRS_UNSPECIFIED, &result); + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash write failed @%0= 8x\n", + __func__, s->regs[R_DMA_FLASH_ADDR]); + return; + } + } else { + data =3D address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLAS= H_ADDR], + MEMTXATTRS_UNSPECIFIED, &result); + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08= x\n", + __func__, s->regs[R_DMA_FLASH_ADDR]); + return; + } + + address_space_stl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR], + data, MEMTXATTRS_UNSPECIFIED, &result); + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM write failed @%08= x\n", + __func__, s->regs[R_DMA_DRAM_ADDR]); + return; + } + } + + /* + * When the DMA is on-going, the DMA registers are updated + * with the current working addresses and length. + */ + s->regs[R_DMA_FLASH_ADDR] +=3D 4; + s->regs[R_DMA_DRAM_ADDR] +=3D 4; + s->regs[R_DMA_LEN] -=3D 4; + } +} + +static void aspeed_smc_dma_stop(AspeedSMCState *s) +{ + /* + * When the DMA is disabled, INTR_CTRL_DMA_STATUS=3D0 means the + * engine is idle + */ + s->regs[R_INTR_CTRL] &=3D ~INTR_CTRL_DMA_STATUS; + s->regs[R_DMA_CHECKSUM] =3D 0; + + /* + * Lower the DMA irq in any case. The IRQ control register could + * have been cleared before disabling the DMA. + */ + qemu_irq_lower(s->irq); +} + +/* + * When INTR_CTRL_DMA_STATUS=3D1, the DMA has completed and a new DMA + * can start even if the result of the previous was not collected. + */ +static bool aspeed_smc_dma_in_progress(AspeedSMCState *s) +{ + return s->regs[R_DMA_CTRL] & DMA_CTRL_ENABLE && + !(s->regs[R_INTR_CTRL] & INTR_CTRL_DMA_STATUS); +} + +static void aspeed_smc_dma_done(AspeedSMCState *s) +{ + s->regs[R_INTR_CTRL] |=3D INTR_CTRL_DMA_STATUS; + if (s->regs[R_INTR_CTRL] & INTR_CTRL_DMA_EN) { + qemu_irq_raise(s->irq); + } +} + +static void aspeed_smc_dma_ctrl(AspeedSMCState *s, uint64_t dma_ctrl) +{ + if (!(dma_ctrl & DMA_CTRL_ENABLE)) { + s->regs[R_DMA_CTRL] =3D dma_ctrl; + + aspeed_smc_dma_stop(s); + return; + } + + if (aspeed_smc_dma_in_progress(s)) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA in progress\n", __func__); + return; + } + + s->regs[R_DMA_CTRL] =3D dma_ctrl; + + if (s->regs[R_DMA_CTRL] & DMA_CTRL_CKSUM) { + aspeed_smc_dma_checksum(s); + } else { + aspeed_smc_dma_rw(s); + } + + aspeed_smc_dma_done(s); +} + static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data, unsigned int size) { @@ -810,6 +979,16 @@ static void aspeed_smc_write(void *opaque, hwaddr addr= , uint64_t data, } } else if (addr =3D=3D R_DUMMY_DATA) { s->regs[addr] =3D value & 0xff; + } else if (addr =3D=3D R_INTR_CTRL) { + s->regs[addr] =3D value; + } else if (s->ctrl->has_dma && addr =3D=3D R_DMA_CTRL) { + aspeed_smc_dma_ctrl(s, value); + } else if (s->ctrl->has_dma && addr =3D=3D R_DMA_DRAM_ADDR) { + s->regs[addr] =3D DMA_DRAM_ADDR(s, value); + } else if (s->ctrl->has_dma && addr =3D=3D R_DMA_FLASH_ADDR) { + s->regs[addr] =3D DMA_FLASH_ADDR(s, value); + } else if (s->ctrl->has_dma && addr =3D=3D R_DMA_LEN) { + s->regs[addr] =3D DMA_LENGTH(value); } else { qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\= n", __func__, addr); @@ -824,6 +1003,28 @@ static const MemoryRegionOps aspeed_smc_ops =3D { .valid.unaligned =3D true, }; =20 + +/* + * Initialize the custom address spaces for DMAs + */ +static void aspeed_smc_dma_setup(AspeedSMCState *s, Error **errp) +{ + char *name; + + if (!s->dram_mr) { + error_setg(errp, TYPE_ASPEED_SMC ": 'dram' link not set"); + return; + } + + name =3D g_strdup_printf("%s-dma-flash", s->ctrl->name); + address_space_init(&s->flash_as, &s->mmio_flash, name); + g_free(name); + + name =3D g_strdup_printf("%s-dma-dram", s->ctrl->name); + address_space_init(&s->dram_as, s->dram_mr, name); + g_free(name); +} + static void aspeed_smc_realize(DeviceState *dev, Error **errp) { SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); @@ -849,10 +1050,12 @@ static void aspeed_smc_realize(DeviceState *dev, Err= or **errp) s->num_cs =3D s->ctrl->max_slaves; } =20 + /* DMA irq. Keep it first for the initialization in the SoC */ + sysbus_init_irq(sbd, &s->irq); + s->spi =3D ssi_create_bus(dev, "spi"); =20 /* Setup cs_lines for slaves */ - sysbus_init_irq(sbd, &s->irq); s->cs_lines =3D g_new0(qemu_irq, s->num_cs); ssi_auto_connect_slaves(dev, s->cs_lines, s->spi); =20 @@ -899,6 +1102,11 @@ static void aspeed_smc_realize(DeviceState *dev, Erro= r **errp) memory_region_add_subregion(&s->mmio_flash, offset, &fl->mmio); offset +=3D fl->size; } + + /* DMA support */ + if (s->ctrl->has_dma) { + aspeed_smc_dma_setup(s, errp); + } } =20 static const VMStateDescription vmstate_aspeed_smc =3D { @@ -916,6 +1124,8 @@ static const VMStateDescription vmstate_aspeed_smc =3D= { static Property aspeed_smc_properties[] =3D { DEFINE_PROP_UINT32("num-cs", AspeedSMCState, num_cs, 1), DEFINE_PROP_UINT64("sdram-base", AspeedSMCState, sdram_base, 0), + DEFINE_PROP_LINK("dram", AspeedSMCState, dram_mr, + TYPE_MEMORY_REGION, MemoryRegion *), DEFINE_PROP_END_OF_LIST(), }; =20 --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390357; cv=none; d=zoho.com; s=zohoarc; b=htcdqAm+0STE4vuFyn9l2XRD3CMNUYQTNCEPqptIjnNk0DGkYHY1PQS6rBMVcYGXU56OTR7vB4wurKzOHFAfo/IlgFVcs5bvCXVtANSvOzGC6H3Hba5zmI7dn+j+vpEx3HZr+es6U9LCdG3dh5H4PimiakiHahIrrpokyGc3SGA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390357; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=x9pAvs1vBwT98tToIZ3WwAg5y5izTGLjnHfR9GCnGxg=; b=Ypoy7wdT9RgSvermTHOAzXNtkI38wUapU5Ic2fui9CSQ2gdgWerMSawVMb4icqrndhyiCCv2VPF9JaZa/nXOU8xdKPHm/l38sKef2jAY1uNfuODd3qwpqWGuQGF8FSZuNLFmdrkRVK3r3cqilV/C2VZoPrDy7GkgiqTaNcJgdFg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390357237403.1604072486557; Fri, 13 Sep 2019 08:59:17 -0700 (PDT) Received: from localhost ([::1]:45680 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nyd-0000MS-F4 for importer@patchew.org; Fri, 13 Sep 2019 11:59:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57096) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npk-0007bM-Ud for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npj-0000rs-Ju for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:04 -0400 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]:40050) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npj-0000pz-Ds for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:03 -0400 Received: by mail-wr1-x444.google.com with SMTP id l3so9862157wru.7 for ; Fri, 13 Sep 2019 08:50:03 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=x9pAvs1vBwT98tToIZ3WwAg5y5izTGLjnHfR9GCnGxg=; b=xf96vk9dQKmtzzbaJ78VvErD+rfA6O8xgELgF9a5lKSDHg/Cf3IseMjOT1k3MQ4zjG 5U6J1ncnRzJwuZaHbjwqHadpw17Kzmt2tTEFdBzIc/WyG+YRuxeltCSDSUDjKztCUMyp l2TfnEIND0hGr95tK7yJJ2iBVjd4DkkZNG4ivcnnyOIaOGQJa87rk5+no9Q0iGmSdF8T +iiFcnzrSNJ28E0eMvJCAtbBLzGqgkHPLciMWIGP2Pdl7ofyS57ikcU1qThNQfrBi0+W 1mAaXo3wr4YLBicTNnQfrogTtVkdljjJQdEtdcdh4Jt9UrP70CjZkDjg7LYfalNQ1Yi2 QCBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=x9pAvs1vBwT98tToIZ3WwAg5y5izTGLjnHfR9GCnGxg=; b=YM1x1ildSF5gyAsaVdujND9PoBbjq4GsrgW1I196gKDd21DZw+5eqo6gVEZNbBpgm6 Pycq2TbEQ1/Wp0ZPe12lwkv97wfpH91IuIfNvAYxIhrrLGuRmEL5ZpmE6VvFuTLF8Ztn CalIrZm+g/KIEoK86EuPmMHsUMxG/xg1P5oIq+XM79nCn0UOadnGbd2Rzl+sfPh9Tizj MK+Hm0VO1/9CIpwaWb5QFO4W338n4Lpvddb+uWlJEYOTpfTbCfLSUI+meDVuKaf1SqJ/ zP4w5WGjqGA42N4spAEuD62kgAFkaf6NqzLGWIn3xFSvBVnb4+RrlOrLktOdMW7iqV70 5UvQ== X-Gm-Message-State: APjAAAU3FVSSP7P78oiHFsGluAvKA1WOa679TV/wbJpV8WfYrUcNT+Qy 3w/Apehe7UhsUkIFywJMNxv9Bgvmi0k/Mg== X-Google-Smtp-Source: APXvYqwOrbaH7yvjzxqBdp7SSDXeQL6SZVj1/3+RF4EvTKLu94Zexwm6RVvzT5M8vD6bZXdBBLi/bA== X-Received: by 2002:a5d:61ca:: with SMTP id q10mr20644606wrv.274.1568389802174; Fri, 13 Sep 2019 08:50:02 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:46 +0100 Message-Id: <20190913154952.27724-7-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::444 Subject: [Qemu-devel] [PULL 06/12] aspeed/smc: Add DMA calibration settings X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater When doing calibration, the SPI clock rate in the CE0 Control Register and the read delay cycles in the Read Timing Compensation Register are set using bit[11:4] of the DMA Control Register. Signed-off-by: C=C3=A9dric Le Goater Acked-by: Joel Stanley Reviewed-by: Peter Maydell Message-id: 20190904070506.1052-7-clg@kaod.org Signed-off-by: Peter Maydell --- hw/ssi/aspeed_smc.c | 64 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index c1a45c10dc1..7a0cd7607fd 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -77,6 +77,10 @@ #define CTRL_CMD_MASK 0xff #define CTRL_DUMMY_HIGH_SHIFT 14 #define CTRL_AST2400_SPI_4BYTE (1 << 13) +#define CE_CTRL_CLOCK_FREQ_SHIFT 8 +#define CE_CTRL_CLOCK_FREQ_MASK 0xf +#define CE_CTRL_CLOCK_FREQ(div) \ + (((div) & CE_CTRL_CLOCK_FREQ_MASK) << CE_CTRL_CLOCK_FREQ_SHIFT) #define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */ #define CTRL_CE_STOP_ACTIVE (1 << 2) #define CTRL_CMD_MODE_MASK 0x3 @@ -112,7 +116,7 @@ #define DMA_CTRL_DELAY_SHIFT 8 #define DMA_CTRL_FREQ_MASK 0xf #define DMA_CTRL_FREQ_SHIFT 4 -#define DMA_CTRL_MODE (1 << 3) +#define DMA_CTRL_CALIB (1 << 3) #define DMA_CTRL_CKSUM (1 << 2) #define DMA_CTRL_WRITE (1 << 1) #define DMA_CTRL_ENABLE (1 << 0) @@ -811,6 +815,60 @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr a= ddr, unsigned int size) } } =20 +static uint8_t aspeed_smc_hclk_divisor(uint8_t hclk_mask) +{ + /* HCLK/1 .. HCLK/16 */ + const uint8_t hclk_divisors[] =3D { + 15, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 0 + }; + int i; + + for (i =3D 0; i < ARRAY_SIZE(hclk_divisors); i++) { + if (hclk_mask =3D=3D hclk_divisors[i]) { + return i + 1; + } + } + + qemu_log_mask(LOG_GUEST_ERROR, "invalid HCLK mask %x", hclk_mask); + return 0; +} + +/* + * When doing calibration, the SPI clock rate in the CE0 Control + * Register and the read delay cycles in the Read Timing Compensation + * Register are set using bit[11:4] of the DMA Control Register. + */ +static void aspeed_smc_dma_calibration(AspeedSMCState *s) +{ + uint8_t delay =3D + (s->regs[R_DMA_CTRL] >> DMA_CTRL_DELAY_SHIFT) & DMA_CTRL_DELAY_MAS= K; + uint8_t hclk_mask =3D + (s->regs[R_DMA_CTRL] >> DMA_CTRL_FREQ_SHIFT) & DMA_CTRL_FREQ_MASK; + uint8_t hclk_div =3D aspeed_smc_hclk_divisor(hclk_mask); + uint32_t hclk_shift =3D (hclk_div - 1) << 2; + uint8_t cs; + + /* + * The Read Timing Compensation Register values apply to all CS on + * the SPI bus and only HCLK/1 - HCLK/5 can have tunable delays + */ + if (hclk_div && hclk_div < 6) { + s->regs[s->r_timings] &=3D ~(0xf << hclk_shift); + s->regs[s->r_timings] |=3D delay << hclk_shift; + } + + /* + * TODO: compute the CS from the DMA address and the segment + * registers. This is not really a problem for now because the + * Timing Register values apply to all CS and software uses CS0 to + * do calibration. + */ + cs =3D 0; + s->regs[s->r_ctrl0 + cs] &=3D + ~(CE_CTRL_CLOCK_FREQ_MASK << CE_CTRL_CLOCK_FREQ_SHIFT); + s->regs[s->r_ctrl0 + cs] |=3D CE_CTRL_CLOCK_FREQ(hclk_div); +} + /* * Accumulate the result of the reads to provide a checksum that will * be used to validate the read timing settings. @@ -826,6 +884,10 @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s) return; } =20 + if (s->regs[R_DMA_CTRL] & DMA_CTRL_CALIB) { + aspeed_smc_dma_calibration(s); + } + while (s->regs[R_DMA_LEN]) { data =3D address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_AD= DR], MEMTXATTRS_UNSPECIFIED, &result); --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390648; cv=none; d=zoho.com; s=zohoarc; b=R4k9xIilwAa9fd53XbMjrwu9yj+Z4HzSrfD0QdLr3fvLq0DVcIOjdvxIsEWxPSlupJ9yg0otgvSt/12Sk5yPlcvOnLhoS3FumJvALTMbH3eSVqi4EBiWJ7Ry4KFwcKjphnM9DgGrxtSMjkni+qaK5kmcSbDDum9Y+phXcsgYMI4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390648; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=A1cjHFhYc5I7kRW1lKINEm/mLxw+4h/q6C9juDhceJc=; b=FhkTCqE0h9A8Vd5HFl1Q+PIF5EaPzp+F/lLkrBVLWdHv6qkJgRP+zeOxs3YyJuZHHTpLhdcb2W3nnRmoIiPIq+q4ZR/PMdH1Q+EhBOnJOGR8aIsBgXqQhaR7zBBHlz107hm/Tpqqk2zlZOZF5lsrJuUDt5YyBC6XlIrXikE4WNs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390648640136.12610128669792; Fri, 13 Sep 2019 09:04:08 -0700 (PDT) Received: from localhost ([::1]:45800 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8o3K-0004Ya-Qf for importer@patchew.org; Fri, 13 Sep 2019 12:04:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57109) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npl-0007cF-Os for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npk-0000sr-Fb for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:05 -0400 Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]:43943) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npk-0000rw-9N for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:04 -0400 Received: by mail-wr1-x429.google.com with SMTP id q17so27894852wrx.10 for ; Fri, 13 Sep 2019 08:50:04 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=A1cjHFhYc5I7kRW1lKINEm/mLxw+4h/q6C9juDhceJc=; b=MomvmlIMdGxHV9VO20+3mi7nAGl38KeDli9ry7hdklJRtn8YcT9gndhhKD/BmzAujc FGqEP8ezXGr2GIonX9RPoz/RLCvV+EMNha+oZwhZV0/UbC9d3kXTRdY1aHRDiT4VqU4b Hiy/4PI2TLMm3ks5ZJ2bEROyLqouFRe+tcR0QCnSJWxyeo+yx0MzA7N2+nPxWHWbJUHZ TnON/BxcgZp2cK6VVhTxmLGcSLsXaDKBkWkqDtCF4FTciQaXAwKx89GffCDSEg0yX3nJ 6SvRVvWqKkM29PUb6mtvK6YLyv4CoE1p6t/eCI4MpaKcPLV23nSFFdlDTJUYgENhr0Q9 ChZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=A1cjHFhYc5I7kRW1lKINEm/mLxw+4h/q6C9juDhceJc=; b=gU2dyetVFD1uJwnYmCVfffw1/iXz2I/FRJB9YzUqgxCE3u7EQCSYs3ZsURZEZhol2S Bz+/gRhYEizwPKHUBzlg8wO8dnXo7Ng1oe0eHtFWK5UlocjKPAHDvK5lH1IHkh2051Dh dW7jrf9XZoJNVECsvcIUJRjxzEHy/cEwgjzaoGy2CziNQWPtQpiiQMHIh6xCPLmjtI+l C2lr2hV3KT4/BSafinuKwNiH6+3VbslU0lXI7X4mjyy5bBqo8UuZA4M96hr4GjzIV7X/ izj6Yao7lXJAQuvH7pnlAWv0fkyel1SyBmgpASaQAIIotAhABQMCwomo21kcPbbI58d+ +ZWA== X-Gm-Message-State: APjAAAWRKFlant1n+LyPHnnQrl2Z2aRshvecYzXUrVQ/rPLEsAhnxDe6 LA6zlahwO5fXuQMte/cPNGVXkVccrmUskg== X-Google-Smtp-Source: APXvYqyEENhLI5imPW6MH7rAinBbf9BT2BvPVFzpp2qOMJ4auBU6fw9cTdBlm0GM4V+54E8csQIjXg== X-Received: by 2002:adf:f901:: with SMTP id b1mr13000134wrr.184.1568389803158; Fri, 13 Sep 2019 08:50:03 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:47 +0100 Message-Id: <20190913154952.27724-8-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::429 Subject: [Qemu-devel] [PULL 07/12] aspeed/smc: Inject errors in DMA checksum X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater Emulate read errors in the DMA Checksum Register for high frequencies and optimistic settings of the Read Timing Compensation Register. This will help in tuning the SPI timing calibration algorithm. Errors are only injected when the property "inject_failure" is set to true as suggested by Philippe. The values below are those to expect from the first flash device of the FMC controller of a palmetto-bmc machine. Cc: Philippe Mathieu-Daud=C3=A9 Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: Joel Stanley Message-id: 20190904070506.1052-8-clg@kaod.org Signed-off-by: Peter Maydell --- include/hw/ssi/aspeed_smc.h | 1 + hw/ssi/aspeed_smc.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 32ce6916f6c..5176ff6bf95 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -88,6 +88,7 @@ typedef struct AspeedSMCState { =20 uint32_t num_cs; qemu_irq *cs_lines; + bool inject_failure; =20 SSIBus *spi; =20 diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 7a0cd7607fd..5c3436db5e8 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -869,6 +869,36 @@ static void aspeed_smc_dma_calibration(AspeedSMCState = *s) s->regs[s->r_ctrl0 + cs] |=3D CE_CTRL_CLOCK_FREQ(hclk_div); } =20 +/* + * Emulate read errors in the DMA Checksum Register for high + * frequencies and optimistic settings of the Read Timing Compensation + * Register. This will help in tuning the SPI timing calibration + * algorithm. + */ +static bool aspeed_smc_inject_read_failure(AspeedSMCState *s) +{ + uint8_t delay =3D + (s->regs[R_DMA_CTRL] >> DMA_CTRL_DELAY_SHIFT) & DMA_CTRL_DELAY_MAS= K; + uint8_t hclk_mask =3D + (s->regs[R_DMA_CTRL] >> DMA_CTRL_FREQ_SHIFT) & DMA_CTRL_FREQ_MASK; + + /* + * Typical values of a palmetto-bmc machine. + */ + switch (aspeed_smc_hclk_divisor(hclk_mask)) { + case 4 ... 16: + return false; + case 3: /* at least one HCLK cycle delay */ + return (delay & 0x7) < 1; + case 2: /* at least two HCLK cycle delay */ + return (delay & 0x7) < 2; + case 1: /* (> 100MHz) is above the max freq of the controller */ + return true; + default: + g_assert_not_reached(); + } +} + /* * Accumulate the result of the reads to provide a checksum that will * be used to validate the read timing settings. @@ -905,6 +935,11 @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s) s->regs[R_DMA_FLASH_ADDR] +=3D 4; s->regs[R_DMA_LEN] -=3D 4; } + + if (s->inject_failure && aspeed_smc_inject_read_failure(s)) { + s->regs[R_DMA_CHECKSUM] =3D 0xbadc0de; + } + } =20 static void aspeed_smc_dma_rw(AspeedSMCState *s) @@ -1185,6 +1220,7 @@ static const VMStateDescription vmstate_aspeed_smc = =3D { =20 static Property aspeed_smc_properties[] =3D { DEFINE_PROP_UINT32("num-cs", AspeedSMCState, num_cs, 1), + DEFINE_PROP_BOOL("inject-failure", AspeedSMCState, inject_failure, fal= se), DEFINE_PROP_UINT64("sdram-base", AspeedSMCState, sdram_base, 0), DEFINE_PROP_LINK("dram", AspeedSMCState, dram_mr, TYPE_MEMORY_REGION, MemoryRegion *), --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390145; cv=none; d=zoho.com; s=zohoarc; b=cvL8xDw8+h3b24GDWYfV5c/vicfO62wHcsMlZLdNLFTK+O8wrLThdUlq7TVpKzfkGwAQ0OByFYPhS1uRgBD4aNh17XxMHZppicJIt+qllMCHzzwcqTWzvP9btrXeagMMioyX0eaQCbd/V/4qvafeJGnlYugApyS/BXwhPi55bOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390145; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=tBSweGRJqo1QugNMOgMsQvTUwdKJFX5c4+9Ab8DGWNg=; b=O90P8bd5G2CnCd7uEt+x3MorevqjM/GWFvY+AuV+WQRULv5OSq0Dkrnoa9W/Jra2fY6gdG2pJ0u5cgcAiIwaW9CUFTwBwrsUeFabVNQ/nBvCcdPsMSCWcwxtDI+HdSaJdvGVEW2hjCwk5MQYuUNsdNRUPF2oRh3NXWY6LY1Fafk= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390145554567.3516008796464; Fri, 13 Sep 2019 08:55:45 -0700 (PDT) Received: from localhost ([::1]:45622 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nv5-0004fN-0J for importer@patchew.org; Fri, 13 Sep 2019 11:55:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57124) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npm-0007dK-G0 for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npl-0000u5-BU for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:06 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]:41936) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npl-0000sv-5Z for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:05 -0400 Received: by mail-wr1-x435.google.com with SMTP id h7so31580588wrw.8 for ; Fri, 13 Sep 2019 08:50:05 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=tBSweGRJqo1QugNMOgMsQvTUwdKJFX5c4+9Ab8DGWNg=; b=IqEIbkAmJduDpgu6zcdRZY2Ye0s5mHWAKQtx1Tsixu31bVJygBgUGMlP75rXi83qNY O9wFEKWvnMxGA3b0j9+8RAmhCW1mUYpSINdWZJTmNLLD3RCi8K54fl/Ujd1F5RjC7D4x VPqz1K0IdFaRYFDqIILGfg5abm6eTS30STD3OcsnfsnDAEseL7hzhHomo3lhCuqp2td4 jP3L2KOgJjaPYR/EtH/Ue00KO9U95AkLQ3bSSSLx5ZhgFOKz4C0ElthyM3vrNMa0EUp8 NwfnPPRRRN5sgNoNTY2JGP24UPRlTidYO0ZnAFvZkKjGJLw8rGbSOPbAa/8l4qnaYmMD heVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tBSweGRJqo1QugNMOgMsQvTUwdKJFX5c4+9Ab8DGWNg=; b=oa4ZONbqqK5HtSVStqtPVKyNmTFVXMst0qvJBbqORh3By6yqhWRxPtwTQsyxKG9pXr h2W1k9+EJMAUQWulxTO6piWXjCLeW8aOymuW+ISRm4RfGMNfH6SMrgeqwTgIJznNfBW9 tC5NqX40JbwVs2ZAMprb7Mk1+LWHLYuMZ2Ye+4YBPW/fjssTbbaFh27CdGoV4CYQHIYq QvIrF2pb8DjHooZxufzgDypLtkrXKCtTak5BsSCpALoVfNgm5DrPTrwh9+2hvHnlEpQ5 xDvO7Aq5D83aR/2cwx0yH7fuLc0uhHioe4E9hxygFjtTVxskcODVbHAUWoWhIfYQCwmR D4Nw== X-Gm-Message-State: APjAAAXpgB8IAvOIqB9StkCsu6F+76UdYjZgBjNl7oatz9Cqcc42WLp5 xzQ1fM8BPpwZXbXoV0HtqsxWH4W/v/VfsA== X-Google-Smtp-Source: APXvYqyuE5pwz4zSc7LzKTuFJAK5xayFVdJ7iBfGGEDLqjFq6LAM9vuZO3jA1PApRamnvIckIboSug== X-Received: by 2002:adf:e947:: with SMTP id m7mr1409792wrn.178.1568389804001; Fri, 13 Sep 2019 08:50:04 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:48 +0100 Message-Id: <20190913154952.27724-9-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::435 Subject: [Qemu-devel] [PULL 08/12] aspeed/smc: Calculate checksum on normal DMA X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: Christian Svensson This patch adds the missing checksum calculation on normal DMA transfer. According to the datasheet this is how the SMC should behave. Verified on AST1250 that the hardware matches the behaviour. Signed-off-by: Christian Svensson Reviewed-by: Joel Stanley Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-9-clg@kaod.org Signed-off-by: Peter Maydell --- hw/ssi/aspeed_smc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 5c3436db5e8..9ffc7e01179 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -989,6 +989,7 @@ static void aspeed_smc_dma_rw(AspeedSMCState *s) s->regs[R_DMA_FLASH_ADDR] +=3D 4; s->regs[R_DMA_DRAM_ADDR] +=3D 4; s->regs[R_DMA_LEN] -=3D 4; + s->regs[R_DMA_CHECKSUM] +=3D data; } } =20 --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390143; cv=none; d=zoho.com; s=zohoarc; b=INAnYtOepcs7LfK1fMYRtkohPW2GOX8tQYKODMF7AEfGsqeR6Tg0chUDttEXb93pbfSqC2tlKMRBpste1hR5oXsK5XEfkCjRl6+GUSEkmH3t3qpuArHHsGLHZOXGC/V48JevQcWHD1hJdcr8+hYK26aTI6e0hl82JVyBrXpEyww= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390143; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=BWXq64j+jVGO6XK++EFhnMF/2taBEqtn7uBGUbXx0bQ=; b=dTUJ3j1y/Ny1NT2R1LXL8rpGFwVuX6oHu/DlWI3LE4sZ+HQYXIEZ7ntHQOhXdZuBF8SVhCHAr8uFauQMj9BPAPB6UX9hJTrTFWM9L0XOHBVdWVShNYo0sak8cVlxmm4u+fywfNm8uw2/jB/EGbVl4gZTqFEkGPPVqRI+CxkjXYE= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390143034236.69641654183795; Fri, 13 Sep 2019 08:55:43 -0700 (PDT) Received: from localhost ([::1]:45630 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nv8-0004iQ-3Z for importer@patchew.org; Fri, 13 Sep 2019 11:55:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57141) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npo-0007f0-NR for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npm-0000ux-JF for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:07 -0400 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]:33773) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npm-0000uF-Co for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:06 -0400 Received: by mail-wr1-x434.google.com with SMTP id u16so32628885wrr.0 for ; Fri, 13 Sep 2019 08:50:06 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=BWXq64j+jVGO6XK++EFhnMF/2taBEqtn7uBGUbXx0bQ=; b=sLJrVCNeVHcmsRqBi2+UQwIzg4tEaYlzjQdJZFFOex0O1BvhV9x+J/T4UL9FV8kwYv AswLqcww4gfXJ569JKFXB/ZHE+4BbGlRZ2BdFbpdCMXNsvFrsDwNh9H/uX70hcEC9RBY q9LtdAoaufdlL/YnUKsq5vt88HvwIBw9UUVOxp9oBwxOQt37Irh97pV6YwzWVAqlT774 z7EWdZRy8Bt4KSHRU8a/LY29mBFwdXAkxC1vtbq2aDvm/0ePXf3HxpmMNaVCkALflZLO nTIyslStSbaS8CRixzOLkpob8FgtDoz989OjhPmSieh0q4lvjzxSOLLxZAArrj6lEr54 1PGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BWXq64j+jVGO6XK++EFhnMF/2taBEqtn7uBGUbXx0bQ=; b=l+dSIoElhcKxmVUkuN20hM0LRgjDxwtxgGA8PB6C35cPYYHmdWmKT89MpV+phv5YbI pCnnv6wIlZLjFv9v62H8hwLFYVfvf96nWqevkL8K71IJgI463X4RnawhW5kBBbhx4KO+ eXYVvPDxDB3SyJb1dZohxtW8FFtT6uIu4eejVaFVHUVeZtgf53MFR7l21WtweUHIQ01k oohWo16mUozO0ipcSQ6clin8ED3aBnWF0y4NwzhP+nCNXkxsBjjo69wIghtNS78KawYn Sd3VubBXdb0ohnYINKJv0ZPoaeYf1KXcMoa7AGZ7R76vpqEUUtcr469EHiWUkv5pHzj0 9J4Q== X-Gm-Message-State: APjAAAXuUcSqZ2lBxNH50um3oTzJN0Q7b5zyUkQxm1i7t8zu7L0wy1n/ R0pBIgx6ZHA3Zi2U2x52LkvDnezkoaZlMQ== X-Google-Smtp-Source: APXvYqzbQ++9KxMN9uaFfH6hK7BWN7gvtegS+j5jD0CAfxaFlYeCOps/NkjyHbHec+r7wd92ryD+0Q== X-Received: by 2002:adf:b342:: with SMTP id k2mr2577853wrd.207.1568389805035; Fri, 13 Sep 2019 08:50:05 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:49 +0100 Message-Id: <20190913154952.27724-10-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::434 Subject: [Qemu-devel] [PULL 09/12] aspeed/scu: Introduce per-SoC SCU types X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater and use a class AspeedSCUClass to define each SoC characteristics. Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-10-clg@kaod.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- include/hw/misc/aspeed_scu.h | 15 +++++++ hw/arm/aspeed_soc.c | 3 +- hw/misc/aspeed_scu.c | 83 ++++++++++++++++++++---------------- 3 files changed, 64 insertions(+), 37 deletions(-) diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h index 38996adc59f..90dd4dadede 100644 --- a/include/hw/misc/aspeed_scu.h +++ b/include/hw/misc/aspeed_scu.h @@ -15,6 +15,8 @@ =20 #define TYPE_ASPEED_SCU "aspeed.scu" #define ASPEED_SCU(obj) OBJECT_CHECK(AspeedSCUState, (obj), TYPE_ASPEED_SC= U) +#define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400" +#define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500" =20 #define ASPEED_SCU_NR_REGS (0x1A8 >> 2) =20 @@ -45,6 +47,19 @@ typedef struct AspeedSCUState { =20 extern bool is_supported_silicon_rev(uint32_t silicon_rev); =20 +#define ASPEED_SCU_CLASS(klass) \ + OBJECT_CLASS_CHECK(AspeedSCUClass, (klass), TYPE_ASPEED_SCU) +#define ASPEED_SCU_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AspeedSCUClass, (obj), TYPE_ASPEED_SCU) + +typedef struct AspeedSCUClass { + SysBusDeviceClass parent_class; + + const uint32_t *resets; + uint32_t (*calc_hpll)(AspeedSCUState *s); + uint32_t apb_divider; +} AspeedSCUClass; + #define ASPEED_SCU_PROT_KEY 0x1688A8A8 =20 /* diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index da508c99c33..cf1d0cf921b 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -161,8 +161,9 @@ static void aspeed_soc_init(Object *obj) &error_abort, NULL); } =20 + snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname); sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu), - TYPE_ASPEED_SCU); + typename); qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", sc->info->silicon_rev); object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c index 268cb24e565..d284458b9b3 100644 --- a/hw/misc/aspeed_scu.c +++ b/hw/misc/aspeed_scu.c @@ -166,23 +166,10 @@ static uint32_t aspeed_scu_get_random(void) =20 static void aspeed_scu_set_apb_freq(AspeedSCUState *s) { - uint32_t apb_divider; - - switch (s->silicon_rev) { - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - apb_divider =3D 2; - break; - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - apb_divider =3D 4; - break; - default: - g_assert_not_reached(); - } + AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(s); =20 s->apb_freq =3D s->hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1) - / apb_divider; + / asc->apb_divider; } =20 static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size) @@ -303,7 +290,7 @@ static const uint32_t hpll_ast2400_freqs[][4] =3D { { 400, 375, 350, 425 }, /* 25MHz */ }; =20 -static uint32_t aspeed_scu_calc_hpll_ast2400(AspeedSCUState *s) +static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s) { uint32_t hpll_reg =3D s->regs[HPLL_PARAM]; uint8_t freq_select; @@ -334,7 +321,7 @@ static uint32_t aspeed_scu_calc_hpll_ast2400(AspeedSCUS= tate *s) return hpll_ast2400_freqs[clk_25m_in][freq_select] * 1000000; } =20 -static uint32_t aspeed_scu_calc_hpll_ast2500(AspeedSCUState *s) +static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s) { uint32_t hpll_reg =3D s->regs[HPLL_PARAM]; uint32_t multiplier =3D 1; @@ -357,25 +344,9 @@ static uint32_t aspeed_scu_calc_hpll_ast2500(AspeedSCU= State *s) static void aspeed_scu_reset(DeviceState *dev) { AspeedSCUState *s =3D ASPEED_SCU(dev); - const uint32_t *reset; - uint32_t (*calc_hpll)(AspeedSCUState *s); + AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(dev); =20 - switch (s->silicon_rev) { - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - reset =3D ast2400_a0_resets; - calc_hpll =3D aspeed_scu_calc_hpll_ast2400; - break; - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - reset =3D ast2500_a1_resets; - calc_hpll =3D aspeed_scu_calc_hpll_ast2500; - break; - default: - g_assert_not_reached(); - } - - memcpy(s->regs, reset, sizeof(s->regs)); + memcpy(s->regs, asc->resets, sizeof(s->regs)); s->regs[SILICON_REV] =3D s->silicon_rev; s->regs[HW_STRAP1] =3D s->hw_strap1; s->regs[HW_STRAP2] =3D s->hw_strap2; @@ -385,7 +356,7 @@ static void aspeed_scu_reset(DeviceState *dev) * All registers are set. Now compute the frequencies of the main cloc= ks */ s->clkin =3D aspeed_scu_get_clkin(s); - s->hpll =3D calc_hpll(s); + s->hpll =3D asc->calc_hpll(s); aspeed_scu_set_apb_freq(s); } =20 @@ -459,11 +430,51 @@ static const TypeInfo aspeed_scu_info =3D { .parent =3D TYPE_SYS_BUS_DEVICE, .instance_size =3D sizeof(AspeedSCUState), .class_init =3D aspeed_scu_class_init, + .class_size =3D sizeof(AspeedSCUClass), + .abstract =3D true, +}; + +static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSCUClass *asc =3D ASPEED_SCU_CLASS(klass); + + dc->desc =3D "ASPEED 2400 System Control Unit"; + asc->resets =3D ast2400_a0_resets; + asc->calc_hpll =3D aspeed_2400_scu_calc_hpll; + asc->apb_divider =3D 2; +} + +static const TypeInfo aspeed_2400_scu_info =3D { + .name =3D TYPE_ASPEED_2400_SCU, + .parent =3D TYPE_ASPEED_SCU, + .instance_size =3D sizeof(AspeedSCUState), + .class_init =3D aspeed_2400_scu_class_init, +}; + +static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSCUClass *asc =3D ASPEED_SCU_CLASS(klass); + + dc->desc =3D "ASPEED 2500 System Control Unit"; + asc->resets =3D ast2500_a1_resets; + asc->calc_hpll =3D aspeed_2500_scu_calc_hpll; + asc->apb_divider =3D 4; +} + +static const TypeInfo aspeed_2500_scu_info =3D { + .name =3D TYPE_ASPEED_2500_SCU, + .parent =3D TYPE_ASPEED_SCU, + .instance_size =3D sizeof(AspeedSCUState), + .class_init =3D aspeed_2500_scu_class_init, }; =20 static void aspeed_scu_register_types(void) { type_register_static(&aspeed_scu_info); + type_register_static(&aspeed_2400_scu_info); + type_register_static(&aspeed_2500_scu_info); } =20 type_init(aspeed_scu_register_types); --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390822; cv=none; d=zoho.com; s=zohoarc; b=QqnOGonnfZg5FJiW7dd5QTh7HjkAXclpMKLklBy2Ww7i4M0PTZ+6X7Vn4MdUJeaeLKz3k8PZ8MlL/Rkvfq+kEkCEKlacNG7rWkt55BDyugYx4JvXtZNXGTEok0ymr4P3FOjpHlc+91eONcTwhmy6mz2m3CPLdvk1oAPfma7t4nw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390822; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=WjpL1PRP109kykUPDDngOfZC1U7Z+AZ7bQ7XRIXZFYY=; b=OIN3ubg+pRwAGWY/i/oGq+sNVkvrtjnDGhW2xmnSYMIz3oEUMQemHBAiK8EvTd1b0Fnsn2lMEi89wQ9wodrgyV89BddF7NC7RdN/bMuPI76NSo1HrYhmlLyJL93q1GwFVRBNu0CWJBpRu/URO59wSc8QOI3SiDNXzUunWW6Ohmg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390822037379.8227180661112; Fri, 13 Sep 2019 09:07:02 -0700 (PDT) Received: from localhost ([::1]:45844 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8o60-0007lE-BP for importer@patchew.org; Fri, 13 Sep 2019 12:06:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57150) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npo-0007fG-Qd for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npn-0000vL-DU for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:08 -0400 Received: from mail-wr1-x436.google.com ([2a00:1450:4864:20::436]:47001) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npn-0000uu-63 for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:07 -0400 Received: by mail-wr1-x436.google.com with SMTP id o18so1372860wrv.13 for ; Fri, 13 Sep 2019 08:50:07 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=WjpL1PRP109kykUPDDngOfZC1U7Z+AZ7bQ7XRIXZFYY=; b=xiiVX9Dy4Af7QhL2snOrssMy4pU7QRcppVLvoVrBbjcag+Pz8spCgNFEqPgv7VjRgg swAFognqNC55QAYoQ0B90IPv0EwmLKsFVuu0Tj86Fz6W+h0zSBLzCgPV4bmHA5RKb06v 6I/9UrX0WEt3M38AZM3MHx8aWOduUH6bTUEc2w7xRsmpZU+fsmvNzIwtxgTJ2m9nzAWY y76RvwsAQLqEwtub1W5hSdRx1S2m6XPCENBT1qKNYaQMbzuX6zWLwG9TZWYcl2PLyJ2o 4vBIbuFjs/rGztJ+wgvCCOEspeqTvNl5C2TCkTmVYEKnn+EZb4ZIrqQ8otxaPe/RUeiw u9bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WjpL1PRP109kykUPDDngOfZC1U7Z+AZ7bQ7XRIXZFYY=; b=BjtURRHyXrXFMzW+f/6NNPgt25Axc1YKXzH7zpyGuWCfZ3Rb0FKpawzSfNVtwWIF3p nXtcmQQhjPUodFxNTQG754EvWxO0ainorxUlWJtOVPdHdvAEWWAW/6l2F1lvNv1uqLxH a0qmqh2N+5+K+5Uq7ehddCkFfktBF3rbnrcfwpU+BxKtlxAO+WEe5FYBOm3AwIQil6+V z+cCUtYoM4bPWUCibJsxVLF1OoqN05Es41fJRZ0zNuPEalRaFx/UJ0i9cYSPvFt3zO8L VQ5rclLZcQsjtTexc06ngsfGShXB66IMdefhbFbBK+wEYRBXoHDllFtyqTsSam3Fd+H5 ol0g== X-Gm-Message-State: APjAAAU6WRvKs//9Qi/+jJcw5JIWCoeToayGY1vKi7/ENaOI1o+rjkjx agQ4SfvHD8SzZOZIaiexFDVe7ZUjh30aDw== X-Google-Smtp-Source: APXvYqzP4J7ljoWprn4A27btE61z7947r2Kffo7fUgBDIli7/tPmr7twTv9lzpMo9EFALYbtexLtIw== X-Received: by 2002:adf:fe07:: with SMTP id n7mr13865856wrr.90.1568389805948; Fri, 13 Sep 2019 08:50:05 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:50 +0100 Message-Id: <20190913154952.27724-11-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::436 Subject: [Qemu-devel] [PULL 10/12] aspeed/scu: Introduce a aspeed_scu_get_apb_freq() routine X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: C=C3=A9dric Le Goater The APB frequency can be calculated directly when needed from the HPLL_PARAM and CLK_SEL register values. This removes useless state in the model. Signed-off-by: C=C3=A9dric Le Goater Message-id: 20190904070506.1052-11-clg@kaod.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- include/hw/misc/aspeed_scu.h | 8 +++----- hw/misc/aspeed_scu.c | 25 +++++++++---------------- hw/timer/aspeed_timer.c | 3 ++- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h index 90dd4dadede..239e94fe2c4 100644 --- a/include/hw/misc/aspeed_scu.h +++ b/include/hw/misc/aspeed_scu.h @@ -32,10 +32,6 @@ typedef struct AspeedSCUState { uint32_t hw_strap1; uint32_t hw_strap2; uint32_t hw_prot_key; - - uint32_t clkin; - uint32_t hpll; - uint32_t apb_freq; } AspeedSCUState; =20 #define AST2400_A0_SILICON_REV 0x02000303U @@ -56,12 +52,14 @@ typedef struct AspeedSCUClass { SysBusDeviceClass parent_class; =20 const uint32_t *resets; - uint32_t (*calc_hpll)(AspeedSCUState *s); + uint32_t (*calc_hpll)(AspeedSCUState *s, uint32_t hpll_reg); uint32_t apb_divider; } AspeedSCUClass; =20 #define ASPEED_SCU_PROT_KEY 0x1688A8A8 =20 +uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s); + /* * Extracted from Aspeed SDK v00.03.21. Fixes and extra definitions * were added. diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c index d284458b9b3..620b25c2047 100644 --- a/hw/misc/aspeed_scu.c +++ b/hw/misc/aspeed_scu.c @@ -164,11 +164,12 @@ static uint32_t aspeed_scu_get_random(void) return num; } =20 -static void aspeed_scu_set_apb_freq(AspeedSCUState *s) +uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s) { AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(s); + uint32_t hpll =3D asc->calc_hpll(s, s->regs[HPLL_PARAM]); =20 - s->apb_freq =3D s->hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1) + return hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1) / asc->apb_divider; } =20 @@ -228,7 +229,6 @@ static void aspeed_scu_write(void *opaque, hwaddr offse= t, uint64_t data, return; case CLK_SEL: s->regs[reg] =3D data; - aspeed_scu_set_apb_freq(s); break; case HW_STRAP1: if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) { @@ -290,11 +290,11 @@ static const uint32_t hpll_ast2400_freqs[][4] =3D { { 400, 375, 350, 425 }, /* 25MHz */ }; =20 -static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s) +static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll= _reg) { - uint32_t hpll_reg =3D s->regs[HPLL_PARAM]; uint8_t freq_select; bool clk_25m_in; + uint32_t clkin =3D aspeed_scu_get_clkin(s); =20 if (hpll_reg & SCU_AST2400_H_PLL_OFF) { return 0; @@ -311,7 +311,7 @@ static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUStat= e *s) multiplier =3D (2 - od) * ((n + 2) / (d + 1)); } =20 - return s->clkin * multiplier; + return clkin * multiplier; } =20 /* HW strapping */ @@ -321,10 +321,10 @@ static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUSt= ate *s) return hpll_ast2400_freqs[clk_25m_in][freq_select] * 1000000; } =20 -static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s) +static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll= _reg) { - uint32_t hpll_reg =3D s->regs[HPLL_PARAM]; uint32_t multiplier =3D 1; + uint32_t clkin =3D aspeed_scu_get_clkin(s); =20 if (hpll_reg & SCU_H_PLL_OFF) { return 0; @@ -338,7 +338,7 @@ static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUStat= e *s) multiplier =3D ((m + 1) / (n + 1)) / (p + 1); } =20 - return s->clkin * multiplier; + return clkin * multiplier; } =20 static void aspeed_scu_reset(DeviceState *dev) @@ -351,13 +351,6 @@ static void aspeed_scu_reset(DeviceState *dev) s->regs[HW_STRAP1] =3D s->hw_strap1; s->regs[HW_STRAP2] =3D s->hw_strap2; s->regs[PROT_KEY] =3D s->hw_prot_key; - - /* - * All registers are set. Now compute the frequencies of the main cloc= ks - */ - s->clkin =3D aspeed_scu_get_clkin(s); - s->hpll =3D asc->calc_hpll(s); - aspeed_scu_set_apb_freq(s); } =20 static uint32_t aspeed_silicon_revs[] =3D { diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c index 59c2bbeee60..2bda826882d 100644 --- a/hw/timer/aspeed_timer.c +++ b/hw/timer/aspeed_timer.c @@ -93,7 +93,8 @@ static inline uint32_t calculate_rate(struct AspeedTimer = *t) { AspeedTimerCtrlState *s =3D timer_to_ctrl(t); =20 - return timer_external_clock(t) ? TIMER_CLOCK_EXT_HZ : s->scu->apb_freq; + return timer_external_clock(t) ? TIMER_CLOCK_EXT_HZ : + aspeed_scu_get_apb_freq(s->scu); } =20 static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now= _ns) --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390353; cv=none; d=zoho.com; s=zohoarc; b=TzdcM+mAyHt+Yw+wSpXtYJSNj/cPd3lw08Hx3XwkRIzsHTcXXf8v4w1lDLSLLJI9oJ0c0wRlfPGiWjLWO6vCGxzYTNH5PaUBCwsN0Q5S6PcFB4WNIvxdIIyjUKxaSoKAAu/8BrgL4aWYgY9DswU+CZZ3U7BMSInxQodsSPKAjFI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390353; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=OB9XFxOwyf056lQ1S4kvmXdc02MTc76JEazor4S9ukk=; b=DFb4rKvLsMHpJ/VBXqgqMrzmiFXHHQNsMWJVQE3xlKkN0aBrwSPH7hDrXHL5L/2/dmqZ8mGY4QSK+ygPh9tRuA5U0UAn9hFK1gaPoZjjS/mjr2CFgZSoMK2FeaN112dSp/6U3V4q2HjhGUoXg72SYMYqny0h3XFrQfeZMM2hU3I= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390353448706.2459293286671; Fri, 13 Sep 2019 08:59:13 -0700 (PDT) Received: from localhost ([::1]:45676 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nyZ-0000F4-P0 for importer@patchew.org; Fri, 13 Sep 2019 11:59:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57155) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8npp-0007fe-7n for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npo-0000vj-7F for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:09 -0400 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]:54976) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npo-0000vI-1H for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:08 -0400 Received: by mail-wm1-x336.google.com with SMTP id p7so3292513wmp.4 for ; Fri, 13 Sep 2019 08:50:07 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OB9XFxOwyf056lQ1S4kvmXdc02MTc76JEazor4S9ukk=; b=zY51cO7J4HZLQZRJStKvOJp41WDXWRHihGr2Rart7WVOzvltSpeMapPTiICueTQtKb V0ykT8t27zJz0wWUmrHQgKLQ3reTb1sXCZd0xkxembZFpsgWB+b8SUdn/wt6aV7BpJeb 6TCKFW3mLIB5skGR3Br6/1ljqLCAgvBmYtzu/ske4sAqsPWWgEYmHw2VmbW5xLGGwNtN iDVGBN4oLHZFKIWjYySx9xeivVUPlDXzHb+jyHv20mVz9Vo5DankwbEcFBNwwOARWjtn HXjPcoQOCQFaJQPG5ot6nzAlNI7yVdBb3dYpBz69MW1tijd9O0ERhvua9cmE9/O8hHC/ vY3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OB9XFxOwyf056lQ1S4kvmXdc02MTc76JEazor4S9ukk=; b=DAe3If2BHogPXTHedhjxHjLmkk/7Un9Sf4mi4wBRV+vdceIMGfFCK4ETZP6ZAFdsKM VvOjfHltjD9doapR+9icm+ICqBbNbX2/xt8rVUQaFtSzY/oL+gd0/U8obovD0YYXSWd2 eHUX5ahGD86z4fGpnpbXNiWRsTgZ9KHdyNO7l8nELZfAlpd5pQOVhwEjymU44PjqQz0j 7zQfcbFOZCabVTucmY+e8SlSHauPZgNANara4a/pddWAjurcuofudb6Ksw8lAU1yG+xQ OcgEu7OrwY7t60eMopyftc66M0R/y3HwrHopEaJc3rtVvXhb6j/dDbWJakeK9j3ijqIH EFKw== X-Gm-Message-State: APjAAAXD33kAPdOGTBk8S0JJLqAyw3YgsbtSr8LBSM9gaJspLYvrKpVU 1yjF3UUIhwW69xdgvQJVfvcpVwoE5MWsfw== X-Google-Smtp-Source: APXvYqxJmFeywQGKK2YhmuqpZhAHkNvyMwTFZ46RZsik2Xc6Rz7amstYzrBjyqW1Nx40ulrBYZtasw== X-Received: by 2002:a1c:ed04:: with SMTP id l4mr4166506wmh.81.1568389806862; Fri, 13 Sep 2019 08:50:06 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:51 +0100 Message-Id: <20190913154952.27724-12-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::336 Subject: [Qemu-devel] [PULL 11/12] atomic_template: fix indentation in GEN_ATOMIC_HELPER X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: "Emilio G. Cota" Reviewed-by: Alex Benn=C3=A9e Signed-off-by: Emilio G. Cota Reviewed-by: Richard Henderson Signed-off-by: Alex Benn=C3=A9e Signed-off-by: Peter Maydell --- accel/tcg/atomic_template.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accel/tcg/atomic_template.h b/accel/tcg/atomic_template.h index df9c8388178..287433d809b 100644 --- a/accel/tcg/atomic_template.h +++ b/accel/tcg/atomic_template.h @@ -149,7 +149,7 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ul= ong addr, =20 #define GEN_ATOMIC_HELPER(X) \ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \ - ABI_TYPE val EXTRA_ARGS) \ + ABI_TYPE val EXTRA_ARGS) \ { \ ATOMIC_MMU_DECLS; \ DATA_TYPE *haddr =3D ATOMIC_MMU_LOOKUP; \ --=20 2.20.1 From nobody Wed Apr 16 05:34:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1568390746; cv=none; d=zoho.com; s=zohoarc; b=EgcpTTHMSw1brF9ViGruUq9bpxh0yIZSPheQLoc2bN8DjBGvcVj+bikcDSMkJoDZRiO1CJ3WE3dEukV8DaooEnBjd6Uqm2yJ7eYfJcsXxS8IkZlOESpTfQTat2CAWssdtKBLEYIufPgkJh0OyYKkWyO6Ct6chX56BrxwbEgEAvs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568390746; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=XHMEXELdIZRBVl09t8dOMHyxzcdLPFS97t3fxrMkdCw=; b=b3Zf/0SPMmMi9sR5QuT1eSDr7KT9QVDAoyeYqJAQ7WdzMaKpPrUmT7x6D3TGEOWGf8PLYxGCSQSzLhnqaI/KG4/PdB0VVrlHIEJ9AHw4xmXwB37wIeZ+bE5I/kSpN1hPZ0QOplzbp03QJsls30MlL5L1hwlT1tZdiE/UM/I5COg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568390746531388.0205151360101; Fri, 13 Sep 2019 09:05:46 -0700 (PDT) Received: from localhost ([::1]:45830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8o4u-0006Me-Mr for importer@patchew.org; Fri, 13 Sep 2019 12:05:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57176) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8nps-0007ih-6x for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8npp-0000yT-I0 for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:11 -0400 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]:40051) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i8npp-0000w4-Al for qemu-devel@nongnu.org; Fri, 13 Sep 2019 11:50:09 -0400 Received: by mail-wr1-x444.google.com with SMTP id l3so9862489wru.7 for ; Fri, 13 Sep 2019 08:50:09 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c132sm3562207wme.27.2019.09.13.08.50.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2019 08:50:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=XHMEXELdIZRBVl09t8dOMHyxzcdLPFS97t3fxrMkdCw=; b=JjbFDp8lwhVzvN6P3C8rODYnfTRLhDSoa+I+R6s6lhmKtMdVp4EVKmLo0rEan+m0Az ysbUQTdNoxzODIBc2yrzlCLsIvIdmDgpsJZA/Cee8IxzV0mFrT7ZnWRHGAdScH6uK7Ja d9sSycpq6sf6y1NCN4bBfODhqaM/KsrNuU/I0sBTKYgK1WYriXQP/voqYZJl3Q0S2iSs VJzutAmNkwxXk44QSfAHODcTLGFer9IQcuPsHHg0KtOsU8RBiwyJ4FDKSm+m929Mnc1L yExQsKtr2Fg+y2Bx4vdrCQ0GF9/CRLys9/juqMuwE6k/ccnSPOUAVSTR1hUNWW/DJzYq 7V9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XHMEXELdIZRBVl09t8dOMHyxzcdLPFS97t3fxrMkdCw=; b=k/9ZyZvBE7c+TOCtt5vj3WialJr9ARtF97kR5U14x6FLEo5hFs1D81APIcKORA378k p0v/Mixm+1rZKBR0mCcIGOvxDcBwrUWAMBZe/6axitzk7MtiQMJAxntJsbO1+yEhX9fc bBzu5tPT/rGClKP8ZcrjI0oEoRweP3cYVaH04pEGTiqIZCMvDuobd+xKP90VLM4rUO2V i0yxu8uBPupn8cjLDWt0cPz0xQsOvXb2kK0C+ZmQaomjPLDW5SdlQgMq3qJG3ydyureS Z6cTJcTRglsp3ja1VeYBWub1owmw8kuVk+foJRRFeDwqTkHXgjDz3OjJL4JgJEIP/pNZ yvlQ== X-Gm-Message-State: APjAAAU0K6xOfT+NOjGzyV0ctURFFzxS1BgQR3gA/S9vWBOiuR3uuDiH VRQKU52aUVR5+K4FWnx2bFSFDDvIl5Y9dw== X-Google-Smtp-Source: APXvYqwS7ABz8TKMi/5fzu6DromT7Oi4qTsE+gBSLuHShg5NDoFYpz+rlZj5sYerk9vMAXBK8BGRYA== X-Received: by 2002:adf:de03:: with SMTP id b3mr37700655wrm.14.1568389807928; Fri, 13 Sep 2019 08:50:07 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 13 Sep 2019 16:49:52 +0100 Message-Id: <20190913154952.27724-13-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190913154952.27724-1-peter.maydell@linaro.org> References: <20190913154952.27724-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::444 Subject: [Qemu-devel] [PULL 12/12] qemu-ga: Convert invocation documentation to rST X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The qemu-ga documentation is currently in qemu-ga.texi in Texinfo format, which we present to the user as: * a qemu-ga manpage * a section of the main qemu-doc HTML documentation Convert the documentation to rST format, and present it to the user as: * a qemu-ga manpage * part of the interop/ Sphinx manual Signed-off-by: Peter Maydell Reviewed-by: Michael Roth Tested-by: Michael Roth Message-id: 20190905131040.8350-1-peter.maydell@linaro.org --- Makefile | 24 ++++--- MAINTAINERS | 2 +- docs/conf.py | 18 ++--- docs/interop/conf.py | 7 ++ docs/interop/index.rst | 1 + docs/interop/qemu-ga.rst | 133 +++++++++++++++++++++++++++++++++++++ qemu-doc.texi | 5 -- qemu-ga.texi | 137 --------------------------------------- 8 files changed, 166 insertions(+), 161 deletions(-) create mode 100644 docs/interop/qemu-ga.rst delete mode 100644 qemu-ga.texi diff --git a/Makefile b/Makefile index b3528617e48..111082ce545 100644 --- a/Makefile +++ b/Makefile @@ -325,7 +325,7 @@ endif endif =20 ifdef BUILD_DOCS -DOCS=3Dqemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 +DOCS=3Dqemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 docs/intero= p/qemu-ga.8 DOCS+=3Ddocs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/= interop/qemu-qmp-ref.7 DOCS+=3Ddocs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/in= terop/qemu-ga-ref.7 DOCS+=3Ddocs/qemu-block-drivers.7 @@ -783,10 +783,11 @@ DESCS=3D endif =20 # Note that we manually filter-out the non-Sphinx documentation which -# is currently built into the docs/interop directory in the build tree. +# is currently built into the docs/interop directory in the build tree, +# and also any sphinx-built manpages. define install-manual =3D for d in $$(cd $(MANUAL_BUILDDIR) && find $1 -type d); do $(INSTALL_DIR) "= $(DESTDIR)$(qemu_docdir)/$$d"; done -for f in $$(cd $(MANUAL_BUILDDIR) && find $1 -type f -a '!' '(' -name 'qem= u-*-qapi.*' -o -name 'qemu-*-ref.*' ')' ); do $(INSTALL_DATA) "$(MANUAL_BUI= LDDIR)/$$f" "$(DESTDIR)$(qemu_docdir)/$$f"; done +for f in $$(cd $(MANUAL_BUILDDIR) && find $1 -type f -a '!' '(' -name '*.[= 0-9]' -o -name 'qemu-*-qapi.*' -o -name 'qemu-*-ref.*' ')' ); do $(INSTALL_= DATA) "$(MANUAL_BUILDDIR)/$$f" "$(DESTDIR)$(qemu_docdir)/$$f"; done endef =20 # Note that we deliberately do not install the "devel" manual: it is @@ -818,7 +819,7 @@ ifdef CONFIG_TRACE_SYSTEMTAP $(INSTALL_DATA) scripts/qemu-trace-stap.1 "$(DESTDIR)$(mandir)/man1" endif ifneq (,$(findstring qemu-ga,$(TOOLS))) - $(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8" + $(INSTALL_DATA) docs/interop/qemu-ga.8 "$(DESTDIR)$(mandir)/man8" $(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)" $(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)" $(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7" @@ -977,18 +978,22 @@ docs/version.texi: $(SRC_PATH)/VERSION config-host.mak sphinxdocs: $(MANUAL_BUILDDIR)/devel/index.html $(MANUAL_BUILDDIR)/interop= /index.html $(MANUAL_BUILDDIR)/specs/index.html =20 # Canned command to build a single manual -build-manual =3D $(call quiet-command,sphinx-build $(if $(V),,-q) -W -n -b= html -D version=3D$(VERSION) -D release=3D"$(FULL_VERSION)" -d .doctrees/$= 1 $(SRC_PATH)/docs/$1 $(MANUAL_BUILDDIR)/$1 ,"SPHINX","$(MANUAL_BUILDDIR)/$= 1") +# Arguments: $1 =3D manual name, $2 =3D Sphinx builder ('html' or 'man') +build-manual =3D $(call quiet-command,CONFDIR=3D"$(qemu_confdir)" sphinx-b= uild $(if $(V),,-q) -W -n -b $2 -D version=3D$(VERSION) -D release=3D"$(FUL= L_VERSION)" -d .doctrees/$1 $(SRC_PATH)/docs/$1 $(MANUAL_BUILDDIR)/$1 ,"SPH= INX","$(MANUAL_BUILDDIR)/$1") # We assume all RST files in the manual's directory are used in it manual-deps =3D $(wildcard $(SRC_PATH)/docs/$1/*.rst) $(SRC_PATH)/docs/$1/= conf.py $(SRC_PATH)/docs/conf.py =20 $(MANUAL_BUILDDIR)/devel/index.html: $(call manual-deps,devel) - $(call build-manual,devel) + $(call build-manual,devel,html) =20 $(MANUAL_BUILDDIR)/interop/index.html: $(call manual-deps,interop) - $(call build-manual,interop) + $(call build-manual,interop,html) =20 $(MANUAL_BUILDDIR)/specs/index.html: $(call manual-deps,specs) - $(call build-manual,specs) + $(call build-manual,specs,html) + +$(MANUAL_BUILDDIR)/interop/qemu-ga.8: $(call manual-deps,interop) + $(call build-manual,interop,man) =20 qemu-options.texi: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@= ") @@ -1013,7 +1018,6 @@ qemu.1: qemu-option-trace.texi qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi -qemu-ga.8: qemu-ga.texi docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi docs/qemu-cpu-models.7: docs/qemu-cpu-models.texi scripts/qemu-trace-stap.1: scripts/qemu-trace-stap.texi @@ -1026,7 +1030,7 @@ txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/= interop/qemu-ga-ref.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi \ qemu-tech.texi qemu-option-trace.texi \ - qemu-deprecated.texi qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ + qemu-deprecated.texi qemu-monitor.texi qemu-img-cmds.texi \ qemu-monitor-info.texi docs/qemu-block-drivers.texi \ docs/qemu-cpu-models.texi docs/security.texi =20 diff --git a/MAINTAINERS b/MAINTAINERS index 50eaf005f40..f0e30b5248c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2040,7 +2040,7 @@ QEMU Guest Agent M: Michael Roth S: Maintained F: qga/ -F: qemu-ga.texi +F: docs/interop/qemu-ga.rst F: scripts/qemu-guest-agent/ F: tests/test-qga.c F: docs/interop/qemu-ga-ref.texi diff --git a/docs/conf.py b/docs/conf.py index e46b299b71f..b7edb0666b5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -115,6 +115,14 @@ todo_include_todos =3D False # with "option::" in the document being processed. Turn that off. suppress_warnings =3D ["ref.option"] =20 +# The rst_epilog fragment is effectively included in every rST file. +# We use it to define substitutions based on build config that +# can then be used in the documentation. The fallback if the +# environment variable is not set is for the benefit of readthedocs +# style document building; our Makefile always sets the variable. +confdir =3D os.getenv('CONFDIR', "/etc/qemu") +rst_epilog =3D ".. |CONFDIR| replace:: ``" + confdir + "``\n" + # -- Options for HTML output ---------------------------------------------- =20 # The theme to use for HTML and HTML Help pages. See the documentation for @@ -192,14 +200,8 @@ latex_documents =3D [ =20 =20 # -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages =3D [ - (master_doc, 'qemu', u'QEMU Documentation', - [author], 1) -] - +# Individual manual/conf.py can override this to create man pages +man_pages =3D [] =20 # -- Options for Texinfo output ------------------------------------------- =20 diff --git a/docs/interop/conf.py b/docs/interop/conf.py index cf3c69d4a7e..e87b8c22bec 100644 --- a/docs/interop/conf.py +++ b/docs/interop/conf.py @@ -13,3 +13,10 @@ exec(compile(open(parent_config, "rb").read(), parent_co= nfig, 'exec')) # This slightly misuses the 'description', but is the best way to get # the manual title to appear in the sidebar. html_theme_options['description'] =3D u'System Emulation Management and In= teroperability Guide' + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages =3D [ + ('qemu-ga', 'qemu-ga', u'QEMU Guest Agent', + ['Michael Roth '], 8) +] diff --git a/docs/interop/index.rst b/docs/interop/index.rst index b4bfcab4171..3e33fb59332 100644 --- a/docs/interop/index.rst +++ b/docs/interop/index.rst @@ -15,5 +15,6 @@ Contents: bitmaps live-block-operations pr-helper + qemu-ga vhost-user vhost-user-gpu diff --git a/docs/interop/qemu-ga.rst b/docs/interop/qemu-ga.rst new file mode 100644 index 00000000000..1313a4ae1c9 --- /dev/null +++ b/docs/interop/qemu-ga.rst @@ -0,0 +1,133 @@ +QEMU Guest Agent +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Synopsis +-------- + +**qemu-ga** [*OPTIONS*] + +Description +----------- + +The QEMU Guest Agent is a daemon intended to be run within virtual +machines. It allows the hypervisor host to perform various operations +in the guest, such as: + +- get information from the guest +- set the guest's system time +- read/write a file +- sync and freeze the filesystems +- suspend the guest +- reconfigure guest local processors +- set user's password +- ... + +qemu-ga will read a system configuration file on startup (located at +|CONFDIR|\ ``/qemu-ga.conf`` by default), then parse remaining +configuration options on the command line. For the same key, the last +option wins, but the lists accumulate (see below for configuration +file format). + +Options +------- + +.. program:: qemu-ga + +.. option:: -m, --method=3DMETHOD + + Transport method: one of ``unix-listen``, ``virtio-serial``, or + ``isa-serial`` (``virtio-serial`` is the default). + +.. option:: -p, --path=3DPATH + + Device/socket path (the default for virtio-serial is + ``/dev/virtio-ports/org.qemu.guest_agent.0``, + the default for isa-serial is ``/dev/ttyS0``) + +.. option:: -l, --logfile=3DPATH + + Set log file path (default is stderr). + +.. option:: -f, --pidfile=3DPATH + + Specify pid file (default is ``/var/run/qemu-ga.pid``). + +.. option:: -F, --fsfreeze-hook=3DPATH + + Enable fsfreeze hook. Accepts an optional argument that specifies + script to run on freeze/thaw. Script will be called with + 'freeze'/'thaw' arguments accordingly (default is + |CONFDIR|\ ``/fsfreeze-hook``). If using -F with an argument, do + not follow -F with a space (for example: + ``-F/var/run/fsfreezehook.sh``). + +.. option:: -t, --statedir=3DPATH + + Specify the directory to store state information (absolute paths only, + default is ``/var/run``). + +.. option:: -v, --verbose + + Log extra debugging information. + +.. option:: -V, --version + + Print version information and exit. + +.. option:: -d, --daemon + + Daemonize after startup (detach from terminal). + +.. option:: -b, --blacklist=3DLIST + + Comma-separated list of RPCs to disable (no spaces, ``?`` to list + available RPCs). + +.. option:: -D, --dump-conf + + Dump the configuration in a format compatible with ``qemu-ga.conf`` + and exit. + +.. option:: -h, --help + + Display this help and exit. + +Files +----- + + +The syntax of the ``qemu-ga.conf`` configuration file follows the +Desktop Entry Specification, here is a quick summary: it consists of +groups of key-value pairs, interspersed with comments. + +:: + + # qemu-ga configuration sample + [general] + daemonize =3D 0 + pidfile =3D /var/run/qemu-ga.pid + verbose =3D 0 + method =3D virtio-serial + path =3D /dev/virtio-ports/org.qemu.guest_agent.0 + statedir =3D /var/run + +The list of keys follows the command line options: + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Key Key type +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +daemon boolean +method string +path string +logfile string +pidfile string +fsfreeze-hook string +statedir string +verbose boolean +blacklist string list +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +See also +-------- + +:manpage:`qemu(1)` diff --git a/qemu-doc.texi b/qemu-doc.texi index b47e89cfca6..2ba6c90c083 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -2535,11 +2535,6 @@ so should only be used with trusted guest OS. =20 @c man end =20 -@node QEMU Guest Agent -@chapter QEMU Guest Agent invocation - -@include qemu-ga.texi - @node QEMU User space emulator @chapter QEMU User space emulator =20 diff --git a/qemu-ga.texi b/qemu-ga.texi deleted file mode 100644 index f00ad830f28..00000000000 --- a/qemu-ga.texi +++ /dev/null @@ -1,137 +0,0 @@ -@example -@c man begin SYNOPSIS -@command{qemu-ga} [@var{OPTIONS}] -@c man end -@end example - -@c man begin DESCRIPTION - -The QEMU Guest Agent is a daemon intended to be run within virtual -machines. It allows the hypervisor host to perform various operations -in the guest, such as: - -@itemize -@item -get information from the guest -@item -set the guest's system time -@item -read/write a file -@item -sync and freeze the filesystems -@item -suspend the guest -@item -reconfigure guest local processors -@item -set user's password -@item -... -@end itemize - -qemu-ga will read a system configuration file on startup (located at -@file{@value{CONFDIR}/qemu-ga.conf} by default), then parse remaining -configuration options on the command line. For the same key, the last -option wins, but the lists accumulate (see below for configuration -file format). - -@c man end - -@c man begin OPTIONS -@table @option -@item -m, --method=3D@var{method} - Transport method: one of @samp{unix-listen}, @samp{virtio-serial}, or - @samp{isa-serial} (@samp{virtio-serial} is the default). - -@item -p, --path=3D@var{path} - Device/socket path (the default for virtio-serial is - @samp{/dev/virtio-ports/org.qemu.guest_agent.0}, - the default for isa-serial is @samp{/dev/ttyS0}) - -@item -l, --logfile=3D@var{path} - Set log file path (default is stderr). - -@item -f, --pidfile=3D@var{path} - Specify pid file (default is @samp{/var/run/qemu-ga.pid}). - -@item -F, --fsfreeze-hook=3D@var{path} - Enable fsfreeze hook. Accepts an optional argument that specifies - script to run on freeze/thaw. Script will be called with - 'freeze'/'thaw' arguments accordingly (default is - @samp{@value{CONFDIR}/fsfreeze-hook}). If using -F with an argument, do - not follow -F with a space (for example: - @samp{-F/var/run/fsfreezehook.sh}). - -@item -t, --statedir=3D@var{path} - Specify the directory to store state information (absolute paths only, - default is @samp{/var/run}). - -@item -v, --verbose - Log extra debugging information. - -@item -V, --version - Print version information and exit. - -@item -d, --daemon - Daemonize after startup (detach from terminal). - -@item -b, --blacklist=3D@var{list} - Comma-separated list of RPCs to disable (no spaces, @samp{?} to list - available RPCs). - -@item -D, --dump-conf - Dump the configuration in a format compatible with @file{qemu-ga.conf} - and exit. - -@item -h, --help - Display this help and exit. -@end table - -@c man end - -@c man begin FILES - -The syntax of the @file{qemu-ga.conf} configuration file follows the -Desktop Entry Specification, here is a quick summary: it consists of -groups of key-value pairs, interspersed with comments. - -@example -# qemu-ga configuration sample -[general] -daemonize =3D 0 -pidfile =3D /var/run/qemu-ga.pid -verbose =3D 0 -method =3D virtio-serial -path =3D /dev/virtio-ports/org.qemu.guest_agent.0 -statedir =3D /var/run -@end example - -The list of keys follows the command line options: -@table @option -@item daemon=3D boolean -@item method=3D string -@item path=3D string -@item logfile=3D string -@item pidfile=3D string -@item fsfreeze-hook=3D string -@item statedir=3D string -@item verbose=3D boolean -@item blacklist=3D string list -@end table - -@c man end - -@ignore - -@setfilename qemu-ga -@settitle QEMU Guest Agent - -@c man begin AUTHOR -Michael Roth -@c man end - -@c man begin SEEALSO -qemu(1) -@c man end - -@end ignore --=20 2.20.1