From nobody Thu Oct 30 15:22:17 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525450910786328.22296894519627; Fri, 4 May 2018 09:21:50 -0700 (PDT) Received: from localhost ([::1]:35228 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEdSw-0004lO-3Y for importer@patchew.org; Fri, 04 May 2018 12:21:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55243) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEd8A-0003Ih-7B for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEd85-0001pf-D9 for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:22 -0400 Received: from mail-qt0-x242.google.com ([2607:f8b0:400d:c0d::242]:36118) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEd85-0001pZ-9O for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:17 -0400 Received: by mail-qt0-x242.google.com with SMTP id q6-v6so27971016qtn.3 for ; Fri, 04 May 2018 09:00:17 -0700 (PDT) Received: from x1.local ([138.117.48.222]) by smtp.gmail.com with ESMTPSA id a83sm8587066qkb.22.2018.05.04.09.00.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 04 May 2018 09:00:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lQ+oC/YFB5NE7Ir3RzmGLL/iOoEu2VKXM7YvfZljB6o=; b=ZezFZrUY+N6f8dHwJWk1QGID9G82CF44CYk1aYfrek1QYXwuk1JX60EyaLfNEGwQOH YsuGYEBjTaLQwL7NEnOGlIZycIDKjUG9NhhxX2xTGt3ErYjkShZgKlCtjmJWewb9jEDo I8cUhNUFpkbeyqKbwiD9dJHyhSHK0ZWU5naxuEmkVFij2ae/ga2nMXOWBSXtBBiw1RFp JZL/ApjpPELXHJVY1Tx7Mkyntm0d3Upg+/rfnJFKjokCGKAbMancqMQ7okJFMzZsgYAo MraS8MZT+peaqUBe2nC8uIhnS7dR7JZL4A9LN8FfYL3Ot4ml9KFEEvWKdZE1QOMHEZSG pcDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=lQ+oC/YFB5NE7Ir3RzmGLL/iOoEu2VKXM7YvfZljB6o=; b=AVjUt10soxKahdAqvEiB8ZC7bXAbHmkgJT05Zfna+oar17NhOdd7PeNy9kQjHvMV5B w0QoQMYKOMXOCvkjFZfxMW+WzubrmZexT+2BIj1JN156/dzJ0T0EvH2ErSSX52+tFuRP Lp8h2jwMcMvwZG6766ruYoq9qK4JwRzAvV3N/jvjkyuBUw6A5jLux1u4tcCm89wm5lzO xjHqBZIJCLiWXyxMtz7EOj6V+Vl/NcgjYMoKfL26cstbkj/+LM0nrMMOgYsNTL+u/bEl zIE3JhRvKgFYpd8dktKyhaYHn6iMBLHHvKWv2+hslqrDrZkGqx6sDVtY822PkrmtFQix E7Ww== X-Gm-Message-State: ALQs6tD1DvL9x6w/P4vHXwwA9lIBpcL+A6BApt0WVwhDP3WhvXPJJTfS LvBC5BU0MdDgeQAepp2Yurg= X-Google-Smtp-Source: AB8JxZqSKH9dUxxcjJjRgva1UeCiIY9ISllPOD5RuzXQ1qCpbs4VT+lOSWtPj+4we9tAeMPQ97VwfQ== X-Received: by 2002:ac8:2653:: with SMTP id v19-v6mr24288479qtv.126.1525449616739; Fri, 04 May 2018 09:00:16 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Peter Maydell , "Edgar E . Iglesias" Date: Fri, 4 May 2018 12:59:15 -0300 Message-Id: <20180504155918.21287-18-f4bug@amsat.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504155918.21287-1-f4bug@amsat.org> References: <20180504155918.21287-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::242 Subject: [Qemu-devel] [PATCH 17/20] sdcard: Add SDFrameData struct and data frame checksum functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Stefan Hajnoczi , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 The block transfers data frames are upto 512 bytes and use a 16-bit CRC. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- include/hw/sd/sd.h | 29 +++++++++++++++++++++++++++++ hw/sd/sdmmc-internal.c | 10 ++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h index c76be51b32..6bf9daf559 100644 --- a/include/hw/sd/sd.h +++ b/include/hw/sd/sd.h @@ -102,6 +102,17 @@ typedef struct SDFrame136 { uint8_t crc; } SDFrame136; =20 +/** + * SDFrameData: 512 bytes block transfers + * + * @content: block data + * @crc: 16-bit CRC checksum + */ +typedef struct SDFrameData { + uint8_t content[512]; + uint16_t crc; +} SDFrameData; + typedef struct SDFrame48 SDRequest; =20 typedef struct SDState SDState; @@ -212,6 +223,14 @@ void sd_update_frame48_checksum(SDFrame48 *frame, bool= is_response); */ void sd_update_frame136_checksum(SDFrame136 *frame); =20 +/** + * sd_update_framedata_checksum: + * @frame: the #SDFrameData to verify + * + * Update the 16-bit CRC checksum of a SD data frame (up to 512 bytes). + */ +void sd_update_framedata_checksum(SDFrameData *frame); + /** * sd_verify_frame48_checksum: * @frame: the #SDFrame48 to verify @@ -233,6 +252,16 @@ bool sd_verify_frame48_checksum(SDFrame48 *frame, bool= is_response); */ bool sd_verify_frame136_checksum(SDFrame136 *frame); =20 +/** + * sd_verify_framedata_checksum: + * @frame: the #SDFrameData to verify + * + * Verify the 16-bit CRC checksum of a SD data frame. + * + * Returns: A boolean indicating whether the frame 16-bit CRC is correct. + */ +bool sd_verify_framedata_checksum(SDFrameData *frame); + /* Legacy functions to be used only by non-qdevified callers */ SDState *sd_init(BlockBackend *bs, bool is_spi); int sd_do_command(SDState *sd, SDRequest *req, diff --git a/hw/sd/sdmmc-internal.c b/hw/sd/sdmmc-internal.c index 68350a2304..0e82e69d99 100644 --- a/hw/sd/sdmmc-internal.c +++ b/hw/sd/sdmmc-internal.c @@ -134,6 +134,11 @@ bool sd_verify_frame136_checksum(SDFrame136 *frame) return sd_calc_frame136_crc7(frame) =3D=3D frame->crc; } =20 +bool sd_verify_framedata_checksum(SDFrameData *frame) +{ + return sd_crc16(frame->content, sizeof(frame->content)) =3D=3D frame->= crc; +} + void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response) { frame->crc =3D sd_calc_frame48_crc7(frame->cmd, frame->arg, is_respons= e); @@ -144,6 +149,11 @@ void sd_update_frame136_checksum(SDFrame136 *frame) frame->crc =3D (sd_crc7(frame->content, sizeof(frame->content)) << 1) = | 1; } =20 +void sd_update_framedata_checksum(SDFrameData *frame) +{ + frame->crc =3D sd_crc16(frame->content, sizeof(frame->content)); +} + void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg, bool is_response, bool gen_crc) { --=20 2.17.0