* [PATCH 1/2] ACPI / table: Add new function to get table entries
@ 2014-11-26 14:01 Hanjun Guo
2014-11-26 14:01 ` [PATCH 2/2] ACPI / table: Count matched and successfully parsed entries without specifying max entries Hanjun Guo
2014-11-26 22:14 ` [PATCH 1/2] ACPI / table: Add new function to get table entries Rafael J. Wysocki
0 siblings, 2 replies; 6+ messages in thread
From: Hanjun Guo @ 2014-11-26 14:01 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: linux-acpi, linaro-acpi, Ashwin Chaugule, Tomasz Nowicki,
Hanjun Guo
From: Ashwin Chaugule <ashwin.chaugule@linaro.org>
The acpi_table_parse() function has a callback that
passes a pointer to a table_header. Add a new function
which takes this pointer and parses its entries. This
eliminates the need to re-traverse all the tables for
each call. e.g. as in acpi_table_parse_madt() which is
normally called after acpi_table_parse().
Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
---
drivers/acpi/tables.c | 63 +++++++++++++++++++++++++++++++++++----------------
include/linux/acpi.h | 4 ++++
2 files changed, 48 insertions(+), 19 deletions(-)
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index 6d5a6cd..f1debe9 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -190,30 +190,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
}
}
-
int __init
-acpi_table_parse_entries(char *id,
- unsigned long table_size,
- int entry_id,
- acpi_tbl_entry_handler handler,
- unsigned int max_entries)
+acpi_parse_entries(char *id, unsigned long table_size,
+ acpi_tbl_entry_handler handler,
+ struct acpi_table_header *table_header,
+ int entry_id, unsigned int max_entries)
{
- struct acpi_table_header *table_header = NULL;
struct acpi_subtable_header *entry;
- unsigned int count = 0;
+ int count = 0;
unsigned long table_end;
- acpi_size tbl_size;
if (acpi_disabled)
return -ENODEV;
- if (!handler)
+ if (!id || !handler)
return -EINVAL;
- if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
- acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size);
- else
- acpi_get_table_with_size(id, 0, &table_header, &tbl_size);
+ if (!table_size)
+ return -EINVAL;
if (!table_header) {
pr_warn("%4.4s not present\n", id);
@@ -232,7 +226,7 @@ acpi_table_parse_entries(char *id,
if (entry->type == entry_id
&& (!max_entries || count++ < max_entries))
if (handler(entry, table_end))
- goto err;
+ return -EINVAL;
/*
* If entry->length is 0, break from this loop to avoid
@@ -240,22 +234,53 @@ acpi_table_parse_entries(char *id,
*/
if (entry->length == 0) {
pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, entry_id);
- goto err;
+ return -EINVAL;
}
entry = (struct acpi_subtable_header *)
((unsigned long)entry + entry->length);
}
+
if (max_entries && count > max_entries) {
pr_warn("[%4.4s:0x%02x] ignored %i entries of %i found\n",
id, entry_id, count - max_entries, count);
}
- early_acpi_os_unmap_memory((char *)table_header, tbl_size);
return count;
-err:
+}
+
+int __init
+acpi_table_parse_entries(char *id,
+ unsigned long table_size,
+ int entry_id,
+ acpi_tbl_entry_handler handler,
+ unsigned int max_entries)
+{
+ struct acpi_table_header *table_header = NULL;
+ acpi_size tbl_size;
+ int count;
+ u32 instance = 0;
+
+ if (acpi_disabled)
+ return -ENODEV;
+
+ if (!id || !handler)
+ return -EINVAL;
+
+ if (!strncmp(id, ACPI_SIG_MADT, 4))
+ instance = acpi_apic_instance;
+
+ acpi_get_table_with_size(id, instance, &table_header, &tbl_size);
+ if (!table_header) {
+ pr_warn("%4.4s not present\n", id);
+ return -ENODEV;
+ }
+
+ count = acpi_parse_entries(id, table_size, handler, table_header,
+ entry_id, max_entries);
+
early_acpi_os_unmap_memory((char *)table_header, tbl_size);
- return -EINVAL;
+ return count;
}
int __init
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index e09f7f4..d7a5fcf 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -124,6 +124,10 @@ int acpi_numa_init (void);
int acpi_table_init (void);
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
+int __init acpi_parse_entries(char *id, unsigned long table_size,
+ acpi_tbl_entry_handler handler,
+ struct acpi_table_header *table_header,
+ int entry_id, unsigned int max_entries);
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
int entry_id,
acpi_tbl_entry_handler handler,
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] ACPI / table: Count matched and successfully parsed entries without specifying max entries
2014-11-26 14:01 [PATCH 1/2] ACPI / table: Add new function to get table entries Hanjun Guo
@ 2014-11-26 14:01 ` Hanjun Guo
2014-11-26 22:14 ` [PATCH 1/2] ACPI / table: Add new function to get table entries Rafael J. Wysocki
1 sibling, 0 replies; 6+ messages in thread
From: Hanjun Guo @ 2014-11-26 14:01 UTC (permalink / raw)
To: Rafael J. Wysocki; +Cc: linux-acpi, linaro-acpi, Tomasz Nowicki, Hanjun Guo
From: Tomasz Nowicki <tomasz.nowicki@linaro.org>
acpi_parse_entries() allows to traverse all available table entries (aka
subtables) by passing max_entries parameter equal to 0, but since its count
variable is only incremented if max_entries is not 0, the function always
returns 0 for max_entries equal to 0. It would be more useful if it returned
the number of entries matched instead, so make it increment count in that
case too.
Acked-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
---
drivers/acpi/tables.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index f1debe9..93b8152 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -224,10 +224,13 @@ acpi_parse_entries(char *id, unsigned long table_size,
while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
table_end) {
if (entry->type == entry_id
- && (!max_entries || count++ < max_entries))
+ && (!max_entries || count < max_entries)) {
if (handler(entry, table_end))
return -EINVAL;
+ count++;
+ }
+
/*
* If entry->length is 0, break from this loop to avoid
* infinite loop.
--
1.9.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ACPI / table: Add new function to get table entries
2014-11-26 14:01 [PATCH 1/2] ACPI / table: Add new function to get table entries Hanjun Guo
2014-11-26 14:01 ` [PATCH 2/2] ACPI / table: Count matched and successfully parsed entries without specifying max entries Hanjun Guo
@ 2014-11-26 22:14 ` Rafael J. Wysocki
2014-11-27 0:29 ` Hanjun Guo
1 sibling, 1 reply; 6+ messages in thread
From: Rafael J. Wysocki @ 2014-11-26 22:14 UTC (permalink / raw)
To: Hanjun Guo; +Cc: linux-acpi, linaro-acpi, Ashwin Chaugule, Tomasz Nowicki
On Wednesday, November 26, 2014 10:01:13 PM Hanjun Guo wrote:
> From: Ashwin Chaugule <ashwin.chaugule@linaro.org>
>
> The acpi_table_parse() function has a callback that
> passes a pointer to a table_header. Add a new function
> which takes this pointer and parses its entries. This
> eliminates the need to re-traverse all the tables for
> each call. e.g. as in acpi_table_parse_madt() which is
> normally called after acpi_table_parse().
>
> Acked-by: Grant Likely <grant.likely@linaro.org>
> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
> ---
> drivers/acpi/tables.c | 63 +++++++++++++++++++++++++++++++++++----------------
> include/linux/acpi.h | 4 ++++
> 2 files changed, 48 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
> index 6d5a6cd..f1debe9 100644
> --- a/drivers/acpi/tables.c
> +++ b/drivers/acpi/tables.c
> @@ -190,30 +190,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
> }
> }
>
> -
> int __init
> -acpi_table_parse_entries(char *id,
> - unsigned long table_size,
> - int entry_id,
> - acpi_tbl_entry_handler handler,
> - unsigned int max_entries)
> +acpi_parse_entries(char *id, unsigned long table_size,
Why isn't this static? Are you going to use it somewhere else?
> + acpi_tbl_entry_handler handler,
> + struct acpi_table_header *table_header,
> + int entry_id, unsigned int max_entries)
> {
> - struct acpi_table_header *table_header = NULL;
> struct acpi_subtable_header *entry;
> - unsigned int count = 0;
> + int count = 0;
> unsigned long table_end;
> - acpi_size tbl_size;
>
> if (acpi_disabled)
> return -ENODEV;
>
> - if (!handler)
> + if (!id || !handler)
> return -EINVAL;
>
> - if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
> - acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size);
> - else
> - acpi_get_table_with_size(id, 0, &table_header, &tbl_size);
> + if (!table_size)
> + return -EINVAL;
>
> if (!table_header) {
> pr_warn("%4.4s not present\n", id);
> @@ -232,7 +226,7 @@ acpi_table_parse_entries(char *id,
> if (entry->type == entry_id
> && (!max_entries || count++ < max_entries))
> if (handler(entry, table_end))
> - goto err;
> + return -EINVAL;
>
> /*
> * If entry->length is 0, break from this loop to avoid
> @@ -240,22 +234,53 @@ acpi_table_parse_entries(char *id,
> */
> if (entry->length == 0) {
> pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, entry_id);
> - goto err;
> + return -EINVAL;
> }
>
> entry = (struct acpi_subtable_header *)
> ((unsigned long)entry + entry->length);
> }
> +
> if (max_entries && count > max_entries) {
> pr_warn("[%4.4s:0x%02x] ignored %i entries of %i found\n",
> id, entry_id, count - max_entries, count);
> }
>
> - early_acpi_os_unmap_memory((char *)table_header, tbl_size);
> return count;
> -err:
> +}
> +
> +int __init
> +acpi_table_parse_entries(char *id,
> + unsigned long table_size,
> + int entry_id,
> + acpi_tbl_entry_handler handler,
> + unsigned int max_entries)
> +{
> + struct acpi_table_header *table_header = NULL;
> + acpi_size tbl_size;
> + int count;
> + u32 instance = 0;
> +
> + if (acpi_disabled)
> + return -ENODEV;
> +
> + if (!id || !handler)
> + return -EINVAL;
> +
> + if (!strncmp(id, ACPI_SIG_MADT, 4))
> + instance = acpi_apic_instance;
> +
> + acpi_get_table_with_size(id, instance, &table_header, &tbl_size);
> + if (!table_header) {
> + pr_warn("%4.4s not present\n", id);
> + return -ENODEV;
> + }
> +
> + count = acpi_parse_entries(id, table_size, handler, table_header,
> + entry_id, max_entries);
> +
> early_acpi_os_unmap_memory((char *)table_header, tbl_size);
> - return -EINVAL;
> + return count;
> }
>
> int __init
> diff --git a/include/linux/acpi.h b/include/linux/acpi.h
> index e09f7f4..d7a5fcf 100644
> --- a/include/linux/acpi.h
> +++ b/include/linux/acpi.h
> @@ -124,6 +124,10 @@ int acpi_numa_init (void);
>
> int acpi_table_init (void);
> int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
> +int __init acpi_parse_entries(char *id, unsigned long table_size,
> + acpi_tbl_entry_handler handler,
> + struct acpi_table_header *table_header,
> + int entry_id, unsigned int max_entries);
> int __init acpi_table_parse_entries(char *id, unsigned long table_size,
> int entry_id,
> acpi_tbl_entry_handler handler,
>
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ACPI / table: Add new function to get table entries
2014-11-26 22:14 ` [PATCH 1/2] ACPI / table: Add new function to get table entries Rafael J. Wysocki
@ 2014-11-27 0:29 ` Hanjun Guo
2014-11-27 0:54 ` Rafael J. Wysocki
0 siblings, 1 reply; 6+ messages in thread
From: Hanjun Guo @ 2014-11-27 0:29 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: linux-acpi, linaro-acpi, Ashwin Chaugule, Tomasz Nowicki
On 2014-11-27 6:14, Rafael J. Wysocki wrote:
> On Wednesday, November 26, 2014 10:01:13 PM Hanjun Guo wrote:
>> From: Ashwin Chaugule <ashwin.chaugule@linaro.org>
>>
>> The acpi_table_parse() function has a callback that
>> passes a pointer to a table_header. Add a new function
>> which takes this pointer and parses its entries. This
>> eliminates the need to re-traverse all the tables for
>> each call. e.g. as in acpi_table_parse_madt() which is
>> normally called after acpi_table_parse().
>>
>> Acked-by: Grant Likely <grant.likely@linaro.org>
>> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
>> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
>> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
>> ---
>> drivers/acpi/tables.c | 63 +++++++++++++++++++++++++++++++++++----------------
>> include/linux/acpi.h | 4 ++++
>> 2 files changed, 48 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
>> index 6d5a6cd..f1debe9 100644
>> --- a/drivers/acpi/tables.c
>> +++ b/drivers/acpi/tables.c
>> @@ -190,30 +190,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
>> }
>> }
>>
>> -
>> int __init
>> -acpi_table_parse_entries(char *id,
>> - unsigned long table_size,
>> - int entry_id,
>> - acpi_tbl_entry_handler handler,
>> - unsigned int max_entries)
>> +acpi_parse_entries(char *id, unsigned long table_size,
>
> Why isn't this static? Are you going to use it somewhere else?
Yes, we will use it in the following patches to parse
entries in static ACPI tables.
Thanks
Hanjun
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ACPI / table: Add new function to get table entries
2014-11-27 0:29 ` Hanjun Guo
@ 2014-11-27 0:54 ` Rafael J. Wysocki
2014-12-03 2:27 ` Rafael J. Wysocki
0 siblings, 1 reply; 6+ messages in thread
From: Rafael J. Wysocki @ 2014-11-27 0:54 UTC (permalink / raw)
To: Hanjun Guo; +Cc: linux-acpi, linaro-acpi, Ashwin Chaugule, Tomasz Nowicki
On Thursday, November 27, 2014 08:29:34 AM Hanjun Guo wrote:
> On 2014-11-27 6:14, Rafael J. Wysocki wrote:
> > On Wednesday, November 26, 2014 10:01:13 PM Hanjun Guo wrote:
> >> From: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> >>
> >> The acpi_table_parse() function has a callback that
> >> passes a pointer to a table_header. Add a new function
> >> which takes this pointer and parses its entries. This
> >> eliminates the need to re-traverse all the tables for
> >> each call. e.g. as in acpi_table_parse_madt() which is
> >> normally called after acpi_table_parse().
> >>
> >> Acked-by: Grant Likely <grant.likely@linaro.org>
> >> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
> >> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
> >> ---
> >> drivers/acpi/tables.c | 63 +++++++++++++++++++++++++++++++++++----------------
> >> include/linux/acpi.h | 4 ++++
> >> 2 files changed, 48 insertions(+), 19 deletions(-)
> >>
> >> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
> >> index 6d5a6cd..f1debe9 100644
> >> --- a/drivers/acpi/tables.c
> >> +++ b/drivers/acpi/tables.c
> >> @@ -190,30 +190,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
> >> }
> >> }
> >>
> >> -
> >> int __init
> >> -acpi_table_parse_entries(char *id,
> >> - unsigned long table_size,
> >> - int entry_id,
> >> - acpi_tbl_entry_handler handler,
> >> - unsigned int max_entries)
> >> +acpi_parse_entries(char *id, unsigned long table_size,
> >
> > Why isn't this static? Are you going to use it somewhere else?
>
> Yes, we will use it in the following patches to parse
> entries in static ACPI tables.
OK, thanks!
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ACPI / table: Add new function to get table entries
2014-11-27 0:54 ` Rafael J. Wysocki
@ 2014-12-03 2:27 ` Rafael J. Wysocki
0 siblings, 0 replies; 6+ messages in thread
From: Rafael J. Wysocki @ 2014-12-03 2:27 UTC (permalink / raw)
To: Hanjun Guo; +Cc: linux-acpi, linaro-acpi, Ashwin Chaugule, Tomasz Nowicki
On Thursday, November 27, 2014 01:54:37 AM Rafael J. Wysocki wrote:
> On Thursday, November 27, 2014 08:29:34 AM Hanjun Guo wrote:
> > On 2014-11-27 6:14, Rafael J. Wysocki wrote:
> > > On Wednesday, November 26, 2014 10:01:13 PM Hanjun Guo wrote:
> > >> From: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > >>
> > >> The acpi_table_parse() function has a callback that
> > >> passes a pointer to a table_header. Add a new function
> > >> which takes this pointer and parses its entries. This
> > >> eliminates the need to re-traverse all the tables for
> > >> each call. e.g. as in acpi_table_parse_madt() which is
> > >> normally called after acpi_table_parse().
> > >>
> > >> Acked-by: Grant Likely <grant.likely@linaro.org>
> > >> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> > >> Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
> > >> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
> > >> ---
> > >> drivers/acpi/tables.c | 63 +++++++++++++++++++++++++++++++++++----------------
> > >> include/linux/acpi.h | 4 ++++
> > >> 2 files changed, 48 insertions(+), 19 deletions(-)
> > >>
> > >> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
> > >> index 6d5a6cd..f1debe9 100644
> > >> --- a/drivers/acpi/tables.c
> > >> +++ b/drivers/acpi/tables.c
> > >> @@ -190,30 +190,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
> > >> }
> > >> }
> > >>
> > >> -
> > >> int __init
> > >> -acpi_table_parse_entries(char *id,
> > >> - unsigned long table_size,
> > >> - int entry_id,
> > >> - acpi_tbl_entry_handler handler,
> > >> - unsigned int max_entries)
> > >> +acpi_parse_entries(char *id, unsigned long table_size,
> > >
> > > Why isn't this static? Are you going to use it somewhere else?
> >
> > Yes, we will use it in the following patches to parse
> > entries in static ACPI tables.
>
> OK, thanks!
Both queued up for 3.19-rc1, thanks!
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-12-03 2:05 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-26 14:01 [PATCH 1/2] ACPI / table: Add new function to get table entries Hanjun Guo
2014-11-26 14:01 ` [PATCH 2/2] ACPI / table: Count matched and successfully parsed entries without specifying max entries Hanjun Guo
2014-11-26 22:14 ` [PATCH 1/2] ACPI / table: Add new function to get table entries Rafael J. Wysocki
2014-11-27 0:29 ` Hanjun Guo
2014-11-27 0:54 ` Rafael J. Wysocki
2014-12-03 2:27 ` Rafael J. Wysocki
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.