From db73e15d853cfa851067828e54a1c80eb50209cc Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Apr 2016 19:38:40 +0000 Subject: [PATCH] [ACPICA] - Revert the changes adding arbitrary bit length read/write support since they cause problems on VirtualBox and will be reworked upstream. CORE-11115 #resolve svn path=/trunk/; revision=71158 --- .../drivers/bus/acpi/acpica/hardware/hwregs.c | 200 +++--------------- 1 file changed, 33 insertions(+), 167 deletions(-) diff --git a/reactos/drivers/bus/acpi/acpica/hardware/hwregs.c b/reactos/drivers/bus/acpi/acpica/hardware/hwregs.c index 55cdd07be67..bc85c96b553 100644 --- a/reactos/drivers/bus/acpi/acpica/hardware/hwregs.c +++ b/reactos/drivers/bus/acpi/acpica/hardware/hwregs.c @@ -91,9 +91,6 @@ AcpiHwValidateRegister ( UINT8 MaxBitWidth, UINT64 *Address) { - UINT8 BitWidth; - UINT8 AccessWidth; - /* Must have a valid pointer to a GAS structure */ @@ -123,26 +120,24 @@ AcpiHwValidateRegister ( return (AE_SUPPORT); } - /* Validate the AccessWidth */ + /* Validate the BitWidth */ - if (Reg->AccessWidth > 4) + if ((Reg->BitWidth != 8) && + (Reg->BitWidth != 16) && + (Reg->BitWidth != 32) && + (Reg->BitWidth != MaxBitWidth)) { ACPI_ERROR ((AE_INFO, - "Unsupported register access width: 0x%X", Reg->AccessWidth)); + "Unsupported register bit width: 0x%X", Reg->BitWidth)); return (AE_SUPPORT); } - /* Validate the BitWidth, convert AccessWidth into number of bits */ + /* Validate the BitOffset. Just a warning for now. */ - AccessWidth = Reg->AccessWidth ? Reg->AccessWidth : 1; - AccessWidth = 1 << (AccessWidth + 2); - BitWidth = ACPI_ROUND_UP (Reg->BitOffset + Reg->BitWidth, AccessWidth); - if (MaxBitWidth < BitWidth) + if (Reg->BitOffset != 0) { ACPI_WARNING ((AE_INFO, - "Requested bit width 0x%X is smaller than register bit width 0x%X", - MaxBitWidth, BitWidth)); - return (AE_SUPPORT); + "Unsupported register bit offset: 0x%X", Reg->BitOffset)); } return (AE_OK); @@ -163,7 +158,10 @@ AcpiHwValidateRegister ( * 64-bit values is not needed. * * LIMITATIONS: + * BitWidth must be exactly 8, 16, or 32. * SpaceID must be SystemMemory or SystemIO. + * BitOffset and AccessWidth are currently ignored, as there has + * not been a need to implement these. * ******************************************************************************/ @@ -173,12 +171,7 @@ AcpiHwRead ( ACPI_GENERIC_ADDRESS *Reg) { UINT64 Address; - UINT8 AccessWidth; - UINT32 BitWidth; - UINT8 BitOffset; UINT64 Value64; - UINT32 Value32; - UINT8 Index; ACPI_STATUS Status; @@ -193,65 +186,30 @@ AcpiHwRead ( return (Status); } - /* - * Initialize entire 32-bit return value to zero, convert AccessWidth - * into number of bits based - */ + /* Initialize entire 32-bit return value to zero */ + *Value = 0; - AccessWidth = Reg->AccessWidth ? Reg->AccessWidth : 1; - AccessWidth = 1 << (AccessWidth + 2); - BitWidth = ACPI_ROUND_UP (Reg->BitOffset + Reg->BitWidth, AccessWidth); - BitOffset = Reg->BitOffset; /* * Two address spaces supported: Memory or IO. PCI_Config is * not supported here because the GAS structure is insufficient */ - Index = 0; - while (BitWidth) + if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) { - if (BitOffset > AccessWidth) - { - Value32 = 0; - BitOffset -= AccessWidth; - } - else - { - if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) - { - Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - &Value64, AccessWidth); - Value32 = (UINT32) Value64; - } - else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ - { - Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - &Value32, AccessWidth); - } - - if (BitOffset) - { - Value32 &= ACPI_MASK_BITS_BELOW (BitOffset); - BitOffset = 0; - } - if (BitWidth < AccessWidth) - { - Value32 &= ACPI_MASK_BITS_ABOVE (BitWidth); - } - } + Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS) + Address, &Value64, Reg->BitWidth); - ACPI_SET_BITS (Value, Index * AccessWidth, - ((1 << AccessWidth) - 1), Value32); - - BitWidth -= BitWidth > AccessWidth ? AccessWidth : BitWidth; - Index++; + *Value = (UINT32) Value64; + } + else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ + { + Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) + Address, Value, Reg->BitWidth); } ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", - *Value, AccessWidth, ACPI_FORMAT_UINT64 (Address), + *Value, Reg->BitWidth, ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId))); return (Status); @@ -279,12 +237,6 @@ AcpiHwWrite ( ACPI_GENERIC_ADDRESS *Reg) { UINT64 Address; - UINT8 AccessWidth; - UINT32 BitWidth; - UINT8 BitOffset; - UINT64 Value64; - UINT32 NewValue32, OldValue32; - UINT8 Index; ACPI_STATUS Status; @@ -299,110 +251,24 @@ AcpiHwWrite ( return (Status); } - /* Convert AccessWidth into number of bits based */ - - AccessWidth = Reg->AccessWidth ? Reg->AccessWidth : 1; - AccessWidth = 1 << (AccessWidth + 2); - BitWidth = ACPI_ROUND_UP (Reg->BitOffset + Reg->BitWidth, AccessWidth); - BitOffset = Reg->BitOffset; - /* * Two address spaces supported: Memory or IO. PCI_Config is * not supported here because the GAS structure is insufficient */ - Index = 0; - while (BitWidth) + if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) { - NewValue32 = ACPI_GET_BITS (&Value, (Index * AccessWidth), - ((1 << AccessWidth) - 1)); - - if (BitOffset > AccessWidth) - { - BitOffset -= AccessWidth; - } - else - { - if (BitOffset) - { - NewValue32 &= ACPI_MASK_BITS_BELOW (BitOffset); - } - - if (BitWidth < AccessWidth) - { - NewValue32 &= ACPI_MASK_BITS_ABOVE (BitWidth); - } - - if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) - { - if (BitOffset || BitWidth < AccessWidth) - { - /* - * Read old values in order not to modify the bits that - * are beyond the register BitWidth/BitOffset setting. - */ - Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - &Value64, AccessWidth); - OldValue32 = (UINT32) Value64; - - if (BitOffset) - { - OldValue32 &= ACPI_MASK_BITS_ABOVE (BitOffset + 1); - BitOffset = 0; - } - - if (BitWidth < AccessWidth) - { - OldValue32 &= ACPI_MASK_BITS_BELOW (BitWidth - 1); - } - - NewValue32 |= OldValue32; - } - - Value64 = (UINT64) NewValue32; - Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - Value64, AccessWidth); - } - else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ - { - if (BitOffset || BitWidth < AccessWidth) - { - /* - * Read old values in order not to modify the bits that - * are beyond the register BitWidth/BitOffset setting. - */ - Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - &OldValue32, AccessWidth); - - if (BitOffset) - { - OldValue32 &= ACPI_MASK_BITS_ABOVE (BitOffset + 1); - BitOffset = 0; - } - - if (BitWidth < AccessWidth) - { - OldValue32 &= ACPI_MASK_BITS_BELOW (BitWidth - 1); - } - - NewValue32 |= OldValue32; - } - - Status = AcpiHwWritePort ((ACPI_IO_ADDRESS) - Address + Index * ACPI_DIV_8 (AccessWidth), - NewValue32, AccessWidth); - } - } - - BitWidth -= BitWidth > AccessWidth ? AccessWidth : BitWidth; - Index++; + Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS) + Address, (UINT64) Value, Reg->BitWidth); + } + else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ + { + Status = AcpiHwWritePort ((ACPI_IO_ADDRESS) + Address, Value, Reg->BitWidth); } ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", - Value, AccessWidth, ACPI_FORMAT_UINT64 (Address), + Value, Reg->BitWidth, ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId))); return (Status); -- 2.17.1