diff options
| author | Jung-uk Kim <jkim@FreeBSD.org> | 2013-01-02 19:01:21 +0000 | 
|---|---|---|
| committer | Jung-uk Kim <jkim@FreeBSD.org> | 2013-01-02 19:01:21 +0000 | 
| commit | b28e481ae9b051dab150e9b5a89730cdc1103a9c (patch) | |
| tree | 434e706ece73a93073f350c91cd35ed7d7e98811 /source/compiler/dttable.c | |
| parent | c2463a8709e5b3a5ce54c09d35b4820a756b0fc5 (diff) | |
Notes
Diffstat (limited to 'source/compiler/dttable.c')
| -rw-r--r-- | source/compiler/dttable.c | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/source/compiler/dttable.c b/source/compiler/dttable.c index 2e8ac0abd0a0e..95110a757ac77 100644 --- a/source/compiler/dttable.c +++ b/source/compiler/dttable.c @@ -420,6 +420,94 @@ DtCompileCpep (  /******************************************************************************   * + * FUNCTION:    DtCompileCsrt + * + * PARAMETERS:  List                - Current field list pointer + * + * RETURN:      Status + * + * DESCRIPTION: Compile CSRT. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileCsrt ( +    void                    **List) +{ +    ACPI_STATUS             Status = AE_OK; +    DT_SUBTABLE             *Subtable; +    DT_SUBTABLE             *ParentTable; +    DT_FIELD                **PFieldList = (DT_FIELD **) List; +    UINT32                  DescriptorCount; +    UINT32                  GroupLength; + + +    /* Sub-tables (Resource Groups) */ + +    while (*PFieldList) +    { +        /* Resource group subtable */ + +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0, +                    &Subtable, TRUE); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } + +        /* Compute the number of resource descriptors */ + +        GroupLength = +            (ACPI_CAST_PTR (ACPI_CSRT_GROUP, +                Subtable->Buffer))->Length - +            (ACPI_CAST_PTR (ACPI_CSRT_GROUP, +                Subtable->Buffer))->SharedInfoLength - +            sizeof (ACPI_CSRT_GROUP); + +        DescriptorCount = (GroupLength  / +            sizeof (ACPI_CSRT_DESCRIPTOR)); + +        ParentTable = DtPeekSubtable (); +        DtInsertSubtable (ParentTable, Subtable); +        DtPushSubtable (Subtable); + +        /* Shared info subtable (One per resource group) */ + +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1, +                    &Subtable, TRUE); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } + +        ParentTable = DtPeekSubtable (); +        DtInsertSubtable (ParentTable, Subtable); + +        /* Sub-Subtables (Resource Descriptors) */ + +        while (*PFieldList && DescriptorCount) +        { +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2, +                        &Subtable, TRUE); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } + +            ParentTable = DtPeekSubtable (); +            DtInsertSubtable (ParentTable, Subtable); +            DescriptorCount--; +        } + +        DtPopSubtable (); +    } + +    return (Status); +} + + +/****************************************************************************** + *   * FUNCTION:    DtCompileDmar   *   * PARAMETERS:  List                - Current field list pointer | 
