Message ID | 1345616676-30915-1-git-send-email-feng.tang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2012?08?22? 14:24, Feng Tang wrote: > This patch is on top of the ACPICA 20120816 release, which implemented > a native way to decode PLD buffer, so use it instead of leting upper > level users do the decoding. > > Signed-off-by: Feng Tang <feng.tang@intel.com> > Signed-off-by: Bob Moore <robert.moore@intel.com> > --- > drivers/acpi/utils.c | 11 +++++++---- > include/acpi/acpi_bus.h | 31 +------------------------------ > 2 files changed, 8 insertions(+), 34 deletions(-) > > diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c > index 3e87c9c..e697bf2 100644 > --- a/drivers/acpi/utils.c > +++ b/drivers/acpi/utils.c > @@ -384,7 +384,7 @@ acpi_evaluate_reference(acpi_handle handle, > EXPORT_SYMBOL(acpi_evaluate_reference); > > acpi_status > -acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld) > +acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld) Sorry. I have not found the definition of struct acpi_pld_info or is there something I have missed? > { > acpi_status status; > struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; > @@ -400,13 +400,16 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld) > if (!output || output->type != ACPI_TYPE_PACKAGE > || !output->package.count > || output->package.elements[0].type != ACPI_TYPE_BUFFER > - || output->package.elements[0].buffer.length > sizeof(*pld)) { > + || output->package.elements[0].buffer.length > 16) { > status = AE_TYPE; > goto out; > } > > - memcpy(pld, output->package.elements[0].buffer.pointer, > - output->package.elements[0].buffer.length); > + status = acpi_decode_pld_buffer( > + output->package.elements[0].buffer.pointer, > + output->package.elements[0].buffer.length, > + pld); > + > out: > kfree(buffer.pointer); > return status; > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > index bde976e..0c1fcd4 100644 > --- a/include/acpi/acpi_bus.h > +++ b/include/acpi/acpi_bus.h > @@ -54,37 +54,8 @@ acpi_status > acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, > u32 status_code, struct acpi_buffer *status_buf); > > -struct acpi_pld { > - unsigned int revision:7; /* 0 */ > - unsigned int ignore_colour:1; /* 7 */ > - unsigned int colour:24; /* 8 */ > - unsigned int width:16; /* 32 */ > - unsigned int height:16; /* 48 */ > - unsigned int user_visible:1; /* 64 */ > - unsigned int dock:1; /* 65 */ > - unsigned int lid:1; /* 66 */ > - unsigned int panel:3; /* 67 */ > - unsigned int vertical_pos:2; /* 70 */ > - unsigned int horizontal_pos:2; /* 72 */ > - unsigned int shape:4; /* 74 */ > - unsigned int group_orientation:1; /* 78 */ > - unsigned int group_token:8; /* 79 */ > - unsigned int group_position:8; /* 87 */ > - unsigned int bay:1; /* 95 */ > - unsigned int ejectable:1; /* 96 */ > - unsigned int ospm_eject_required:1; /* 97 */ > - unsigned int cabinet_number:8; /* 98 */ > - unsigned int card_cage_number:8; /* 106 */ > - unsigned int reference:1; /* 114 */ > - unsigned int rotation:4; /* 115 */ > - unsigned int order:5; /* 119 */ > - unsigned int reserved:4; /* 124 */ > - unsigned int vertical_offset:16; /* 128 */ > - unsigned int horizontal_offset:16; /* 144 */ > -} __attribute__((__packed__)); > - > acpi_status > -acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld); > +acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld); > #ifdef CONFIG_ACPI > > #include <linux/proc_fs.h> >
Hi Tianyu, On Wed, 22 Aug 2012 15:05:38 +0800 Lan Tianyu <tianyu.lan@intel.com> wrote: > On 2012?08?22? 14:24, Feng Tang wrote: > > This patch is on top of the ACPICA 20120816 release, which implemented > > a native way to decode PLD buffer, so use it instead of leting upper > > level users do the decoding. > > > > Signed-off-by: Feng Tang <feng.tang@intel.com> > > Signed-off-by: Bob Moore <robert.moore@intel.com> > > --- > > drivers/acpi/utils.c | 11 +++++++---- > > include/acpi/acpi_bus.h | 31 +------------------------------ > > 2 files changed, 8 insertions(+), 34 deletions(-) > > > > diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c > > index 3e87c9c..e697bf2 100644 > > --- a/drivers/acpi/utils.c > > +++ b/drivers/acpi/utils.c > > @@ -384,7 +384,7 @@ acpi_evaluate_reference(acpi_handle handle, > > EXPORT_SYMBOL(acpi_evaluate_reference); > > > > acpi_status > > -acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld) > > +acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld) > Sorry. I have not found the definition of struct acpi_pld_info or is > there something I have missed? The definition is in the ACPICA 20120816 patch sets I just posted to linux-acpi list. Let me copy it here + +/* + * Note: C bitfields are not used for this reason: + * + * "Bitfields are great and easy to read, but unfortunately the C language + * does not specify the layout of bitfields in memory, which means they are + * essentially useless for dealing with packed data in on-disk formats or + * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me, + * this decision was a design error in C. Ritchie could have picked an order + * and stuck with it." Norman Ramsey. + * See http://stackoverflow.com/a/1053662/41661 + */ + +/* + * Formatted _PLD return value. The minimum size is a package containing + * one buffer. + * Revision 1: Buffer is 16 bytes (128 bits) + * Revision 2: Buffer is 20 bytes (160 bits) + * + * Note: This structure is returned from the acpi_decode_pld_buffer + * interface. + */ +struct acpi_pld_info { + u8 revision; + u8 ignore_color; + u32 color; + u16 width; + u16 height; + u8 user_visible; + u8 dock; + u8 lid; + u8 panel; + u8 vertical_position; + u8 horizontal_position; + u8 shape; + u8 group_orientation; + u8 group_token; + u8 group_position; + u8 bay; + u8 ejectable; + u8 ospm_eject_required; + u8 cabinet_number; + u8 card_cage_number; + u8 reference; + u8 rotation; + u8 order; + u8 reserved; + u16 vertical_offset; + u16 horizontal_offset; +}; + +/* -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index 3e87c9c..e697bf2 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c @@ -384,7 +384,7 @@ acpi_evaluate_reference(acpi_handle handle, EXPORT_SYMBOL(acpi_evaluate_reference); acpi_status -acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld) +acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld) { acpi_status status; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; @@ -400,13 +400,16 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld) if (!output || output->type != ACPI_TYPE_PACKAGE || !output->package.count || output->package.elements[0].type != ACPI_TYPE_BUFFER - || output->package.elements[0].buffer.length > sizeof(*pld)) { + || output->package.elements[0].buffer.length > 16) { status = AE_TYPE; goto out; } - memcpy(pld, output->package.elements[0].buffer.pointer, - output->package.elements[0].buffer.length); + status = acpi_decode_pld_buffer( + output->package.elements[0].buffer.pointer, + output->package.elements[0].buffer.length, + pld); + out: kfree(buffer.pointer); return status; diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index bde976e..0c1fcd4 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -54,37 +54,8 @@ acpi_status acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, u32 status_code, struct acpi_buffer *status_buf); -struct acpi_pld { - unsigned int revision:7; /* 0 */ - unsigned int ignore_colour:1; /* 7 */ - unsigned int colour:24; /* 8 */ - unsigned int width:16; /* 32 */ - unsigned int height:16; /* 48 */ - unsigned int user_visible:1; /* 64 */ - unsigned int dock:1; /* 65 */ - unsigned int lid:1; /* 66 */ - unsigned int panel:3; /* 67 */ - unsigned int vertical_pos:2; /* 70 */ - unsigned int horizontal_pos:2; /* 72 */ - unsigned int shape:4; /* 74 */ - unsigned int group_orientation:1; /* 78 */ - unsigned int group_token:8; /* 79 */ - unsigned int group_position:8; /* 87 */ - unsigned int bay:1; /* 95 */ - unsigned int ejectable:1; /* 96 */ - unsigned int ospm_eject_required:1; /* 97 */ - unsigned int cabinet_number:8; /* 98 */ - unsigned int card_cage_number:8; /* 106 */ - unsigned int reference:1; /* 114 */ - unsigned int rotation:4; /* 115 */ - unsigned int order:5; /* 119 */ - unsigned int reserved:4; /* 124 */ - unsigned int vertical_offset:16; /* 128 */ - unsigned int horizontal_offset:16; /* 144 */ -} __attribute__((__packed__)); - acpi_status -acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld); +acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld); #ifdef CONFIG_ACPI #include <linux/proc_fs.h>