+/*******************************************************************************
+ *
+ * FUNCTION: acpi_rs_generic_register_resource
+ *
+ * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
+ * stream
+ * bytes_consumed - Pointer to where the number of bytes
+ * consumed the byte_stream_buffer is
+ * returned
+ * output_buffer - Pointer to the return data buffer
+ * structure_size - Pointer to where the number of bytes
+ * in the return data struct is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Take the resource byte stream and fill out the appropriate
+ * structure pointed to by the output_buffer. Return the
+ * number of bytes consumed from the byte stream.
+ *
+ ******************************************************************************/
+acpi_status
+acpi_rs_generic_register_resource(u8 * byte_stream_buffer,
+ acpi_size * bytes_consumed,
+ u8 ** output_buffer,
+ acpi_size * structure_size)
+{
+ u8 *buffer = byte_stream_buffer;
+ struct acpi_resource *output_struct = (void *)*output_buffer;
+ u16 temp16;
+ u8 temp8;
+ acpi_size struct_size =
+ ACPI_SIZEOF_RESOURCE(struct acpi_resource_generic_reg);
+
+ ACPI_FUNCTION_TRACE("rs_generic_register_resource");
+
+ /* Byte 0 is the Descriptor Type */
+
+ buffer += 1;
+
+ /* Get the Descriptor Length field (Bytes 1-2) */
+
+ ACPI_MOVE_16_TO_16(&temp16, buffer);
+ buffer += 2;
+
+ /* Validate the descriptor length */
+
+ if (temp16 != 12) {
+ return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
+ }
+
+ /* The number of bytes consumed is fixed (12 + 3) */
+
+ *bytes_consumed = 15;
+
+ /* Fill out the structure */
+
+ output_struct->type = ACPI_RSTYPE_GENERIC_REG;
+
+ /* Get space_id (Byte 3) */
+
+ temp8 = *buffer;
+ output_struct->data.generic_reg.space_id = temp8;
+ buffer += 1;
+
+ /* Get register_bit_width (Byte 4) */
+
+ temp8 = *buffer;
+ output_struct->data.generic_reg.bit_width = temp8;
+ buffer += 1;
+
+ /* Get register_bit_offset (Byte 5) */
+
+ temp8 = *buffer;
+ output_struct->data.generic_reg.bit_offset = temp8;
+ buffer += 1;
+
+ /* Get address_size (Byte 6) */
+
+ temp8 = *buffer;
+ output_struct->data.generic_reg.address_size = temp8;
+ buffer += 1;
+
+ /* Get register_address (Bytes 7-14) */
+
+ ACPI_MOVE_64_TO_64(&output_struct->data.generic_reg.address, buffer);
+
+ /* Set the Length parameter */
+
+ output_struct->length = (u32) struct_size;
+
+ /* Return the final size of the structure */
+
+ *structure_size = struct_size;
+ return_ACPI_STATUS(AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_rs_generic_register_stream
+ *
+ * PARAMETERS: Resource - Pointer to the resource linked list
+ * output_buffer - Pointer to the user's return buffer
+ * bytes_consumed - Pointer to where the number of bytes
+ * used in the output_buffer is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Take the linked list resource structure and fills in the
+ * the appropriate bytes in a byte stream
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_rs_generic_register_stream(struct acpi_resource *resource,
+ u8 ** output_buffer, acpi_size * bytes_consumed)
+{
+ u8 *buffer = *output_buffer;
+ u16 temp16;
+
+ ACPI_FUNCTION_TRACE("rs_generic_register_stream");
+
+ /* Set the Descriptor Type (Byte 0) */
+
+ *buffer = ACPI_RDESC_TYPE_GENERIC_REGISTER;
+ buffer += 1;
+
+ /* Set the Descriptor Length (Bytes 1-2) */
+
+ temp16 = 12;
+ ACPI_MOVE_16_TO_16(buffer, &temp16);
+ buffer += 2;
+
+ /* Set space_id (Byte 3) */
+
+ *buffer = (u8) resource->data.generic_reg.space_id;
+ buffer += 1;
+
+ /* Set register_bit_width (Byte 4) */
+
+ *buffer = (u8) resource->data.generic_reg.bit_width;
+ buffer += 1;
+
+ /* Set register_bit_offset (Byte 5) */
+
+ *buffer = (u8) resource->data.generic_reg.bit_offset;
+ buffer += 1;
+
+ /* Set address_size (Byte 6) */
+
+ *buffer = (u8) resource->data.generic_reg.address_size;
+ buffer += 1;
+
+ /* Set register_address (Bytes 7-14) */
+
+ ACPI_MOVE_64_TO_64(buffer, &resource->data.generic_reg.address);
+ buffer += 8;
+
+ /* Return the number of bytes consumed in this operation */
+
+ *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
+ return_ACPI_STATUS(AE_OK);
+}
+