summaryrefslogtreecommitdiffstats
path: root/mboxd_flash_physical.c
diff options
context:
space:
mode:
Diffstat (limited to 'mboxd_flash_physical.c')
-rw-r--r--mboxd_flash_physical.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/mboxd_flash_physical.c b/mboxd_flash_physical.c
index 92c70e7..16f2363 100644
--- a/mboxd_flash_physical.c
+++ b/mboxd_flash_physical.c
@@ -69,3 +69,43 @@ int copy_flash(struct mbox_context *context, uint32_t offset, void *mem,
return size ? -MBOX_R_SYSTEM_ERROR : 0;
}
+
+/*
+ * write_flash() - Write the flash from a provided buffer
+ * @context: The mbox context pointer
+ * @offset: The flash offset to write to (bytes)
+ * @buf: The buffer to write from (must be of atleast size)
+ * @size: The number of bytes to write
+ *
+ * Return: 0 on success otherwise negative error code
+ */
+int write_flash(struct mbox_context *context, uint32_t offset, void *buf,
+ uint32_t count)
+{
+ uint32_t buf_offset = 0;
+ int rc;
+
+ MSG_DBG("Write flash @ 0x%.8x for 0x%.8x from %p\n", offset, count, buf);
+
+ if (lseek(context->fds[MTD_FD].fd, offset, SEEK_SET) != offset) {
+ MSG_ERR("Couldn't seek flash at pos: %u %s\n", offset,
+ strerror(errno));
+ return -MBOX_R_SYSTEM_ERROR;
+ }
+
+ while (count) {
+ rc = write(context->fds[MTD_FD].fd, buf + buf_offset, count);
+ if (rc < 0) {
+ MSG_ERR("Couldn't write to flash, write lost: %s\n",
+ strerror(errno));
+ return -MBOX_R_WRITE_ERROR;
+ }
+ /* Mark *NOT* erased where we just wrote */
+ set_flash_bytemap(context, offset + buf_offset, rc,
+ FLASH_DIRTY);
+ count -= rc;
+ buf_offset += rc;
+ }
+
+ return 0;
+}
OpenPOWER on IntegriCloud