1 /******************************************************************************* 2 * 3 * Module Name: rsserial - GPIO/serial_bus resource descriptors 4 * 5 ******************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2016, 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[17] = { 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_1BITFLAG, 181 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing), 182 AML_OFFSET(common_serial_bus.flags), 183 2}, 184 185 {ACPI_RSC_MOVE8, 186 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 187 AML_OFFSET(common_serial_bus.type_revision_id), 188 1}, 189 190 {ACPI_RSC_MOVE16, 191 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 192 AML_OFFSET(common_serial_bus.type_data_length), 193 1}, 194 195 /* Vendor data */ 196 197 {ACPI_RSC_COUNT_SERIAL_VEN, 198 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 199 AML_OFFSET(common_serial_bus.type_data_length), 200 AML_RESOURCE_I2C_MIN_DATA_LEN}, 201 202 {ACPI_RSC_MOVE_SERIAL_VEN, 203 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 204 0, 205 sizeof(struct aml_resource_i2c_serialbus)}, 206 207 /* Resource Source */ 208 209 {ACPI_RSC_MOVE8, 210 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 211 AML_OFFSET(common_serial_bus.res_source_index), 212 1}, 213 214 {ACPI_RSC_COUNT_SERIAL_RES, 215 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 216 AML_OFFSET(common_serial_bus.type_data_length), 217 sizeof(struct aml_resource_common_serialbus)}, 218 219 {ACPI_RSC_MOVE_SERIAL_RES, 220 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 221 AML_OFFSET(common_serial_bus.type_data_length), 222 sizeof(struct aml_resource_common_serialbus)}, 223 224 /* I2C bus type specific */ 225 226 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.access_mode), 227 AML_OFFSET(i2c_serial_bus.type_specific_flags), 228 0}, 229 230 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed), 231 AML_OFFSET(i2c_serial_bus.connection_speed), 232 1}, 233 234 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.i2c_serial_bus.slave_address), 235 AML_OFFSET(i2c_serial_bus.slave_address), 236 1}, 237 }; 238 239 /******************************************************************************* 240 * 241 * acpi_rs_convert_spi_serial_bus 242 * 243 ******************************************************************************/ 244 245 struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[21] = { 246 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 247 ACPI_RS_SIZE(struct acpi_resource_spi_serialbus), 248 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_spi_serial_bus)}, 249 250 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 251 sizeof(struct aml_resource_spi_serialbus), 252 0}, 253 254 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 255 AML_OFFSET(common_serial_bus.revision_id), 256 1}, 257 258 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 259 AML_OFFSET(common_serial_bus.type), 260 1}, 261 262 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 263 AML_OFFSET(common_serial_bus.flags), 264 0}, 265 266 {ACPI_RSC_1BITFLAG, 267 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 268 AML_OFFSET(common_serial_bus.flags), 269 1}, 270 271 {ACPI_RSC_1BITFLAG, 272 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing), 273 AML_OFFSET(common_serial_bus.flags), 274 2}, 275 276 {ACPI_RSC_MOVE8, 277 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 278 AML_OFFSET(common_serial_bus.type_revision_id), 279 1}, 280 281 {ACPI_RSC_MOVE16, 282 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 283 AML_OFFSET(common_serial_bus.type_data_length), 284 1}, 285 286 /* Vendor data */ 287 288 {ACPI_RSC_COUNT_SERIAL_VEN, 289 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 290 AML_OFFSET(common_serial_bus.type_data_length), 291 AML_RESOURCE_SPI_MIN_DATA_LEN}, 292 293 {ACPI_RSC_MOVE_SERIAL_VEN, 294 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 295 0, 296 sizeof(struct aml_resource_spi_serialbus)}, 297 298 /* Resource Source */ 299 300 {ACPI_RSC_MOVE8, 301 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 302 AML_OFFSET(common_serial_bus.res_source_index), 303 1}, 304 305 {ACPI_RSC_COUNT_SERIAL_RES, 306 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 307 AML_OFFSET(common_serial_bus.type_data_length), 308 sizeof(struct aml_resource_common_serialbus)}, 309 310 {ACPI_RSC_MOVE_SERIAL_RES, 311 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 312 AML_OFFSET(common_serial_bus.type_data_length), 313 sizeof(struct aml_resource_common_serialbus)}, 314 315 /* Spi bus type specific */ 316 317 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.wire_mode), 318 AML_OFFSET(spi_serial_bus.type_specific_flags), 319 0}, 320 321 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.device_polarity), 322 AML_OFFSET(spi_serial_bus.type_specific_flags), 323 1}, 324 325 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.data_bit_length), 326 AML_OFFSET(spi_serial_bus.data_bit_length), 327 1}, 328 329 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_phase), 330 AML_OFFSET(spi_serial_bus.clock_phase), 331 1}, 332 333 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_polarity), 334 AML_OFFSET(spi_serial_bus.clock_polarity), 335 1}, 336 337 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.spi_serial_bus.device_selection), 338 AML_OFFSET(spi_serial_bus.device_selection), 339 1}, 340 341 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.spi_serial_bus.connection_speed), 342 AML_OFFSET(spi_serial_bus.connection_speed), 343 1}, 344 }; 345 346 /******************************************************************************* 347 * 348 * acpi_rs_convert_uart_serial_bus 349 * 350 ******************************************************************************/ 351 352 struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[23] = { 353 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS, 354 ACPI_RS_SIZE(struct acpi_resource_uart_serialbus), 355 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_uart_serial_bus)}, 356 357 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS, 358 sizeof(struct aml_resource_uart_serialbus), 359 0}, 360 361 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id), 362 AML_OFFSET(common_serial_bus.revision_id), 363 1}, 364 365 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type), 366 AML_OFFSET(common_serial_bus.type), 367 1}, 368 369 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode), 370 AML_OFFSET(common_serial_bus.flags), 371 0}, 372 373 {ACPI_RSC_1BITFLAG, 374 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer), 375 AML_OFFSET(common_serial_bus.flags), 376 1}, 377 378 {ACPI_RSC_1BITFLAG, 379 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing), 380 AML_OFFSET(common_serial_bus.flags), 381 2}, 382 383 {ACPI_RSC_MOVE8, 384 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id), 385 AML_OFFSET(common_serial_bus.type_revision_id), 386 1}, 387 388 {ACPI_RSC_MOVE16, 389 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length), 390 AML_OFFSET(common_serial_bus.type_data_length), 391 1}, 392 393 /* Vendor data */ 394 395 {ACPI_RSC_COUNT_SERIAL_VEN, 396 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length), 397 AML_OFFSET(common_serial_bus.type_data_length), 398 AML_RESOURCE_UART_MIN_DATA_LEN}, 399 400 {ACPI_RSC_MOVE_SERIAL_VEN, 401 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data), 402 0, 403 sizeof(struct aml_resource_uart_serialbus)}, 404 405 /* Resource Source */ 406 407 {ACPI_RSC_MOVE8, 408 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index), 409 AML_OFFSET(common_serial_bus.res_source_index), 410 1}, 411 412 {ACPI_RSC_COUNT_SERIAL_RES, 413 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length), 414 AML_OFFSET(common_serial_bus.type_data_length), 415 sizeof(struct aml_resource_common_serialbus)}, 416 417 {ACPI_RSC_MOVE_SERIAL_RES, 418 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr), 419 AML_OFFSET(common_serial_bus.type_data_length), 420 sizeof(struct aml_resource_common_serialbus)}, 421 422 /* Uart bus type specific */ 423 424 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.flow_control), 425 AML_OFFSET(uart_serial_bus.type_specific_flags), 426 0}, 427 428 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.stop_bits), 429 AML_OFFSET(uart_serial_bus.type_specific_flags), 430 2}, 431 432 {ACPI_RSC_3BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.data_bits), 433 AML_OFFSET(uart_serial_bus.type_specific_flags), 434 4}, 435 436 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.endian), 437 AML_OFFSET(uart_serial_bus.type_specific_flags), 438 7}, 439 440 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.parity), 441 AML_OFFSET(uart_serial_bus.parity), 442 1}, 443 444 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.lines_enabled), 445 AML_OFFSET(uart_serial_bus.lines_enabled), 446 1}, 447 448 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.rx_fifo_size), 449 AML_OFFSET(uart_serial_bus.rx_fifo_size), 450 1}, 451 452 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.tx_fifo_size), 453 AML_OFFSET(uart_serial_bus.tx_fifo_size), 454 1}, 455 456 {ACPI_RSC_MOVE32, 457 ACPI_RS_OFFSET(data.uart_serial_bus.default_baud_rate), 458 AML_OFFSET(uart_serial_bus.default_baud_rate), 459 1}, 460 }; 461