aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/Makefile2
-rw-r--r--drivers/block/Kconfig1
-rw-r--r--drivers/block/Makefile2
-rw-r--r--drivers/block/blk-uclass.c51
-rw-r--r--drivers/mmc/Makefile2
-rw-r--r--drivers/mmc/sandbox_mmc.c10
-rw-r--r--drivers/scsi/scsi_emul.c9
-rw-r--r--drivers/usb/emul/sandbox_flash.c35
8 files changed, 85 insertions, 27 deletions
diff --git a/drivers/Makefile b/drivers/Makefile
index 9d9f69a3c9..a1700c819d 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
+obj-$(CONFIG_$(SPL_TPL_)BLK) += block/
obj-$(CONFIG_$(SPL_TPL_)BOOTCOUNT_LIMIT) += bootcount/
obj-$(CONFIG_$(SPL_TPL_)BUTTON) += button/
obj-$(CONFIG_$(SPL_TPL_)CACHE) += cache/
@@ -60,7 +61,6 @@ obj-$(CONFIG_SPL_USB_HOST) += usb/host/
obj-$(CONFIG_OMAP_USB_PHY) += usb/phy/
obj-$(CONFIG_SPL_SATA) += ata/ scsi/
obj-$(CONFIG_SPL_LEGACY_BLOCK) += block/
-obj-$(CONFIG_SPL_BLK) += block/
obj-$(CONFIG_SPL_THERMAL) += thermal/
endif
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index 707e2bcd23..e95da48bdc 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -37,7 +37,6 @@ config SPL_BLK
config TPL_BLK
bool "Support block devices in TPL"
depends on TPL_DM && BLK
- default y
help
Enable support for block devices, such as SCSI, MMC and USB
flash sticks. These provide a block-level interface which permits
diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index f48d3e1214..19d9317c82 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -3,7 +3,7 @@
# (C) Copyright 2000-2007
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-obj-$(CONFIG_$(SPL_)BLK) += blk-uclass.o
+obj-$(CONFIG_$(SPL_TPL_)BLK) += blk-uclass.o
ifndef CONFIG_$(SPL_)BLK
obj-$(CONFIG_SPL_LEGACY_BLOCK) += blk_legacy.o
diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
index bcc14a684b..e82789f4a3 100644
--- a/drivers/block/blk-uclass.c
+++ b/drivers/block/blk-uclass.c
@@ -444,53 +444,70 @@ int blk_get_device(int uclass_id, int devnum, struct udevice **devp)
return device_probe(*devp);
}
-unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
- lbaint_t blkcnt, void *buffer)
+long blk_read(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *buf)
{
- struct udevice *dev = block_dev->bdev;
+ struct blk_desc *desc = dev_get_uclass_plat(dev);
const struct blk_ops *ops = blk_get_ops(dev);
ulong blks_read;
if (!ops->read)
return -ENOSYS;
- if (blkcache_read(block_dev->uclass_id, block_dev->devnum,
- start, blkcnt, block_dev->blksz, buffer))
+ if (blkcache_read(desc->uclass_id, desc->devnum,
+ start, blkcnt, desc->blksz, buf))
return blkcnt;
- blks_read = ops->read(dev, start, blkcnt, buffer);
+ blks_read = ops->read(dev, start, blkcnt, buf);
if (blks_read == blkcnt)
- blkcache_fill(block_dev->uclass_id, block_dev->devnum,
- start, blkcnt, block_dev->blksz, buffer);
+ blkcache_fill(desc->uclass_id, desc->devnum, start, blkcnt,
+ desc->blksz, buf);
return blks_read;
}
-unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
- lbaint_t blkcnt, const void *buffer)
+long blk_write(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+ const void *buf)
{
- struct udevice *dev = block_dev->bdev;
+ struct blk_desc *desc = dev_get_uclass_plat(dev);
const struct blk_ops *ops = blk_get_ops(dev);
if (!ops->write)
return -ENOSYS;
- blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
- return ops->write(dev, start, blkcnt, buffer);
+ blkcache_invalidate(desc->uclass_id, desc->devnum);
+
+ return ops->write(dev, start, blkcnt, buf);
}
-unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
- lbaint_t blkcnt)
+long blk_erase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt)
{
- struct udevice *dev = block_dev->bdev;
+ struct blk_desc *desc = dev_get_uclass_plat(dev);
const struct blk_ops *ops = blk_get_ops(dev);
if (!ops->erase)
return -ENOSYS;
- blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
+ blkcache_invalidate(desc->uclass_id, desc->devnum);
+
return ops->erase(dev, start, blkcnt);
}
+ulong blk_dread(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt,
+ void *buffer)
+{
+ return blk_read(desc->bdev, start, blkcnt, buffer);
+}
+
+ulong blk_dwrite(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt,
+ const void *buffer)
+{
+ return blk_write(desc->bdev, start, blkcnt, buffer);
+}
+
+ulong blk_derase(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt)
+{
+ return blk_erase(desc->bdev, start, blkcnt);
+}
+
int blk_get_from_parent(struct udevice *parent, struct udevice **devp)
{
struct udevice *dev;
diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
index 5d5104bbf1..3a664c2ebb 100644
--- a/drivers/mmc/Makefile
+++ b/drivers/mmc/Makefile
@@ -10,7 +10,7 @@ ifdef CONFIG_$(SPL_TPL_)DM_MMC
obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += mmc_bootdev.o
endif
-obj-$(CONFIG_$(SPL_)MMC_WRITE) += mmc_write.o
+obj-$(CONFIG_$(SPL_TPL_)MMC_WRITE) += mmc_write.o
obj-$(CONFIG_MMC_PWRSEQ) += mmc-pwrseq.o
obj-$(CONFIG_MMC_SDHCI_ADMA_HELPERS) += sdhci-adma.o
diff --git a/drivers/mmc/sandbox_mmc.c b/drivers/mmc/sandbox_mmc.c
index 451fe4a4e5..ba79a5565c 100644
--- a/drivers/mmc/sandbox_mmc.c
+++ b/drivers/mmc/sandbox_mmc.c
@@ -23,6 +23,8 @@ struct sandbox_mmc_plat {
#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)
+
+/* Granularity of priv->csize - this is 1MB */
#define SIZE_MULTIPLE ((1 << (MMC_CMULT + 2)) * MMC_BL_LEN)
struct sandbox_mmc_priv {
@@ -41,7 +43,6 @@ 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) {
@@ -95,10 +96,15 @@ static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
case SD_CMD_ERASE_WR_BLK_END:
erase_end = cmd->cmdarg;
break;
- case MMC_CMD_ERASE:
+#if CONFIG_IS_ENABLED(MMC_WRITE)
+ case MMC_CMD_ERASE: {
+ struct mmc *mmc = mmc_get_mmc_dev(dev);
+
memset(&priv->buf[erase_start * mmc->write_bl_len], '\0',
(erase_end - erase_start + 1) * mmc->write_bl_len);
break;
+ }
+#endif
case SD_CMD_APP_SEND_OP_COND:
cmd->response[0] = OCR_BUSY | OCR_HCS;
cmd->response[1] = 0;
diff --git a/drivers/scsi/scsi_emul.c b/drivers/scsi/scsi_emul.c
index 5ba364bdac..6b8468f799 100644
--- a/drivers/scsi/scsi_emul.c
+++ b/drivers/scsi/scsi_emul.c
@@ -62,6 +62,15 @@ int sb_scsi_emul_command(struct scsi_emul_info *info,
ret = SCSI_EMUL_DO_READ;
break;
}
+ case SCSI_WRITE10: {
+ const struct scsi_write10_req *write_req = (void *)req;
+
+ info->seek_block = be32_to_cpu(write_req->lba);
+ info->write_len = be16_to_cpu(write_req->xfer_len);
+ info->buff_used = info->write_len * info->block_size;
+ ret = SCSI_EMUL_DO_WRITE;
+ break;
+ }
default:
debug("Command not supported: %x\n", req->cmd[0]);
ret = -EPROTONOSUPPORT;
diff --git a/drivers/usb/emul/sandbox_flash.c b/drivers/usb/emul/sandbox_flash.c
index 2589c708d8..6e8cfe1650 100644
--- a/drivers/usb/emul/sandbox_flash.c
+++ b/drivers/usb/emul/sandbox_flash.c
@@ -4,6 +4,8 @@
* Written by Simon Glass <sjg@chromium.org>
*/
+#define LOG_CATEGORY UCLASS_USB
+
#include <common.h>
#include <dm.h>
#include <log.h>
@@ -190,7 +192,8 @@ static int handle_ufi_command(struct sandbox_flash_priv *priv, const void *buff,
ret = sb_scsi_emul_command(info, req, len);
if (!ret) {
setup_response(priv);
- } else if (ret == SCSI_EMUL_DO_READ && priv->fd != -1) {
+ } else if ((ret == SCSI_EMUL_DO_READ || ret == SCSI_EMUL_DO_WRITE) &&
+ priv->fd != -1) {
os_lseek(priv->fd, info->seek_block * info->block_size,
OS_SEEK_SET);
setup_response(priv);
@@ -217,6 +220,7 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
case SCSIPH_START:
info->alloc_len = 0;
info->read_len = 0;
+ info->write_len = 0;
if (priv->error || len != UMASS_BBB_CBW_SIZE ||
cbw->dCBWSignature != CBWSIGNATURE)
goto err;
@@ -230,8 +234,31 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
return handle_ufi_command(priv, cbw->CBWCDB,
cbw->bCDBLength);
case SCSIPH_DATA:
- debug("data out\n");
- break;
+ log_debug("data out, len=%x, info->write_len=%x\n", len,
+ info->write_len);
+ info->transfer_len = cbw->dCBWDataTransferLength;
+ priv->tag = cbw->dCBWTag;
+ if (!info->write_len)
+ return 0;
+ if (priv->fd != -1) {
+ ulong bytes_written;
+
+ bytes_written = os_write(priv->fd, buff, len);
+ log_debug("bytes_written=%lx", bytes_written);
+ if (bytes_written != len)
+ return -EIO;
+ info->write_len -= len / info->block_size;
+ if (!info->write_len)
+ info->phase = SCSIPH_STATUS;
+ } else {
+ if (info->alloc_len && len > info->alloc_len)
+ len = info->alloc_len;
+ if (len > SANDBOX_FLASH_BUF_SIZE)
+ len = SANDBOX_FLASH_BUF_SIZE;
+ memcpy(info->buff, buff, len);
+ info->phase = SCSIPH_STATUS;
+ }
+ return len;
default:
break;
}
@@ -310,7 +337,7 @@ static int sandbox_flash_probe(struct udevice *dev)
struct scsi_emul_info *info = &priv->eminfo;
int ret;
- priv->fd = os_open(plat->pathname, OS_O_RDONLY);
+ priv->fd = os_open(plat->pathname, OS_O_RDWR);
if (priv->fd != -1) {
ret = os_get_filesize(plat->pathname, &info->file_size);
if (ret)