From nobody Sat Dec 23 04:11:05 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SxrLx3c0Yz54vtk; Sat, 23 Dec 2023 04:11:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SxrLx39Zyz3PJg; Sat, 23 Dec 2023 04:11:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1703304665; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=doBCRNMupLDt6KQFYXAWx6ZX7htI79fnEhR6Yz11Zr0=; b=Ul4296tGY0F0z5sRJm9tKyNgbBM98QYsPk/TEgNgc2T/+ljUWEB+QKh1eO5wm518XjMgYr eba7KEwmgLJnpEQ4wXbtPkbjPZPFrPsrdAn7jl4YPpriQMuUtKEM0k8ob0PW1RQo/+h149 OIs+qVL0JsCAs8n0jz3aWYe4onmCJ1MhB5ZcM5R2dlAYV0EHeJdcAR/kPAkdTR6srjOjlF a6O1Z01dGLEfxjevnf6oXD+P8XqPiLcXHVC6l+ztnfW3XcjT7KUgQ/e/+isF9t24BsSQkk NLfNrB5JfB6rUPHHUg6xDqzkvQottffx5380YfbPnQzGAsWDiW/rT8CxZqvRRg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1703304665; a=rsa-sha256; cv=none; b=gFmE64aL7SJCDmFbhnvJdduGXK9r5ZBwcCrQAp04oew5nfSfAxqKGB9LLcGiNJ6PJ57ouN xFTNQ/l5NyjR5SNDSLSMr3spS2riJ5y3wy+U3GX521kaL9breIutf7jDD8x6Wmb1BcQ6+G YQ4zHr56DZgybFI+lcWVSq/EA5ab9CV6IFzVvy6mPzzl70IhsBubsWqG7KzmwEnovRpBew iG9vC/AyQ7JMTMX080H1WBuI3aqOOGYKVwBREKQ7QHJekUMSNn2hHxpMy8cpUo3gX2ZkwN JJyGFHFLRmu7DVlC3mqiYQh97xdBwU8G+lH+3ODfARuJ5oie4liFfL7/OIU8vQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1703304665; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=doBCRNMupLDt6KQFYXAWx6ZX7htI79fnEhR6Yz11Zr0=; b=VhnZbAiC0NaTwCtqrzQhljNKUYpPWNtFAF7xOSYM8fAJGTOA0MromOFCNYn8qFChOfuq7s yqnEE8RDSQRimiIzskiDzGOasKKmXHgRR1WSBNkwMn7R1HRh1sjQrUp+j4w7iPgqq8ZCRy G1rvQsAKKVOzimKuYFqRwEaJLHOqboHj+mWbvWjfISbgYkWL++JXxSq3SMB8CaZ4QWsuBW 8MlGD/Lye/mQjRidopLHfRk/iAeP7IwJidwSpW2z89c6P1qt83WMwn3djTKZdXTtDH+Swf PTmw1HbCmdCJBiB+sNt+an8MfsthGp9rsERGM7A5hI7ZKLEDkWN0KThupwfkFQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SxrLx1xQSzlJv; Sat, 23 Dec 2023 04:11:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3BN4B50u047164; Sat, 23 Dec 2023 04:11:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3BN4B5tH047161; Sat, 23 Dec 2023 04:11:05 GMT (envelope-from git) Date: Sat, 23 Dec 2023 04:11:05 GMT Message-Id: <202312230411.3BN4B5tH047161@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alexander Motin Subject: git: 8c86b9812403 - main - iichid(4): Improve idle sampling hysteresis List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mav X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8c86b981240324c1daaa387d4d3f8e3e53db3d2e Auto-Submitted: auto-generated The branch main has been updated by mav: URL: https://cgit.FreeBSD.org/src/commit/?id=8c86b981240324c1daaa387d4d3f8e3e53db3d2e commit 8c86b981240324c1daaa387d4d3f8e3e53db3d2e Author: Alexander Motin AuthorDate: 2023-12-23 03:50:52 +0000 Commit: Alexander Motin CommitDate: 2023-12-23 03:50:52 +0000 iichid(4): Improve idle sampling hysteresis In sampling mode some devices return same data indefinitely even if there is nothing to report. Previous idle hysteresis implementation activated only when device returned no data, so some devices ended up polled at fast rate all the time. This new implementation compares each new report with the previous, and, if they are identical, after reaching threshold also drop sampling rate to slow. On my Dell XPS 13 9310 with iichid(4) touchscreen and touchpad this reduces idle power consumption by ~0.5W by reducing number of context switches in the driver from ~4000 to ~700 per second when not touched. MFC after: 1 month --- sys/dev/iicbus/iichid.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/sys/dev/iicbus/iichid.c b/sys/dev/iicbus/iichid.c index 7ab5b61d9be8..1035088c11b5 100644 --- a/sys/dev/iicbus/iichid.c +++ b/sys/dev/iicbus/iichid.c @@ -108,7 +108,7 @@ enum { */ #define IICHID_SAMPLING_RATE_FAST 60 #define IICHID_SAMPLING_RATE_SLOW 10 -#define IICHID_SAMPLING_HYSTERESIS 1 +#define IICHID_SAMPLING_HYSTERESIS 12 /* ~ 2x fast / slow */ /* 5.1.1 - HID Descriptor Format */ struct i2c_hid_desc { @@ -177,9 +177,12 @@ struct iichid_softc { int sampling_rate_fast; int sampling_hysteresis; int missing_samples; /* iicbus lock */ - struct timeout_task periodic_task; /* iicbus lock */ + int dup_samples; /* iicbus lock */ + iichid_size_t dup_size; /* iicbus lock */ bool callout_setup; /* iicbus lock */ + uint8_t *dup_buf; struct taskqueue *taskqueue; + struct timeout_task periodic_task; /* iicbus lock */ struct task event_task; #endif @@ -523,7 +526,7 @@ iichid_event_task(void *context, int pending) device_t parent; iichid_size_t actual; bool bus_requested; - int error; + int error, rate; sc = context; parent = device_get_parent(sc->dev); @@ -541,18 +544,30 @@ iichid_event_task(void *context, int pending) if (actual > 0) { sc->intr_handler(sc->intr_ctx, sc->intr_buf, actual); sc->missing_samples = 0; - } else - ++sc->missing_samples; + if (sc->dup_size != actual || + memcmp(sc->dup_buf, sc->intr_buf, actual) != 0) { + sc->dup_size = actual; + memcpy(sc->dup_buf, sc->intr_buf, actual); + sc->dup_samples = 0; + } else + ++sc->dup_samples; + } else { + if (++sc->missing_samples == 1) + sc->intr_handler(sc->intr_ctx, sc->intr_buf, 0); + sc->dup_samples = 0; + } } else DPRINTF(sc, "read error occurred: %d\n", error); rearm: if (sc->callout_setup && sc->sampling_rate_slow > 0) { - if (sc->missing_samples == sc->sampling_hysteresis) - sc->intr_handler(sc->intr_ctx, sc->intr_buf, 0); - taskqueue_enqueue_timeout(sc->taskqueue, &sc->periodic_task, - hz / MAX(sc->missing_samples >= sc->sampling_hysteresis ? - sc->sampling_rate_slow : sc->sampling_rate_fast, 1)); + if (sc->missing_samples >= sc->sampling_hysteresis || + sc->dup_samples >= sc->sampling_hysteresis) + rate = sc->sampling_rate_slow; + else + rate = sc->sampling_rate_fast; + taskqueue_enqueue_timeout_sbt(sc->taskqueue, &sc->periodic_task, + SBT_1S / MAX(rate, 1), 0, C_PREL(1)); } out: if (bus_requested) @@ -725,6 +740,8 @@ iichid_reset_callout(struct iichid_softc *sc) /* Start with slow sampling. */ sc->missing_samples = sc->sampling_hysteresis; + sc->dup_samples = 0; + sc->dup_size = 0; taskqueue_enqueue(sc->taskqueue, &sc->event_task); return (0); @@ -812,6 +829,7 @@ iichid_intr_setup(device_t dev, device_t child __unused, hid_intr_t intr, sc->intr_buf = malloc(rdesc->rdsize, M_DEVBUF, M_WAITOK | M_ZERO); sc->intr_bufsize = rdesc->rdsize; #ifdef IICHID_SAMPLING + sc->dup_buf = malloc(rdesc->rdsize, M_DEVBUF, M_WAITOK | M_ZERO); taskqueue_start_threads(&sc->taskqueue, 1, PI_TTY, "%s taskq", device_get_nameunit(sc->dev)); #endif @@ -825,6 +843,7 @@ iichid_intr_unsetup(device_t dev, device_t child __unused) sc = device_get_softc(dev); #ifdef IICHID_SAMPLING taskqueue_drain_all(sc->taskqueue); + free(sc->dup_buf, M_DEVBUF); #endif free(sc->intr_buf, M_DEVBUF); }