rscalc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:20k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: rscalc - Calculate stream and list lengths
  4.  *              $Revision: 32 $
  5.  *
  6.  ******************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acresrc.h"
  26. #include "amlcode.h"
  27. #include "acnamesp.h"
  28. #define _COMPONENT          ACPI_RESOURCES
  29.  MODULE_NAME         ("rscalc")
  30. /*******************************************************************************
  31.  *
  32.  * FUNCTION:    Acpi_rs_calculate_byte_stream_length
  33.  *
  34.  * PARAMETERS:  Linked_list         - Pointer to the resource linked list
  35.  *              Size_needed         - u32 pointer of the size buffer needed
  36.  *                                    to properly return the parsed data
  37.  *
  38.  * RETURN:      Status
  39.  *
  40.  * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
  41.  *              the size buffer needed to hold the linked list that conveys
  42.  *              the resource data.
  43.  *
  44.  ******************************************************************************/
  45. acpi_status
  46. acpi_rs_calculate_byte_stream_length (
  47. acpi_resource           *linked_list,
  48. u32                     *size_needed)
  49. {
  50. u32                     byte_stream_size_needed = 0;
  51. u32                     segment_size;
  52. acpi_resource_ext_irq   *ex_irq = NULL;
  53. u8                      done = FALSE;
  54. FUNCTION_TRACE ("Rs_calculate_byte_stream_length");
  55. while (!done) {
  56. /*
  57.  * Init the variable that will hold the size to add to the total.
  58.  */
  59. segment_size = 0;
  60. switch (linked_list->id) {
  61. case ACPI_RSTYPE_IRQ:
  62. /*
  63.  * IRQ Resource
  64.  * For an IRQ Resource, Byte 3, although optional, will
  65.  * always be created - it holds IRQ information.
  66.  */
  67. segment_size = 4;
  68. break;
  69. case ACPI_RSTYPE_DMA:
  70. /*
  71.  * DMA Resource
  72.  * For this resource the size is static
  73.  */
  74. segment_size = 3;
  75. break;
  76. case ACPI_RSTYPE_START_DPF:
  77. /*
  78.  * Start Dependent Functions Resource
  79.  * For a Start_dependent_functions Resource, Byte 1,
  80.  * although optional, will always be created.
  81.  */
  82. segment_size = 2;
  83. break;
  84. case ACPI_RSTYPE_END_DPF:
  85. /*
  86.  * End Dependent Functions Resource
  87.  * For this resource the size is static
  88.  */
  89. segment_size = 1;
  90. break;
  91. case ACPI_RSTYPE_IO:
  92. /*
  93.  * IO Port Resource
  94.  * For this resource the size is static
  95.  */
  96. segment_size = 8;
  97. break;
  98. case ACPI_RSTYPE_FIXED_IO:
  99. /*
  100.  * Fixed IO Port Resource
  101.  * For this resource the size is static
  102.  */
  103. segment_size = 4;
  104. break;
  105. case ACPI_RSTYPE_VENDOR:
  106. /*
  107.  * Vendor Defined Resource
  108.  * For a Vendor Specific resource, if the Length is
  109.  * between 1 and 7 it will be created as a Small
  110.  * Resource data type, otherwise it is a Large
  111.  * Resource data type.
  112.  */
  113. if (linked_list->data.vendor_specific.length > 7) {
  114. segment_size = 3;
  115. }
  116. else {
  117. segment_size = 1;
  118. }
  119. segment_size += linked_list->data.vendor_specific.length;
  120. break;
  121. case ACPI_RSTYPE_END_TAG:
  122. /*
  123.  * End Tag
  124.  * For this resource the size is static
  125.  */
  126. segment_size = 2;
  127. done = TRUE;
  128. break;
  129. case ACPI_RSTYPE_MEM24:
  130. /*
  131.  * 24-Bit Memory Resource
  132.  * For this resource the size is static
  133.  */
  134. segment_size = 12;
  135. break;
  136. case ACPI_RSTYPE_MEM32:
  137. /*
  138.  * 32-Bit Memory Range Resource
  139.  * For this resource the size is static
  140.  */
  141. segment_size = 20;
  142. break;
  143. case ACPI_RSTYPE_FIXED_MEM32:
  144. /*
  145.  * 32-Bit Fixed Memory Resource
  146.  * For this resource the size is static
  147.  */
  148. segment_size = 12;
  149. break;
  150. case ACPI_RSTYPE_ADDRESS16:
  151. /*
  152.  * 16-Bit Address Resource
  153.  * The base size of this byte stream is 16. If a
  154.  * Resource Source string is not NULL, add 1 for
  155.  * the Index + the length of the null terminated
  156.  * string Resource Source + 1 for the null.
  157.  */
  158. segment_size = 16;
  159. if (NULL != linked_list->data.address16.resource_source.string_ptr) {
  160. segment_size += (1 +
  161. linked_list->data.address16.resource_source.string_length);
  162. }
  163. break;
  164. case ACPI_RSTYPE_ADDRESS32:
  165. /*
  166.  * 32-Bit Address Resource
  167.  * The base size of this byte stream is 26. If a Resource
  168.  * Source string is not NULL, add 1 for the Index + the
  169.  * length of the null terminated string Resource Source +
  170.  * 1 for the null.
  171.  */
  172. segment_size = 26;
  173. if (NULL != linked_list->data.address32.resource_source.string_ptr) {
  174. segment_size += (1 +
  175. linked_list->data.address32.resource_source.string_length);
  176. }
  177. break;
  178. case ACPI_RSTYPE_ADDRESS64:
  179. /*
  180.  * 64-Bit Address Resource
  181.  * The base size of this byte stream is 46. If a Resource
  182.  * Source string is not NULL, add 1 for the Index + the
  183.  * length of the null terminated string Resource Source +
  184.  * 1 for the null.
  185.  */
  186. segment_size = 46;
  187. if (NULL != linked_list->data.address64.resource_source.string_ptr) {
  188. segment_size += (1 +
  189. linked_list->data.address64.resource_source.string_length);
  190. }
  191. break;
  192. case ACPI_RSTYPE_EXT_IRQ:
  193. /*
  194.  * Extended IRQ Resource
  195.  * The base size of this byte stream is 9. This is for an
  196.  * Interrupt table length of 1.  For each additional
  197.  * interrupt, add 4.
  198.  * If a Resource Source string is not NULL, add 1 for the
  199.  * Index + the length of the null terminated string
  200.  * Resource Source + 1 for the null.
  201.  */
  202. segment_size = 9 +
  203. ((linked_list->data.extended_irq.number_of_interrupts - 1) * 4);
  204. if (NULL != ex_irq->resource_source.string_ptr) {
  205. segment_size += (1 +
  206. linked_list->data.extended_irq.resource_source.string_length);
  207. }
  208. break;
  209. default:
  210. /*
  211.  * If we get here, everything is out of sync,
  212.  * so exit with an error
  213.  */
  214. return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
  215. break;
  216. } /* switch (Linked_list->Id) */
  217. /*
  218.  * Update the total
  219.  */
  220. byte_stream_size_needed += segment_size;
  221. /*
  222.  * Point to the next object
  223.  */
  224. linked_list = POINTER_ADD (acpi_resource,
  225.   linked_list, linked_list->length);
  226. }
  227. /*
  228.  * This is the data the caller needs
  229.  */
  230. *size_needed = byte_stream_size_needed;
  231. return_ACPI_STATUS (AE_OK);
  232. }
  233. /*******************************************************************************
  234.  *
  235.  * FUNCTION:    Acpi_rs_calculate_list_length
  236.  *
  237.  * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource byte stream
  238.  *              Byte_stream_buffer_length - Size of Byte_stream_buffer
  239.  *              Size_needed             - u32 pointer of the size buffer
  240.  *                                        needed to properly return the
  241.  *                                        parsed data
  242.  *
  243.  * RETURN:      Status
  244.  *
  245.  * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
  246.  *              the size buffer needed to hold the linked list that conveys
  247.  *              the resource data.
  248.  *
  249.  ******************************************************************************/
  250. acpi_status
  251. acpi_rs_calculate_list_length (
  252. u8                      *byte_stream_buffer,
  253. u32                     byte_stream_buffer_length,
  254. u32                     *size_needed)
  255. {
  256. u32                     buffer_size = 0;
  257. u32                     bytes_parsed = 0;
  258. u8                      number_of_interrupts = 0;
  259. u8                      number_of_channels = 0;
  260. u8                      resource_type;
  261. u32                     structure_size;
  262. u32                     bytes_consumed;
  263. u8                      *buffer;
  264. u8                      temp8;
  265. u16                     temp16;
  266. u8                      index;
  267. u8                      additional_bytes;
  268. FUNCTION_TRACE ("Rs_calculate_list_length");
  269. while (bytes_parsed < byte_stream_buffer_length) {
  270. /*
  271.  * The next byte in the stream is the resource type
  272.  */
  273. resource_type = acpi_rs_get_resource_type (*byte_stream_buffer);
  274. switch (resource_type) {
  275. case RESOURCE_DESC_MEMORY_24:
  276. /*
  277.  * 24-Bit Memory Resource
  278.  */
  279. bytes_consumed = 12;
  280. structure_size = SIZEOF_RESOURCE (acpi_resource_mem24);
  281. break;
  282. case RESOURCE_DESC_LARGE_VENDOR:
  283. /*
  284.  * Vendor Defined Resource
  285.  */
  286. buffer = byte_stream_buffer;
  287. ++buffer;
  288. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  289. bytes_consumed = temp16 + 3;
  290. /*
  291.  * Ensure a 32-bit boundary for the structure
  292.  */
  293. temp16 = (u16) ROUND_UP_TO_32_bITS (temp16);
  294. structure_size = SIZEOF_RESOURCE (acpi_resource_vendor) +
  295.    (temp16 * sizeof (u8));
  296. break;
  297. case RESOURCE_DESC_MEMORY_32:
  298. /*
  299.  * 32-Bit Memory Range Resource
  300.  */
  301. bytes_consumed = 20;
  302. structure_size = SIZEOF_RESOURCE (acpi_resource_mem32);
  303. break;
  304. case RESOURCE_DESC_FIXED_MEMORY_32:
  305. /*
  306.  * 32-Bit Fixed Memory Resource
  307.  */
  308. bytes_consumed = 12;
  309. structure_size = SIZEOF_RESOURCE (acpi_resource_fixed_mem32);
  310. break;
  311. case RESOURCE_DESC_QWORD_ADDRESS_SPACE:
  312. /*
  313.  * 64-Bit Address Resource
  314.  */
  315. buffer = byte_stream_buffer;
  316. ++buffer;
  317. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  318. bytes_consumed = temp16 + 3;
  319. /*
  320.  * Resource Source Index and Resource Source are
  321.  * optional elements.  Check the length of the
  322.  * Bytestream.  If it is greater than 43, that
  323.  * means that an Index exists and is followed by
  324.  * a null termininated string.  Therefore, set
  325.  * the temp variable to the length minus the minimum
  326.  * byte stream length plus the byte for the Index to
  327.  * determine the size of the NULL terminiated string.
  328.  */
  329. if (43 < temp16) {
  330. temp8 = (u8) (temp16 - 44);
  331. }
  332. else {
  333. temp8 = 0;
  334. }
  335. /*
  336.  * Ensure a 64-bit boundary for the structure
  337.  */
  338. temp8 = (u8) ROUND_UP_TO_64_bITS (temp8);
  339. structure_size = SIZEOF_RESOURCE (acpi_resource_address64) +
  340.    (temp8 * sizeof (u8));
  341. break;
  342. case RESOURCE_DESC_DWORD_ADDRESS_SPACE:
  343. /*
  344.  * 32-Bit Address Resource
  345.  */
  346. buffer = byte_stream_buffer;
  347. ++buffer;
  348. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  349. bytes_consumed = temp16 + 3;
  350. /*
  351.  * Resource Source Index and Resource Source are
  352.  * optional elements.  Check the length of the
  353.  * Bytestream.  If it is greater than 23, that
  354.  * means that an Index exists and is followed by
  355.  * a null termininated string.  Therefore, set
  356.  * the temp variable to the length minus the minimum
  357.  * byte stream length plus the byte for the Index to
  358.  * determine the size of the NULL terminiated string.
  359.  */
  360. if (23 < temp16) {
  361. temp8 = (u8) (temp16 - 24);
  362. }
  363. else {
  364. temp8 = 0;
  365. }
  366. /*
  367.  * Ensure a 32-bit boundary for the structure
  368.  */
  369. temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
  370. structure_size = SIZEOF_RESOURCE (acpi_resource_address32) +
  371.    (temp8 * sizeof (u8));
  372. break;
  373. case RESOURCE_DESC_WORD_ADDRESS_SPACE:
  374. /*
  375.  * 16-Bit Address Resource
  376.  */
  377. buffer = byte_stream_buffer;
  378. ++buffer;
  379. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  380. bytes_consumed = temp16 + 3;
  381. /*
  382.  * Resource Source Index and Resource Source are
  383.  * optional elements.  Check the length of the
  384.  * Bytestream.  If it is greater than 13, that
  385.  * means that an Index exists and is followed by
  386.  * a null termininated string.  Therefore, set
  387.  * the temp variable to the length minus the minimum
  388.  * byte stream length plus the byte for the Index to
  389.  * determine the size of the NULL terminiated string.
  390.  */
  391. if (13 < temp16) {
  392. temp8 = (u8) (temp16 - 14);
  393. }
  394. else {
  395. temp8 = 0;
  396. }
  397. /*
  398.  * Ensure a 32-bit boundary for the structure
  399.  */
  400. temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
  401. structure_size = SIZEOF_RESOURCE (acpi_resource_address16) +
  402.    (temp8 * sizeof (u8));
  403. break;
  404. case RESOURCE_DESC_EXTENDED_XRUPT:
  405. /*
  406.  * Extended IRQ
  407.  */
  408. buffer = byte_stream_buffer;
  409. ++buffer;
  410. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  411. bytes_consumed = temp16 + 3;
  412. /*
  413.  * Point past the length field and the
  414.  * Interrupt vector flags to save off the
  415.  * Interrupt table length to the Temp8 variable.
  416.  */
  417. buffer += 3;
  418. temp8 = *buffer;
  419. /*
  420.  * To compensate for multiple interrupt numbers, add 4 bytes for
  421.  * each additional interrupts greater than 1
  422.  */
  423. additional_bytes = (u8) ((temp8 - 1) * 4);
  424. /*
  425.  * Resource Source Index and Resource Source are
  426.  * optional elements.  Check the length of the
  427.  * Bytestream.  If it is greater than 9, that
  428.  * means that an Index exists and is followed by
  429.  * a null termininated string.  Therefore, set
  430.  * the temp variable to the length minus the minimum
  431.  * byte stream length plus the byte for the Index to
  432.  * determine the size of the NULL terminiated string.
  433.  */
  434. if (9 + additional_bytes < temp16) {
  435. temp8 = (u8) (temp16 - (9 + additional_bytes));
  436. }
  437. else {
  438. temp8 = 0;
  439. }
  440. /*
  441.  * Ensure a 32-bit boundary for the structure
  442.  */
  443. temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
  444. structure_size = SIZEOF_RESOURCE (acpi_resource_ext_irq) +
  445.    (additional_bytes * sizeof (u8)) +
  446.    (temp8 * sizeof (u8));
  447. break;
  448. case RESOURCE_DESC_IRQ_FORMAT:
  449. /*
  450.  * IRQ Resource.
  451.  * Determine if it there are two or three trailing bytes
  452.  */
  453. buffer = byte_stream_buffer;
  454. temp8 = *buffer;
  455. if(temp8 & 0x01) {
  456. bytes_consumed = 4;
  457. }
  458. else {
  459. bytes_consumed = 3;
  460. }
  461. /*
  462.  * Point past the descriptor
  463.  */
  464. ++buffer;
  465. /*
  466.  * Look at the number of bits set
  467.  */
  468. MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
  469. for (index = 0; index < 16; index++) {
  470. if (temp16 & 0x1) {
  471. ++number_of_interrupts;
  472. }
  473. temp16 >>= 1;
  474. }
  475. structure_size = SIZEOF_RESOURCE (acpi_resource_io) +
  476.    (number_of_interrupts * sizeof (u32));
  477. break;
  478. case RESOURCE_DESC_DMA_FORMAT:
  479. /*
  480.  * DMA Resource
  481.  */
  482. buffer = byte_stream_buffer;
  483. bytes_consumed = 3;
  484. /*
  485.  * Point past the descriptor
  486.  */
  487. ++buffer;
  488. /*
  489.  * Look at the number of bits set
  490.  */
  491. temp8 = *buffer;
  492. for(index = 0; index < 8; index++) {
  493. if(temp8 & 0x1) {
  494. ++number_of_channels;
  495. }
  496. temp8 >>= 1;
  497. }
  498. structure_size = SIZEOF_RESOURCE (acpi_resource_dma) +
  499.    (number_of_channels * sizeof (u32));
  500. break;
  501. case RESOURCE_DESC_START_DEPENDENT:
  502. /*
  503.  * Start Dependent Functions Resource
  504.  * Determine if it there are two or three trailing bytes
  505.  */
  506. buffer = byte_stream_buffer;
  507. temp8 = *buffer;
  508. if(temp8 & 0x01) {
  509. bytes_consumed = 2;
  510. }
  511. else {
  512. bytes_consumed = 1;
  513. }
  514. structure_size = SIZEOF_RESOURCE (acpi_resource_start_dpf);
  515. break;
  516. case RESOURCE_DESC_END_DEPENDENT:
  517. /*
  518.  * End Dependent Functions Resource
  519.  */
  520. bytes_consumed = 1;
  521. structure_size = ACPI_RESOURCE_LENGTH;
  522. break;
  523. case RESOURCE_DESC_IO_PORT:
  524. /*
  525.  * IO Port Resource
  526.  */
  527. bytes_consumed = 8;
  528. structure_size = SIZEOF_RESOURCE (acpi_resource_io);
  529. break;
  530. case RESOURCE_DESC_FIXED_IO_PORT:
  531. /*
  532.  * Fixed IO Port Resource
  533.  */
  534. bytes_consumed = 4;
  535. structure_size = SIZEOF_RESOURCE (acpi_resource_fixed_io);
  536. break;
  537. case RESOURCE_DESC_SMALL_VENDOR:
  538. /*
  539.  * Vendor Specific Resource
  540.  */
  541. buffer = byte_stream_buffer;
  542. temp8 = *buffer;
  543. temp8 = (u8) (temp8 & 0x7);
  544. bytes_consumed = temp8 + 1;
  545. /*
  546.  * Ensure a 32-bit boundary for the structure
  547.  */
  548. temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
  549. structure_size = SIZEOF_RESOURCE (acpi_resource_vendor) +
  550.    (temp8 * sizeof (u8));
  551. break;
  552. case RESOURCE_DESC_END_TAG:
  553. /*
  554.  * End Tag
  555.  */
  556. bytes_consumed = 2;
  557. structure_size = ACPI_RESOURCE_LENGTH;
  558. byte_stream_buffer_length = bytes_parsed;
  559. break;
  560. default:
  561. /*
  562.  * If we get here, everything is out of sync,
  563.  *  so exit with an error
  564.  */
  565. return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
  566. break;
  567. }
  568. /*
  569.  * Update the return value and counter
  570.  */
  571. buffer_size += structure_size;
  572. bytes_parsed += bytes_consumed;
  573. /*
  574.  * Set the byte stream to point to the next resource
  575.  */
  576. byte_stream_buffer += bytes_consumed;
  577. }
  578. /*
  579.  * This is the data the caller needs
  580.  */
  581. *size_needed = buffer_size;
  582. return_ACPI_STATUS (AE_OK);
  583. }
  584. /*******************************************************************************
  585.  *
  586.  * FUNCTION:    Acpi_rs_calculate_pci_routing_table_length
  587.  *
  588.  * PARAMETERS:  Package_object          - Pointer to the package object
  589.  *              Buffer_size_needed      - u32 pointer of the size buffer
  590.  *                                        needed to properly return the
  591.  *                                        parsed data
  592.  *
  593.  * RETURN:      Status
  594.  *
  595.  * DESCRIPTION: Given a package representing a PCI routing table, this
  596.  *              calculates the size of the corresponding linked list of
  597.  *              descriptions.
  598.  *
  599.  ******************************************************************************/
  600. acpi_status
  601. acpi_rs_calculate_pci_routing_table_length (
  602. acpi_operand_object     *package_object,
  603. u32                     *buffer_size_needed)
  604. {
  605. u32                     number_of_elements;
  606. u32                     temp_size_needed = 0;
  607. acpi_operand_object     **top_object_list;
  608. u32                     index;
  609. acpi_operand_object     *package_element;
  610. acpi_operand_object     **sub_object_list;
  611. u8                      name_found;
  612. u32                     table_index;
  613. FUNCTION_TRACE ("Rs_calculate_pci_routing_table_length");
  614. number_of_elements = package_object->package.count;
  615. /*
  616.  * Calculate the size of the return buffer.
  617.  * The base size is the number of elements * the sizes of the
  618.  * structures.  Additional space for the strings is added below.
  619.  * The minus one is to subtract the size of the u8 Source[1]
  620.  * member because it is added below.
  621.  *
  622.  * But each PRT_ENTRY structure has a pointer to a string and
  623.  * the size of that string must be found.
  624.  */
  625. top_object_list = package_object->package.elements;
  626. for (index = 0; index < number_of_elements; index++) {
  627. /*
  628.  * Dereference the sub-package
  629.  */
  630. package_element = *top_object_list;
  631. /*
  632.  * The Sub_object_list will now point to an array of the
  633.  * four IRQ elements: Address, Pin, Source and Source_index
  634.  */
  635. sub_object_list = package_element->package.elements;
  636. /*
  637.  * Scan the Irq_table_elements for the Source Name String
  638.  */
  639. name_found = FALSE;
  640. for (table_index = 0; table_index < 4 && !name_found; table_index++) {
  641. if ((ACPI_TYPE_STRING == (*sub_object_list)->common.type) ||
  642. ((INTERNAL_TYPE_REFERENCE == (*sub_object_list)->common.type) &&
  643. ((*sub_object_list)->reference.opcode == AML_INT_NAMEPATH_OP))) {
  644. name_found = TRUE;
  645. }
  646. else {
  647. /*
  648.  * Look at the next element
  649.  */
  650. sub_object_list++;
  651. }
  652. }
  653. temp_size_needed += (sizeof (pci_routing_table) - 4);
  654. /*
  655.  * Was a String type found?
  656.  */
  657. if (TRUE == name_found) {
  658. if (ACPI_TYPE_STRING == (*sub_object_list)->common.type) {
  659. /*
  660.  * The length String.Length field includes the
  661.  * terminating NULL
  662.  */
  663. temp_size_needed += (*sub_object_list)->string.length;
  664. }
  665. else {
  666. temp_size_needed += acpi_ns_get_pathname_length (
  667.    (*sub_object_list)->reference.node);
  668. }
  669. }
  670. else {
  671. /*
  672.  * If no name was found, then this is a NULL, which is
  673.  * translated as a u32 zero.
  674.  */
  675. temp_size_needed += sizeof (u32);
  676. }
  677. /* Round up the size since each element must be aligned */
  678. temp_size_needed = ROUND_UP_TO_64_bITS (temp_size_needed);
  679. /*
  680.  * Point to the next acpi_operand_object
  681.  */
  682. top_object_list++;
  683. }
  684. /*
  685.  * Adding an extra element to the end of the list, essentially a NULL terminator
  686.  */
  687. *buffer_size_needed = temp_size_needed + sizeof (pci_routing_table);
  688. return_ACPI_STATUS (AE_OK);
  689. }