protocol: Add create_read_window

Change-Id: I82e9e69861163fb1ae35313fcfee37e03be69f65
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
diff --git a/transport_mbox.c b/transport_mbox.c
index 873f952..a4e7efa 100644
--- a/transport_mbox.c
+++ b/transport_mbox.c
@@ -307,50 +307,20 @@
 int mbox_handle_read_window(struct mbox_context *context,
 				   union mbox_regs *req, struct mbox_msg *resp)
 {
-	uint32_t flash_offset;
+	struct protocol_create_window io;
 	int rc;
 
-	/* Close the current window if there is one */
-	if (context->current) {
-		/* There is an implicit flush if it was a write window */
-		if (context->current_is_write) {
-			rc = mbox_handle_flush_window(context, NULL, NULL);
-			if (rc < 0) {
-				MSG_ERR("Couldn't Flush Write Window\n");
-				return rc;
-			}
-		}
-		windows_close_current(context, NO_BMC_EVENT, FLAGS_NONE);
+	io.req.offset = get_u16(&req->msg.args[0]);
+
+	rc = context->protocol->create_read_window(context, &io);
+	if (rc < 0) {
+		return mbox_xlate_errno(context, rc);
 	}
 
-	/* Offset the host has requested */
-	flash_offset = get_u16(&req->msg.args[0]) << context->block_size_shift;
-	MSG_INFO("Host requested flash @ 0x%.8x\n", flash_offset);
-	/* Check if we have an existing window */
-	context->current = windows_search(context, flash_offset,
-					  context->version == API_VERSION_1);
-
-	if (!context->current) { /* No existing window */
-		MSG_DBG("No existing window which maps that flash offset\n");
-		rc = windows_create_map(context, &context->current, flash_offset,
-				       context->version == API_VERSION_1);
-		if (rc < 0) { /* Unable to map offset */
-			MSG_ERR("Couldn't create window mapping for offset 0x%.8x\n"
-				, flash_offset);
-			return rc;
-		}
-	}
-
-	MSG_INFO("Window @ %p for size 0x%.8x maps flash offset 0x%.8x\n",
-		 context->current->mem, context->current->size,
-		 context->current->flash_offset);
-
-	put_u16(&resp->args[0], get_lpc_addr_shifted(context));
+	put_u16(&resp->args[0], io.resp.lpc_address);
 	if (context->version >= API_VERSION_2) {
-		put_u16(&resp->args[2], context->current->size >>
-					context->block_size_shift);
-		put_u16(&resp->args[4], context->current->flash_offset >>
-					context->block_size_shift);
+		put_u16(&resp->args[2], io.resp.size);
+		put_u16(&resp->args[4], io.resp.offset);
 	}
 
 	context->current_is_write = false;