/** @file | |
Internal definitions for the PVSCSI driver, which produces Extended SCSI | |
Pass Thru Protocol instances for pvscsi devices. | |
Copyright (C) 2020, Oracle and/or its affiliates. | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __PVSCSI_DXE_H_ | |
#define __PVSCSI_DXE_H_ | |
#include <Library/DebugLib.h> | |
#include <Protocol/ScsiPassThruExt.h> | |
typedef struct { | |
EFI_PHYSICAL_ADDRESS DeviceAddress; | |
VOID *Mapping; | |
} PVSCSI_DMA_DESC; | |
typedef struct { | |
PVSCSI_RINGS_STATE *RingState; | |
PVSCSI_DMA_DESC RingStateDmaDesc; | |
PVSCSI_RING_REQ_DESC *RingReqs; | |
PVSCSI_DMA_DESC RingReqsDmaDesc; | |
PVSCSI_RING_CMP_DESC *RingCmps; | |
PVSCSI_DMA_DESC RingCmpsDmaDesc; | |
} PVSCSI_RING_DESC; | |
typedef struct { | |
// | |
// As EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET.SenseDataLength is defined | |
// as UINT8, defining here SenseData size to MAX_UINT8 will guarantee it | |
// cannot overflow when passed to device. | |
// | |
UINT8 SenseData[MAX_UINT8]; | |
// | |
// This size of the data is arbitrarily chosen. | |
// It seems to be sufficient for all I/O requests sent through | |
// EFI_SCSI_PASS_THRU_PROTOCOL.PassThru() for common boot scenarios. | |
// | |
UINT8 Data[0x2000]; | |
} PVSCSI_DMA_BUFFER; | |
#define PVSCSI_SIG SIGNATURE_32 ('P', 'S', 'C', 'S') | |
typedef struct { | |
UINT32 Signature; | |
EFI_PCI_IO_PROTOCOL *PciIo; | |
EFI_EVENT ExitBoot; | |
UINT64 OriginalPciAttributes; | |
PVSCSI_RING_DESC RingDesc; | |
PVSCSI_DMA_BUFFER *DmaBuf; | |
PVSCSI_DMA_DESC DmaBufDmaDesc; | |
UINT8 MaxTarget; | |
UINT8 MaxLun; | |
UINTN WaitForCmpStallInUsecs; | |
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; | |
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode; | |
} PVSCSI_DEV; | |
#define PVSCSI_FROM_PASS_THRU(PassThruPointer) \ | |
CR (PassThruPointer, PVSCSI_DEV, PassThru, PVSCSI_SIG) | |
#define PVSCSI_DMA_BUF_DEV_ADDR(Dev, MemberName) \ | |
(Dev->DmaBufDmaDesc.DeviceAddress + OFFSET_OF(PVSCSI_DMA_BUFFER, MemberName)) | |
#endif // __PVSCSI_DXE_H_ |