1 /******************************************************************************* 2 * 3 * Module Name: rsserial - GPIO/serial_bus resource descriptors 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, 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[18] = { 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_1BITFLAG, ACPI_RS_OFFSET(data.gpio.sharable), 79 AML_OFFSET(gpio.int_flags), 80 3}, 81 82 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.wake_capable), 83 AML_OFFSET(gpio.int_flags), 84 4}, 85 86 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.io_restriction), 87 AML_OFFSET(gpio.int_flags), 88 0}, 89 90 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.triggering), 91 AML_OFFSET(gpio.int_flags), 92 0}, 93 94 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.polarity), 95 AML_OFFSET(gpio.int_flags), 96 1}, 97 98 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.pin_config), 99 AML_OFFSET(gpio.pin_config), 100 1}, 101 102 /* 103 * These fields are contiguous in both the source and destination: 104 * drive_strength 105 * debounce_timeout 106 */ 107 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.gpio.drive_strength), 108 AML_OFFSET(gpio.drive_strength), 109 2}, 110 111 /* Pin Table */ 112 113 {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table_length), 114 AML_OFFSET(gpio.pin_table_offset), 115 AML_OFFSET(gpio.res_source_offset)}, 116 117 {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table), 118 AML_OFFSET(gpio.pin_table_offset), 119 0}, 120 121 /* Resource Source */ 122 123 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.resource_source.index), 124 AML_OFFSET(gpio.res_source_index), 125 1}, 126 127 {ACPI_RSC_COUNT_GPIO_RES, 128 ACPI_RS_OFFSET(data.gpio.resource_source.string_length), 129 AML_OFFSET(gpio.res_source_offset), 130 AML_OFFSET(gpio.vendor_offset)}, 131 132 {ACPI_RSC_MOVE_GPIO_RES, 133 ACPI_RS_OFFSET(data.gpio.resource_source.string_ptr), 134 AML_OFFSET(gpio.res_source_offset), 135 0}, 136 137 /* Vendor Data */ 138 139 {ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.gpio.vendor_length), 140 AML_OFFSET(gpio.vendor_length), 141 1}, 142 143 {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.gpio.vendor_data), 144 AML_OFFSET(gpio.vendor_offset), 145 0}, 146 }; 147 148 /******************************************************************************* 149 * 150 * acpi_rs_convert_i2c_serial_bus 151 * 152 ******************************************************************************/ 153 154 struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[16] = { 155 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 156 ACPI_RS_SIZE(struct acpi_resource_i2c_serialbus), 157 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_i2c_serial_bus)}, 158 159 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 160 sizeof(struct aml_resource_i2c_serialbus), 161 0}, 162 163 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 164 AML_OFFSET(common_serial_bus.revision_id), 165 1}, 166 167 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 168 AML_OFFSET(common_serial_bus.type), 169 1}, 170 171 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 172 AML_OFFSET(common_serial_bus.flags), 173 0}, 174 175 {ACPI_RSC_1BITFLAG, 176 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 177 AML_OFFSET(common_serial_bus.flags), 178 1}, 179 180 {ACPI_RSC_MOVE8, 181 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 182 AML_OFFSET(common_serial_bus.type_revision_id), 183 1}, 184 185 {ACPI_RSC_MOVE16, 186 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 187 AML_OFFSET(common_serial_bus.type_data_length), 188 1}, 189 190 /* Vendor data */ 191 192 {ACPI_RSC_COUNT_SERIAL_VEN, 193 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 194 AML_OFFSET(common_serial_bus.type_data_length), 195 AML_RESOURCE_I2C_MIN_DATA_LEN}, 196 197 {ACPI_RSC_MOVE_SERIAL_VEN, 198 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 199 0, 200 sizeof(struct aml_resource_i2c_serialbus)}, 201 202 /* Resource Source */ 203 204 {ACPI_RSC_MOVE8, 205 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 206 AML_OFFSET(common_serial_bus.res_source_index), 207 1}, 208 209 {ACPI_RSC_COUNT_SERIAL_RES, 210 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 211 AML_OFFSET(common_serial_bus.type_data_length), 212 sizeof(struct aml_resource_common_serialbus)}, 213 214 {ACPI_RSC_MOVE_SERIAL_RES, 215 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 216 AML_OFFSET(common_serial_bus.type_data_length), 217 sizeof(struct aml_resource_common_serialbus)}, 218 219 /* I2C bus type specific */ 220 221 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.access_mode), 222 AML_OFFSET(i2c_serial_bus.type_specific_flags), 223 0}, 224 225 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed), 226 AML_OFFSET(i2c_serial_bus.connection_speed), 227 1}, 228 229 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.i2c_serial_bus.slave_address), 230 AML_OFFSET(i2c_serial_bus.slave_address), 231 1}, 232 }; 233 234 /******************************************************************************* 235 * 236 * acpi_rs_convert_spi_serial_bus 237 * 238 ******************************************************************************/ 239 240 struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[20] = { 241 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 242 ACPI_RS_SIZE(struct acpi_resource_spi_serialbus), 243 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_spi_serial_bus)}, 244 245 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 246 sizeof(struct aml_resource_spi_serialbus), 247 0}, 248 249 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 250 AML_OFFSET(common_serial_bus.revision_id), 251 1}, 252 253 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 254 AML_OFFSET(common_serial_bus.type), 255 1}, 256 257 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 258 AML_OFFSET(common_serial_bus.flags), 259 0}, 260 261 {ACPI_RSC_1BITFLAG, 262 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 263 AML_OFFSET(common_serial_bus.flags), 264 1}, 265 266 {ACPI_RSC_MOVE8, 267 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 268 AML_OFFSET(common_serial_bus.type_revision_id), 269 1}, 270 271 {ACPI_RSC_MOVE16, 272 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 273 AML_OFFSET(common_serial_bus.type_data_length), 274 1}, 275 276 /* Vendor data */ 277 278 {ACPI_RSC_COUNT_SERIAL_VEN, 279 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 280 AML_OFFSET(common_serial_bus.type_data_length), 281 AML_RESOURCE_SPI_MIN_DATA_LEN}, 282 283 {ACPI_RSC_MOVE_SERIAL_VEN, 284 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 285 0, 286 sizeof(struct aml_resource_spi_serialbus)}, 287 288 /* Resource Source */ 289 290 {ACPI_RSC_MOVE8, 291 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 292 AML_OFFSET(common_serial_bus.res_source_index), 293 1}, 294 295 {ACPI_RSC_COUNT_SERIAL_RES, 296 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 297 AML_OFFSET(common_serial_bus.type_data_length), 298 sizeof(struct aml_resource_common_serialbus)}, 299 300 {ACPI_RSC_MOVE_SERIAL_RES, 301 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 302 AML_OFFSET(common_serial_bus.type_data_length), 303 sizeof(struct aml_resource_common_serialbus)}, 304 305 /* Spi bus type specific */ 306 307 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.wire_mode), 308 AML_OFFSET(spi_serial_bus.type_specific_flags), 309 0}, 310 311 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.device_polarity), 312 AML_OFFSET(spi_serial_bus.type_specific_flags), 313 1}, 314 315 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.data_bit_length), 316 AML_OFFSET(spi_serial_bus.data_bit_length), 317 1}, 318 319 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_phase), 320 AML_OFFSET(spi_serial_bus.clock_phase), 321 1}, 322 323 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_polarity), 324 AML_OFFSET(spi_serial_bus.clock_polarity), 325 1}, 326 327 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.spi_serial_bus.device_selection), 328 AML_OFFSET(spi_serial_bus.device_selection), 329 1}, 330 331 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.spi_serial_bus.connection_speed), 332 AML_OFFSET(spi_serial_bus.connection_speed), 333 1}, 334 }; 335 336 /******************************************************************************* 337 * 338 * acpi_rs_convert_uart_serial_bus 339 * 340 ******************************************************************************/ 341 342 struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[22] = { 343 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 344 ACPI_RS_SIZE(struct acpi_resource_uart_serialbus), 345 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_uart_serial_bus)}, 346 347 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 348 sizeof(struct aml_resource_uart_serialbus), 349 0}, 350 351 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 352 AML_OFFSET(common_serial_bus.revision_id), 353 1}, 354 355 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 356 AML_OFFSET(common_serial_bus.type), 357 1}, 358 359 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 360 AML_OFFSET(common_serial_bus.flags), 361 0}, 362 363 {ACPI_RSC_1BITFLAG, 364 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 365 AML_OFFSET(common_serial_bus.flags), 366 1}, 367 368 {ACPI_RSC_MOVE8, 369 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 370 AML_OFFSET(common_serial_bus.type_revision_id), 371 1}, 372 373 {ACPI_RSC_MOVE16, 374 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 375 AML_OFFSET(common_serial_bus.type_data_length), 376 1}, 377 378 /* Vendor data */ 379 380 {ACPI_RSC_COUNT_SERIAL_VEN, 381 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 382 AML_OFFSET(common_serial_bus.type_data_length), 383 AML_RESOURCE_UART_MIN_DATA_LEN}, 384 385 {ACPI_RSC_MOVE_SERIAL_VEN, 386 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 387 0, 388 sizeof(struct aml_resource_uart_serialbus)}, 389 390 /* Resource Source */ 391 392 {ACPI_RSC_MOVE8, 393 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 394 AML_OFFSET(common_serial_bus.res_source_index), 395 1}, 396 397 {ACPI_RSC_COUNT_SERIAL_RES, 398 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 399 AML_OFFSET(common_serial_bus.type_data_length), 400 sizeof(struct aml_resource_common_serialbus)}, 401 402 {ACPI_RSC_MOVE_SERIAL_RES, 403 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 404 AML_OFFSET(common_serial_bus.type_data_length), 405 sizeof(struct aml_resource_common_serialbus)}, 406 407 /* Uart bus type specific */ 408 409 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.flow_control), 410 AML_OFFSET(uart_serial_bus.type_specific_flags), 411 0}, 412 413 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.stop_bits), 414 AML_OFFSET(uart_serial_bus.type_specific_flags), 415 2}, 416 417 {ACPI_RSC_3BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.data_bits), 418 AML_OFFSET(uart_serial_bus.type_specific_flags), 419 4}, 420 421 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.endian), 422 AML_OFFSET(uart_serial_bus.type_specific_flags), 423 7}, 424 425 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.parity), 426 AML_OFFSET(uart_serial_bus.parity), 427 1}, 428 429 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.lines_enabled), 430 AML_OFFSET(uart_serial_bus.lines_enabled), 431 1}, 432 433 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.rx_fifo_size), 434 AML_OFFSET(uart_serial_bus.rx_fifo_size), 435 1}, 436 437 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.tx_fifo_size), 438 AML_OFFSET(uart_serial_bus.tx_fifo_size), 439 1}, 440 441 {ACPI_RSC_MOVE32, 442 ACPI_RS_OFFSET(data.uart_serial_bus.default_baud_rate), 443 AML_OFFSET(uart_serial_bus.default_baud_rate), 444 1}, 445 }; 446