From nobody Fri May 17 22:10:08 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1647292849; cv=none; d=zohomail.com; s=zohoarc; b=iPiz6qOIbhHepexd3ZIPHMF/e2T1PGMpMKjLt4PQ8z8XiuZnJFHZxFVH9uw7DHPb2ELQG2r+u/T0bMWs2NSY6D8BC1GH38SICeEKbXpDZ4ZDQ94w+y7oeP1EBQNzbxfWqDxv7LuDOR9L9HNBcimoTnJVwvEYttw4J4uA1LOLuqU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1647292849; h=Content-Type:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=tIOH1nFSv+jDNX4oIuvTAdCyo3qdqxDZBL3Q1OvuhW8=; b=epFbty03aYZf673w6BMiKQKx5kua0xe3pE7Ltfa8kl71MIccS4VjF96JU6uhblh7UmfinU2je5vjdEkhOteJfoIXLf+NeyVhodz7OeoRaoHoU375qKzGlHThKG6+h32WinUOhHUw4t4E54DXdUI+kxGgw3CBW8psgWcavOMMPXE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1647292849455969.5496873422394; Mon, 14 Mar 2022 14:20:49 -0700 (PDT) Received: from localhost ([::1]:36092 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nTs7T-00048H-Rw for importer@patchew.org; Mon, 14 Mar 2022 17:20:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:41160) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <3oq8vYgcKCtcO7GMNK79HH9E7.5HFJ7FN-67O7EGHG9GN.HK9@flex--venture.bounces.google.com>) id 1nTs6G-0003Jr-QX for qemu-devel@nongnu.org; Mon, 14 Mar 2022 17:19:32 -0400 Received: from [2607:f8b0:4864:20::114a] (port=50342 helo=mail-yw1-x114a.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <3oq8vYgcKCtcO7GMNK79HH9E7.5HFJ7FN-67O7EGHG9GN.HK9@flex--venture.bounces.google.com>) id 1nTs6F-0002bI-6u for qemu-devel@nongnu.org; Mon, 14 Mar 2022 17:19:32 -0400 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2d6994a6942so142473747b3.17 for ; Mon, 14 Mar 2022 14:19:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=tIOH1nFSv+jDNX4oIuvTAdCyo3qdqxDZBL3Q1OvuhW8=; b=JDpGNWTaXAhTRm8XRom3j116E5qAGAeFtOAxiJm/tcMTauGOwuAiI1TOOxY7cCnqhF f3pWR+xsPsoRZFiwFk2J5TLgD1aYRfHE1qfCif32kAwNa8jXE9jAbEywjiu2c0DBpH8s b272zrB1k296AExSAPqMuO3ZmcomrzKkjvwM5hM5i0VpEptleKMbMzFmDGINQdrzD2Rf inaLQVzSI5x1k6sbf6v7n4WGNfuuD3R+kkFqSO/xKJsmCk26ZyuxD7gO2zWht9OutqZi DslzOY26loUtRcrPoG30izq5qBIrlD35pQWLfMpzMCZxL0Ep08+YGz6XIut6b4UnhITr Mvhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=tIOH1nFSv+jDNX4oIuvTAdCyo3qdqxDZBL3Q1OvuhW8=; b=rvKn+Rl0Pc67BDq6NFeNk552gJvhvZQbluFeCrF54P+CXp2UWKVKnCX4fnsvGdfnf0 GS/9EqTDPCyUISOaXpXeM/6JZ97BfnCmV8f6IpypElwi80cM74cx7+kGVaZrqXUhCg/w /xQYzBWDsuTfXZ3dd6TeLzEWUPUDdUl3ze+OmCtB+uMnsFcTLld6MQg2Dx3suvmvwKPy ybf2AXO4UWDA5GUFc083dp2mXVNURwCeEVPXE5cDAgDR0kUregfcjqj5dBZ5swzTrLJw KGFPLeUX+8U+Na66By9gOd+SDlvQawwZG48LtKVbe/Iq15Gx6cQ9mVwAob+fw6A6pBZe InPg== X-Gm-Message-State: AOAM530bDZEVBS9OUiOstFKD0ySpTeNjT1sId9+OAwcNyxXXqTzBg7QD Qb+gZl0XBB7TzQz4xhOVGRcl+3cDEX1J X-Google-Smtp-Source: ABdhPJxGe1sfkTwZyNAq3FLFeDTVDUEwTbL6AQMRiXuJFA9x/gIm7vzHP7joHCBm+eB9KCK6Wh3hw4astvJt X-Received: from venture.svl.corp.google.com ([2620:15c:2a3:200:dc88:e62e:3209:cc2b]) (user=venture job=sendgmr) by 2002:a25:c5c3:0:b0:628:b6f5:f721 with SMTP id v186-20020a25c5c3000000b00628b6f5f721mr20183136ybe.624.1647292322884; Mon, 14 Mar 2022 14:12:02 -0700 (PDT) Date: Mon, 14 Mar 2022 14:11:58 -0700 Message-Id: <20220314211158.4053690-1-venture@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.35.1.723.g4982287a31-goog Subject: [PATCH] hw/nvram: Add at24c-eeprom support for small eeproms From: Patrick Venture To: f4bug@amsat.org, cminyard@mvista.com Cc: qemu-devel@nongnu.org, Patrick Venture , Hao Wu X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::114a (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::114a; envelope-from=3oq8vYgcKCtcO7GMNK79HH9E7.5HFJ7FN-67O7EGHG9GN.HK9@flex--venture.bounces.google.com; helo=mail-yw1-x114a.google.com X-Spam_score_int: -81 X-Spam_score: -8.2 X-Spam_bar: -------- X-Spam_report: (-8.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, USER_IN_DEF_DKIM_WL=-7.5 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1647292851234100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Tested: Verified at24c02 driver happy and contents matched expectations. Signed-off-by: Patrick Venture Reviewed-by: Hao Wu --- hw/nvram/eeprom_at24c.c | 52 +++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c index 01a3093600..abf9898f94 100644 --- a/hw/nvram/eeprom_at24c.c +++ b/hw/nvram/eeprom_at24c.c @@ -45,6 +45,8 @@ struct EEPROMState { bool changed; /* during WRITE, # of address bytes transfered */ uint8_t haveaddr; + /* whether it's 8-bit addressed or 16-bit */ + bool eightbit; =20 uint8_t *mem; =20 @@ -85,7 +87,7 @@ uint8_t at24c_eeprom_recv(I2CSlave *s) EEPROMState *ee =3D AT24C_EE(s); uint8_t ret; =20 - if (ee->haveaddr =3D=3D 1) { + if (ee->haveaddr =3D=3D 1 && !ee->eightbit) { return 0xff; } =20 @@ -102,26 +104,35 @@ int at24c_eeprom_send(I2CSlave *s, uint8_t data) { EEPROMState *ee =3D AT24C_EE(s); =20 - if (ee->haveaddr < 2) { - ee->cur <<=3D 8; - ee->cur |=3D data; + if (ee->haveaddr < 1) { + ee->cur =3D data; ee->haveaddr++; - if (ee->haveaddr =3D=3D 2) { - ee->cur %=3D ee->rsize; + if (ee->eightbit) { DPRINTK("Set pointer %04x\n", ee->cur); } + return 0; + } else if (ee->haveaddr < 2) { + if (!ee->eightbit) { + ee->cur <<=3D 8; + ee->cur |=3D data; + ee->haveaddr++; + if (ee->haveaddr =3D=3D 2) { + ee->cur %=3D ee->rsize; + DPRINTK("Set pointer %04x\n", ee->cur); + } =20 - } else { - if (ee->writable) { - DPRINTK("Send %02x\n", data); - ee->mem[ee->cur] =3D data; - ee->changed =3D true; - } else { - DPRINTK("Send error %02x read-only\n", data); + return 0; } - ee->cur =3D (ee->cur + 1u) % ee->rsize; + } =20 + if (ee->writable) { + DPRINTK("Send %02x\n", data); + ee->mem[ee->cur] =3D data; + ee->changed =3D true; + } else { + DPRINTK("Send error %02x read-only\n", data); } + ee->cur =3D (ee->cur + 1u) % ee->rsize; =20 return 0; } @@ -131,12 +142,16 @@ static void at24c_eeprom_realize(DeviceState *dev, Er= ror **errp) EEPROMState *ee =3D AT24C_EE(dev); =20 if (ee->blk) { + /* blk length is a minimum of 1 sector. */ int64_t len =3D blk_getlength(ee->blk); =20 if (len !=3D ee->rsize) { - error_setg(errp, "%s: Backing file size %" PRId64 " !=3D %u", - TYPE_AT24C_EE, len, ee->rsize); - return; + /* for the at24c01 and at24c02, they are smaller than a sector= . */ + if (ee->rsize >=3D BDRV_SECTOR_SIZE) { + error_setg(errp, "%s: Backing file size %" PRId64 " !=3D %= u", + TYPE_AT24C_EE, len, ee->rsize); + return; + } } =20 if (blk_set_perm(ee->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRIT= E, @@ -148,6 +163,9 @@ static void at24c_eeprom_realize(DeviceState *dev, Erro= r **errp) } } =20 + if (ee->rsize < 512) { + ee->eightbit =3D true; + } ee->mem =3D g_malloc0(ee->rsize); } =20 --=20 2.35.1.723.g4982287a31-goog