devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: John Garry <john.garry@huawei.com>
To: dann frazier <dann.frazier@canonical.com>
Cc: mika.westerberg@linux.intel.com, rafael@kernel.org,
	lorenzo.pieralisi@arm.com, rjw@rjwysocki.net, robh+dt@kernel.org,
	bhelgaas@google.com, arnd@arndb.de, mark.rutland@arm.com,
	olof@lixom.net, hanjun.guo@linaro.org, benh@kernel.crashing.org,
	linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
	linuxarm@huawei.com, linux-pci@vger.kernel.org, minyard@acm.org,
	devicetree@vger.kernel.org, linux-arch@vger.kernel.org,
	rdunlap@infradead.org, Zhichang Yuan <yuanzhichang@hisilicon.com>,
	Zou Rongrong <zourongrong@huawei.com>,
	Gabriele Paoloni <gabriele.paoloni@huawei.com>
Subject: Re: [PATCH v12 6/9] LPC: Support the LPC host on Hip06/Hip07 with DT bindings
Date: Wed, 14 Feb 2018 11:35:24 +0000	[thread overview]
Message-ID: <78ff2d7a-201f-8fff-9acc-ae23a65ce18f@huawei.com> (raw)
In-Reply-To: <20180213184123.GA11446@xps13.dannf>

Hi Dann,

>> + */
>> +static int
>> +hisilpc_target_in(struct hisilpc_dev *lpcdev, struct lpc_cycle_para *para,
>> +		  unsigned long ptaddr, unsigned char *buf,
>> +		  unsigned long opcnt)
>> +{
>> +	unsigned long cnt_per_trans;
>> +	unsigned int cmd_word;
>> +	unsigned int waitcnt;
>> +	int ret;
>> +
>> +	if (!buf || !opcnt || !para || !para->csize || !lpcdev)
>> +		return -EINVAL;
>> +
>> +	cmd_word = LPC_CMD_TYPE_IO | LPC_CMD_READ;
>> +	waitcnt = LPC_PEROP_WAITCNT;
>> +	if (!(para->opflags & FG_INCRADDR_LPC)) {
>> +		cmd_word |= LPC_CMD_SAMEADDR;
>> +		waitcnt = LPC_MAX_WAITCNT;
>> +	}
>> +
>> +	ret = 0;
>> +	cnt_per_trans = (para->csize == 1) ? opcnt : para->csize;
>> +	for (; opcnt && !ret; cnt_per_trans = para->csize) {
>> +		unsigned long flags;
>> +
>> +		/* whole operation must be atomic */
>> +		spin_lock_irqsave(&lpcdev->cycle_lock, flags);
>> +
>> +		writel_relaxed(cnt_per_trans, lpcdev->membase + LPC_REG_OP_LEN);
>> +
>> +		writel_relaxed(cmd_word, lpcdev->membase + LPC_REG_CMD);
>> +
>> +		writel_relaxed(ptaddr, lpcdev->membase + LPC_REG_ADDR);
>> +
>> +		writel(LPC_START_WORK, lpcdev->membase + LPC_REG_START);
>> +
>> +		/* whether the operation is finished */
>> +		ret = wait_lpc_idle(lpcdev->membase, waitcnt);
>> +		if (!ret) {
>> +			opcnt -= cnt_per_trans;
>
> Do we need to check for an underflow here?

I think that underflow is ensured not to happen.

Regardless, I find this code hard to follow myself, so I will rewrite a 
bit of this to make it more straightforward.

>
>> +			for (cnt_per_trans--; cnt_per_trans--; buf++)
>> +				*buf = readb_relaxed(lpcdev->membase +
>> +					LPC_REG_RDATA);
>> +			*buf = readb(lpcdev->membase + LPC_REG_RDATA);
>> +		}
>> +
>> +		spin_unlock_irqrestore(&lpcdev->cycle_lock, flags);
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +/*
>> + * hisilpc_target_out - trigger a series of lpc cycles to write required
>> + *			data to target peripheral.
>> + * @lpcdev: pointer to hisi lpc device
>> + * @para: some parameters used to control the lpc I/O operations
>> + * @ptaddr: the lpc I/O target port address
>> + * @buf: where the data to be written is stored
>> + * @opcnt: how many I/O operations required
>> + *
>> + * Only one byte data is read each I/O operation.
>
> s/read/written/ ?

Right

>
>> + * Returns 0 on success, non-zero on fail.
>> + *
>> + */
>> +static int
>> +hisilpc_target_out(struct hisilpc_dev *lpcdev, struct lpc_cycle_para *para,
>> +		   unsigned long ptaddr, const unsigned char *buf,
>> +		   unsigned long opcnt)
>> +{
>> +	unsigned long cnt_per_trans;
>> +	unsigned int cmd_word;
>> +	unsigned int waitcnt;
>> +	int ret;
>> +
>> +	if (!buf || !opcnt || !para || !lpcdev)
>> +		return -EINVAL;
>> +
>> +	/* default is increasing address */
>> +	cmd_word = LPC_CMD_TYPE_IO | LPC_CMD_WRITE;
>> +	waitcnt = LPC_PEROP_WAITCNT;
>> +	if (!(para->opflags & FG_INCRADDR_LPC)) {
>> +		cmd_word |= LPC_CMD_SAMEADDR;
>> +		waitcnt = LPC_MAX_WAITCNT;
>> +	}
>> +
>> +	ret = 0;
>> +	cnt_per_trans = (para->csize == 1) ? opcnt : para->csize;
>> +	for (; opcnt && !ret; cnt_per_trans = para->csize) {
>> +		unsigned long flags;
>> +
>> +		spin_lock_irqsave(&lpcdev->cycle_lock, flags);
>> +
>> +		writel_relaxed(cnt_per_trans, lpcdev->membase + LPC_REG_OP_LEN);
>> +		writel_relaxed(cmd_word, lpcdev->membase + LPC_REG_CMD);
>> +		writel_relaxed(ptaddr, lpcdev->membase + LPC_REG_ADDR);
>> +
>> +		opcnt -= cnt_per_trans;
>
> Underflow check needed?

As above

>
>  -dann
>

Thanks,
John

  reply	other threads:[~2018-02-14 11:35 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-23 16:36 [PATCH v12 0/9] LPC: legacy ISA I/O support John Garry
2018-01-23 16:36 ` [PATCH v12 1/9] LIB: Introduce a generic PIO mapping method John Garry
2018-01-23 16:36 ` [PATCH v12 2/9] PCI: Remove unused __weak attribute in pci_register_io_range() John Garry
2018-01-23 16:36 ` [PATCH v12 3/9] PCI: Add fwnode handler as input param of pci_register_io_range() John Garry
2018-01-30 15:11   ` Rob Herring
2018-01-23 16:36 ` [PATCH v12 4/9] PCI: Apply the new generic I/O management on PCI IO hosts John Garry
2018-01-23 16:36 ` [PATCH v12 5/9] OF: Add missing I/O range exception for indirect-IO devices John Garry
2018-01-23 16:36 ` [PATCH v12 6/9] LPC: Support the LPC host on Hip06/Hip07 with DT bindings John Garry
2018-02-13 18:41   ` dann frazier
2018-02-14 11:35     ` John Garry [this message]
2018-01-23 16:36 ` [PATCH v12 7/9] ACPI: Translate the I/O range of non-MMIO devices before scanning John Garry
2018-02-01 11:32   ` John Garry
     [not found]     ` <0a30452f-34eb-d0b5-2001-ab6b866c53e2-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-02-05 13:16       ` Andy Shevchenko
2018-02-05 14:25         ` John Garry
2018-02-06 19:44           ` Andy Shevchenko
2018-02-04  7:45   ` Rafael J. Wysocki
2018-02-05 11:01     ` John Garry
2018-02-05 12:10       ` Joe Perches
2018-02-05 12:17         ` John Garry
2018-01-23 16:36 ` [PATCH v12 8/9] LPC, ACPI: Add the HISI LPC ACPI support John Garry
2018-01-23 16:36 ` [PATCH v12 9/9] MAINTAINERS: Add maintainer for HiSilicon LPC driver John Garry
2018-02-08  1:02 ` [PATCH v12 0/9] LPC: legacy ISA I/O support dann frazier

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=78ff2d7a-201f-8fff-9acc-ae23a65ce18f@huawei.com \
    --to=john.garry@huawei.com \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=dann.frazier@canonical.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gabriele.paoloni@huawei.com \
    --cc=hanjun.guo@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linuxarm@huawei.com \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=mika.westerberg@linux.intel.com \
    --cc=minyard@acm.org \
    --cc=olof@lixom.net \
    --cc=rafael@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rjw@rjwysocki.net \
    --cc=robh+dt@kernel.org \
    --cc=yuanzhichang@hisilicon.com \
    --cc=zourongrong@huawei.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).