1 /******************************************************************************* 2 * 3 * Module Name: rsserial - GPIO/serial_bus resource descriptors 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2012, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <acpi/acpi.h> 45 #include "accommon.h" 46 #include "acresrc.h" 47 48 #define _COMPONENT ACPI_RESOURCES 49 ACPI_MODULE_NAME("rsserial") 50 51 /******************************************************************************* 52 * 53 * acpi_rs_convert_gpio 54 * 55 ******************************************************************************/ 56 struct acpi_rsconvert_info acpi_rs_convert_gpio[17] = { 57 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GPIO, 58 ACPI_RS_SIZE(struct acpi_resource_gpio), 59 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_gpio)}, 60 61 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GPIO, 62 sizeof(struct aml_resource_gpio), 63 0}, 64 65 /* 66 * These fields are contiguous in both the source and destination: 67 * revision_id 68 * connection_type 69 */ 70 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.revision_id), 71 AML_OFFSET(gpio.revision_id), 72 2}, 73 74 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.producer_consumer), 75 AML_OFFSET(gpio.flags), 76 0}, 77 78 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.sharable), 79 AML_OFFSET(gpio.int_flags), 80 3}, 81 82 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.io_restriction), 83 AML_OFFSET(gpio.int_flags), 84 0}, 85 86 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.triggering), 87 AML_OFFSET(gpio.int_flags), 88 0}, 89 90 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.polarity), 91 AML_OFFSET(gpio.int_flags), 92 1}, 93 94 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.pin_config), 95 AML_OFFSET(gpio.pin_config), 96 1}, 97 98 /* 99 * These fields are contiguous in both the source and destination: 100 * drive_strength 101 * debounce_timeout 102 */ 103 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.gpio.drive_strength), 104 AML_OFFSET(gpio.drive_strength), 105 2}, 106 107 /* Pin Table */ 108 109 {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table_length), 110 AML_OFFSET(gpio.pin_table_offset), 111 AML_OFFSET(gpio.res_source_offset)}, 112 113 {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table), 114 AML_OFFSET(gpio.pin_table_offset), 115 0}, 116 117 /* Resource Source */ 118 119 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.resource_source.index), 120 AML_OFFSET(gpio.res_source_index), 121 1}, 122 123 {ACPI_RSC_COUNT_GPIO_RES, 124 ACPI_RS_OFFSET(data.gpio.resource_source.string_length), 125 AML_OFFSET(gpio.res_source_offset), 126 AML_OFFSET(gpio.vendor_offset)}, 127 128 {ACPI_RSC_MOVE_GPIO_RES, 129 ACPI_RS_OFFSET(data.gpio.resource_source.string_ptr), 130 AML_OFFSET(gpio.res_source_offset), 131 0}, 132 133 /* Vendor Data */ 134 135 {ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.gpio.vendor_length), 136 AML_OFFSET(gpio.vendor_length), 137 1}, 138 139 {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.gpio.vendor_data), 140 AML_OFFSET(gpio.vendor_offset), 141 0}, 142 }; 143 144 /******************************************************************************* 145 * 146 * acpi_rs_convert_i2c_serial_bus 147 * 148 ******************************************************************************/ 149 150 struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[16] = { 151 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 152 ACPI_RS_SIZE(struct acpi_resource_i2c_serialbus), 153 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_i2c_serial_bus)}, 154 155 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 156 sizeof(struct aml_resource_i2c_serialbus), 157 0}, 158 159 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 160 AML_OFFSET(common_serial_bus.revision_id), 161 1}, 162 163 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 164 AML_OFFSET(common_serial_bus.type), 165 1}, 166 167 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 168 AML_OFFSET(common_serial_bus.flags), 169 0}, 170 171 {ACPI_RSC_1BITFLAG, 172 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 173 AML_OFFSET(common_serial_bus.flags), 174 1}, 175 176 {ACPI_RSC_MOVE8, 177 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 178 AML_OFFSET(common_serial_bus.type_revision_id), 179 1}, 180 181 {ACPI_RSC_MOVE16, 182 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 183 AML_OFFSET(common_serial_bus.type_data_length), 184 1}, 185 186 /* Vendor data */ 187 188 {ACPI_RSC_COUNT_SERIAL_VEN, 189 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 190 AML_OFFSET(common_serial_bus.type_data_length), 191 AML_RESOURCE_I2C_MIN_DATA_LEN}, 192 193 {ACPI_RSC_MOVE_SERIAL_VEN, 194 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 195 0, 196 sizeof(struct aml_resource_i2c_serialbus)}, 197 198 /* Resource Source */ 199 200 {ACPI_RSC_MOVE8, 201 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 202 AML_OFFSET(common_serial_bus.res_source_index), 203 1}, 204 205 {ACPI_RSC_COUNT_SERIAL_RES, 206 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 207 AML_OFFSET(common_serial_bus.type_data_length), 208 sizeof(struct aml_resource_common_serialbus)}, 209 210 {ACPI_RSC_MOVE_SERIAL_RES, 211 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 212 AML_OFFSET(common_serial_bus.type_data_length), 213 sizeof(struct aml_resource_common_serialbus)}, 214 215 /* I2C bus type specific */ 216 217 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.access_mode), 218 AML_OFFSET(i2c_serial_bus.type_specific_flags), 219 0}, 220 221 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed), 222 AML_OFFSET(i2c_serial_bus.connection_speed), 223 1}, 224 225 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.i2c_serial_bus.slave_address), 226 AML_OFFSET(i2c_serial_bus.slave_address), 227 1}, 228 }; 229 230 /******************************************************************************* 231 * 232 * acpi_rs_convert_spi_serial_bus 233 * 234 ******************************************************************************/ 235 236 struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[20] = { 237 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 238 ACPI_RS_SIZE(struct acpi_resource_spi_serialbus), 239 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_spi_serial_bus)}, 240 241 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 242 sizeof(struct aml_resource_spi_serialbus), 243 0}, 244 245 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 246 AML_OFFSET(common_serial_bus.revision_id), 247 1}, 248 249 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 250 AML_OFFSET(common_serial_bus.type), 251 1}, 252 253 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 254 AML_OFFSET(common_serial_bus.flags), 255 0}, 256 257 {ACPI_RSC_1BITFLAG, 258 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 259 AML_OFFSET(common_serial_bus.flags), 260 1}, 261 262 {ACPI_RSC_MOVE8, 263 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 264 AML_OFFSET(common_serial_bus.type_revision_id), 265 1}, 266 267 {ACPI_RSC_MOVE16, 268 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 269 AML_OFFSET(common_serial_bus.type_data_length), 270 1}, 271 272 /* Vendor data */ 273 274 {ACPI_RSC_COUNT_SERIAL_VEN, 275 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 276 AML_OFFSET(common_serial_bus.type_data_length), 277 AML_RESOURCE_SPI_MIN_DATA_LEN}, 278 279 {ACPI_RSC_MOVE_SERIAL_VEN, 280 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 281 0, 282 sizeof(struct aml_resource_spi_serialbus)}, 283 284 /* Resource Source */ 285 286 {ACPI_RSC_MOVE8, 287 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 288 AML_OFFSET(common_serial_bus.res_source_index), 289 1}, 290 291 {ACPI_RSC_COUNT_SERIAL_RES, 292 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 293 AML_OFFSET(common_serial_bus.type_data_length), 294 sizeof(struct aml_resource_common_serialbus)}, 295 296 {ACPI_RSC_MOVE_SERIAL_RES, 297 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 298 AML_OFFSET(common_serial_bus.type_data_length), 299 sizeof(struct aml_resource_common_serialbus)}, 300 301 /* Spi bus type specific */ 302 303 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.wire_mode), 304 AML_OFFSET(spi_serial_bus.type_specific_flags), 305 0}, 306 307 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.device_polarity), 308 AML_OFFSET(spi_serial_bus.type_specific_flags), 309 1}, 310 311 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.data_bit_length), 312 AML_OFFSET(spi_serial_bus.data_bit_length), 313 1}, 314 315 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_phase), 316 AML_OFFSET(spi_serial_bus.clock_phase), 317 1}, 318 319 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_polarity), 320 AML_OFFSET(spi_serial_bus.clock_polarity), 321 1}, 322 323 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.spi_serial_bus.device_selection), 324 AML_OFFSET(spi_serial_bus.device_selection), 325 1}, 326 327 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.spi_serial_bus.connection_speed), 328 AML_OFFSET(spi_serial_bus.connection_speed), 329 1}, 330 }; 331 332 /******************************************************************************* 333 * 334 * acpi_rs_convert_uart_serial_bus 335 * 336 ******************************************************************************/ 337 338 struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[22] = { 339 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 340 ACPI_RS_SIZE(struct acpi_resource_uart_serialbus), 341 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_uart_serial_bus)}, 342 343 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 344 sizeof(struct aml_resource_uart_serialbus), 345 0}, 346 347 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 348 AML_OFFSET(common_serial_bus.revision_id), 349 1}, 350 351 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 352 AML_OFFSET(common_serial_bus.type), 353 1}, 354 355 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 356 AML_OFFSET(common_serial_bus.flags), 357 0}, 358 359 {ACPI_RSC_1BITFLAG, 360 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 361 AML_OFFSET(common_serial_bus.flags), 362 1}, 363 364 {ACPI_RSC_MOVE8, 365 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 366 AML_OFFSET(common_serial_bus.type_revision_id), 367 1}, 368 369 {ACPI_RSC_MOVE16, 370 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 371 AML_OFFSET(common_serial_bus.type_data_length), 372 1}, 373 374 /* Vendor data */ 375 376 {ACPI_RSC_COUNT_SERIAL_VEN, 377 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 378 AML_OFFSET(common_serial_bus.type_data_length), 379 AML_RESOURCE_UART_MIN_DATA_LEN}, 380 381 {ACPI_RSC_MOVE_SERIAL_VEN, 382 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 383 0, 384 sizeof(struct aml_resource_uart_serialbus)}, 385 386 /* Resource Source */ 387 388 {ACPI_RSC_MOVE8, 389 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 390 AML_OFFSET(common_serial_bus.res_source_index), 391 1}, 392 393 {ACPI_RSC_COUNT_SERIAL_RES, 394 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 395 AML_OFFSET(common_serial_bus.type_data_length), 396 sizeof(struct aml_resource_common_serialbus)}, 397 398 {ACPI_RSC_MOVE_SERIAL_RES, 399 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 400 AML_OFFSET(common_serial_bus.type_data_length), 401 sizeof(struct aml_resource_common_serialbus)}, 402 403 /* Uart bus type specific */ 404 405 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.flow_control), 406 AML_OFFSET(uart_serial_bus.type_specific_flags), 407 0}, 408 409 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.stop_bits), 410 AML_OFFSET(uart_serial_bus.type_specific_flags), 411 2}, 412 413 {ACPI_RSC_3BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.data_bits), 414 AML_OFFSET(uart_serial_bus.type_specific_flags), 415 4}, 416 417 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.endian), 418 AML_OFFSET(uart_serial_bus.type_specific_flags), 419 7}, 420 421 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.parity), 422 AML_OFFSET(uart_serial_bus.parity), 423 1}, 424 425 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.lines_enabled), 426 AML_OFFSET(uart_serial_bus.lines_enabled), 427 1}, 428 429 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.rx_fifo_size), 430 AML_OFFSET(uart_serial_bus.rx_fifo_size), 431 1}, 432 433 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.tx_fifo_size), 434 AML_OFFSET(uart_serial_bus.tx_fifo_size), 435 1}, 436 437 {ACPI_RSC_MOVE32, 438 ACPI_RS_OFFSET(data.uart_serial_bus.default_baud_rate), 439 AML_OFFSET(uart_serial_bus.default_baud_rate), 440 1}, 441 }; 442