From patchwork Wed Dec 13 23:20:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 848316 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="phFnRbXh"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yxtV51mQDz9s81 for ; Thu, 14 Dec 2017 10:40:29 +1100 (AEDT) Received: from localhost ([::1]:38323 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePGdX-0002cE-CB for incoming@patchwork.ozlabs.org; Wed, 13 Dec 2017 18:40:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePGNF-0006lU-Rl for qemu-devel@nongnu.org; Wed, 13 Dec 2017 18:23:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ePGNE-0000e2-Hf for qemu-devel@nongnu.org; Wed, 13 Dec 2017 18:23:37 -0500 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:38278) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ePGNE-0000dl-By for qemu-devel@nongnu.org; Wed, 13 Dec 2017 18:23:36 -0500 Received: by mail-qk0-x243.google.com with SMTP id z203so4157934qkb.5 for ; Wed, 13 Dec 2017 15:23:36 -0800 (PST) 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=E5S2C6DVB8AmZpVEosps4WO5s/IsK07ibbrx+RF23vo=; b=phFnRbXhMn7ecYqC5iJ+JAc8MrQt5ao/811rGke1PoFMhjy6v/bPWf3pGtzrfygJlr vmA1A0BEa3Z6Fjy4moCLqPQhHtV8eYcNhg6+YUv8kloniSHllZbxmN3KHvoKbXFxLwlD cU6wnIjbmqIw5M+tsNHMt5mmULREz3V/eLaX2DY3mfqE9PMS1z0ey148LO7R2AqjGbiR T31fjl/Z4PIQtLElxxQ/4MVsXbhEDy/g8qhhkTMtBpbkVXeSONKqG8lfl2itoaCFK4mE ceNaOImc53yWjOnBls5rQWbbLCmhumiJmNUrVAxdUo1nGzlfEMV06HsLO7yBsguoPfib OYPg== 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=E5S2C6DVB8AmZpVEosps4WO5s/IsK07ibbrx+RF23vo=; b=qYW53YBK4zEd69Q/diiQkZIhw4jRxnuIB6+RcUw7IPFZXmhm37/bSubrn96TdQ6Z9u UXZY5BDoJP+P1jInpkcfaYMeLyRWAZXtXay6XC6X0FJrb9cbllj/EHvrJrxoEqXfxQ0Y MfN17lMgs4K6KZ+kSakbxlLzZYc7cuvcUP1+S4YzqWhwlE7ptSGWpXN7Hca/VzjeCsaZ rZj9Ed9IucUQFNetwO+k1Jw9ACuUdLCLvmyq6LIm9YI0IfimqnU+QBjMtUMHyUlt9UE+ Frf1474/seqZWiDxajUhz/+53HJ43lDFBmzbHBdCVgV8AxxyVfyAxStxwWt8vj7yAhUv CA2A== X-Gm-Message-State: AKGB3mKr6pGJzCEodlRy9owfser2f1/73yEhCp+drb1IIIpr0m2Qk4bp 8qo5DIZsJ3JbPfKXU7Gcr0I= X-Google-Smtp-Source: ACJfBos78nv5s4HnTudyongFyitsns5uFS7q9jwYXDB37BPOBaPsAzNIacA3AqxZ8Y2vlIkCNh/nCQ== X-Received: by 10.55.74.144 with SMTP id x138mr12394685qka.239.1513207415852; Wed, 13 Dec 2017 15:23:35 -0800 (PST) Received: from x1.local ([181.91.222.165]) by smtp.gmail.com with ESMTPSA id l1sm1666918qkk.74.2017.12.13.15.23.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 13 Dec 2017 15:23:35 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: Alistair Francis , "Edgar E . Iglesias" , Peter Maydell , Andrew Baumann , Prasad J Pandit , Clement Deschamps Date: Wed, 13 Dec 2017 20:20:25 -0300 Message-Id: <20171213232025.24503-27-f4bug@amsat.org> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20171213232025.24503-1-f4bug@amsat.org> References: <20171213232025.24503-1-f4bug@amsat.org> MIME-Version: 1.0 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 26/26] sdcard: add/use a ccc_spi enum for the commands supported in SPI mode 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: Sai Pavan Boddu , Peter Crosthwaite , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" We can now simplify the 'if (sd->spi) ...' checks, reporting an UNIMP error and returning a sd_illegal value. Signed-off-by: Philippe Mathieu-Daudé --- hw/sd/sd.c | 83 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 688bb40bd1..a32da6af9f 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -285,34 +285,45 @@ enum SDCardCommandClass { ccc_io = 1 << 9, ccc_switch = 1 << 10, ccc_ext = 1 << 11, + + /* extra */ + ccc_spi = 1 << 31, }; static const uint32_t sd_cmd_class[SD_CMD_MAX] = { - ccc_basic, 0, ccc_basic, ccc_basic, - ccc_basic, ccc_io, ccc_switch, ccc_basic, - ccc_basic, ccc_basic, ccc_basic, ccc_basic, - ccc_basic, ccc_basic, 0, ccc_basic, + ccc_basic | ccc_spi, ccc_spi, ccc_basic, ccc_basic, + ccc_basic, ccc_io, ccc_switch | ccc_spi, ccc_basic, + ccc_basic, ccc_basic | ccc_spi, ccc_basic | ccc_spi, ccc_basic, + ccc_basic | ccc_spi, ccc_basic | ccc_spi, 0, ccc_basic, /* 16 */ - ccc_blk_read | ccc_blk_write | ccc_lock, ccc_blk_read, - ccc_blk_read, ccc_blk_read, + ccc_blk_read | ccc_blk_write | ccc_lock | ccc_spi, ccc_blk_read | ccc_spi, + ccc_blk_read | ccc_spi, ccc_blk_read, ccc_blk_read | ccc_blk_write, ccc_ext, 0, ccc_blk_read | ccc_blk_write, - ccc_blk_write, ccc_blk_write, - 0, ccc_blk_write, - ccc_wp, ccc_wp, - ccc_wp, 0, + ccc_blk_write | ccc_spi, ccc_blk_write | ccc_spi, + 0, ccc_blk_write | ccc_spi, + ccc_wp | ccc_spi, ccc_wp | ccc_spi, + ccc_wp | ccc_spi, 0, /* 32 */ - ccc_erase, ccc_erase, - ccc_switch, ccc_switch, - ccc_switch, ccc_switch, - ccc_erase, 0, - ccc_lock, 0, ccc_lock, 0, 0, 0, 0, 0, + ccc_erase | ccc_spi, ccc_erase | ccc_spi, + ccc_switch | ccc_spi, ccc_switch | ccc_spi, + ccc_switch | ccc_spi, ccc_switch | ccc_spi, + ccc_erase | ccc_spi, 0, + ccc_lock, 0, ccc_lock | ccc_spi, 0, 0, 0, 0, 0, /* 48 */ - ccc_ext, ccc_ext, ccc_switch, 0, - ccc_io, ccc_io, 0, ccc_appspec, - ccc_appspec, ccc_switch, - ccc_ext, ccc_ext, + ccc_ext, ccc_ext, ccc_switch | ccc_spi, 0, + ccc_io | ccc_spi, ccc_io | ccc_spi, 0, ccc_appspec | ccc_spi, + ccc_appspec | ccc_spi, ccc_switch | ccc_spi, + ccc_ext | ccc_spi, ccc_ext | ccc_spi, 0, 0, 0, 0 +}, sd_acmd_class[SD_CMD_MAX] = { + [6] = ccc_appspec, [13] = ccc_appspec | ccc_spi, + [14] = ccc_appspec, [15] = ccc_appspec, + [16] = ccc_appspec, [18] = ccc_spi, + [22] = ccc_appspec | ccc_spi, [23] = ccc_appspec | ccc_spi, + [25] = ccc_spi, [26] = ccc_spi, [28] = ccc_appspec, [38] = ccc_spi, + [41] = ccc_appspec | ccc_spi, [42] = ccc_appspec | ccc_spi, [43] = ccc_spi, + [49] = ccc_spi, [51] = ccc_appspec | ccc_spi, }; static uint8_t sd_crc7(void *message, size_t width) @@ -899,6 +910,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, sd->multi_blk_cnt = 0; } + if (sd->spi && !(sd_cmd_class[req.cmd] & ccc_spi)) { + qemu_log_mask(LOG_UNIMP, "SD: CMD%02u not implemented in SPI mode\n", + req.cmd); + return sd_illegal; + } switch (req.cmd) { /* Basic commands (Class 0 and Class 1) */ case 0: /* CMD0: GO_IDLE_STATE */ @@ -921,8 +937,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, return sd_r1; case 2: /* CMD2: ALL_SEND_CID */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_ready_state: sd_set_state(sd, sd_identification_state); @@ -934,8 +948,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 3: /* CMD3: SEND_RELATIVE_ADDR */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_identification_state: case sd_standby_state: @@ -949,8 +961,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 4: /* CMD4: SEND_DSR */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_standby_state: break; @@ -964,8 +974,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, return sd_illegal; case 6: /* CMD6: SWITCH_FUNCTION */ - if (sd->spi) - goto bad_cmd; switch (sd->mode) { case sd_data_transfer_mode: sd_function_switch(sd, req.arg); @@ -980,8 +988,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 7: /* CMD7: SELECT/DESELECT_CARD */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_standby_state: if (sd->rca != rca) @@ -1082,8 +1088,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 11: /* CMD11: READ_DAT_UNTIL_STOP */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_transfer_state: sd_set_state(sd, sd_sendingdata_state); @@ -1130,8 +1134,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 15: /* CMD15: GO_INACTIVE_STATE */ - if (sd->spi) - goto bad_cmd; switch (sd->mode) { case sd_data_transfer_mode: if (sd->rca != rca) @@ -1206,8 +1208,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, /* Block write commands (Class 4) */ case 24: /* CMD24: WRITE_SINGLE_BLOCK */ - if (sd->spi) - goto unimplemented_cmd; switch (sd->state) { case sd_transfer_state: /* Writing in SPI mode not implemented. */ @@ -1232,8 +1232,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */ - if (sd->spi) - goto unimplemented_cmd; switch (sd->state) { case sd_transfer_state: /* Writing in SPI mode not implemented. */ @@ -1258,8 +1256,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, break; case 26: /* CMD26: PROGRAM_CID */ - if (sd->spi) - goto bad_cmd; switch (sd->state) { case sd_transfer_state: sd_set_state(sd, sd_receivingdata_state); @@ -1274,7 +1270,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, case 27: /* CMD27: PROGRAM_CSD */ if (sd->spi) - goto unimplemented_cmd; + goto unimplemented_cmd; /* XXX */ switch (sd->state) { case sd_transfer_state: sd_set_state(sd, sd_receivingdata_state); @@ -1384,8 +1380,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, /* Lock card commands (Class 7) */ case 42: /* CMD42: LOCK_UNLOCK */ - if (sd->spi) - goto unimplemented_cmd; switch (sd->state) { case sd_transfer_state: sd_set_state(sd, sd_receivingdata_state); @@ -1456,6 +1450,11 @@ static sd_rsp_type_t sd_app_command(SDState *sd, req.arg, sd_state_name(sd->state)); sd->card_status |= APP_CMD; + if (sd->spi && !(sd_acmd_class[req.cmd] & ccc_spi)) { + qemu_log_mask(LOG_UNIMP, "SD: ACMD%02u not implemented in SPI mode\n", + req.cmd); + return sd_illegal; + } switch (req.cmd) { case 6: /* ACMD6: SET_BUS_WIDTH */ switch (sd->state) {