[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] acpi/table: Introduce acpi_table_get_entry_madt to get specified entry



commit c86fcdfb9983b2d794fdde5f11141fedf82578b8
Author:     Shannon Zhao <zhaoshenglong@xxxxxxxxxx>
AuthorDate: Wed Mar 2 08:35:00 2016 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Mar 3 09:06:24 2016 +0100

    acpi/table: Introduce acpi_table_get_entry_madt to get specified entry
    
    This function could get the specified index entry of MADT table. This
    would be useful when it needs to get the contens of the entry.
    
    Signed-off-by: Shannon Zhao <shannon.zhao@xxxxxxxxxx>
    Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
 xen/drivers/acpi/tables.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++
 xen/include/xen/acpi.h    |  2 ++
 2 files changed, 61 insertions(+)

diff --git a/xen/drivers/acpi/tables.c b/xen/drivers/acpi/tables.c
index 56fa71b..dd2031f 100644
--- a/xen/drivers/acpi/tables.c
+++ b/xen/drivers/acpi/tables.c
@@ -223,6 +223,65 @@ void __init acpi_table_print_madt_entry(struct 
acpi_subtable_header *header)
        }
 }
 
+static struct acpi_subtable_header * __init
+acpi_get_entry(const char *id, unsigned long table_size,
+              const struct acpi_table_header *table_header,
+              enum acpi_madt_type entry_id, unsigned int entry_index)
+{
+       struct acpi_subtable_header *entry;
+       int count = 0;
+       unsigned long table_end;
+
+       if (!table_size)
+               return NULL;
+
+       if (!table_header) {
+               printk(KERN_WARNING PREFIX "%4.4s not present\n", id);
+               return NULL;
+       }
+
+       table_end = (unsigned long)table_header + table_header->length;
+
+       /* Parse all entries looking for a match. */
+       entry = (void *)table_header + table_size;
+
+       while ((unsigned long)(entry + 1) < table_end) {
+               if (entry->length < sizeof(*entry)) {
+                       printk(KERN_ERR PREFIX "[%4.4s:%#x] Invalid length\n",
+                              id, entry_id);
+                       return NULL;
+               }
+
+               if (entry->type == entry_id) {
+                       if (count == entry_index)
+                               return entry;
+                       count++;
+               }
+
+               entry = (void *)entry + entry->length;
+       }
+
+       return NULL;
+}
+
+struct acpi_subtable_header * __init
+acpi_table_get_entry_madt(enum acpi_madt_type entry_id,
+                         unsigned int entry_index)
+{
+       struct acpi_table_header *table_header;
+       acpi_status status;
+
+       status = acpi_get_table(ACPI_SIG_MADT, acpi_apic_instance,
+                               &table_header);
+       if (ACPI_FAILURE(status)) {
+               printk(KERN_WARNING PREFIX "%4.4s not present\n",
+                      ACPI_SIG_MADT);
+               return NULL;
+       }
+
+       return acpi_get_entry(ACPI_SIG_MADT, sizeof(struct acpi_table_madt),
+                             table_header, entry_id, entry_index);
+}
 
 int __init
 acpi_parse_entries(char *id, unsigned long table_size,
diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h
index 31a6918..7a5abbe 100644
--- a/xen/include/xen/acpi.h
+++ b/xen/include/xen/acpi.h
@@ -80,6 +80,8 @@ int acpi_parse_entries(char *id, unsigned long table_size,
                       int entry_id, unsigned int max_entries);
 int acpi_table_parse_entries(char *id, unsigned long table_size,
        int entry_id, acpi_table_entry_handler handler, unsigned int 
max_entries);
+struct acpi_subtable_header *acpi_table_get_entry_madt(enum acpi_madt_type id,
+                                                     unsigned int entry_index);
 int acpi_table_parse_madt(enum acpi_madt_type id, acpi_table_entry_handler 
handler, unsigned int max_entries);
 int acpi_table_parse_srat(int id, acpi_madt_entry_handler handler,
        unsigned int max_entries);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.