From nobody Wed Dec 15 11:16:47 2021 X-Original-To: dev-commits-src-all@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 35A4818E9A55; Wed, 15 Dec 2021 11:16:50 +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 4JDXkl6M5wz4r2b; Wed, 15 Dec 2021 11:16:47 +0000 (UTC) (envelope-from git@FreeBSD.org) 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 9D0311AFD5; Wed, 15 Dec 2021 11:16:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 1BFBGl7J081750; Wed, 15 Dec 2021 11:16:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1BFBGlJf081749; Wed, 15 Dec 2021 11:16:47 GMT (envelope-from git) Date: Wed, 15 Dec 2021 11:16:47 GMT Message-Id: <202112151116.1BFBGlJf081749@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andriy Gapon Subject: git: c6635459510c - main - rk_i2c_fill_tx: fix a number of issues List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: avg X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: c6635459510c9c03a439bc5b59fef37259d21967 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1639567008; 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=uk4HQfQKpZRKsDBBmKP/GPKbm7ekITRDJ4eP13YKW9k=; b=rGqcAP9STb1tSeot7WWjH6msQaeR9NEHW9P4gAsPHvdsMI/Dv6uexUKC6X/wYLS3L8QmZv jmucREZQ43doz9Dj3/7pWTzqZ4WHTeo8PcUAp7z0J9F19eeBZx0VDo8g7m40HOibVpOuzQ uZQB795GS4VXfRLBPPHuv676wYmj4BEB9UbNIVKQ4PUWkvsq6bJp5rnexbyuJ4lsEQJFo5 l1nf1fk5Sb0IR5HiMyb7GbVEKhXJ7Q23DuN1d5a7hhwT//yCshJQQCj+5adXziIwpfxrTY 4paIEHE32P7EaW2EjJbLjzX+YeiTNm6Xl6tyBt1lFYx8oPV6Qc8nE3xAUtCouw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1639567008; a=rsa-sha256; cv=none; b=qvr7vyAixOBIBn9rbJl1Iuirmmd5NiYhuP4Ji/yWx8II2MbH1mSiW/bs9Y1MMKAWsr//OR C0wvxXDYJ32ITzjNiQvKFOKb1qB0AuyeQF4gLN4PvF/WGIQjS3hhYT5UNBowN67gJlLQQN AqjSS1JBr8Pkq504DfHAr8Yy8bgClFfZSawiBTeZzZpvadGeWLMYjGKtE+qwlgEG1tS95X KmmAQkN1+KR14K5sirBefhk+tT1CflWk3kFgPT8CxF2i8WhJHMlrAS9S44azabPg5Xn+gq CdqJRtfCFdw+bRXsCuvGO+hlFKZtIbZN33bbeJD9/jhv/eiZSQJ2uSnNnIL21w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by avg: URL: https://cgit.FreeBSD.org/src/commit/?id=c6635459510c9c03a439bc5b59fef37259d21967 commit c6635459510c9c03a439bc5b59fef37259d21967 Author: Andriy Gapon AuthorDate: 2021-12-15 11:00:45 +0000 Commit: Andriy Gapon CommitDate: 2021-12-15 11:16:14 +0000 rk_i2c_fill_tx: fix a number of issues - maximum number of bytes that can be sent is 32, not 8; - previous interface required callers to bump sc->msg->len in addition to setting sc->tx_slave_addr; - because of the above there was an issue with writing one too many bytes because sc->cnt is not advanced when the slave address is written; - the inetraction between outer and inner loops was confusing as the former was bounded on the number of bytes to write and the counter was incremented by one, but the inner loop advanced four bytes at a time; - the return value was incorrect in the tx_slave_addr case; one call place had to use its own (and incorrect in some cases) notion of the write lenth. All of the above issues should be fixed. Some sanity asserts are added. All callers use the return value to program RK_I2C_MTXCNT. iic_msg::len no longer needs to be hacked. A constant is added to reflect the maximum number of octets that can be sent or received in one go (they are the same). MFC after: 1 week --- sys/arm64/rockchip/rk_i2c.c | 46 +++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/sys/arm64/rockchip/rk_i2c.c b/sys/arm64/rockchip/rk_i2c.c index 6ad168f0c64c..67178f615b0a 100644 --- a/sys/arm64/rockchip/rk_i2c.c +++ b/sys/arm64/rockchip/rk_i2c.c @@ -110,6 +110,9 @@ __FBSDID("$FreeBSD$"); #define RK_I2C_RXDATA_BASE 0x200 +/* 8 data registers, 4 bytes each. */ +#define RK_I2C_MAX_RXTX_LEN 32 + enum rk_i2c_state { STATE_IDLE = 0, STATE_START, @@ -214,36 +217,40 @@ rk_i2c_fill_tx(struct rk_i2c_softc *sc) uint8_t buf; int i, j, len; - if (sc->msg == NULL || sc->msg->len == sc->cnt) - return (0); - len = sc->msg->len - sc->cnt; - if (len > 8) - len = 8; + if (sc->tx_slave_addr) { + KASSERT(sc->cnt == 0, ("tx_slave_addr in the middle of data")); + len++; + } - for (i = 0; i < len; i++) { + if (len > RK_I2C_MAX_RXTX_LEN) + len = RK_I2C_MAX_RXTX_LEN; + + while (i < len) { buf32 = 0; - for (j = 0; j < 4 ; j++) { - if (sc->cnt == sc->msg->len) - break; + /* Process next 4 bytes or whatever remains. */ + for (j = 0; j < MIN(len - i, 4); j++) { /* Fill the addr if needed */ - if (sc->cnt == 0 && sc->tx_slave_addr) { + if (sc->tx_slave_addr) { buf = sc->msg->slave; sc->tx_slave_addr = false; } else { + KASSERT(sc->cnt < sc->msg->len, + ("%s: data buffer overrun", __func__)); buf = sc->msg->buf[sc->cnt]; sc->cnt++; } - buf32 |= buf << (j * 8); + buf32 |= (uint32_t)buf << (j * 8); } - RK_I2C_WRITE(sc, RK_I2C_TXDATA_BASE + 4 * i, buf32); - if (sc->cnt == sc->msg->len) - break; + KASSERT(i % 4 == 0, ("%s: misaligned write offset", __func__)); + RK_I2C_WRITE(sc, RK_I2C_TXDATA_BASE + i, buf32); + + i += j; } - return (uint8_t)len; + return (len); } static void @@ -260,8 +267,8 @@ rk_i2c_drain_rx(struct rk_i2c_softc *sc) } len = sc->msg->len - sc->cnt; - if (len > 32) - len = 32; + if (len > RK_I2C_MAX_RXTX_LEN) + len = RK_I2C_MAX_RXTX_LEN; for (i = 0; i < len; i++) { if (i % 4 == 0) @@ -339,9 +346,8 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc) RK_I2C_WRITE(sc, RK_I2C_IEN, RK_I2C_IEN_MBTFIEN | RK_I2C_IEN_NAKRCVIEN); - sc->msg->len += 1; - rk_i2c_fill_tx(sc); - RK_I2C_WRITE(sc, RK_I2C_MTXCNT, sc->msg->len); + transfer_len = rk_i2c_fill_tx(sc); + RK_I2C_WRITE(sc, RK_I2C_MTXCNT, transfer_len); } break; case STATE_READ: