From nobody Mon May 13 22:31:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1602602316; cv=none; d=zohomail.com; s=zohoarc; b=Obpx6jwEkGOJU9uagz0vyHi+ZbjGMInMHTi8rDJkSRw3auwyQ+f3o9KNzJJ9absnRdvjSWM4dP6W6HseBnwc2iDJjXO/94jmIxp4zAPNPPQuyVvt9F7ah9c+zwNKuXo6Lgv4mh9p4DrCrD6fBLgU6548VuZig9WJeMgBFtcTBH8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602602316; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=jL5eH93gytn/rEo1yDPNgWT7WRTxhvaGUaO6U6CeUNc=; b=eqYpJWeCCkzfDNXUuVrLAhpmLP8e9EcgyDkZoHwjaIxCQP4Oork4sdfSEvWWUoo9I5JOnUbuh5ZxfHsveJT0pSMD34FjqcGf71zBZ5n3gRXZfXSANCdwnQdxIJNiSSIW9GxJfNjHCnFqDb2xu2XHOBbg987IGftPIl9wLy64WRA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass 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 1602602316427343.75613387745796; Tue, 13 Oct 2020 08:18:36 -0700 (PDT) Received: from localhost ([::1]:47942 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kSM4R-0007r2-LW for importer@patchew.org; Tue, 13 Oct 2020 11:18:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52470) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kSM2Y-00067p-RV for qemu-devel@nongnu.org; Tue, 13 Oct 2020 11:16:38 -0400 Received: from mail-qt1-x841.google.com ([2607:f8b0:4864:20::841]:43357) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kSM2V-0000B3-M8 for qemu-devel@nongnu.org; Tue, 13 Oct 2020 11:16:38 -0400 Received: by mail-qt1-x841.google.com with SMTP id e6so130671qtw.10 for ; Tue, 13 Oct 2020 08:16:35 -0700 (PDT) Received: from master.ht.home ([2607:fea8:e2a0:e950::5917]) by smtp.googlemail.com with ESMTPSA id g20sm55604qtq.51.2020.10.13.08.16.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2020 08:16:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jL5eH93gytn/rEo1yDPNgWT7WRTxhvaGUaO6U6CeUNc=; b=sJHnL9cQHxgx9jXtY8+6c8Ba5Ap7+LxO+kYv93gepMd8nZhEz24nYQctPLa/PZv3b0 BCee7q10R6oe9rQDbleDrFf+0IoSDPT7jO+2lYhhoHO0nZLgbeZNi7a1+ixS8kPXAMCa nVXlv4zZGWbDzQxtUArC2eI3QeVBWi35tMFjSuRzi2sZwCmPTikB5Z9wDx+jgiwpF5i2 bu9h33MyN39vyfNFPPyIGNVyXUwJJA9/g6TnYwaunun6UavpcI59dNzyouWwfc7Mer2v /xhQFvH5N9d0K4r1//Tfw6VaMiucscBijNN4JrbfS3SxySz5XeTxe+hIRHfkPF3C7woh YfOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=jL5eH93gytn/rEo1yDPNgWT7WRTxhvaGUaO6U6CeUNc=; b=sWvD6NMw6I3XcbnZIUr+s8IAd8gZOtXHdSxvNhxti+ZFvbqMssdV4vn4/Nt5bqJdnR YmUD6y4nD1pOWXSoteg3MsNDJzegJ6+cwjbQ7IsLHapMJNSXPpmmIh+23bjndHOPJCqI rT5W9NPG5tp5WhZJ/gJ4u8Y4r9/BlHYnaOSTcch20cL4HxtxSwMkDcJHPrT8faYPpkog wG4rgPPZCpvDC7QT5xxA/inuL8jxcOzEao6zYoHoymJ0GYCzcgOI8f/vlt2MHojT5eI/ vCI27/oHhDgoS29Xjcv2vNl+iMGjJ6ZQ0ajUg96RfABq658UERv0bNUQo9BtEkZlQFd6 VIFA== X-Gm-Message-State: AOAM530m05QUl0o0xLoRhTvNtTdL1Gd9e63DL2EYnvHOugptEEcNLnV1 NoZJM5h/hZwXv2b9aQLMTG/uTw== X-Google-Smtp-Source: ABdhPJz8URzs+ueTE7FAUQrXH7Yy4FrjEgh0ylJPl25/3Opd5uRTmzTm3X4YrsgZPJHU5Pz5LzTUFw== X-Received: by 2002:ac8:7b4d:: with SMTP id m13mr147867qtu.180.1602602194595; Tue, 13 Oct 2020 08:16:34 -0700 (PDT) From: Shashi Mallela To: peter.maydell@linaro.org, leif@nuviainc.com, rad@semihalf.com Subject: [PATCH v5 1/2] hw/watchdog: Implement SBSA watchdog device Date: Tue, 13 Oct 2020 11:16:30 -0400 Message-Id: <20201013151631.30678-2-shashi.mallela@linaro.org> X-Mailer: git-send-email 2.18.4 In-Reply-To: <20201013151631.30678-1-shashi.mallela@linaro.org> References: <20201013151631.30678-1-shashi.mallela@linaro.org> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2607:f8b0:4864:20::841; envelope-from=shashi.mallela@linaro.org; helo=mail-qt1-x841.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action 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: , Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Generic watchdog device model has been implemented as per ARM BSAv0.9 Signed-off-by: Shashi Mallela --- hw/arm/Kconfig | 1 + hw/watchdog/Kconfig | 4 + hw/watchdog/meson.build | 1 + hw/watchdog/wdt_sbsa_gwdt.c | 346 ++++++++++++++++++++++++++++ include/hw/watchdog/wdt_sbsa_gwdt.h | 70 ++++++ 5 files changed, 422 insertions(+) create mode 100644 hw/watchdog/wdt_sbsa_gwdt.c create mode 100644 include/hw/watchdog/wdt_sbsa_gwdt.h diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig index f303c6bead25..6b97e64595d3 100644 --- a/hw/arm/Kconfig +++ b/hw/arm/Kconfig @@ -210,6 +210,7 @@ config SBSA_REF select PL031 # RTC select PL061 # GPIO select USB_EHCI_SYSBUS + select WDT_SBSA_GWDT =20 config SABRELITE bool diff --git a/hw/watchdog/Kconfig b/hw/watchdog/Kconfig index 293209b291d6..ea9cadd66f22 100644 --- a/hw/watchdog/Kconfig +++ b/hw/watchdog/Kconfig @@ -17,3 +17,7 @@ config WDT_DIAG288 =20 config WDT_IMX2 bool + +config WDT_SBSA_GWDT + bool + default y if SBSA_REF diff --git a/hw/watchdog/meson.build b/hw/watchdog/meson.build index 9b8725e64288..a9a23307acfe 100644 --- a/hw/watchdog/meson.build +++ b/hw/watchdog/meson.build @@ -5,3 +5,4 @@ softmmu_ss.add(when: 'CONFIG_WDT_IB700', if_true: files('wd= t_ib700.c')) softmmu_ss.add(when: 'CONFIG_WDT_DIAG288', if_true: files('wdt_diag288.c')) softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('wdt_aspeed.c')) softmmu_ss.add(when: 'CONFIG_WDT_IMX2', if_true: files('wdt_imx2.c')) +softmmu_ss.add(when: 'CONFIG_WDT_SBSA_GWDT', if_true: files('wdt_sbsa_gwdt= .c')) diff --git a/hw/watchdog/wdt_sbsa_gwdt.c b/hw/watchdog/wdt_sbsa_gwdt.c new file mode 100644 index 000000000000..1c2fe04db7c7 --- /dev/null +++ b/hw/watchdog/wdt_sbsa_gwdt.c @@ -0,0 +1,346 @@ +/* + * Generic watchdog device model for SBSA + * + * Copyright Linaro.org 2020 + * + * Authors: + * Shashi Mallela + * + * This work is licensed under the terms of the GNU GPL, version 2 or (at = your + * option) any later version. See the COPYING file in the top-level direc= tory. + * + */ + +#include "qemu/osdep.h" +#include "sysemu/reset.h" +#include "sysemu/watchdog.h" +#include "hw/watchdog/wdt_sbsa_gwdt.h" +#include "qemu/timer.h" +#include "migration/vmstate.h" +#include "qemu/log.h" +#include "qemu/module.h" + +static WatchdogTimerModel model =3D { + .wdt_name =3D TYPE_WDT_SBSA_GWDT, + .wdt_description =3D "sbsa_gwdt device for sbsa_ref platform", +}; + +static const VMStateDescription vmstate_sbsa_gwdt =3D { + .name =3D "vmstate_sbsa_gwdt", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_TIMER_PTR(timer, SBSA_GWDTState), + VMSTATE_BOOL(enabled, SBSA_GWDTState), + VMSTATE_BOOL(ws0, SBSA_GWDTState), + VMSTATE_BOOL(ws1, SBSA_GWDTState), + VMSTATE_UINT32(wrr, SBSA_GWDTState), + VMSTATE_UINT32(wcs, SBSA_GWDTState), + VMSTATE_UINT32(worl, SBSA_GWDTState), + VMSTATE_UINT32(woru, SBSA_GWDTState), + VMSTATE_UINT32(wcvl, SBSA_GWDTState), + VMSTATE_UINT32(wcvu, SBSA_GWDTState), + VMSTATE_END_OF_LIST() + } +}; + +static uint64_t sbsa_gwdt_rread(void *opaque, hwaddr addr, unsigned int si= ze) +{ + uint32_t ret =3D 0; + + if (addr =3D=3D SBSA_GWDT_WRR) { + /* watch refresh read has no effect and returns 0 */ + ret =3D 0; + } else { + qemu_log_mask(LOG_GUEST_ERROR, "bad address in refresh frame read = :" + " 0x%x\n", (int)addr); + } + return ret; +} + +static uint64_t sbsa_gwdt_read(void *opaque, hwaddr addr, unsigned int siz= e) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(opaque); + uint32_t ret =3D 0; + + switch (addr) { + case SBSA_GWDT_WCS: + ret =3D s->wcs; + break; + case SBSA_GWDT_WOR: + ret =3D s->worl; + break; + case SBSA_GWDT_WORU: + ret =3D s->woru; + break; + case SBSA_GWDT_WCV: + ret =3D s->wcvl; + break; + case SBSA_GWDT_WCVU: + ret =3D s->wcvu; + break; + case SBSA_GWDT_W_IIDR: + ret =3D s->id; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "bad address in control frame read = :" + " 0x%x\n", (int)addr); + } + return ret; +} + +static void sbsa_gwdt_update_timer(SBSA_GWDTState *s) +{ + uint64_t timeout =3D 0; + + if (s->enabled) { + /* + * Extract the upper 16 bits from woru & 32 bits from worl + * registers to construct the 48 bit offset value + */ + timeout =3D s->woru & SBSA_GWDT_WOR_MASK; + timeout <<=3D 32; + timeout |=3D s->worl; + timeout =3D muldiv64(timeout, NANOSECONDS_PER_SECOND, SBSA_TIMER_F= REQ); + timeout +=3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + + /* store the current timeout value into compare registers */ + s->wcvu =3D timeout >> 32; + s->wcvl =3D timeout; + + if (!s->ws0) { + timer_del(s->timer); + timer_mod(s->ptimer, timeout); + } else { + timer_del(s->ptimer); + timer_mod(s->timer, timeout); + } + } else { + timer_del(s->ptimer); + timer_del(s->timer); + } +} + +static void sbsa_gwdt_rwrite(void *opaque, hwaddr offset, uint64_t data, + unsigned size) { + SBSA_GWDTState *s =3D SBSA_GWDT(opaque); + + if (offset =3D=3D SBSA_GWDT_WRR) { + s->wrr =3D data; + s->wcs &=3D ~SBSA_GWDT_WCS_WS0; + s->wcs &=3D ~SBSA_GWDT_WCS_WS1; + s->ws0 =3D false; + s->ws1 =3D false; + sbsa_gwdt_update_timer(s); + } else { + qemu_log_mask(LOG_GUEST_ERROR, "bad address in refresh frame write= :" + " 0x%x\n", (int)offset); + } +} + +static void sbsa_gwdt_write(void *opaque, hwaddr offset, uint64_t data, + unsigned size) { + SBSA_GWDTState *s =3D SBSA_GWDT(opaque); + bool enable; + + switch (offset) { + case SBSA_GWDT_WCS: + enable =3D data & SBSA_GWDT_WCS_EN; + if (enable) { + s->wcs |=3D SBSA_GWDT_WCS_EN; + s->enabled =3D true; + } else { + s->wcs &=3D ~SBSA_GWDT_WCS_EN; + s->enabled =3D false; + } + s->ws0 =3D false; + s->ws1 =3D false; + s->wcs &=3D ~SBSA_GWDT_WCS_WS0; + s->wcs &=3D ~SBSA_GWDT_WCS_WS1; + sbsa_gwdt_update_timer(s); + break; + + case SBSA_GWDT_WOR: + s->worl =3D data; + s->ws0 =3D false; + s->ws1 =3D false; + s->wcs &=3D ~SBSA_GWDT_WCS_WS0; + s->wcs &=3D ~SBSA_GWDT_WCS_WS1; + /* + * TODO:- setting woru to 0 and triggering update timer(below) is a + * temporary workaround to handle current linux driver which is + * based on earlier version of BSA specification.Once the linux + * driver is updated to BSA v0.9 will remove these next 2 lines. + */ + s->woru =3D 0; + sbsa_gwdt_update_timer(s); + break; + + case SBSA_GWDT_WORU: + s->woru =3D data; + s->ws0 =3D false; + s->ws1 =3D false; + s->wcs &=3D ~SBSA_GWDT_WCS_WS0; + s->wcs &=3D ~SBSA_GWDT_WCS_WS1; + sbsa_gwdt_update_timer(s); + break; + + case SBSA_GWDT_WCV: + s->wcvl =3D data; + break; + + case SBSA_GWDT_WCVU: + s->wcvu =3D data; + break; + + default: + qemu_log_mask(LOG_GUEST_ERROR, "bad address in control frame write= :" + " 0x%x\n", (int)offset); + } + return; +} + +static void wdt_sbsa_gwdt_reset(DeviceState *dev) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(dev); + + timer_del(s->ptimer); + timer_del(s->timer); + + s->enabled =3D false; + s->ws0 =3D false; + s->ws1 =3D false; + s->wcs &=3D ~SBSA_GWDT_WCS_EN; + s->wcs &=3D ~SBSA_GWDT_WCS_WS0; + s->wcs &=3D ~SBSA_GWDT_WCS_WS1; + s->wcvl =3D 0; + s->wcvu =3D 0; + s->worl =3D 0; + s->woru =3D 0; + s->id =3D SBSA_GWDT_ID; +} + +static void sbsa_gwdt_reset(void *opaque) +{ + DeviceState *sbsa_gwdt =3D opaque; + + wdt_sbsa_gwdt_reset(sbsa_gwdt); +} + +static void sbsa_gwdt_timer_sysinterrupt(void *opaque) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(opaque); + + s->wcs |=3D SBSA_GWDT_WCS_WS0; + s->ws0 =3D true; + qemu_set_irq(s->irq, 1); + sbsa_gwdt_update_timer(s); +} + +static void sbsa_gwdt_timer_sysreset(void *dev) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(dev); + + s->wcs |=3D SBSA_GWDT_WCS_WS1; + s->ws1 =3D true; + qemu_log_mask(CPU_LOG_RESET, "Watchdog timer expired.\n"); + /* + * Reset the watchdog only if the guest gets notified about + * expiry. watchdog_perform_action() may temporarily relinquish + * the BQL; reset before triggering the action to avoid races with + * sbsa_gwdt instructions. + */ + switch (get_watchdog_action()) { + case WATCHDOG_ACTION_DEBUG: + case WATCHDOG_ACTION_NONE: + case WATCHDOG_ACTION_PAUSE: + break; + default: + wdt_sbsa_gwdt_reset(dev); + } + watchdog_perform_action(); +} + +static const MemoryRegionOps sbsa_gwdt_rops =3D { + .read =3D sbsa_gwdt_rread, + .write =3D sbsa_gwdt_rwrite, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .valid.unaligned =3D false, +}; + +static const MemoryRegionOps sbsa_gwdt_ops =3D { + .read =3D sbsa_gwdt_read, + .write =3D sbsa_gwdt_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .valid.unaligned =3D false, +}; + +static void wdt_sbsa_gwdt_realize(DeviceState *dev, Error **errp) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + + memory_region_init_io(&s->rmmio, OBJECT(dev), + &sbsa_gwdt_rops, s, + "sbsa_gwdt.refresh", + SBSA_GWDT_RMMIO_SIZE); + + memory_region_init_io(&s->cmmio, OBJECT(dev), + &sbsa_gwdt_ops, s, + "sbsa_gwdt.control", + SBSA_GWDT_CMMIO_SIZE); + + sysbus_init_mmio(sbd, &s->rmmio); + sysbus_init_mmio(sbd, &s->cmmio); + + sysbus_init_irq(sbd, &s->irq); + + qemu_register_reset(sbsa_gwdt_reset, s); + + s->ptimer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, sbsa_gwdt_timer_sysinte= rrupt, + dev); + s->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, sbsa_gwdt_timer_sysreset, + dev); +} + +static void wdt_sbsa_gwdt_unrealize(DeviceState *dev) +{ + SBSA_GWDTState *s =3D SBSA_GWDT(dev); + + timer_del(s->ptimer); + timer_free(s->ptimer); + + timer_del(s->timer); + timer_free(s->timer); +} + +static void wdt_sbsa_gwdt_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D wdt_sbsa_gwdt_realize; + dc->unrealize =3D wdt_sbsa_gwdt_unrealize; + dc->reset =3D wdt_sbsa_gwdt_reset; + dc->hotpluggable =3D false; + set_bit(DEVICE_CATEGORY_MISC, dc->categories); + dc->vmsd =3D &vmstate_sbsa_gwdt; +} + +static const TypeInfo wdt_sbsa_gwdt_info =3D { + .class_init =3D wdt_sbsa_gwdt_class_init, + .parent =3D TYPE_SYS_BUS_DEVICE, + .name =3D TYPE_WDT_SBSA_GWDT, + .instance_size =3D sizeof(SBSA_GWDTState), +}; + +static void wdt_sbsa_gwdt_register_types(void) +{ + watchdog_add_model(&model); + type_register_static(&wdt_sbsa_gwdt_info); +} + +type_init(wdt_sbsa_gwdt_register_types) diff --git a/include/hw/watchdog/wdt_sbsa_gwdt.h b/include/hw/watchdog/wdt_= sbsa_gwdt.h new file mode 100644 index 000000000000..70ba7abb3ace --- /dev/null +++ b/include/hw/watchdog/wdt_sbsa_gwdt.h @@ -0,0 +1,70 @@ +#ifndef WDT_SBSA_GWDT_H +#define WDT_SBSA_GWDT_H + +#include "qemu/bitops.h" +#include "hw/sysbus.h" +#include "hw/irq.h" + +#define TYPE_WDT_SBSA_GWDT "sbsa_gwdt" +#define SBSA_GWDT(obj) \ + OBJECT_CHECK(SBSA_GWDTState, (obj), TYPE_WDT_SBSA_GWDT) +#define SBSA_GWDT_CLASS(klass) \ + OBJECT_CLASS_CHECK(SBSA_GWDTClass, (klass), TYPE_WDT_SBSA_GWDT) +#define SBSA_GWDT_GET_CLASS(obj) \ + OBJECT_GET_CLASS(SBSA_GWDTClass, (obj), TYPE_WDT_SBSA_GWDT) + +/* SBSA Generic Watchdog register definitions */ +/* refresh frame */ +#define SBSA_GWDT_WRR 0x000 + +/* control frame */ +#define SBSA_GWDT_WCS 0x000 +#define SBSA_GWDT_WOR 0x008 +#define SBSA_GWDT_WORU 0x00C +#define SBSA_GWDT_WCV 0x010 +#define SBSA_GWDT_WCVU 0x014 + +/* Watchdog Interface Identification Register */ +#define SBSA_GWDT_W_IIDR 0xFCC + +/* Watchdog Control and Status Register Bits */ +#define SBSA_GWDT_WCS_EN BIT(0) +#define SBSA_GWDT_WCS_WS0 BIT(1) +#define SBSA_GWDT_WCS_WS1 BIT(2) + +#define SBSA_GWDT_WOR_MASK 0x0000FFFF + +/* Watchdog Interface Identification Register definition*/ +#define SBSA_GWDT_ID 0x1043B + +/* 2 Separate memory regions for each of refresh & control register frames= */ +#define SBSA_GWDT_RMMIO_SIZE 0x1000 +#define SBSA_GWDT_CMMIO_SIZE 0x1000 + +#define SBSA_TIMER_FREQ 62500000 /* Hz */ + +typedef struct SBSA_GWDTState { + /* */ + SysBusDevice parent_obj; + + /*< public >*/ + MemoryRegion rmmio; + MemoryRegion cmmio; + qemu_irq irq; + + QEMUTimer *ptimer, *timer; + + uint32_t id; + uint32_t wrr; + uint32_t wcs; + uint32_t worl; + uint32_t woru; + uint32_t wcvl; + uint32_t wcvu; + bool enabled; + bool ws0, ws1; + + /*< public >*/ +} SBSA_GWDTState; + +#endif /* WDT_SBSA_GWDT_H */ --=20 2.18.4 From nobody Mon May 13 22:31:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1602602316; cv=none; d=zohomail.com; s=zohoarc; b=dzkASozEBBVWxlst+G0HcMTNeVqJNJEucBr3BH3bdCXXvgUcaXqRUAm/ebrMBfdjpEv1fdDL/WOnDwFLgpgzt6rt/xtVdxdQBVqTXQnMTPw/rBfxhnGj3yBss4c/XFbhgwKqmH1oVoZIocfDJ1gmcl9EgOOnBY3VCHu47k1N0e8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602602316; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=it2mshTNIXoFp9WiwmrCTKmpiiTPTprast5n2192OiQ=; b=NTQTxCn90mASQSbX9dHlePimYd0X+zyoNvh5r1ASu63ur7vZQPZr2XGfpYsnxESLILwO6GbHnNsoaymcTS37nvJYPuY8H2zOJQ/OchTb44dLjfYMUEJPpxW63MiE5tCjaxPegWY4ENXh3vT9OBubGaxbOvl4GRujUZRaL1l6+h4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass 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 16026023164771008.003732957183; Tue, 13 Oct 2020 08:18:36 -0700 (PDT) Received: from localhost ([::1]:47954 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kSM4R-0007rH-Pz for importer@patchew.org; Tue, 13 Oct 2020 11:18:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52480) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kSM2Z-000698-FT for qemu-devel@nongnu.org; Tue, 13 Oct 2020 11:16:39 -0400 Received: from mail-qt1-x841.google.com ([2607:f8b0:4864:20::841]:43358) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kSM2X-0000BV-6O for qemu-devel@nongnu.org; Tue, 13 Oct 2020 11:16:39 -0400 Received: by mail-qt1-x841.google.com with SMTP id e6so130729qtw.10 for ; Tue, 13 Oct 2020 08:16:36 -0700 (PDT) Received: from master.ht.home ([2607:fea8:e2a0:e950::5917]) by smtp.googlemail.com with ESMTPSA id g20sm55604qtq.51.2020.10.13.08.16.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2020 08:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=it2mshTNIXoFp9WiwmrCTKmpiiTPTprast5n2192OiQ=; b=ONglAIWJN2PsixZMD6H3fnRyZCSsV6LFmiTsqyJnYS4mCwCySk3aWKcFt3iYcKC5HK b468fIa4Z25OEBcOfXeR30ziTK2iQdy5VhBKxZ0d3ceIxz9NgvPdI3mUQmI5w3AB2pzc VuPeFARug87MDYJR73Pq7xFgKzA2WLzRjheLAwhjgv00O9eYaT0xg3cvTWH5npkeHs2K IUqcRQ39hBvPbaZXcRjlx1TXoNCzNDRlfxbne2t6iPnB18Vlo8MjuhA1RA6bfEUrheJq X3Gh8WxRAW3UmNT6Qu2xxvoJF6oKifIQwQKKzNOwAXCOdOmsgiCULSxhUrwqb1rQw69B oH7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=it2mshTNIXoFp9WiwmrCTKmpiiTPTprast5n2192OiQ=; b=JbmeGvIpvxsNhuujXbfdip4i/NvCP8cOg9r6prHfG48G78rYhCniBcIFSarpazP/n5 QycGPJ16sNrfK5MFZuBfWd4dBcZLz11XGIzxtG/hymsoHfWLTzYWvs/MHNi3oHPxpQjG id7gQ2VR2PrhkoTImTDho9wtJiOI/unCRfSdJA0WD0JFXV2Mjyjg1vH5GNXNX2OeQvKY X3dmtESBkdeEUKzN9J09og9QDiJFgIGtdThy7PNA2M07pZNBGtqgrpMSzdpstQ/8dAsE 0V5SKcFXzPBZUr+KvIKUYQtRj6noTmVP8+VtQzO/DC1lFtEOU5svji9cwxlrHlnw+YXz Ujzg== X-Gm-Message-State: AOAM531EoZGP4+my4nbtwbJ41SGXOcex0NXVoZUWEEwJapeTFjKMCg2X bMTN0xOxrXYOfNogN5UcFv+fmQ== X-Google-Smtp-Source: ABdhPJxK0LUSbq0jaGSK5Dwx4Uk24C3e8wgu87Yy+omKikC/+fnjuz7CbDVibdetZt95Lx0xmMihvA== X-Received: by 2002:ac8:1a6f:: with SMTP id q44mr154792qtk.136.1602602195827; Tue, 13 Oct 2020 08:16:35 -0700 (PDT) From: Shashi Mallela To: peter.maydell@linaro.org, leif@nuviainc.com, rad@semihalf.com Subject: [PATCH v5 2/2] hw/arm/sbsa-ref: add SBSA watchdog device Date: Tue, 13 Oct 2020 11:16:31 -0400 Message-Id: <20201013151631.30678-3-shashi.mallela@linaro.org> X-Mailer: git-send-email 2.18.4 In-Reply-To: <20201013151631.30678-1-shashi.mallela@linaro.org> References: <20201013151631.30678-1-shashi.mallela@linaro.org> Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2607:f8b0:4864:20::841; envelope-from=shashi.mallela@linaro.org; helo=mail-qt1-x841.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: , Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Included the newly implemented SBSA generic watchdog device model into SBSA platform Signed-off-by: Shashi Mallela --- hw/arm/sbsa-ref.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c index 9c3a893bedfd..97ed41607119 100644 --- a/hw/arm/sbsa-ref.c +++ b/hw/arm/sbsa-ref.c @@ -30,6 +30,7 @@ #include "exec/hwaddr.h" #include "kvm_arm.h" #include "hw/arm/boot.h" +#include "hw/arm/fdt.h" #include "hw/block/flash.h" #include "hw/boards.h" #include "hw/ide/internal.h" @@ -40,6 +41,7 @@ #include "hw/qdev-properties.h" #include "hw/usb.h" #include "hw/char/pl011.h" +#include "hw/watchdog/wdt_sbsa_gwdt.h" #include "net/net.h" #include "qom/object.h" =20 @@ -64,6 +66,9 @@ enum { SBSA_GIC_DIST, SBSA_GIC_REDIST, SBSA_SECURE_EC, + SBSA_GWDT, + SBSA_GWDT_REFRESH, + SBSA_GWDT_CONTROL, SBSA_SMMU, SBSA_UART, SBSA_RTC, @@ -104,6 +109,8 @@ static const MemMapEntry sbsa_ref_memmap[] =3D { [SBSA_GIC_DIST] =3D { 0x40060000, 0x00010000 }, [SBSA_GIC_REDIST] =3D { 0x40080000, 0x04000000 }, [SBSA_SECURE_EC] =3D { 0x50000000, 0x00001000 }, + [SBSA_GWDT_REFRESH] =3D { 0x50010000, 0x00001000 }, + [SBSA_GWDT_CONTROL] =3D { 0x50011000, 0x00001000 }, [SBSA_UART] =3D { 0x60000000, 0x00001000 }, [SBSA_RTC] =3D { 0x60010000, 0x00001000 }, [SBSA_GPIO] =3D { 0x60020000, 0x00001000 }, @@ -133,6 +140,8 @@ static const int sbsa_ref_irqmap[] =3D { [SBSA_SECURE_UART_MM] =3D 9, [SBSA_AHCI] =3D 10, [SBSA_EHCI] =3D 11, + [SBSA_SMMU] =3D 12, /* ... to 15 */ + [SBSA_GWDT] =3D 16, }; =20 static uint64_t sbsa_ref_cpu_mp_affinity(SBSAMachineState *sms, int idx) @@ -141,6 +150,30 @@ static uint64_t sbsa_ref_cpu_mp_affinity(SBSAMachineSt= ate *sms, int idx) return arm_cpu_mp_affinity(idx, clustersz); } =20 +static void create_wdt_fdt(SBSAMachineState *sms) +{ + char *nodename; + const char compat[] =3D "arm,sbsa-gwdt"; + + hwaddr rbase =3D sbsa_ref_memmap[SBSA_GWDT_REFRESH].base; + hwaddr cbase =3D sbsa_ref_memmap[SBSA_GWDT_CONTROL].base; + int irq =3D sbsa_ref_irqmap[SBSA_GWDT]; + + nodename =3D g_strdup_printf("/watchdog@%" PRIx64, rbase); + qemu_fdt_add_subnode(sms->fdt, nodename); + + qemu_fdt_setprop(sms->fdt, nodename, "compatible", + compat, sizeof(compat)); + qemu_fdt_setprop_sized_cells(sms->fdt, nodename, "reg", + 2, rbase, 2, SBSA_GWDT_RMMIO_SIZE, + 2, cbase, 2, SBSA_GWDT_CMMIO_SIZE); + qemu_fdt_setprop_cells(sms->fdt, nodename, "interrupts", + GIC_FDT_IRQ_TYPE_PPI, irq, + GIC_FDT_IRQ_FLAGS_LEVEL_HI); + qemu_fdt_setprop_cell(sms->fdt, nodename, "timeout-sec", 30); + g_free(nodename); +} + /* * Firmware on this machine only uses ACPI table to load OS, these limited * device tree nodes are just to let firmware know the info which varies f= rom @@ -219,6 +252,7 @@ static void create_fdt(SBSAMachineState *sms) =20 g_free(nodename); } + create_wdt_fdt(sms); } =20 #define SBSA_FLASH_SECTOR_SIZE (256 * KiB) @@ -447,6 +481,20 @@ static void create_rtc(const SBSAMachineState *sms) sysbus_create_simple("pl031", base, qdev_get_gpio_in(sms->gic, irq)); } =20 +static void create_wdt(const SBSAMachineState *sms) +{ + hwaddr rbase =3D sbsa_ref_memmap[SBSA_GWDT_REFRESH].base; + hwaddr cbase =3D sbsa_ref_memmap[SBSA_GWDT_CONTROL].base; + DeviceState *dev =3D qdev_new(TYPE_WDT_SBSA_GWDT); + SysBusDevice *s =3D SYS_BUS_DEVICE(dev); + int irq =3D sbsa_ref_irqmap[SBSA_GWDT]; + + sysbus_realize_and_unref(s, &error_fatal); + sysbus_mmio_map(s, 0, rbase); + sysbus_mmio_map(s, 1, cbase); + sysbus_connect_irq(s, 0, qdev_get_gpio_in(sms->gic, irq)); +} + static DeviceState *gpio_key_dev; static void sbsa_ref_powerdown_req(Notifier *n, void *opaque) { @@ -730,6 +778,8 @@ static void sbsa_ref_init(MachineState *machine) =20 create_rtc(sms); =20 + create_wdt(sms); + create_gpio(sms); =20 create_ahci(sms); --=20 2.18.4