diff options
-rw-r--r-- | sys/dev/acpi/dsdt.c | 107 | ||||
-rw-r--r-- | sys/dev/acpi/dsdt.h | 88 |
2 files changed, 123 insertions, 72 deletions
diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c index b04cdf4b355..adec3f1a858 100644 --- a/sys/dev/acpi/dsdt.c +++ b/sys/dev/acpi/dsdt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsdt.c,v 1.82 2007/02/21 03:36:25 jordan Exp $ */ +/* $OpenBSD: dsdt.c,v 1.83 2007/02/22 06:22:31 jordan Exp $ */ /* * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> * @@ -3355,29 +3355,47 @@ aml_print_resource(union acpi_resource *crs, void *arg) switch (typ) { case LR_EXTIRQ: - printf("extirq: flags:%x len:%x irq:%x\n", + printf("extirq\tflags:%.2x len:%.2x irq:%.4x\n", crs->lr_extirq.flags, crs->lr_extirq.irq_count, aml_letohost32(crs->lr_extirq.irq[0])); break; case SR_IRQ: - printf("irq %.4x %.2x", aml_letohost16(crs->sr_irq.irq_mask), - crs->sr_irq.irq_info); + printf("irq\t%.4x %.2x\n", aml_letohost16(crs->sr_irq.irq_mask), + crs->sr_irq.irq_flags); break; case SR_DMA: - printf("dma %.2x %.2x", crs->sr_dma.dma_chan, - crs->sr_dma.dma_info); + printf("dma\t%.2x %.2x\n", crs->sr_dma.channel, + crs->sr_dma.flags); break; case SR_IOPORT: - printf("io %.2x _min:%.4x _max:%.4x _aln:%.2x _len:%.2x\n", - crs->sr_ioport.io_info, crs->sr_ioport.io_min, - crs->sr_ioport.io_max, crs->sr_ioport.io_aln, - crs->sr_ioport.io_len); + printf("ioport\tflags:%.2x _min:%.4x _max:%.4x _aln:%.2x _len:%.2x\n", + crs->sr_ioport.flags, crs->sr_ioport._min, + crs->sr_ioport._max, crs->sr_ioport._aln, + crs->sr_ioport._len); break; case SR_STARTDEP: - printf("startdep"); + printf("startdep\n"); break; case SR_ENDDEP: - printf("enddep"); + printf("enddep\n"); + break; + case LR_WORD: + printf("word\ttype:%.2x flags:%.2x tflag:%.2x gra:%.4x min:%.4x max:%.4x tra:%.4x len:%.4x\n", + crs->lr_word.type, crs->lr_word.flags, crs->lr_word.tflags, + crs->lr_word._gra, crs->lr_word._min, crs->lr_word._max, + crs->lr_word._tra, crs->lr_word._len); + break; + case LR_DWORD: + printf("dword\ttype:%.2x flags:%.2x tflag:%.2x gra:%.8x min:%.8x max:%.8x tra:%.8x len:%.8x\n", + crs->lr_dword.type, crs->lr_dword.flags, crs->lr_dword.tflags, + crs->lr_dword._gra, crs->lr_dword._min, crs->lr_dword._max, + crs->lr_dword._tra, crs->lr_dword._len); + break; + case LR_QWORD: + printf("dword\ttype:%.2x flags:%.2x tflag:%.2x gra:%.16llx min:%.16llx max:%.16llx tra:%.16llx len:%.16llx\n", + crs->lr_qword.type, crs->lr_qword.flags, crs->lr_qword.tflags, + crs->lr_qword._gra, crs->lr_qword._min, crs->lr_qword._max, + crs->lr_qword._tra, crs->lr_qword._len); break; default: printf("unknown type: %x\n", typ); @@ -3386,54 +3404,43 @@ aml_print_resource(union acpi_resource *crs, void *arg) return (0); } +union acpi_resource *aml_mapresource(union acpi_resource *); + +union acpi_resource * +aml_mapresource(union acpi_resource *crs) +{ + static union acpi_resource map; + int rlen; + + rlen = AML_CRSLEN(crs); + if (rlen >= sizeof(map)) + return crs; + + memset(&map, 0, sizeof(map)); + memcpy(&map, crs, rlen); + + return ↦ +} + int aml_parse_resource(int length, uint8_t *buffer, int (*crs_enum)(union acpi_resource *, void *), void *arg) { - int off, rlen, mlen; + int off, rlen; union acpi_resource *crs; - uint8_t *tmprsrc; - for (off = 0; off < length; off += rlen+1) { - tmprsrc = NULL; + for (off = 0; off < length; off += rlen) { crs = (union acpi_resource *)(buffer+off); + rlen = AML_CRSLEN(crs); - - switch (AML_CRSTYPE(crs)) { - case LR_EXTIRQ: - mlen = 6; - break; - case LR_WORD: - mlen = 13; - break; - case LR_DWORD: - mlen = 23; + if (crs->hdr.typecode == 0x79 || rlen <= 3) break; - case LR_QWORD: - mlen = 43; - break; - default: - mlen = 99; - break; - } - if (rlen == 0 || crs->hdr.typecode == 0x79) - break; - if (rlen < mlen) { - tmprsrc = acpi_os_malloc(mlen+64); - - rlen = mlen; - if (off+mlen >= length) - mlen = length-off; - dnprintf(20,"Bad resource length: %x/%d bytes\n", - mlen, rlen); - memcpy(tmprsrc, buffer+off, mlen); - crs = (union acpi_resource *)tmprsrc; - } - /* aml_print_resource(crs, NULL); */ - crs_enum(crs, arg); - if (tmprsrc) - acpi_os_free(tmprsrc); + crs = aml_mapresource(crs); +#ifdef ACPI_DEBUG + aml_print_resource(crs, NULL); +#endif + crs_enum(crs, arg); } return 0; diff --git a/sys/dev/acpi/dsdt.h b/sys/dev/acpi/dsdt.h index 89c76138b15..6666a6f264f 100644 --- a/sys/dev/acpi/dsdt.h +++ b/sys/dev/acpi/dsdt.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsdt.h,v 1.26 2007/02/18 02:25:05 jordan Exp $ */ +/* $OpenBSD: dsdt.h,v 1.27 2007/02/22 06:22:31 jordan Exp $ */ /* * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> * @@ -106,6 +106,7 @@ const char *aml_nodename(struct aml_node *); #define LR_EXTIRQ 0x89 #define LR_QWORD 0x8A +#define __amlflagbit(v,s,l) union acpi_resource { struct { uint8_t typecode; @@ -118,45 +119,45 @@ union acpi_resource { struct { uint8_t typecode; uint16_t irq_mask; - uint8_t irq_info; + uint8_t irq_flags; } __packed sr_irq; struct { uint8_t typecode; - uint8_t dma_chan; - uint8_t dma_info; + uint8_t channel; + uint8_t flags; } __packed sr_dma; struct { uint8_t typecode; - uint8_t io_info; - uint16_t io_min; - uint16_t io_max; - uint8_t io_aln; - uint8_t io_len; + uint8_t flags; + uint16_t _min; + uint16_t _max; + uint8_t _aln; + uint8_t _len; } __packed sr_ioport; struct { uint8_t typecode; - uint16_t fio_bas; - uint8_t fio_len; + uint16_t _bas; + uint8_t _len; } __packed sr_fioport; /* Large resource structures */ struct { uint8_t typecode; uint16_t length; - uint8_t m24_info; - uint16_t m24_min; - uint16_t m24_max; - uint16_t m24_aln; - uint16_t m24_len; + uint8_t _info; + uint16_t _min; + uint16_t _max; + uint16_t _aln; + uint16_t _len; } __packed lr_m24; struct { uint8_t typecode; uint16_t length; - uint8_t m32_info; - uint32_t m32_min; - uint32_t m32_max; - uint32_t m32_aln; - uint32_t m32_len; + uint8_t _info; + uint32_t _min; + uint32_t _max; + uint32_t _aln; + uint32_t _len; } __packed lr_m32; struct { uint8_t typecode; @@ -165,12 +166,55 @@ union acpi_resource { uint8_t irq_count; uint32_t irq[1]; } __packed lr_extirq; + struct { + uint8_t typecode; + uint16_t length; + uint8_t type; + uint8_t flags; + uint8_t tflags; + uint16_t _gra; + uint16_t _min; + uint16_t _max; + uint16_t _tra; + uint16_t _len; + uint8_t src_index; + char src[1]; + } __packed lr_word; + struct { + uint8_t typecode; + uint16_t length; + uint8_t type; + uint8_t flags; + uint8_t tflags; + uint32_t _gra; + uint32_t _min; + uint32_t _max; + uint32_t _tra; + uint32_t _len; + uint8_t src_index; + char src[1]; + } __packed lr_dword; + struct { + uint8_t typecode; + uint16_t length; + uint8_t type; + uint8_t flags; + uint8_t tflags; + uint64_t _gra; + uint64_t _min; + uint64_t _max; + uint64_t _tra; + uint64_t _len; + uint8_t src_index; + char src[1]; + } __packed lr_qword; + uint8_t pad[64]; } __packed; #define AML_CRSTYPE(x) ((x)->hdr.typecode & 0x80 ? \ (x)->hdr.typecode : (x)->hdr.typecode >> 3) #define AML_CRSLEN(x) ((x)->hdr.typecode & 0x80 ? \ - (x)->hdr.length+2 : (x)->hdr.typecode & 0x7) + 3+(x)->hdr.length : 1+((x)->hdr.typecode & 0x7)) int aml_print_resource(union acpi_resource *, void *); int aml_parse_resource(int, uint8_t *, |