Merge branches 'acpi-video' and 'acpi-x86'
[sfrench/cifs-2.6.git] / drivers / acpi / acpica / rsmisc.c
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