GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / pnp / pnpacpi / rsparser.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * pnpacpi -- PnP ACPI driver
4  *
5  * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
6  * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
7  * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
8  *      Bjorn Helgaas <bjorn.helgaas@hp.com>
9  */
10 #include <linux/kernel.h>
11 #include <linux/acpi.h>
12 #include <linux/pci.h>
13 #include <linux/pnp.h>
14 #include <linux/slab.h>
15 #include "../base.h"
16 #include "pnpacpi.h"
17
18 static void decode_irq_flags(struct pnp_dev *dev, int flags, u8 *triggering,
19                              u8 *polarity, u8 *shareable)
20 {
21         switch (flags & (IORESOURCE_IRQ_LOWLEVEL | IORESOURCE_IRQ_HIGHLEVEL |
22                          IORESOURCE_IRQ_LOWEDGE  | IORESOURCE_IRQ_HIGHEDGE)) {
23         case IORESOURCE_IRQ_LOWLEVEL:
24                 *triggering = ACPI_LEVEL_SENSITIVE;
25                 *polarity = ACPI_ACTIVE_LOW;
26                 break;
27         case IORESOURCE_IRQ_HIGHLEVEL:
28                 *triggering = ACPI_LEVEL_SENSITIVE;
29                 *polarity = ACPI_ACTIVE_HIGH;
30                 break;
31         case IORESOURCE_IRQ_LOWEDGE:
32                 *triggering = ACPI_EDGE_SENSITIVE;
33                 *polarity = ACPI_ACTIVE_LOW;
34                 break;
35         case IORESOURCE_IRQ_HIGHEDGE:
36                 *triggering = ACPI_EDGE_SENSITIVE;
37                 *polarity = ACPI_ACTIVE_HIGH;
38                 break;
39         default:
40                 dev_err(&dev->dev, "can't encode invalid IRQ mode %#x\n",
41                         flags);
42                 *triggering = ACPI_EDGE_SENSITIVE;
43                 *polarity = ACPI_ACTIVE_HIGH;
44                 break;
45         }
46
47         if (flags & IORESOURCE_IRQ_SHAREABLE)
48                 *shareable = ACPI_SHARED;
49         else
50                 *shareable = ACPI_EXCLUSIVE;
51 }
52
53 static int dma_flags(struct pnp_dev *dev, int type, int bus_master,
54                      int transfer)
55 {
56         int flags = 0;
57
58         if (bus_master)
59                 flags |= IORESOURCE_DMA_MASTER;
60         switch (type) {
61         case ACPI_COMPATIBILITY:
62                 flags |= IORESOURCE_DMA_COMPATIBLE;
63                 break;
64         case ACPI_TYPE_A:
65                 flags |= IORESOURCE_DMA_TYPEA;
66                 break;
67         case ACPI_TYPE_B:
68                 flags |= IORESOURCE_DMA_TYPEB;
69                 break;
70         case ACPI_TYPE_F:
71                 flags |= IORESOURCE_DMA_TYPEF;
72                 break;
73         default:
74                 /* Set a default value ? */
75                 flags |= IORESOURCE_DMA_COMPATIBLE;
76                 dev_err(&dev->dev, "invalid DMA type %d\n", type);
77         }
78         switch (transfer) {
79         case ACPI_TRANSFER_8:
80                 flags |= IORESOURCE_DMA_8BIT;
81                 break;
82         case ACPI_TRANSFER_8_16:
83                 flags |= IORESOURCE_DMA_8AND16BIT;
84                 break;
85         case ACPI_TRANSFER_16:
86                 flags |= IORESOURCE_DMA_16BIT;
87                 break;
88         default:
89                 /* Set a default value ? */
90                 flags |= IORESOURCE_DMA_8AND16BIT;
91                 dev_err(&dev->dev, "invalid DMA transfer type %d\n", transfer);
92         }
93
94         return flags;
95 }
96
97 /*
98  * Allocated Resources
99  */
100
101 static void pnpacpi_add_irqresource(struct pnp_dev *dev, struct resource *r)
102 {
103         if (!(r->flags & IORESOURCE_DISABLED))
104                 pcibios_penalize_isa_irq(r->start, 1);
105
106         pnp_add_resource(dev, r);
107 }
108
109 /*
110  * Device CSRs that do not appear in PCI config space should be described
111  * via ACPI.  This would normally be done with Address Space Descriptors
112  * marked as "consumer-only," but old versions of Windows and Linux ignore
113  * the producer/consumer flag, so HP invented a vendor-defined resource to
114  * describe the location and size of CSR space.
115  */
116 static struct acpi_vendor_uuid hp_ccsr_uuid = {
117         .subtype = 2,
118         .data = { 0xf9, 0xad, 0xe9, 0x69, 0x4f, 0x92, 0x5f, 0xab, 0xf6, 0x4a,
119             0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad },
120 };
121
122 static int vendor_resource_matches(struct pnp_dev *dev,
123                                    struct acpi_resource_vendor_typed *vendor,
124                                    struct acpi_vendor_uuid *match,
125                                    int expected_len)
126 {
127         int uuid_len = sizeof(vendor->uuid);
128         u8 uuid_subtype = vendor->uuid_subtype;
129         u8 *uuid = vendor->uuid;
130         int actual_len;
131
132         /* byte_length includes uuid_subtype and uuid */
133         actual_len = vendor->byte_length - uuid_len - 1;
134
135         if (uuid_subtype == match->subtype &&
136             uuid_len == sizeof(match->data) &&
137             memcmp(uuid, match->data, uuid_len) == 0) {
138                 if (expected_len && expected_len != actual_len) {
139                         dev_err(&dev->dev,
140                                 "wrong vendor descriptor size; expected %d, found %d bytes\n",
141                                 expected_len, actual_len);
142                         return 0;
143                 }
144
145                 return 1;
146         }
147
148         return 0;
149 }
150
151 static void pnpacpi_parse_allocated_vendor(struct pnp_dev *dev,
152                                     struct acpi_resource_vendor_typed *vendor)
153 {
154         struct { u64 start, length; } range;
155
156         if (vendor_resource_matches(dev, vendor, &hp_ccsr_uuid,
157                                     sizeof(range))) {
158                 memcpy(&range, vendor->byte_data, sizeof(range));
159                 pnp_add_mem_resource(dev, range.start, range.start +
160                                      range.length - 1, 0);
161         }
162 }
163
164 static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
165                                               void *data)
166 {
167         struct pnp_dev *dev = data;
168         struct acpi_resource_dma *dma;
169         struct acpi_resource_vendor_typed *vendor_typed;
170         struct acpi_resource_gpio *gpio;
171         struct resource_win win = {{0}, 0};
172         struct resource *r = &win.res;
173         int i, flags;
174
175         if (acpi_dev_resource_address_space(res, &win)
176             || acpi_dev_resource_ext_address_space(res, &win)) {
177                 pnp_add_resource(dev, &win.res);
178                 return AE_OK;
179         }
180
181         r->flags = 0;
182         if (acpi_dev_resource_interrupt(res, 0, r)) {
183                 pnpacpi_add_irqresource(dev, r);
184                 for (i = 1; acpi_dev_resource_interrupt(res, i, r); i++)
185                         pnpacpi_add_irqresource(dev, r);
186
187                 if (i > 1) {
188                         /*
189                          * The IRQ encoder puts a single interrupt in each
190                          * descriptor, so if a _CRS descriptor has more than
191                          * one interrupt, we won't be able to re-encode it.
192                          */
193                         if (pnp_can_write(dev)) {
194                                 dev_warn(&dev->dev,
195                                          "multiple interrupts in _CRS descriptor; configuration can't be changed\n");
196                                 dev->capabilities &= ~PNP_WRITE;
197                         }
198                 }
199                 return AE_OK;
200         } else if (acpi_gpio_get_irq_resource(res, &gpio)) {
201                 /*
202                  * If the resource is GpioInt() type then extract the IRQ
203                  * from GPIO resource and fill it into IRQ resource type.
204                  */
205                 i = acpi_dev_gpio_irq_get(dev->data, 0);
206                 if (i >= 0) {
207                         flags = acpi_dev_irq_flags(gpio->triggering,
208                                                    gpio->polarity,
209                                                    gpio->shareable,
210                                                    gpio->wake_capable);
211                 } else {
212                         flags = IORESOURCE_DISABLED;
213                 }
214                 pnp_add_irq_resource(dev, i, flags);
215                 return AE_OK;
216         } else if (r->flags & IORESOURCE_DISABLED) {
217                 pnp_add_irq_resource(dev, 0, IORESOURCE_DISABLED);
218                 return AE_OK;
219         }
220
221         switch (res->type) {
222         case ACPI_RESOURCE_TYPE_MEMORY24:
223         case ACPI_RESOURCE_TYPE_MEMORY32:
224         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
225                 if (acpi_dev_resource_memory(res, r))
226                         pnp_add_resource(dev, r);
227                 break;
228         case ACPI_RESOURCE_TYPE_IO:
229         case ACPI_RESOURCE_TYPE_FIXED_IO:
230                 if (acpi_dev_resource_io(res, r))
231                         pnp_add_resource(dev, r);
232                 break;
233         case ACPI_RESOURCE_TYPE_DMA:
234                 dma = &res->data.dma;
235                 if (dma->channel_count > 0 && dma->channels[0] != (u8) -1)
236                         flags = dma_flags(dev, dma->type, dma->bus_master,
237                                           dma->transfer);
238                 else
239                         flags = IORESOURCE_DISABLED;
240                 pnp_add_dma_resource(dev, dma->channels[0], flags);
241                 break;
242
243         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
244         case ACPI_RESOURCE_TYPE_END_DEPENDENT:
245                 break;
246
247         case ACPI_RESOURCE_TYPE_VENDOR:
248                 vendor_typed = &res->data.vendor_typed;
249                 pnpacpi_parse_allocated_vendor(dev, vendor_typed);
250                 break;
251
252         case ACPI_RESOURCE_TYPE_END_TAG:
253                 break;
254
255         case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
256                 break;
257
258         case ACPI_RESOURCE_TYPE_SERIAL_BUS:
259                 /* serial bus connections (I2C/SPI/UART) are not pnp */
260                 break;
261
262         default:
263                 dev_warn(&dev->dev, "unknown resource type %d in _CRS\n",
264                          res->type);
265                 return AE_ERROR;
266         }
267
268         return AE_OK;
269 }
270
271 int pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
272 {
273         struct acpi_device *acpi_dev = dev->data;
274         acpi_handle handle = acpi_dev->handle;
275         acpi_status status;
276
277         pnp_dbg(&dev->dev, "parse allocated resources\n");
278
279         pnp_init_resources(dev);
280
281         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
282                                      pnpacpi_allocated_resource, dev);
283
284         if (ACPI_FAILURE(status)) {
285                 if (status != AE_NOT_FOUND)
286                         dev_err(&dev->dev, "can't evaluate _CRS: %d", status);
287                 return -EPERM;
288         }
289         return 0;
290 }
291
292 static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
293                                             unsigned int option_flags,
294                                             struct acpi_resource_dma *p)
295 {
296         int i;
297         unsigned char map = 0, flags;
298
299         for (i = 0; i < p->channel_count; i++)
300                 map |= 1 << p->channels[i];
301
302         flags = dma_flags(dev, p->type, p->bus_master, p->transfer);
303         pnp_register_dma_resource(dev, option_flags, map, flags);
304 }
305
306 static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
307                                             unsigned int option_flags,
308                                             struct acpi_resource_irq *p)
309 {
310         int i;
311         pnp_irq_mask_t map;
312         unsigned char flags;
313
314         bitmap_zero(map.bits, PNP_IRQ_NR);
315         for (i = 0; i < p->interrupt_count; i++)
316                 if (p->interrupts[i])
317                         __set_bit(p->interrupts[i], map.bits);
318
319         flags = acpi_dev_irq_flags(p->triggering, p->polarity, p->shareable, p->wake_capable);
320         pnp_register_irq_resource(dev, option_flags, &map, flags);
321 }
322
323 static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
324                                         unsigned int option_flags,
325                                         struct acpi_resource_extended_irq *p)
326 {
327         int i;
328         pnp_irq_mask_t map;
329         unsigned char flags;
330
331         bitmap_zero(map.bits, PNP_IRQ_NR);
332         for (i = 0; i < p->interrupt_count; i++) {
333                 if (p->interrupts[i]) {
334                         if (p->interrupts[i] < PNP_IRQ_NR)
335                                 __set_bit(p->interrupts[i], map.bits);
336                         else
337                                 dev_err(&dev->dev,
338                                         "ignoring IRQ %d option (too large for %d entry bitmap)\n",
339                                         p->interrupts[i], PNP_IRQ_NR);
340                 }
341         }
342
343         flags = acpi_dev_irq_flags(p->triggering, p->polarity, p->shareable, p->wake_capable);
344         pnp_register_irq_resource(dev, option_flags, &map, flags);
345 }
346
347 static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
348                                              unsigned int option_flags,
349                                              struct acpi_resource_io *io)
350 {
351         unsigned char flags = 0;
352
353         if (io->io_decode == ACPI_DECODE_16)
354                 flags = IORESOURCE_IO_16BIT_ADDR;
355         pnp_register_port_resource(dev, option_flags, io->minimum, io->maximum,
356                                    io->alignment, io->address_length, flags);
357 }
358
359 static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev,
360                                         unsigned int option_flags,
361                                         struct acpi_resource_fixed_io *io)
362 {
363         pnp_register_port_resource(dev, option_flags, io->address, io->address,
364                                    0, io->address_length, IORESOURCE_IO_FIXED);
365 }
366
367 static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
368                                               unsigned int option_flags,
369                                               struct acpi_resource_memory24 *p)
370 {
371         unsigned char flags = 0;
372
373         if (p->write_protect == ACPI_READ_WRITE_MEMORY)
374                 flags = IORESOURCE_MEM_WRITEABLE;
375         pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum,
376                                   p->alignment, p->address_length, flags);
377 }
378
379 static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
380                                               unsigned int option_flags,
381                                               struct acpi_resource_memory32 *p)
382 {
383         unsigned char flags = 0;
384
385         if (p->write_protect == ACPI_READ_WRITE_MEMORY)
386                 flags = IORESOURCE_MEM_WRITEABLE;
387         pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum,
388                                   p->alignment, p->address_length, flags);
389 }
390
391 static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
392                                         unsigned int option_flags,
393                                         struct acpi_resource_fixed_memory32 *p)
394 {
395         unsigned char flags = 0;
396
397         if (p->write_protect == ACPI_READ_WRITE_MEMORY)
398                 flags = IORESOURCE_MEM_WRITEABLE;
399         pnp_register_mem_resource(dev, option_flags, p->address, p->address,
400                                   0, p->address_length, flags);
401 }
402
403 static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
404                                                 unsigned int option_flags,
405                                                 struct acpi_resource *r)
406 {
407         struct acpi_resource_address64 addr, *p = &addr;
408         acpi_status status;
409         unsigned char flags = 0;
410
411         status = acpi_resource_to_address64(r, p);
412         if (ACPI_FAILURE(status)) {
413                 dev_warn(&dev->dev, "can't convert resource type %d\n",
414                          r->type);
415                 return;
416         }
417
418         if (p->resource_type == ACPI_MEMORY_RANGE) {
419                 if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY)
420                         flags = IORESOURCE_MEM_WRITEABLE;
421                 pnp_register_mem_resource(dev, option_flags, p->address.minimum,
422                                           p->address.minimum, 0, p->address.address_length,
423                                           flags);
424         } else if (p->resource_type == ACPI_IO_RANGE)
425                 pnp_register_port_resource(dev, option_flags, p->address.minimum,
426                                            p->address.minimum, 0, p->address.address_length,
427                                            IORESOURCE_IO_FIXED);
428 }
429
430 static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev,
431                                                     unsigned int option_flags,
432                                                     struct acpi_resource *r)
433 {
434         struct acpi_resource_extended_address64 *p = &r->data.ext_address64;
435         unsigned char flags = 0;
436
437         if (p->resource_type == ACPI_MEMORY_RANGE) {
438                 if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY)
439                         flags = IORESOURCE_MEM_WRITEABLE;
440                 pnp_register_mem_resource(dev, option_flags, p->address.minimum,
441                                           p->address.minimum, 0, p->address.address_length,
442                                           flags);
443         } else if (p->resource_type == ACPI_IO_RANGE)
444                 pnp_register_port_resource(dev, option_flags, p->address.minimum,
445                                            p->address.minimum, 0, p->address.address_length,
446                                            IORESOURCE_IO_FIXED);
447 }
448
449 struct acpipnp_parse_option_s {
450         struct pnp_dev *dev;
451         unsigned int option_flags;
452 };
453
454 static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
455                                                   void *data)
456 {
457         int priority;
458         struct acpipnp_parse_option_s *parse_data = data;
459         struct pnp_dev *dev = parse_data->dev;
460         unsigned int option_flags = parse_data->option_flags;
461
462         switch (res->type) {
463         case ACPI_RESOURCE_TYPE_IRQ:
464                 pnpacpi_parse_irq_option(dev, option_flags, &res->data.irq);
465                 break;
466
467         case ACPI_RESOURCE_TYPE_DMA:
468                 pnpacpi_parse_dma_option(dev, option_flags, &res->data.dma);
469                 break;
470
471         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
472                 switch (res->data.start_dpf.compatibility_priority) {
473                 case ACPI_GOOD_CONFIGURATION:
474                         priority = PNP_RES_PRIORITY_PREFERRED;
475                         break;
476
477                 case ACPI_ACCEPTABLE_CONFIGURATION:
478                         priority = PNP_RES_PRIORITY_ACCEPTABLE;
479                         break;
480
481                 case ACPI_SUB_OPTIMAL_CONFIGURATION:
482                         priority = PNP_RES_PRIORITY_FUNCTIONAL;
483                         break;
484                 default:
485                         priority = PNP_RES_PRIORITY_INVALID;
486                         break;
487                 }
488                 parse_data->option_flags = pnp_new_dependent_set(dev, priority);
489                 break;
490
491         case ACPI_RESOURCE_TYPE_END_DEPENDENT:
492                 parse_data->option_flags = 0;
493                 break;
494
495         case ACPI_RESOURCE_TYPE_IO:
496                 pnpacpi_parse_port_option(dev, option_flags, &res->data.io);
497                 break;
498
499         case ACPI_RESOURCE_TYPE_FIXED_IO:
500                 pnpacpi_parse_fixed_port_option(dev, option_flags,
501                                                 &res->data.fixed_io);
502                 break;
503
504         case ACPI_RESOURCE_TYPE_VENDOR:
505         case ACPI_RESOURCE_TYPE_END_TAG:
506                 break;
507
508         case ACPI_RESOURCE_TYPE_MEMORY24:
509                 pnpacpi_parse_mem24_option(dev, option_flags,
510                                            &res->data.memory24);
511                 break;
512
513         case ACPI_RESOURCE_TYPE_MEMORY32:
514                 pnpacpi_parse_mem32_option(dev, option_flags,
515                                            &res->data.memory32);
516                 break;
517
518         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
519                 pnpacpi_parse_fixed_mem32_option(dev, option_flags,
520                                                  &res->data.fixed_memory32);
521                 break;
522
523         case ACPI_RESOURCE_TYPE_ADDRESS16:
524         case ACPI_RESOURCE_TYPE_ADDRESS32:
525         case ACPI_RESOURCE_TYPE_ADDRESS64:
526                 pnpacpi_parse_address_option(dev, option_flags, res);
527                 break;
528
529         case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
530                 pnpacpi_parse_ext_address_option(dev, option_flags, res);
531                 break;
532
533         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
534                 pnpacpi_parse_ext_irq_option(dev, option_flags,
535                                              &res->data.extended_irq);
536                 break;
537
538         case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
539                 break;
540
541         default:
542                 dev_warn(&dev->dev, "unknown resource type %d in _PRS\n",
543                          res->type);
544                 return AE_ERROR;
545         }
546
547         return AE_OK;
548 }
549
550 int __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
551 {
552         struct acpi_device *acpi_dev = dev->data;
553         acpi_handle handle = acpi_dev->handle;
554         acpi_status status;
555         struct acpipnp_parse_option_s parse_data;
556
557         pnp_dbg(&dev->dev, "parse resource options\n");
558
559         parse_data.dev = dev;
560         parse_data.option_flags = 0;
561
562         status = acpi_walk_resources(handle, METHOD_NAME__PRS,
563                                      pnpacpi_option_resource, &parse_data);
564
565         if (ACPI_FAILURE(status)) {
566                 if (status != AE_NOT_FOUND)
567                         dev_err(&dev->dev, "can't evaluate _PRS: %d", status);
568                 return -EPERM;
569         }
570         return 0;
571 }
572
573 static int pnpacpi_supported_resource(struct acpi_resource *res)
574 {
575         switch (res->type) {
576         case ACPI_RESOURCE_TYPE_IRQ:
577         case ACPI_RESOURCE_TYPE_DMA:
578         case ACPI_RESOURCE_TYPE_IO:
579         case ACPI_RESOURCE_TYPE_FIXED_IO:
580         case ACPI_RESOURCE_TYPE_MEMORY24:
581         case ACPI_RESOURCE_TYPE_MEMORY32:
582         case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
583         case ACPI_RESOURCE_TYPE_ADDRESS16:
584         case ACPI_RESOURCE_TYPE_ADDRESS32:
585         case ACPI_RESOURCE_TYPE_ADDRESS64:
586         case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
587         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
588                 return 1;
589         }
590         return 0;
591 }
592
593 /*
594  * Set resource
595  */
596 static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
597                                            void *data)
598 {
599         int *res_cnt = data;
600
601         if (pnpacpi_supported_resource(res))
602                 (*res_cnt)++;
603         return AE_OK;
604 }
605
606 static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data)
607 {
608         struct acpi_resource **resource = data;
609
610         if (pnpacpi_supported_resource(res)) {
611                 (*resource)->type = res->type;
612                 (*resource)->length = sizeof(struct acpi_resource);
613                 if (res->type == ACPI_RESOURCE_TYPE_IRQ)
614                         (*resource)->data.irq.descriptor_length =
615                                         res->data.irq.descriptor_length;
616                 (*resource)++;
617         }
618
619         return AE_OK;
620 }
621
622 int pnpacpi_build_resource_template(struct pnp_dev *dev,
623                                     struct acpi_buffer *buffer)
624 {
625         struct acpi_device *acpi_dev = dev->data;
626         acpi_handle handle = acpi_dev->handle;
627         struct acpi_resource *resource;
628         int res_cnt = 0;
629         acpi_status status;
630
631         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
632                                      pnpacpi_count_resources, &res_cnt);
633         if (ACPI_FAILURE(status)) {
634                 dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
635                 return -EINVAL;
636         }
637         if (!res_cnt)
638                 return -EINVAL;
639         buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;
640         buffer->pointer = kzalloc(buffer->length - 1, GFP_KERNEL);
641         if (!buffer->pointer)
642                 return -ENOMEM;
643
644         resource = (struct acpi_resource *)buffer->pointer;
645         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
646                                      pnpacpi_type_resources, &resource);
647         if (ACPI_FAILURE(status)) {
648                 kfree(buffer->pointer);
649                 dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
650                 return -EINVAL;
651         }
652         /* resource will pointer the end resource now */
653         resource->type = ACPI_RESOURCE_TYPE_END_TAG;
654         resource->length = sizeof(struct acpi_resource);
655
656         return 0;
657 }
658
659 static void pnpacpi_encode_irq(struct pnp_dev *dev,
660                                struct acpi_resource *resource,
661                                struct resource *p)
662 {
663         struct acpi_resource_irq *irq = &resource->data.irq;
664         u8 triggering, polarity, shareable;
665
666         if (!pnp_resource_enabled(p)) {
667                 irq->interrupt_count = 0;
668                 pnp_dbg(&dev->dev, "  encode irq (%s)\n",
669                         p ? "disabled" : "missing");
670                 return;
671         }
672
673         decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
674         irq->triggering = triggering;
675         irq->polarity = polarity;
676         irq->shareable = shareable;
677         irq->interrupt_count = 1;
678         irq->interrupts[0] = p->start;
679
680         pnp_dbg(&dev->dev, "  encode irq %d %s %s %s (%d-byte descriptor)\n",
681                 (int) p->start,
682                 triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
683                 polarity == ACPI_ACTIVE_LOW ? "low" : "high",
684                 irq->shareable == ACPI_SHARED ? "shared" : "exclusive",
685                 irq->descriptor_length);
686 }
687
688 static void pnpacpi_encode_ext_irq(struct pnp_dev *dev,
689                                    struct acpi_resource *resource,
690                                    struct resource *p)
691 {
692         struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
693         u8 triggering, polarity, shareable;
694
695         if (!pnp_resource_enabled(p)) {
696                 extended_irq->interrupt_count = 0;
697                 pnp_dbg(&dev->dev, "  encode extended irq (%s)\n",
698                         p ? "disabled" : "missing");
699                 return;
700         }
701
702         decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
703         extended_irq->producer_consumer = ACPI_CONSUMER;
704         extended_irq->triggering = triggering;
705         extended_irq->polarity = polarity;
706         extended_irq->shareable = shareable;
707         extended_irq->interrupt_count = 1;
708         extended_irq->interrupts[0] = p->start;
709
710         pnp_dbg(&dev->dev, "  encode irq %d %s %s %s\n", (int) p->start,
711                 triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
712                 polarity == ACPI_ACTIVE_LOW ? "low" : "high",
713                 extended_irq->shareable == ACPI_SHARED ? "shared" : "exclusive");
714 }
715
716 static void pnpacpi_encode_dma(struct pnp_dev *dev,
717                                struct acpi_resource *resource,
718                                struct resource *p)
719 {
720         struct acpi_resource_dma *dma = &resource->data.dma;
721
722         if (!pnp_resource_enabled(p)) {
723                 dma->channel_count = 0;
724                 pnp_dbg(&dev->dev, "  encode dma (%s)\n",
725                         p ? "disabled" : "missing");
726                 return;
727         }
728
729         /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
730         switch (p->flags & IORESOURCE_DMA_SPEED_MASK) {
731         case IORESOURCE_DMA_TYPEA:
732                 dma->type = ACPI_TYPE_A;
733                 break;
734         case IORESOURCE_DMA_TYPEB:
735                 dma->type = ACPI_TYPE_B;
736                 break;
737         case IORESOURCE_DMA_TYPEF:
738                 dma->type = ACPI_TYPE_F;
739                 break;
740         default:
741                 dma->type = ACPI_COMPATIBILITY;
742         }
743
744         switch (p->flags & IORESOURCE_DMA_TYPE_MASK) {
745         case IORESOURCE_DMA_8BIT:
746                 dma->transfer = ACPI_TRANSFER_8;
747                 break;
748         case IORESOURCE_DMA_8AND16BIT:
749                 dma->transfer = ACPI_TRANSFER_8_16;
750                 break;
751         default:
752                 dma->transfer = ACPI_TRANSFER_16;
753         }
754
755         dma->bus_master = !!(p->flags & IORESOURCE_DMA_MASTER);
756         dma->channel_count = 1;
757         dma->channels[0] = p->start;
758
759         pnp_dbg(&dev->dev, "  encode dma %d "
760                 "type %#x transfer %#x master %d\n",
761                 (int) p->start, dma->type, dma->transfer, dma->bus_master);
762 }
763
764 static void pnpacpi_encode_io(struct pnp_dev *dev,
765                               struct acpi_resource *resource,
766                               struct resource *p)
767 {
768         struct acpi_resource_io *io = &resource->data.io;
769
770         if (pnp_resource_enabled(p)) {
771                 /* Note: pnp_assign_port copies pnp_port->flags into p->flags */
772                 io->io_decode = (p->flags & IORESOURCE_IO_16BIT_ADDR) ?
773                     ACPI_DECODE_16 : ACPI_DECODE_10;
774                 io->minimum = p->start;
775                 io->maximum = p->end;
776                 io->alignment = 0;      /* Correct? */
777                 io->address_length = resource_size(p);
778         } else {
779                 io->minimum = 0;
780                 io->address_length = 0;
781         }
782
783         pnp_dbg(&dev->dev, "  encode io %#x-%#x decode %#x\n", io->minimum,
784                 io->minimum + io->address_length - 1, io->io_decode);
785 }
786
787 static void pnpacpi_encode_fixed_io(struct pnp_dev *dev,
788                                     struct acpi_resource *resource,
789                                     struct resource *p)
790 {
791         struct acpi_resource_fixed_io *fixed_io = &resource->data.fixed_io;
792
793         if (pnp_resource_enabled(p)) {
794                 fixed_io->address = p->start;
795                 fixed_io->address_length = resource_size(p);
796         } else {
797                 fixed_io->address = 0;
798                 fixed_io->address_length = 0;
799         }
800
801         pnp_dbg(&dev->dev, "  encode fixed_io %#x-%#x\n", fixed_io->address,
802                 fixed_io->address + fixed_io->address_length - 1);
803 }
804
805 static void pnpacpi_encode_mem24(struct pnp_dev *dev,
806                                  struct acpi_resource *resource,
807                                  struct resource *p)
808 {
809         struct acpi_resource_memory24 *memory24 = &resource->data.memory24;
810
811         if (pnp_resource_enabled(p)) {
812                 /* Note: pnp_assign_mem copies pnp_mem->flags into p->flags */
813                 memory24->write_protect = p->flags & IORESOURCE_MEM_WRITEABLE ?
814                     ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
815                 memory24->minimum = p->start;
816                 memory24->maximum = p->end;
817                 memory24->alignment = 0;
818                 memory24->address_length = resource_size(p);
819         } else {
820                 memory24->minimum = 0;
821                 memory24->address_length = 0;
822         }
823
824         pnp_dbg(&dev->dev, "  encode mem24 %#x-%#x write_protect %#x\n",
825                 memory24->minimum,
826                 memory24->minimum + memory24->address_length - 1,
827                 memory24->write_protect);
828 }
829
830 static void pnpacpi_encode_mem32(struct pnp_dev *dev,
831                                  struct acpi_resource *resource,
832                                  struct resource *p)
833 {
834         struct acpi_resource_memory32 *memory32 = &resource->data.memory32;
835
836         if (pnp_resource_enabled(p)) {
837                 memory32->write_protect = p->flags & IORESOURCE_MEM_WRITEABLE ?
838                     ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
839                 memory32->minimum = p->start;
840                 memory32->maximum = p->end;
841                 memory32->alignment = 0;
842                 memory32->address_length = resource_size(p);
843         } else {
844                 memory32->minimum = 0;
845                 memory32->alignment = 0;
846         }
847
848         pnp_dbg(&dev->dev, "  encode mem32 %#x-%#x write_protect %#x\n",
849                 memory32->minimum,
850                 memory32->minimum + memory32->address_length - 1,
851                 memory32->write_protect);
852 }
853
854 static void pnpacpi_encode_fixed_mem32(struct pnp_dev *dev,
855                                        struct acpi_resource *resource,
856                                        struct resource *p)
857 {
858         struct acpi_resource_fixed_memory32 *fixed_memory32 = &resource->data.fixed_memory32;
859
860         if (pnp_resource_enabled(p)) {
861                 fixed_memory32->write_protect =
862                     p->flags & IORESOURCE_MEM_WRITEABLE ?
863                     ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
864                 fixed_memory32->address = p->start;
865                 fixed_memory32->address_length = resource_size(p);
866         } else {
867                 fixed_memory32->address = 0;
868                 fixed_memory32->address_length = 0;
869         }
870
871         pnp_dbg(&dev->dev, "  encode fixed_mem32 %#x-%#x write_protect %#x\n",
872                 fixed_memory32->address,
873                 fixed_memory32->address + fixed_memory32->address_length - 1,
874                 fixed_memory32->write_protect);
875 }
876
877 int pnpacpi_encode_resources(struct pnp_dev *dev, struct acpi_buffer *buffer)
878 {
879         int i = 0;
880         /* pnpacpi_build_resource_template allocates extra mem */
881         int res_cnt = (buffer->length - 1) / sizeof(struct acpi_resource) - 1;
882         struct acpi_resource *resource = buffer->pointer;
883         unsigned int port = 0, irq = 0, dma = 0, mem = 0;
884
885         pnp_dbg(&dev->dev, "encode %d resources\n", res_cnt);
886         while (i < res_cnt) {
887                 switch (resource->type) {
888                 case ACPI_RESOURCE_TYPE_IRQ:
889                         pnpacpi_encode_irq(dev, resource,
890                                pnp_get_resource(dev, IORESOURCE_IRQ, irq));
891                         irq++;
892                         break;
893
894                 case ACPI_RESOURCE_TYPE_DMA:
895                         pnpacpi_encode_dma(dev, resource,
896                                 pnp_get_resource(dev, IORESOURCE_DMA, dma));
897                         dma++;
898                         break;
899                 case ACPI_RESOURCE_TYPE_IO:
900                         pnpacpi_encode_io(dev, resource,
901                                 pnp_get_resource(dev, IORESOURCE_IO, port));
902                         port++;
903                         break;
904                 case ACPI_RESOURCE_TYPE_FIXED_IO:
905                         pnpacpi_encode_fixed_io(dev, resource,
906                                 pnp_get_resource(dev, IORESOURCE_IO, port));
907                         port++;
908                         break;
909                 case ACPI_RESOURCE_TYPE_MEMORY24:
910                         pnpacpi_encode_mem24(dev, resource,
911                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
912                         mem++;
913                         break;
914                 case ACPI_RESOURCE_TYPE_MEMORY32:
915                         pnpacpi_encode_mem32(dev, resource,
916                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
917                         mem++;
918                         break;
919                 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
920                         pnpacpi_encode_fixed_mem32(dev, resource,
921                                 pnp_get_resource(dev, IORESOURCE_MEM, mem));
922                         mem++;
923                         break;
924                 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
925                         pnpacpi_encode_ext_irq(dev, resource,
926                                 pnp_get_resource(dev, IORESOURCE_IRQ, irq));
927                         irq++;
928                         break;
929                 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
930                 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
931                 case ACPI_RESOURCE_TYPE_VENDOR:
932                 case ACPI_RESOURCE_TYPE_END_TAG:
933                 case ACPI_RESOURCE_TYPE_ADDRESS16:
934                 case ACPI_RESOURCE_TYPE_ADDRESS32:
935                 case ACPI_RESOURCE_TYPE_ADDRESS64:
936                 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
937                 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
938                 default:        /* other type */
939                         dev_warn(&dev->dev,
940                                  "can't encode unknown resource type %d\n",
941                                  resource->type);
942                         return -EINVAL;
943                 }
944                 resource++;
945                 i++;
946         }
947         return 0;
948 }