IsaIo.c revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi The implementation for EFI_ISA_IO_PROTOCOL.
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiCopyright (c) 2010, Intel Corporation. All rights reserved.<BR>
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiThis program and the accompanying materials
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiare licensed and made available under the terms and conditions of the BSD License
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiwhich accompanies this distribution. The full text of the license may be found at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchihttp://opensource.org/licenses/bsd-license.php
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// Module Variables
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }, // Channel 4 is invalid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Verifies access to an ISA device
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] IsaIoDevice The ISA device to be verified.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Type The Access type. The input must be either IsaAccessTypeMem or IsaAccessTypeIo.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Width The width of the memory operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Count The number of memory operations to perform.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Offset The offset in ISA memory space to start the memory operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @retval EFI_SUCCESS Verify success.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @retval EFI_UNSUPPORTED The device ont support the access type.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // If Width is EfiIsaIoWidthFifoUintX then convert to EfiIsaIoWidthUintX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // If Width is EfiIsaIoWidthFillUintX then convert to EfiIsaIoWidthUintX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (Width >= EfiIsaIoWidthFifoUint8 && Width < EfiIsaIoWidthFifoReserved) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Width = (EFI_ISA_IO_PROTOCOL_WIDTH) (Width & 0x03);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Item = IsaIoDevice->IsaIo.ResourceList->ResourceItem;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (Item->Type != EfiIsaAcpiResourceEndOfList) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Type == IsaAccessTypeMem && Item->Type == EfiIsaAcpiResourceMemory) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (Type == IsaAccessTypeIo && Item->Type == EfiIsaAcpiResourceIo)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (Offset >= Item->StartRange && (Offset + Count * (UINT32)(1 << Width)) - 1 <= Item->EndRange) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (Offset >= Item->StartRange && Offset <= Item->EndRange) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Convert the IO Information in ACPI descriptor to IO ISA Attribute.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Information The IO Information in ACPI descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @return UINT32 The IO ISA Attribute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (Information & EFI_ACPI_IO_DECODE_MASK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_ACPI_IO_DECODE_16_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_ACPI_IO_DECODE_10_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Convert the IRQ Information in ACPI descriptor to IRQ ISA Attribute.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Information The IRQ Information in ACPI descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @return UINT32 The IRQ ISA Attribute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Information & EFI_ACPI_IRQ_POLARITY_MASK) == EFI_ACPI_IRQ_HIGH_TRUE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Information & EFI_ACPI_IRQ_MODE) == EFI_ACPI_IRQ_LEVEL_TRIGGERED) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_LEVEL_SENSITIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Information & EFI_ACPI_IRQ_MODE) == EFI_ACPI_IRQ_LEVEL_TRIGGERED) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute = EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_LEVEL_SENSITIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute = EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_EDGE_SENSITIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Convert the Memory Information in ACPI descriptor to Memory ISA Attribute.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Information The Memory Information in ACPI descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @return UINT32 The Memory ISA Attribute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (Information & EFI_ACPI_MEMORY_WRITE_STATUS_MASK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_ACPI_MEMORY_WRITEABLE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Convert the DMA Information in ACPI descriptor to DMA ISA Attribute.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Information The DMA Information in ACPI descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @return UINT32 The DMA ISA Attribute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute = EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (Information & EFI_ACPI_DMA_SPEED_TYPE_MASK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_A;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_B;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_C;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (Information & EFI_ACPI_DMA_TRANSFER_TYPE_MASK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_16;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Convert the ACPI resource descriptor to ISA resource descriptor.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] AcpiResource Pointer to the ACPI resource descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[out] IsaResource The optional pointer to the buffer to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi store the converted ISA resource descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @return UINTN Number of ISA resource descriptor needed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT EFI_ISA_ACPI_RESOURCE *IsaResource OPTIONAL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *FixedIo;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EFI_ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR *Memory;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *FixedMemory;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Dma = (EFI_ACPI_DMA_DESCRIPTOR *) AcpiResource.SmallHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (Index = 0; Index < sizeof (Dma->ChannelMask) * 8; Index++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Count > 0) && (LastIndex + 1 == Index)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceDma;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = IsaDmaAttribute (Dma->Information);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Io = (EFI_ACPI_IO_PORT_DESCRIPTOR *) AcpiResource.SmallHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceIo;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = IsaIoAttribute (Io->Information);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].StartRange = Io->BaseAddressMin;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].EndRange = Io->BaseAddressMin + Io->Length - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FixedIo = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *) AcpiResource.SmallHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceIo;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = EFI_ISA_ACPI_IO_DECODE_10_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].StartRange = FixedIo->BaseAddress;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].EndRange = FixedIo->BaseAddress + FixedIo->Length - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Irq = (EFI_ACPI_IRQ_DESCRIPTOR *) AcpiResource.SmallHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (Index = 0; Index < sizeof (Irq->Mask) * 8; Index++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((Count > 0) && (LastIndex + 1 == Index)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceInterrupt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (AcpiResource.SmallHeader->Byte == ACPI_IRQ_DESCRIPTOR) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = IsaIrqAttribute (Irq->Information);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Memory = (EFI_ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR *) AcpiResource.LargeHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceMemory;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = IsaMemoryAttribute (Memory->Information);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].StartRange = Memory->BaseAddressMin;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].EndRange = Memory->BaseAddressMin + Memory->Length - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FixedMemory = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *) AcpiResource.LargeHeader;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceMemory;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Attribute = IsaMemoryAttribute (FixedMemory->Information);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].StartRange = FixedMemory->BaseAddress;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].EndRange = FixedMemory->BaseAddress + FixedMemory->Length - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaResource[Count].Type = EfiIsaAcpiResourceEndOfList;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Initializes an ISA I/O Instance
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] IsaIoDevice The isa device to be initialized.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] DevicePath The device path of the isa device.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi @param[in] Resources The ACPI resource list.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Use the ISA IO Protocol structure template to initialize the ISA IO instance
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Count the resources including the ACPI End Tag
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (ResourcePtr.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Index += AcpiResourceToIsaResource (ResourcePtr, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ResourcePtr.SmallHeader->Bits.Type == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ResourcePtr.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.SmallHeader
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ResourcePtr.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.LargeHeader
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Get the Isa Resource count for ACPI End Tag
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Index += AcpiResourceToIsaResource (ResourcePtr, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Initialize the ResourceList
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IsaIoDevice->IsaIo.ResourceList = AllocatePool (sizeof (EFI_ISA_ACPI_RESOURCE_LIST) + Index * sizeof (EFI_ISA_ACPI_RESOURCE));
IsaIoDevice->IsaIo.ResourceList->ResourceItem = (EFI_ISA_ACPI_RESOURCE *) (IsaIoDevice->IsaIo.ResourceList + 1);
AcpiNode = (ACPI_HID_DEVICE_PATH *) ((UINT8 *) DevicePath + GetDevicePathSize (DevicePath) - END_DEVICE_PATH_LENGTH - sizeof (ACPI_HID_DEVICE_PATH));
Index = 0;
Index += AcpiResourceToIsaResource (ResourcePtr, &IsaIoDevice->IsaIo.ResourceList->ResourceItem[Index]);
return Status;
return Status;
return Status;
return Status;
return Status;
return EFI_SUCCESS;
return Status;
return Status;
return Status;
return Status;
return Status;
return EFI_UNSUPPORTED;
CopyMem (
return EFI_SUCCESS;
return Status;
return EFI_UNSUPPORTED;
return Status;
return Status;
return EFI_UNSUPPORTED;
return Status;
return Status;
return EFI_UNSUPPORTED;
return Status;
return Status;
return Status;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_UNSUPPORTED;
*NumberOfBytes = 0;
return EFI_OUT_OF_RESOURCES;
*NumberOfBytes = 0;
return Status;
CopyMem (
This,
return Status;
This,
return Status;
return Status;
This,
return Status;
This,
return Status;
return EFI_SUCCESS;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
if (!Master) {
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
if ((ChannelAttributes &
EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_C)) != 0) {
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_UNSUPPORTED;
*NumberOfBytes = 0;
return EFI_OUT_OF_RESOURCES;
*NumberOfBytes = 0;
return Status;
CopyMem (
if (Master) {
return EFI_SUCCESS;
if (Read) {
BaseAddress = (UINT32) (((UINT32) (*DeviceAddress) & 0xff0000) | (((UINT32) (*DeviceAddress) & 0xffff) >> 1));
This,
return Status;
This,
return Status;
return Status;
This,
return Status;
This,
return Status;
return EFI_SUCCESS;
IsaIoMap (
return EFI_UNSUPPORTED;
return IsaIoMapOnlySupportSlaveReadWrite (
This,
return IsaIoMapFullSupport (
This,
return EFI_UNSUPPORTED;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
return EFI_INVALID_PARAMETER;
if ((Attributes & ~(EFI_ISA_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_ISA_IO_ATTRIBUTE_MEMORY_CACHED)) != 0) {
return EFI_UNSUPPORTED;
return EFI_UNSUPPORTED;
return Status;
return Status;
return EFI_UNSUPPORTED;
return Status;