From patchwork Thu Dec 31 22:48:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 1421611 X-Patchwork-Delegate: trini@ti.com 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=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=seco.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-secospa-onmicrosoft-com header.b=dZ0rN6I9; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D6NdS3BHqz9sVq for ; Fri, 1 Jan 2021 09:49:46 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0409282636; Thu, 31 Dec 2020 23:49:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.b="dZ0rN6I9"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 97B9F82604; Thu, 31 Dec 2020 23:49:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20620.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1b::620]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 3FAE7825F1 for ; Thu, 31 Dec 2020 23:49:20 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sean.anderson@seco.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MCeCxmopRjT9+2/dOtxPl585GDhikTKydzc0XNDBVuN/A3pBxYjnRhRmEGdWv4Nx9uiXb9yCcgeEG/DtW4iUU4o3XjgeQ/EAm//6TBD8NjsFYjjxDNQEFTR97QSKjg2MJ/Np8KcLiLpZHzqWIII0sNvCxBT74caDKAVRzmln7qwts4ONbJPofwCTzdo7RmiK16lO6KNnmRbV6ZC8klNnlZHFYneBb1qzZjZ0eQWniVWOUrRiQqDtxKRccVtbl2EaACddKEu6jNa4bZVhXp4DzzqNJCuyi7l4NJCFq6hAuDFN8tIf6KsJXaQxBDPkuqKMnh8O/PIo+1iemyGc6kuXsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oKNY3J1wuqt3FKxy4/blPWEJpQNPbtCINFIlsqAW3zc=; b=kOF2YuZ/JBTbKPGL/i21PNthJ4k5m6KEXAkZmmiYuLVCi0vQJnD9phhVBPYEnPXq1L0gjGyqqW0vcYejaBEJczV+RuZo7Z3QyUjqApYCjHw0DuGbSpYFKEb9up1rsLN2GYYQvYV0JxZdbWXPUPBG9PLVN6d+AxzMKY5mE2erAYoRXB9rECDvSfs4ntr51oAYZ0ehYSzbqHBCehDpPQRShIT0wMQb6ef294+DN2IN3IYWMLLBDMFOW2GptOqXIeOiFLD0Z8idpzX5J6dwysB3lGrOgY2dOYxxXcm4mZ6RxErcNbpVA2Fl4gnN35RFLfj/aVN8OmB3hhfHgl71Ru2Svg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=seco.com; dmarc=pass action=none header.from=seco.com; dkim=pass header.d=seco.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=secospa.onmicrosoft.com; s=selector2-secospa-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oKNY3J1wuqt3FKxy4/blPWEJpQNPbtCINFIlsqAW3zc=; b=dZ0rN6I9hWEo61IVjlFAeco1BSckebIlSgl56fdlZi24flchw2p6nZV9mggQNW43NQSrsOdXzbiDSk5VmdPWHQnHBUjeSovRX/KYhdIuxQWTdVDIc6XjvQ94IbYqh3ng1YbG92q9PgbBOosdhm9lO/R7oVPa/gl5Nsam6inhTwk= Authentication-Results: lists.denx.de; dkim=none (message not signed) header.d=none;lists.denx.de; dmarc=none action=none header.from=seco.com; Received: from AM9PR03MB7251.eurprd03.prod.outlook.com (20.182.235.144) by AM0PR03MB5812.eurprd03.prod.outlook.com (10.255.28.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20; Thu, 31 Dec 2020 22:49:18 +0000 Received: from AM9PR03MB7251.eurprd03.prod.outlook.com ([fe80::c800:6bd1:64e4:6644]) by AM9PR03MB7251.eurprd03.prod.outlook.com ([fe80::c800:6bd1:64e4:6644%7]) with mapi id 15.20.3700.031; Thu, 31 Dec 2020 22:49:18 +0000 From: Sean Anderson To: u-boot@lists.denx.de Cc: Simon Glass , Sean Anderson , Peng Fan Subject: [PATCH 1/9] mmc: sandbox: Add support for writing Date: Thu, 31 Dec 2020 17:48:44 -0500 Message-Id: <20201231224853.1431364-2-sean.anderson@seco.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201231224853.1431364-1-sean.anderson@seco.com> References: <20201231224853.1431364-1-sean.anderson@seco.com> X-Originating-IP: [50.195.82.171] X-ClientProxiedBy: BLAPR03CA0128.namprd03.prod.outlook.com (2603:10b6:208:32e::13) To AM9PR03MB7251.eurprd03.prod.outlook.com (2603:10a6:20b:26e::16) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from plantagenet.inhand.com (50.195.82.171) by BLAPR03CA0128.namprd03.prod.outlook.com (2603:10b6:208:32e::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20 via Frontend Transport; Thu, 31 Dec 2020 22:49:18 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: cd20f945-3571-4bf2-dc08-08d8adde4ea9 X-MS-TrafficTypeDiagnostic: AM0PR03MB5812: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4502; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: vHMadTvVoM/KRzYykNKmrwqynizxTmbHSEN0AN9shCno5DnXCpGXSRA+ZohY8Ed2BNJUjoiV2DTKgWH+OFBVzQL6+kyuxUNsROojD8uTUmBEr4hmcD1L+5Z9DMrYuNHLfluY0W1gMFfCYK5QIIxD5DLSUvC5lE6uR1bnCkSnAebeiTbMMKhpNoMkboJDUEDYk86sk4GV/Fs0oeSXmTOrOmltUyJOsEBBUzKae4hOpXCefboBq+pSbBCawnAICa8IPJUBjiMCOkhUpySjD2Y2o1XXBl8LvaW2mMqCtC59c7TfLlG1saRGNTtLl8Av2mtKniIjiFihK1QxdzyFL+5fN6rXpcjkYMaL/I+3FTa04TnYPXeBgGCmp1ncO8VfG1S9QoI4Xmd8nyBUifcTBXqyvg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR03MB7251.eurprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(39840400004)(136003)(396003)(376002)(366004)(346002)(36756003)(66476007)(66556008)(956004)(26005)(52116002)(8936002)(44832011)(316002)(54906003)(478600001)(2616005)(6486002)(16526019)(1076003)(4326008)(186003)(5660300002)(6916009)(6512007)(2906002)(6506007)(66946007)(8676002)(86362001)(83380400001)(6666004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: Sih8IQANJ0VSWRUcykGd4NmQUDVsmK/t0W5DCBSk4hqewEvHIhFFuwtsPxO95RTLcrzmuo+TZMFr7sWe6Ua3XOfkJh4Em8wrt54oj4ob4LKpsS0+GPWmKjVo4VFECW5jELSWTnD9ifNGzhkYGtvZ8YiakrWATJ0qvlqrCzpbWu1bHEuPLZPAm/63ebPZZ4q0LjPjR0A0tf931SedMlLmakmJae0qinJm9feA9KSaN8iiYgHKmw8XDjxJIT+R4D+yIvj1iLnGdciDGFHhXKDSALJlhUGgJY4tOQL0ayXWi+SABGwE5pE86XxOWyHevrSc7uQjNRjwo4KPqzNS3tv51VtWinMgE5kvVYhuhgnv+wu+aCnwdf4lT3TsTUji47VzL6+7hXUGV6V1aC30JWdogXOeqB/kIER57FT0FcV6uLSppDU84RM6pkvjthleX2gdeaIteEN4lXd9dcRJQ7A0hAop/JeL7Ay8QQ0ZbQQnRjHa3EBGrrdvBcGDQo89I7em7e14v8fvRV8aNvlDT1kuzMs4SUoaYLj4Q5TsUPF7ce42uQrwZsELsuVbie2BBzsNbHNCJNPU7dfIsk3OQaG6Ov8aae4vie0DRPe7japLzgeZJ0ziaAvTygyiU1QwaeEpwQ6wy442OixrcC3OkuYTl6Zzt8gp24oPBiMkRhuThKb9pRv6L2rreQPe8Z+OkkEb5EgjNtgbGnX7VKLGheBjTGhrPNXIDqvlFJTG442qqxy0sPNodJV7s2xL0Anfur9Eek702q5lW9izvnb7AW+TCXI4/BWZucDHDdANPOnhb5gKDScM62r8wkSsTId3X4vn6dSzpN4qVcIkU6WBQYa+4G61iKjaBXF+XgtF3sBTJXbzPZMjIF/JznCAjV37SJykFcY0Kk76ScQqARkyV37fOqHHS1OPWEzDjEA33a/aFeVpG1mpHDtZhqsZn5OkAqG8R7kZfQLpr8HwUM03DMk8cNs9+Nvvvw5snfCc8oBV+FK6Xwjy1WlAZmiCfVrqNrbV X-OriginatorOrg: seco.com X-MS-Exchange-CrossTenant-AuthSource: AM9PR03MB7251.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Dec 2020 22:49:18.6686 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bebe97c3-6438-442e-ade3-ff17aa50e733 X-MS-Exchange-CrossTenant-Network-Message-Id: cd20f945-3571-4bf2-dc08-08d8adde4ea9 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 95PDX/8gqOUd5qRQyGmEQHz68jdb0oAQJjNgXUluM/6OPqQG/61sbn0ia05aCZEDn5gPuuR72EC8bsJa/JnQvw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR03MB5812 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This adds support writing to the sandbox mmc backed by an in-memory buffer. The unit test has been updated to test reading, writing, and erasing. I'm not sure what MMC erase to; I picked 0, but if it's 0xFF then that can be easily changed. Signed-off-by: Sean Anderson Reviewed-by: Simon Glass --- drivers/mmc/sandbox_mmc.c | 41 ++++++++++++++++++++++++++++++++++----- test/dm/mmc.c | 19 +++++++++++++----- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/sandbox_mmc.c b/drivers/mmc/sandbox_mmc.c index e86ea8fe09..3daf708451 100644 --- a/drivers/mmc/sandbox_mmc.c +++ b/drivers/mmc/sandbox_mmc.c @@ -17,6 +17,17 @@ struct sandbox_mmc_plat { struct mmc mmc; }; +#define MMC_CSIZE 0 +#define MMC_CMULT 8 /* 8 because the card is high-capacity */ +#define MMC_BL_LEN_SHIFT 10 +#define MMC_BL_LEN BIT(MMC_BL_LEN_SHIFT) +#define MMC_CAPACITY (((MMC_CSIZE + 1) << (MMC_CMULT + 2)) \ + * MMC_BL_LEN) /* 1 MiB */ + +struct sandbox_mmc_priv { + u8 buf[MMC_CAPACITY]; +}; + /** * sandbox_mmc_send_cmd() - Emulate SD commands * @@ -26,6 +37,10 @@ struct sandbox_mmc_plat { static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, struct mmc_data *data) { + struct sandbox_mmc_priv *priv = dev_get_priv(dev); + struct mmc *mmc = mmc_get_mmc_dev(dev); + static ulong erase_start, erase_end; + switch (cmd->cmdidx) { case MMC_CMD_ALL_SEND_CID: memset(cmd->response, '\0', sizeof(cmd->response)); @@ -44,8 +59,9 @@ static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, break; case MMC_CMD_SEND_CSD: cmd->response[0] = 0; - cmd->response[1] = 10 << 16; /* 1 << block_len */ - cmd->response[2] = 0; + cmd->response[1] = (MMC_BL_LEN_SHIFT << 16) | + ((MMC_CSIZE >> 16) & 0x3f); + cmd->response[2] = (MMC_CSIZE & 0xffff) << 16; cmd->response[3] = 0; break; case SD_CMD_SWITCH_FUNC: { @@ -59,13 +75,27 @@ static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, break; } case MMC_CMD_READ_SINGLE_BLOCK: - memset(data->dest, '\0', data->blocksize); - break; case MMC_CMD_READ_MULTIPLE_BLOCK: - strcpy(data->dest, "this is a test"); + memcpy(data->dest, &priv->buf[cmd->cmdarg * data->blocksize], + data->blocks * data->blocksize); + break; + case MMC_CMD_WRITE_SINGLE_BLOCK: + case MMC_CMD_WRITE_MULTIPLE_BLOCK: + memcpy(&priv->buf[cmd->cmdarg * data->blocksize], data->src, + data->blocks * data->blocksize); break; case MMC_CMD_STOP_TRANSMISSION: break; + case SD_CMD_ERASE_WR_BLK_START: + erase_start = cmd->cmdarg; + break; + case SD_CMD_ERASE_WR_BLK_END: + erase_end = cmd->cmdarg; + break; + case MMC_CMD_ERASE: + memset(&priv->buf[erase_start * mmc->write_bl_len], '\0', + (erase_end - erase_start + 1) * mmc->write_bl_len); + break; case SD_CMD_APP_SEND_OP_COND: cmd->response[0] = OCR_BUSY | OCR_HCS; cmd->response[1] = 0; @@ -148,5 +178,6 @@ U_BOOT_DRIVER(mmc_sandbox) = { .bind = sandbox_mmc_bind, .unbind = sandbox_mmc_unbind, .probe = sandbox_mmc_probe, + .priv_auto_alloc_size = sizeof(struct sandbox_mmc_priv), .platdata_auto_alloc_size = sizeof(struct sandbox_mmc_plat), }; diff --git a/test/dm/mmc.c b/test/dm/mmc.c index 4e5136c850..f744452ff2 100644 --- a/test/dm/mmc.c +++ b/test/dm/mmc.c @@ -29,16 +29,25 @@ static int dm_test_mmc_blk(struct unit_test_state *uts) { struct udevice *dev; struct blk_desc *dev_desc; - char cmp[1024]; + int i; + char write[1024], read[1024]; ut_assertok(uclass_get_device(UCLASS_MMC, 0, &dev)); ut_assertok(blk_get_device_by_str("mmc", "0", &dev_desc)); - /* Read a few blocks and look for the string we expect */ + /* Write a few blocks and verify that we get the same data back */ ut_asserteq(512, dev_desc->blksz); - memset(cmp, '\0', sizeof(cmp)); - ut_asserteq(2, blk_dread(dev_desc, 0, 2, cmp)); - ut_assertok(strcmp(cmp, "this is a test")); + for (i = 0; i < sizeof(write); i++) + write[i] = i; + ut_asserteq(2, blk_dwrite(dev_desc, 0, 2, write)); + ut_asserteq(2, blk_dread(dev_desc, 0, 2, read)); + ut_asserteq_mem(write, read, sizeof(write)); + + /* Now erase them */ + memset(write, '\0', sizeof(write)); + ut_asserteq(2, blk_derase(dev_desc, 0, 2)); + ut_asserteq(2, blk_dread(dev_desc, 0, 2, read)); + ut_asserteq_mem(write, read, sizeof(write)); return 0; }