All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sultan Alsawaf <sultan@kerneltoast.com>
To: Andi Shyti <andi.shyti@intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	jarkko.nikula@linux.intel.com, aaron.ma@canonical.com,
	admin@kryma.net, benjamin.tissoires@redhat.com,
	hdegoede@redhat.com, hn.chen@weidahitech.com, jikos@kernel.org,
	kai.heng.feng@canonical.com, linux-i2c@vger.kernel.org,
	linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	mika.westerberg@linux.intel.com, vicamo.yang@canonical.com,
	wsa@kernel.org
Subject: Re: [PATCH v2] HID: i2c-hid: Use block reads when possible to save power
Date: Tue, 16 Jun 2020 10:32:58 -0700	[thread overview]
Message-ID: <20200616173258.GA5266@sultan-book.localdomain> (raw)
In-Reply-To: <20200616171854.GA1415@intel.intel>

On Tue, Jun 16, 2020 at 08:18:54PM +0300, Andi Shyti wrote:
> Hi Andy,
> 
> > > so the only strategy available up until now has been to always retrieve
> > > the maximum possible report length over i2c, which can be quite
> > > inefficient. For devices that send reports in block read format, the i2c
> > > controller driver can read the payload length on the fly and terminate
> > > the i2c transaction early, resulting in considerable power savings.
> > > 
> > > On a Dell Precision 15 5540 with an i9-9880H, resting my finger on the
> > > touchpad causes psys power readings to go up by about 4W and hover there
> > > until I remove my finger. With this patch, my psys readings go from 4.7W
> > > down to 3.1W, yielding about 1.6W in savings. This is because my
> > > touchpad's max report length is 60 bytes, but all of the regular reports
> > > it sends for touch events are only 32 bytes, so the i2c transfer is
> > > roughly halved for the common case.
> > 
> > > +	/* Try to do a block read if the size fits in one byte */
> > > +	flags = size > 255 ? I2C_M_RD : I2C_M_RD | I2C_M_RECV_LEN;
> > 
> > AFAIR SMBus specification tells about 256. Why 255?
> > 
> > Andi, am I correct?
> 
> Actually the SMBUS 3.0 protocol from 2015[*] says 255:
> 
> "
> D.6 255 Bytes in Process Call
> 
> The maximum number of bytes allowed in the Block Write-Block Read
> Process Call (Section 6.5.8) was increased from 32 to 255.
> "
> 
> But why does it matter... I see the patch is detatching itself
> from smbus.
> 
> And, actually, I wonder if this is the right way to fix it, isn't
> it better to fix smbus instead?

I think the best solution would be to modify the i2c api to allow passing in a
function pointer and a payload size length, to specify how to interpret the size
of the incoming payload, so the adapter could handle both the HID over i2c
transfer spec and SMBus block reads without needing to read more bytes than
needed.

For example, for an SMBus block read, the payload size is specified in the first
byte and it is limited to 32 bytes. However, for HID over i2c, the payload size
is specified in the first two bytes, and there are also some device quirks
involved to reinterpret the reported size.

A nice solution would be to pass in how many bytes the i2c payload size can
contain, as well as a function pointer to evaluate the reported payload size in
a way that the caller wants. This would require modifying every i2c adapter
driver to add this functionality, but it would fix the efficiency problem faced
by i2c-hid and perhaps others.

> I have a patch ready that fixes the smbus transfer size, perhaps
> I should rebase, test and send it.

For the i2c-hid driver?

Sultan

  reply	other threads:[~2020-06-16 17:33 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-14 21:02 [PATCH 0/2] i2c-hid: Save power by reducing i2c xfers with block reads Sultan Alsawaf
2020-06-14 21:02 ` [PATCH 1/2] i2c: designware: Only check the first byte for SMBus block read length Sultan Alsawaf
2020-06-15  9:40   ` Andy Shevchenko
2020-06-15 16:03     ` Sultan Alsawaf
2020-06-15 16:07       ` Andy Shevchenko
2020-06-15 17:15         ` Sultan Alsawaf
2020-06-16 13:22   ` Jarkko Nikula
2020-06-16 15:43     ` [PATCH v2] " Sultan Alsawaf
2020-06-17 11:08       ` Jarkko Nikula
2020-06-14 21:02 ` [PATCH 2/2] HID: i2c-hid: Use block reads when possible to save power Sultan Alsawaf
2020-06-16 13:43   ` Jarkko Nikula
2020-06-16 15:49     ` [PATCH v2] " Sultan Alsawaf
2020-06-16 16:41       ` Andy Shevchenko
2020-06-16 17:18         ` Andi Shyti
2020-06-16 17:32           ` Sultan Alsawaf [this message]
2020-06-16 18:02             ` Andi Shyti
2020-06-16 18:17               ` Sultan Alsawaf
2020-06-17 11:17       ` Jarkko Nikula
2020-06-29 17:43         ` Sultan Alsawaf
2020-07-01  8:04           ` Jarkko Nikula
2020-07-01 15:00             ` Sultan Alsawaf
2020-07-03 11:18               ` Jarkko Nikula
2020-09-14  0:15                 ` [PATCH v3] i2c: Squash of SMBus block read patchset " Sultan Alsawaf
     [not found]                   ` <bcf9cd02-13d1-8f87-8ef9-2f05f0b54808@linux.intel.com>
2020-09-15 17:48                     ` Sultan Alsawaf
2020-09-16 14:09                       ` Jarkko Nikula
2020-09-15 20:44                   ` Jiri Kosina
2020-06-22  0:58   ` [HID] 0b987151f0: kmsg.i2c_designware_i2c_designware.#: controller_timed_out kernel test robot
2020-06-22  0:58     ` kernel test robot

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=20200616173258.GA5266@sultan-book.localdomain \
    --to=sultan@kerneltoast.com \
    --cc=aaron.ma@canonical.com \
    --cc=admin@kryma.net \
    --cc=andi.shyti@intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=hn.chen@weidahitech.com \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=jikos@kernel.org \
    --cc=kai.heng.feng@canonical.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=vicamo.yang@canonical.com \
    --cc=wsa@kernel.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.