root/drivers/acpi/acpica/rsmisc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. acpi_rs_convert_aml_to_resource
  2. acpi_rs_convert_resource_to_aml

   1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2 /*******************************************************************************
   3  *
   4  * Module Name: rsmisc - Miscellaneous resource descriptors
   5  *
   6  ******************************************************************************/
   7 
   8 #include <acpi/acpi.h>
   9 #include "accommon.h"
  10 #include "acresrc.h"
  11 
  12 #define _COMPONENT          ACPI_RESOURCES
  13 ACPI_MODULE_NAME("rsmisc")
  14 #define INIT_RESOURCE_TYPE(i)       i->resource_offset
  15 #define INIT_RESOURCE_LENGTH(i)     i->aml_offset
  16 #define INIT_TABLE_LENGTH(i)        i->value
  17 #define COMPARE_OPCODE(i)           i->resource_offset
  18 #define COMPARE_TARGET(i)           i->aml_offset
  19 #define COMPARE_VALUE(i)            i->value
  20 /*******************************************************************************
  21  *
  22  * FUNCTION:    acpi_rs_convert_aml_to_resource
  23  *
  24  * PARAMETERS:  resource            - Pointer to the resource descriptor
  25  *              aml                 - Where the AML descriptor is returned
  26  *              info                - Pointer to appropriate conversion table
  27  *
  28  * RETURN:      Status
  29  *
  30  * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
  31  *              internal resource descriptor
  32  *
  33  ******************************************************************************/
  34 acpi_status
  35 acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
  36                                 union aml_resource *aml,
  37                                 struct acpi_rsconvert_info *info)
  38 {
  39         acpi_rs_length aml_resource_length;
  40         void *source;
  41         void *destination;
  42         char *target;
  43         u8 count;
  44         u8 flags_mode = FALSE;
  45         u16 item_count = 0;
  46         u16 temp16 = 0;
  47 
  48         ACPI_FUNCTION_TRACE(rs_convert_aml_to_resource);
  49 
  50         if (!info) {
  51                 return_ACPI_STATUS(AE_BAD_PARAMETER);
  52         }
  53 
  54         if (((acpi_size)resource) & 0x3) {
  55 
  56                 /* Each internal resource struct is expected to be 32-bit aligned */
  57 
  58                 ACPI_WARNING((AE_INFO,
  59                               "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
  60                               resource, resource->type, resource->length));
  61         }
  62 
  63         /* Extract the resource Length field (does not include header length) */
  64 
  65         aml_resource_length = acpi_ut_get_resource_length(aml);
  66 
  67         /*
  68          * First table entry must be ACPI_RSC_INITxxx and must contain the
  69          * table length (# of table entries)
  70          */
  71         count = INIT_TABLE_LENGTH(info);
  72         while (count) {
  73                 /*
  74                  * Source is the external AML byte stream buffer,
  75                  * destination is the internal resource descriptor
  76                  */
  77                 source = ACPI_ADD_PTR(void, aml, info->aml_offset);
  78                 destination =
  79                     ACPI_ADD_PTR(void, resource, info->resource_offset);
  80 
  81                 switch (info->opcode) {
  82                 case ACPI_RSC_INITGET:
  83                         /*
  84                          * Get the resource type and the initial (minimum) length
  85                          */
  86                         memset(resource, 0, INIT_RESOURCE_LENGTH(info));
  87                         resource->type = INIT_RESOURCE_TYPE(info);
  88                         resource->length = INIT_RESOURCE_LENGTH(info);
  89                         break;
  90 
  91                 case ACPI_RSC_INITSET:
  92                         break;
  93 
  94                 case ACPI_RSC_FLAGINIT:
  95 
  96                         flags_mode = TRUE;
  97                         break;
  98 
  99                 case ACPI_RSC_1BITFLAG:
 100                         /*
 101                          * Mask and shift the flag bit
 102                          */
 103                         ACPI_SET8(destination,
 104                                   ((ACPI_GET8(source) >> info->value) & 0x01));
 105                         break;
 106 
 107                 case ACPI_RSC_2BITFLAG:
 108                         /*
 109                          * Mask and shift the flag bits
 110                          */
 111                         ACPI_SET8(destination,
 112                                   ((ACPI_GET8(source) >> info->value) & 0x03));
 113                         break;
 114 
 115                 case ACPI_RSC_3BITFLAG:
 116                         /*
 117                          * Mask and shift the flag bits
 118                          */
 119                         ACPI_SET8(destination,
 120                                   ((ACPI_GET8(source) >> info->value) & 0x07));
 121                         break;
 122 
 123                 case ACPI_RSC_COUNT:
 124 
 125                         item_count = ACPI_GET8(source);
 126                         ACPI_SET8(destination, item_count);
 127 
 128                         resource->length = resource->length +
 129                             (info->value * (item_count - 1));
 130                         break;
 131 
 132                 case ACPI_RSC_COUNT16:
 133 
 134                         item_count = aml_resource_length;
 135                         ACPI_SET16(destination, item_count);
 136 
 137                         resource->length = resource->length +
 138                             (info->value * (item_count - 1));
 139                         break;
 140 
 141                 case ACPI_RSC_COUNT_GPIO_PIN:
 142 
 143                         target = ACPI_ADD_PTR(void, aml, info->value);
 144                         item_count = ACPI_GET16(target) - ACPI_GET16(source);
 145 
 146                         resource->length = resource->length + item_count;
 147                         item_count = item_count / 2;
 148                         ACPI_SET16(destination, item_count);
 149                         break;
 150 
 151                 case ACPI_RSC_COUNT_GPIO_VEN:
 152 
 153                         item_count = ACPI_GET8(source);
 154                         ACPI_SET8(destination, item_count);
 155 
 156                         resource->length =
 157                             resource->length + (info->value * item_count);
 158                         break;
 159 
 160                 case ACPI_RSC_COUNT_GPIO_RES:
 161                         /*
 162                          * Vendor data is optional (length/offset may both be zero)
 163                          * Examine vendor data length field first
 164                          */
 165                         target = ACPI_ADD_PTR(void, aml, (info->value + 2));
 166                         if (ACPI_GET16(target)) {
 167 
 168                                 /* Use vendor offset to get resource source length */
 169 
 170                                 target = ACPI_ADD_PTR(void, aml, info->value);
 171                                 item_count =
 172                                     ACPI_GET16(target) - ACPI_GET16(source);
 173                         } else {
 174                                 /* No vendor data to worry about */
 175 
 176                                 item_count = aml->large_header.resource_length +
 177                                     sizeof(struct aml_resource_large_header) -
 178                                     ACPI_GET16(source);
 179                         }
 180 
 181                         resource->length = resource->length + item_count;
 182                         ACPI_SET16(destination, item_count);
 183                         break;
 184 
 185                 case ACPI_RSC_COUNT_SERIAL_VEN:
 186 
 187                         item_count = ACPI_GET16(source) - info->value;
 188 
 189                         resource->length = resource->length + item_count;
 190                         ACPI_SET16(destination, item_count);
 191                         break;
 192 
 193                 case ACPI_RSC_COUNT_SERIAL_RES:
 194 
 195                         item_count = (aml_resource_length +
 196                                       sizeof(struct aml_resource_large_header))
 197                             - ACPI_GET16(source) - info->value;
 198 
 199                         resource->length = resource->length + item_count;
 200                         ACPI_SET16(destination, item_count);
 201                         break;
 202 
 203                 case ACPI_RSC_LENGTH:
 204 
 205                         resource->length = resource->length + info->value;
 206                         break;
 207 
 208                 case ACPI_RSC_MOVE8:
 209                 case ACPI_RSC_MOVE16:
 210                 case ACPI_RSC_MOVE32:
 211                 case ACPI_RSC_MOVE64:
 212                         /*
 213                          * Raw data move. Use the Info value field unless item_count has
 214                          * been previously initialized via a COUNT opcode
 215                          */
 216                         if (info->value) {
 217                                 item_count = info->value;
 218                         }
 219                         acpi_rs_move_data(destination, source, item_count,
 220                                           info->opcode);
 221                         break;
 222 
 223                 case ACPI_RSC_MOVE_GPIO_PIN:
 224 
 225                         /* Generate and set the PIN data pointer */
 226 
 227                         target = (char *)ACPI_ADD_PTR(void, resource,
 228                                                       (resource->length -
 229                                                        item_count * 2));
 230                         *(u16 **)destination = ACPI_CAST_PTR(u16, target);
 231 
 232                         /* Copy the PIN data */
 233 
 234                         source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source));
 235                         acpi_rs_move_data(target, source, item_count,
 236                                           info->opcode);
 237                         break;
 238 
 239                 case ACPI_RSC_MOVE_GPIO_RES:
 240 
 241                         /* Generate and set the resource_source string pointer */
 242 
 243                         target = (char *)ACPI_ADD_PTR(void, resource,
 244                                                       (resource->length -
 245                                                        item_count));
 246                         *(u8 **)destination = ACPI_CAST_PTR(u8, target);
 247 
 248                         /* Copy the resource_source string */
 249 
 250                         source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source));
 251                         acpi_rs_move_data(target, source, item_count,
 252                                           info->opcode);
 253                         break;
 254 
 255                 case ACPI_RSC_MOVE_SERIAL_VEN:
 256 
 257                         /* Generate and set the Vendor Data pointer */
 258 
 259                         target = (char *)ACPI_ADD_PTR(void, resource,
 260                                                       (resource->length -
 261                                                        item_count));
 262                         *(u8 **)destination = ACPI_CAST_PTR(u8, target);
 263 
 264                         /* Copy the Vendor Data */
 265 
 266                         source = ACPI_ADD_PTR(void, aml, info->value);
 267                         acpi_rs_move_data(target, source, item_count,
 268                                           info->opcode);
 269                         break;
 270 
 271                 case ACPI_RSC_MOVE_SERIAL_RES:
 272 
 273                         /* Generate and set the resource_source string pointer */
 274 
 275                         target = (char *)ACPI_ADD_PTR(void, resource,
 276                                                       (resource->length -
 277                                                        item_count));
 278                         *(u8 **)destination = ACPI_CAST_PTR(u8, target);
 279 
 280                         /* Copy the resource_source string */
 281 
 282                         source =
 283                             ACPI_ADD_PTR(void, aml,
 284                                          (ACPI_GET16(source) + info->value));
 285                         acpi_rs_move_data(target, source, item_count,
 286                                           info->opcode);
 287                         break;
 288 
 289                 case ACPI_RSC_SET8:
 290 
 291                         memset(destination, info->aml_offset, info->value);
 292                         break;
 293 
 294                 case ACPI_RSC_DATA8:
 295 
 296                         target = ACPI_ADD_PTR(char, resource, info->value);
 297                         memcpy(destination, source, ACPI_GET16(target));
 298                         break;
 299 
 300                 case ACPI_RSC_ADDRESS:
 301                         /*
 302                          * Common handler for address descriptor flags
 303                          */
 304                         if (!acpi_rs_get_address_common(resource, aml)) {
 305                                 return_ACPI_STATUS
 306                                     (AE_AML_INVALID_RESOURCE_TYPE);
 307                         }
 308                         break;
 309 
 310                 case ACPI_RSC_SOURCE:
 311                         /*
 312                          * Optional resource_source (Index and String)
 313                          */
 314                         resource->length +=
 315                             acpi_rs_get_resource_source(aml_resource_length,
 316                                                         info->value,
 317                                                         destination, aml, NULL);
 318                         break;
 319 
 320                 case ACPI_RSC_SOURCEX:
 321                         /*
 322                          * Optional resource_source (Index and String). This is the more
 323                          * complicated case used by the Interrupt() macro
 324                          */
 325                         target = ACPI_ADD_PTR(char, resource,
 326                                               info->aml_offset +
 327                                               (item_count * 4));
 328 
 329                         resource->length +=
 330                             acpi_rs_get_resource_source(aml_resource_length,
 331                                                         (acpi_rs_length)
 332                                                         (((item_count -
 333                                                            1) * sizeof(u32)) +
 334                                                          info->value),
 335                                                         destination, aml,
 336                                                         target);
 337                         break;
 338 
 339                 case ACPI_RSC_BITMASK:
 340                         /*
 341                          * 8-bit encoded bitmask (DMA macro)
 342                          */
 343                         item_count =
 344                             acpi_rs_decode_bitmask(ACPI_GET8(source),
 345                                                    destination);
 346                         if (item_count) {
 347                                 resource->length += (item_count - 1);
 348                         }
 349 
 350                         target = ACPI_ADD_PTR(char, resource, info->value);
 351                         ACPI_SET8(target, item_count);
 352                         break;
 353 
 354                 case ACPI_RSC_BITMASK16:
 355                         /*
 356                          * 16-bit encoded bitmask (IRQ macro)
 357                          */
 358                         ACPI_MOVE_16_TO_16(&temp16, source);
 359 
 360                         item_count =
 361                             acpi_rs_decode_bitmask(temp16, destination);
 362                         if (item_count) {
 363                                 resource->length += (item_count - 1);
 364                         }
 365 
 366                         target = ACPI_ADD_PTR(char, resource, info->value);
 367                         ACPI_SET8(target, item_count);
 368                         break;
 369 
 370                 case ACPI_RSC_EXIT_NE:
 371                         /*
 372                          * control - Exit conversion if not equal
 373                          */
 374                         switch (info->resource_offset) {
 375                         case ACPI_RSC_COMPARE_AML_LENGTH:
 376 
 377                                 if (aml_resource_length != info->value) {
 378                                         goto exit;
 379                                 }
 380                                 break;
 381 
 382                         case ACPI_RSC_COMPARE_VALUE:
 383 
 384                                 if (ACPI_GET8(source) != info->value) {
 385                                         goto exit;
 386                                 }
 387                                 break;
 388 
 389                         default:
 390 
 391                                 ACPI_ERROR((AE_INFO,
 392                                             "Invalid conversion sub-opcode"));
 393                                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 394                         }
 395                         break;
 396 
 397                 default:
 398 
 399                         ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
 400                         return_ACPI_STATUS(AE_BAD_PARAMETER);
 401                 }
 402 
 403                 count--;
 404                 info++;
 405         }
 406 
 407 exit:
 408         if (!flags_mode) {
 409 
 410                 /* Round the resource struct length up to the next boundary (32 or 64) */
 411 
 412                 resource->length = (u32)
 413                     ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length);
 414         }
 415         return_ACPI_STATUS(AE_OK);
 416 }
 417 
 418 /*******************************************************************************
 419  *
 420  * FUNCTION:    acpi_rs_convert_resource_to_aml
 421  *
 422  * PARAMETERS:  resource            - Pointer to the resource descriptor
 423  *              aml                 - Where the AML descriptor is returned
 424  *              info                - Pointer to appropriate conversion table
 425  *
 426  * RETURN:      Status
 427  *
 428  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
 429  *              external AML resource descriptor.
 430  *
 431  ******************************************************************************/
 432 
 433 acpi_status
 434 acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
 435                                 union aml_resource *aml,
 436                                 struct acpi_rsconvert_info *info)
 437 {
 438         void *source = NULL;
 439         void *destination;
 440         char *target;
 441         acpi_rsdesc_size aml_length = 0;
 442         u8 count;
 443         u16 temp16 = 0;
 444         u16 item_count = 0;
 445 
 446         ACPI_FUNCTION_TRACE(rs_convert_resource_to_aml);
 447 
 448         if (!info) {
 449                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 450         }
 451 
 452         /*
 453          * First table entry must be ACPI_RSC_INITxxx and must contain the
 454          * table length (# of table entries)
 455          */
 456         count = INIT_TABLE_LENGTH(info);
 457 
 458         while (count) {
 459                 /*
 460                  * Source is the internal resource descriptor,
 461                  * destination is the external AML byte stream buffer
 462                  */
 463                 source = ACPI_ADD_PTR(void, resource, info->resource_offset);
 464                 destination = ACPI_ADD_PTR(void, aml, info->aml_offset);
 465 
 466                 switch (info->opcode) {
 467                 case ACPI_RSC_INITSET:
 468 
 469                         memset(aml, 0, INIT_RESOURCE_LENGTH(info));
 470                         aml_length = INIT_RESOURCE_LENGTH(info);
 471                         acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info),
 472                                                     aml_length, aml);
 473                         break;
 474 
 475                 case ACPI_RSC_INITGET:
 476                         break;
 477 
 478                 case ACPI_RSC_FLAGINIT:
 479                         /*
 480                          * Clear the flag byte
 481                          */
 482                         ACPI_SET8(destination, 0);
 483                         break;
 484 
 485                 case ACPI_RSC_1BITFLAG:
 486                         /*
 487                          * Mask and shift the flag bit
 488                          */
 489                         ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
 490                                      ((ACPI_GET8(source) & 0x01) << info->
 491                                       value));
 492                         break;
 493 
 494                 case ACPI_RSC_2BITFLAG:
 495                         /*
 496                          * Mask and shift the flag bits
 497                          */
 498                         ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
 499                                      ((ACPI_GET8(source) & 0x03) << info->
 500                                       value));
 501                         break;
 502 
 503                 case ACPI_RSC_3BITFLAG:
 504                         /*
 505                          * Mask and shift the flag bits
 506                          */
 507                         ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
 508                                      ((ACPI_GET8(source) & 0x07) << info->
 509                                       value));
 510                         break;
 511 
 512                 case ACPI_RSC_COUNT:
 513 
 514                         item_count = ACPI_GET8(source);
 515                         ACPI_SET8(destination, item_count);
 516 
 517                         aml_length = (u16)
 518                             (aml_length + (info->value * (item_count - 1)));
 519                         break;
 520 
 521                 case ACPI_RSC_COUNT16:
 522 
 523                         item_count = ACPI_GET16(source);
 524                         aml_length = (u16) (aml_length + item_count);
 525                         acpi_rs_set_resource_length(aml_length, aml);
 526                         break;
 527 
 528                 case ACPI_RSC_COUNT_GPIO_PIN:
 529 
 530                         item_count = ACPI_GET16(source);
 531                         ACPI_SET16(destination, aml_length);
 532 
 533                         aml_length = (u16)(aml_length + item_count * 2);
 534                         target = ACPI_ADD_PTR(void, aml, info->value);
 535                         ACPI_SET16(target, aml_length);
 536                         acpi_rs_set_resource_length(aml_length, aml);
 537                         break;
 538 
 539                 case ACPI_RSC_COUNT_GPIO_VEN:
 540 
 541                         item_count = ACPI_GET16(source);
 542                         ACPI_SET16(destination, item_count);
 543 
 544                         aml_length =
 545                             (u16)(aml_length + (info->value * item_count));
 546                         acpi_rs_set_resource_length(aml_length, aml);
 547                         break;
 548 
 549                 case ACPI_RSC_COUNT_GPIO_RES:
 550 
 551                         /* Set resource source string length */
 552 
 553                         item_count = ACPI_GET16(source);
 554                         ACPI_SET16(destination, aml_length);
 555 
 556                         /* Compute offset for the Vendor Data */
 557 
 558                         aml_length = (u16)(aml_length + item_count);
 559                         target = ACPI_ADD_PTR(void, aml, info->value);
 560 
 561                         /* Set vendor offset only if there is vendor data */
 562 
 563                         ACPI_SET16(target, aml_length);
 564 
 565                         acpi_rs_set_resource_length(aml_length, aml);
 566                         break;
 567 
 568                 case ACPI_RSC_COUNT_SERIAL_VEN:
 569 
 570                         item_count = ACPI_GET16(source);
 571                         ACPI_SET16(destination, item_count + info->value);
 572                         aml_length = (u16)(aml_length + item_count);
 573                         acpi_rs_set_resource_length(aml_length, aml);
 574                         break;
 575 
 576                 case ACPI_RSC_COUNT_SERIAL_RES:
 577 
 578                         item_count = ACPI_GET16(source);
 579                         aml_length = (u16)(aml_length + item_count);
 580                         acpi_rs_set_resource_length(aml_length, aml);
 581                         break;
 582 
 583                 case ACPI_RSC_LENGTH:
 584 
 585                         acpi_rs_set_resource_length(info->value, aml);
 586                         break;
 587 
 588                 case ACPI_RSC_MOVE8:
 589                 case ACPI_RSC_MOVE16:
 590                 case ACPI_RSC_MOVE32:
 591                 case ACPI_RSC_MOVE64:
 592 
 593                         if (info->value) {
 594                                 item_count = info->value;
 595                         }
 596                         acpi_rs_move_data(destination, source, item_count,
 597                                           info->opcode);
 598                         break;
 599 
 600                 case ACPI_RSC_MOVE_GPIO_PIN:
 601 
 602                         destination = (char *)ACPI_ADD_PTR(void, aml,
 603                                                            ACPI_GET16
 604                                                            (destination));
 605                         source = *(u16 **)source;
 606                         acpi_rs_move_data(destination, source, item_count,
 607                                           info->opcode);
 608                         break;
 609 
 610                 case ACPI_RSC_MOVE_GPIO_RES:
 611 
 612                         /* Used for both resource_source string and vendor_data */
 613 
 614                         destination = (char *)ACPI_ADD_PTR(void, aml,
 615                                                            ACPI_GET16
 616                                                            (destination));
 617                         source = *(u8 **)source;
 618                         acpi_rs_move_data(destination, source, item_count,
 619                                           info->opcode);
 620                         break;
 621 
 622                 case ACPI_RSC_MOVE_SERIAL_VEN:
 623 
 624                         destination = (char *)ACPI_ADD_PTR(void, aml,
 625                                                            (aml_length -
 626                                                             item_count));
 627                         source = *(u8 **)source;
 628                         acpi_rs_move_data(destination, source, item_count,
 629                                           info->opcode);
 630                         break;
 631 
 632                 case ACPI_RSC_MOVE_SERIAL_RES:
 633 
 634                         destination = (char *)ACPI_ADD_PTR(void, aml,
 635                                                            (aml_length -
 636                                                             item_count));
 637                         source = *(u8 **)source;
 638                         acpi_rs_move_data(destination, source, item_count,
 639                                           info->opcode);
 640                         break;
 641 
 642                 case ACPI_RSC_ADDRESS:
 643 
 644                         /* Set the Resource Type, General Flags, and Type-Specific Flags */
 645 
 646                         acpi_rs_set_address_common(aml, resource);
 647                         break;
 648 
 649                 case ACPI_RSC_SOURCEX:
 650                         /*
 651                          * Optional resource_source (Index and String)
 652                          */
 653                         aml_length =
 654                             acpi_rs_set_resource_source(aml,
 655                                                         (acpi_rs_length)
 656                                                         aml_length, source);
 657                         acpi_rs_set_resource_length(aml_length, aml);
 658                         break;
 659 
 660                 case ACPI_RSC_SOURCE:
 661                         /*
 662                          * Optional resource_source (Index and String). This is the more
 663                          * complicated case used by the Interrupt() macro
 664                          */
 665                         aml_length =
 666                             acpi_rs_set_resource_source(aml, info->value,
 667                                                         source);
 668                         acpi_rs_set_resource_length(aml_length, aml);
 669                         break;
 670 
 671                 case ACPI_RSC_BITMASK:
 672                         /*
 673                          * 8-bit encoded bitmask (DMA macro)
 674                          */
 675                         ACPI_SET8(destination,
 676                                   acpi_rs_encode_bitmask(source,
 677                                                          *ACPI_ADD_PTR(u8,
 678                                                                        resource,
 679                                                                        info->
 680                                                                        value)));
 681                         break;
 682 
 683                 case ACPI_RSC_BITMASK16:
 684                         /*
 685                          * 16-bit encoded bitmask (IRQ macro)
 686                          */
 687                         temp16 =
 688                             acpi_rs_encode_bitmask(source,
 689                                                    *ACPI_ADD_PTR(u8, resource,
 690                                                                  info->value));
 691                         ACPI_MOVE_16_TO_16(destination, &temp16);
 692                         break;
 693 
 694                 case ACPI_RSC_EXIT_LE:
 695                         /*
 696                          * control - Exit conversion if less than or equal
 697                          */
 698                         if (item_count <= info->value) {
 699                                 goto exit;
 700                         }
 701                         break;
 702 
 703                 case ACPI_RSC_EXIT_NE:
 704                         /*
 705                          * control - Exit conversion if not equal
 706                          */
 707                         switch (COMPARE_OPCODE(info)) {
 708                         case ACPI_RSC_COMPARE_VALUE:
 709 
 710                                 if (*ACPI_ADD_PTR(u8, resource,
 711                                                   COMPARE_TARGET(info)) !=
 712                                     COMPARE_VALUE(info)) {
 713                                         goto exit;
 714                                 }
 715                                 break;
 716 
 717                         default:
 718 
 719                                 ACPI_ERROR((AE_INFO,
 720                                             "Invalid conversion sub-opcode"));
 721                                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 722                         }
 723                         break;
 724 
 725                 case ACPI_RSC_EXIT_EQ:
 726                         /*
 727                          * control - Exit conversion if equal
 728                          */
 729                         if (*ACPI_ADD_PTR(u8, resource,
 730                                           COMPARE_TARGET(info)) ==
 731                             COMPARE_VALUE(info)) {
 732                                 goto exit;
 733                         }
 734                         break;
 735 
 736                 default:
 737 
 738                         ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
 739                         return_ACPI_STATUS(AE_BAD_PARAMETER);
 740                 }
 741 
 742                 count--;
 743                 info++;
 744         }
 745 
 746 exit:
 747         return_ACPI_STATUS(AE_OK);
 748 }
 749 
 750 #if 0
 751 /* Previous resource validations */
 752 
 753 if (aml->ext_address64.revision_ID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION) {
 754         return_ACPI_STATUS(AE_SUPPORT);
 755 }
 756 
 757 if (resource->data.start_dpf.performance_robustness >= 3) {
 758         return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
 759 }
 760 
 761 if (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) {
 762         /*
 763          * Only [active_high, edge_sensitive] or [active_low, level_sensitive]
 764          * polarity/trigger interrupts are allowed (ACPI spec, section
 765          * "IRQ Format"), so 0x00 and 0x09 are illegal.
 766          */
 767         ACPI_ERROR((AE_INFO,
 768                     "Invalid interrupt polarity/trigger in resource list, 0x%X",
 769                     aml->irq.flags));
 770         return_ACPI_STATUS(AE_BAD_DATA);
 771 }
 772 
 773 resource->data.extended_irq.interrupt_count = temp8;
 774 if (temp8 < 1) {
 775 
 776         /* Must have at least one IRQ */
 777 
 778         return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
 779 }
 780 
 781 if (resource->data.dma.transfer == 0x03) {
 782         ACPI_ERROR((AE_INFO, "Invalid DMA.Transfer preference (3)"));
 783         return_ACPI_STATUS(AE_BAD_DATA);
 784 }
 785 #endif

/* [<][>][^][v][top][bottom][index][help] */