diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/Makefile | 2 | ||||
-rw-r--r-- | drivers/block/Kconfig | 1 | ||||
-rw-r--r-- | drivers/block/Makefile | 2 | ||||
-rw-r--r-- | drivers/block/blk-uclass.c | 51 | ||||
-rw-r--r-- | drivers/mmc/Makefile | 2 | ||||
-rw-r--r-- | drivers/mmc/sandbox_mmc.c | 10 | ||||
-rw-r--r-- | drivers/scsi/scsi_emul.c | 9 | ||||
-rw-r--r-- | drivers/usb/emul/sandbox_flash.c | 35 |
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) |