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 1525450738088414.4541547886538; Fri, 4 May 2018 09:18:58 -0700 (PDT) Received: from localhost ([::1]:35195 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEdQ9-0001pv-8W for importer@patchew.org; Fri, 04 May 2018 12:18:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55211) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEd85-0003F5-K2 for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEd7z-0001mT-Uv for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:17 -0400 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:39600) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEd7z-0001m3-Q4 for qemu-devel@nongnu.org; Fri, 04 May 2018 12:00:11 -0400 Received: by mail-qk0-x243.google.com with SMTP id z75so16983317qkb.6 for ; Fri, 04 May 2018 09:00:11 -0700 (PDT) Received: from x1.local ([138.117.48.222]) by smtp.gmail.com with ESMTPSA id a83sm8587066qkb.22.2018.05.04.09.00.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 04 May 2018 09:00:10 -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=5XI4D7oMN/WWS7ZtohAeUbc6V90odl/DzXyf7+JIRh0=; b=M45XNNvhbpujruD/9WnTq4ZRYOyP7AbiNE3SFzKcL1Hm30TKFTJiYu7hbchAFGKafB 5CV1UdIk2Zwphfti2tpVmLCkKUgHvB8Fdtbo/wI+S2R4hcozvgnLCsPKeN1RB90uAv3d lqVvuw7/6D0Oir7FnxCwNfzE9CIG18NyttZ7FxCjIIg4A96NwaXZl9v3atUY56sW3KK9 P7VgI7+ndmfExqoFkcwCN3wNJpFcFfOUGFDE9c5ewD0MsIAvi9d4hL4kggjCUenLruS8 a8b+Yfk67rP19v8l4wPSqv1xkrmdM/mkWMdGBU1da2rVKk6nwpoOP9IHyvW7lhRIS0MC VuiQ== 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=5XI4D7oMN/WWS7ZtohAeUbc6V90odl/DzXyf7+JIRh0=; b=RNd90jh0d1OUbUnR1P+fmgJ06OrghA94uSS57hPJ5+COfZ66gvkq9b8qJ55BzRzk8C djIUkSINrX6qXJ0t8IM1Jj5len7Yj8U8/SfdYrguc2WKCD79F/2kb2i2zH8HcRmLPx9d nDjQoQPRQyPcuJIW9PdKkTLvnWRHW/u34BjwczaCSpePQnOqZzEVKsKpr7x6kT/4v8OL rys9N3XwOdF8qZdHrNofyj0/aHPo5NZcZfINA9jdorKCVLU0vnlmUlHUJw/jmPUjVtfY KS0XghNRKichfu9vzfNWkcUT5nVlD+uHUth9vfNd6gHyGcs/Zur6V/p44jbdFZsU9tSX me7A== X-Gm-Message-State: ALQs6tCYjO+hT8GSHHnhkB1xY9kjUxbMp1gJtUQrr6bsRIHBxq5QMadY 6cwVM2e9ad++WNL++u0Ut50= X-Google-Smtp-Source: AB8JxZpotWiENPDPTtLtpNB2NYqBr7+bnXHpR5MMn0h3jQYefHxepZT9aXrTR0qRGe3DgCCTCE51GA== X-Received: by 10.55.22.230 with SMTP id 99mr21670620qkw.90.1525449611197; Fri, 04 May 2018 09:00:11 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Peter Maydell , "Edgar E . Iglesias" Date: Fri, 4 May 2018 12:59:13 -0300 Message-Id: <20180504155918.21287-16-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:c09::243 Subject: [Qemu-devel] [PATCH 15/20] sdcard: Add SDFrame136 struct and 136-bit SD response frames 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 'read CID/CSD register' request returns a 136-bit frame containing those 128-bit registers. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- include/hw/sd/sd.h | 29 +++++++++++++++++++++++++++++ hw/sd/sdmmc-internal.c | 15 +++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h index 13de1b30c3..c76be51b32 100644 --- a/include/hw/sd/sd.h +++ b/include/hw/sd/sd.h @@ -91,6 +91,17 @@ typedef struct SDFrame48 { uint8_t crc; } SDFrame48; =20 +/** + * SDFrame136: 136 bits CID or CSD responses + * + * @content: CID or CSD register + * @crc: 7-bit CRC checksum + */ +typedef struct SDFrame136 { + uint8_t content[15]; + uint8_t crc; +} SDFrame136; + typedef struct SDFrame48 SDRequest; =20 typedef struct SDState SDState; @@ -193,6 +204,14 @@ void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd,= uint32_t arg, */ void sd_update_frame48_checksum(SDFrame48 *frame, bool is_response); =20 +/** + * sd_update_frame136_checksum: + * @frame: the #SDFrame136 to verify + * + * Update the 16-bit CRC checksum of a SD 136-bit frame. + */ +void sd_update_frame136_checksum(SDFrame136 *frame); + /** * sd_verify_frame48_checksum: * @frame: the #SDFrame48 to verify @@ -204,6 +223,16 @@ void sd_update_frame48_checksum(SDFrame48 *frame, bool= is_response); */ bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response); =20 +/** + * sd_verify_frame136_checksum: + * @frame: the #SDFrame48 to verify + * + * Verify the 16-bit CRC checksum of a SD 136-bit frame. + * + * Returns: A boolean indicating whether the frame 16-bit CRC is correct. + */ +bool sd_verify_frame136_checksum(SDFrame136 *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 c990cc9e8e..68350a2304 100644 --- a/hw/sd/sdmmc-internal.c +++ b/hw/sd/sdmmc-internal.c @@ -117,6 +117,11 @@ static uint8_t sd_calc_frame48_crc7(uint8_t cmd, uint3= 2_t arg, bool is_response) return sd_crc7(buffer, sizeof(buffer)); } =20 +static uint8_t sd_calc_frame136_crc7(SDFrame136 *frame) +{ + return (sd_crc7(frame->content, sizeof(frame->content)) << 1) | 1; +} + bool sd_verify_frame48_checksum(SDFrame48 *frame, bool is_response) { uint8_t crc =3D sd_calc_frame48_crc7(frame->cmd, frame->arg, is_respon= se); @@ -124,11 +129,21 @@ bool sd_verify_frame48_checksum(SDFrame48 *frame, boo= l is_response) return crc =3D=3D frame->crc; } =20 +bool sd_verify_frame136_checksum(SDFrame136 *frame) +{ + return sd_calc_frame136_crc7(frame) =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); } =20 +void sd_update_frame136_checksum(SDFrame136 *frame) +{ + frame->crc =3D (sd_crc7(frame->content, sizeof(frame->content)) << 1) = | 1; +} + void sd_prepare_frame48(SDFrame48 *frame, uint8_t cmd, uint32_t arg, bool is_response, bool gen_crc) { --=20 2.17.0