Commit 36de884a authored by Igor Mammedov's avatar Igor Mammedov Committed by Michael S. Tsirkin
Browse files

acpi: extend aml_field() to support LockRule

parent dabad78b
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -952,11 +952,14 @@ Aml *aml_reserved_field(unsigned length)
}

/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefField */
Aml *aml_field(const char *name, AmlAccessType type, AmlUpdateRule rule)
Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock,
               AmlUpdateRule rule)
{
    Aml *var = aml_bundle(0x81 /* FieldOp */, AML_EXT_PACKAGE);
    uint8_t flags = rule << 5 | type;

    flags |= lock << 4; /* LockRule at 4 bit offset */

    build_append_namestring(var->buf, "%s", name);
    build_append_byte(var->buf, flags);
    return var;
+5 −5
Original line number Diff line number Diff line
@@ -1130,7 +1130,7 @@ build_ssdt(GArray *table_data, GArray *linker,

        aml_append(dev, aml_operation_region("PEOR", AML_SYSTEM_IO,
                                              misc->pvpanic_port, 1));
        field = aml_field("PEOR", AML_BYTE_ACC, AML_PRESERVE);
        field = aml_field("PEOR", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE);
        aml_append(field, aml_named_field("PEPT", 8));
        aml_append(dev, field);

@@ -1170,7 +1170,7 @@ build_ssdt(GArray *table_data, GArray *linker,
        /* declare CPU hotplug MMIO region and PRS field to access it */
        aml_append(sb_scope, aml_operation_region(
            "PRST", AML_SYSTEM_IO, pm->cpu_hp_io_base, pm->cpu_hp_io_len));
        field = aml_field("PRST", AML_BYTE_ACC, AML_PRESERVE);
        field = aml_field("PRST", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE);
        aml_append(field, aml_named_field("PRS", 256));
        aml_append(sb_scope, field);

@@ -1245,7 +1245,7 @@ build_ssdt(GArray *table_data, GArray *linker,
        );

        field = aml_field(stringify(MEMORY_HOTPLUG_IO_REGION), AML_DWORD_ACC,
                          AML_PRESERVE);
                          AML_NOLOCK, AML_PRESERVE);
        aml_append(field, /* read only */
            aml_named_field(stringify(MEMORY_SLOT_ADDR_LOW), 32));
        aml_append(field, /* read only */
@@ -1259,7 +1259,7 @@ build_ssdt(GArray *table_data, GArray *linker,
        aml_append(scope, field);

        field = aml_field(stringify(MEMORY_HOTPLUG_IO_REGION), AML_BYTE_ACC,
                          AML_WRITE_AS_ZEROS);
                          AML_NOLOCK, AML_WRITE_AS_ZEROS);
        aml_append(field, aml_reserved_field(160 /* bits, Offset(20) */));
        aml_append(field, /* 1 if enabled, read only */
            aml_named_field(stringify(MEMORY_SLOT_ENABLED), 1));
@@ -1275,7 +1275,7 @@ build_ssdt(GArray *table_data, GArray *linker,
        aml_append(scope, field);

        field = aml_field(stringify(MEMORY_HOTPLUG_IO_REGION), AML_DWORD_ACC,
                          AML_PRESERVE);
                          AML_NOLOCK, AML_PRESERVE);
        aml_append(field, /* DIMM selector, write only */
            aml_named_field(stringify(MEMORY_SLOT_SLECTOR), 32));
        aml_append(field, /* _OST event code, write only */
+7 −1
Original line number Diff line number Diff line
@@ -48,6 +48,11 @@ typedef enum {
    AML_BUFFER_ACC = 5,
} AmlAccessType;

typedef enum {
    AML_NOLOCK = 0,
    AML_LOCK = 1,
} AmlLockRule;

typedef enum {
    AML_PRESERVE = 0,
    AML_WRITE_AS_ONES = 1,
@@ -310,7 +315,8 @@ Aml *aml_while(Aml *predicate);
Aml *aml_package(uint8_t num_elements);
Aml *aml_buffer(int buffer_size, uint8_t *byte_list);
Aml *aml_resource_template(void);
Aml *aml_field(const char *name, AmlAccessType type, AmlUpdateRule rule);
Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock,
               AmlUpdateRule rule);
Aml *aml_mutex(const char *name, uint8_t sync_level);
Aml *aml_acquire(Aml *mutex, uint16_t timeout);
Aml *aml_release(Aml *mutex);