Commit 6239ce07 authored by Simon Glass's avatar Simon Glass
Browse files

sandbox: mmc: Support a backing file



Provide a way for sandbox MMC to present data from a backing file. This
allows a filesystem to be created on the host and easily served via an
emulated mmc device.

Series-changes: 2
- Reorder members to save space
Signed-off-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
Reviewed-by: Jaehoon Chung's avatarJaehoon Chung <jh80.chung@samsung.com>
Change-Id: I42087e8088f8d9fb704821d73f17d7ae246a2e69
parent 48b4d86c
Sandbox MMC
===========
Required properties:
- compatible : "sandbox,mmc"
Optional properties:
- filename : Name of backing file, if any. This is mapped into the MMC device
so can be used to provide a filesystem or other test data
Example
-------
mmc2 {
compatible = "sandbox,mmc";
non-removable;
};
......@@ -9,23 +9,26 @@
#include <errno.h>
#include <fdtdec.h>
#include <log.h>
#include <malloc.h>
#include <mmc.h>
#include <os.h>
#include <asm/test.h>
struct sandbox_mmc_plat {
struct mmc_config cfg;
struct mmc mmc;
const char *fname;
};
#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 */
#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 SIZE_MULTIPLE ((1 << (MMC_CMULT + 2)) * MMC_BL_LEN)
struct sandbox_mmc_priv {
u8 buf[MMC_CAPACITY];
char *buf;
int csize; /* CSIZE value to report */
int size;
};
/**
......@@ -60,8 +63,8 @@ static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
case MMC_CMD_SEND_CSD:
cmd->response[0] = 0;
cmd->response[1] = (MMC_BL_LEN_SHIFT << 16) |
((MMC_CSIZE >> 16) & 0x3f);
cmd->response[2] = (MMC_CSIZE & 0xffff) << 16;
((priv->csize >> 16) & 0x3f);
cmd->response[2] = (priv->csize & 0xffff) << 16;
cmd->response[3] = 0;
break;
case SD_CMD_SWITCH_FUNC: {
......@@ -143,6 +146,8 @@ static int sandbox_mmc_of_to_plat(struct udevice *dev)
struct blk_desc *blk;
int ret;
plat->fname = dev_read_string(dev, "filename");
ret = mmc_of_parse(dev, cfg);
if (ret)
return ret;
......@@ -156,6 +161,29 @@ static int sandbox_mmc_of_to_plat(struct udevice *dev)
static int sandbox_mmc_probe(struct udevice *dev)
{
struct sandbox_mmc_plat *plat = dev_get_plat(dev);
struct sandbox_mmc_priv *priv = dev_get_priv(dev);
int ret;
if (plat->fname) {
ret = os_map_file(plat->fname, OS_O_RDWR | OS_O_CREAT,
(void **)&priv->buf, &priv->size);
if (ret) {
log_err("%s: Unable to map file '%s'\n", dev->name,
plat->fname);
return ret;
}
priv->csize = priv->size / SIZE_MULTIPLE - 1;
} else {
priv->csize = 0;
priv->size = (priv->csize + 1) * SIZE_MULTIPLE; /* 1 MiB */
priv->buf = malloc(priv->size);
if (!priv->buf) {
log_err("%s: Not enough memory (%x bytes)\n",
dev->name, priv->size);
return -ENOMEM;
}
}
return mmc_init(&plat->mmc);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment