From patchwork Thu Jan 28 06:30:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432552 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=F0bAViwO; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9cW1Vj1z9sBy for ; Thu, 28 Jan 2021 17:32:11 +1100 (AEDT) Received: from localhost ([::1]:38848 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50qf-0007Ju-4x for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:32:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36014) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pN-0006z0-UY; Thu, 28 Jan 2021 01:30:49 -0500 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]:39822) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pM-0001Ak-4U; Thu, 28 Jan 2021 01:30:49 -0500 Received: by mail-pl1-x62f.google.com with SMTP id b17so2774062plz.6; Wed, 27 Jan 2021 22:30:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vM1qdMkN6F77URC3NRV2IHY8+Dmwaotpvyy9SZ1Xe3c=; b=F0bAViwOlcqC7i/lSgAX3JVuEsy6b3lLJr/LDHmuR5n9hSC11Ta70osVceQrQgY1TB vK4oSO+cu+W//UCbputsy+fWwGmwqU7I9EzDP5JxTOe2cy3xmysX7AVNgyH8n89Ee7sG GPWLWGM8VGsKDIDHwYhL48clfdPM0yMiyO38X6EdYupLfzgB/2a/AaiI5wB3CYnVcsnq ckFQ4g0Rp39NSI3Puongxy9Zc5mFnIikDlF0oXid4izgmbyBaQ3UCyjxMlV6quPBSrhG AIQZ731iwV5XrnPenjXOsg17kUX6+bz2Is5jV/XMCafxx8+hFsXzwBe0kYOrLO3tBb69 9v2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vM1qdMkN6F77URC3NRV2IHY8+Dmwaotpvyy9SZ1Xe3c=; b=bcp6rYcBHv40CRXKY6cmnd4faLoFMZahBlu49g1GfFtsv+IqswCAZZWss1fo5EOFJI vzjQNVKLmI77bQKfqhwQfxvnuXtwyZCRQH/n29Hgrp+d7XPfOG98QDVxIgZESAgRbvAC Rnu2KQEaetsDLEHpedQkCz8yUt012DZoQIkmOBUElCHtc7kIyT22FNu0i+JwQwSw9Qzu zAUr/E+s4/OUgEvZKTdKJK4A9niNTGfiK3F2G5scukcOW9oTv4drQkkCBuPlc8dGQDsB JBrOfF4ul6TkOrLpv1XNjmJN5mY8MEgI3QPT/3n1o0xj8WdHNWuy/O6D08U/n3ZLjm8j Thhg== X-Gm-Message-State: AOAM532GviKrsoEEEDD5AEhpwgfup2YukYLIvRWkG5jVj8XV9T0WnhoK yuM7Q94+C3jvlUQ9CFd3uww= X-Google-Smtp-Source: ABdhPJyVKtWH2X1n+PNI9/hQ3OoET0X3ZbNAiKGTbdhHHu11NkDtn6fSMbn6tLiwb9Z5ScgdwBrzyg== X-Received: by 2002:a17:903:228e:b029:de:2bee:150d with SMTP id b14-20020a170903228eb02900de2bee150dmr15269880plh.18.1611815446427; Wed, 27 Jan 2021 22:30:46 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:45 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 1/9] hw/sd: ssi-sd: Support multiple block read Date: Thu, 28 Jan 2021 14:30:27 +0800 Message-Id: <20210128063035.15674-2-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng In the case of a multiple block read operation every transferred block has its suffix of CRC16. Update the state machine logic to handle multiple block read. Signed-off-by: Bin Meng Acked-by: Alistair Francis [PMD: Change VMState version id 5 -> 6] Signed-off-by: Philippe Mathieu-Daudé Tested-by: Philippe Mathieu-Daudé --- (no changes since v1) hw/sd/ssi-sd.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index be1bb10164..6d20a240c6 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -52,6 +52,7 @@ struct ssi_sd_state { uint8_t cmdarg[4]; uint8_t response[5]; uint16_t crc16; + int32_t read_bytes; int32_t arglen; int32_t response_pos; int32_t stopping; @@ -88,11 +89,26 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) { ssi_sd_state *s = SSI_SD(dev); - /* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */ - if (s->mode == SSI_SD_DATA_READ && val == 0x4c) { - s->mode = SSI_SD_CMD; - /* There must be at least one byte delay before the card responds. */ - s->stopping = 1; + /* + * Special case: allow CMD12 (STOP TRANSMISSION) while reading data. + * + * See "Physical Layer Specification Version 8.00" chapter 7.5.2.2, + * to avoid conflict between CMD12 response and next data block, + * timing of CMD12 should be controlled as follows: + * + * - CMD12 issued at the timing that end bit of CMD12 and end bit of + * data block is overlapped + * - CMD12 issued after one clock cycle after host receives a token + * (either Start Block token or Data Error token) + * + * We need to catch CMD12 in all of the data read states. + */ + if (s->mode >= SSI_SD_PREP_DATA && s->mode <= SSI_SD_DATA_CRC16) { + if (val == 0x4c) { + s->mode = SSI_SD_CMD; + /* There must be at least one byte delay before the card responds */ + s->stopping = 1; + } } switch (s->mode) { @@ -212,8 +228,9 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) return SSI_TOKEN_SINGLE; case SSI_SD_DATA_READ: val = sdbus_read_byte(&s->sdbus); + s->read_bytes++; s->crc16 = crc_ccitt_false(s->crc16, (uint8_t *)&val, 1); - if (!sdbus_data_ready(&s->sdbus)) { + if (!sdbus_data_ready(&s->sdbus) || s->read_bytes == 512) { DPRINTF("Data read end\n"); s->mode = SSI_SD_DATA_CRC16; } @@ -224,7 +241,12 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) s->response_pos++; if (s->response_pos == 2) { DPRINTF("CRC16 read end\n"); - s->mode = SSI_SD_CMD; + if (s->read_bytes == 512 && s->cmd != 17) { + s->mode = SSI_SD_PREP_DATA; + } else { + s->mode = SSI_SD_CMD; + } + s->read_bytes = 0; s->response_pos = 0; } return val; @@ -255,8 +277,8 @@ static int ssi_sd_post_load(void *opaque, int version_id) static const VMStateDescription vmstate_ssi_sd = { .name = "ssi_sd", - .version_id = 5, - .minimum_version_id = 5, + .version_id = 6, + .minimum_version_id = 6, .post_load = ssi_sd_post_load, .fields = (VMStateField []) { VMSTATE_UINT32(mode, ssi_sd_state), @@ -264,6 +286,7 @@ static const VMStateDescription vmstate_ssi_sd = { VMSTATE_UINT8_ARRAY(cmdarg, ssi_sd_state, 4), VMSTATE_UINT8_ARRAY(response, ssi_sd_state, 5), VMSTATE_UINT16(crc16, ssi_sd_state), + VMSTATE_INT32(read_bytes, ssi_sd_state), VMSTATE_INT32(arglen, ssi_sd_state), VMSTATE_INT32(response_pos, ssi_sd_state), VMSTATE_INT32(stopping, ssi_sd_state), @@ -316,6 +339,7 @@ static void ssi_sd_reset(DeviceState *dev) memset(s->cmdarg, 0, sizeof(s->cmdarg)); memset(s->response, 0, sizeof(s->response)); s->crc16 = 0; + s->read_bytes = 0; s->arglen = 0; s->response_pos = 0; s->stopping = 0; From patchwork Thu Jan 28 06:30:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432553 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=qcLBgdIx; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9cw2jC9z9sBy for ; Thu, 28 Jan 2021 17:32:31 +1100 (AEDT) Received: from localhost ([::1]:38926 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50qy-0007MV-0y for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:32:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36036) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pP-000740-TZ; Thu, 28 Jan 2021 01:30:51 -0500 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]:43775) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pO-0001B0-7V; Thu, 28 Jan 2021 01:30:51 -0500 Received: by mail-pl1-x636.google.com with SMTP id 31so2763969plb.10; Wed, 27 Jan 2021 22:30:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Qu1ZmvGNvRZOgkDiq631N2CdZ3gr5633WsnUpwSjfns=; b=qcLBgdIxmKQmyb9Z3+0hiKwCyHqFBJQhiy/yl1J6PqYJkZmFOKBhyRjkhfMobsotqu QZ02uV/6o14eb2orkaAb+6XrlqsXLI1it0LcIiaed55ncKn4hiaK++0lZflS7hwIIEqh HK4f0WV9iQT7T/aaalaEbl8SGlQsiFB16HeYOEtcjWD8vwXsrXdL6pfderM7tQ5kURCa jtHKadBYvB/X8vU9qmWzclDrpqhy3xtNVI0c4dKS4fdXJmtTamqRmUjmJFdfGSi4rKS+ nVjUc+gs6fZUF3DVtzMUJIx49ENelDQV6sLGrK2eZ+St+gL5Cj59RwtCxWR91k/l/UqH z/EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qu1ZmvGNvRZOgkDiq631N2CdZ3gr5633WsnUpwSjfns=; b=kCnfKYE99W25WZfJiM3COlH2oYg2st+1d8t0c0YNp6hlYlQb4XmdBrdAZZCb4dTzE9 rkIbdD1b2z1cPjmbWphhkmADdBTLiRk+E4WFUlU4FYh2xEm2kMUu0wFqukrVBZqpzUgp 8Mg1TI30zPpi9+9hH5XKY0akrlNWIr6+Q6hOKsxalJUHtyHW7bA6CViNRyMsAb9NPiof t9v0wxy9mn6sxyLK7+Kv2kofy+mOsxxRqAwkKk3ltBxj5TpS2keZH+9OjFdWQTxDisVl Hyb6wxMs8rtnEiQuPKEQO3Za4RyZsBfgVPXA/trdT7FvomJekoXUo8BCrstfNni8PS/0 S5fw== X-Gm-Message-State: AOAM5333dKlZa/vRVP4suAcvPudL02wO4AD9RbwZnY2bHXwQHE7Vfspz ISpktwONB8cXQ+xIAT4/4g0= X-Google-Smtp-Source: ABdhPJw2aCbxu1XRT8FBp7MVAifejtzuITINaklqoCekicAiTbcGTfQyVUaEdODXkKQXnwkMjYlBnQ== X-Received: by 2002:a17:902:eec4:b029:de:aa86:5269 with SMTP id h4-20020a170902eec4b02900deaa865269mr14939251plb.66.1611815448634; Wed, 27 Jan 2021 22:30:48 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:48 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 2/9] hw/sd: sd: Remove duplicated codes in single/multiple block read/write Date: Thu, 28 Jan 2021 14:30:28 +0800 Message-Id: <20210128063035.15674-3-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::636; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x636.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng The single block read (CMD17) codes are the same as the multiple block read (CMD18). Merge them into one. The same applies to single block write (CMD24) and multiple block write (CMD25). Signed-off-by: Bin Meng Acked-by: Alistair Francis Tested-by: Philippe Mathieu-Daudé --- (no changes since v1) hw/sd/sd.c | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index b3952514fe..09753359bb 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1181,24 +1181,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) break; case 17: /* CMD17: READ_SINGLE_BLOCK */ - switch (sd->state) { - case sd_transfer_state: - - if (addr + sd->blk_len > sd->size) { - sd->card_status |= ADDRESS_ERROR; - return sd_r1; - } - - sd->state = sd_sendingdata_state; - sd->data_start = addr; - sd->data_offset = 0; - return sd_r1; - - default: - break; - } - break; - case 18: /* CMD18: READ_MULTIPLE_BLOCK */ switch (sd->state) { case sd_transfer_state: @@ -1245,35 +1227,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) /* Block write commands (Class 4) */ case 24: /* CMD24: WRITE_SINGLE_BLOCK */ - switch (sd->state) { - case sd_transfer_state: - /* Writing in SPI mode not implemented. */ - if (sd->spi) - break; - - if (addr + sd->blk_len > sd->size) { - sd->card_status |= ADDRESS_ERROR; - return sd_r1; - } - - sd->state = sd_receivingdata_state; - sd->data_start = addr; - sd->data_offset = 0; - sd->blk_written = 0; - - if (sd_wp_addr(sd, sd->data_start)) { - sd->card_status |= WP_VIOLATION; - } - if (sd->csd[14] & 0x30) { - sd->card_status |= WP_VIOLATION; - } - return sd_r1; - - default: - break; - } - break; - case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */ switch (sd->state) { case sd_transfer_state: From patchwork Thu Jan 28 06:30:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432551 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=m0BTxM/u; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9cR2G32z9sBy for ; Thu, 28 Jan 2021 17:32:06 +1100 (AEDT) Received: from localhost ([::1]:38692 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50qa-0007FV-D3 for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:32:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36050) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pS-0007Ag-64; Thu, 28 Jan 2021 01:30:54 -0500 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]:35434) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pQ-0001C6-Jw; Thu, 28 Jan 2021 01:30:53 -0500 Received: by mail-pj1-x1030.google.com with SMTP id e9so3689067pjj.0; Wed, 27 Jan 2021 22:30:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kMsOFaYrDqrM3oafqHcNkqRMKkyVjGhWzktlMuJ5kRI=; b=m0BTxM/uT4TxXij/uSOFrfVXjFFciC/91YUgQJSxtDhYMTQLqeVlNBaPoCo280rd9l LIH3SADKFeKf7yt2sNutnBj9PDKKRSmJbPRJx/mGiejs0cdD1lu3bZ/ODUu0hXzyetaj oZEieFIuCl50Z0flc6EuRKhjqa8SDTirIQ2FXSh6n7yDQoTZp6K5eSE5hyjvmrMPyl7O w+pPvrTmqzUpYpDdxi5CqnqtCWgZrpEyB8MhR7kMY/rDvI043qlvzbSQUEU6oxJJDPn1 X/qysoYF6pTUTFeMOvd4F8TxkIO+Ct/6LYaISGiEX9zf78FZdbbmA+SBPk0x1xSKw1U3 WDsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kMsOFaYrDqrM3oafqHcNkqRMKkyVjGhWzktlMuJ5kRI=; b=oUIwcn3gR6uDyeaNlzFBxNJS0DayMgWuUQa6y8pDf4XMb0VneRd8+jxLfb9HiFKMqR OhFjtvjjzq4e2dJ+zIgt4HlcWytj2POb6zOE5B+w41TmJ1fcz8W4FjFkX7hObGcTpvQ5 WZblGpljdkcVFwuaZ1fXdlca4QuVc1G/C5GhVEfCThbBwEPTMnTVo30r6cZy8PqkYYKP S6iXUKETpTo5ZfAEJy3xE92Ws1tqPOGx9mRCxQ3ojjWadVYQct7BBV23oLE/rWKfbmML bkFOGM9FFoChd2t0/nXcOVTWdTSOTNuIf9zANSgu3X6D0RZBn+oT27s1Ag20/k+BzKA2 +UUQ== X-Gm-Message-State: AOAM532Tqy1Lf1KNqbKiDW7WODsJpbH5YG0BCTl+EKISe0e7YKYLP0hh Zu5bXlAnQi5YuWuBaKVXalN6YqVMe4Lx+w== X-Google-Smtp-Source: ABdhPJwtyINsq8Z2W+7twtCWQ+nReJAJYlifneM/GzwS5wBRaPXhYvXvAyPHj9JjcdAUCUTi0mBPAA== X-Received: by 2002:a17:90a:5208:: with SMTP id v8mr9529046pjh.224.1611815450943; Wed, 27 Jan 2021 22:30:50 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:50 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 3/9] hw/sd: sd: Allow single/multiple block write for SPI mode Date: Thu, 28 Jan 2021 14:30:29 +0800 Message-Id: <20210128063035.15674-4-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::1030; envelope-from=bmeng.cn@gmail.com; helo=mail-pj1-x1030.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng At present the single/multiple block write in SPI mode is blocked by sd_normal_command(). Remove the limitation. Signed-off-by: Bin Meng Acked-by: Alistair Francis Tested-by: Philippe Mathieu-Daudé --- (no changes since v1) hw/sd/sd.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 09753359bb..946036d87c 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1230,9 +1230,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */ switch (sd->state) { case sd_transfer_state: - /* Writing in SPI mode not implemented. */ - if (sd->spi) - break; if (addr + sd->blk_len > sd->size) { sd->card_status |= ADDRESS_ERROR; From patchwork Thu Jan 28 06:30:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432555 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=X94N42WM; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9hG2V5Cz9sBy for ; Thu, 28 Jan 2021 17:35:26 +1100 (AEDT) Received: from localhost ([::1]:48318 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50to-0002tN-Aq for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:35:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36080) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pU-0007G1-Ik; Thu, 28 Jan 2021 01:30:56 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]:44838) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pS-0001DE-OE; Thu, 28 Jan 2021 01:30:56 -0500 Received: by mail-pl1-x62d.google.com with SMTP id j11so165739plt.11; Wed, 27 Jan 2021 22:30:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1+nUxbD7OBql8LM3iJZPpv3YM4qCKFlEktpo4pY1M1Y=; b=X94N42WMt/FwAX7RlK/OfiC4MxzYJB49qBMG0B8tQQjhbvYfD3enV1FpkAWfk9kxK7 4f7rVdSxf1ieikFZm2Dtro7SyJ8Qqn8zZM7XhFjQS3rH4JZ6AMPh7FC04Vyts5AnyGqZ YBg0rGPQkV97k7T6yfSkvLRrOZ8JQZAT8tsepEFEKzCU8kL5DOtBbPOi/XpjI21T+8pI BO5kN46AoAmj6bKGkND0+isrwz9nbQS49GbWfeRffyPSnBm+lOtSeo8VMb3Ej+GTijYz RMR5N3+LR4nww42gL4GpwDM7/HHJ/5EfCiAG8BnMFB5+Cy2jtLwYVDrczlCkD6jtI4wR GE7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1+nUxbD7OBql8LM3iJZPpv3YM4qCKFlEktpo4pY1M1Y=; b=EoT9Y78MCrIpa/vbyhp/VIvuR+IKJZ+X0F4B1tgqJu+eGJS/XoVkZDv4uxvQSznr5G npoaXm2Pq0DHv2La+FXC2ElE606H0GSXMiCFx6cwd8Y21yf0qPHxfo8faZNMrJr2IXi2 uFdcNqPGfBKQ/dgjvTWWTT4uQEm4OqMqir5ziqHULWw9iZk23IgI61Dq4GQqMO+hzfIp pRJsjVC8GF9SF8qNejKVFAqdhmkPvA8MDPjoT05rIICXX6hkFCChWmOAI5yfFEeIt4vH dzgnzA9B87sBFxl+P75a3nQ2gAtgcyQs7hTEmoejeWdOaQYwdADc9wFr96ayQrVh0/7b j94Q== X-Gm-Message-State: AOAM532LQLv5brs7avSOdsakojoSrG5csPprhFPyU4XuO29I9zhlgnc4 0ILGHZM3fsqGCnQKH4PVXI8= X-Google-Smtp-Source: ABdhPJwdKGANXyRFj9pfZf2dw3X9vayyNdaU+XkHWVNIdoe8zW6CoGLnwH+BbcWeBLyFwXnF8fSvbA== X-Received: by 2002:a17:90b:370d:: with SMTP id mg13mr9707075pjb.161.1611815453147; Wed, 27 Jan 2021 22:30:53 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:52 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 4/9] hw/sd: Introduce receive_ready() callback Date: Thu, 28 Jan 2021 14:30:30 +0800 Message-Id: <20210128063035.15674-5-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng At present there is a data_ready() callback for the SD data read path. Let's add a receive_ready() for the SD data write path. Signed-off-by: Bin Meng Reviewed-by: Philippe Mathieu-Daudé Acked-by: Alistair Francis Tested-by: Philippe Mathieu-Daudé --- (no changes since v1) include/hw/sd/sd.h | 2 ++ hw/sd/core.c | 13 +++++++++++++ hw/sd/sd.c | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h index 05ef9b73e5..47360ba4ee 100644 --- a/include/hw/sd/sd.h +++ b/include/hw/sd/sd.h @@ -116,6 +116,7 @@ struct SDCardClass { * Return: byte value read */ uint8_t (*read_byte)(SDState *sd); + bool (*receive_ready)(SDState *sd); bool (*data_ready)(SDState *sd); void (*set_voltage)(SDState *sd, uint16_t millivolts); uint8_t (*get_dat_lines)(SDState *sd); @@ -187,6 +188,7 @@ void sdbus_write_data(SDBus *sdbus, const void *buf, size_t length); * Read multiple bytes of data on the data lines of a SD bus. */ void sdbus_read_data(SDBus *sdbus, void *buf, size_t length); +bool sdbus_receive_ready(SDBus *sd); bool sdbus_data_ready(SDBus *sd); bool sdbus_get_inserted(SDBus *sd); bool sdbus_get_readonly(SDBus *sd); diff --git a/hw/sd/core.c b/hw/sd/core.c index 08c93b5903..30ee62c510 100644 --- a/hw/sd/core.c +++ b/hw/sd/core.c @@ -160,6 +160,19 @@ void sdbus_read_data(SDBus *sdbus, void *buf, size_t length) } } +bool sdbus_receive_ready(SDBus *sdbus) +{ + SDState *card = get_card(sdbus); + + if (card) { + SDCardClass *sc = SD_CARD_GET_CLASS(card); + + return sc->receive_ready(card); + } + + return false; +} + bool sdbus_data_ready(SDBus *sdbus) { SDState *card = get_card(sdbus); diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 946036d87c..c99c0e93bb 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -2037,6 +2037,11 @@ uint8_t sd_read_byte(SDState *sd) return ret; } +static bool sd_receive_ready(SDState *sd) +{ + return sd->state == sd_receivingdata_state; +} + static bool sd_data_ready(SDState *sd) { return sd->state == sd_sendingdata_state; @@ -2147,6 +2152,7 @@ static void sd_class_init(ObjectClass *klass, void *data) sc->do_command = sd_do_command; sc->write_byte = sd_write_byte; sc->read_byte = sd_read_byte; + sc->receive_ready = sd_receive_ready; sc->data_ready = sd_data_ready; sc->enable = sd_enable; sc->get_inserted = sd_get_inserted; From patchwork Thu Jan 28 06:30:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432556 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=jOHE+Lje; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9hS3Jzjz9sBy for ; Thu, 28 Jan 2021 17:35:36 +1100 (AEDT) Received: from localhost ([::1]:47640 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50ty-0002aU-EM for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:35:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36098) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pX-0007Ni-Us; Thu, 28 Jan 2021 01:30:59 -0500 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]:45124) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pV-0001Dm-4w; Thu, 28 Jan 2021 01:30:59 -0500 Received: by mail-pl1-x62e.google.com with SMTP id b8so2759444plh.12; Wed, 27 Jan 2021 22:30:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kiZzURgNKUaKMTl+/k2tJPs5zx6O3LyssmArnoO6Yl0=; b=jOHE+Ljegb5xTqZmPlAXhMaCi9IIpaLTlTZHe5fiuj0LjvnVXKKFcNqdX3lj/mtGft A0XXI3p1iX1TABZktR9umgAk1WRZTKm7BAN4Fxt7rc2hxEtl2WN8bUuh84uHrpg6/LaV gH2MivO5UgEjIMchEA4FaNrN2ZNv8Ksm4ffjgeyWTi1AAAknMHYPnN726b9JGae5XPV1 8SHdslJZWViSlHlqldy9NFs6VMKq3lhPGRu8po4q6OBW9sSL00vbWoMlrkfY4FNu/M8Z TlCyvM6r5wI41TQZQKsrbOeMmsYLXIXRt2FA8/ikm63JzqN2KC9Om4ESrE1VY6x/TlGj axLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kiZzURgNKUaKMTl+/k2tJPs5zx6O3LyssmArnoO6Yl0=; b=i0Z+VYpLnPdDLPB7K94HwS0nmh3S7REOEQ576LHDG5MCLa0KMkjVFbfIl99iD5+8cX hA9C8C4wVn1X4o/9QFFWfu9oE+UOgb9lYuwdFth9jHYl/MByXWq6UHurZL8QKuWkantZ whOcMLA8DmvoBSbwjRXhXXane+aqLc6wy1jppuQGE6YzZKWP/ligGeyqrGocg8xR9RMp 3zGgcj/0wfzRbjx5vxVBhNyine6mY5X3eQG1UhrRSE3CZwZDeQPcGpZo95dZqPsuim4Z p5Qaix2vYiCHTWKT5RgqmTjTc0QXkqfYDhLZfIUFT7tiqS7Gp9k+e6jnGf/jZ30BHjUp 0uYA== X-Gm-Message-State: AOAM530JHGp74PPzaNds7vtihuaoqmuwq83PkShzrauUo/7VmDZAymFv HTZ+f8lwOHrelBMF/5gR43Vms5ZWj8M0pA== X-Google-Smtp-Source: ABdhPJw1Dcindqpig794Em8dkeY6Ft1AF85Z0iTa9dGsa47NeUR2jjGG0Cs12PJe8K+VLHvw2eUamg== X-Received: by 2002:a17:902:7008:b029:df:fb48:8c3a with SMTP id y8-20020a1709027008b02900dffb488c3amr14780318plk.19.1611815455414; Wed, 27 Jan 2021 22:30:55 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:55 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 5/9] hw/sd: ssi-sd: Support single block write Date: Thu, 28 Jan 2021 14:30:31 +0800 Message-Id: <20210128063035.15674-6-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62e; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x62e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng Add 2 more states for the block write operation. The SPI host needs to send a data start token to start the transfer, and the data block written to the card will be acknowledged by a data response token. Signed-off-by: Bin Meng Acked-by: Alistair Francis [PMD: Change VMState version id 6 -> 7] Signed-off-by: Philippe Mathieu-Daudé Tested-by: Philippe Mathieu-Daudé --- (no changes since v1) hw/sd/ssi-sd.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index 6d20a240c6..1205ad8b52 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -43,6 +43,8 @@ typedef enum { SSI_SD_DATA_START, SSI_SD_DATA_READ, SSI_SD_DATA_CRC16, + SSI_SD_DATA_WRITE, + SSI_SD_SKIP_CRC16, } ssi_sd_mode; struct ssi_sd_state { @@ -53,6 +55,7 @@ struct ssi_sd_state { uint8_t response[5]; uint16_t crc16; int32_t read_bytes; + int32_t write_bytes; int32_t arglen; int32_t response_pos; int32_t stopping; @@ -85,6 +88,9 @@ OBJECT_DECLARE_SIMPLE_TYPE(ssi_sd_state, SSI_SD) /* dummy value - don't care */ #define SSI_DUMMY 0xff +/* data accepted */ +#define DATA_RESPONSE_ACCEPTED 0x05 + static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) { ssi_sd_state *s = SSI_SD(dev); @@ -113,10 +119,17 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) switch (s->mode) { case SSI_SD_CMD: - if (val == SSI_DUMMY) { + switch (val) { + case SSI_DUMMY: DPRINTF("NULL command\n"); return SSI_DUMMY; + break; + case SSI_TOKEN_SINGLE: + DPRINTF("Start write block\n"); + s->mode = SSI_SD_DATA_WRITE; + return SSI_DUMMY; } + s->cmd = val & 0x3f; s->mode = SSI_SD_CMDARG; s->arglen = 0; @@ -250,6 +263,27 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) s->response_pos = 0; } return val; + case SSI_SD_DATA_WRITE: + sdbus_write_byte(&s->sdbus, val); + s->write_bytes++; + if (!sdbus_receive_ready(&s->sdbus) || s->write_bytes == 512) { + DPRINTF("Data write end\n"); + s->mode = SSI_SD_SKIP_CRC16; + s->response_pos = 0; + } + return val; + case SSI_SD_SKIP_CRC16: + /* we don't verify the crc16 */ + s->response_pos++; + if (s->response_pos == 2) { + DPRINTF("CRC16 receive end\n"); + s->mode = SSI_SD_RESPONSE; + s->write_bytes = 0; + s->arglen = 1; + s->response[0] = DATA_RESPONSE_ACCEPTED; + s->response_pos = 0; + } + return SSI_DUMMY; } /* Should never happen. */ return SSI_DUMMY; @@ -259,7 +293,7 @@ static int ssi_sd_post_load(void *opaque, int version_id) { ssi_sd_state *s = (ssi_sd_state *)opaque; - if (s->mode > SSI_SD_DATA_CRC16) { + if (s->mode > SSI_SD_SKIP_CRC16) { return -EINVAL; } if (s->mode == SSI_SD_CMDARG && @@ -277,8 +311,8 @@ static int ssi_sd_post_load(void *opaque, int version_id) static const VMStateDescription vmstate_ssi_sd = { .name = "ssi_sd", - .version_id = 6, - .minimum_version_id = 6, + .version_id = 7, + .minimum_version_id = 7, .post_load = ssi_sd_post_load, .fields = (VMStateField []) { VMSTATE_UINT32(mode, ssi_sd_state), @@ -287,6 +321,7 @@ static const VMStateDescription vmstate_ssi_sd = { VMSTATE_UINT8_ARRAY(response, ssi_sd_state, 5), VMSTATE_UINT16(crc16, ssi_sd_state), VMSTATE_INT32(read_bytes, ssi_sd_state), + VMSTATE_INT32(write_bytes, ssi_sd_state), VMSTATE_INT32(arglen, ssi_sd_state), VMSTATE_INT32(response_pos, ssi_sd_state), VMSTATE_INT32(stopping, ssi_sd_state), @@ -340,6 +375,7 @@ static void ssi_sd_reset(DeviceState *dev) memset(s->response, 0, sizeof(s->response)); s->crc16 = 0; s->read_bytes = 0; + s->write_bytes = 0; s->arglen = 0; s->response_pos = 0; s->stopping = 0; From patchwork Thu Jan 28 06:30:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432558 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=GhHWurhy; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9pv19c0z9sSC for ; Thu, 28 Jan 2021 17:41:11 +1100 (AEDT) Received: from localhost ([::1]:57720 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50zL-00076v-0S for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:41:07 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36108) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pZ-0007PH-J3; Thu, 28 Jan 2021 01:31:01 -0500 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]:41040) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pX-0001Ef-7U; Thu, 28 Jan 2021 01:31:01 -0500 Received: by mail-pl1-x636.google.com with SMTP id h15so2765329pli.8; Wed, 27 Jan 2021 22:30:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=afDz9PCYu5aSX7IpsLMahZVGXDBSh7683K7tqxoMULI=; b=GhHWurhyv5dWvH/FBnFcVRBjV8cMa7ZLRN0j9JqvsvUHQSGaG6f6QvhcF4dkJyxZHo lNYAFilLfqtG7SNzaif9pO4r6faygVGxaH4lQzyDmwRsVuOh5WKMyet/oymVbqzP5MaB bURN6LtcXs9Y4n6/0J2x64wwnGlPUkN8LRC6fgTVMb3dvn/gq75m4WxjK+dRtUaP7nUK i6BIZnOEmvIo4zg5MpsAkv/FFKByNXJrIkuTWkiDiz5W/OK0CgQCIA0l9K9EWzn/YVmK 9d6W93LYmx/k+matL2SDgjMNdeTsZp9Om72myT0RF3NucQg3b3w5I1K8m8DQ+f1XgnRl Rm9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=afDz9PCYu5aSX7IpsLMahZVGXDBSh7683K7tqxoMULI=; b=iOzEa9vB+uTZjGeqxLAsUeV7YAoxSthyBMIzCfCXrg0AqSk/jiMztoRKJGYaw8K8tz Bqbdx97N+hIrwOT60DIhuVMUfq7kr11JlpnS4UPhcUlvJUkMefhQ8j36uGSUsCGuv6Yx plnlVZSKjXQnQr8cvpnN3JYbyAF3tOroJk/GWAOcOpbHb+UF5n9AWakR9Rt9VWlORC6d qyU0KqX/ViZVgmEx0r6if9j0pKt7+4ghdQMuUdnM+FpkWGKt/6M+QdMqG0mj9rPc9eec Evn1F7PFgPT64KA+qWUJoa8+z4OdxcYf1fmb1uXJx0x4zBUZlZt9qvk8CdeVA6XWhytL k4GA== X-Gm-Message-State: AOAM532hkxwpRGGZcdB78fSKn6ptFex1Gm0gXtyJdXROtFbnKLUFoTJz xqYNJBlHaACI48sHfGHmG6w= X-Google-Smtp-Source: ABdhPJzgs/8BOOg5l1Ui1z7DZIbDD963QV+sbZX9N0P+VKsn0+4UlDbB0FNRzWmnWDKnbynkD2UMzA== X-Received: by 2002:a17:90b:4acc:: with SMTP id mh12mr9678110pjb.10.1611815457678; Wed, 27 Jan 2021 22:30:57 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:57 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 6/9] hw/sd: ssi-sd: Support multiple block write Date: Thu, 28 Jan 2021 14:30:32 +0800 Message-Id: <20210128063035.15674-7-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::636; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x636.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng , Alistair Francis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng For a multiple block write operation, each block begins with a multi write start token. Unlike the SD mode that the multiple block write ends when receiving a STOP_TRAN command (CMD12), a special stop tran token is used to signal the card. Emulating this by manually sending a CMD12 to the SD card core, to bring it out of the receiving data state. Signed-off-by: Bin Meng Acked-by: Alistair Francis Tested-by: Philippe Mathieu-Daudé --- Changes in v4: - Keep the card state to SSI_SD_CMD instead of SSI_SD_RESPONSE after receiving the STOP_TRAN token per the spec hw/sd/ssi-sd.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index 1205ad8b52..200e885225 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -4,6 +4,11 @@ * Copyright (c) 2007-2009 CodeSourcery. * Written by Paul Brook * + * Copyright (c) 2021 Wind River Systems, Inc. + * Improved by Bin Meng + * + * Validated with U-Boot v2021.01 and Linux v5.10 mmc_spi driver + * * This code is licensed under the GNU GPL v2. * * Contributions after 2012-01-13 are licensed under the terms of the @@ -82,6 +87,10 @@ OBJECT_DECLARE_SIMPLE_TYPE(ssi_sd_state, SSI_SD) #define SSI_SDR_ADDRESS_ERROR 0x2000 #define SSI_SDR_PARAMETER_ERROR 0x4000 +/* multiple block write */ +#define SSI_TOKEN_MULTI_WRITE 0xfc +/* terminate multiple block write */ +#define SSI_TOKEN_STOP_TRAN 0xfd /* single block read/write, multiple block read */ #define SSI_TOKEN_SINGLE 0xfe @@ -94,6 +103,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(ssi_sd_state, SSI_SD) static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) { ssi_sd_state *s = SSI_SD(dev); + SDRequest request; + uint8_t longresp[16]; /* * Special case: allow CMD12 (STOP TRANSMISSION) while reading data. @@ -125,8 +136,28 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) return SSI_DUMMY; break; case SSI_TOKEN_SINGLE: + case SSI_TOKEN_MULTI_WRITE: DPRINTF("Start write block\n"); s->mode = SSI_SD_DATA_WRITE; + return SSI_DUMMY; + case SSI_TOKEN_STOP_TRAN: + DPRINTF("Stop multiple write\n"); + + /* manually issue cmd12 to stop the transfer */ + request.cmd = 12; + request.arg = 0; + s->arglen = sdbus_do_command(&s->sdbus, &request, longresp); + if (s->arglen <= 0) { + s->arglen = 1; + /* a zero value indicates the card is busy */ + s->response[0] = 0; + DPRINTF("SD card busy\n"); + } else { + s->arglen = 1; + /* a non-zero value indicates the card is ready */ + s->response[0] = SSI_DUMMY; + } + return SSI_DUMMY; } @@ -136,8 +167,6 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) return SSI_DUMMY; case SSI_SD_CMDARG: if (s->arglen == 4) { - SDRequest request; - uint8_t longresp[16]; /* FIXME: Check CRC. */ request.cmd = s->cmd; request.arg = ldl_be_p(s->cmdarg); From patchwork Thu Jan 28 06:30:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432561 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=VU6/T11S; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9tt2G1Rz9sCq for ; Thu, 28 Jan 2021 17:44:37 +1100 (AEDT) Received: from localhost ([::1]:34308 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l512g-0000oy-Qu for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:44:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36128) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pc-0007Q8-2P; Thu, 28 Jan 2021 01:31:04 -0500 Received: from mail-pg1-x534.google.com ([2607:f8b0:4864:20::534]:40836) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pa-0001Fi-4h; Thu, 28 Jan 2021 01:31:03 -0500 Received: by mail-pg1-x534.google.com with SMTP id b21so3624552pgk.7; Wed, 27 Jan 2021 22:31:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TnZh7DEOrej1+UtJzzLiMV3IgufZiYy4MZVYPJThvrs=; b=VU6/T11SX1Rqphxq/Do7VJP7X59l+WCtWUziwt7DVVQl4p4qPXy2j8TjN2Fp+H23O6 1+YgeOMvI+uBMbi4EWHsz2eyYr9jKJcBZH0JkqT5532e2imhuxvzbVMyA0QSVTrFbH1d HEnqiZQN4ClQdc2ATl2k7QHQQ35TU5ySg2EA/GTGJKs/oqevksDAVLMAzkOGpRK92Ja7 OYvOvbSKdUvRPCuGgivBwou962Sl18RSDJdhOD/oybWFkz3r5Ql5leySTZ49h7xkeWj9 1aH8hHF8dZLtXB01ZwgM4oqlSa4GMrOEWrcrP4Gv0b0X7YIkAU6fuBW0UcVgSosRpEbU RLPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TnZh7DEOrej1+UtJzzLiMV3IgufZiYy4MZVYPJThvrs=; b=MgRlVvk+vZBxt6nv5mcgHn7OGbve66hixdk91DnLpWvcl4ii81/1xdk7XmWbNHZS8Y xnl55s5ykCY+dQJcl73LzwuU4UWY+WPS9zoc5OCDaAwJPWGRGSKanaeNk9MR4pCYX/Cp noBh3CuQ0/a8+vUq0XrI3HP8czT5f6WaQd5vlExaVTIKnAZVs0wiAkObD9bjLRCuJLgR Xe2voo4VkmvrFYi0fxL/a2DVzA39ZtLO0Upw8nnJ9SDX1CdGp2RovvFrhARBAk9VK6YW T/UW8VoI0lOCW79cMr5O4p85kZlD4Qn0THiFPd8GYnPIarQxgtop/sezJYxYu7F9OWIo 2qOw== X-Gm-Message-State: AOAM5322eJmQUwuzI8/rFmaf3TNpaNXuQUZHBzQMwBuQtJ2m3F2V6eN4 z/4zXimwpktXxLl1MRJAweE= X-Google-Smtp-Source: ABdhPJyEbvzg6SqhJMxC0RanoiDM/Oa9D/OEfU2l/c/SmRTkQzJfi5BTZbCYYHJqwtYK4eoNhZXGPA== X-Received: by 2002:a05:6a00:a88:b029:19e:4ba8:bbe4 with SMTP id b8-20020a056a000a88b029019e4ba8bbe4mr14624250pfl.41.1611815459665; Wed, 27 Jan 2021 22:30:59 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:30:59 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 7/9] hw/sd: ssi-sd: Fix SEND_IF_COND (CMD8) response Date: Thu, 28 Jan 2021 14:30:33 +0800 Message-Id: <20210128063035.15674-8-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::534; envelope-from=bmeng.cn@gmail.com; helo=mail-pg1-x534.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng The SEND_IF_COND command (CMD8) response is of format R7, but current code returns R1 for CMD8. Fix it. Fixes: 775616c3ae8c ("Partial SD card SPI mode support") Signed-off-by: Bin Meng Reviewed-by: Philippe Mathieu-Daudé --- When testing with VxWorks driver, this additional issue was exposed. It looks like VxWorks has stricter parsing on command responses while U-Boot/Linux drivers are all happy with exising QEMU CMD8 response. (no changes since v1) hw/sd/ssi-sd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index 200e885225..84c873b3fd 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -176,9 +176,9 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) s->arglen = 1; s->response[0] = 4; DPRINTF("SD command failed\n"); - } else if (s->cmd == 58) { - /* CMD58 returns R3 response (OCR) */ - DPRINTF("Returned OCR\n"); + } else if (s->cmd == 8 || s->cmd == 58) { + /* CMD8/CMD58 returns R3/R7 response */ + DPRINTF("Returned R3/R7\n"); s->arglen = 5; s->response[0] = 1; memcpy(&s->response[1], longresp, 4); From patchwork Thu Jan 28 06:30:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432557 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=YBLZr0W5; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9jM6Nxyz9sSC for ; Thu, 28 Jan 2021 17:36:23 +1100 (AEDT) Received: from localhost ([::1]:48434 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50uj-0002x4-RZ for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:36:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36132) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pd-0007Qq-W0; Thu, 28 Jan 2021 01:31:07 -0500 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]:38035) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pb-0001Fw-6f; Thu, 28 Jan 2021 01:31:05 -0500 Received: by mail-pl1-x62b.google.com with SMTP id d4so2774222plh.5; Wed, 27 Jan 2021 22:31:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5DYakafQd3sVhW5wXkjK4ifCj/JUkX6esOoLtn3SKFs=; b=YBLZr0W5DhQbJVQq4y1+0YZtZZL9BRy5syAFl17Y7vRzu0L3NnvdAsw1TtQOsTghGY 5UDCCzDt5YA9zWnku/e9psOdoc0Cyd9NvdaKmVCPlpCZaaLp9uV33X1FHRZ1srDFe8C4 C5qo8szRlhJuRrST0Hkb76Dj7kBGnBYkxCm7D9UcOjqf6voxPladNR9SpMUrHw2AenkY t3/IrSDypvomuLJy/Sox5MJgdegyHxZmCK5J8UzmWsBHKntZy+l3duVvnLhsWOYjpQ1U Sv1QvCfcBqaJgRykowTobip6uWe577WhgjRak8/OAkrcrtHghJiieqJXjxiA1/zYqwAJ yyEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5DYakafQd3sVhW5wXkjK4ifCj/JUkX6esOoLtn3SKFs=; b=WXMwBOllnNdUQXrvX1BQ79ynSRxQRpQQcea0ZBTryKU2K+qGwMSRbccsENfz8IALN/ e8P8GXboK9FRrHaTU4SVJ5oHuscvuIWqs7BrKXnGhXrIfpc1vJe7BFCK6ur1dW4NfVFf tEPu+41JaAn1kT7eaLKs9HH3AHNXDk88fUxaG5EzTYVhktMpmVv5o57/3SfBLfZmN+0z nq5Uf6WP9gDk+AayTsmUXIuZzQsrFiQrt47JpqKH1qtvj+EPkSDkYgu7t5LBzQSbS50b D1grosqkuLT4Z2dcei8jS1/O1pE82gi9/ycxkvMyyHQESLzKaBzDCOj54HoKvCRxY3y5 gHJg== X-Gm-Message-State: AOAM532mxrbkdLOjRhjYpvm1cZLABu63ov3TRNKEp2TlQPvTZh/DCsbO suReq0R3p2rfzGLXhN4OF+h9Gi/O67df9Q== X-Google-Smtp-Source: ABdhPJzIkZcTjzsoBcqm+PrHVdPdyKSdEVDV18WVUVfIF/gvpywWnQn3CmS9TbQz+GuScoRxHmL/sA== X-Received: by 2002:a17:90b:1107:: with SMTP id gi7mr9909705pjb.123.1611815461707; Wed, 27 Jan 2021 22:31:01 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.30.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:31:01 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 8/9] hw/sd: ssi-sd: Fix STOP_TRANSMISSION (CMD12) response Date: Thu, 28 Jan 2021 14:30:34 +0800 Message-Id: <20210128063035.15674-9-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=bmeng.cn@gmail.com; helo=mail-pl1-x62b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng CMD12's response type is R1b, which is basically a R1 plus optional addition of the busy signal token that can be any number of bytes. A zero value indicates card is busy and a non-zero value indicates the card is ready for the next command. Current implementation sends the busy signal token without sending the R1 first. This does not break the U-Boot/Linux mmc_spi driver, but it does not make the VxWorks driver happy. Move the testing logic of s->stopping in the SSI_SD_RESPONSE state a bit later, after the first byte of the card reponse is sent out, to conform with the spec. After the busy signal token is sent, the state should be transferred to SSI_SD_CMD. Fixes: 775616c3ae8c ("Partial SD card SPI mode support") Signed-off-by: Bin Meng --- Changes in v4: - new patch: fix STOP_TRANSMISSION (CMD12) response hw/sd/ssi-sd.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index 84c873b3fd..907d681d19 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -243,14 +243,15 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) s->mode = SSI_SD_RESPONSE; return SSI_DUMMY; case SSI_SD_RESPONSE: - if (s->stopping) { - s->stopping = 0; - return SSI_DUMMY; - } if (s->response_pos < s->arglen) { DPRINTF("Response 0x%02x\n", s->response[s->response_pos]); return s->response[s->response_pos++]; } + if (s->stopping) { + s->stopping = 0; + s->mode = SSI_SD_CMD; + return SSI_DUMMY; + } if (sdbus_data_ready(&s->sdbus)) { DPRINTF("Data read\n"); s->mode = SSI_SD_DATA_START; From patchwork Thu Jan 28 06:30:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 1432559 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=HL4Koxwc; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DR9qM1Cfbz9sCq for ; Thu, 28 Jan 2021 17:41:35 +1100 (AEDT) Received: from localhost ([::1]:58250 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l50zl-0007M4-3r for incoming@patchwork.ozlabs.org; Thu, 28 Jan 2021 01:41:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36144) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l50pg-0007R2-8K; Thu, 28 Jan 2021 01:31:09 -0500 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]:36952) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l50pd-0001Gu-Td; Thu, 28 Jan 2021 01:31:07 -0500 Received: by mail-pg1-x52f.google.com with SMTP id z21so3637843pgj.4; Wed, 27 Jan 2021 22:31:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NGyDKJAkR7ifdI26KEGcd/+dgaU381zIyEl2Y2AJHQs=; b=HL4KoxwcxoLPvABqBgoTSDJ+jcYPnMhrBK6QFLpA+JNODnUX4UYQ7Fo934J3puzNKX h+6/C972WzvRjjGzELRNY478NSh3XQjcEk+dt5C6PT/Y5FUFIPX8GjQMZfqGF9gTFgTb Cvp4n5vlbX37rK+0t5xZVqmmIFdDM8Hg3d6hLxUx2d7j7TYWVA0C8B598UUYGr2x5AA0 Ty0bFZu63BFew15yh4lBqNAFwtPHKXlc08K1ObQfyiuLRuJjyL3TEu5o+7qXeXlXf5sn wjxhxNGBHExHnL7aP11PI+DaoXV099EftMs0XQEh/dCu6JSmkwnDcEXeLsAKYWdOVlk5 gk0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NGyDKJAkR7ifdI26KEGcd/+dgaU381zIyEl2Y2AJHQs=; b=R9NO9oRX12ptHXYQKxn3lgh8YBe6IF3zTi654Tww1dohXwJukpsWdyb7ZtxykjZk4N l5uXdLkrdw/meGXNRD6/+5/rAGlAC8VaxLjPc9ZeDZL1AZWKLxn4w9id5T8/VNtuQbjS 1AAOOkgOIh9MbfCseJT+9pikAFs1pppEVPwoK6C9zTdvMs2kyLp2dQprTQgIbGERHwqm B5cYqOH5NjLYeiNiArW4Pza8+KWd0GDztPLpGSSrHZzW/Vs2IZzz2OsLasfyToT+svfz UTx/r2J19BNIEGqnHpGDP+lpuF8td63TXbWfneo61UlFmOskjntjvIwxNhuhA5XUhOPG FVPA== X-Gm-Message-State: AOAM531a79svplkB8/D5RgP86NQtAivDF65lsVgSWbFJpsD9yROPLPIW KvQl2SAo5ycKS0jL6jdVHaA= X-Google-Smtp-Source: ABdhPJzMPApM+DAM+O6OSidmTjSmzNd5wP6oHH6FK1gmL9OHnvjUq/DKXKlaxh5SkMmny80dHDZE5Q== X-Received: by 2002:a63:e906:: with SMTP id i6mr15044016pgh.350.1611815463704; Wed, 27 Jan 2021 22:31:03 -0800 (PST) Received: from i9-aorus-gtx1080.localdomain (144.168.56.201.16clouds.com. [144.168.56.201]) by smtp.gmail.com with ESMTPSA id t6sm4245080pfc.64.2021.01.27.22.31.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 22:31:03 -0800 (PST) From: Bin Meng To: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-block@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH v4 9/9] hw/sd: ssi-sd: Handle the rest commands with R1b response type Date: Thu, 28 Jan 2021 14:30:35 +0800 Message-Id: <20210128063035.15674-10-bmeng.cn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210128063035.15674-1-bmeng.cn@gmail.com> References: <20210128063035.15674-1-bmeng.cn@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::52f; envelope-from=bmeng.cn@gmail.com; helo=mail-pg1-x52f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bin Meng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Bin Meng Besides CMD12, the following command's reponse type is R1b: - SET_WRITE_PROT (CMD28) - CLR_WRITE_PROT (CMD29) - ERASE (CMD38) Reuse the same s->stopping to indicate a R1b reponse is needed. Signed-off-by: Bin Meng Reviewed-by: Philippe Mathieu-Daudé --- Changes in v4: - new patch: handle the rest commands with R1b response type hw/sd/ssi-sd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c index 907d681d19..97ee58e20c 100644 --- a/hw/sd/ssi-sd.c +++ b/hw/sd/ssi-sd.c @@ -194,6 +194,12 @@ static uint32_t ssi_sd_transfer(SSIPeripheral *dev, uint32_t val) /* CMD13 returns a 2-byte statuse work. Other commands only return the first byte. */ s->arglen = (s->cmd == 13) ? 2 : 1; + + /* handle R1b */ + if (s->cmd == 28 || s->cmd == 29 || s->cmd == 38) { + s->stopping = 1; + } + cardstatus = ldl_be_p(longresp); status = 0; if (((cardstatus >> 9) & 0xf) < 4)