⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aslrestype1.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
 ******************************************************************************/ASL_RESOURCE_NODE *RsDoIoDescriptor (    ACPI_PARSE_OBJECT       *Op,    UINT32                  CurrentByteOffset){    AML_RESOURCE            *Descriptor;    ACPI_PARSE_OBJECT       *InitializerOp;    ASL_RESOURCE_NODE       *Rnode;    UINT32                  i;    InitializerOp = Op->Asl.Child;    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IO));    Descriptor = Rnode->Buffer;    Descriptor->Io.DescriptorType  = ACPI_RESOURCE_NAME_IO |                                      ASL_RDESC_IO_SIZE;    /* Process all child initialization nodes */    for (i = 0; InitializerOp; i++)    {        switch (i)        {        case 0: /* Decode size */            RsSetFlagBits (&Descriptor->Io.Flags, InitializerOp, 0, 1);            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Flags), 0);            break;        case 1:  /* Min Address */            Descriptor->Io.Minimum =                (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum));            break;        case 2: /* Max Address */            Descriptor->Io.Maximum =                (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum));            break;        case 3: /* Alignment */            Descriptor->Io.Alignment =                (UINT8) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Alignment));            break;        case 4: /* Length */            Descriptor->Io.AddressLength =                (UINT8) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.AddressLength));            break;        case 5: /* Name */            UtAttachNamepathToOwner (Op, InitializerOp);            break;        default:            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);            break;        }        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);    }    return (Rnode);}/******************************************************************************* * * FUNCTION:    RsDoIrqDescriptor * * PARAMETERS:  Op                  - Parent resource descriptor parse node *              CurrentByteOffset   - Offset into the resource template AML *                                    buffer (to track references to the desc) * * RETURN:      Completed resource node * * DESCRIPTION: Construct a short "IRQ" descriptor * ******************************************************************************/ASL_RESOURCE_NODE *RsDoIrqDescriptor (    ACPI_PARSE_OBJECT       *Op,    UINT32                  CurrentByteOffset){    AML_RESOURCE            *Descriptor;    ACPI_PARSE_OBJECT       *InitializerOp;    ASL_RESOURCE_NODE       *Rnode;    UINT32                  Interrupts = 0;    UINT16                  IrqMask = 0;    UINT32                  i;    InitializerOp = Op->Asl.Child;    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ));    /* Length = 3 (with flag byte) */    Descriptor = Rnode->Buffer;    Descriptor->Irq.DescriptorType  = ACPI_RESOURCE_NAME_IRQ |                                      (ASL_RDESC_IRQ_SIZE + 0x01);    /* Process all child initialization nodes */    for (i = 0; InitializerOp; i++)    {        switch (i)        {        case 0: /* Interrupt Type (or Mode - edge/level) */            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 0, 1);            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 0);            break;        case 1: /* Interrupt Level (or Polarity - Active high/low) */            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 3, 0);            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 3);            break;        case 2: /* Share Type - Default: exclusive (0) */            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 4, 0);            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 4);            break;        case 3: /* Name */            UtAttachNamepathToOwner (Op, InitializerOp);            break;        default:            /* All IRQ bytes are handled here, after the flags and name */            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)            {                /* Up to 16 interrupts can be specified in the list */                Interrupts++;                if (Interrupts > 16)                {                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,                        InitializerOp, NULL);                    return (Rnode);                }                /* Only interrupts 0-15 are allowed (mask is 16 bits) */                if (InitializerOp->Asl.Value.Integer > 15)                {                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,                        InitializerOp, NULL);                }                else                {                    IrqMask |= (1 << (UINT8) InitializerOp->Asl.Value.Integer);                }            }            /* Case 4: First IRQ value in list */            if (i == 4)            {                /* Check now for duplicates in list */                RsCheckListForDuplicates (InitializerOp);                /* Create a named field at the start of the list */                RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,                    CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));            }            break;        }        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);    }    /* Now we can set the channel mask */    Descriptor->Irq.IrqMask = IrqMask;    return (Rnode);}/******************************************************************************* * * FUNCTION:    RsDoIrqNoFlagsDescriptor * * PARAMETERS:  Op                  - Parent resource descriptor parse node *              CurrentByteOffset   - Offset into the resource template AML *                                    buffer (to track references to the desc) * * RETURN:      Completed resource node * * DESCRIPTION: Construct a short "IRQNoFlags" descriptor * ******************************************************************************/ASL_RESOURCE_NODE *RsDoIrqNoFlagsDescriptor (    ACPI_PARSE_OBJECT       *Op,    UINT32                  CurrentByteOffset){    AML_RESOURCE            *Descriptor;    ACPI_PARSE_OBJECT       *InitializerOp;    ASL_RESOURCE_NODE       *Rnode;    UINT16                  IrqMask = 0;    UINT32                  Interrupts = 0;    UINT32                  i;    InitializerOp = Op->Asl.Child;    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ_NOFLAGS));    Descriptor = Rnode->Buffer;    Descriptor->Irq.DescriptorType  = ACPI_RESOURCE_NAME_IRQ |                                      ASL_RDESC_IRQ_SIZE;    /* Process all child initialization nodes */    for (i = 0; InitializerOp; i++)    {        switch (i)        {        case 0: /* Name */            UtAttachNamepathToOwner (Op, InitializerOp);            break;        default:            /* IRQ bytes are handled here, after the flags and name */            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)            {                /* Up to 16 interrupts can be specified in the list */                Interrupts++;                if (Interrupts > 16)                {                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,                        InitializerOp, NULL);                    return (Rnode);                }                /* Only interrupts 0-15 are allowed (mask is 16 bits) */                if (InitializerOp->Asl.Value.Integer > 15)                {                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,                        InitializerOp, NULL);                }                else                {                    IrqMask |= (1 << ((UINT8) InitializerOp->Asl.Value.Integer));                }            }            /* Case 1: First IRQ value in list */            if (i == 1)            {                /* Check now for duplicates in list */                RsCheckListForDuplicates (InitializerOp);                /* Create a named field at the start of the list */                RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,                    CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));            }            break;        }        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);    }    /* Now we can set the interrupt mask */    Descriptor->Irq.IrqMask = IrqMask;    return (Rnode);}/******************************************************************************* * * FUNCTION:    RsDoMemory24Descriptor * * PARAMETERS:  Op                  - Parent resource descriptor parse node *              CurrentByteOffset   - Offset into the resource template AML *                                    buffer (to track references to the desc) * * RETURN:      Completed resource node * * DESCRIPTION: Construct a short "Memory24" descriptor * ******************************************************************************/ASL_RESOURCE_NODE *RsDoMemory24Descriptor (    ACPI_PARSE_OBJECT       *Op,    UINT32                  CurrentByteOffset){    AML_RESOURCE            *Descriptor;    ACPI_PARSE_OBJECT       *InitializerOp;    ASL_RESOURCE_NODE       *Rnode;    UINT32                  i;    InitializerOp = Op->Asl.Child;    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24));    Descriptor = Rnode->Buffer;    Descriptor->Memory24.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY24;    Descriptor->Memory24.ResourceLength = 9;    /* Process all child initialization nodes */    for (i = 0; InitializerOp; i++)    {        switch (i)        {        case 0: /* Read/Write type */            RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1);            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0);            break;        case 1: /* Min Address */            Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));            break;        case 2: /* Max Address */            Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));            break;        case 3: /* Alignment */            Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));            break;        case 4: /* Length */            Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));            break;        case 5: /* Name */            UtAttachNamepathToOwner (Op, InitializerOp);            break;        default:            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);            break;        }        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);    }    return (Rnode);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -