coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
storage_erase.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * MultiMediaCard (MMC), eMMC and Secure Digital (SD) erase support code.
4  * This code is controller independent.
5  */
6 
7 #include "sd_mmc.h"
8 #include "storage.h"
9 
12 {
13  struct mmc_command cmd;
14  struct sd_mmc_ctrlr *ctrlr = media->ctrlr;
15 
16  if (storage_block_setup(media, start, count, 0) == 0)
17  return 0;
18 
20  cmd.resp_type = CARD_RSP_R1;
21  cmd.cmdarg = start;
22  cmd.flags = 0;
23 
24  if (ctrlr->send_cmd(ctrlr, &cmd, NULL))
25  return 0;
26 
28  cmd.cmdarg = start + count - 1;
29  cmd.resp_type = CARD_RSP_R1;
30  cmd.flags = 0;
31 
32  if (ctrlr->send_cmd(ctrlr, &cmd, NULL))
33  return 0;
34 
35  cmd.cmdidx = MMC_CMD_ERASE;
36  cmd.cmdarg = MMC_TRIM_ARG; /* just unmap blocks */
37  cmd.resp_type = CARD_RSP_R1;
38  cmd.flags = 0;
39 
40  if (ctrlr->send_cmd(ctrlr, &cmd, NULL))
41  return 0;
42 
43  size_t erase_blocks;
44  /*
45  * Timeout for TRIM operation on one erase group is defined as:
46  * TRIM timeout = 300ms x TRIM_MULT
47  *
48  * This timeout is expressed in units of 100us to sd_mmc_send_status.
49  *
50  * Hence, timeout_per_erase_block = TRIM timeout * 1000us/100us;
51  */
52  size_t timeout_per_erase_block = (media->trim_mult * 300) * 10;
53  int err = 0;
54 
55  erase_blocks = ALIGN_UP(count, media->erase_blocks)
57 
58  while (erase_blocks) {
59  /*
60  * To avoid overflow of timeout value, loop in calls to
61  * sd_mmc_send_status for erase_blocks number of times.
62  */
63  err = sd_mmc_send_status(media, timeout_per_erase_block);
64 
65  /* Send status successful, erase action complete. */
66  if (err == 0)
67  break;
68 
69  erase_blocks--;
70  }
71 
72  /* Total timeout done. Still status not successful. */
73  if (err) {
74  sd_mmc_error("TRIM operation not successful within timeout.\n");
75  return 0;
76  }
77 
78  return count;
79 }
#define ALIGN_UP(x, a)
Definition: helpers.h:17
static struct storage_media media
Definition: sd_media.c:21
int sd_mmc_send_status(struct storage_media *media, ssize_t tries)
Definition: sd_mmc.c:94
#define sd_mmc_error(format...)
Definition: sd_mmc.h:87
#define CARD_RSP_R1
Definition: sd_mmc_ctrlr.h:76
#define MMC_CMD_ERASE_GROUP_START
Definition: sd_mmc_ctrlr.h:49
#define MMC_TRIM_ARG
Definition: sd_mmc_ctrlr.h:88
#define MMC_CMD_ERASE
Definition: sd_mmc_ctrlr.h:51
#define MMC_CMD_ERASE_GROUP_END
Definition: sd_mmc_ctrlr.h:50
#define NULL
Definition: stddef.h:19
unsigned long long uint64_t
Definition: stdint.h:17
int storage_block_setup(struct storage_media *media, uint64_t start, uint64_t count, int is_read)
Definition: storage.c:250
uint64_t storage_block_erase(struct storage_media *media, uint64_t start, uint64_t count)
Definition: storage_erase.c:10
uint32_t cmdarg
Definition: sd_mmc_ctrlr.h:86
uint16_t cmdidx
Definition: sd_mmc_ctrlr.h:25
uint32_t flags
Definition: sd_mmc_ctrlr.h:92
uint32_t resp_type
Definition: sd_mmc_ctrlr.h:67
int(* send_cmd)(struct sd_mmc_ctrlr *ctrlr, struct mmc_command *cmd, struct mmc_data *data)
Definition: sd_mmc_ctrlr.h:121
uint32_t trim_mult
Definition: storage.h:96
struct sd_mmc_ctrlr * ctrlr
Definition: storage.h:63
uint32_t erase_blocks
Definition: storage.h:94
#define count