diff options
| author | Jung-uk Kim <jkim@FreeBSD.org> | 2016-05-27 21:40:35 +0000 | 
|---|---|---|
| committer | Jung-uk Kim <jkim@FreeBSD.org> | 2016-05-27 21:40:35 +0000 | 
| commit | 4d46bb7749ef0cf25eb2b25f2d7324023cb754b4 (patch) | |
| tree | f7064866b29ad07c184316d5bbb13a4cb187326b /source/components/hardware/hwregs.c | |
| parent | 2331c681155dd7b2f78bd28ca0c183e2f98ff44f (diff) | |
Notes
Diffstat (limited to 'source/components/hardware/hwregs.c')
| -rw-r--r-- | source/components/hardware/hwregs.c | 239 | 
1 files changed, 33 insertions, 206 deletions
diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c index 87c18d1b4c64..bc85c96b553f 100644 --- a/source/components/hardware/hwregs.c +++ b/source/components/hardware/hwregs.c @@ -54,11 +54,6 @@  /* Local Prototypes */ -static UINT8 -AcpiHwGetAccessBitWidth ( -    ACPI_GENERIC_ADDRESS    *Reg, -    UINT8                   MaxBitWidth); -  static ACPI_STATUS  AcpiHwReadMultiple (      UINT32                  *Value, @@ -76,43 +71,6 @@ AcpiHwWriteMultiple (  /******************************************************************************   * - * FUNCTION:    AcpiHwGetAccessBitWidth - * - * PARAMETERS:  Reg                 - GAS register structure - *              MaxBitWidth         - Max BitWidth supported (32 or 64) - * - * RETURN:      Status - * - * DESCRIPTION: Obtain optimal access bit width - * - ******************************************************************************/ - -static UINT8 -AcpiHwGetAccessBitWidth ( -    ACPI_GENERIC_ADDRESS    *Reg, -    UINT8                   MaxBitWidth) -{ - -    if (!Reg->AccessWidth) -    { -        if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_IO) -        { -            return (32); -        } -        else -        { -            return (MaxBitWidth); -        } -    } -    else -    { -        return (1 << (Reg->AccessWidth + 2)); -    } -} - - -/****************************************************************************** - *   * FUNCTION:    AcpiHwValidateRegister   *   * PARAMETERS:  Reg                 - GAS register structure @@ -133,9 +91,6 @@ AcpiHwValidateRegister (      UINT8                   MaxBitWidth,      UINT64                  *Address)  { -    UINT8                   BitWidth; -    UINT8                   AccessWidth; -      /* Must have a valid pointer to a GAS structure */ @@ -165,25 +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 = AcpiHwGetAccessBitWidth (Reg, MaxBitWidth); -    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); @@ -204,7 +158,10 @@ AcpiHwValidateRegister (   *              64-bit values is not needed.   *   * LIMITATIONS: <These limitations also apply to AcpiHwWrite> + *      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.   *   ******************************************************************************/ @@ -214,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; @@ -234,64 +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 = AcpiHwGetAccessBitWidth (Reg, 32); -    BitWidth = Reg->BitOffset + Reg->BitWidth; -    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); -            } -        } - -        ACPI_SET_BITS (Value, Index * AccessWidth, -            ACPI_MASK_BITS_ABOVE_32 (AccessWidth), Value32); +        Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS) +            Address, &Value64, Reg->BitWidth); -        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); @@ -319,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; @@ -339,109 +251,24 @@ AcpiHwWrite (          return (Status);      } -    /* Convert AccessWidth into number of bits based */ - -    AccessWidth = AcpiHwGetAccessBitWidth (Reg, 32); -    BitWidth = Reg->BitOffset + Reg->BitWidth; -    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, -            ACPI_MASK_BITS_ABOVE_32 (AccessWidth)); - -        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);  | 
