[virtio_magma] Use magma_internal_map/unmap Change-Id: I93c99d0bfe1d86a8784c5bd3f13756d58e652fe0
diff --git a/drivers/virtio/virtio_magma.c b/drivers/virtio/virtio_magma.c index d7e28c6..9ca8635 100644 --- a/drivers/virtio/virtio_magma.c +++ b/drivers/virtio/virtio_magma.c
@@ -543,8 +543,8 @@ static int virtmagma_buffer_fd_release(struct inode *inodep, struct file *filp) struct virtmagma_instance *instance = priv->instance; struct virtmagma_connection *connection = NULL; struct virtmagma_connection_object *object = NULL; - struct virtio_magma_unmap_ctrl *request = NULL; - struct virtio_magma_unmap_resp *response = NULL; + struct virtio_magma_internal_unmap_ctrl *request = NULL; + struct virtio_magma_internal_unmap_resp *response = NULL; int ret; if (instance) { @@ -569,10 +569,11 @@ static int virtmagma_buffer_fd_release(struct inode *inodep, struct file *filp) .response_size = sizeof(*response) }; - request->hdr.type = VIRTIO_MAGMA_CMD_UNMAP; + request->hdr.type = VIRTIO_MAGMA_CMD_INTERNAL_UNMAP; request->hdr.flags = 0; request->connection = priv->connection_id; request->buffer = priv->buffer_id; + request->address = priv->phys_addr; ret = vq_out_send_sync(instance->vi, &command); if (ret == 0) { @@ -603,8 +604,8 @@ static int virtmagma_buffer_fd_mmap(struct file *filp, struct virtmagma_instance *instance = priv->instance; struct virtmagma_connection *connection; struct virtmagma_connection_object *object; - struct virtio_magma_map_ctrl *request; - struct virtio_magma_map_resp *response; + struct virtio_magma_internal_map_ctrl *request; + struct virtio_magma_internal_map_resp *response; unsigned long vm_size = vma->vm_end - vma->vm_start; size_t max_map_size; int ret = 0; @@ -631,10 +632,11 @@ static int virtmagma_buffer_fd_mmap(struct file *filp, return -ENOMEM; } - request->hdr.type = VIRTIO_MAGMA_CMD_MAP; + request->hdr.type = VIRTIO_MAGMA_CMD_INTERNAL_MAP; request->hdr.flags = 0; request->connection = priv->connection_id; request->buffer = priv->buffer_id; + request->length = object->buffer.size_allocated; mutex_lock(&priv->mutex_lock); if (!priv->phys_addr) { @@ -652,7 +654,7 @@ static int virtmagma_buffer_fd_mmap(struct file *filp, } if (ret == 0) { - priv->phys_addr = response->addr_out; + priv->phys_addr = response->address_out; } } mutex_unlock(&priv->mutex_lock);
diff --git a/include/uapi/linux/virtio_magma.h b/include/uapi/linux/virtio_magma.h index 6178400..2243eef 100644 --- a/include/uapi/linux/virtio_magma.h +++ b/include/uapi/linux/virtio_magma.h
@@ -79,6 +79,8 @@ enum virtio_magma_ctrl_type { VIRTIO_MAGMA_CMD_BUFFER_RANGE_OP = 0x1041, VIRTIO_MAGMA_CMD_BUFFER_GET_INFO = 0x1042, VIRTIO_MAGMA_CMD_GET_BUFFER_HANDLE = 0x1043, + VIRTIO_MAGMA_CMD_INTERNAL_MAP = 0x1044, + VIRTIO_MAGMA_CMD_INTERNAL_UNMAP = 0x1045, /* magma success responses */ VIRTIO_MAGMA_RESP_RELEASE_CONNECTION = 0x2004, @@ -139,6 +141,8 @@ enum virtio_magma_ctrl_type { VIRTIO_MAGMA_RESP_BUFFER_RANGE_OP = 0x2041, VIRTIO_MAGMA_RESP_BUFFER_GET_INFO = 0x2042, VIRTIO_MAGMA_RESP_GET_BUFFER_HANDLE = 0x2043, + VIRTIO_MAGMA_RESP_INTERNAL_MAP = 0x2044, + VIRTIO_MAGMA_RESP_INTERNAL_UNMAP = 0x2045, /* magma error responses */ VIRTIO_MAGMA_RESP_ERR_UNIMPLEMENTED = 0x3001, @@ -267,6 +271,10 @@ inline const char* virtio_magma_ctrl_type_string(enum virtio_magma_ctrl_type typ case VIRTIO_MAGMA_RESP_BUFFER_GET_INFO: return "VIRTIO_MAGMA_RESP_BUFFER_GET_INFO"; case VIRTIO_MAGMA_CMD_GET_BUFFER_HANDLE: return "VIRTIO_MAGMA_CMD_GET_BUFFER_HANDLE"; case VIRTIO_MAGMA_RESP_GET_BUFFER_HANDLE: return "VIRTIO_MAGMA_RESP_GET_BUFFER_HANDLE"; + case VIRTIO_MAGMA_CMD_INTERNAL_MAP: return "VIRTIO_MAGMA_CMD_INTERNAL_MAP"; + case VIRTIO_MAGMA_RESP_INTERNAL_MAP: return "VIRTIO_MAGMA_RESP_INTERNAL_MAP"; + case VIRTIO_MAGMA_CMD_INTERNAL_UNMAP: return "VIRTIO_MAGMA_CMD_INTERNAL_UNMAP"; + case VIRTIO_MAGMA_RESP_INTERNAL_UNMAP: return "VIRTIO_MAGMA_RESP_INTERNAL_UNMAP"; case VIRTIO_MAGMA_RESP_ERR_UNIMPLEMENTED: return "VIRTIO_MAGMA_RESP_ERR_UNIMPLEMENTED"; case VIRTIO_MAGMA_RESP_ERR_INTERNAL: return "VIRTIO_MAGMA_RESP_ERR_INTERNAL"; case VIRTIO_MAGMA_RESP_ERR_HOST_DISCONNECTED: return "VIRTIO_MAGMA_RESP_ERR_HOST_DISCONNECTED"; @@ -337,6 +345,8 @@ inline enum virtio_magma_ctrl_type virtio_magma_expected_response_type(enum virt case VIRTIO_MAGMA_CMD_BUFFER_RANGE_OP: return VIRTIO_MAGMA_RESP_BUFFER_RANGE_OP; case VIRTIO_MAGMA_CMD_BUFFER_GET_INFO: return VIRTIO_MAGMA_RESP_BUFFER_GET_INFO; case VIRTIO_MAGMA_CMD_GET_BUFFER_HANDLE: return VIRTIO_MAGMA_RESP_GET_BUFFER_HANDLE; + case VIRTIO_MAGMA_CMD_INTERNAL_MAP: return VIRTIO_MAGMA_RESP_INTERNAL_MAP; + case VIRTIO_MAGMA_CMD_INTERNAL_UNMAP: return VIRTIO_MAGMA_RESP_INTERNAL_UNMAP; default: return VIRTIO_MAGMA_RESP_ERR_INVALID_COMMAND; } } @@ -1015,5 +1025,30 @@ struct virtio_magma_get_buffer_handle_resp { __le64 result_return; } __attribute((packed)); +struct virtio_magma_internal_map_ctrl { + struct virtio_magma_ctrl_hdr hdr; + __le64 connection; + __le64 buffer; + __le64 length; +} __attribute((packed)); + +struct virtio_magma_internal_map_resp { + struct virtio_magma_ctrl_hdr hdr; + __le64 address_out; + __le64 result_return; +} __attribute((packed)); + +struct virtio_magma_internal_unmap_ctrl { + struct virtio_magma_ctrl_hdr hdr; + __le64 connection; + __le64 buffer; + __le64 address; +} __attribute((packed)); + +struct virtio_magma_internal_unmap_resp { + struct virtio_magma_ctrl_hdr hdr; + __le64 result_return; +} __attribute((packed)); + #endif /* _LINUX_VIRTIO_MAGMA_H */