Commit e0fe0a8d authored by Lin Ming's avatar Lin Ming Committed by Len Brown

ACPI 5.0: Support for all new resource descriptors

FixedDMA, GPIO descriptors, SerialBus descriptors
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 2da120b6
...@@ -36,7 +36,7 @@ acpi-y += psargs.o psparse.o psloop.o pstree.o pswalk.o \ ...@@ -36,7 +36,7 @@ acpi-y += psargs.o psparse.o psloop.o pstree.o pswalk.o \
psopcode.o psscope.o psutils.o psxface.o psopcode.o psscope.o psutils.o psxface.o
acpi-y += rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o \ acpi-y += rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o \
rscalc.o rsirq.o rsmemory.o rsutils.o rscalc.o rsirq.o rsmemory.o rsutils.o rsserial.o
acpi-$(ACPI_FUTURE_USAGE) += rsdump.o acpi-$(ACPI_FUTURE_USAGE) += rsdump.o
......
...@@ -955,7 +955,7 @@ struct acpi_port_info { ...@@ -955,7 +955,7 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_END_DEPENDENT 0x38 #define ACPI_RESOURCE_NAME_END_DEPENDENT 0x38
#define ACPI_RESOURCE_NAME_IO 0x40 #define ACPI_RESOURCE_NAME_IO 0x40
#define ACPI_RESOURCE_NAME_FIXED_IO 0x48 #define ACPI_RESOURCE_NAME_FIXED_IO 0x48
#define ACPI_RESOURCE_NAME_RESERVED_S1 0x50 #define ACPI_RESOURCE_NAME_FIXED_DMA 0x50
#define ACPI_RESOURCE_NAME_RESERVED_S2 0x58 #define ACPI_RESOURCE_NAME_RESERVED_S2 0x58
#define ACPI_RESOURCE_NAME_RESERVED_S3 0x60 #define ACPI_RESOURCE_NAME_RESERVED_S3 0x60
#define ACPI_RESOURCE_NAME_RESERVED_S4 0x68 #define ACPI_RESOURCE_NAME_RESERVED_S4 0x68
...@@ -977,7 +977,9 @@ struct acpi_port_info { ...@@ -977,7 +977,9 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_EXTENDED_IRQ 0x89 #define ACPI_RESOURCE_NAME_EXTENDED_IRQ 0x89
#define ACPI_RESOURCE_NAME_ADDRESS64 0x8A #define ACPI_RESOURCE_NAME_ADDRESS64 0x8A
#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B #define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B
#define ACPI_RESOURCE_NAME_LARGE_MAX 0x8B #define ACPI_RESOURCE_NAME_GPIO 0x8C
#define ACPI_RESOURCE_NAME_SERIAL_BUS 0x8E
#define ACPI_RESOURCE_NAME_LARGE_MAX 0x8E
/***************************************************************************** /*****************************************************************************
* *
......
...@@ -73,28 +73,40 @@ typedef const struct acpi_rsconvert_info { ...@@ -73,28 +73,40 @@ typedef const struct acpi_rsconvert_info {
/* Resource conversion opcodes */ /* Resource conversion opcodes */
#define ACPI_RSC_INITGET 0 typedef enum {
#define ACPI_RSC_INITSET 1 ACPI_RSC_INITGET = 0,
#define ACPI_RSC_FLAGINIT 2 ACPI_RSC_INITSET,
#define ACPI_RSC_1BITFLAG 3 ACPI_RSC_FLAGINIT,
#define ACPI_RSC_2BITFLAG 4 ACPI_RSC_1BITFLAG,
#define ACPI_RSC_COUNT 5 ACPI_RSC_2BITFLAG,
#define ACPI_RSC_COUNT16 6 ACPI_RSC_3BITFLAG,
#define ACPI_RSC_LENGTH 7 ACPI_RSC_ADDRESS,
#define ACPI_RSC_MOVE8 8 ACPI_RSC_BITMASK,
#define ACPI_RSC_MOVE16 9 ACPI_RSC_BITMASK16,
#define ACPI_RSC_MOVE32 10 ACPI_RSC_COUNT,
#define ACPI_RSC_MOVE64 11 ACPI_RSC_COUNT16,
#define ACPI_RSC_SET8 12 ACPI_RSC_COUNT_GPIO_PIN,
#define ACPI_RSC_DATA8 13 ACPI_RSC_COUNT_GPIO_RES,
#define ACPI_RSC_ADDRESS 14 ACPI_RSC_COUNT_GPIO_VEN,
#define ACPI_RSC_SOURCE 15 ACPI_RSC_COUNT_SERIAL_RES,
#define ACPI_RSC_SOURCEX 16 ACPI_RSC_COUNT_SERIAL_VEN,
#define ACPI_RSC_BITMASK 17 ACPI_RSC_DATA8,
#define ACPI_RSC_BITMASK16 18 ACPI_RSC_EXIT_EQ,
#define ACPI_RSC_EXIT_NE 19 ACPI_RSC_EXIT_LE,
#define ACPI_RSC_EXIT_LE 20 ACPI_RSC_EXIT_NE,
#define ACPI_RSC_EXIT_EQ 21 ACPI_RSC_LENGTH,
ACPI_RSC_MOVE_GPIO_PIN,
ACPI_RSC_MOVE_GPIO_RES,
ACPI_RSC_MOVE_SERIAL_RES,
ACPI_RSC_MOVE_SERIAL_VEN,
ACPI_RSC_MOVE8,
ACPI_RSC_MOVE16,
ACPI_RSC_MOVE32,
ACPI_RSC_MOVE64,
ACPI_RSC_SET8,
ACPI_RSC_SOURCE,
ACPI_RSC_SOURCEX
} ACPI_RSCONVERT_OPCODES;
/* Resource Conversion sub-opcodes */ /* Resource Conversion sub-opcodes */
...@@ -106,6 +118,9 @@ typedef const struct acpi_rsconvert_info { ...@@ -106,6 +118,9 @@ typedef const struct acpi_rsconvert_info {
#define ACPI_RS_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_resource,f) #define ACPI_RS_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_resource,f)
#define AML_OFFSET(f) (u8) ACPI_OFFSET (union aml_resource,f) #define AML_OFFSET(f) (u8) ACPI_OFFSET (union aml_resource,f)
/*
* Individual entry for the resource dump tables
*/
typedef const struct acpi_rsdump_info { typedef const struct acpi_rsdump_info {
u8 opcode; u8 opcode;
u8 offset; u8 offset;
...@@ -116,20 +131,25 @@ typedef const struct acpi_rsdump_info { ...@@ -116,20 +131,25 @@ typedef const struct acpi_rsdump_info {
/* Values for the Opcode field above */ /* Values for the Opcode field above */
#define ACPI_RSD_TITLE 0 typedef enum {
#define ACPI_RSD_LITERAL 1 ACPI_RSD_TITLE = 0,
#define ACPI_RSD_STRING 2 ACPI_RSD_1BITFLAG,
#define ACPI_RSD_UINT8 3 ACPI_RSD_2BITFLAG,
#define ACPI_RSD_UINT16 4 ACPI_RSD_3BITFLAG,
#define ACPI_RSD_UINT32 5 ACPI_RSD_ADDRESS,
#define ACPI_RSD_UINT64 6 ACPI_RSD_DWORDLIST,
#define ACPI_RSD_1BITFLAG 7 ACPI_RSD_LITERAL,
#define ACPI_RSD_2BITFLAG 8 ACPI_RSD_LONGLIST,
#define ACPI_RSD_SHORTLIST 9 ACPI_RSD_SHORTLIST,
#define ACPI_RSD_LONGLIST 10 ACPI_RSD_SHORTLISTX,
#define ACPI_RSD_DWORDLIST 11 ACPI_RSD_SOURCE,
#define ACPI_RSD_ADDRESS 12 ACPI_RSD_STRING,
#define ACPI_RSD_SOURCE 13 ACPI_RSD_UINT8,
ACPI_RSD_UINT16,
ACPI_RSD_UINT32,
ACPI_RSD_UINT64,
ACPI_RSD_WORDLIST
} ACPI_RSDUMP_OPCODES;
/* restore default alignment */ /* restore default alignment */
...@@ -138,13 +158,18 @@ typedef const struct acpi_rsdump_info { ...@@ -138,13 +158,18 @@ typedef const struct acpi_rsdump_info {
/* Resource tables indexed by internal resource type */ /* Resource tables indexed by internal resource type */
extern const u8 acpi_gbl_aml_resource_sizes[]; extern const u8 acpi_gbl_aml_resource_sizes[];
extern const u8 acpi_gbl_aml_resource_serial_bus_sizes[];
extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[]; extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[];
/* Resource tables indexed by raw AML resource descriptor type */ /* Resource tables indexed by raw AML resource descriptor type */
extern const u8 acpi_gbl_resource_struct_sizes[]; extern const u8 acpi_gbl_resource_struct_sizes[];
extern const u8 acpi_gbl_resource_struct_serial_bus_sizes[];
extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[]; extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[];
extern struct acpi_rsconvert_info
*acpi_gbl_convert_resource_serial_bus_dispatch[];
struct acpi_vendor_walk_info { struct acpi_vendor_walk_info {
struct acpi_vendor_uuid *uuid; struct acpi_vendor_uuid *uuid;
struct acpi_buffer *buffer; struct acpi_buffer *buffer;
...@@ -293,6 +318,11 @@ extern struct acpi_rsconvert_info acpi_rs_convert_address16[]; ...@@ -293,6 +318,11 @@ extern struct acpi_rsconvert_info acpi_rs_convert_address16[];
extern struct acpi_rsconvert_info acpi_rs_convert_ext_irq[]; extern struct acpi_rsconvert_info acpi_rs_convert_ext_irq[];
extern struct acpi_rsconvert_info acpi_rs_convert_address64[]; extern struct acpi_rsconvert_info acpi_rs_convert_address64[];
extern struct acpi_rsconvert_info acpi_rs_convert_ext_address64[]; extern struct acpi_rsconvert_info acpi_rs_convert_ext_address64[];
extern struct acpi_rsconvert_info acpi_rs_convert_gpio[];
extern struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[];
extern struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[];
/* These resources require separate get/set tables */ /* These resources require separate get/set tables */
...@@ -310,6 +340,7 @@ extern struct acpi_rsconvert_info acpi_rs_set_vendor[]; ...@@ -310,6 +340,7 @@ extern struct acpi_rsconvert_info acpi_rs_set_vendor[];
* rsinfo * rsinfo
*/ */
extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[]; extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[];
extern struct acpi_rsdump_info *acpi_gbl_dump_serial_bus_dispatch[];
/* /*
* rsdump * rsdump
...@@ -331,6 +362,12 @@ extern struct acpi_rsdump_info acpi_rs_dump_address64[]; ...@@ -331,6 +362,12 @@ extern struct acpi_rsdump_info acpi_rs_dump_address64[];
extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[]; extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[];
extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[]; extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[];
extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[]; extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[];
extern struct acpi_rsdump_info acpi_rs_dump_gpio[];
extern struct acpi_rsdump_info acpi_rs_dump_fixed_dma[];
extern struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[];
#endif #endif
#endif /* __ACRESRC_H__ */ #endif /* __ACRESRC_H__ */
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#define _ACUTILS_H #define _ACUTILS_H
extern const u8 acpi_gbl_resource_aml_sizes[]; extern const u8 acpi_gbl_resource_aml_sizes[];
extern const u8 acpi_gbl_resource_aml_serial_bus_sizes[];
/* Strings used by the disassembler and debugger resource dump routines */ /* Strings used by the disassembler and debugger resource dump routines */
......
...@@ -58,29 +58,48 @@ ...@@ -58,29 +58,48 @@
#define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT" #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT"
#define ACPI_RESTAG_BASEADDRESS "_BAS" #define ACPI_RESTAG_BASEADDRESS "_BAS"
#define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */ #define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */
#define ACPI_RESTAG_DEBOUNCETIME "_DBT"
#define ACPI_RESTAG_DECODE "_DEC" #define ACPI_RESTAG_DECODE "_DEC"
#define ACPI_RESTAG_DEVICEPOLARITY "_DPL"
#define ACPI_RESTAG_DMA "_DMA" #define ACPI_RESTAG_DMA "_DMA"
#define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ #define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */
#define ACPI_RESTAG_DRIVESTRENGTH "_DRS"
#define ACPI_RESTAG_ENDIANNESS "_END"
#define ACPI_RESTAG_FLOWCONTROL "_FLC"
#define ACPI_RESTAG_GRANULARITY "_GRA" #define ACPI_RESTAG_GRANULARITY "_GRA"
#define ACPI_RESTAG_INTERRUPT "_INT" #define ACPI_RESTAG_INTERRUPT "_INT"
#define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */ #define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */
#define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */ #define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */
#define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ #define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */
#define ACPI_RESTAG_IORESTRICTION "_IOR"
#define ACPI_RESTAG_LENGTH "_LEN" #define ACPI_RESTAG_LENGTH "_LEN"
#define ACPI_RESTAG_LINE "_LIN"
#define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ #define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
#define ACPI_RESTAG_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ #define ACPI_RESTAG_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
#define ACPI_RESTAG_MAXADDR "_MAX" #define ACPI_RESTAG_MAXADDR "_MAX"
#define ACPI_RESTAG_MINADDR "_MIN" #define ACPI_RESTAG_MINADDR "_MIN"
#define ACPI_RESTAG_MAXTYPE "_MAF" #define ACPI_RESTAG_MAXTYPE "_MAF"
#define ACPI_RESTAG_MINTYPE "_MIF" #define ACPI_RESTAG_MINTYPE "_MIF"
#define ACPI_RESTAG_MODE "_MOD"
#define ACPI_RESTAG_PARITY "_PAR"
#define ACPI_RESTAG_PHASE "_PHA"
#define ACPI_RESTAG_PIN "_PIN"
#define ACPI_RESTAG_PINCONFIG "_PPI"
#define ACPI_RESTAG_POLARITY "_POL"
#define ACPI_RESTAG_REGISTERBITOFFSET "_RBO" #define ACPI_RESTAG_REGISTERBITOFFSET "_RBO"
#define ACPI_RESTAG_REGISTERBITWIDTH "_RBW" #define ACPI_RESTAG_REGISTERBITWIDTH "_RBW"
#define ACPI_RESTAG_RANGETYPE "_RNG" #define ACPI_RESTAG_RANGETYPE "_RNG"
#define ACPI_RESTAG_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */ #define ACPI_RESTAG_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */
#define ACPI_RESTAG_LENGTH_RX "_RXL"
#define ACPI_RESTAG_LENGTH_TX "_TXL"
#define ACPI_RESTAG_SLAVEMODE "_SLV"
#define ACPI_RESTAG_SPEED "_SPE"
#define ACPI_RESTAG_STOPBITS "_STB"
#define ACPI_RESTAG_TRANSLATION "_TRA" #define ACPI_RESTAG_TRANSLATION "_TRA"
#define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ #define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */
#define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */ #define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */
#define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8_and16(1), 16(2) */ #define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8_and16(1), 16(2) */
#define ACPI_RESTAG_VENDORDATA "_VEN"
/* Default sizes for "small" resource descriptors */ /* Default sizes for "small" resource descriptors */
...@@ -90,6 +109,7 @@ ...@@ -90,6 +109,7 @@
#define ASL_RDESC_END_DEPEND_SIZE 0x00 #define ASL_RDESC_END_DEPEND_SIZE 0x00
#define ASL_RDESC_IO_SIZE 0x07 #define ASL_RDESC_IO_SIZE 0x07
#define ASL_RDESC_FIXED_IO_SIZE 0x03 #define ASL_RDESC_FIXED_IO_SIZE 0x03
#define ASL_RDESC_FIXED_DMA_SIZE 0x05
#define ASL_RDESC_END_TAG_SIZE 0x01 #define ASL_RDESC_END_TAG_SIZE 0x01
struct asl_resource_node { struct asl_resource_node {
...@@ -164,6 +184,12 @@ struct aml_resource_end_tag { ...@@ -164,6 +184,12 @@ struct aml_resource_end_tag {
AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum; AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum;
}; };
struct aml_resource_fixed_dma {
AML_RESOURCE_SMALL_HEADER_COMMON u16 request_lines;
u16 channels;
u8 width;
};
/* /*
* LARGE descriptors * LARGE descriptors
*/ */
...@@ -263,6 +289,110 @@ struct aml_resource_generic_register { ...@@ -263,6 +289,110 @@ struct aml_resource_generic_register {
u64 address; u64 address;
}; };
/* Common descriptor for gpio_int and gpio_io (ACPI 5.0) */
struct aml_resource_gpio {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u8 connection_type;
u16 flags;
u16 int_flags;
u8 pin_config;
u16 drive_strength;
u16 debounce_timeout;
u16 pin_table_offset;
u8 res_source_index;
u16 res_source_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) PIN list (Words)
* 2) Resource Source String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_GPIO_REVISION 1 /* ACPI 5.0 */
/* Values for connection_type above */
#define AML_RESOURCE_GPIO_TYPE_INT 0
#define AML_RESOURCE_GPIO_TYPE_IO 1
#define AML_RESOURCE_MAX_GPIOTYPE 1
/* Common preamble for all serial descriptors (ACPI 5.0) */
#define AML_RESOURCE_SERIAL_COMMON \
u8 revision_id; \
u8 res_source_index; \
u8 type; \
u8 flags; \
u16 type_specific_flags; \
u8 type_revision_id; \
u16 type_data_length; \
/* Values for the type field above */
#define AML_RESOURCE_I2C_SERIALBUSTYPE 1
#define AML_RESOURCE_SPI_SERIALBUSTYPE 2
#define AML_RESOURCE_UART_SERIALBUSTYPE 3
#define AML_RESOURCE_MAX_SERIALBUSTYPE 3
#define AML_RESOURCE_VENDOR_SERIALBUSTYPE 192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */
struct aml_resource_common_serialbus {
AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_SERIAL_COMMON};
struct aml_resource_i2c_serialbus {
AML_RESOURCE_LARGE_HEADER_COMMON
AML_RESOURCE_SERIAL_COMMON u32 connection_speed;
u16 slave_address;
/*
* Optional fields follow immediately:
* 1) Vendor Data bytes
* 2) Resource Source String
*/
};
#define AML_RESOURCE_I2C_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_I2C_TYPE_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_I2C_MIN_DATA_LEN 6
struct aml_resource_spi_serialbus {
AML_RESOURCE_LARGE_HEADER_COMMON
AML_RESOURCE_SERIAL_COMMON u32 connection_speed;
u8 data_bit_length;
u8 clock_phase;
u8 clock_polarity;
u16 device_selection;
/*
* Optional fields follow immediately:
* 1) Vendor Data bytes
* 2) Resource Source String
*/
};
#define AML_RESOURCE_SPI_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_SPI_TYPE_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_SPI_MIN_DATA_LEN 9
struct aml_resource_uart_serialbus {
AML_RESOURCE_LARGE_HEADER_COMMON
AML_RESOURCE_SERIAL_COMMON u32 default_baud_rate;
u16 rx_fifo_size;
u16 tx_fifo_size;
u8 parity;
u8 lines_enabled;
/*
* Optional fields follow immediately:
* 1) Vendor Data bytes
* 2) Resource Source String
*/
};
#define AML_RESOURCE_UART_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_UART_TYPE_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_UART_MIN_DATA_LEN 10
/* restore default alignment */ /* restore default alignment */
#pragma pack() #pragma pack()
...@@ -284,6 +414,7 @@ union aml_resource { ...@@ -284,6 +414,7 @@ union aml_resource {
struct aml_resource_end_dependent end_dpf; struct aml_resource_end_dependent end_dpf;
struct aml_resource_io io; struct aml_resource_io io;
struct aml_resource_fixed_io fixed_io; struct aml_resource_fixed_io fixed_io;
struct aml_resource_fixed_dma fixed_dma;
struct aml_resource_vendor_small vendor_small; struct aml_resource_vendor_small vendor_small;
struct aml_resource_end_tag end_tag; struct aml_resource_end_tag end_tag;
...@@ -299,6 +430,11 @@ union aml_resource { ...@@ -299,6 +430,11 @@ union aml_resource {
struct aml_resource_address64 address64; struct aml_resource_address64 address64;
struct aml_resource_extended_address64 ext_address64; struct aml_resource_extended_address64 ext_address64;
struct aml_resource_extended_irq extended_irq; struct aml_resource_extended_irq extended_irq;
struct aml_resource_gpio gpio;
struct aml_resource_i2c_serialbus i2c_serial_bus;
struct aml_resource_spi_serialbus spi_serial_bus;
struct aml_resource_uart_serialbus uart_serial_bus;
struct aml_resource_common_serialbus common_serial_bus;
/* Utility overlays */ /* Utility overlays */
......
...@@ -313,6 +313,38 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) ...@@ -313,6 +313,38 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
resource_source)); resource_source));
break; break;
case ACPI_RESOURCE_TYPE_GPIO:
total_size =
(acpi_rs_length) (total_size +
(resource->data.gpio.
pin_table_length * 2) +
resource->data.gpio.
resource_source.string_length +
resource->data.gpio.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_SERIAL_BUS:
total_size =
acpi_gbl_aml_resource_serial_bus_sizes[resource->
data.
common_serial_bus.
type];
total_size = (acpi_rs_length) (total_size +
resource->data.
i2c_serial_bus.
resource_source.
string_length +
resource->data.
i2c_serial_bus.
vendor_length);
break;
default: default:
break; break;
} }
...@@ -362,10 +394,11 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -362,10 +394,11 @@ acpi_rs_get_list_length(u8 * aml_buffer,
u32 extra_struct_bytes; u32 extra_struct_bytes;
u8 resource_index; u8 resource_index;
u8 minimum_aml_resource_length; u8 minimum_aml_resource_length;
union aml_resource *aml_resource;
ACPI_FUNCTION_TRACE(rs_get_list_length); ACPI_FUNCTION_TRACE(rs_get_list_length);
*size_needed = 0; *size_needed = ACPI_RS_SIZE_MIN; /* Minimum size is one end_tag */
end_aml = aml_buffer + aml_buffer_length; end_aml = aml_buffer + aml_buffer_length;
/* Walk the list of AML resource descriptors */ /* Walk the list of AML resource descriptors */
...@@ -376,9 +409,15 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -376,9 +409,15 @@ acpi_rs_get_list_length(u8 * aml_buffer,
status = acpi_ut_validate_resource(aml_buffer, &resource_index); status = acpi_ut_validate_resource(aml_buffer, &resource_index);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/*
* Exit on failure. Cannot continue because the descriptor length
* may be bogus also.
*/
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
aml_resource = (void *)aml_buffer;
/* Get the resource length and base (minimum) AML size */ /* Get the resource length and base (minimum) AML size */
resource_length = acpi_ut_get_resource_length(aml_buffer); resource_length = acpi_ut_get_resource_length(aml_buffer);
...@@ -422,10 +461,8 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -422,10 +461,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,
case ACPI_RESOURCE_NAME_END_TAG: case ACPI_RESOURCE_NAME_END_TAG:
/* /*
* End Tag: * End Tag: This is the normal exit
* This is the normal exit, add size of end_tag
*/ */
*size_needed += ACPI_RS_SIZE_MIN;
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
case ACPI_RESOURCE_NAME_ADDRESS32: case ACPI_RESOURCE_NAME_ADDRESS32:
...@@ -457,6 +494,33 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -457,6 +494,33 @@ acpi_rs_get_list_length(u8 * aml_buffer,
minimum_aml_resource_length); minimum_aml_resource_length);
break; break;
case ACPI_RESOURCE_NAME_GPIO:
/* Vendor data is optional */
if (aml_resource->gpio.vendor_length) {
extra_struct_bytes +=
aml_resource->gpio.vendor_offset -
aml_resource->gpio.pin_table_offset +
aml_resource->gpio.vendor_length;
} else {
extra_struct_bytes +=
aml_resource->large_header.resource_length +
sizeof(struct aml_resource_large_header) -
aml_resource->gpio.pin_table_offset;
}
break;
case ACPI_RESOURCE_NAME_SERIAL_BUS:
minimum_aml_resource_length =
acpi_gbl_resource_aml_serial_bus_sizes
[aml_resource->common_serial_bus.type];
extra_struct_bytes +=
aml_resource->common_serial_bus.resource_length -
minimum_aml_resource_length;
break;
default: default:
break; break;
} }
...@@ -467,9 +531,18 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -467,9 +531,18 @@ acpi_rs_get_list_length(u8 * aml_buffer,
* Important: Round the size up for the appropriate alignment. This * Important: Round the size up for the appropriate alignment. This
* is a requirement on IA64. * is a requirement on IA64.
*/ */
buffer_size = acpi_gbl_resource_struct_sizes[resource_index] + if (acpi_ut_get_resource_type(aml_buffer) ==
extra_struct_bytes; ACPI_RESOURCE_NAME_SERIAL_BUS) {
buffer_size = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size); buffer_size =
acpi_gbl_resource_struct_serial_bus_sizes
[aml_resource->common_serial_bus.type] +
extra_struct_bytes;
} else {
buffer_size =
acpi_gbl_resource_struct_sizes[resource_index] +
extra_struct_bytes;
}
buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
*size_needed += buffer_size; *size_needed += buffer_size;
......
...@@ -66,9 +66,10 @@ ACPI_MODULE_NAME("rscreate") ...@@ -66,9 +66,10 @@ ACPI_MODULE_NAME("rscreate")
* of device resources. * of device resources.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer, acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
struct acpi_buffer *output_buffer) struct acpi_buffer * output_buffer)
{ {
acpi_status status; acpi_status status;
......
...@@ -61,11 +61,13 @@ static void acpi_rs_out_integer64(char *title, u64 value); ...@@ -61,11 +61,13 @@ static void acpi_rs_out_integer64(char *title, u64 value);
static void acpi_rs_out_title(char *title); static void acpi_rs_out_title(char *title);
static void acpi_rs_dump_byte_list(u16 length, u8 * data); static void acpi_rs_dump_byte_list(u16 length, u8 *data);
static void acpi_rs_dump_dword_list(u8 length, u32 * data); static void acpi_rs_dump_word_list(u16 length, u16 *data);
static void acpi_rs_dump_short_byte_list(u8 length, u8 * data); static void acpi_rs_dump_dword_list(u8 length, u32 *data);
static void acpi_rs_dump_short_byte_list(u8 length, u8 *data);
static void static void
acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
...@@ -309,6 +311,125 @@ struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = { ...@@ -309,6 +311,125 @@ struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL} {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
}; };
struct acpi_rsdump_info acpi_rs_dump_gpio[16] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_gpio), "GPIO", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.revision_id), "RevisionId", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.connection_type),
"ConnectionType", acpi_gbl_ct_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.producer_consumer),
"ProducerConsumer", acpi_gbl_consume_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.pin_config), "PinConfig",
acpi_gbl_ppc_decode},
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.sharable), "Sharable",
acpi_gbl_shr_decode},
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.io_restriction),
"IoRestriction", acpi_gbl_ior_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.triggering), "Triggering",
acpi_gbl_he_decode},
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.polarity), "Polarity",
acpi_gbl_ll_decode},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.drive_strength), "DriveStrength",
NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.debounce_timeout),
"DebounceTimeout", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(gpio.resource_source),
"ResourceSource", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.pin_table_length),
"PinTableLength", NULL},
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(gpio.pin_table), "PinTable", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.vendor_length), "VendorLength",
NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(gpio.vendor_data), "VendorData",
NULL},
};
struct acpi_rsdump_info acpi_rs_dump_fixed_dma[4] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_dma),
"FixedDma", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.request_lines),
"RequestLines", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.channels), "Channels",
NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_dma.width), "TransferWidth",
acpi_gbl_dts_decode},
};
#define ACPI_RS_DUMP_COMMON_SERIAL_BUS \
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.revision_id), "RevisionId", NULL}, \
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type), "Type", acpi_gbl_sbt_decode}, \
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.producer_consumer), "ProducerConsumer", acpi_gbl_consume_decode}, \
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.slave_mode), "SlaveMode", acpi_gbl_sm_decode}, \
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type_revision_id), "TypeRevisionId", NULL}, \
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.type_data_length), "TypeDataLength", NULL}, \
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (common_serial_bus.resource_source), "ResourceSource", NULL}, \
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.vendor_length), "VendorLength", NULL}, \
{ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (common_serial_bus.vendor_data), "VendorData", NULL},
struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[10] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_common_serial_bus),
"Common Serial Bus", NULL},
ACPI_RS_DUMP_COMMON_SERIAL_BUS
};
struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[13] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_i2c_serial_bus),
"I2C Serial Bus", NULL},
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
ACPI_RSD_OFFSET(i2c_serial_bus.
access_mode),
"AccessMode", acpi_gbl_am_decode},
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(i2c_serial_bus.connection_speed),
"ConnectionSpeed", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(i2c_serial_bus.slave_address),
"SlaveAddress", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[17] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_spi_serial_bus),
"Spi Serial Bus", NULL},
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
ACPI_RSD_OFFSET(spi_serial_bus.
wire_mode), "WireMode",
acpi_gbl_wm_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(spi_serial_bus.device_polarity),
"DevicePolarity", acpi_gbl_dp_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.data_bit_length),
"DataBitLength", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_phase),
"ClockPhase", acpi_gbl_cph_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_polarity),
"ClockPolarity", acpi_gbl_cpo_decode},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(spi_serial_bus.device_selection),
"DeviceSelection", NULL},
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(spi_serial_bus.connection_speed),
"ConnectionSpeed", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[19] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_uart_serial_bus),
"Uart Serial Bus", NULL},
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_2BITFLAG,
ACPI_RSD_OFFSET(uart_serial_bus.
flow_control),
"FlowControl", acpi_gbl_fc_decode},
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.stop_bits),
"StopBits", acpi_gbl_sb_decode},
{ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.data_bits),
"DataBits", acpi_gbl_bpb_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.endian), "Endian",
acpi_gbl_ed_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.parity), "Parity",
acpi_gbl_pt_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.lines_enabled),
"LinesEnabled", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.rx_fifo_size),
"RxFifoSize", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.tx_fifo_size),
"TxFifoSize", NULL},
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(uart_serial_bus.default_baud_rate),
"ConnectionSpeed", NULL},
};
/* /*
* Tables used for common address descriptor flag fields * Tables used for common address descriptor flag fields
*/ */
...@@ -413,7 +534,14 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) ...@@ -413,7 +534,14 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
/* Data items, 8/16/32/64 bit */ /* Data items, 8/16/32/64 bit */
case ACPI_RSD_UINT8: case ACPI_RSD_UINT8:
acpi_rs_out_integer8(name, ACPI_GET8(target)); if (table->pointer) {
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
table->
pointer
[*target]));
} else {
acpi_rs_out_integer8(name, ACPI_GET8(target));
}
break; break;
case ACPI_RSD_UINT16: case ACPI_RSD_UINT16:
...@@ -444,6 +572,13 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) ...@@ -444,6 +572,13 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
0x03])); 0x03]));
break; break;
case ACPI_RSD_3BITFLAG:
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
table->
pointer[*target &
0x07]));
break;
case ACPI_RSD_SHORTLIST: case ACPI_RSD_SHORTLIST:
/* /*
* Short byte list (single line output) for DMA and IRQ resources * Short byte list (single line output) for DMA and IRQ resources
...@@ -456,6 +591,20 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) ...@@ -456,6 +591,20 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
} }
break; break;
case ACPI_RSD_SHORTLISTX:
/*
* Short byte list (single line output) for GPIO vendor data
* Note: The list length is obtained from the previous table entry
*/
if (previous_target) {
acpi_rs_out_title(name);
acpi_rs_dump_short_byte_list(*previous_target,
*
(ACPI_CAST_INDIRECT_PTR
(u8, target)));
}
break;
case ACPI_RSD_LONGLIST: case ACPI_RSD_LONGLIST:
/* /*
* Long byte list for Vendor resource data * Long byte list for Vendor resource data
...@@ -480,6 +629,18 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) ...@@ -480,6 +629,18 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
} }
break; break;
case ACPI_RSD_WORDLIST:
/*
* Word list for GPIO Pin Table
* Note: The list length is obtained from the previous table entry
*/
if (previous_target) {
acpi_rs_dump_word_list(*previous_target,
*(ACPI_CAST_INDIRECT_PTR
(u16, target)));
}
break;
case ACPI_RSD_ADDRESS: case ACPI_RSD_ADDRESS:
/* /*
* Common flags for all Address resources * Common flags for all Address resources
...@@ -627,14 +788,20 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) ...@@ -627,14 +788,20 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
/* Dump the resource descriptor */ /* Dump the resource descriptor */
acpi_rs_dump_descriptor(&resource_list->data, if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
acpi_gbl_dump_resource_dispatch[type]); acpi_rs_dump_descriptor(&resource_list->data,
acpi_gbl_dump_serial_bus_dispatch
[resource_list->data.
common_serial_bus.type]);
} else {
acpi_rs_dump_descriptor(&resource_list->data,
acpi_gbl_dump_resource_dispatch
[type]);
}
/* Point to the next resource structure */ /* Point to the next resource structure */
resource_list = resource_list = ACPI_NEXT_RESOURCE(resource_list);
ACPI_ADD_PTR(struct acpi_resource, resource_list,
resource_list->length);
/* Exit when END_TAG descriptor is reached */ /* Exit when END_TAG descriptor is reached */
...@@ -768,4 +935,13 @@ static void acpi_rs_dump_dword_list(u8 length, u32 * data) ...@@ -768,4 +935,13 @@ static void acpi_rs_dump_dword_list(u8 length, u32 * data)
} }
} }
static void acpi_rs_dump_word_list(u16 length, u16 *data)
{
u16 i;
for (i = 0; i < length; i++) {
acpi_os_printf("%25s%2.2X : %4.4X\n", "Word", i, data[i]);
}
}
#endif #endif
...@@ -76,7 +76,10 @@ struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = { ...@@ -76,7 +76,10 @@ struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = {
acpi_rs_convert_address64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */ acpi_rs_convert_address64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */
acpi_rs_convert_ext_address64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ acpi_rs_convert_ext_address64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
acpi_rs_convert_ext_irq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ acpi_rs_convert_ext_irq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
acpi_rs_convert_generic_reg /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ acpi_rs_convert_generic_reg, /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
acpi_rs_convert_gpio, /* 0x11, ACPI_RESOURCE_TYPE_GPIO */
acpi_rs_convert_fixed_dma, /* 0x12, ACPI_RESOURCE_TYPE_FIXED_DMA */
NULL, /* 0x13, ACPI_RESOURCE_TYPE_SERIAL_BUS - Use subtype table below */
}; };
/* Dispatch tables for AML-to-resource (Get Resource) conversion functions */ /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
...@@ -94,7 +97,7 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = { ...@@ -94,7 +97,7 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
acpi_rs_convert_end_dpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ acpi_rs_convert_end_dpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
acpi_rs_convert_io, /* 0x08, ACPI_RESOURCE_NAME_IO */ acpi_rs_convert_io, /* 0x08, ACPI_RESOURCE_NAME_IO */
acpi_rs_convert_fixed_io, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */ acpi_rs_convert_fixed_io, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */
NULL, /* 0x0A, Reserved */ acpi_rs_convert_fixed_dma, /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */
NULL, /* 0x0B, Reserved */ NULL, /* 0x0B, Reserved */
NULL, /* 0x0C, Reserved */ NULL, /* 0x0C, Reserved */
NULL, /* 0x0D, Reserved */ NULL, /* 0x0D, Reserved */
...@@ -114,7 +117,19 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = { ...@@ -114,7 +117,19 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
acpi_rs_convert_address16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */ acpi_rs_convert_address16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */
acpi_rs_convert_ext_irq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */ acpi_rs_convert_ext_irq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */
acpi_rs_convert_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */ acpi_rs_convert_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
acpi_rs_convert_ext_address64 /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */ acpi_rs_convert_ext_address64, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
acpi_rs_convert_gpio, /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
NULL, /* 0x0D, Reserved */
NULL, /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use subtype table below */
};
/* Subtype table for serial_bus -- I2C, SPI, and UART */
struct acpi_rsconvert_info *acpi_gbl_convert_resource_serial_bus_dispatch[] = {
NULL,
acpi_rs_convert_i2c_serial_bus,
acpi_rs_convert_spi_serial_bus,
acpi_rs_convert_uart_serial_bus,
}; };
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
...@@ -140,6 +155,16 @@ struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = { ...@@ -140,6 +155,16 @@ struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = {
acpi_rs_dump_ext_address64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ acpi_rs_dump_ext_address64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
acpi_rs_dump_ext_irq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ acpi_rs_dump_ext_irq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
acpi_rs_dump_generic_reg, /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ acpi_rs_dump_generic_reg, /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
acpi_rs_dump_gpio, /* ACPI_RESOURCE_TYPE_GPIO */
acpi_rs_dump_fixed_dma, /* ACPI_RESOURCE_TYPE_FIXED_DMA */
NULL, /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
};
struct acpi_rsdump_info *acpi_gbl_dump_serial_bus_dispatch[] = {
NULL,
acpi_rs_dump_i2c_serial_bus, /* AML_RESOURCE_I2C_BUS_TYPE */
acpi_rs_dump_spi_serial_bus, /* AML_RESOURCE_SPI_BUS_TYPE */
acpi_rs_dump_uart_serial_bus, /* AML_RESOURCE_UART_BUS_TYPE */
}; };
#endif #endif
...@@ -166,7 +191,10 @@ const u8 acpi_gbl_aml_resource_sizes[] = { ...@@ -166,7 +191,10 @@ const u8 acpi_gbl_aml_resource_sizes[] = {
sizeof(struct aml_resource_address64), /* ACPI_RESOURCE_TYPE_ADDRESS64 */ sizeof(struct aml_resource_address64), /* ACPI_RESOURCE_TYPE_ADDRESS64 */
sizeof(struct aml_resource_extended_address64), /*ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ sizeof(struct aml_resource_extended_address64), /*ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
sizeof(struct aml_resource_extended_irq), /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ sizeof(struct aml_resource_extended_irq), /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
sizeof(struct aml_resource_generic_register) /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ sizeof(struct aml_resource_generic_register), /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
sizeof(struct aml_resource_gpio), /* ACPI_RESOURCE_TYPE_GPIO */
sizeof(struct aml_resource_fixed_dma), /* ACPI_RESOURCE_TYPE_FIXED_DMA */
sizeof(struct aml_resource_common_serialbus), /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
}; };
const u8 acpi_gbl_resource_struct_sizes[] = { const u8 acpi_gbl_resource_struct_sizes[] = {
...@@ -182,7 +210,7 @@ const u8 acpi_gbl_resource_struct_sizes[] = { ...@@ -182,7 +210,7 @@ const u8 acpi_gbl_resource_struct_sizes[] = {
ACPI_RS_SIZE_MIN, ACPI_RS_SIZE_MIN,
ACPI_RS_SIZE(struct acpi_resource_io), ACPI_RS_SIZE(struct acpi_resource_io),
ACPI_RS_SIZE(struct acpi_resource_fixed_io), ACPI_RS_SIZE(struct acpi_resource_fixed_io),
0, ACPI_RS_SIZE(struct acpi_resource_fixed_dma),
0, 0,
0, 0,
0, 0,
...@@ -202,5 +230,21 @@ const u8 acpi_gbl_resource_struct_sizes[] = { ...@@ -202,5 +230,21 @@ const u8 acpi_gbl_resource_struct_sizes[] = {
ACPI_RS_SIZE(struct acpi_resource_address16), ACPI_RS_SIZE(struct acpi_resource_address16),
ACPI_RS_SIZE(struct acpi_resource_extended_irq), ACPI_RS_SIZE(struct acpi_resource_extended_irq),
ACPI_RS_SIZE(struct acpi_resource_address64), ACPI_RS_SIZE(struct acpi_resource_address64),
ACPI_RS_SIZE(struct acpi_resource_extended_address64) ACPI_RS_SIZE(struct acpi_resource_extended_address64),
ACPI_RS_SIZE(struct acpi_resource_gpio),
ACPI_RS_SIZE(struct acpi_resource_common_serialbus)
};
const u8 acpi_gbl_aml_resource_serial_bus_sizes[] = {
0,
sizeof(struct aml_resource_i2c_serialbus),
sizeof(struct aml_resource_spi_serialbus),
sizeof(struct aml_resource_uart_serialbus),
};
const u8 acpi_gbl_resource_struct_serial_bus_sizes[] = {
0,
ACPI_RS_SIZE(struct acpi_resource_i2c_serialbus),
ACPI_RS_SIZE(struct acpi_resource_spi_serialbus),
ACPI_RS_SIZE(struct acpi_resource_uart_serialbus),
}; };
...@@ -264,3 +264,34 @@ struct acpi_rsconvert_info acpi_rs_convert_dma[6] = { ...@@ -264,3 +264,34 @@ struct acpi_rsconvert_info acpi_rs_convert_dma[6] = {
AML_OFFSET(dma.dma_channel_mask), AML_OFFSET(dma.dma_channel_mask),
ACPI_RS_OFFSET(data.dma.channel_count)} ACPI_RS_OFFSET(data.dma.channel_count)}
}; };
/*******************************************************************************
*
* acpi_rs_convert_fixed_dma
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[4] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_DMA,
ACPI_RS_SIZE(struct acpi_resource_fixed_dma),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_dma)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_DMA,
sizeof(struct aml_resource_fixed_dma),
0},
/*
* These fields are contiguous in both the source and destination:
* request_lines
* Channels
*/
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_dma.request_lines),
AML_OFFSET(fixed_dma.request_lines),
2},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_dma.width),
AML_OFFSET(fixed_dma.width),
1},
};
...@@ -70,6 +70,8 @@ acpi_rs_convert_aml_to_resources(u8 * aml, ...@@ -70,6 +70,8 @@ acpi_rs_convert_aml_to_resources(u8 * aml,
struct acpi_resource **resource_ptr = struct acpi_resource **resource_ptr =
ACPI_CAST_INDIRECT_PTR(struct acpi_resource, context); ACPI_CAST_INDIRECT_PTR(struct acpi_resource, context);
struct acpi_resource *resource; struct acpi_resource *resource;
union aml_resource *aml_resource;
struct acpi_rsconvert_info *conversion_table;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE(rs_convert_aml_to_resources); ACPI_FUNCTION_TRACE(rs_convert_aml_to_resources);
...@@ -84,14 +86,37 @@ acpi_rs_convert_aml_to_resources(u8 * aml, ...@@ -84,14 +86,37 @@ acpi_rs_convert_aml_to_resources(u8 * aml,
"Misaligned resource pointer %p", resource)); "Misaligned resource pointer %p", resource));
} }
/* Get the appropriate conversion info table */
aml_resource = ACPI_CAST_PTR(union aml_resource, aml);
if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) {
if (aml_resource->common_serial_bus.type >
AML_RESOURCE_MAX_SERIALBUSTYPE) {
conversion_table = NULL;
} else {
/* This is an I2C, SPI, or UART serial_bus descriptor */
conversion_table =
acpi_gbl_convert_resource_serial_bus_dispatch
[aml_resource->common_serial_bus.type];
}
} else {
conversion_table =
acpi_gbl_get_resource_dispatch[resource_index];
}
if (!conversion_table) {
ACPI_ERROR((AE_INFO,
"Invalid/unsupported resource descriptor: Type 0x%2.2X",
resource_index));
return (AE_AML_INVALID_RESOURCE_TYPE);
}
/* Convert the AML byte stream resource to a local resource struct */ /* Convert the AML byte stream resource to a local resource struct */
status = status =
acpi_rs_convert_aml_to_resource(resource, acpi_rs_convert_aml_to_resource(resource, aml_resource,
ACPI_CAST_PTR(union aml_resource, conversion_table);
aml),
acpi_gbl_get_resource_dispatch
[resource_index]);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"Could not convert AML resource (Type 0x%X)", "Could not convert AML resource (Type 0x%X)",
...@@ -106,7 +131,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml, ...@@ -106,7 +131,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml,
/* Point to the next structure in the output buffer */ /* Point to the next structure in the output buffer */
*resource_ptr = ACPI_ADD_PTR(void, resource, resource->length); *resource_ptr = ACPI_NEXT_RESOURCE(resource);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -135,6 +160,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, ...@@ -135,6 +160,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
{ {
u8 *aml = output_buffer; u8 *aml = output_buffer;
u8 *end_aml = output_buffer + aml_size_needed; u8 *end_aml = output_buffer + aml_size_needed;
struct acpi_rsconvert_info *conversion_table;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE(rs_convert_resources_to_aml); ACPI_FUNCTION_TRACE(rs_convert_resources_to_aml);
...@@ -154,11 +180,34 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, ...@@ -154,11 +180,34 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
/* Perform the conversion */ /* Perform the conversion */
status = acpi_rs_convert_resource_to_aml(resource, ACPI_CAST_PTR(union if (resource->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
aml_resource, if (resource->data.common_serial_bus.type >
aml), AML_RESOURCE_MAX_SERIALBUSTYPE) {
acpi_gbl_set_resource_dispatch conversion_table = NULL;
[resource->type]); } else {
/* This is an I2C, SPI, or UART serial_bus descriptor */
conversion_table =
acpi_gbl_convert_resource_serial_bus_dispatch
[resource->data.common_serial_bus.type];
}
} else {
conversion_table =
acpi_gbl_set_resource_dispatch[resource->type];
}
if (!conversion_table) {
ACPI_ERROR((AE_INFO,
"Invalid/unsupported resource descriptor: Type 0x%2.2X",
resource->type));
return (AE_AML_INVALID_RESOURCE_TYPE);
}
status = acpi_rs_convert_resource_to_aml(resource,
ACPI_CAST_PTR(union
aml_resource,
aml),
conversion_table);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"Could not convert resource (type 0x%X) to AML", "Could not convert resource (type 0x%X) to AML",
...@@ -192,9 +241,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, ...@@ -192,9 +241,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
/* Point to the next input resource descriptor */ /* Point to the next input resource descriptor */
resource = resource = ACPI_NEXT_RESOURCE(resource);
ACPI_ADD_PTR(struct acpi_resource, resource,
resource->length);
} }
/* Completed buffer, but did not find an end_tag resource descriptor */ /* Completed buffer, but did not find an end_tag resource descriptor */
......
...@@ -83,6 +83,10 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -83,6 +83,10 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
ACPI_FUNCTION_TRACE(rs_convert_aml_to_resource); ACPI_FUNCTION_TRACE(rs_convert_aml_to_resource);
if (!info) {
return_ACPI_STATUS(AE_BAD_PARAMETER);
}
if (((acpi_size) resource) & 0x3) { if (((acpi_size) resource) & 0x3) {
/* Each internal resource struct is expected to be 32-bit aligned */ /* Each internal resource struct is expected to be 32-bit aligned */
...@@ -101,7 +105,6 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -101,7 +105,6 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
* table length (# of table entries) * table length (# of table entries)
*/ */
count = INIT_TABLE_LENGTH(info); count = INIT_TABLE_LENGTH(info);
while (count) { while (count) {
/* /*
* Source is the external AML byte stream buffer, * Source is the external AML byte stream buffer,
...@@ -145,6 +148,14 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -145,6 +148,14 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
((ACPI_GET8(source) >> info->value) & 0x03); ((ACPI_GET8(source) >> info->value) & 0x03);
break; break;
case ACPI_RSC_3BITFLAG:
/*
* Mask and shift the flag bits
*/
ACPI_SET8(destination) = (u8)
((ACPI_GET8(source) >> info->value) & 0x07);
break;
case ACPI_RSC_COUNT: case ACPI_RSC_COUNT:
item_count = ACPI_GET8(source); item_count = ACPI_GET8(source);
...@@ -163,6 +174,69 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -163,6 +174,69 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
(info->value * (item_count - 1)); (info->value * (item_count - 1));
break; break;
case ACPI_RSC_COUNT_GPIO_PIN:
target = ACPI_ADD_PTR(void, aml, info->value);
item_count = ACPI_GET16(target) - ACPI_GET16(source);
resource->length = resource->length + item_count;
item_count = item_count / 2;
ACPI_SET16(destination) = item_count;
break;
case ACPI_RSC_COUNT_GPIO_VEN:
item_count = ACPI_GET8(source);
ACPI_SET8(destination) = (u8)item_count;
resource->length = resource->length +
(info->value * item_count);
break;
case ACPI_RSC_COUNT_GPIO_RES:
/*
* Vendor data is optional (length/offset may both be zero)
* Examine vendor data length field first
*/
target = ACPI_ADD_PTR(void, aml, (info->value + 2));
if (ACPI_GET16(target)) {
/* Use vendor offset to get resource source length */
target = ACPI_ADD_PTR(void, aml, info->value);
item_count =
ACPI_GET16(target) - ACPI_GET16(source);
} else {
/* No vendor data to worry about */
item_count = aml->large_header.resource_length +
sizeof(struct aml_resource_large_header) -
ACPI_GET16(source);
}
resource->length = resource->length + item_count;
ACPI_SET16(destination) = item_count;
break;
case ACPI_RSC_COUNT_SERIAL_VEN:
item_count = ACPI_GET16(source) - info->value;
resource->length = resource->length + item_count;
ACPI_SET16(destination) = item_count;
break;
case ACPI_RSC_COUNT_SERIAL_RES:
item_count = (aml_resource_length +
sizeof(struct aml_resource_large_header))
- ACPI_GET16(source) - info->value;
resource->length = resource->length + item_count;
ACPI_SET16(destination) = item_count;
break;
case ACPI_RSC_LENGTH: case ACPI_RSC_LENGTH:
resource->length = resource->length + info->value; resource->length = resource->length + info->value;
...@@ -183,6 +257,72 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -183,6 +257,72 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
info->opcode); info->opcode);
break; break;
case ACPI_RSC_MOVE_GPIO_PIN:
/* Generate and set the PIN data pointer */
target = (char *)ACPI_ADD_PTR(void, resource,
(resource->length -
item_count * 2));
*(u16 **)destination = ACPI_CAST_PTR(u16, target);
/* Copy the PIN data */
source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source));
acpi_rs_move_data(target, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_GPIO_RES:
/* Generate and set the resource_source string pointer */
target = (char *)ACPI_ADD_PTR(void, resource,
(resource->length -
item_count));
*(u8 **)destination = ACPI_CAST_PTR(u8, target);
/* Copy the resource_source string */
source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source));
acpi_rs_move_data(target, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_SERIAL_VEN:
/* Generate and set the Vendor Data pointer */
target = (char *)ACPI_ADD_PTR(void, resource,
(resource->length -
item_count));
*(u8 **)destination = ACPI_CAST_PTR(u8, target);
/* Copy the Vendor Data */
source = ACPI_ADD_PTR(void, aml, info->value);
acpi_rs_move_data(target, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_SERIAL_RES:
/* Generate and set the resource_source string pointer */
target = (char *)ACPI_ADD_PTR(void, resource,
(resource->length -
item_count));
*(u8 **)destination = ACPI_CAST_PTR(u8, target);
/* Copy the resource_source string */
source =
ACPI_ADD_PTR(void, aml,
(ACPI_GET16(source) + info->value));
acpi_rs_move_data(target, source, item_count,
info->opcode);
break;
case ACPI_RSC_SET8: case ACPI_RSC_SET8:
ACPI_MEMSET(destination, info->aml_offset, info->value); ACPI_MEMSET(destination, info->aml_offset, info->value);
...@@ -219,13 +359,18 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, ...@@ -219,13 +359,18 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
* Optional resource_source (Index and String). This is the more * Optional resource_source (Index and String). This is the more
* complicated case used by the Interrupt() macro * complicated case used by the Interrupt() macro
*/ */
target = target = ACPI_ADD_PTR(char, resource,
ACPI_ADD_PTR(char, resource, info->aml_offset +
info->aml_offset + (item_count * 4)); (item_count * 4));
resource->length += resource->length +=
acpi_rs_get_resource_source(aml_resource_length, acpi_rs_get_resource_source(aml_resource_length,
(acpi_rs_length) (((item_count - 1) * sizeof(u32)) + info->value), destination, aml, target); (acpi_rs_length)
(((item_count -
1) * sizeof(u32)) +
info->value),
destination, aml,
target);
break; break;
case ACPI_RSC_BITMASK: case ACPI_RSC_BITMASK:
...@@ -327,6 +472,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -327,6 +472,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
{ {
void *source = NULL; void *source = NULL;
void *destination; void *destination;
char *target;
acpi_rsdesc_size aml_length = 0; acpi_rsdesc_size aml_length = 0;
u8 count; u8 count;
u16 temp16 = 0; u16 temp16 = 0;
...@@ -334,6 +480,10 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -334,6 +480,10 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
ACPI_FUNCTION_TRACE(rs_convert_resource_to_aml); ACPI_FUNCTION_TRACE(rs_convert_resource_to_aml);
if (!info) {
return_ACPI_STATUS(AE_BAD_PARAMETER);
}
/* /*
* First table entry must be ACPI_RSC_INITxxx and must contain the * First table entry must be ACPI_RSC_INITxxx and must contain the
* table length (# of table entries) * table length (# of table entries)
...@@ -383,6 +533,14 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -383,6 +533,14 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
((ACPI_GET8(source) & 0x03) << info->value); ((ACPI_GET8(source) & 0x03) << info->value);
break; break;
case ACPI_RSC_3BITFLAG:
/*
* Mask and shift the flag bits
*/
ACPI_SET8(destination) |= (u8)
((ACPI_GET8(source) & 0x07) << info->value);
break;
case ACPI_RSC_COUNT: case ACPI_RSC_COUNT:
item_count = ACPI_GET8(source); item_count = ACPI_GET8(source);
...@@ -400,6 +558,63 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -400,6 +558,63 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
acpi_rs_set_resource_length(aml_length, aml); acpi_rs_set_resource_length(aml_length, aml);
break; break;
case ACPI_RSC_COUNT_GPIO_PIN:
item_count = ACPI_GET16(source);
ACPI_SET16(destination) = (u16)aml_length;
aml_length = (u16)(aml_length + item_count * 2);
target = ACPI_ADD_PTR(void, aml, info->value);
ACPI_SET16(target) = (u16)aml_length;
acpi_rs_set_resource_length(aml_length, aml);
break;
case ACPI_RSC_COUNT_GPIO_VEN:
item_count = ACPI_GET16(source);
ACPI_SET16(destination) = (u16)item_count;
aml_length =
(u16)(aml_length + (info->value * item_count));
acpi_rs_set_resource_length(aml_length, aml);
break;
case ACPI_RSC_COUNT_GPIO_RES:
/* Set resource source string length */
item_count = ACPI_GET16(source);
ACPI_SET16(destination) = (u16)aml_length;
/* Compute offset for the Vendor Data */
aml_length = (u16)(aml_length + item_count);
target = ACPI_ADD_PTR(void, aml, info->value);
/* Set vendor offset only if there is vendor data */
if (resource->data.gpio.vendor_length) {
ACPI_SET16(target) = (u16)aml_length;
}
acpi_rs_set_resource_length(aml_length, aml);
break;
case ACPI_RSC_COUNT_SERIAL_VEN:
item_count = ACPI_GET16(source);
ACPI_SET16(destination) = item_count + info->value;
aml_length = (u16)(aml_length + item_count);
acpi_rs_set_resource_length(aml_length, aml);
break;
case ACPI_RSC_COUNT_SERIAL_RES:
item_count = ACPI_GET16(source);
aml_length = (u16)(aml_length + item_count);
acpi_rs_set_resource_length(aml_length, aml);
break;
case ACPI_RSC_LENGTH: case ACPI_RSC_LENGTH:
acpi_rs_set_resource_length(info->value, aml); acpi_rs_set_resource_length(info->value, aml);
...@@ -417,6 +632,48 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, ...@@ -417,6 +632,48 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
info->opcode); info->opcode);
break; break;
case ACPI_RSC_MOVE_GPIO_PIN:
destination = (char *)ACPI_ADD_PTR(void, aml,
ACPI_GET16
(destination));
source = *(u16 **)source;
acpi_rs_move_data(destination, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_GPIO_RES:
/* Used for both resource_source string and vendor_data */
destination = (char *)ACPI_ADD_PTR(void, aml,
ACPI_GET16
(destination));
source = *(u8 **)source;
acpi_rs_move_data(destination, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_SERIAL_VEN:
destination = (char *)ACPI_ADD_PTR(void, aml,
(aml_length -
item_count));
source = *(u8 **)source;
acpi_rs_move_data(destination, source, item_count,
info->opcode);
break;
case ACPI_RSC_MOVE_SERIAL_RES:
destination = (char *)ACPI_ADD_PTR(void, aml,
(aml_length -
item_count));
source = *(u8 **)source;
acpi_rs_move_data(destination, source, item_count,
info->opcode);
break;
case ACPI_RSC_ADDRESS: case ACPI_RSC_ADDRESS:
/* Set the Resource Type, General Flags, and Type-Specific Flags */ /* Set the Resource Type, General Flags, and Type-Specific Flags */
......
This diff is collapsed.
...@@ -144,6 +144,9 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) ...@@ -144,6 +144,9 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
* since there are no alignment or endian issues * since there are no alignment or endian issues
*/ */
case ACPI_RSC_MOVE8: case ACPI_RSC_MOVE8:
case ACPI_RSC_MOVE_GPIO_RES:
case ACPI_RSC_MOVE_SERIAL_VEN:
case ACPI_RSC_MOVE_SERIAL_RES:
ACPI_MEMCPY(destination, source, item_count); ACPI_MEMCPY(destination, source, item_count);
return; return;
...@@ -153,6 +156,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) ...@@ -153,6 +156,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
* misaligned memory transfers * misaligned memory transfers
*/ */
case ACPI_RSC_MOVE16: case ACPI_RSC_MOVE16:
case ACPI_RSC_MOVE_GPIO_PIN:
ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i], ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i],
&ACPI_CAST_PTR(u16, source)[i]); &ACPI_CAST_PTR(u16, source)[i]);
break; break;
......
This diff is collapsed.
...@@ -61,11 +61,14 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6 ...@@ -61,11 +61,14 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6
#define ACPI_WRITE_COMBINING_MEMORY (u8) 0x02 #define ACPI_WRITE_COMBINING_MEMORY (u8) 0x02
#define ACPI_PREFETCHABLE_MEMORY (u8) 0x03 #define ACPI_PREFETCHABLE_MEMORY (u8) 0x03
/*! [Begin] no source code translation */
/* /*
* IO Attributes * IO Attributes
* The ISA IO ranges are: n000-n0_fFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. * The ISA IO ranges are: n000-n0FFh, n400-n4FFh, n800-n8FFh, nC00-nCFFh.
* The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cd0-n_fFFh. * The non-ISA IO ranges are: n100-n3FFh, n500-n7FFh, n900-nBFFh, nCD0-nFFFh.
*/ */
/*! [End] no source code translation !*/
#define ACPI_NON_ISA_ONLY_RANGES (u8) 0x01 #define ACPI_NON_ISA_ONLY_RANGES (u8) 0x01
#define ACPI_ISA_ONLY_RANGES (u8) 0x02 #define ACPI_ISA_ONLY_RANGES (u8) 0x02
#define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES) #define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES)
...@@ -81,16 +84,26 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6 ...@@ -81,16 +84,26 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6
#define ACPI_DECODE_16 (u8) 0x01 /* 16-bit IO address decode */ #define ACPI_DECODE_16 (u8) 0x01 /* 16-bit IO address decode */
/* /*
* IRQ Attributes * Interrupt attributes - used in multiple descriptors
*/ */
/* Triggering */
#define ACPI_LEVEL_SENSITIVE (u8) 0x00 #define ACPI_LEVEL_SENSITIVE (u8) 0x00
#define ACPI_EDGE_SENSITIVE (u8) 0x01 #define ACPI_EDGE_SENSITIVE (u8) 0x01
/* Polarity */
#define ACPI_ACTIVE_HIGH (u8) 0x00 #define ACPI_ACTIVE_HIGH (u8) 0x00
#define ACPI_ACTIVE_LOW (u8) 0x01 #define ACPI_ACTIVE_LOW (u8) 0x01
#define ACPI_ACTIVE_BOTH (u8) 0x02
/* Sharing */
#define ACPI_EXCLUSIVE (u8) 0x00 #define ACPI_EXCLUSIVE (u8) 0x00
#define ACPI_SHARED (u8) 0x01 #define ACPI_SHARED (u8) 0x01
#define ACPI_EXCLUSIVE_AND_WAKE (u8) 0x02
#define ACPI_SHARED_AND_WAKE (u8) 0x03
/* /*
* DMA Attributes * DMA Attributes
...@@ -127,6 +140,8 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6 ...@@ -127,6 +140,8 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (6
#define ACPI_POS_DECODE (u8) 0x00 #define ACPI_POS_DECODE (u8) 0x00
#define ACPI_SUB_DECODE (u8) 0x01 #define ACPI_SUB_DECODE (u8) 0x01
/* Producer/Consumer */
#define ACPI_PRODUCER (u8) 0x00 #define ACPI_PRODUCER (u8) 0x00
#define ACPI_CONSUMER (u8) 0x01 #define ACPI_CONSUMER (u8) 0x01
...@@ -192,6 +207,21 @@ struct acpi_resource_fixed_io { ...@@ -192,6 +207,21 @@ struct acpi_resource_fixed_io {
u8 address_length; u8 address_length;
}; };
struct acpi_resource_fixed_dma {
u16 request_lines;
u16 channels;
u8 width;
};
/* Values for Width field above */
#define ACPI_DMA_WIDTH8 0
#define ACPI_DMA_WIDTH16 1
#define ACPI_DMA_WIDTH32 2
#define ACPI_DMA_WIDTH64 3
#define ACPI_DMA_WIDTH128 4
#define ACPI_DMA_WIDTH256 5
struct acpi_resource_vendor { struct acpi_resource_vendor {
u16 byte_length; u16 byte_length;
u8 byte_data[1]; u8 byte_data[1];
...@@ -329,6 +359,166 @@ struct acpi_resource_generic_register { ...@@ -329,6 +359,166 @@ struct acpi_resource_generic_register {
u64 address; u64 address;
}; };
struct acpi_resource_gpio {
u8 revision_id;
u8 connection_type;
u8 producer_consumer; /* For values, see Producer/Consumer above */
u8 pin_config;
u8 sharable; /* For values, see Interrupt Attributes above */
u8 io_restriction;
u8 triggering; /* For values, see Interrupt Attributes above */
u8 polarity; /* For values, see Interrupt Attributes above */
u16 drive_strength;
u16 debounce_timeout;
u16 pin_table_length;
u16 vendor_length;
struct acpi_resource_source resource_source;
u16 *pin_table;
u8 *vendor_data;
};
/* Values for GPIO connection_type field above */
#define ACPI_RESOURCE_GPIO_TYPE_INT 0
#define ACPI_RESOURCE_GPIO_TYPE_IO 1
/* Values for pin_config field above */
#define ACPI_PIN_CONFIG_DEFAULT 0
#define ACPI_PIN_CONFIG_PULLUP 1
#define ACPI_PIN_CONFIG_PULLDOWN 2
#define ACPI_PIN_CONFIG_NOPULL 3
/* Values for io_restriction field above */
#define ACPI_IO_RESTRICT_NONE 0
#define ACPI_IO_RESTRICT_INPUT 1
#define ACPI_IO_RESTRICT_OUTPUT 2
#define ACPI_IO_RESTRICT_NONE_PRESERVE 3
/* Common structure for I2C, SPI, and UART serial descriptors */
#define ACPI_RESOURCE_SERIAL_COMMON \
u8 revision_id; \
u8 type; \
u8 producer_consumer; /* For values, see Producer/Consumer above */\
u8 slave_mode; \
u8 type_revision_id; \
u16 type_data_length; \
u16 vendor_length; \
struct acpi_resource_source resource_source; \
u8 *vendor_data;
struct acpi_resource_common_serialbus {
ACPI_RESOURCE_SERIAL_COMMON};
/* Values for the Type field above */
#define ACPI_RESOURCE_SERIAL_TYPE_I2C 1
#define ACPI_RESOURCE_SERIAL_TYPE_SPI 2
#define ACPI_RESOURCE_SERIAL_TYPE_UART 3
/* Values for slave_mode field above */
#define ACPI_CONTROLLER_INITIATED 0
#define ACPI_DEVICE_INITIATED 1
struct acpi_resource_i2c_serialbus {
ACPI_RESOURCE_SERIAL_COMMON u8 access_mode;
u16 slave_address;
u32 connection_speed;
};
/* Values for access_mode field above */
#define ACPI_I2C_7BIT_MODE 0
#define ACPI_I2C_10BIT_MODE 1
struct acpi_resource_spi_serialbus {
ACPI_RESOURCE_SERIAL_COMMON u8 wire_mode;
u8 device_polarity;
u8 data_bit_length;
u8 clock_phase;
u8 clock_polarity;
u16 device_selection;
u32 connection_speed;
};
/* Values for wire_mode field above */
#define ACPI_SPI_4WIRE_MODE 0
#define ACPI_SPI_3WIRE_MODE 1
/* Values for device_polarity field above */
#define ACPI_SPI_ACTIVE_LOW 0
#define ACPI_SPI_ACTIVE_HIGH 1
/* Values for clock_phase field above */
#define ACPI_SPI_FIRST_PHASE 0
#define ACPI_SPI_SECOND_PHASE 1
/* Values for clock_polarity field above */
#define ACPI_SPI_START_LOW 0
#define ACPI_SPI_START_HIGH 1
struct acpi_resource_uart_serialbus {
ACPI_RESOURCE_SERIAL_COMMON u8 endian;
u8 data_bits;
u8 stop_bits;
u8 flow_control;
u8 parity;
u8 lines_enabled;
u16 rx_fifo_size;
u16 tx_fifo_size;
u32 default_baud_rate;
};
/* Values for Endian field above */
#define ACPI_UART_LITTLE_ENDIAN 0
#define ACPI_UART_BIG_ENDIAN 1
/* Values for data_bits field above */
#define ACPI_UART_5_DATA_BITS 0
#define ACPI_UART_6_DATA_BITS 1
#define ACPI_UART_7_DATA_BITS 2
#define ACPI_UART_8_DATA_BITS 3
#define ACPI_UART_9_DATA_BITS 4
/* Values for stop_bits field above */
#define ACPI_UART_NO_STOP_BITS 0
#define ACPI_UART_1_STOP_BIT 1
#define ACPI_UART_1P5_STOP_BITS 2
#define ACPI_UART_2_STOP_BITS 3
/* Values for flow_control field above */
#define ACPI_UART_FLOW_CONTROL_NONE 0
#define ACPI_UART_FLOW_CONTROL_HW 1
#define ACPI_UART_FLOW_CONTROL_XON_XOFF 2
/* Values for Parity field above */
#define ACPI_UART_PARITY_NONE 0
#define ACPI_UART_PARITY_EVEN 1
#define ACPI_UART_PARITY_ODD 2
#define ACPI_UART_PARITY_MARK 3
#define ACPI_UART_PARITY_SPACE 4
/* Values for lines_enabled bitfield above */
#define ACPI_UART_CARRIER_DETECT (1<<2)
#define ACPI_UART_RING_INDICATOR (1<<3)
#define ACPI_UART_DATA_SET_READY (1<<4)
#define ACPI_UART_DATA_TERMINAL_READY (1<<5)
#define ACPI_UART_CLEAR_TO_SEND (1<<6)
#define ACPI_UART_REQUEST_TO_SEND (1<<7)
/* ACPI_RESOURCE_TYPEs */ /* ACPI_RESOURCE_TYPEs */
#define ACPI_RESOURCE_TYPE_IRQ 0 #define ACPI_RESOURCE_TYPE_IRQ 0
...@@ -348,7 +538,10 @@ struct acpi_resource_generic_register { ...@@ -348,7 +538,10 @@ struct acpi_resource_generic_register {
#define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */ #define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */
#define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15 #define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15
#define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16 #define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16
#define ACPI_RESOURCE_TYPE_MAX 16 #define ACPI_RESOURCE_TYPE_GPIO 17 /* ACPI 5.0 */
#define ACPI_RESOURCE_TYPE_FIXED_DMA 18 /* ACPI 5.0 */
#define ACPI_RESOURCE_TYPE_SERIAL_BUS 19 /* ACPI 5.0 */
#define ACPI_RESOURCE_TYPE_MAX 19
/* Master union for resource descriptors */ /* Master union for resource descriptors */
...@@ -358,6 +551,7 @@ union acpi_resource_data { ...@@ -358,6 +551,7 @@ union acpi_resource_data {
struct acpi_resource_start_dependent start_dpf; struct acpi_resource_start_dependent start_dpf;
struct acpi_resource_io io; struct acpi_resource_io io;
struct acpi_resource_fixed_io fixed_io; struct acpi_resource_fixed_io fixed_io;
struct acpi_resource_fixed_dma fixed_dma;
struct acpi_resource_vendor vendor; struct acpi_resource_vendor vendor;
struct acpi_resource_vendor_typed vendor_typed; struct acpi_resource_vendor_typed vendor_typed;
struct acpi_resource_end_tag end_tag; struct acpi_resource_end_tag end_tag;
...@@ -370,6 +564,11 @@ union acpi_resource_data { ...@@ -370,6 +564,11 @@ union acpi_resource_data {
struct acpi_resource_extended_address64 ext_address64; struct acpi_resource_extended_address64 ext_address64;
struct acpi_resource_extended_irq extended_irq; struct acpi_resource_extended_irq extended_irq;
struct acpi_resource_generic_register generic_reg; struct acpi_resource_generic_register generic_reg;
struct acpi_resource_gpio gpio;
struct acpi_resource_i2c_serialbus i2c_serial_bus;
struct acpi_resource_spi_serialbus spi_serial_bus;
struct acpi_resource_uart_serialbus uart_serial_bus;
struct acpi_resource_common_serialbus common_serial_bus;
/* Common fields */ /* Common fields */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment