All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shaokun Zhang <zhangshaokun@hisilicon.com>
To: Guenter Roeck <linux@roeck-us.net>, <linux-watchdog@vger.kernel.org>
Cc: Wim Van Sebroeck <wim@linux-watchdog.org>,
	Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>,
	Al Stone <al.stone@linaro.org>,
	Jianchao Hu <hujianchao@hisilicon.com>,
	Huiqiang Wang <wanghuiqiang@huawei.com>
Subject: Re: [PATCH] watchdog: sbsa: Support architecture version 1
Date: Mon, 10 May 2021 16:44:21 +0800	[thread overview]
Message-ID: <ec1bb835-3b53-4b17-1918-25975f4413a0@hisilicon.com> (raw)
In-Reply-To: <bf9e1b65-119b-d027-fc3d-8491cbc38cde@hisilicon.com>

Hi Guenter,

On 2021/5/10 16:25, Shaokun Zhang wrote:
> Hi Guenter,
> 
> On 2021/5/10 12:25, Guenter Roeck wrote:
>> On 5/9/21 8:41 PM, Shaokun Zhang wrote:
>>> Arm Base System Architecture 1.0[1] has introduced watchdog
>>> revision 1 that increases the length the watchdog offset
>>
>> Is that how they call the watchdog count register ?
>>
> 
> I think yes.
> 
>> Also, doesn't that mean that the maximum timeout supported
>> by the hardware is now larger ?
> 
> No, maximum timeout is the same. But the clock can be higher than
> before. For Armv8.6, The frequency of CNTFRQ_EL0 is standardized to
> a frequency of 1GHz which will set gwdt->clk. If the timeout is
> greater than 4(second), the 32-bit counter(WOR) is not enough.
> 
>>
>>> regiter to 48 bit, while other operation of the watchdog remains
>>
>> register
> 
> Ok, will fix it.
> 
>>
>>> the same.
>>> Let's support the feature infered it from the architecture version
>>
>> I can't parse this sentence.
>>
> 
> Apologies for sentence, I mean that we can read or write the WOR using
> readl/writel or readq/writeq depending on the architecture version. If
> architecture version is 0, readl/writel are used. Otherwise, we use
> readq/writeq.
> 
>>> of watchdog in W_IID register. If the version is 0x1, the watchdog
>>
>> W_IIDR ?
>>
> 
> Yes
> 
>>> offset register will be 48 bit, otherwise it will be 32 bit.
>>
>> 48 or 64 ? The code says 64.
>>
> 
> The whole WOR is 64-bits: WOR_L and WOR_H. WOR_L[31:0] contains the
> lower 32 bits;
> WOR_H[63:32] comprises two parts, Bits[15:0] of WOR_H contains the
> upper 16 bits; Bits[31:16] of WOR_H is reserved that Read all zero
> and write has no effect. So the real use is 48-bit.
> 
>>>
>>> [1] https://developer.arm.com/documentation/den0094/latest
>>>
>>
>> There is no download link at that location. Someone with access
>> to the documentation will have to confirm this.
> 
> Can you access this link? If yes, there is a 'Download' label and
> you can upload the document and check page 47 of 96.
> 
>>
>>> Cc: Wim Van Sebroeck <wim@linux-watchdog.org>
>>> Cc: Guenter Roeck <linux@roeck-us.net>
>>> Cc: Fu Wei <fu.wei@linaro.org>
>>> Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>>> Cc: Al Stone <al.stone@linaro.org>
>>> Cc: Timur Tabi <timur@codeaurora.org>
>>> Cc: Jianchao Hu <hujianchao@hisilicon.com>
>>> Cc: Huiqiang Wang <wanghuiqiang@huawei.com>
>>> Signed-off-by: Shaokun Zhang <zhangshaokun@hisilicon.com>
>>> ---
>>>   drivers/watchdog/sbsa_gwdt.c | 46 +++++++++++++++++++++++++++++++++++++++-----
>>>   1 file changed, 41 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
>>> index f0f1e3b2e463..ca4f7c416f1e 100644
>>> --- a/drivers/watchdog/sbsa_gwdt.c
>>> +++ b/drivers/watchdog/sbsa_gwdt.c
>>> @@ -73,16 +73,21 @@
>>>   #define SBSA_GWDT_WCS_WS0    BIT(1)
>>>   #define SBSA_GWDT_WCS_WS1    BIT(2)
>>>   +#define SBSA_GWDT_VERSION_MASK  0xF
>>> +#define SBSA_GWDT_VERSION_SHIFT 16
>>> +
>>>   /**
>>>    * struct sbsa_gwdt - Internal representation of the SBSA GWDT
>>>    * @wdd:        kernel watchdog_device structure
>>>    * @clk:        store the System Counter clock frequency, in Hz.
>>> + * @version:            store the architecture version
>>>    * @refresh_base:    Virtual address of the watchdog refresh frame
>>>    * @control_base:    Virtual address of the watchdog control frame
>>>    */
>>>   struct sbsa_gwdt {
>>>       struct watchdog_device    wdd;
>>>       u32            clk;
>>> +    int            version;
>>>       void __iomem        *refresh_base;
>>>       void __iomem        *control_base;
>>>   };
>>> @@ -113,6 +118,27 @@ MODULE_PARM_DESC(nowayout,
>>>            __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
>>>     /*
>>> + * Read and write are 32 or 64 bits depending on watchdog architecture
>>> + * version: if version is equal 0, its 32-bits operation; otherwise 64-bits
>>> + * operation is chosen.
>>> + */
>>> +static u64 sbsa_gwdt_reg_read(struct sbsa_gwdt *gwdt)
>>> +{
>>> +    if (gwdt->version == 0)
>>> +        return (u64)readl(gwdt->control_base + SBSA_GWDT_WOR);
>>
>> Unnecessary typecast.
>>
> 
> Ok.
> 
>>> +    else
>>> +        return readq(gwdt->control_base + SBSA_GWDT_WOR);
>>> +}
>>> +
>>> +static void sbsa_gwdt_reg_write(u64 val, struct sbsa_gwdt *gwdt)
>>
>> What is the point of making val an u64 variable ? Without changing
> 
> Oops, unsigned int is enough.
> 

Sorry, it shall be 'u64', because it is the value that clock * timeout
and will be written to WOR register which is 64-bit register in
architecture version 1.

Thanks,
Shaokun

>> the maximum timeout it will never be larger than 0xffffffff.
>>
> 
> No, the reason that I have explained that the clock can be 1GHz now.
> 
> Thanks,
> Shaokun
> 
>>> +{
>>> +    if (gwdt->version == 0)
>>> +        writel((u32)val, gwdt->control_base + SBSA_GWDT_WOR);
>>> +    else
>>> +        writeq(val, gwdt->control_base + SBSA_GWDT_WOR);
>>> +}
>>> +
>>> +/*
>>>    * watchdog operation functions
>>>    */
>>>   static int sbsa_gwdt_set_timeout(struct watchdog_device *wdd,
>>> @@ -123,16 +149,14 @@ static int sbsa_gwdt_set_timeout(struct watchdog_device *wdd,
>>>       wdd->timeout = timeout;
>>>         if (action)
>>> -        writel(gwdt->clk * timeout,
>>> -               gwdt->control_base + SBSA_GWDT_WOR);
>>> +        sbsa_gwdt_reg_write(gwdt->clk * timeout, gwdt);
>>>       else
>>>           /*
>>>            * In the single stage mode, The first signal (WS0) is ignored,
>>>            * the timeout is (WOR * 2), so the WOR should be configured
>>>            * to half value of timeout.
>>>            */
>>> -        writel(gwdt->clk / 2 * timeout,
>>> -               gwdt->control_base + SBSA_GWDT_WOR);
>>> +        sbsa_gwdt_reg_write(gwdt->clk / 2 * timeout, gwdt);
>>>         return 0;
>>>   }
>>> @@ -149,7 +173,7 @@ static unsigned int sbsa_gwdt_get_timeleft(struct watchdog_device *wdd)
>>>        */
>>>       if (!action &&
>>>           !(readl(gwdt->control_base + SBSA_GWDT_WCS) & SBSA_GWDT_WCS_WS0))
>>> -        timeleft += readl(gwdt->control_base + SBSA_GWDT_WOR);
>>> +        timeleft += sbsa_gwdt_reg_read(gwdt);
>>>         timeleft += lo_hi_readq(gwdt->control_base + SBSA_GWDT_WCV) -
>>>               arch_timer_read_counter();
>>> @@ -172,6 +196,17 @@ static int sbsa_gwdt_keepalive(struct watchdog_device *wdd)
>>>       return 0;
>>>   }
>>>   +static void sbsa_gwdt_get_version(struct watchdog_device *wdd)
>>> +{
>>> +    struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd);
>>> +    int ver;
>>> +
>>> +    ver = readl(gwdt->control_base + SBSA_GWDT_W_IIDR);
>>> +    ver = (ver >> SBSA_GWDT_VERSION_SHIFT) & SBSA_GWDT_VERSION_MASK;
>>> +
>>> +    gwdt->version = ver;
>>> +}
>>> +
>>>   static int sbsa_gwdt_start(struct watchdog_device *wdd)
>>>   {
>>>       struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd);
>>> @@ -300,6 +335,7 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
>>>        * it's also a ping, if watchdog is enabled.
>>>        */
>>>       sbsa_gwdt_set_timeout(wdd, wdd->timeout);
>>> +    sbsa_gwdt_get_version(wdd);
>>>         watchdog_stop_on_reboot(wdd);
>>>       ret = devm_watchdog_register_device(dev, wdd);
>>>
>>
>> .

  reply	other threads:[~2021-05-10  8:44 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-10  3:41 [PATCH] watchdog: sbsa: Support architecture version 1 Shaokun Zhang
2021-05-10  4:25 ` Guenter Roeck
2021-05-10  8:25   ` Shaokun Zhang
2021-05-10  8:44     ` Shaokun Zhang [this message]
2021-05-10 15:23       ` Guenter Roeck
2021-05-10 13:16     ` Guenter Roeck
2021-05-11  2:49       ` Shaokun Zhang
2021-05-11  3:52         ` Guenter Roeck
2021-05-11  6:03           ` Shaokun Zhang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ec1bb835-3b53-4b17-1918-25975f4413a0@hisilicon.com \
    --to=zhangshaokun@hisilicon.com \
    --cc=Suravee.Suthikulpanit@amd.com \
    --cc=al.stone@linaro.org \
    --cc=hujianchao@hisilicon.com \
    --cc=linux-watchdog@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=wanghuiqiang@huawei.com \
    --cc=wim@linux-watchdog.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.