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'"); } } }
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 }
// 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); }
public virtual void Visit(AmlParser.ReservedField reservedField) { UnhandledNodeType("ReservedField"); }