PNP: make generic pnp_add_irq_resource()
[safe/jmp/linux-2.6] / drivers / pnp / pnpacpi / rsparser.c
1 /*
2  * pnpacpi -- PnP ACPI driver
3  *
4  * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
5  * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21 #include <linux/kernel.h>
22 #include <linux/acpi.h>
23 #include <linux/pci.h>
24 #include <linux/pnp.h>
25 #include "../base.h"
26 #include "pnpacpi.h"
27
28 #ifdef CONFIG_IA64
29 #define valid_IRQ(i) (1)
30 #else
31 #define valid_IRQ(i) (((i) != 0) && ((i) != 2))
32 #endif
33
34 /*
35  * Allocated Resources
36  */
37 static int irq_flags(int triggering, int polarity, int shareable)
38 {
39         int flags;
40
41         if (triggering == ACPI_LEVEL_SENSITIVE) {
42                 if (polarity == ACPI_ACTIVE_LOW)
43                         flags = IORESOURCE_IRQ_LOWLEVEL;
44                 else
45                         flags = IORESOURCE_IRQ_HIGHLEVEL;
46         } else {
47                 if (polarity == ACPI_ACTIVE_LOW)
48                         flags = IORESOURCE_IRQ_LOWEDGE;
49                 else
50                         flags = IORESOURCE_IRQ_HIGHEDGE;
51         }
52
53         if (shareable)
54                 flags |= IORESOURCE_IRQ_SHAREABLE;
55
56         return flags;
57 }
58
59 static void decode_irq_flags(int flag, int *triggering, int *polarity)
60 {
61         switch (flag) {
62         case IORESOURCE_IRQ_LOWLEVEL:
63                 *triggering = ACPI_LEVEL_SENSITIVE;
64                 *polarity = ACPI_ACTIVE_LOW;
65                 break;
66         case IORESOURCE_IRQ_HIGHLEVEL:
67                 *triggering = ACPI_LEVEL_SENSITIVE;
68                 *polarity = ACPI_ACTIVE_HIGH;
69                 break;
70         case IORESOURCE_IRQ_LOWEDGE:
71                 *triggering = ACPI_EDGE_SENSITIVE;
72                 *polarity = ACPI_ACTIVE_LOW;
73                 break;
74         case IORESOURCE_IRQ_HIGHEDGE:
75                 *triggering = ACPI_EDGE_SENSITIVE;
76                 *polarity = ACPI_ACTIVE_HIGH;
77                 break;
78         }
79 }
80
81 static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,
82                                                 u32 gsi, int triggering,
83                                                 int polarity, int shareable)
84 {
85         int irq, flags;
86         int p, t;
87
88         if (!valid_IRQ(gsi))
89                 return;
90
91         /*
92          * in IO-APIC mode, use overrided attribute. Two reasons:
93          * 1. BIOS bug in DSDT
94          * 2. BIOS uses IO-APIC mode Interrupt Source Override
95          */
96         if (!acpi_get_override_irq(gsi, &t, &p)) {
97                 t = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
98                 p = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
99
100                 if (triggering != t || polarity != p) {
101                         dev_warn(&dev->dev, "IRQ %d override to %s, %s\n",
102                                 gsi, t ? "edge":"level", p ? "low":"high");
103                         triggering = t;
104                         polarity = p;
105                 }
106         }
107
108         flags = irq_flags(triggering, polarity, shareable);
109         irq = acpi_register_gsi(gsi, triggering, polarity);
110         if (irq >= 0)
111                 pcibios_penalize_isa_irq(irq, 1);
112         else
113                 flags |= IORESOURCE_DISABLED;
114
115         pnp_add_irq_resource(dev, irq, flags);
116 }
117
118 static int dma_flags(int type, int bus_master, int transfer)
119 {
120         int flags = 0;
121
122         if (bus_master)
123                 flags |= IORESOURCE_DMA_MASTER;
124         switch (type) {
125         case ACPI_COMPATIBILITY:
126                 flags |= IORESOURCE_DMA_COMPATIBLE;
127                 break;
128         case ACPI_TYPE_A:
129                 flags |= IORESOURCE_DMA_TYPEA;
130                 break;
131         case ACPI_TYPE_B:
132                 flags |= IORESOURCE_DMA_TYPEB;
133                 break;
134         case ACPI_TYPE_F:
135                 flags |= IORESOURCE_DMA_TYPEF;
136                 break;
137         default:
138                 /* Set a default value ? */
139                 flags |= IORESOURCE_DMA_COMPATIBLE;
140                 pnp_err("Invalid DMA type");
141         }
142         switch (transfer) {
143         case ACPI_TRANSFER_8:
144                 flags |= IORESOURCE_DMA_8BIT;
145                 break;
146         case ACPI_TRANSFER_8_16:
147                 flags |= IORESOURCE_DMA_8AND16BIT;
148                 break;
149         case ACPI_TRANSFER_16:
150                 flags |= IORESOURCE_DMA_16BIT;
151                 break;
152         default:
153                 /* Set a default value ? */
154                 flags |= IORESOURCE_DMA_8AND16BIT;
155                 pnp_err("Invalid DMA transfer type");
156         }
157
158         return flags;
159 }
160
161 static void pnpacpi_parse_allocated_dmaresource(struct pnp_dev *dev,
162                                                 u32 dma, int flags)
163 {
164         struct resource *res;
165         int i;
166         static unsigned char warned;
167
168         for (i = 0; i < PNP_MAX_DMA; i++) {
169                 res = pnp_get_resource(dev, IORESOURCE_DMA, i);
170                 if (!pnp_resource_valid(res))
171                         break;
172         }
173         if (i < PNP_MAX_DMA) {
174                 res->flags = IORESOURCE_DMA;    // Also clears _UNSET flag
175                 res->flags |= flags;
176                 if (dma == -1) {
177                         res->flags |= IORESOURCE_DISABLED;
178                         return;
179                 }
180                 res->start = dma;
181                 res->end = dma;
182         } else if (!warned) {
183                 printk(KERN_WARNING "pnpacpi: exceeded the max number of DMA "
184                                 "resources: %d \n", PNP_MAX_DMA);
185                 warned = 1;
186         }
187 }
188
189 static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev,
190                                                u64 io, u64 len, int io_decode)
191 {
192         struct resource *res;
193         int i;
194         static unsigned char warned;
195
196         for (i = 0; i < PNP_MAX_PORT; i++) {
197                 res = pnp_get_resource(dev, IORESOURCE_IO, i);
198                 if (!pnp_resource_valid(res))
199                         break;
200         }
201         if (i < PNP_MAX_PORT) {
202                 res->flags = IORESOURCE_IO;     // Also clears _UNSET flag
203                 if (io_decode == ACPI_DECODE_16)
204                         res->flags |= PNP_PORT_FLAG_16BITADDR;
205                 if (len <= 0 || (io + len - 1) >= 0x10003) {
206                         res->flags |= IORESOURCE_DISABLED;
207                         return;
208                 }
209                 res->start = io;
210                 res->end = io + len - 1;
211         } else if (!warned) {
212                 printk(KERN_WARNING "pnpacpi: exceeded the max number of IO "
213                                 "resources: %d \n", PNP_MAX_PORT);
214                 warned = 1;
215         }
216 }
217
218 static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev,
219                                                 u64 mem, u64 len,
220                                                 int write_protect)
221 {
222         struct resource *res;
223         int i;
224         static unsigned char warned;
225
226         for (i = 0; i < PNP_MAX_MEM; i++) {
227                 res = pnp_get_resource(dev, IORESOURCE_MEM, i);
228                 if (!pnp_resource_valid(res))
229                         break;
230         }
231         if (i < PNP_MAX_MEM) {
232                 res->flags = IORESOURCE_MEM;    // Also clears _UNSET flag
233                 if (len <= 0) {
234                         res->flags |= IORESOURCE_DISABLED;
235                         return;
236                 }
237                 if (write_protect == ACPI_READ_WRITE_MEMORY)
238                         res->flags |= IORESOURCE_MEM_WRITEABLE;
239
240                 res->start = mem;
241                 res->end = mem + len - 1;
242         } else if (!warned) {
243                 printk(KERN_WARNING "pnpacpi: exceeded the max number of mem "
244                                 "resources: %d\n", PNP_MAX_MEM);
245                 warned = 1;
246         }
247 }
248
249 static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
250                                                   struct acpi_resource *res)
251 {
252         struct acpi_resource_address64 addr, *p = &addr;
253         acpi_status status;
254
255         status = acpi_resource_to_address64(res, p);
256         if (!ACPI_SUCCESS(status)) {
257                 dev_warn(&dev->dev, "failed to convert resource type %d\n",
258                          res->type);
259                 return;
260         }
261
262         if (p->producer_consumer == ACPI_PRODUCER)
263                 return;
264
265         if (p->resource_type == ACPI_MEMORY_RANGE)
266                 pnpacpi_parse_allocated_memresource(dev,
267                         p->minimum, p->address_length,
268                         p->info.mem.write_protect);
269         else if (p->resource_type == ACPI_IO_RANGE)
270                 pnpacpi_parse_allocated_ioresource(dev,
271                         p->minimum, p->address_length,
272                         p->granularity == 0xfff ? ACPI_DECODE_10 :
273                                 ACPI_DECODE_16);
274 }
275
276 static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
277                                               void *data)
278 {
279         struct pnp_dev *dev = data;
280         struct acpi_resource_irq *irq;
281         struct acpi_resource_dma *dma;
282         struct acpi_resource_io *io;
283         struct acpi_resource_fixed_io *fixed_io;
284         struct acpi_resource_memory24 *memory24;
285         struct acpi_resource_memory32 *memory32;
286         struct acpi_resource_fixed_memory32 *fixed_memory32;
287         struct acpi_resource_extended_irq *extended_irq;
288         int i;
289
290         switch (res->type) {
291         case ACPI_RESOURCE_TYPE_IRQ:
292                 /*
293                  * Per spec, only one interrupt per descriptor is allowed in
294                  * _CRS, but some firmware violates this, so parse them all.
295                  */
296                 irq = &res->data.irq;
297                 for (i = 0; i < irq->interrupt_count; i++) {
298                         pnpacpi_parse_allocated_irqresource(dev,
299                                 irq->interrupts[i],
300                                 irq->triggering,
301                                 irq->polarity,
302                                 irq->sharable);
303                 }
304                 break;
305
306         case ACPI_RESOURCE_TYPE_DMA:
307                 dma = &res->data.dma;
308                 if (dma->channel_count > 0)
309                         pnpacpi_parse_allocated_dmaresource(dev,
310                                 dma->channels[0],
311                                 dma_flags(dma->type, dma->bus_master,
312                                           dma->transfer));
313                 break;
314
315         case ACPI_RESOURCE_TYPE_IO:
316                 io = &res->data.io;
317                 pnpacpi_parse_allocated_ioresource(dev,
318                         io->minimum,
319                         io->address_length,
320                         io->io_decode);
321                 break;
322
323         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
324         case ACPI_RESOURCE_TYPE_END_DEPENDENT:
325                 break;
326
327         case ACPI_RESOURCE_TYPE_FIXED_IO:
328                 fixed_io = &res->data.fixed_io;
329                 pnpacpi_parse_allocated_ioresource(dev,
330                         fixed_io->address,
331                         fixed_io->address_length,
332                         ACPI_DECODE_10);
333                 break;
334
335         case ACPI_RESOURCE_TYPE_VENDOR:
336                 break;
337
338         case ACPI_RESOURCE_TYPE_END_TAG:
339                 break;
340
341         case ACPI_RESOURCE_TYPE_MEMORY24:
342                 memory24 = &res->data.memory24;
343                 pnpacpi_parse_allocated_memresource(dev,
344                         memory24->minimum,
345                         memory24->address_length,
346                         memory24->write_protect);
347                 break;
348         case ACPI_RESOURCE_TYPE_MEMORY32:
349                 memory32 = &res->data.memory32;
350                 pnpacpi_parse_allocated_memresource(dev,
351                         memory32->minimum,
352                         memory32->address_length,
353                         memory32->write_protect);
354                 break;
355         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
356                 fixed_memory32 = &res->data.fixed_memory32;
357                 pnpacpi_parse_allocated_memresource(dev,
358                         fixed_memory32->address,
359                         fixed_memory32->address_length,
360                         fixed_memory32->write_protect);
361                 break;
362         case ACPI_RESOURCE_TYPE_ADDRESS16:
363         case ACPI_RESOURCE_TYPE_ADDRESS32:
364         case ACPI_RESOURCE_TYPE_ADDRESS64:
365                 pnpacpi_parse_allocated_address_space(dev, res);
366                 break;
367
368         case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
369                 if (res->data.ext_address64.producer_consumer == ACPI_PRODUCER)
370                         return AE_OK;
371                 break;
372
373         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
374                 extended_irq = &res->data.extended_irq;
375                 if (extended_irq->producer_consumer == ACPI_PRODUCER)
376                         return AE_OK;
377
378                 for (i = 0; i < extended_irq->interrupt_count; i++) {
379                         pnpacpi_parse_allocated_irqresource(dev,
380                                 extended_irq->interrupts[i],
381                                 extended_irq->triggering,
382                                 extended_irq->polarity,
383                                 extended_irq->sharable);
384                 }
385                 break;
386
387         case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
388                 break;
389
390         default:
391                 dev_warn(&dev->dev, "unknown resource type %d in _CRS\n",
392                          res->type);
393                 return AE_ERROR;
394         }
395
396         return AE_OK;
397 }
398
399 acpi_status pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
400 {
401         acpi_handle handle = dev->data;
402
403         dev_dbg(&dev->dev, "parse allocated resources\n");
404
405         pnp_init_resources(dev);
406
407         return acpi_walk_resources(handle, METHOD_NAME__CRS,
408                                    pnpacpi_allocated_resource, dev);
409 }
410
411 static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
412                                             struct pnp_option *option,
413                                             struct acpi_resource_dma *p)
414 {
415         int i;
416         struct pnp_dma *dma;
417
418         if (p->channel_count == 0)
419                 return;
420         dma = kzalloc(sizeof(struct pnp_dma), GFP_KERNEL);
421         if (!dma)
422                 return;
423
424         for (i = 0; i < p->channel_count; i++)
425                 dma->map |= 1 << p->channels[i];
426
427         dma->flags = dma_flags(p->type, p->bus_master, p->transfer);
428
429         pnp_register_dma_resource(dev, option, dma);
430 }
431
432 static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
433                                             struct pnp_option *option,
434                                             struct acpi_resource_irq *p)
435 {
436         int i;
437         struct pnp_irq *irq;
438
439         if (p->interrupt_count == 0)
440                 return;
441         irq = kzalloc(sizeof(struct pnp_irq), GFP_KERNEL);
442         if (!irq)
443                 return;
444
445         for (i = 0; i < p->interrupt_count; i++)
446                 if (p->interrupts[i])
447                         __set_bit(p->interrupts[i], irq->map);
448         irq->flags = irq_flags(p->triggering, p->polarity, p->sharable);
449
450         pnp_register_irq_resource(dev, option, irq);
451 }
452
453 static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
454                                                 struct pnp_option *option,
455                                         struct acpi_resource_extended_irq *p)
456 {
457         int i;
458         struct pnp_irq *irq;
459
460         if (p->interrupt_count == 0)
461                 return;
462         irq = kzalloc(sizeof(struct pnp_irq), GFP_KERNEL);
463         if (!irq)
464                 return;
465
466         for (i = 0; i < p->interrupt_count; i++)
467                 if (p->interrupts[i])
468                         __set_bit(p->interrupts[i], irq->map);
469         irq->flags = irq_flags(p->triggering, p->polarity, p->sharable);
470
471         pnp_register_irq_resource(dev, option, irq);
472 }
473
474 static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
475                                              struct pnp_option *option,
476                                              struct acpi_resource_io *io)
477 {
478         struct pnp_port *port;
479
480         if (io->address_length == 0)
481                 return;
482         port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
483         if (!port)
484                 return;
485         port->min = io->minimum;
486         port->max = io->maximum;
487         port->align = io->alignment;
488         port->size = io->address_length;
489         port->flags = ACPI_DECODE_16 == io->io_decode ?
490             PNP_PORT_FLAG_16BITADDR : 0;
491         pnp_register_port_resource(dev, option, port);
492 }
493
494 static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev,
495                                                    struct pnp_option *option,
496                                         struct acpi_resource_fixed_io *io)
497 {
498         struct pnp_port *port;
499
500         if (io->address_length == 0)
501                 return;
502         port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
503         if (!port)
504                 return;
505         port->min = port->max = io->address;
506         port->size = io->address_length;
507         port->align = 0;
508         port->flags = PNP_PORT_FLAG_FIXED;
509         pnp_register_port_resource(dev, option, port);
510 }
511
512 static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
513                                               struct pnp_option *option,
514                                               struct acpi_resource_memory24 *p)
515 {
516         struct pnp_mem *mem;
517
518         if (p->address_length == 0)
519                 return;
520         mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
521         if (!mem)
522                 return;
523         mem->min = p->minimum;
524         mem->max = p->maximum;
525         mem->align = p->alignment;
526         mem->size = p->address_length;
527
528         mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
529             IORESOURCE_MEM_WRITEABLE : 0;
530
531         pnp_register_mem_resource(dev, option, mem);
532 }
533
534 static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
535                                               struct pnp_option *option,
536                                               struct acpi_resource_memory32 *p)
537 {
538         struct pnp_mem *mem;
539
540         if (p->address_length == 0)
541                 return;
542         mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
543         if (!mem)
544                 return;
545         mem->min = p->minimum;
546         mem->max = p->maximum;
547         mem->align = p->alignment;
548         mem->size = p->address_length;
549
550         mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
551             IORESOURCE_MEM_WRITEABLE : 0;
552
553         pnp_register_mem_resource(dev, option, mem);
554 }
555
556 static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
557                                                     struct pnp_option *option,
558                                         struct acpi_resource_fixed_memory32 *p)
559 {
560         struct pnp_mem *mem;
561
562         if (p->address_length == 0)
563                 return;
564         mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
565         if (!mem)
566                 return;
567         mem->min = mem->max = p->address;
568         mem->size = p->address_length;
569         mem->align = 0;
570
571         mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
572             IORESOURCE_MEM_WRITEABLE : 0;
573
574         pnp_register_mem_resource(dev, option, mem);
575 }
576
577 static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
578                                                 struct pnp_option *option,
579                                                 struct acpi_resource *r)
580 {
581         struct acpi_resource_address64 addr, *p = &addr;
582         acpi_status status;
583         struct pnp_mem *mem;
584         struct pnp_port *port;
585
586         status = acpi_resource_to_address64(r, p);
587         if (!ACPI_SUCCESS(status)) {
588                 pnp_warn("PnPACPI: failed to convert resource type %d",
589                          r->type);
590                 return;
591         }
592
593         if (p->address_length == 0)
594                 return;
595
596         if (p->resource_type == ACPI_MEMORY_RANGE) {
597                 mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
598                 if (!mem)
599                         return;
600                 mem->min = mem->max = p->minimum;
601                 mem->size = p->address_length;
602                 mem->align = 0;
603                 mem->flags = (p->info.mem.write_protect ==
604                               ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE
605                     : 0;
606                 pnp_register_mem_resource(dev, option, mem);
607         } else if (p->resource_type == ACPI_IO_RANGE) {
608                 port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
609                 if (!port)
610                         return;
611                 port->min = port->max = p->minimum;
612                 port->size = p->address_length;
613                 port->align = 0;
614                 port->flags = PNP_PORT_FLAG_FIXED;
615                 pnp_register_port_resource(dev, option, port);
616         }
617 }
618
619 struct acpipnp_parse_option_s {
620         struct pnp_option *option;
621         struct pnp_option *option_independent;
622         struct pnp_dev *dev;
623 };
624
625 static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
626                                                   void *data)
627 {
628         int priority = 0;
629         struct acpipnp_parse_option_s *parse_data = data;
630         struct pnp_dev *dev = parse_data->dev;
631         struct pnp_option *option = parse_data->option;
632
633         switch (res->type) {
634         case ACPI_RESOURCE_TYPE_IRQ:
635                 pnpacpi_parse_irq_option(dev, option, &res->data.irq);
636                 break;
637
638         case ACPI_RESOURCE_TYPE_DMA:
639                 pnpacpi_parse_dma_option(dev, option, &res->data.dma);
640                 break;
641
642         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
643                 switch (res->data.start_dpf.compatibility_priority) {
644                 case ACPI_GOOD_CONFIGURATION:
645                         priority = PNP_RES_PRIORITY_PREFERRED;
646                         break;
647
648                 case ACPI_ACCEPTABLE_CONFIGURATION:
649                         priority = PNP_RES_PRIORITY_ACCEPTABLE;
650                         break;
651
652                 case ACPI_SUB_OPTIMAL_CONFIGURATION:
653                         priority = PNP_RES_PRIORITY_FUNCTIONAL;
654                         break;
655                 default:
656                         priority = PNP_RES_PRIORITY_INVALID;
657                         break;
658                 }
659                 /* TBD: Consider performance/robustness bits */
660                 option = pnp_register_dependent_option(dev, priority);
661                 if (!option)
662                         return AE_ERROR;
663                 parse_data->option = option;
664                 break;
665
666         case ACPI_RESOURCE_TYPE_END_DEPENDENT:
667                 /*only one EndDependentFn is allowed */
668                 if (!parse_data->option_independent) {
669                         dev_warn(&dev->dev, "more than one EndDependentFn "
670                                  "in _PRS\n");
671                         return AE_ERROR;
672                 }
673                 parse_data->option = parse_data->option_independent;
674                 parse_data->option_independent = NULL;
675                 dev_dbg(&dev->dev, "end dependent options\n");
676                 break;
677
678         case ACPI_RESOURCE_TYPE_IO:
679                 pnpacpi_parse_port_option(dev, option, &res->data.io);
680                 break;
681
682         case ACPI_RESOURCE_TYPE_FIXED_IO:
683                 pnpacpi_parse_fixed_port_option(dev, option,
684                                                 &res->data.fixed_io);
685                 break;
686
687         case ACPI_RESOURCE_TYPE_VENDOR:
688         case ACPI_RESOURCE_TYPE_END_TAG:
689                 break;
690
691         case ACPI_RESOURCE_TYPE_MEMORY24:
692                 pnpacpi_parse_mem24_option(dev, option, &res->data.memory24);
693                 break;
694
695         case ACPI_RESOURCE_TYPE_MEMORY32:
696                 pnpacpi_parse_mem32_option(dev, option, &res->data.memory32);
697                 break;
698
699         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
700                 pnpacpi_parse_fixed_mem32_option(dev, option,
701                                                  &res->data.fixed_memory32);
702                 break;
703
704         case ACPI_RESOURCE_TYPE_ADDRESS16:
705         case ACPI_RESOURCE_TYPE_ADDRESS32:
706         case ACPI_RESOURCE_TYPE_ADDRESS64:
707                 pnpacpi_parse_address_option(dev, option, res);
708                 break;
709
710         case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
711                 break;
712
713         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
714                 pnpacpi_parse_ext_irq_option(dev, option,
715                                              &res->data.extended_irq);
716                 break;
717
718         case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
719                 break;
720
721         default:
722                 dev_warn(&dev->dev, "unknown resource type %d in _PRS\n",
723                          res->type);
724                 return AE_ERROR;
725         }
726
727         return AE_OK;
728 }
729
730 acpi_status __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
731 {
732         acpi_handle handle = dev->data;
733         acpi_status status;
734         struct acpipnp_parse_option_s parse_data;
735
736         dev_dbg(&dev->dev, "parse resource options\n");
737
738         parse_data.option = pnp_register_independent_option(dev);
739         if (!parse_data.option)
740                 return AE_ERROR;
741         parse_data.option_independent = parse_data.option;
742         parse_data.dev = dev;
743         status = acpi_walk_resources(handle, METHOD_NAME__PRS,
744                                      pnpacpi_option_resource, &parse_data);
745
746         return status;
747 }
748
749 static int pnpacpi_supported_resource(struct acpi_resource *res)
750 {
751         switch (res->type) {
752         case ACPI_RESOURCE_TYPE_IRQ:
753         case ACPI_RESOURCE_TYPE_DMA:
754         case ACPI_RESOURCE_TYPE_IO:
755         case ACPI_RESOURCE_TYPE_FIXED_IO:
756         case ACPI_RESOURCE_TYPE_MEMORY24:
757         case ACPI_RESOURCE_TYPE_MEMORY32:
758         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
759         case ACPI_RESOURCE_TYPE_ADDRESS16:
760         case ACPI_RESOURCE_TYPE_ADDRESS32:
761         case ACPI_RESOURCE_TYPE_ADDRESS64:
762         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
763                 return 1;
764         }
765         return 0;
766 }
767
768 /*
769  * Set resource
770  */
771 static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
772                                            void *data)
773 {
774         int *res_cnt = data;
775
776         if (pnpacpi_supported_resource(res))
777                 (*res_cnt)++;
778         return AE_OK;
779 }
780
781 static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data)
782 {
783         struct acpi_resource **resource = data;
784
785         if (pnpacpi_supported_resource(res)) {
786                 (*resource)->type = res->type;
787                 (*resource)->length = sizeof(struct acpi_resource);
788                 (*resource)++;
789         }
790
791         return AE_OK;
792 }
793
794 int pnpacpi_build_resource_template(struct pnp_dev *dev,
795                                     struct acpi_buffer *buffer)
796 {
797         acpi_handle handle = dev->data;
798         struct acpi_resource *resource;
799         int res_cnt = 0;
800         acpi_status status;
801
802         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
803                                      pnpacpi_count_resources, &res_cnt);
804         if (ACPI_FAILURE(status)) {
805                 dev_err(&dev->dev, "can't evaluate _CRS\n");
806                 return -EINVAL;
807         }
808         if (!res_cnt)
809                 return -EINVAL;
810         buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;
811         buffer->pointer = kzalloc(buffer->length - 1, GFP_KERNEL);
812         if (!buffer->pointer)
813                 return -ENOMEM;
814
815         resource = (struct acpi_resource *)buffer->pointer;
816         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
817                                      pnpacpi_type_resources, &resource);
818         if (ACPI_FAILURE(status)) {
819                 kfree(buffer->pointer);
820                 dev_err(&dev->dev, "can't evaluate _CRS\n");
821                 return -EINVAL;
822         }
823         /* resource will pointer the end resource now */
824         resource->type = ACPI_RESOURCE_TYPE_END_TAG;
825
826         return 0;
827 }
828
829 static void pnpacpi_encode_irq(struct pnp_dev *dev,
830                                struct acpi_resource *resource,
831                                struct resource *p)
832 {
833         struct acpi_resource_irq *irq = &resource->data.irq;
834         int triggering, polarity;
835
836         decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
837         irq->triggering = triggering;
838         irq->polarity = polarity;
839         if (triggering == ACPI_EDGE_SENSITIVE)
840                 irq->sharable = ACPI_EXCLUSIVE;
841         else
842                 irq->sharable = ACPI_SHARED;
843         irq->interrupt_count = 1;
844         irq->interrupts[0] = p->start;
845
846         dev_dbg(&dev->dev, "  encode irq %d %s %s %s\n", (int) p->start,
847                 triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
848                 polarity == ACPI_ACTIVE_LOW ? "low" : "high",
849                 irq->sharable == ACPI_SHARED ? "shared" : "exclusive");
850 }
851
852 static void pnpacpi_encode_ext_irq(struct pnp_dev *dev,
853                                    struct acpi_resource *resource,
854                                    struct resource *p)
855 {
856         struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
857         int triggering, polarity;
858
859         decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
860         extended_irq->producer_consumer = ACPI_CONSUMER;
861         extended_irq->triggering = triggering;
862         extended_irq->polarity = polarity;
863         if (triggering == ACPI_EDGE_SENSITIVE)
864                 extended_irq->sharable = ACPI_EXCLUSIVE;
865         else
866                 extended_irq->sharable = ACPI_SHARED;
867         extended_irq->interrupt_count = 1;
868         extended_irq->interrupts[0] = p->start;
869
870         dev_dbg(&dev->dev, "  encode irq %d %s %s %s\n", (int) p->start,
871                 triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
872                 polarity == ACPI_ACTIVE_LOW ? "low" : "high",
873                 extended_irq->sharable == ACPI_SHARED ? "shared" : "exclusive");
874 }
875
876 static void pnpacpi_encode_dma(struct pnp_dev *dev,
877                                struct acpi_resource *resource,
878                                struct resource *p)
879 {
880         struct acpi_resource_dma *dma = &resource->data.dma;
881
882         /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
883         switch (p->flags & IORESOURCE_DMA_SPEED_MASK) {
884         case IORESOURCE_DMA_TYPEA:
885                 dma->type = ACPI_TYPE_A;
886                 break;
887         case IORESOURCE_DMA_TYPEB:
888                 dma->type = ACPI_TYPE_B;
889                 break;
890         case IORESOURCE_DMA_TYPEF:
891                 dma->type = ACPI_TYPE_F;
892                 break;
893         default:
894                 dma->type = ACPI_COMPATIBILITY;
895         }
896
897         switch (p->flags & IORESOURCE_DMA_TYPE_MASK) {
898         case IORESOURCE_DMA_8BIT:
899                 dma->transfer = ACPI_TRANSFER_8;
900                 break;
901         case IORESOURCE_DMA_8AND16BIT:
902                 dma->transfer = ACPI_TRANSFER_8_16;
903                 break;
904         default:
905                 dma->transfer = ACPI_TRANSFER_16;
906         }
907
908         dma->bus_master = !!(p->flags & IORESOURCE_DMA_MASTER);
909         dma->channel_count = 1;
910         dma->channels[0] = p->start;
911
912         dev_dbg(&dev->dev, "  encode dma %d "
913                 "type %#x transfer %#x master %d\n",
914                 (int) p->start, dma->type, dma->transfer, dma->bus_master);
915 }
916
917 static void pnpacpi_encode_io(struct pnp_dev *dev,
918                               struct acpi_resource *resource,
919                               struct resource *p)
920 {
921         struct acpi_resource_io *io = &resource->data.io;
922
923         /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */
924         io->io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR) ?
925             ACPI_DECODE_16 : ACPI_DECODE_10;
926         io->minimum = p->start;
927         io->maximum = p->end;
928         io->alignment = 0;      /* Correct? */
929         io->address_length = p->end - p->start + 1;
930
931         dev_dbg(&dev->dev, "  encode io %#llx-%#llx decode %#x\n",
932                 (unsigned long long) p->start, (unsigned long long) p->end,
933                 io->io_decode);
934 }
935
936 static void pnpacpi_encode_fixed_io(struct pnp_dev *dev,
937                                     struct acpi_resource *resource,
938                                     struct resource *p)
939 {
940         struct acpi_resource_fixed_io *fixed_io = &resource->data.fixed_io;
941
942         fixed_io->address = p->start;
943         fixed_io->address_length = p->end - p->start + 1;
944
945         dev_dbg(&dev->dev, "  encode fixed_io %#llx-%#llx\n",
946                 (unsigned long long) p->start, (unsigned long long) p->end);
947 }
948
949 static void pnpacpi_encode_mem24(struct pnp_dev *dev,
950                                  struct acpi_resource *resource,
951                                  struct resource *p)
952 {
953         struct acpi_resource_memory24 *memory24 = &resource->data.memory24;
954
955         /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */
956         memory24->write_protect =
957             (p->flags & IORESOURCE_MEM_WRITEABLE) ?
958             ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
959         memory24->minimum = p->start;
960         memory24->maximum = p->end;
961         memory24->alignment = 0;
962         memory24->address_length = p->end - p->start + 1;
963
964         dev_dbg(&dev->dev, "  encode mem24 %#llx-%#llx write_protect %#x\n",
965                 (unsigned long long) p->start, (unsigned long long) p->end,
966                 memory24->write_protect);
967 }
968
969 static void pnpacpi_encode_mem32(struct pnp_dev *dev,
970                                  struct acpi_resource *resource,
971                                  struct resource *p)
972 {
973         struct acpi_resource_memory32 *memory32 = &resource->data.memory32;
974
975         memory32->write_protect =
976             (p->flags & IORESOURCE_MEM_WRITEABLE) ?
977             ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
978         memory32->minimum = p->start;
979         memory32->maximum = p->end;
980         memory32->alignment = 0;
981         memory32->address_length = p->end - p->start + 1;
982
983         dev_dbg(&dev->dev, "  encode mem32 %#llx-%#llx write_protect %#x\n",
984                 (unsigned long long) p->start, (unsigned long long) p->end,
985                 memory32->write_protect);
986 }
987
988 static void pnpacpi_encode_fixed_mem32(struct pnp_dev *dev,
989                                        struct acpi_resource *resource,
990                                        struct resource *p)
991 {
992         struct acpi_resource_fixed_memory32 *fixed_memory32 = &resource->data.fixed_memory32;
993
994         fixed_memory32->write_protect =
995             (p->flags & IORESOURCE_MEM_WRITEABLE) ?
996             ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
997         fixed_memory32->address = p->start;
998         fixed_memory32->address_length = p->end - p->start + 1;
999
1000         dev_dbg(&dev->dev, "  encode fixed_mem32 %#llx-%#llx "
1001                 "write_protect %#x\n",
1002                 (unsigned long long) p->start, (unsigned long long) p->end,
1003                 fixed_memory32->write_protect);
1004 }
1005
1006 int pnpacpi_encode_resources(struct pnp_dev *dev, struct acpi_buffer *buffer)
1007 {
1008         int i = 0;
1009         /* pnpacpi_build_resource_template allocates extra mem */
1010         int res_cnt = (buffer->length - 1) / sizeof(struct acpi_resource) - 1;
1011         struct acpi_resource *resource = buffer->pointer;
1012         int port = 0, irq = 0, dma = 0, mem = 0;
1013
1014         dev_dbg(&dev->dev, "encode %d resources\n", res_cnt);
1015         while (i < res_cnt) {
1016                 switch (resource->type) {
1017                 case ACPI_RESOURCE_TYPE_IRQ:
1018                         pnpacpi_encode_irq(dev, resource,
1019                                pnp_get_resource(dev, IORESOURCE_IRQ, irq));
1020                         irq++;
1021                         break;
1022
1023                 case ACPI_RESOURCE_TYPE_DMA:
1024                         pnpacpi_encode_dma(dev, resource,
1025                                 pnp_get_resource(dev, IORESOURCE_DMA, dma));
1026                         dma++;
1027                         break;
1028                 case ACPI_RESOURCE_TYPE_IO:
1029                         pnpacpi_encode_io(dev, resource,
1030                                 pnp_get_resource(dev, IORESOURCE_IO, port));
1031                         port++;
1032                         break;
1033                 case ACPI_RESOURCE_TYPE_FIXED_IO:
1034                         pnpacpi_encode_fixed_io(dev, resource,
1035                                 pnp_get_resource(dev, IORESOURCE_IO, port));
1036                         port++;
1037                         break;
1038                 case ACPI_RESOURCE_TYPE_MEMORY24:
1039                         pnpacpi_encode_mem24(dev, resource,
1040                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
1041                         mem++;
1042                         break;
1043                 case ACPI_RESOURCE_TYPE_MEMORY32:
1044                         pnpacpi_encode_mem32(dev, resource,
1045                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
1046                         mem++;
1047                         break;
1048                 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
1049                         pnpacpi_encode_fixed_mem32(dev, resource,
1050                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
1051                         mem++;
1052                         break;
1053                 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
1054                         pnpacpi_encode_ext_irq(dev, resource,
1055                                 pnp_get_resource(dev, IORESOURCE_IRQ, irq));
1056                         irq++;
1057                         break;
1058                 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
1059                 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
1060                 case ACPI_RESOURCE_TYPE_VENDOR:
1061                 case ACPI_RESOURCE_TYPE_END_TAG:
1062                 case ACPI_RESOURCE_TYPE_ADDRESS16:
1063                 case ACPI_RESOURCE_TYPE_ADDRESS32:
1064                 case ACPI_RESOURCE_TYPE_ADDRESS64:
1065                 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
1066                 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
1067                 default:        /* other type */
1068                         dev_warn(&dev->dev, "can't encode unknown resource "
1069                                  "type %d\n", resource->type);
1070                         return -EINVAL;
1071                 }
1072                 resource++;
1073                 i++;
1074         }
1075         return 0;
1076 }