Beispiel #1
0
            public override void Visit(AmlParser.DefIndexField defIndexField)
            {
                Node indexNode = acpiNamespace.LookupNode(defIndexField.indexName.nodePath, currentPath);

                CheckObjectType(indexNode.Value, AcpiObjectType.FieldUnit);
                AcpiObject.FieldUnit indexField = (AcpiObject.FieldUnit)(indexNode.Value.GetTarget());

                Node dataNode = acpiNamespace.LookupNode(defIndexField.dataName.nodePath, currentPath);

                CheckObjectType(dataNode.Value, AcpiObjectType.FieldUnit);
                AcpiObject.FieldUnit dataField = (AcpiObject.FieldUnit)(dataNode.Value.GetTarget());

                OperationRegion indexFieldRegion =
                    new OperationRegion(new IndexFieldOperationRegionAccessor(indexField, dataField),
                                        RegionSpace.SystemIO /*unused*/, 0, 256 /*index field never exceeds 8 bits*/);

                AccessType   accessType   = defIndexField.fieldFlags.accessType;
                AccessAttrib accessAttrib = AccessAttrib.SMBNone;
                int          bitIndex     = 0;

                foreach (FieldElement fieldElement in defIndexField.fieldList)
                {
                    switch (fieldElement.Tag)
                    {
                    case FieldElement.TagValue.NamedField:
                        AmlParser.NamedField namedField = fieldElement.GetAsNamedField();
                        Node node = acpiNamespace.LookupNode(
                            new NodePath(false /*isAbsolute*/, 0, new string[] { namedField.nameSeg.data }),
                            currentPath);
                        node.Value = new FieldUnit(indexFieldRegion, bitIndex, namedField.bitWidth,
                                                   accessType, accessAttrib,
                                                   defIndexField.fieldFlags.lockRule,
                                                   defIndexField.fieldFlags.updateRule);
                        bitIndex += namedField.bitWidth;
                        break;

                    case FieldElement.TagValue.ReservedField:
                        AmlParser.ReservedField reservedField = fieldElement.GetAsReservedField();
                        bitIndex += reservedField.bitWidth;
                        break;

                    case FieldElement.TagValue.AccessField:
                        AmlParser.AccessField accessField = fieldElement.GetAsAccessField();
                        accessType   = accessField.accessType;
                        accessAttrib = accessField.accessAttrib;
                        break;

                    default:
                        throw new LoadException("Unhandled alternative in switch over 'FieldElement'");
                    }
                }
            }
Beispiel #2
0
            public override void Visit(AmlParser.DefBankField defBankField)
            {
                Node operationRegionNode = acpiNamespace.LookupNode(defBankField.regionName.nodePath, currentPath);

                CheckObjectType(operationRegionNode.Value, AcpiObjectType.OperationRegion);

                // TODO: BankFields are not used in the test files and appear to involve some kind of
                // "bank selection register". Need to understand this properly to implement it, but for
                // leaving unimplemented. Commented out below is some code to use as a starting point.

                throw new LoadException("BankField unimplemented");

    #if false
                AccessType   accessType   = defBankField.fieldFlags.accessType;
                AccessAttrib accessAttrib = AccessAttrib.SMBNone;
                int          bitIndex     = 0;
                foreach (FieldElement fieldElement in defBankField.fieldList)
                {
                    switch (fieldElement.Tag)
                    {
                    case FieldElement.TagValue.NamedField:
                        AmlParser.NamedField namedField = fieldElement.GetAsNamedField();
                        Node node = acpiNamespace.LookupNode(
                            new NodePath(false /*isAbsolute*/, 0, new string[] { namedField.nameSeg.data }),
                            currentPath);
                        node.Value = new FieldUnit((AcpiObject.OperationRegion)operationRegionNode.Value,
                                                   bitIndex, namedField.bitWidth,
                                                   accessType, accessAttrib,
                                                   defBankField.fieldFlags.lockRule,
                                                   defBankField.fieldFlags.updateRule);
                        bitIndex += namedField.bitWidth;
                        break;

                    case FieldElement.TagValue.ReservedField:
                        AmlParser.ReservedField reservedField = fieldElement.GetAsReservedField();
                        bitIndex += reservedField.bitWidth;
                        break;

                    case FieldElement.TagValue.AccessField:
                        AmlParser.AccessField accessField = fieldElement.GetAsAccessField();
                        accessType   = accessField.accessType;
                        accessAttrib = accessField.accessAttrib;
                        break;

                    default:
                        throw new LoadException("Unhandled alternative in switch over 'FieldElement'");
                    }
                }
    #endif
            }
Beispiel #3
0
            public override void Visit(AmlParser.DefIndexField defIndexField)
            {
                foreach (FieldElement fieldElement in defIndexField.fieldList)
                {
                    switch (fieldElement.Tag)
                    {
                    case FieldElement.TagValue.NamedField:
                        AmlParser.NamedField namedField = fieldElement.GetAsNamedField();
                        Node node = acpiNamespace.CreateNodeAt(
                            new NodePath(false /*isAbsolute*/, 0, new string[] { namedField.nameSeg.data }),
                            currentPath);
                        break;

                    default:
                        break;
                    }
                }
            }
Beispiel #4
0
        // SortedList will be Dictionary<string, FieldUnit> when generics are available
        public static SortedList CreateFromFieldList(OperationRegion operationRegionNode,
                                                     FieldElement[] fieldList,
                                                     AccessType initialAccessType,
                                                     AccessAttrib initialAccessAttrib,
                                                     LockRule lockRule,
                                                     UpdateRule updateRule
                                                     )
        {
            SortedList   result       = new SortedList(); // = new Dictionary<string, FieldUnit>();
            AccessType   accessType   = initialAccessType;
            AccessAttrib accessAttrib = initialAccessAttrib;
            int          bitIndex     = 0;

            foreach (FieldElement fieldElement in fieldList)
            {
                switch (fieldElement.Tag)
                {
                case FieldElement.TagValue.NamedField:
                    AmlParser.NamedField namedField = fieldElement.GetAsNamedField();
                    result.Add(namedField.nameSeg.data,
                               new FieldUnit(operationRegionNode,
                                             bitIndex, namedField.bitWidth,
                                             accessType, accessAttrib, lockRule, updateRule));
                    bitIndex += namedField.bitWidth;
                    break;

                case FieldElement.TagValue.ReservedField:
                    AmlParser.ReservedField reservedField = fieldElement.GetAsReservedField();
                    bitIndex += reservedField.bitWidth;
                    break;

                case FieldElement.TagValue.AccessField:
                    AmlParser.AccessField accessField = fieldElement.GetAsAccessField();
                    accessType   = accessField.accessType;
                    accessAttrib = accessField.accessAttrib;
                    break;

                default:
                    throw new LoadException("Unhandled alternative in switch over 'FieldElement'");
                }
            }

            return(result);
        }
Beispiel #5
0
 public virtual void Visit(AmlParser.NamedField namedField)
 {
     UnhandledNodeType("NamedField");
 }