static unsigned long host_block_write(struct udevice *dev, unsigned long start, lbaint_t blkcnt, const void *buffer) { struct host_block_dev *host_dev = dev_get_priv(dev); struct blk_desc *block_dev = dev_get_uclass_platdata(dev); #else static unsigned long host_block_write(struct blk_desc *block_dev, unsigned long start, lbaint_t blkcnt, const void *buffer) { int dev = block_dev->devnum; struct host_block_dev *host_dev = find_host_device(dev); #endif if (os_lseek(host_dev->fd, start * block_dev->blksz, OS_SEEK_SET) == -1) { printf("ERROR: Invalid block %lx\n", start); return -1; } ssize_t len = os_write(host_dev->fd, buffer, blkcnt * block_dev->blksz); if (len >= 0) return len / block_dev->blksz; return -1; }
int host_get_dev_err(int dev, block_dev_desc_t **blk_devp) { struct host_block_dev *host_dev = find_host_device(dev); if (!host_dev) return -ENODEV; if (!host_dev->blk_dev.priv) return -ENOENT; *blk_devp = &host_dev->blk_dev; return 0; }
static unsigned long host_block_write(int dev, unsigned long start, lbaint_t blkcnt, const void *buffer) { struct host_block_dev *host_dev = find_host_device(dev); if (os_lseek(host_dev->fd, start * host_dev->blk_dev.blksz, OS_SEEK_SET) == -1) { printf("ERROR: Invalid position\n"); return -1; } ssize_t len = os_write(host_dev->fd, buffer, blkcnt * host_dev->blk_dev.blksz); if (len >= 0) return len / host_dev->blk_dev.blksz; return -1; }
int host_dev_bind(int dev, char *filename) { struct host_block_dev *host_dev = find_host_device(dev); if (!host_dev) return -1; if (host_dev->blk_dev.priv) { os_close(host_dev->fd); host_dev->blk_dev.priv = NULL; } if (host_dev->filename) free(host_dev->filename); if (filename && *filename) { host_dev->filename = strdup(filename); } else { host_dev->filename = NULL; return 0; } host_dev->fd = os_open(host_dev->filename, OS_O_RDWR); if (host_dev->fd == -1) { printf("Failed to access host backing file '%s'\n", host_dev->filename); return 1; } block_dev_desc_t *blk_dev = &host_dev->blk_dev; blk_dev->if_type = IF_TYPE_HOST; blk_dev->priv = host_dev; blk_dev->blksz = 512; blk_dev->lba = os_lseek(host_dev->fd, 0, OS_SEEK_END) / blk_dev->blksz; blk_dev->block_read = host_block_read; blk_dev->block_write = host_block_write; blk_dev->dev = dev; blk_dev->part_type = PART_TYPE_UNKNOWN; init_part(blk_dev); return 0; }
int host_get_dev_err(int devnum, struct blk_desc **blk_devp) { #ifdef CONFIG_BLK struct udevice *dev; int ret; ret = blk_get_device(IF_TYPE_HOST, devnum, &dev); if (ret) return ret; *blk_devp = dev_get_uclass_platdata(dev); #else struct host_block_dev *host_dev = find_host_device(devnum); if (!host_dev) return -ENODEV; if (!host_dev->blk_dev.priv) return -ENOENT; *blk_devp = &host_dev->blk_dev; #endif return 0; }