Changes

Jump to: navigation, search

MISC-TN-017: Persistent storage and read-write file systems

3,287 bytes added, 14:01, 18 January 2022
Appendix 1: source code example
==== Appendix 1: source code example ====
<syntaxhighlight lang="C">
static struct T32_mmc_struct {
unsigned int enable;
unsigned int infoBit;
unsigned int dev;
unsigned int * pHost;
unsigned int cmd;
unsigned int arg;
unsigned int flags;
unsigned int blksz;
unsigned int blocks;
unsigned int err;
unsigned int resp0;
unsigned int resp1;
unsigned int resp2;
unsigned int resp3;
} T32_mmc;
 
int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
{
int err;
 
mmc_retune_hold(host);
 
if (mmc_card_removed(host->card))
return -ENOMEDIUM;
 
mmc_mrq_pr_debug(host, mrq, false);
 
WARN_ON(!host->claimed);
 
if (T32_mmc.enable) {
T32_mmc.pHost = (unsigned int *)mmc_hostname(host);
if ((*T32_mmc.pHost)==T32_mmc.dev) {
if (mrq->cmd) {
write_sysreg((*T32_mmc.pHost)|T32_mmc.infoBit,
contextidr_el1);
isb();
T32_mmc.cmd = (mrq->cmd->opcode)|T32_mmc.infoBit;
write_sysreg(T32_mmc.cmd, contextidr_el1);
isb();
T32_mmc.arg = (mrq->cmd->arg)|T32_mmc.infoBit;
write_sysreg(T32_mmc.arg, contextidr_el1);
isb();
T32_mmc.flags = (mrq->cmd->flags)|T32_mmc.infoBit;
write_sysreg(T32_mmc.flags, contextidr_el1);
isb();
}
 
if (mrq->data) {
T32_mmc.blksz = (mrq->data->blksz)|T32_mmc.infoBit;
write_sysreg(T32_mmc.blksz, contextidr_el1);
isb();
T32_mmc.blocks = (mrq->data->blocks)|T32_mmc.infoBit;
write_sysreg(T32_mmc.blocks, contextidr_el1);
isb();
}
}
 
}
 
err = mmc_mrq_prep(host, mrq);
if (err)
return err;
...
 
 
 
 
void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
{
struct mmc_command *cmd = mrq->cmd;
int err = cmd->error;
...
 
...
 
if (!err || !cmd->retries || mmc_card_removed(host->card)) {
mmc_should_fail_request(host, mrq);
 
if (!host->ongoing_mrq)
led_trigger_event(host->led, LED_OFF);
 
if (mrq->sbc) {
pr_debug("%s: req done <CMD%u>: %d: %08x %08x %08x %08x\n",
mmc_hostname(host), mrq->sbc->opcode,
mrq->sbc->error,
mrq->sbc->resp[0], mrq->sbc->resp[1],
mrq->sbc->resp[2], mrq->sbc->resp[3]);
}
 
pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n",
mmc_hostname(host), cmd->opcode, err,
cmd->resp[0], cmd->resp[1],
cmd->resp[2], cmd->resp[3]);
 
if (mrq->data) {
pr_debug("%s: %d bytes transferred: %d\n",
mmc_hostname(host),
mrq->data->bytes_xfered, mrq->data->error);
}
 
if (mrq->stop) {
pr_debug("%s: (CMD%u): %d: %08x %08x %08x %08x\n",
mmc_hostname(host), mrq->stop->opcode,
mrq->stop->error,
mrq->stop->resp[0], mrq->stop->resp[1],
mrq->stop->resp[2], mrq->stop->resp[3]);
}
 
if (T32_mmc.enable) {
T32_mmc.pHost = (unsigned int *)mmc_hostname(host);
if ((*T32_mmc.pHost)==T32_mmc.dev) {
write_sysreg((*T32_mmc.pHost)|T32_mmc.infoBit,
contextidr_el1);
isb();
T32_mmc.cmd = (cmd->opcode)|T32_mmc.infoBit;
write_sysreg(T32_mmc.cmd, contextidr_el1);
isb();
T32_mmc.err = (err)|T32_mmc.infoBit;
write_sysreg(T32_mmc.err, contextidr_el1);
isb();
T32_mmc.resp0 = (cmd->resp[0])|T32_mmc.infoBit;
write_sysreg(T32_mmc.resp0, contextidr_el1);
isb();
}
}
}
/*
* Request starter must handle retries - see
* mmc_wait_for_req_done().
*/
if (mrq->done)
mrq->done(mrq);
}
</syntaxhighlight>
==== Appendix 2: time details ====
4,650
edits

Navigation menu