/** @file
  FUSE_INIT wrapper for the Virtio Filesystem device.

  Copyright (C) 2020, Red Hat, Inc.

  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include "VirtioFsDxe.h"

/**
  Send a FUSE_INIT request to the Virtio Filesystem device, for starting the
  FUSE session.

  From virtio-v1.1-cs01-87fa6b5d8155, 5.11.5 Device Initialization: "On
  initialization the driver first discovers the device's virtqueues. The FUSE
  session is started by sending a FUSE_INIT request as defined by the FUSE
  protocol on one request virtqueue."

  The function may only be called after VirtioFsInit() returns successfully and
  before VirtioFsUninit() is called.

  @param[in,out] VirtioFs  The Virtio Filesystem device to send the FUSE_INIT
                           request to. The FUSE request counter
                           "VirtioFs->RequestId" is set to 1 on output. The
                           maximum write buffer size exposed in the FUSE_INIT
                           response is saved in "VirtioFs->MaxWrite", on
                           output.

  @retval EFI_SUCCESS      The FUSE session has been started.

  @retval EFI_UNSUPPORTED  FUSE interface version or feature negotiation
                           failed.

  @return                  The "errno" value mapped to an EFI_STATUS code, if
                           the Virtio Filesystem device explicitly reported an
                           error.

  @return                  Error codes propagated from
                           VirtioFsSgListsValidate(), VirtioFsFuseNewRequest(),
                           VirtioFsSgListsSubmit(),
                           VirtioFsFuseCheckResponse().
**/
EFI_STATUS
VirtioFsFuseInitSession (
  IN OUT VIRTIO_FS *VirtioFs
  )
{
  VIRTIO_FS_FUSE_REQUEST        CommonReq;
  VIRTIO_FS_FUSE_INIT_REQUEST   InitReq;
  VIRTIO_FS_IO_VECTOR           ReqIoVec[2];
  VIRTIO_FS_SCATTER_GATHER_LIST ReqSgList;
  VIRTIO_FS_FUSE_RESPONSE       CommonResp;
  VIRTIO_FS_FUSE_INIT_RESPONSE  InitResp;
  VIRTIO_FS_IO_VECTOR           RespIoVec[2];
  VIRTIO_FS_SCATTER_GATHER_LIST RespSgList;
  EFI_STATUS                    Status;

  //
  // Initialize the FUSE request counter.
  //
  VirtioFs->RequestId = 1;

  //
  // Set up the scatter-gather lists.
  //
  ReqIoVec[0].Buffer = &CommonReq;
  ReqIoVec[0].Size   = sizeof CommonReq;
  ReqIoVec[1].Buffer = &InitReq;
  ReqIoVec[1].Size   = sizeof InitReq;
  ReqSgList.IoVec    = ReqIoVec;
  ReqSgList.NumVec   = ARRAY_SIZE (ReqIoVec);

  RespIoVec[0].Buffer = &CommonResp;
  RespIoVec[0].Size   = sizeof CommonResp;
  RespIoVec[1].Buffer = &InitResp;
  RespIoVec[1].Size   = sizeof InitResp;
  RespSgList.IoVec    = RespIoVec;
  RespSgList.NumVec   = ARRAY_SIZE (RespIoVec);

  //
  // Validate the scatter-gather lists; calculate the total transfer sizes.
  //
  Status = VirtioFsSgListsValidate (VirtioFs, &ReqSgList, &RespSgList);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Populate the common request header.
  //
  Status = VirtioFsFuseNewRequest (VirtioFs, &CommonReq, ReqSgList.TotalSize,
             VirtioFsFuseOpInit, 0);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Populate the FUSE_INIT-specific fields.
  //
  InitReq.Major        = VIRTIO_FS_FUSE_MAJOR;
  InitReq.Minor        = VIRTIO_FS_FUSE_MINOR;
  InitReq.MaxReadahead = 0;
  InitReq.Flags        = VIRTIO_FS_FUSE_INIT_REQ_F_DO_READDIRPLUS;

  //
  // Submit the request.
  //
  Status = VirtioFsSgListsSubmit (VirtioFs, &ReqSgList, &RespSgList);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Verify the response (all response buffers are fixed size).
  //
  Status = VirtioFsFuseCheckResponse (&RespSgList, CommonReq.Unique, NULL);
  if (EFI_ERROR (Status)) {
    if (Status == EFI_DEVICE_ERROR) {
      DEBUG ((DEBUG_ERROR, "%a: Label=\"%s\" Errno=%d\n", __FUNCTION__,
        VirtioFs->Label, CommonResp.Error));
      Status = VirtioFsErrnoToEfiStatus (CommonResp.Error);
    }
    return Status;
  }

  //
  // Check FUSE interface version / feature compatibility.
  //
  if (InitResp.Major < InitReq.Major ||
      (InitResp.Major == InitReq.Major && InitResp.Minor < InitReq.Minor) ||
      (InitResp.Flags & VIRTIO_FS_FUSE_INIT_REQ_F_DO_READDIRPLUS) == 0 ||
      InitResp.MaxWrite < SIZE_4KB) {
    return EFI_UNSUPPORTED;
  }

  //
  // Save the maximum write buffer size for FUSE_WRITE requests.
  //
  VirtioFs->MaxWrite = InitResp.MaxWrite;
  return EFI_SUCCESS;
}
