diff options
Diffstat (limited to 'drivers/pnp/pnpbios/rsparser.c')
-rw-r--r-- | drivers/pnp/pnpbios/rsparser.c | 99 |
1 files changed, 46 insertions, 53 deletions
diff --git a/drivers/pnp/pnpbios/rsparser.c b/drivers/pnp/pnpbios/rsparser.c index 54c34d4d4f44..04ecd7b67230 100644 --- a/drivers/pnp/pnpbios/rsparser.c +++ b/drivers/pnp/pnpbios/rsparser.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * rsparser.c - parses and encodes pnpbios resource data streams | 2 | * rsparser.c - parses and encodes pnpbios resource data streams |
3 | * | ||
4 | */ | 3 | */ |
5 | 4 | ||
6 | #include <linux/ctype.h> | 5 | #include <linux/ctype.h> |
@@ -15,7 +14,7 @@ | |||
15 | inline void pcibios_penalize_isa_irq(int irq, int active) | 14 | inline void pcibios_penalize_isa_irq(int irq, int active) |
16 | { | 15 | { |
17 | } | 16 | } |
18 | #endif /* CONFIG_PCI */ | 17 | #endif /* CONFIG_PCI */ |
19 | 18 | ||
20 | #include "pnpbios.h" | 19 | #include "pnpbios.h" |
21 | 20 | ||
@@ -54,10 +53,11 @@ inline void pcibios_penalize_isa_irq(int irq, int active) | |||
54 | * Allocated Resources | 53 | * Allocated Resources |
55 | */ | 54 | */ |
56 | 55 | ||
57 | static void | 56 | static void pnpbios_parse_allocated_irqresource(struct pnp_resource_table *res, |
58 | pnpbios_parse_allocated_irqresource(struct pnp_resource_table *res, int irq) | 57 | int irq) |
59 | { | 58 | { |
60 | int i = 0; | 59 | int i = 0; |
60 | |||
61 | while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) | 61 | while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) |
62 | && i < PNP_MAX_IRQ) | 62 | && i < PNP_MAX_IRQ) |
63 | i++; | 63 | i++; |
@@ -73,10 +73,11 @@ pnpbios_parse_allocated_irqresource(struct pnp_resource_table *res, int irq) | |||
73 | } | 73 | } |
74 | } | 74 | } |
75 | 75 | ||
76 | static void | 76 | static void pnpbios_parse_allocated_dmaresource(struct pnp_resource_table *res, |
77 | pnpbios_parse_allocated_dmaresource(struct pnp_resource_table *res, int dma) | 77 | int dma) |
78 | { | 78 | { |
79 | int i = 0; | 79 | int i = 0; |
80 | |||
80 | while (i < PNP_MAX_DMA && | 81 | while (i < PNP_MAX_DMA && |
81 | !(res->dma_resource[i].flags & IORESOURCE_UNSET)) | 82 | !(res->dma_resource[i].flags & IORESOURCE_UNSET)) |
82 | i++; | 83 | i++; |
@@ -91,11 +92,11 @@ pnpbios_parse_allocated_dmaresource(struct pnp_resource_table *res, int dma) | |||
91 | } | 92 | } |
92 | } | 93 | } |
93 | 94 | ||
94 | static void | 95 | static void pnpbios_parse_allocated_ioresource(struct pnp_resource_table *res, |
95 | pnpbios_parse_allocated_ioresource(struct pnp_resource_table *res, int io, | 96 | int io, int len) |
96 | int len) | ||
97 | { | 97 | { |
98 | int i = 0; | 98 | int i = 0; |
99 | |||
99 | while (!(res->port_resource[i].flags & IORESOURCE_UNSET) | 100 | while (!(res->port_resource[i].flags & IORESOURCE_UNSET) |
100 | && i < PNP_MAX_PORT) | 101 | && i < PNP_MAX_PORT) |
101 | i++; | 102 | i++; |
@@ -110,11 +111,11 @@ pnpbios_parse_allocated_ioresource(struct pnp_resource_table *res, int io, | |||
110 | } | 111 | } |
111 | } | 112 | } |
112 | 113 | ||
113 | static void | 114 | static void pnpbios_parse_allocated_memresource(struct pnp_resource_table *res, |
114 | pnpbios_parse_allocated_memresource(struct pnp_resource_table *res, int mem, | 115 | int mem, int len) |
115 | int len) | ||
116 | { | 116 | { |
117 | int i = 0; | 117 | int i = 0; |
118 | |||
118 | while (!(res->mem_resource[i].flags & IORESOURCE_UNSET) | 119 | while (!(res->mem_resource[i].flags & IORESOURCE_UNSET) |
119 | && i < PNP_MAX_MEM) | 120 | && i < PNP_MAX_MEM) |
120 | i++; | 121 | i++; |
@@ -261,10 +262,11 @@ static unsigned char *pnpbios_parse_allocated_resource_data(unsigned char *p, | |||
261 | * Resource Configuration Options | 262 | * Resource Configuration Options |
262 | */ | 263 | */ |
263 | 264 | ||
264 | static void | 265 | static void pnpbios_parse_mem_option(unsigned char *p, int size, |
265 | pnpbios_parse_mem_option(unsigned char *p, int size, struct pnp_option *option) | 266 | struct pnp_option *option) |
266 | { | 267 | { |
267 | struct pnp_mem *mem; | 268 | struct pnp_mem *mem; |
269 | |||
268 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); | 270 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); |
269 | if (!mem) | 271 | if (!mem) |
270 | return; | 272 | return; |
@@ -274,14 +276,13 @@ pnpbios_parse_mem_option(unsigned char *p, int size, struct pnp_option *option) | |||
274 | mem->size = ((p[11] << 8) | p[10]) << 8; | 276 | mem->size = ((p[11] << 8) | p[10]) << 8; |
275 | mem->flags = p[3]; | 277 | mem->flags = p[3]; |
276 | pnp_register_mem_resource(option, mem); | 278 | pnp_register_mem_resource(option, mem); |
277 | return; | ||
278 | } | 279 | } |
279 | 280 | ||
280 | static void | 281 | static void pnpbios_parse_mem32_option(unsigned char *p, int size, |
281 | pnpbios_parse_mem32_option(unsigned char *p, int size, | 282 | struct pnp_option *option) |
282 | struct pnp_option *option) | ||
283 | { | 283 | { |
284 | struct pnp_mem *mem; | 284 | struct pnp_mem *mem; |
285 | |||
285 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); | 286 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); |
286 | if (!mem) | 287 | if (!mem) |
287 | return; | 288 | return; |
@@ -291,12 +292,10 @@ pnpbios_parse_mem32_option(unsigned char *p, int size, | |||
291 | mem->size = (p[19] << 24) | (p[18] << 16) | (p[17] << 8) | p[16]; | 292 | mem->size = (p[19] << 24) | (p[18] << 16) | (p[17] << 8) | p[16]; |
292 | mem->flags = p[3]; | 293 | mem->flags = p[3]; |
293 | pnp_register_mem_resource(option, mem); | 294 | pnp_register_mem_resource(option, mem); |
294 | return; | ||
295 | } | 295 | } |
296 | 296 | ||
297 | static void | 297 | static void pnpbios_parse_fixed_mem32_option(unsigned char *p, int size, |
298 | pnpbios_parse_fixed_mem32_option(unsigned char *p, int size, | 298 | struct pnp_option *option) |
299 | struct pnp_option *option) | ||
300 | { | 299 | { |
301 | struct pnp_mem *mem; | 300 | struct pnp_mem *mem; |
302 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); | 301 | mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL); |
@@ -307,11 +306,10 @@ pnpbios_parse_fixed_mem32_option(unsigned char *p, int size, | |||
307 | mem->align = 0; | 306 | mem->align = 0; |
308 | mem->flags = p[3]; | 307 | mem->flags = p[3]; |
309 | pnp_register_mem_resource(option, mem); | 308 | pnp_register_mem_resource(option, mem); |
310 | return; | ||
311 | } | 309 | } |
312 | 310 | ||
313 | static void | 311 | static void pnpbios_parse_irq_option(unsigned char *p, int size, |
314 | pnpbios_parse_irq_option(unsigned char *p, int size, struct pnp_option *option) | 312 | struct pnp_option *option) |
315 | { | 313 | { |
316 | struct pnp_irq *irq; | 314 | struct pnp_irq *irq; |
317 | unsigned long bits; | 315 | unsigned long bits; |
@@ -326,26 +324,26 @@ pnpbios_parse_irq_option(unsigned char *p, int size, struct pnp_option *option) | |||
326 | else | 324 | else |
327 | irq->flags = IORESOURCE_IRQ_HIGHEDGE; | 325 | irq->flags = IORESOURCE_IRQ_HIGHEDGE; |
328 | pnp_register_irq_resource(option, irq); | 326 | pnp_register_irq_resource(option, irq); |
329 | return; | ||
330 | } | 327 | } |
331 | 328 | ||
332 | static void | 329 | static void pnpbios_parse_dma_option(unsigned char *p, int size, |
333 | pnpbios_parse_dma_option(unsigned char *p, int size, struct pnp_option *option) | 330 | struct pnp_option *option) |
334 | { | 331 | { |
335 | struct pnp_dma *dma; | 332 | struct pnp_dma *dma; |
333 | |||
336 | dma = kzalloc(sizeof(struct pnp_dma), GFP_KERNEL); | 334 | dma = kzalloc(sizeof(struct pnp_dma), GFP_KERNEL); |
337 | if (!dma) | 335 | if (!dma) |
338 | return; | 336 | return; |
339 | dma->map = p[1]; | 337 | dma->map = p[1]; |
340 | dma->flags = p[2]; | 338 | dma->flags = p[2]; |
341 | pnp_register_dma_resource(option, dma); | 339 | pnp_register_dma_resource(option, dma); |
342 | return; | ||
343 | } | 340 | } |
344 | 341 | ||
345 | static void | 342 | static void pnpbios_parse_port_option(unsigned char *p, int size, |
346 | pnpbios_parse_port_option(unsigned char *p, int size, struct pnp_option *option) | 343 | struct pnp_option *option) |
347 | { | 344 | { |
348 | struct pnp_port *port; | 345 | struct pnp_port *port; |
346 | |||
349 | port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL); | 347 | port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL); |
350 | if (!port) | 348 | if (!port) |
351 | return; | 349 | return; |
@@ -355,14 +353,13 @@ pnpbios_parse_port_option(unsigned char *p, int size, struct pnp_option *option) | |||
355 | port->size = p[7]; | 353 | port->size = p[7]; |
356 | port->flags = p[1] ? PNP_PORT_FLAG_16BITADDR : 0; | 354 | port->flags = p[1] ? PNP_PORT_FLAG_16BITADDR : 0; |
357 | pnp_register_port_resource(option, port); | 355 | pnp_register_port_resource(option, port); |
358 | return; | ||
359 | } | 356 | } |
360 | 357 | ||
361 | static void | 358 | static void pnpbios_parse_fixed_port_option(unsigned char *p, int size, |
362 | pnpbios_parse_fixed_port_option(unsigned char *p, int size, | 359 | struct pnp_option *option) |
363 | struct pnp_option *option) | ||
364 | { | 360 | { |
365 | struct pnp_port *port; | 361 | struct pnp_port *port; |
362 | |||
366 | port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL); | 363 | port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL); |
367 | if (!port) | 364 | if (!port) |
368 | return; | 365 | return; |
@@ -371,7 +368,6 @@ pnpbios_parse_fixed_port_option(unsigned char *p, int size, | |||
371 | port->align = 0; | 368 | port->align = 0; |
372 | port->flags = PNP_PORT_FLAG_FIXED; | 369 | port->flags = PNP_PORT_FLAG_FIXED; |
373 | pnp_register_port_resource(option, port); | 370 | pnp_register_port_resource(option, port); |
374 | return; | ||
375 | } | 371 | } |
376 | 372 | ||
377 | static unsigned char *pnpbios_parse_resource_option_data(unsigned char *p, | 373 | static unsigned char *pnpbios_parse_resource_option_data(unsigned char *p, |
@@ -498,7 +494,6 @@ static unsigned char *pnpbios_parse_resource_option_data(unsigned char *p, | |||
498 | 494 | ||
499 | #define HEX(id,a) hex[((id)>>a) & 15] | 495 | #define HEX(id,a) hex[((id)>>a) & 15] |
500 | #define CHAR(id,a) (0x40 + (((id)>>a) & 31)) | 496 | #define CHAR(id,a) (0x40 + (((id)>>a) & 31)) |
501 | // | ||
502 | 497 | ||
503 | void pnpid32_to_pnpid(u32 id, char *str) | 498 | void pnpid32_to_pnpid(u32 id, char *str) |
504 | { | 499 | { |
@@ -513,11 +508,8 @@ void pnpid32_to_pnpid(u32 id, char *str) | |||
513 | str[5] = HEX(id, 4); | 508 | str[5] = HEX(id, 4); |
514 | str[6] = HEX(id, 0); | 509 | str[6] = HEX(id, 0); |
515 | str[7] = '\0'; | 510 | str[7] = '\0'; |
516 | |||
517 | return; | ||
518 | } | 511 | } |
519 | 512 | ||
520 | // | ||
521 | #undef CHAR | 513 | #undef CHAR |
522 | #undef HEX | 514 | #undef HEX |
523 | 515 | ||
@@ -598,19 +590,20 @@ static void pnpbios_encode_mem(unsigned char *p, struct resource *res) | |||
598 | { | 590 | { |
599 | unsigned long base = res->start; | 591 | unsigned long base = res->start; |
600 | unsigned long len = res->end - res->start + 1; | 592 | unsigned long len = res->end - res->start + 1; |
593 | |||
601 | p[4] = (base >> 8) & 0xff; | 594 | p[4] = (base >> 8) & 0xff; |
602 | p[5] = ((base >> 8) >> 8) & 0xff; | 595 | p[5] = ((base >> 8) >> 8) & 0xff; |
603 | p[6] = (base >> 8) & 0xff; | 596 | p[6] = (base >> 8) & 0xff; |
604 | p[7] = ((base >> 8) >> 8) & 0xff; | 597 | p[7] = ((base >> 8) >> 8) & 0xff; |
605 | p[10] = (len >> 8) & 0xff; | 598 | p[10] = (len >> 8) & 0xff; |
606 | p[11] = ((len >> 8) >> 8) & 0xff; | 599 | p[11] = ((len >> 8) >> 8) & 0xff; |
607 | return; | ||
608 | } | 600 | } |
609 | 601 | ||
610 | static void pnpbios_encode_mem32(unsigned char *p, struct resource *res) | 602 | static void pnpbios_encode_mem32(unsigned char *p, struct resource *res) |
611 | { | 603 | { |
612 | unsigned long base = res->start; | 604 | unsigned long base = res->start; |
613 | unsigned long len = res->end - res->start + 1; | 605 | unsigned long len = res->end - res->start + 1; |
606 | |||
614 | p[4] = base & 0xff; | 607 | p[4] = base & 0xff; |
615 | p[5] = (base >> 8) & 0xff; | 608 | p[5] = (base >> 8) & 0xff; |
616 | p[6] = (base >> 16) & 0xff; | 609 | p[6] = (base >> 16) & 0xff; |
@@ -623,13 +616,13 @@ static void pnpbios_encode_mem32(unsigned char *p, struct resource *res) | |||
623 | p[17] = (len >> 8) & 0xff; | 616 | p[17] = (len >> 8) & 0xff; |
624 | p[18] = (len >> 16) & 0xff; | 617 | p[18] = (len >> 16) & 0xff; |
625 | p[19] = (len >> 24) & 0xff; | 618 | p[19] = (len >> 24) & 0xff; |
626 | return; | ||
627 | } | 619 | } |
628 | 620 | ||
629 | static void pnpbios_encode_fixed_mem32(unsigned char *p, struct resource *res) | 621 | static void pnpbios_encode_fixed_mem32(unsigned char *p, struct resource *res) |
630 | { | 622 | { |
631 | unsigned long base = res->start; | 623 | unsigned long base = res->start; |
632 | unsigned long len = res->end - res->start + 1; | 624 | unsigned long len = res->end - res->start + 1; |
625 | |||
633 | p[4] = base & 0xff; | 626 | p[4] = base & 0xff; |
634 | p[5] = (base >> 8) & 0xff; | 627 | p[5] = (base >> 8) & 0xff; |
635 | p[6] = (base >> 16) & 0xff; | 628 | p[6] = (base >> 16) & 0xff; |
@@ -638,46 +631,45 @@ static void pnpbios_encode_fixed_mem32(unsigned char *p, struct resource *res) | |||
638 | p[9] = (len >> 8) & 0xff; | 631 | p[9] = (len >> 8) & 0xff; |
639 | p[10] = (len >> 16) & 0xff; | 632 | p[10] = (len >> 16) & 0xff; |
640 | p[11] = (len >> 24) & 0xff; | 633 | p[11] = (len >> 24) & 0xff; |
641 | return; | ||
642 | } | 634 | } |
643 | 635 | ||
644 | static void pnpbios_encode_irq(unsigned char *p, struct resource *res) | 636 | static void pnpbios_encode_irq(unsigned char *p, struct resource *res) |
645 | { | 637 | { |
646 | unsigned long map = 0; | 638 | unsigned long map = 0; |
639 | |||
647 | map = 1 << res->start; | 640 | map = 1 << res->start; |
648 | p[1] = map & 0xff; | 641 | p[1] = map & 0xff; |
649 | p[2] = (map >> 8) & 0xff; | 642 | p[2] = (map >> 8) & 0xff; |
650 | return; | ||
651 | } | 643 | } |
652 | 644 | ||
653 | static void pnpbios_encode_dma(unsigned char *p, struct resource *res) | 645 | static void pnpbios_encode_dma(unsigned char *p, struct resource *res) |
654 | { | 646 | { |
655 | unsigned long map = 0; | 647 | unsigned long map = 0; |
648 | |||
656 | map = 1 << res->start; | 649 | map = 1 << res->start; |
657 | p[1] = map & 0xff; | 650 | p[1] = map & 0xff; |
658 | return; | ||
659 | } | 651 | } |
660 | 652 | ||
661 | static void pnpbios_encode_port(unsigned char *p, struct resource *res) | 653 | static void pnpbios_encode_port(unsigned char *p, struct resource *res) |
662 | { | 654 | { |
663 | unsigned long base = res->start; | 655 | unsigned long base = res->start; |
664 | unsigned long len = res->end - res->start + 1; | 656 | unsigned long len = res->end - res->start + 1; |
657 | |||
665 | p[2] = base & 0xff; | 658 | p[2] = base & 0xff; |
666 | p[3] = (base >> 8) & 0xff; | 659 | p[3] = (base >> 8) & 0xff; |
667 | p[4] = base & 0xff; | 660 | p[4] = base & 0xff; |
668 | p[5] = (base >> 8) & 0xff; | 661 | p[5] = (base >> 8) & 0xff; |
669 | p[7] = len & 0xff; | 662 | p[7] = len & 0xff; |
670 | return; | ||
671 | } | 663 | } |
672 | 664 | ||
673 | static void pnpbios_encode_fixed_port(unsigned char *p, struct resource *res) | 665 | static void pnpbios_encode_fixed_port(unsigned char *p, struct resource *res) |
674 | { | 666 | { |
675 | unsigned long base = res->start; | 667 | unsigned long base = res->start; |
676 | unsigned long len = res->end - res->start + 1; | 668 | unsigned long len = res->end - res->start + 1; |
669 | |||
677 | p[1] = base & 0xff; | 670 | p[1] = base & 0xff; |
678 | p[2] = (base >> 8) & 0xff; | 671 | p[2] = (base >> 8) & 0xff; |
679 | p[3] = len & 0xff; | 672 | p[3] = len & 0xff; |
680 | return; | ||
681 | } | 673 | } |
682 | 674 | ||
683 | static unsigned char *pnpbios_encode_allocated_resource_data(unsigned char *p, | 675 | static unsigned char *pnpbios_encode_allocated_resource_data(unsigned char *p, |
@@ -792,6 +784,7 @@ int pnpbios_parse_data_stream(struct pnp_dev *dev, struct pnp_bios_node *node) | |||
792 | { | 784 | { |
793 | unsigned char *p = (char *)node->data; | 785 | unsigned char *p = (char *)node->data; |
794 | unsigned char *end = (char *)(node->data + node->size); | 786 | unsigned char *end = (char *)(node->data + node->size); |
787 | |||
795 | p = pnpbios_parse_allocated_resource_data(p, end, &dev->res); | 788 | p = pnpbios_parse_allocated_resource_data(p, end, &dev->res); |
796 | if (!p) | 789 | if (!p) |
797 | return -EIO; | 790 | return -EIO; |
@@ -804,24 +797,24 @@ int pnpbios_parse_data_stream(struct pnp_dev *dev, struct pnp_bios_node *node) | |||
804 | return 0; | 797 | return 0; |
805 | } | 798 | } |
806 | 799 | ||
807 | int | 800 | int pnpbios_read_resources_from_node(struct pnp_resource_table *res, |
808 | pnpbios_read_resources_from_node(struct pnp_resource_table *res, | 801 | struct pnp_bios_node *node) |
809 | struct pnp_bios_node *node) | ||
810 | { | 802 | { |
811 | unsigned char *p = (char *)node->data; | 803 | unsigned char *p = (char *)node->data; |
812 | unsigned char *end = (char *)(node->data + node->size); | 804 | unsigned char *end = (char *)(node->data + node->size); |
805 | |||
813 | p = pnpbios_parse_allocated_resource_data(p, end, res); | 806 | p = pnpbios_parse_allocated_resource_data(p, end, res); |
814 | if (!p) | 807 | if (!p) |
815 | return -EIO; | 808 | return -EIO; |
816 | return 0; | 809 | return 0; |
817 | } | 810 | } |
818 | 811 | ||
819 | int | 812 | int pnpbios_write_resources_to_node(struct pnp_resource_table *res, |
820 | pnpbios_write_resources_to_node(struct pnp_resource_table *res, | 813 | struct pnp_bios_node *node) |
821 | struct pnp_bios_node *node) | ||
822 | { | 814 | { |
823 | unsigned char *p = (char *)node->data; | 815 | unsigned char *p = (char *)node->data; |
824 | unsigned char *end = (char *)(node->data + node->size); | 816 | unsigned char *end = (char *)(node->data + node->size); |
817 | |||
825 | p = pnpbios_encode_allocated_resource_data(p, end, res); | 818 | p = pnpbios_encode_allocated_resource_data(p, end, res); |
826 | if (!p) | 819 | if (!p) |
827 | return -EIO; | 820 | return -EIO; |