Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1098290pxb; Thu, 4 Mar 2021 03:17:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJySfO21UGFwZR4cMEa9ZdbiPdosY0MTx9cFDarTSw656hn2XSO+dNnxvlhVsL9RFi1WMsQp X-Received: by 2002:aa7:de82:: with SMTP id j2mr3688436edv.313.1614856622709; Thu, 04 Mar 2021 03:17:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614856622; cv=none; d=google.com; s=arc-20160816; b=D7nkIrwF6iO43P8Q2nbuwn6LDP8GROGRiKIaCcH+GgmcXmG0vKz9QzoF0N6GjuUG31 EB7kygkEXmucakCSYcecOtwCc+APukgf/O7YbW8nV3TBH8GstcOsHkitOc+cftXvvLkv l2g9gqxbLic+W2MicPTWKw0hiSCNSzrm2vBDjI7hk3tTbga9gMBXxKhWMUm7WOxojZO6 O4KugVbYlLQqgAdkV8ugRVrxfg11qrbbEXWJ54dSTUHrncr/TsrgQMLbuauCx08vZR4O CN5Gkl8uxMr3nnP9f6dFv3UhjIxlHOu5vjnk8GPx1QOY1gxhpVffAoCPNIMLb+MGiTkg kQGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=G6lbQfmlb6rCm32Ta7S9dF78AqcsylZ7vlSqFPlWGA4=; b=OHPgCn2XJhch2C/6hpVCne8S9amT8rO3D/sXDQ0ExBYgJtrhQ2MCE8Up7SxkF/ui2R wnksCpiaqvmY8s0sr3Jm/cjR0WwiHZ91vgpgmD6lDwTEx216mLEO4z7+3AymkWz+Ek1I Rll2S3FQBZM00TZwD9LRIJt8MtHbsiQFHIOs9GjJTOKOpbzojCz1RRY4c9mULHobPx5a iHgxCf40Oa1wduMhOtDvKKrmUBWrzfcf6kmoA5bCASU4zd8M80nXTm8tOWIBfoysOGqA ay/lvZdhhAQbYxvBqVarC8hB7RuchyKImyJMelXjPse+2jrGOGZGnEyT6Fd5RHXWlrgG bbzA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x27si16411608ejb.603.2021.03.04.03.16.39; Thu, 04 Mar 2021 03:17:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348317AbhCCR5v (ORCPT + 99 others); Wed, 3 Mar 2021 12:57:51 -0500 Received: from lizzard.sbs.de ([194.138.37.39]:59106 "EHLO lizzard.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244212AbhCCO7G (ORCPT ); Wed, 3 Mar 2021 09:59:06 -0500 Received: from mail2.sbs.de (mail2.sbs.de [192.129.41.66]) by lizzard.sbs.de (8.15.2/8.15.2) with ESMTPS id 123EsV4n012168 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 3 Mar 2021 15:54:31 +0100 Received: from [139.22.114.127] ([139.22.114.127]) by mail2.sbs.de (8.15.2/8.15.2) with ESMTP id 123EnUe4025084; Wed, 3 Mar 2021 15:49:31 +0100 Subject: Re: [PATCH 3/4] watchdog: simatic-ipc-wdt: add new driver for Siemens Industrial PCs To: Henning Schild , Guenter Roeck Cc: linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org, platform-driver-x86@vger.kernel.org, linux-watchdog@vger.kernel.org, Srikanth Krishnakar , Gerd Haeussler , Wim Van Sebroeck , Mark Gross , Hans de Goede , Pavel Machek References: <20210302163309.25528-1-henning.schild@siemens.com> <20210302163309.25528-4-henning.schild@siemens.com> <20210303152105.1ca683eb@md1za8fc.ad001.siemens.net> From: Jan Kiszka Message-ID: Date: Wed, 3 Mar 2021 15:49:30 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <20210303152105.1ca683eb@md1za8fc.ad001.siemens.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 03.03.21 15:21, Henning Schild wrote: > Hi, > > thanks for the fast and thorough review! > > Am Tue, 2 Mar 2021 10:38:19 -0800 > schrieb Guenter Roeck : > >> On 3/2/21 8:33 AM, Henning Schild wrote: >>> From: Henning Schild >>> >>> This driver adds initial support for several devices from Siemens. >>> It is based on a platform driver introduced in an earlier commit. >>> >>> Signed-off-by: Gerd Haeussler >>> Signed-off-by: Henning Schild >>> --- >>> drivers/watchdog/Kconfig | 11 ++ >>> drivers/watchdog/Makefile | 1 + >>> drivers/watchdog/simatic-ipc-wdt.c | 305 >>> +++++++++++++++++++++++++++++ 3 files changed, 317 insertions(+) >>> create mode 100644 drivers/watchdog/simatic-ipc-wdt.c >>> >>> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig >>> index 1fe0042a48d2..948497eb4bef 100644 >>> --- a/drivers/watchdog/Kconfig >>> +++ b/drivers/watchdog/Kconfig >>> @@ -1575,6 +1575,17 @@ config NIC7018_WDT >>> To compile this driver as a module, choose M here: the >>> module will be called nic7018_wdt. >>> >>> +config SIEMENS_SIMATIC_IPC_WDT >>> + tristate "Siemens Simatic IPC Watchdog" >>> + depends on SIEMENS_SIMATIC_IPC >>> + select WATCHDOG_CORE >>> + help >>> + This driver adds support for several watchdogs found in >>> Industrial >>> + PCs from Siemens. >>> + >>> + To compile this driver as a module, choose M here: the >>> module will be >>> + called simatic-ipc-wdt. >>> + >>> # M68K Architecture >>> >>> config M54xx_WATCHDOG >>> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile >>> index f3a6540e725e..7f5c73ec058c 100644 >>> --- a/drivers/watchdog/Makefile >>> +++ b/drivers/watchdog/Makefile >>> @@ -142,6 +142,7 @@ obj-$(CONFIG_NI903X_WDT) += ni903x_wdt.o >>> obj-$(CONFIG_NIC7018_WDT) += nic7018_wdt.o >>> obj-$(CONFIG_MLX_WDT) += mlx_wdt.o >>> obj-$(CONFIG_KEEMBAY_WATCHDOG) += keembay_wdt.o >>> +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_WDT) += simatic-ipc-wdt.o >>> >>> # M68K Architecture >>> obj-$(CONFIG_M54xx_WATCHDOG) += m54xx_wdt.o >>> diff --git a/drivers/watchdog/simatic-ipc-wdt.c >>> b/drivers/watchdog/simatic-ipc-wdt.c new file mode 100644 >>> index 000000000000..b5c8b7ceb404 >>> --- /dev/null >>> +++ b/drivers/watchdog/simatic-ipc-wdt.c >>> @@ -0,0 +1,305 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Siemens SIMATIC IPC driver for Watchdogs >>> + * >>> + * Copyright (c) Siemens AG, 2020-2021 >>> + * >>> + * Authors: >>> + * Gerd Haeussler >>> + * >>> + * This program is free software; you can redistribute it and/or >>> modify >>> + * it under the terms of the GNU General Public License version 2 >>> as >>> + * published by the Free Software Foundation. >> >> Covered by SPDX-License-Identifier >> >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include > +#include >>> +#include >> >> Alphabetic order please >> >>> + >>> +#define WD_ENABLE_IOADR 0x62 >>> +#define WD_TRIGGER_IOADR 0x66 >>> +#define GPIO_COMMUNITY0_PORT_ID 0xaf >>> +#define PAD_CFG_DW0_GPP_A_23 0x4b8 >> >> Please increase indentation and spare another tab >> >>> +#define SAFE_EN_N_427E 0x01 >>> +#define SAFE_EN_N_227E 0x04 >>> +#define WD_ENABLED 0x01 >>> + >>> +#define TIMEOUT_MIN 2 >>> +#define TIMEOUT_DEF 64 >>> +#define TIMEOUT_MAX 64 >>> + >>> +#define GP_STATUS_REG_227E 0x404D /* IO PORT for >>> SAFE_EN_N on 227E */ + >>> +static bool nowayout = WATCHDOG_NOWAYOUT; >>> +module_param(nowayout, bool, 0000); >>> +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once >>> started (default=" >>> + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); >>> + >>> +static DEFINE_SPINLOCK(io_lock); /* the lock for io >>> operations */ +static struct watchdog_device wdd; >>> + >> >> Having two variables named 'wdd' is confusing. Please chose another >> name. >> >>> +static struct resource gp_status_reg_227e_res = >>> + DEFINE_RES_IO_NAMED(GP_STATUS_REG_227E, SZ_1, >>> KBUILD_MODNAME); + >>> +static struct resource io_resource = >>> + DEFINE_RES_IO_NAMED(WD_ENABLE_IOADR, SZ_1, >>> + KBUILD_MODNAME " WD_ENABLE_IOADR"); >>> + >>> +/* the actual start will be discovered with pci, 0 is a >>> placeholder */ +static struct resource mem_resource = >>> + DEFINE_RES_MEM_NAMED(0, SZ_4, "WD_RESET_BASE_ADR"); >>> + >>> +static u32 wd_timeout_table[] = {2, 4, 6, 8, 16, 32, 48, 64 }; >>> +static void __iomem *wd_reset_base_addr; >>> + >>> +static int get_timeout_idx(u32 timeout) >>> +{ >>> + int i; >>> + >>> + i = ARRAY_SIZE(wd_timeout_table) - 1; >>> + for (; i >= 0; i--) { >>> + if (timeout >= wd_timeout_table[i]) >>> + break; >>> + } >>> + >>> + return i; >>> +} >> >> Please add a comment explaining why you don't use find_closest(). > > Will not be a comment but we will switch to using this, thanks for > pointing it out. > >>> + >>> +static int wd_start(struct watchdog_device *wdd) >>> +{ >>> + u8 regval; >>> + >>> + spin_lock(&io_lock); >>> + >> The watchdog subsystem already provides locking >> since the watchdog device can only be opened once. >> >> Why is the additional lock needed ? > > We had this under internal review and somehow came to the conclusion > that we "might" need it. I think we will remove it or come back with > reasons. Probably my fault. I quickly scanned for locking usage in other watchdog drivers and found plenty of those RMW-protecting locks. I didn't check then what the actual locking model of the watchdog core is, and possibly some of the other use cases need to protect register against other users or multiple watchdog instances. But if the core locks start/stop/set_timeout internally against each other, this is obviously pointless without out inherently single-instance use case here. Jan -- Siemens AG, T RDA IOT Corporate Competence Center Embedded Linux