1 /*******************************************************************************
3 * Module Name: rsaddr - Address resource descriptors (16/32/64)
6 ******************************************************************************/
9 * Copyright (C) 2000, 2001 R. Byron Moore
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #define _COMPONENT ACPI_RESOURCES
31 MODULE_NAME ("rsaddr")
34 /*******************************************************************************
36 * FUNCTION: Acpi_rs_address16_resource
38 * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte
40 * Bytes_consumed - u32 pointer that is filled with
41 * the number of bytes consumed from
42 * the Byte_stream_buffer
43 * Output_buffer - Pointer to the user's return buffer
44 * Structure_size - u32 pointer that is filled with
45 * the number of bytes in the filled
50 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
51 * structure pointed to by the Output_buffer. Return the
52 * number of bytes consumed from the byte stream.
54 ******************************************************************************/
57 acpi_rs_address16_resource (
58 u8 *byte_stream_buffer,
63 u8 *buffer = byte_stream_buffer;
64 acpi_resource *output_struct = (acpi_resource *) *output_buffer;
65 NATIVE_CHAR *temp_ptr;
66 u32 struct_size = SIZEOF_RESOURCE (acpi_resource_address16);
72 FUNCTION_TRACE ("Rs_address16_resource");
75 * Point past the Descriptor to get the number of bytes consumed
78 MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
80 *bytes_consumed = temp16 + 3;
81 output_struct->id = ACPI_RSTYPE_ADDRESS16;
84 * Get the Resource Type (Byte3)
89 /* Values 0-2 are valid */
91 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
94 output_struct->data.address16.resource_type = temp8 & 0x03;
97 * Get the General Flags (Byte4)
103 * Producer / Consumer
105 output_struct->data.address16.producer_consumer = temp8 & 0x01;
110 output_struct->data.address16.decode = (temp8 >> 1) & 0x01;
115 output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01;
120 output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01;
123 * Get the Type Specific Flags (Byte5)
128 if (MEMORY_RANGE == output_struct->data.address16.resource_type) {
129 output_struct->data.address16.attribute.memory.read_write_attribute =
130 (u16) (temp8 & 0x01);
131 output_struct->data.address16.attribute.memory.cache_attribute =
132 (u16) ((temp8 >> 1) & 0x0F);
136 if (IO_RANGE == output_struct->data.address16.resource_type) {
137 output_struct->data.address16.attribute.io.range_attribute =
138 (u16) (temp8 & 0x03);
142 /* BUS_NUMBER_RANGE == Address16.Data->Resource_type */
143 /* Nothing needs to be filled in */
148 * Get Granularity (Bytes 6-7)
151 MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.granularity,
155 * Get Min_address_range (Bytes 8-9)
158 MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.min_address_range,
162 * Get Max_address_range (Bytes 10-11)
165 MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.max_address_range,
169 * Get Address_translation_offset (Bytes 12-13)
172 MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.address_translation_offset,
176 * Get Address_length (Bytes 14-15)
179 MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.address_length,
183 * Resource Source Index (if present)
188 * This will leave us pointing to the Resource Source Index
189 * If it is present, then save it off and calculate the
190 * pointer to where the null terminated string goes:
191 * Each Interrupt takes 32-bits + the 5 bytes of the
192 * stream that are default.
194 if (*bytes_consumed > 16) {
195 /* Dereference the Index */
198 output_struct->data.address16.resource_source.index = (u32) temp8;
200 /* Point to the String */
204 /* Point the String pointer to the end of this structure */
206 output_struct->data.address16.resource_source.string_ptr =
207 (NATIVE_CHAR *)((u8 * )output_struct + struct_size);
209 temp_ptr = output_struct->data.address16.resource_source.string_ptr;
211 /* Copy the string into the buffer */
215 while (0x00 != *buffer) {
224 * Add the terminating null
228 output_struct->data.address16.resource_source.string_length = index + 1;
231 * In order for the Struct_size to fall on a 32-bit boundary,
232 * calculate the length of the string and expand the
233 * Struct_size to the next 32-bit boundary.
235 temp8 = (u8) (index + 1);
236 struct_size += ROUND_UP_TO_32_bITS (temp8);
240 output_struct->data.address16.resource_source.index = 0x00;
241 output_struct->data.address16.resource_source.string_length = 0;
242 output_struct->data.address16.resource_source.string_ptr = NULL;
246 * Set the Length parameter
248 output_struct->length = struct_size;
251 * Return the final size of the structure
253 *structure_size = struct_size;
254 return_ACPI_STATUS (AE_OK);
258 /*******************************************************************************
260 * FUNCTION: Acpi_rs_address16_stream
262 * PARAMETERS: Linked_list - Pointer to the resource linked list
263 * Output_buffer - Pointer to the user's return buffer
264 * Bytes_consumed - u32 pointer that is filled with
265 * the number of bytes of the
270 * DESCRIPTION: Take the linked list resource structure and fills in the
271 * the appropriate bytes in a byte stream
273 ******************************************************************************/
276 acpi_rs_address16_stream (
277 acpi_resource *linked_list,
281 u8 *buffer = *output_buffer;
284 NATIVE_CHAR *temp_pointer = NULL;
288 FUNCTION_TRACE ("Rs_address16_stream");
292 * The descriptor field is static
298 * Save a pointer to the Length field - to be filled in later
300 length_field = buffer;
304 * Set the Resource Type (Memory, Io, Bus_number)
306 temp8 = (u8) (linked_list->data.address16.resource_type & 0x03);
311 * Set the general flags
313 temp8 = (u8) (linked_list->data.address16.producer_consumer & 0x01);
315 temp8 |= (linked_list->data.address16.decode & 0x01) << 1;
316 temp8 |= (linked_list->data.address16.min_address_fixed & 0x01) << 2;
317 temp8 |= (linked_list->data.address16.max_address_fixed & 0x01) << 3;
323 * Set the type specific flags
327 if (MEMORY_RANGE == linked_list->data.address16.resource_type) {
329 (linked_list->data.address16.attribute.memory.read_write_attribute &
333 (linked_list->data.address16.attribute.memory.cache_attribute &
337 else if (IO_RANGE == linked_list->data.address16.resource_type) {
339 (linked_list->data.address16.attribute.io.range_attribute &
347 * Set the address space granularity
349 MOVE_UNALIGNED16_TO_16 (buffer,
350 &linked_list->data.address16.granularity);
354 * Set the address range minimum
356 MOVE_UNALIGNED16_TO_16 (buffer,
357 &linked_list->data.address16.min_address_range);
361 * Set the address range maximum
363 MOVE_UNALIGNED16_TO_16 (buffer,
364 &linked_list->data.address16.max_address_range);
368 * Set the address translation offset
370 MOVE_UNALIGNED16_TO_16 (buffer,
371 &linked_list->data.address16.address_translation_offset);
375 * Set the address length
377 MOVE_UNALIGNED16_TO_16 (buffer,
378 &linked_list->data.address16.address_length);
382 * Resource Source Index and Resource Source are optional
384 if (0 != linked_list->data.address16.resource_source.string_length) {
385 temp8 = (u8) linked_list->data.address16.resource_source.index;
390 temp_pointer = (NATIVE_CHAR *) buffer;
395 STRCPY (temp_pointer,
396 linked_list->data.address16.resource_source.string_ptr);
399 * Buffer needs to be set to the length of the sting + one for the
402 buffer += (STRLEN (linked_list->data.address16.resource_source.string_ptr)
407 * Return the number of bytes consumed in this operation
409 actual_bytes = POINTER_DIFF (buffer, *output_buffer);
410 *bytes_consumed = actual_bytes;
413 * Set the length field to the number of bytes consumed
414 * minus the header size (3 bytes)
417 MOVE_UNALIGNED16_TO_16 (length_field, &actual_bytes);
418 return_ACPI_STATUS (AE_OK);
422 /*******************************************************************************
424 * FUNCTION: Acpi_rs_address32_resource
426 * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte
428 * Bytes_consumed - u32 pointer that is filled with
429 * the number of bytes consumed from
430 * the Byte_stream_buffer
431 * Output_buffer - Pointer to the user's return buffer
432 * Structure_size - u32 pointer that is filled with
433 * the number of bytes in the filled
438 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
439 * structure pointed to by the Output_buffer. Return the
440 * number of bytes consumed from the byte stream.
442 ******************************************************************************/
445 acpi_rs_address32_resource (
446 u8 *byte_stream_buffer,
452 acpi_resource *output_struct;
455 NATIVE_CHAR *temp_ptr;
460 FUNCTION_TRACE ("Rs_address32_resource");
463 buffer = byte_stream_buffer;
464 output_struct = (acpi_resource *) *output_buffer;
466 struct_size = SIZEOF_RESOURCE (acpi_resource_address32);
469 * Point past the Descriptor to get the number of bytes consumed
472 MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
474 *bytes_consumed = temp16 + 3;
476 output_struct->id = ACPI_RSTYPE_ADDRESS32;
479 * Get the Resource Type (Byte3)
484 /* Values 0-2 are valid */
486 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
489 output_struct->data.address32.resource_type = temp8 & 0x03;
492 * Get the General Flags (Byte4)
498 * Producer / Consumer
500 output_struct->data.address32.producer_consumer = temp8 & 0x01;
505 output_struct->data.address32.decode = (temp8 >> 1) & 0x01;
510 output_struct->data.address32.min_address_fixed = (temp8 >> 2) & 0x01;
515 output_struct->data.address32.max_address_fixed = (temp8 >> 3) & 0x01;
518 * Get the Type Specific Flags (Byte5)
523 if (MEMORY_RANGE == output_struct->data.address32.resource_type) {
524 output_struct->data.address32.attribute.memory.read_write_attribute =
525 (u16) (temp8 & 0x01);
527 output_struct->data.address32.attribute.memory.cache_attribute =
528 (u16) ((temp8 >> 1) & 0x0F);
532 if (IO_RANGE == output_struct->data.address32.resource_type) {
533 output_struct->data.address32.attribute.io.range_attribute =
534 (u16) (temp8 & 0x03);
538 /* BUS_NUMBER_RANGE == Output_struct->Data.Address32.Resource_type */
539 /* Nothing needs to be filled in */
544 * Get Granularity (Bytes 6-9)
547 MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.granularity,
551 * Get Min_address_range (Bytes 10-13)
554 MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.min_address_range,
558 * Get Max_address_range (Bytes 14-17)
561 MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.max_address_range,
565 * Get Address_translation_offset (Bytes 18-21)
568 MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.address_translation_offset,
572 * Get Address_length (Bytes 22-25)
575 MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.address_length,
579 * Resource Source Index (if present)
584 * This will leave us pointing to the Resource Source Index
585 * If it is present, then save it off and calculate the
586 * pointer to where the null terminated string goes:
588 if (*bytes_consumed > 26) {
589 /* Dereference the Index */
592 output_struct->data.address32.resource_source.index =
595 /* Point to the String */
599 /* Point the String pointer to the end of this structure */
601 output_struct->data.address32.resource_source.string_ptr =
602 (NATIVE_CHAR *)((u8 *)output_struct + struct_size);
604 temp_ptr = output_struct->data.address32.resource_source.string_ptr;
606 /* Copy the string into the buffer */
610 while (0x00 != *buffer) {
619 * Add the terminating null
622 output_struct->data.address32.resource_source.string_length = index + 1;
625 * In order for the Struct_size to fall on a 32-bit boundary,
626 * calculate the length of the string and expand the
627 * Struct_size to the next 32-bit boundary.
629 temp8 = (u8) (index + 1);
630 struct_size += ROUND_UP_TO_32_bITS (temp8);
634 output_struct->data.address32.resource_source.index = 0x00;
635 output_struct->data.address32.resource_source.string_length = 0;
636 output_struct->data.address32.resource_source.string_ptr = NULL;
640 * Set the Length parameter
642 output_struct->length = struct_size;
645 * Return the final size of the structure
647 *structure_size = struct_size;
648 return_ACPI_STATUS (AE_OK);
652 /*******************************************************************************
654 * FUNCTION: Acpi_rs_address32_stream
656 * PARAMETERS: Linked_list - Pointer to the resource linked list
657 * Output_buffer - Pointer to the user's return buffer
658 * Bytes_consumed - u32 pointer that is filled with
659 * the number of bytes of the
664 * DESCRIPTION: Take the linked list resource structure and fills in the
665 * the appropriate bytes in a byte stream
667 ******************************************************************************/
670 acpi_rs_address32_stream (
671 acpi_resource *linked_list,
678 NATIVE_CHAR *temp_pointer;
681 FUNCTION_TRACE ("Rs_address32_stream");
684 buffer = *output_buffer;
687 * The descriptor field is static
693 * Set a pointer to the Length field - to be filled in later
696 length_field = (u16 *) buffer;
700 * Set the Resource Type (Memory, Io, Bus_number)
702 temp8 = (u8) (linked_list->data.address32.resource_type & 0x03);
708 * Set the general flags
710 temp8 = (u8) (linked_list->data.address32.producer_consumer & 0x01);
711 temp8 |= (linked_list->data.address32.decode & 0x01) << 1;
712 temp8 |= (linked_list->data.address32.min_address_fixed & 0x01) << 2;
713 temp8 |= (linked_list->data.address32.max_address_fixed & 0x01) << 3;
719 * Set the type specific flags
723 if(MEMORY_RANGE == linked_list->data.address32.resource_type) {
725 (linked_list->data.address32.attribute.memory.read_write_attribute &
729 (linked_list->data.address32.attribute.memory.cache_attribute &
733 else if (IO_RANGE == linked_list->data.address32.resource_type) {
735 (linked_list->data.address32.attribute.io.range_attribute &
743 * Set the address space granularity
745 MOVE_UNALIGNED32_TO_32 (buffer,
746 &linked_list->data.address32.granularity);
750 * Set the address range minimum
752 MOVE_UNALIGNED32_TO_32 (buffer,
753 &linked_list->data.address32.min_address_range);
757 * Set the address range maximum
759 MOVE_UNALIGNED32_TO_32 (buffer,
760 &linked_list->data.address32.max_address_range);
764 * Set the address translation offset
766 MOVE_UNALIGNED32_TO_32 (buffer,
767 &linked_list->data.address32.address_translation_offset);
771 * Set the address length
773 MOVE_UNALIGNED32_TO_32 (buffer,
774 &linked_list->data.address32.address_length);
778 * Resource Source Index and Resource Source are optional
780 if (0 != linked_list->data.address32.resource_source.string_length) {
781 temp8 = (u8) linked_list->data.address32.resource_source.index;
786 temp_pointer = (NATIVE_CHAR *) buffer;
791 STRCPY (temp_pointer,
792 linked_list->data.address32.resource_source.string_ptr);
795 * Buffer needs to be set to the length of the sting + one for the
798 buffer += (STRLEN (linked_list->data.address32.resource_source.string_ptr) + 1);
802 * Return the number of bytes consumed in this operation
804 *bytes_consumed = POINTER_DIFF (buffer, *output_buffer);
807 * Set the length field to the number of bytes consumed
808 * minus the header size (3 bytes)
810 *length_field = (u16) (*bytes_consumed - 3);
811 return_ACPI_STATUS (AE_OK);
815 /*******************************************************************************
817 * FUNCTION: Acpi_rs_address64_resource
819 * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte
821 * Bytes_consumed - u32 pointer that is filled with
822 * the number of bytes consumed from
823 * the Byte_stream_buffer
824 * Output_buffer - Pointer to the user's return buffer
825 * Structure_size - u32 pointer that is filled with
826 * the number of bytes in the filled
831 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
832 * structure pointed to by the Output_buffer. Return the
833 * number of bytes consumed from the byte stream.
835 ******************************************************************************/
838 acpi_rs_address64_resource (
839 u8 *byte_stream_buffer,
845 acpi_resource *output_struct;
848 NATIVE_CHAR *temp_ptr;
853 FUNCTION_TRACE ("Rs_address64_resource");
856 buffer = byte_stream_buffer;
857 output_struct = (acpi_resource *) *output_buffer;
859 struct_size = SIZEOF_RESOURCE (acpi_resource_address64);
862 * Point past the Descriptor to get the number of bytes consumed
865 MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
867 *bytes_consumed = temp16 + 3;
868 output_struct->id = ACPI_RSTYPE_ADDRESS64;
871 * Get the Resource Type (Byte3)
876 /* Values 0-2 are valid */
878 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
881 output_struct->data.address64.resource_type = temp8 & 0x03;
884 * Get the General Flags (Byte4)
890 * Producer / Consumer
892 output_struct->data.address64.producer_consumer = temp8 & 0x01;
897 output_struct->data.address64.decode = (temp8 >> 1) & 0x01;
902 output_struct->data.address64.min_address_fixed = (temp8 >> 2) & 0x01;
907 output_struct->data.address64.max_address_fixed = (temp8 >> 3) & 0x01;
910 * Get the Type Specific Flags (Byte5)
915 if (MEMORY_RANGE == output_struct->data.address64.resource_type) {
916 output_struct->data.address64.attribute.memory.read_write_attribute =
917 (u16) (temp8 & 0x01);
919 output_struct->data.address64.attribute.memory.cache_attribute =
920 (u16) ((temp8 >> 1) & 0x0F);
924 if (IO_RANGE == output_struct->data.address64.resource_type) {
925 output_struct->data.address64.attribute.io.range_attribute =
926 (u16) (temp8 & 0x03);
930 /* BUS_NUMBER_RANGE == Output_struct->Data.Address64.Resource_type */
931 /* Nothing needs to be filled in */
936 * Get Granularity (Bytes 6-13)
939 MOVE_UNALIGNED64_TO_64 (&output_struct->data.address64.granularity,
943 * Get Min_address_range (Bytes 14-21)
946 MOVE_UNALIGNED64_TO_64 (&output_struct->data.address64.min_address_range,
950 * Get Max_address_range (Bytes 22-29)
953 MOVE_UNALIGNED64_TO_64 (&output_struct->data.address64.max_address_range,
957 * Get Address_translation_offset (Bytes 30-37)
960 MOVE_UNALIGNED64_TO_64 (&output_struct->data.address64.address_translation_offset,
964 * Get Address_length (Bytes 38-45)
967 MOVE_UNALIGNED64_TO_64 (&output_struct->data.address64.address_length,
971 * Resource Source Index (if present)
976 * This will leave us pointing to the Resource Source Index
977 * If it is present, then save it off and calculate the
978 * pointer to where the null terminated string goes:
979 * Each Interrupt takes 32-bits + the 5 bytes of the
980 * stream that are default.
982 if (*bytes_consumed > 46) {
983 /* Dereference the Index */
986 output_struct->data.address64.resource_source.index =
989 /* Point to the String */
993 /* Point the String pointer to the end of this structure */
995 output_struct->data.address64.resource_source.string_ptr =
996 (NATIVE_CHAR *)((u8 *)output_struct + struct_size);
998 temp_ptr = output_struct->data.address64.resource_source.string_ptr;
1000 /* Copy the string into the buffer */
1004 while (0x00 != *buffer) {
1005 *temp_ptr = *buffer;
1013 * Add the terminating null
1017 output_struct->data.address64.resource_source.string_length = index + 1;
1020 * In order for the Struct_size to fall on a 32-bit boundary,
1021 * calculate the length of the string and expand the
1022 * Struct_size to the next 32-bit boundary.
1024 temp8 = (u8) (index + 1);
1025 struct_size += ROUND_UP_TO_32_bITS (temp8);
1029 output_struct->data.address64.resource_source.index = 0x00;
1030 output_struct->data.address64.resource_source.string_length = 0;
1031 output_struct->data.address64.resource_source.string_ptr = NULL;
1035 * Set the Length parameter
1037 output_struct->length = struct_size;
1040 * Return the final size of the structure
1042 *structure_size = struct_size;
1043 return_ACPI_STATUS (AE_OK);
1047 /*******************************************************************************
1049 * FUNCTION: Acpi_rs_address64_stream
1051 * PARAMETERS: Linked_list - Pointer to the resource linked list
1052 * Output_buffer - Pointer to the user's return buffer
1053 * Bytes_consumed - u32 pointer that is filled with
1054 * the number of bytes of the
1055 * Output_buffer used
1059 * DESCRIPTION: Take the linked list resource structure and fills in the
1060 * the appropriate bytes in a byte stream
1062 ******************************************************************************/
1065 acpi_rs_address64_stream (
1066 acpi_resource *linked_list,
1068 u32 *bytes_consumed)
1073 NATIVE_CHAR *temp_pointer;
1076 FUNCTION_TRACE ("Rs_address64_stream");
1079 buffer = *output_buffer;
1082 * The descriptor field is static
1088 * Set a pointer to the Length field - to be filled in later
1091 length_field = (u16 *)buffer;
1095 * Set the Resource Type (Memory, Io, Bus_number)
1097 temp8 = (u8) (linked_list->data.address64.resource_type & 0x03);
1103 * Set the general flags
1105 temp8 = (u8) (linked_list->data.address64.producer_consumer & 0x01);
1106 temp8 |= (linked_list->data.address64.decode & 0x01) << 1;
1107 temp8 |= (linked_list->data.address64.min_address_fixed & 0x01) << 2;
1108 temp8 |= (linked_list->data.address64.max_address_fixed & 0x01) << 3;
1114 * Set the type specific flags
1118 if(MEMORY_RANGE == linked_list->data.address64.resource_type) {
1120 (linked_list->data.address64.attribute.memory.read_write_attribute &
1124 (linked_list->data.address64.attribute.memory.cache_attribute &
1128 else if (IO_RANGE == linked_list->data.address64.resource_type) {
1130 (linked_list->data.address64.attribute.io.range_attribute &
1138 * Set the address space granularity
1140 MOVE_UNALIGNED64_TO_64 (buffer,
1141 &linked_list->data.address64.granularity);
1145 * Set the address range minimum
1147 MOVE_UNALIGNED64_TO_64 (buffer,
1148 &linked_list->data.address64.min_address_range);
1152 * Set the address range maximum
1154 MOVE_UNALIGNED64_TO_64 (buffer,
1155 &linked_list->data.address64.max_address_range);
1159 * Set the address translation offset
1161 MOVE_UNALIGNED64_TO_64 (buffer,
1162 &linked_list->data.address64.address_translation_offset);
1166 * Set the address length
1168 MOVE_UNALIGNED64_TO_64 (buffer,
1169 &linked_list->data.address64.address_length);
1173 * Resource Source Index and Resource Source are optional
1175 if (0 != linked_list->data.address64.resource_source.string_length) {
1176 temp8 = (u8) linked_list->data.address64.resource_source.index;
1181 temp_pointer = (NATIVE_CHAR *) buffer;
1186 STRCPY (temp_pointer, linked_list->data.address64.resource_source.string_ptr);
1189 * Buffer needs to be set to the length of the sting + one for the
1192 buffer += (STRLEN (linked_list->data.address64.resource_source.string_ptr) + 1);
1196 * Return the number of bytes consumed in this operation
1198 *bytes_consumed = POINTER_DIFF (buffer, *output_buffer);
1201 * Set the length field to the number of bytes consumed
1202 * minus the header size (3 bytes)
1204 *length_field = (u16) (*bytes_consumed - 3);
1205 return_ACPI_STATUS (AE_OK);