1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * MHI PCI driver - MHI over PCI controller driver 4 * 5 * This module is a generic driver for registering MHI-over-PCI devices, 6 * such as PCIe QCOM modems. 7 * 8 * Copyright (C) 2020 Linaro Ltd <loic.poulain@linaro.org> 9 */ 10 11 #include <linux/delay.h> 12 #include <linux/device.h> 13 #include <linux/mhi.h> 14 #include <linux/module.h> 15 #include <linux/pci.h> 16 #include <linux/pm_runtime.h> 17 #include <linux/timer.h> 18 #include <linux/workqueue.h> 19 20 #define MHI_PCI_DEFAULT_BAR_NUM 0 21 22 #define MHI_POST_RESET_DELAY_MS 2000 23 24 #define HEALTH_CHECK_PERIOD (HZ * 2) 25 26 /* PCI VID definitions */ 27 #define PCI_VENDOR_ID_THALES 0x1269 28 #define PCI_VENDOR_ID_QUECTEL 0x1eac 29 #define PCI_VENDOR_ID_NETPRISMA 0x203e 30 31 #define MHI_EDL_DB 91 32 #define MHI_EDL_COOKIE 0xEDEDEDED 33 34 /** 35 * struct mhi_pci_dev_info - MHI PCI device specific information 36 * @config: MHI controller configuration 37 * @vf_config: MHI controller configuration for Virtual function (optional) 38 * @name: name of the PCI module 39 * @fw: firmware path (if any) 40 * @edl: emergency download mode firmware path (if any) 41 * @edl_trigger: capable of triggering EDL mode in the device (if supported) 42 * @bar_num: PCI base address register to use for MHI MMIO register space 43 * @dma_data_width: DMA transfer word size (32 or 64 bits) 44 * @vf_dma_data_width: DMA transfer word size for VF's (optional) 45 * @mru_default: default MRU size for MBIM network packets 46 * @sideband_wake: Devices using dedicated sideband GPIO for wakeup instead 47 * of inband wake support (such as sdx24) 48 * @no_m3: M3 not supported 49 * @reset_on_remove: Set true for devices that require SoC during driver removal 50 */ 51 struct mhi_pci_dev_info { 52 const struct mhi_controller_config *config; 53 const struct mhi_controller_config *vf_config; 54 const char *name; 55 const char *fw; 56 const char *edl; 57 bool edl_trigger; 58 unsigned int bar_num; 59 unsigned int dma_data_width; 60 unsigned int vf_dma_data_width; 61 unsigned int mru_default; 62 bool sideband_wake; 63 bool no_m3; 64 bool reset_on_remove; 65 }; 66 67 #define MHI_CHANNEL_CONFIG_UL(ch_num, ch_name, el_count, ev_ring) \ 68 { \ 69 .num = ch_num, \ 70 .name = ch_name, \ 71 .num_elements = el_count, \ 72 .event_ring = ev_ring, \ 73 .dir = DMA_TO_DEVICE, \ 74 .ee_mask = BIT(MHI_EE_AMSS), \ 75 .pollcfg = 0, \ 76 .doorbell = MHI_DB_BRST_DISABLE, \ 77 .lpm_notify = false, \ 78 .offload_channel = false, \ 79 .doorbell_mode_switch = false, \ 80 } \ 81 82 #define MHI_CHANNEL_CONFIG_DL(ch_num, ch_name, el_count, ev_ring) \ 83 { \ 84 .num = ch_num, \ 85 .name = ch_name, \ 86 .num_elements = el_count, \ 87 .event_ring = ev_ring, \ 88 .dir = DMA_FROM_DEVICE, \ 89 .ee_mask = BIT(MHI_EE_AMSS), \ 90 .pollcfg = 0, \ 91 .doorbell = MHI_DB_BRST_DISABLE, \ 92 .lpm_notify = false, \ 93 .offload_channel = false, \ 94 .doorbell_mode_switch = false, \ 95 } 96 97 #define MHI_EVENT_CONFIG_CTRL(ev_ring, el_count) \ 98 { \ 99 .num_elements = el_count, \ 100 .irq_moderation_ms = 0, \ 101 .irq = (ev_ring) + 1, \ 102 .priority = 1, \ 103 .mode = MHI_DB_BRST_DISABLE, \ 104 .data_type = MHI_ER_CTRL, \ 105 .hardware_event = false, \ 106 .client_managed = false, \ 107 .offload_channel = false, \ 108 } 109 110 #define MHI_CHANNEL_CONFIG_HW_UL(ch_num, ch_name, el_count, ev_ring) \ 111 { \ 112 .num = ch_num, \ 113 .name = ch_name, \ 114 .num_elements = el_count, \ 115 .event_ring = ev_ring, \ 116 .dir = DMA_TO_DEVICE, \ 117 .ee_mask = BIT(MHI_EE_AMSS), \ 118 .pollcfg = 0, \ 119 .doorbell = MHI_DB_BRST_ENABLE, \ 120 .lpm_notify = false, \ 121 .offload_channel = false, \ 122 .doorbell_mode_switch = true, \ 123 } \ 124 125 #define MHI_CHANNEL_CONFIG_HW_DL(ch_num, ch_name, el_count, ev_ring) \ 126 { \ 127 .num = ch_num, \ 128 .name = ch_name, \ 129 .num_elements = el_count, \ 130 .event_ring = ev_ring, \ 131 .dir = DMA_FROM_DEVICE, \ 132 .ee_mask = BIT(MHI_EE_AMSS), \ 133 .pollcfg = 0, \ 134 .doorbell = MHI_DB_BRST_ENABLE, \ 135 .lpm_notify = false, \ 136 .offload_channel = false, \ 137 .doorbell_mode_switch = true, \ 138 } 139 140 #define MHI_CHANNEL_CONFIG_UL_SBL(ch_num, ch_name, el_count, ev_ring) \ 141 { \ 142 .num = ch_num, \ 143 .name = ch_name, \ 144 .num_elements = el_count, \ 145 .event_ring = ev_ring, \ 146 .dir = DMA_TO_DEVICE, \ 147 .ee_mask = BIT(MHI_EE_SBL), \ 148 .pollcfg = 0, \ 149 .doorbell = MHI_DB_BRST_DISABLE, \ 150 .lpm_notify = false, \ 151 .offload_channel = false, \ 152 .doorbell_mode_switch = false, \ 153 } \ 154 155 #define MHI_CHANNEL_CONFIG_DL_SBL(ch_num, ch_name, el_count, ev_ring) \ 156 { \ 157 .num = ch_num, \ 158 .name = ch_name, \ 159 .num_elements = el_count, \ 160 .event_ring = ev_ring, \ 161 .dir = DMA_FROM_DEVICE, \ 162 .ee_mask = BIT(MHI_EE_SBL), \ 163 .pollcfg = 0, \ 164 .doorbell = MHI_DB_BRST_DISABLE, \ 165 .lpm_notify = false, \ 166 .offload_channel = false, \ 167 .doorbell_mode_switch = false, \ 168 } 169 170 #define MHI_CHANNEL_CONFIG_UL_FP(ch_num, ch_name, el_count, ev_ring) \ 171 { \ 172 .num = ch_num, \ 173 .name = ch_name, \ 174 .num_elements = el_count, \ 175 .event_ring = ev_ring, \ 176 .dir = DMA_TO_DEVICE, \ 177 .ee_mask = BIT(MHI_EE_FP), \ 178 .pollcfg = 0, \ 179 .doorbell = MHI_DB_BRST_DISABLE, \ 180 .lpm_notify = false, \ 181 .offload_channel = false, \ 182 .doorbell_mode_switch = false, \ 183 } \ 184 185 #define MHI_CHANNEL_CONFIG_DL_FP(ch_num, ch_name, el_count, ev_ring) \ 186 { \ 187 .num = ch_num, \ 188 .name = ch_name, \ 189 .num_elements = el_count, \ 190 .event_ring = ev_ring, \ 191 .dir = DMA_FROM_DEVICE, \ 192 .ee_mask = BIT(MHI_EE_FP), \ 193 .pollcfg = 0, \ 194 .doorbell = MHI_DB_BRST_DISABLE, \ 195 .lpm_notify = false, \ 196 .offload_channel = false, \ 197 .doorbell_mode_switch = false, \ 198 } 199 200 #define MHI_EVENT_CONFIG_DATA(ev_ring, el_count) \ 201 { \ 202 .num_elements = el_count, \ 203 .irq_moderation_ms = 5, \ 204 .irq = (ev_ring) + 1, \ 205 .priority = 1, \ 206 .mode = MHI_DB_BRST_DISABLE, \ 207 .data_type = MHI_ER_DATA, \ 208 .hardware_event = false, \ 209 .client_managed = false, \ 210 .offload_channel = false, \ 211 } 212 213 #define MHI_EVENT_CONFIG_SW_DATA(ev_ring, el_count) \ 214 { \ 215 .num_elements = el_count, \ 216 .irq_moderation_ms = 0, \ 217 .irq = (ev_ring) + 1, \ 218 .priority = 1, \ 219 .mode = MHI_DB_BRST_DISABLE, \ 220 .data_type = MHI_ER_DATA, \ 221 .hardware_event = false, \ 222 .client_managed = false, \ 223 .offload_channel = false, \ 224 } 225 226 #define MHI_EVENT_CONFIG_HW_DATA(ev_ring, el_count, ch_num) \ 227 { \ 228 .num_elements = el_count, \ 229 .irq_moderation_ms = 1, \ 230 .irq = (ev_ring) + 1, \ 231 .priority = 1, \ 232 .mode = MHI_DB_BRST_DISABLE, \ 233 .data_type = MHI_ER_DATA, \ 234 .hardware_event = true, \ 235 .client_managed = false, \ 236 .offload_channel = false, \ 237 .channel = ch_num, \ 238 } 239 240 static const struct mhi_channel_config mhi_qcom_qdu100_channels[] = { 241 MHI_CHANNEL_CONFIG_UL(0, "LOOPBACK", 32, 2), 242 MHI_CHANNEL_CONFIG_DL(1, "LOOPBACK", 32, 2), 243 MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 128, 1), 244 MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 128, 1), 245 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 64, 3), 246 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 64, 3), 247 MHI_CHANNEL_CONFIG_UL(9, "QDSS", 64, 3), 248 MHI_CHANNEL_CONFIG_UL(14, "NMEA", 32, 4), 249 MHI_CHANNEL_CONFIG_DL(15, "NMEA", 32, 4), 250 MHI_CHANNEL_CONFIG_UL(16, "CSM_CTRL", 32, 4), 251 MHI_CHANNEL_CONFIG_DL(17, "CSM_CTRL", 32, 4), 252 MHI_CHANNEL_CONFIG_UL(40, "MHI_PHC", 32, 4), 253 MHI_CHANNEL_CONFIG_DL(41, "MHI_PHC", 32, 4), 254 MHI_CHANNEL_CONFIG_UL(46, "IP_SW0", 256, 5), 255 MHI_CHANNEL_CONFIG_DL(47, "IP_SW0", 256, 5), 256 }; 257 258 static struct mhi_event_config mhi_qcom_qdu100_events[] = { 259 /* first ring is control+data ring */ 260 MHI_EVENT_CONFIG_CTRL(0, 64), 261 /* SAHARA dedicated event ring */ 262 MHI_EVENT_CONFIG_SW_DATA(1, 256), 263 /* Software channels dedicated event ring */ 264 MHI_EVENT_CONFIG_SW_DATA(2, 64), 265 MHI_EVENT_CONFIG_SW_DATA(3, 256), 266 MHI_EVENT_CONFIG_SW_DATA(4, 256), 267 /* Software IP channels dedicated event ring */ 268 MHI_EVENT_CONFIG_SW_DATA(5, 512), 269 MHI_EVENT_CONFIG_SW_DATA(6, 512), 270 MHI_EVENT_CONFIG_SW_DATA(7, 512), 271 }; 272 273 static const struct mhi_controller_config mhi_qcom_qdu100_config = { 274 .max_channels = 128, 275 .timeout_ms = 120000, 276 .num_channels = ARRAY_SIZE(mhi_qcom_qdu100_channels), 277 .ch_cfg = mhi_qcom_qdu100_channels, 278 .num_events = ARRAY_SIZE(mhi_qcom_qdu100_events), 279 .event_cfg = mhi_qcom_qdu100_events, 280 }; 281 282 static const struct mhi_pci_dev_info mhi_qcom_qdu100_info = { 283 .name = "qcom-qdu100", 284 .fw = "qcom/qdu100/xbl_s.melf", 285 .edl_trigger = true, 286 .config = &mhi_qcom_qdu100_config, 287 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 288 .dma_data_width = 32, 289 .vf_dma_data_width = 40, 290 .sideband_wake = false, 291 .no_m3 = true, 292 .reset_on_remove = true, 293 }; 294 295 static const struct mhi_channel_config mhi_qcom_sa8775p_channels[] = { 296 MHI_CHANNEL_CONFIG_UL(46, "IP_SW0", 2048, 1), 297 MHI_CHANNEL_CONFIG_DL(47, "IP_SW0", 2048, 2), 298 }; 299 300 static struct mhi_event_config mhi_qcom_sa8775p_events[] = { 301 /* first ring is control+data ring */ 302 MHI_EVENT_CONFIG_CTRL(0, 64), 303 /* Software channels dedicated event ring */ 304 MHI_EVENT_CONFIG_SW_DATA(1, 64), 305 MHI_EVENT_CONFIG_SW_DATA(2, 64), 306 }; 307 308 static const struct mhi_channel_config modem_qcom_v1_mhi_channels[] = { 309 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 16, 1), 310 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 16, 1), 311 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 4, 0), 312 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 4, 0), 313 MHI_CHANNEL_CONFIG_UL(14, "QMI", 4, 0), 314 MHI_CHANNEL_CONFIG_DL(15, "QMI", 4, 0), 315 MHI_CHANNEL_CONFIG_UL(20, "IPCR", 8, 0), 316 MHI_CHANNEL_CONFIG_DL(21, "IPCR", 8, 0), 317 MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0), 318 MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0), 319 MHI_CHANNEL_CONFIG_UL(46, "IP_SW0", 64, 2), 320 MHI_CHANNEL_CONFIG_DL(47, "IP_SW0", 64, 3), 321 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 4), 322 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 128, 5), 323 }; 324 325 static struct mhi_event_config modem_qcom_v1_mhi_events[] = { 326 /* first ring is control+data ring */ 327 MHI_EVENT_CONFIG_CTRL(0, 64), 328 /* DIAG dedicated event ring */ 329 MHI_EVENT_CONFIG_DATA(1, 128), 330 /* Software channels dedicated event ring */ 331 MHI_EVENT_CONFIG_SW_DATA(2, 64), 332 MHI_EVENT_CONFIG_SW_DATA(3, 64), 333 /* Hardware channels request dedicated hardware event rings */ 334 MHI_EVENT_CONFIG_HW_DATA(4, 1024, 100), 335 MHI_EVENT_CONFIG_HW_DATA(5, 2048, 101) 336 }; 337 338 static const struct mhi_controller_config mhi_qcom_sa8775p_config = { 339 .max_channels = 128, 340 .timeout_ms = 8000, 341 .num_channels = ARRAY_SIZE(mhi_qcom_sa8775p_channels), 342 .ch_cfg = mhi_qcom_sa8775p_channels, 343 .num_events = ARRAY_SIZE(mhi_qcom_sa8775p_events), 344 .event_cfg = mhi_qcom_sa8775p_events, 345 }; 346 347 static const struct mhi_controller_config modem_qcom_v2_mhiv_config = { 348 .max_channels = 128, 349 .timeout_ms = 8000, 350 .ready_timeout_ms = 50000, 351 .num_channels = ARRAY_SIZE(modem_qcom_v1_mhi_channels), 352 .ch_cfg = modem_qcom_v1_mhi_channels, 353 .num_events = ARRAY_SIZE(modem_qcom_v1_mhi_events), 354 .event_cfg = modem_qcom_v1_mhi_events, 355 }; 356 357 static const struct mhi_controller_config modem_qcom_v1_mhiv_config = { 358 .max_channels = 128, 359 .timeout_ms = 8000, 360 .num_channels = ARRAY_SIZE(modem_qcom_v1_mhi_channels), 361 .ch_cfg = modem_qcom_v1_mhi_channels, 362 .num_events = ARRAY_SIZE(modem_qcom_v1_mhi_events), 363 .event_cfg = modem_qcom_v1_mhi_events, 364 }; 365 366 static const struct mhi_pci_dev_info mhi_qcom_sa8775p_info = { 367 .name = "qcom-sa8775p", 368 .edl_trigger = false, 369 .config = &mhi_qcom_sa8775p_config, 370 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 371 .dma_data_width = 32, 372 .mru_default = 32768, 373 .sideband_wake = false, 374 }; 375 376 static const struct mhi_pci_dev_info mhi_qcom_sdx75_info = { 377 .name = "qcom-sdx75m", 378 .fw = "qcom/sdx75m/xbl.elf", 379 .edl = "qcom/sdx75m/edl.mbn", 380 .edl_trigger = true, 381 .config = &modem_qcom_v2_mhiv_config, 382 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 383 .dma_data_width = 32, 384 .sideband_wake = false, 385 }; 386 387 static const struct mhi_pci_dev_info mhi_qcom_sdx65_info = { 388 .name = "qcom-sdx65m", 389 .fw = "qcom/sdx65m/xbl.elf", 390 .edl = "qcom/sdx65m/edl.mbn", 391 .edl_trigger = true, 392 .config = &modem_qcom_v1_mhiv_config, 393 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 394 .dma_data_width = 32, 395 .sideband_wake = false, 396 }; 397 398 static const struct mhi_pci_dev_info mhi_qcom_sdx55_info = { 399 .name = "qcom-sdx55m", 400 .fw = "qcom/sdx55m/sbl1.mbn", 401 .edl = "qcom/sdx55m/edl.mbn", 402 .edl_trigger = true, 403 .config = &modem_qcom_v1_mhiv_config, 404 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 405 .dma_data_width = 32, 406 .mru_default = 32768, 407 .sideband_wake = false, 408 }; 409 410 static const struct mhi_pci_dev_info mhi_qcom_sdx24_info = { 411 .name = "qcom-sdx24", 412 .edl = "qcom/prog_firehose_sdx24.mbn", 413 .config = &modem_qcom_v1_mhiv_config, 414 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 415 .dma_data_width = 32, 416 .sideband_wake = true, 417 }; 418 419 static const struct mhi_channel_config mhi_quectel_em1xx_channels[] = { 420 MHI_CHANNEL_CONFIG_UL(0, "NMEA", 32, 0), 421 MHI_CHANNEL_CONFIG_DL(1, "NMEA", 32, 0), 422 MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), 423 MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0), 424 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 32, 1), 425 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1), 426 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0), 427 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0), 428 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 429 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 430 /* The EDL firmware is a flash-programmer exposing firehose protocol */ 431 MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0), 432 MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0), 433 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2), 434 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3), 435 }; 436 437 static struct mhi_event_config mhi_quectel_em1xx_events[] = { 438 MHI_EVENT_CONFIG_CTRL(0, 128), 439 MHI_EVENT_CONFIG_DATA(1, 128), 440 MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100), 441 MHI_EVENT_CONFIG_HW_DATA(3, 1024, 101) 442 }; 443 444 static const struct mhi_controller_config modem_quectel_em1xx_config = { 445 .max_channels = 128, 446 .timeout_ms = 20000, 447 .num_channels = ARRAY_SIZE(mhi_quectel_em1xx_channels), 448 .ch_cfg = mhi_quectel_em1xx_channels, 449 .num_events = ARRAY_SIZE(mhi_quectel_em1xx_events), 450 .event_cfg = mhi_quectel_em1xx_events, 451 }; 452 453 static const struct mhi_pci_dev_info mhi_quectel_em1xx_info = { 454 .name = "quectel-em1xx", 455 .edl = "qcom/prog_firehose_sdx24.mbn", 456 .config = &modem_quectel_em1xx_config, 457 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 458 .dma_data_width = 32, 459 .mru_default = 32768, 460 .sideband_wake = true, 461 }; 462 463 static const struct mhi_pci_dev_info mhi_quectel_rm5xx_info = { 464 .name = "quectel-rm5xx", 465 .edl = "qcom/prog_firehose_sdx6x.elf", 466 .config = &modem_quectel_em1xx_config, 467 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 468 .dma_data_width = 32, 469 .mru_default = 32768, 470 .sideband_wake = true, 471 }; 472 473 static const struct mhi_channel_config mhi_foxconn_sdx55_channels[] = { 474 MHI_CHANNEL_CONFIG_UL(0, "LOOPBACK", 32, 0), 475 MHI_CHANNEL_CONFIG_DL(1, "LOOPBACK", 32, 0), 476 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 32, 1), 477 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1), 478 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0), 479 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0), 480 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 481 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 482 MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0), 483 MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0), 484 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2), 485 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3), 486 }; 487 488 static const struct mhi_channel_config mhi_foxconn_sdx61_channels[] = { 489 MHI_CHANNEL_CONFIG_UL(0, "LOOPBACK", 32, 0), 490 MHI_CHANNEL_CONFIG_DL(1, "LOOPBACK", 32, 0), 491 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 32, 1), 492 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1), 493 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0), 494 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0), 495 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 496 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 497 MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0), 498 MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0), 499 MHI_CHANNEL_CONFIG_UL(50, "NMEA", 32, 0), 500 MHI_CHANNEL_CONFIG_DL(51, "NMEA", 32, 0), 501 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2), 502 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3), 503 }; 504 505 static struct mhi_event_config mhi_foxconn_sdx55_events[] = { 506 MHI_EVENT_CONFIG_CTRL(0, 128), 507 MHI_EVENT_CONFIG_DATA(1, 128), 508 MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100), 509 MHI_EVENT_CONFIG_HW_DATA(3, 1024, 101) 510 }; 511 512 static const struct mhi_controller_config modem_foxconn_sdx55_config = { 513 .max_channels = 128, 514 .timeout_ms = 20000, 515 .num_channels = ARRAY_SIZE(mhi_foxconn_sdx55_channels), 516 .ch_cfg = mhi_foxconn_sdx55_channels, 517 .num_events = ARRAY_SIZE(mhi_foxconn_sdx55_events), 518 .event_cfg = mhi_foxconn_sdx55_events, 519 }; 520 521 static const struct mhi_controller_config modem_foxconn_sdx61_config = { 522 .max_channels = 128, 523 .timeout_ms = 20000, 524 .num_channels = ARRAY_SIZE(mhi_foxconn_sdx61_channels), 525 .ch_cfg = mhi_foxconn_sdx61_channels, 526 .num_events = ARRAY_SIZE(mhi_foxconn_sdx55_events), 527 .event_cfg = mhi_foxconn_sdx55_events, 528 }; 529 530 static const struct mhi_controller_config modem_foxconn_sdx72_config = { 531 .max_channels = 128, 532 .timeout_ms = 20000, 533 .ready_timeout_ms = 50000, 534 .num_channels = ARRAY_SIZE(mhi_foxconn_sdx55_channels), 535 .ch_cfg = mhi_foxconn_sdx55_channels, 536 .num_events = ARRAY_SIZE(mhi_foxconn_sdx55_events), 537 .event_cfg = mhi_foxconn_sdx55_events, 538 }; 539 540 static const struct mhi_pci_dev_info mhi_foxconn_sdx55_info = { 541 .name = "foxconn-sdx55", 542 .edl = "qcom/sdx55m/foxconn/prog_firehose_sdx55.mbn", 543 .edl_trigger = true, 544 .config = &modem_foxconn_sdx55_config, 545 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 546 .dma_data_width = 32, 547 .mru_default = 32768, 548 .sideband_wake = false, 549 }; 550 551 static const struct mhi_pci_dev_info mhi_foxconn_t99w175_info = { 552 .name = "foxconn-t99w175", 553 .edl = "qcom/sdx55m/foxconn/prog_firehose_sdx55.mbn", 554 .edl_trigger = true, 555 .config = &modem_foxconn_sdx55_config, 556 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 557 .dma_data_width = 32, 558 .mru_default = 32768, 559 .sideband_wake = false, 560 }; 561 562 static const struct mhi_pci_dev_info mhi_foxconn_dw5930e_info = { 563 .name = "foxconn-dw5930e", 564 .edl = "qcom/sdx55m/foxconn/prog_firehose_sdx55.mbn", 565 .edl_trigger = true, 566 .config = &modem_foxconn_sdx55_config, 567 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 568 .dma_data_width = 32, 569 .mru_default = 32768, 570 .sideband_wake = false, 571 }; 572 573 static const struct mhi_pci_dev_info mhi_foxconn_t99w368_info = { 574 .name = "foxconn-t99w368", 575 .edl = "qcom/sdx65m/foxconn/prog_firehose_lite.elf", 576 .edl_trigger = true, 577 .config = &modem_foxconn_sdx55_config, 578 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 579 .dma_data_width = 32, 580 .mru_default = 32768, 581 .sideband_wake = false, 582 }; 583 584 static const struct mhi_pci_dev_info mhi_foxconn_t99w373_info = { 585 .name = "foxconn-t99w373", 586 .edl = "qcom/sdx65m/foxconn/prog_firehose_lite.elf", 587 .edl_trigger = true, 588 .config = &modem_foxconn_sdx55_config, 589 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 590 .dma_data_width = 32, 591 .mru_default = 32768, 592 .sideband_wake = false, 593 }; 594 595 static const struct mhi_pci_dev_info mhi_foxconn_t99w510_info = { 596 .name = "foxconn-t99w510", 597 .edl = "qcom/sdx24m/foxconn/prog_firehose_sdx24.mbn", 598 .edl_trigger = true, 599 .config = &modem_foxconn_sdx55_config, 600 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 601 .dma_data_width = 32, 602 .mru_default = 32768, 603 .sideband_wake = false, 604 }; 605 606 static const struct mhi_pci_dev_info mhi_foxconn_dw5932e_info = { 607 .name = "foxconn-dw5932e", 608 .edl = "qcom/sdx65m/foxconn/prog_firehose_lite.elf", 609 .edl_trigger = true, 610 .config = &modem_foxconn_sdx55_config, 611 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 612 .dma_data_width = 32, 613 .mru_default = 32768, 614 .sideband_wake = false, 615 }; 616 617 static const struct mhi_pci_dev_info mhi_foxconn_t99w640_info = { 618 .name = "foxconn-t99w640", 619 .edl = "qcom/sdx72m/foxconn/edl.mbn", 620 .edl_trigger = true, 621 .config = &modem_foxconn_sdx72_config, 622 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 623 .dma_data_width = 32, 624 .mru_default = 32768, 625 .sideband_wake = false, 626 }; 627 628 static const struct mhi_pci_dev_info mhi_foxconn_dw5934e_info = { 629 .name = "foxconn-dw5934e", 630 .edl = "qcom/sdx72m/foxconn/edl.mbn", 631 .edl_trigger = true, 632 .config = &modem_foxconn_sdx72_config, 633 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 634 .dma_data_width = 32, 635 .mru_default = 32768, 636 .sideband_wake = false, 637 }; 638 639 static const struct mhi_pci_dev_info mhi_foxconn_t99w696_info = { 640 .name = "foxconn-t99w696", 641 .edl = "qcom/sdx61/foxconn/prog_firehose_lite.elf", 642 .edl_trigger = true, 643 .config = &modem_foxconn_sdx61_config, 644 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 645 .dma_data_width = 32, 646 .mru_default = 32768, 647 .sideband_wake = false, 648 }; 649 650 static const struct mhi_pci_dev_info mhi_foxconn_t99w760_info = { 651 .name = "foxconn-t99w760", 652 .edl = "qcom/sdx35/foxconn/xbl_s_devprg_ns.melf", 653 .edl_trigger = true, 654 .config = &modem_foxconn_sdx61_config, 655 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 656 .dma_data_width = 32, 657 .mru_default = 32768, 658 .sideband_wake = false, 659 }; 660 661 static const struct mhi_channel_config mhi_mv3x_channels[] = { 662 MHI_CHANNEL_CONFIG_UL(0, "LOOPBACK", 64, 0), 663 MHI_CHANNEL_CONFIG_DL(1, "LOOPBACK", 64, 0), 664 /* MBIM Control Channel */ 665 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 64, 0), 666 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 64, 0), 667 /* MBIM Data Channel */ 668 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 512, 2), 669 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 512, 3), 670 }; 671 672 static struct mhi_event_config mhi_mv3x_events[] = { 673 MHI_EVENT_CONFIG_CTRL(0, 256), 674 MHI_EVENT_CONFIG_DATA(1, 256), 675 MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100), 676 MHI_EVENT_CONFIG_HW_DATA(3, 1024, 101), 677 }; 678 679 static const struct mhi_controller_config modem_mv3x_config = { 680 .max_channels = 128, 681 .timeout_ms = 20000, 682 .num_channels = ARRAY_SIZE(mhi_mv3x_channels), 683 .ch_cfg = mhi_mv3x_channels, 684 .num_events = ARRAY_SIZE(mhi_mv3x_events), 685 .event_cfg = mhi_mv3x_events, 686 }; 687 688 static const struct mhi_pci_dev_info mhi_mv31_info = { 689 .name = "cinterion-mv31", 690 .config = &modem_mv3x_config, 691 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 692 .dma_data_width = 32, 693 .mru_default = 32768, 694 }; 695 696 static const struct mhi_pci_dev_info mhi_mv32_info = { 697 .name = "cinterion-mv32", 698 .config = &modem_mv3x_config, 699 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 700 .dma_data_width = 32, 701 .mru_default = 32768, 702 }; 703 704 static const struct mhi_channel_config mhi_sierra_em919x_channels[] = { 705 MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), 706 MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 256, 0), 707 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 32, 0), 708 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 0), 709 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 128, 0), 710 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 128, 0), 711 MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), 712 MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), 713 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 714 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 715 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 512, 1), 716 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 512, 2), 717 }; 718 719 static struct mhi_event_config modem_sierra_em919x_mhi_events[] = { 720 /* first ring is control+data and DIAG ring */ 721 MHI_EVENT_CONFIG_CTRL(0, 2048), 722 /* Hardware channels request dedicated hardware event rings */ 723 MHI_EVENT_CONFIG_HW_DATA(1, 2048, 100), 724 MHI_EVENT_CONFIG_HW_DATA(2, 2048, 101) 725 }; 726 727 static const struct mhi_controller_config modem_sierra_em919x_config = { 728 .max_channels = 128, 729 .timeout_ms = 24000, 730 .num_channels = ARRAY_SIZE(mhi_sierra_em919x_channels), 731 .ch_cfg = mhi_sierra_em919x_channels, 732 .num_events = ARRAY_SIZE(modem_sierra_em919x_mhi_events), 733 .event_cfg = modem_sierra_em919x_mhi_events, 734 }; 735 736 static const struct mhi_pci_dev_info mhi_sierra_em919x_info = { 737 .name = "sierra-em919x", 738 .config = &modem_sierra_em919x_config, 739 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 740 .dma_data_width = 32, 741 .mru_default = 32768, 742 .sideband_wake = false, 743 }; 744 745 static const struct mhi_channel_config mhi_telit_fn980_hw_v1_channels[] = { 746 MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), 747 MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), 748 MHI_CHANNEL_CONFIG_UL(20, "IPCR", 16, 0), 749 MHI_CHANNEL_CONFIG_DL(21, "IPCR", 16, 0), 750 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 1), 751 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 128, 2), 752 }; 753 754 static struct mhi_event_config mhi_telit_fn980_hw_v1_events[] = { 755 MHI_EVENT_CONFIG_CTRL(0, 128), 756 MHI_EVENT_CONFIG_HW_DATA(1, 1024, 100), 757 MHI_EVENT_CONFIG_HW_DATA(2, 2048, 101) 758 }; 759 760 static const struct mhi_controller_config modem_telit_fn980_hw_v1_config = { 761 .max_channels = 128, 762 .timeout_ms = 20000, 763 .num_channels = ARRAY_SIZE(mhi_telit_fn980_hw_v1_channels), 764 .ch_cfg = mhi_telit_fn980_hw_v1_channels, 765 .num_events = ARRAY_SIZE(mhi_telit_fn980_hw_v1_events), 766 .event_cfg = mhi_telit_fn980_hw_v1_events, 767 }; 768 769 static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v1_info = { 770 .name = "telit-fn980-hwv1", 771 .fw = "qcom/sdx55m/sbl1.mbn", 772 .edl = "qcom/sdx55m/edl.mbn", 773 .config = &modem_telit_fn980_hw_v1_config, 774 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 775 .dma_data_width = 32, 776 .mru_default = 32768, 777 .sideband_wake = false, 778 }; 779 780 static const struct mhi_channel_config mhi_telit_fn990_channels[] = { 781 MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), 782 MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0), 783 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 64, 1), 784 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 64, 1), 785 MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0), 786 MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0), 787 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 788 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 789 MHI_CHANNEL_CONFIG_UL(92, "DUN2", 32, 1), 790 MHI_CHANNEL_CONFIG_DL(93, "DUN2", 32, 1), 791 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2), 792 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3), 793 }; 794 795 static struct mhi_event_config mhi_telit_fn990_events[] = { 796 MHI_EVENT_CONFIG_CTRL(0, 128), 797 MHI_EVENT_CONFIG_DATA(1, 128), 798 MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100), 799 MHI_EVENT_CONFIG_HW_DATA(3, 2048, 101) 800 }; 801 802 static const struct mhi_controller_config modem_telit_fn990_config = { 803 .max_channels = 128, 804 .timeout_ms = 20000, 805 .num_channels = ARRAY_SIZE(mhi_telit_fn990_channels), 806 .ch_cfg = mhi_telit_fn990_channels, 807 .num_events = ARRAY_SIZE(mhi_telit_fn990_events), 808 .event_cfg = mhi_telit_fn990_events, 809 }; 810 811 static const struct mhi_pci_dev_info mhi_telit_fn990_info = { 812 .name = "telit-fn990", 813 .config = &modem_telit_fn990_config, 814 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 815 .dma_data_width = 32, 816 .sideband_wake = false, 817 .mru_default = 32768, 818 }; 819 820 static const struct mhi_pci_dev_info mhi_telit_fe990a_info = { 821 .name = "telit-fe990a", 822 .config = &modem_telit_fn990_config, 823 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 824 .dma_data_width = 32, 825 .sideband_wake = false, 826 .mru_default = 32768, 827 }; 828 829 static const struct mhi_channel_config mhi_telit_fn920c04_channels[] = { 830 MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0), 831 MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0), 832 MHI_CHANNEL_CONFIG_UL(4, "DIAG", 64, 1), 833 MHI_CHANNEL_CONFIG_DL(5, "DIAG", 64, 1), 834 MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0), 835 MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0), 836 MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0), 837 MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0), 838 MHI_CHANNEL_CONFIG_UL_FP(34, "FIREHOSE", 32, 0), 839 MHI_CHANNEL_CONFIG_DL_FP(35, "FIREHOSE", 32, 0), 840 MHI_CHANNEL_CONFIG_UL(92, "DUN2", 32, 1), 841 MHI_CHANNEL_CONFIG_DL(93, "DUN2", 32, 1), 842 MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 2), 843 MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 128, 3), 844 }; 845 846 static const struct mhi_controller_config modem_telit_fn920c04_config = { 847 .max_channels = 128, 848 .timeout_ms = 50000, 849 .num_channels = ARRAY_SIZE(mhi_telit_fn920c04_channels), 850 .ch_cfg = mhi_telit_fn920c04_channels, 851 .num_events = ARRAY_SIZE(mhi_telit_fn990_events), 852 .event_cfg = mhi_telit_fn990_events, 853 }; 854 855 static const struct mhi_pci_dev_info mhi_telit_fn920c04_info = { 856 .name = "telit-fn920c04", 857 .config = &modem_telit_fn920c04_config, 858 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 859 .dma_data_width = 32, 860 .sideband_wake = false, 861 .mru_default = 32768, 862 .edl_trigger = true, 863 }; 864 865 static const struct mhi_pci_dev_info mhi_telit_fn990b40_info = { 866 .name = "telit-fn990b40", 867 .config = &modem_telit_fn920c04_config, 868 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 869 .dma_data_width = 32, 870 .sideband_wake = false, 871 .mru_default = 32768, 872 .edl_trigger = true, 873 }; 874 875 static const struct mhi_pci_dev_info mhi_telit_fe990b40_info = { 876 .name = "telit-fe990b40", 877 .config = &modem_telit_fn920c04_config, 878 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 879 .dma_data_width = 32, 880 .sideband_wake = false, 881 .mru_default = 32768, 882 .edl_trigger = true, 883 }; 884 885 static const struct mhi_pci_dev_info mhi_netprisma_lcur57_info = { 886 .name = "netprisma-lcur57", 887 .edl = "qcom/prog_firehose_sdx24.mbn", 888 .config = &modem_quectel_em1xx_config, 889 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 890 .dma_data_width = 32, 891 .mru_default = 32768, 892 .sideband_wake = true, 893 }; 894 895 static const struct mhi_pci_dev_info mhi_netprisma_fcun69_info = { 896 .name = "netprisma-fcun69", 897 .edl = "qcom/prog_firehose_sdx6x.elf", 898 .config = &modem_quectel_em1xx_config, 899 .bar_num = MHI_PCI_DEFAULT_BAR_NUM, 900 .dma_data_width = 32, 901 .mru_default = 32768, 902 .sideband_wake = true, 903 }; 904 905 /* Keep the list sorted based on the PID. New VID should be added as the last entry */ 906 static const struct pci_device_id mhi_pci_id_table[] = { 907 {PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0116), 908 .driver_data = (kernel_ulong_t) &mhi_qcom_sa8775p_info }, 909 /* Telit FN920C04 (sdx35) */ 910 {PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x011a, 0x1c5d, 0x2020), 911 .driver_data = (kernel_ulong_t) &mhi_telit_fn920c04_info }, 912 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0304), 913 .driver_data = (kernel_ulong_t) &mhi_qcom_sdx24_info }, 914 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, PCI_VENDOR_ID_QCOM, 0x010c), 915 .driver_data = (kernel_ulong_t) &mhi_foxconn_sdx55_info }, 916 /* EM919x (sdx55), use the same vid:pid as qcom-sdx55m */ 917 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x18d7, 0x0200), 918 .driver_data = (kernel_ulong_t) &mhi_sierra_em919x_info }, 919 /* EM929x (sdx65), use the same configuration as EM919x */ 920 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x18d7, 0x0301), 921 .driver_data = (kernel_ulong_t) &mhi_sierra_em919x_info }, 922 /* Telit FN980 hardware revision v1 */ 923 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x1C5D, 0x2000), 924 .driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v1_info }, 925 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0306), 926 .driver_data = (kernel_ulong_t) &mhi_qcom_sdx55_info }, 927 /* Telit FN990 */ 928 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2010), 929 .driver_data = (kernel_ulong_t) &mhi_telit_fn990_info }, 930 /* Telit FE990A */ 931 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2015), 932 .driver_data = (kernel_ulong_t) &mhi_telit_fe990a_info }, 933 /* Foxconn T99W696, all variants */ 934 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, PCI_ANY_ID), 935 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, 936 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0308), 937 .driver_data = (kernel_ulong_t) &mhi_qcom_sdx65_info }, 938 /* Telit FN990B40 (sdx72) */ 939 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0309, 0x1c5d, 0x201a), 940 .driver_data = (kernel_ulong_t) &mhi_telit_fn990b40_info }, 941 /* Telit FE990B40 (sdx72) */ 942 { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0309, 0x1c5d, 0x2025), 943 .driver_data = (kernel_ulong_t) &mhi_telit_fe990b40_info }, 944 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0309), 945 .driver_data = (kernel_ulong_t) &mhi_qcom_sdx75_info }, 946 /* QDU100, x100-DU */ 947 { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0601), 948 .driver_data = (kernel_ulong_t) &mhi_qcom_qdu100_info }, 949 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1001), /* EM120R-GL (sdx24) */ 950 .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, 951 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1002), /* EM160R-GL (sdx24) */ 952 .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, 953 /* RM520N-GL (sdx6x), eSIM */ 954 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1004), 955 .driver_data = (kernel_ulong_t) &mhi_quectel_rm5xx_info }, 956 /* RM520N-GL (sdx6x), Lenovo variant */ 957 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x1007), 958 .driver_data = (kernel_ulong_t) &mhi_quectel_rm5xx_info }, 959 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x100d), /* EM160R-GL (sdx24) */ 960 .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, 961 { PCI_DEVICE(PCI_VENDOR_ID_QUECTEL, 0x2001), /* EM120R-GL for FCCL (sdx24) */ 962 .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, 963 /* T99W175 (sdx55), Both for eSIM and Non-eSIM */ 964 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0ab), 965 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w175_info }, 966 /* DW5930e (sdx55), With eSIM, It's also T99W175 */ 967 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0b0), 968 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5930e_info }, 969 /* DW5930e (sdx55), Non-eSIM, It's also T99W175 */ 970 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0b1), 971 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5930e_info }, 972 /* T99W175 (sdx55), Based on Qualcomm new baseline */ 973 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0bf), 974 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w175_info }, 975 /* T99W175 (sdx55) */ 976 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0c3), 977 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w175_info }, 978 /* T99W368 (sdx65) */ 979 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0d8), 980 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w368_info }, 981 /* T99W373 (sdx62) */ 982 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0d9), 983 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w373_info }, 984 /* T99W510 (sdx24), variant 1 */ 985 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f0), 986 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w510_info }, 987 /* T99W510 (sdx24), variant 2 */ 988 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f1), 989 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w510_info }, 990 /* T99W510 (sdx24), variant 3 */ 991 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f2), 992 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w510_info }, 993 /* DW5932e-eSIM (sdx62), With eSIM */ 994 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f5), 995 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5932e_info }, 996 /* DW5932e (sdx62), Non-eSIM */ 997 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f9), 998 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5932e_info }, 999 /* T99W640 (sdx72) */ 1000 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe118), 1001 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w640_info }, 1002 /* DW5934e(sdx72), With eSIM */ 1003 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe11d), 1004 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5934e_info }, 1005 /* DW5934e(sdx72), Non-eSIM */ 1006 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe11e), 1007 .driver_data = (kernel_ulong_t) &mhi_foxconn_dw5934e_info }, 1008 { PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe123), 1009 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w760_info }, 1010 /* MV31-W (Cinterion) */ 1011 { PCI_DEVICE(PCI_VENDOR_ID_THALES, 0x00b3), 1012 .driver_data = (kernel_ulong_t) &mhi_mv31_info }, 1013 /* MV31-W (Cinterion), based on new baseline */ 1014 { PCI_DEVICE(PCI_VENDOR_ID_THALES, 0x00b4), 1015 .driver_data = (kernel_ulong_t) &mhi_mv31_info }, 1016 /* MV32-WA (Cinterion) */ 1017 { PCI_DEVICE(PCI_VENDOR_ID_THALES, 0x00ba), 1018 .driver_data = (kernel_ulong_t) &mhi_mv32_info }, 1019 /* MV32-WB (Cinterion) */ 1020 { PCI_DEVICE(PCI_VENDOR_ID_THALES, 0x00bb), 1021 .driver_data = (kernel_ulong_t) &mhi_mv32_info }, 1022 /* T99W175 (sdx55), HP variant */ 1023 { PCI_DEVICE(0x03f0, 0x0a6c), 1024 .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w175_info }, 1025 /* NETPRISMA LCUR57 (SDX24) */ 1026 { PCI_DEVICE(PCI_VENDOR_ID_NETPRISMA, 0x1000), 1027 .driver_data = (kernel_ulong_t) &mhi_netprisma_lcur57_info }, 1028 /* NETPRISMA FCUN69 (SDX6X) */ 1029 { PCI_DEVICE(PCI_VENDOR_ID_NETPRISMA, 0x1001), 1030 .driver_data = (kernel_ulong_t) &mhi_netprisma_fcun69_info }, 1031 { } 1032 }; 1033 MODULE_DEVICE_TABLE(pci, mhi_pci_id_table); 1034 1035 enum mhi_pci_device_status { 1036 MHI_PCI_DEV_STARTED, 1037 MHI_PCI_DEV_SUSPENDED, 1038 }; 1039 1040 struct mhi_pci_device { 1041 struct mhi_controller mhi_cntrl; 1042 struct pci_saved_state *pci_state; 1043 struct work_struct recovery_work; 1044 struct timer_list health_check_timer; 1045 unsigned long status; 1046 bool reset_on_remove; 1047 }; 1048 1049 static int mhi_pci_read_reg(struct mhi_controller *mhi_cntrl, 1050 void __iomem *addr, u32 *out) 1051 { 1052 *out = readl(addr); 1053 return 0; 1054 } 1055 1056 static void mhi_pci_write_reg(struct mhi_controller *mhi_cntrl, 1057 void __iomem *addr, u32 val) 1058 { 1059 writel(val, addr); 1060 } 1061 1062 static void mhi_pci_status_cb(struct mhi_controller *mhi_cntrl, 1063 enum mhi_callback cb) 1064 { 1065 struct pci_dev *pdev = to_pci_dev(mhi_cntrl->cntrl_dev); 1066 1067 /* Nothing to do for now */ 1068 switch (cb) { 1069 case MHI_CB_FATAL_ERROR: 1070 case MHI_CB_SYS_ERROR: 1071 dev_warn(&pdev->dev, "firmware crashed (%u)\n", cb); 1072 pm_runtime_forbid(&pdev->dev); 1073 break; 1074 case MHI_CB_EE_MISSION_MODE: 1075 pm_runtime_allow(&pdev->dev); 1076 break; 1077 default: 1078 break; 1079 } 1080 } 1081 1082 static void mhi_pci_wake_get_nop(struct mhi_controller *mhi_cntrl, bool force) 1083 { 1084 /* no-op */ 1085 } 1086 1087 static void mhi_pci_wake_put_nop(struct mhi_controller *mhi_cntrl, bool override) 1088 { 1089 /* no-op */ 1090 } 1091 1092 static void mhi_pci_wake_toggle_nop(struct mhi_controller *mhi_cntrl) 1093 { 1094 /* no-op */ 1095 } 1096 1097 static bool mhi_pci_is_alive(struct mhi_controller *mhi_cntrl) 1098 { 1099 struct pci_dev *pdev = to_pci_dev(mhi_cntrl->cntrl_dev); 1100 u16 vendor = 0; 1101 1102 if (pci_read_config_word(pci_physfn(pdev), PCI_VENDOR_ID, &vendor)) 1103 return false; 1104 1105 if (vendor == (u16) ~0 || vendor == 0) 1106 return false; 1107 1108 return true; 1109 } 1110 1111 static int mhi_pci_claim(struct mhi_controller *mhi_cntrl, 1112 unsigned int bar_num, u64 dma_mask) 1113 { 1114 struct pci_dev *pdev = to_pci_dev(mhi_cntrl->cntrl_dev); 1115 int err; 1116 1117 err = pcim_enable_device(pdev); 1118 if (err) { 1119 dev_err(&pdev->dev, "failed to enable pci device: %d\n", err); 1120 return err; 1121 } 1122 1123 mhi_cntrl->regs = pcim_iomap_region(pdev, bar_num, pci_name(pdev)); 1124 if (IS_ERR(mhi_cntrl->regs)) { 1125 err = PTR_ERR(mhi_cntrl->regs); 1126 dev_err(&pdev->dev, "failed to map pci region: %d\n", err); 1127 return err; 1128 } 1129 mhi_cntrl->reg_len = pci_resource_len(pdev, bar_num); 1130 1131 err = dma_set_mask_and_coherent(&pdev->dev, dma_mask); 1132 if (err) { 1133 dev_err(&pdev->dev, "Cannot set proper DMA mask\n"); 1134 return err; 1135 } 1136 1137 pci_set_master(pdev); 1138 1139 return 0; 1140 } 1141 1142 static int mhi_pci_get_irqs(struct mhi_controller *mhi_cntrl, 1143 const struct mhi_controller_config *mhi_cntrl_config) 1144 { 1145 struct pci_dev *pdev = to_pci_dev(mhi_cntrl->cntrl_dev); 1146 int nr_vectors, i; 1147 int *irq; 1148 1149 /* 1150 * Alloc one MSI vector for BHI + one vector per event ring, ideally... 1151 * No explicit pci_free_irq_vectors required, done by pcim_release. 1152 */ 1153 mhi_cntrl->nr_irqs = 1 + mhi_cntrl_config->num_events; 1154 1155 nr_vectors = pci_alloc_irq_vectors(pdev, 1, mhi_cntrl->nr_irqs, PCI_IRQ_MSIX | PCI_IRQ_MSI); 1156 if (nr_vectors < 0) { 1157 dev_err(&pdev->dev, "Error allocating MSI vectors %d\n", 1158 nr_vectors); 1159 return nr_vectors; 1160 } 1161 1162 if (nr_vectors < mhi_cntrl->nr_irqs) { 1163 dev_warn(&pdev->dev, "using shared MSI\n"); 1164 1165 /* Patch msi vectors, use only one (shared) */ 1166 for (i = 0; i < mhi_cntrl_config->num_events; i++) 1167 mhi_cntrl_config->event_cfg[i].irq = 0; 1168 mhi_cntrl->nr_irqs = 1; 1169 } 1170 1171 irq = devm_kcalloc(&pdev->dev, mhi_cntrl->nr_irqs, sizeof(int), GFP_KERNEL); 1172 if (!irq) 1173 return -ENOMEM; 1174 1175 for (i = 0; i < mhi_cntrl->nr_irqs; i++) { 1176 int vector = i >= nr_vectors ? (nr_vectors - 1) : i; 1177 1178 irq[i] = pci_irq_vector(pdev, vector); 1179 } 1180 1181 mhi_cntrl->irq = irq; 1182 1183 return 0; 1184 } 1185 1186 static int mhi_pci_runtime_get(struct mhi_controller *mhi_cntrl) 1187 { 1188 /* The runtime_get() MHI callback means: 1189 * Do whatever is requested to leave M3. 1190 */ 1191 return pm_runtime_get(mhi_cntrl->cntrl_dev); 1192 } 1193 1194 static void mhi_pci_runtime_put(struct mhi_controller *mhi_cntrl) 1195 { 1196 /* The runtime_put() MHI callback means: 1197 * Device can be moved in M3 state. 1198 */ 1199 pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); 1200 pm_runtime_put(mhi_cntrl->cntrl_dev); 1201 } 1202 1203 static void mhi_pci_recovery_work(struct work_struct *work) 1204 { 1205 struct mhi_pci_device *mhi_pdev = container_of(work, struct mhi_pci_device, 1206 recovery_work); 1207 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1208 struct pci_dev *pdev = to_pci_dev(mhi_cntrl->cntrl_dev); 1209 int err; 1210 1211 dev_warn(&pdev->dev, "device recovery started\n"); 1212 1213 if (pdev->is_physfn) 1214 timer_delete(&mhi_pdev->health_check_timer); 1215 1216 pm_runtime_forbid(&pdev->dev); 1217 1218 /* Clean up MHI state */ 1219 if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) { 1220 mhi_power_down(mhi_cntrl, false); 1221 mhi_unprepare_after_power_down(mhi_cntrl); 1222 } 1223 1224 pci_set_power_state(pdev, PCI_D0); 1225 pci_load_saved_state(pdev, mhi_pdev->pci_state); 1226 pci_restore_state(pdev); 1227 1228 if (!mhi_pci_is_alive(mhi_cntrl)) 1229 goto err_try_reset; 1230 1231 err = mhi_prepare_for_power_up(mhi_cntrl); 1232 if (err) 1233 goto err_try_reset; 1234 1235 err = mhi_sync_power_up(mhi_cntrl); 1236 if (err) 1237 goto err_unprepare; 1238 1239 dev_dbg(&pdev->dev, "Recovery completed\n"); 1240 1241 set_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status); 1242 1243 if (pdev->is_physfn) 1244 mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); 1245 1246 return; 1247 1248 err_unprepare: 1249 mhi_unprepare_after_power_down(mhi_cntrl); 1250 err_try_reset: 1251 err = pci_try_reset_function(pdev); 1252 if (err) 1253 dev_err(&pdev->dev, "Recovery failed: %d\n", err); 1254 } 1255 1256 static void health_check(struct timer_list *t) 1257 { 1258 struct mhi_pci_device *mhi_pdev = timer_container_of(mhi_pdev, t, 1259 health_check_timer); 1260 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1261 1262 if (!test_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status) || 1263 test_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status)) 1264 return; 1265 1266 if (!mhi_pci_is_alive(mhi_cntrl)) { 1267 dev_err(mhi_cntrl->cntrl_dev, "Device died\n"); 1268 queue_work(system_long_wq, &mhi_pdev->recovery_work); 1269 return; 1270 } 1271 1272 /* reschedule in two seconds */ 1273 mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); 1274 } 1275 1276 static int mhi_pci_generic_edl_trigger(struct mhi_controller *mhi_cntrl) 1277 { 1278 void __iomem *base = mhi_cntrl->regs; 1279 void __iomem *edl_db; 1280 int ret; 1281 u32 val; 1282 1283 ret = mhi_device_get_sync(mhi_cntrl->mhi_dev); 1284 if (ret) { 1285 dev_err(mhi_cntrl->cntrl_dev, "Failed to wakeup the device\n"); 1286 return ret; 1287 } 1288 1289 pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); 1290 mhi_cntrl->runtime_get(mhi_cntrl); 1291 1292 ret = mhi_get_channel_doorbell_offset(mhi_cntrl, &val); 1293 if (ret) 1294 goto err_get_chdb; 1295 1296 edl_db = base + val + (8 * MHI_EDL_DB); 1297 1298 mhi_cntrl->write_reg(mhi_cntrl, edl_db + 4, upper_32_bits(MHI_EDL_COOKIE)); 1299 mhi_cntrl->write_reg(mhi_cntrl, edl_db, lower_32_bits(MHI_EDL_COOKIE)); 1300 1301 mhi_soc_reset(mhi_cntrl); 1302 1303 err_get_chdb: 1304 mhi_cntrl->runtime_put(mhi_cntrl); 1305 mhi_device_put(mhi_cntrl->mhi_dev); 1306 1307 return ret; 1308 } 1309 1310 static int mhi_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 1311 { 1312 const struct mhi_pci_dev_info *info = (struct mhi_pci_dev_info *) id->driver_data; 1313 const struct mhi_controller_config *mhi_cntrl_config; 1314 struct mhi_pci_device *mhi_pdev; 1315 struct mhi_controller *mhi_cntrl; 1316 unsigned int dma_data_width; 1317 int err; 1318 1319 dev_info(&pdev->dev, "MHI PCI device found: %s\n", info->name); 1320 1321 /* mhi_pdev.mhi_cntrl must be zero-initialized */ 1322 mhi_pdev = devm_kzalloc(&pdev->dev, sizeof(*mhi_pdev), GFP_KERNEL); 1323 if (!mhi_pdev) 1324 return -ENOMEM; 1325 1326 INIT_WORK(&mhi_pdev->recovery_work, mhi_pci_recovery_work); 1327 1328 if (pdev->is_virtfn && info->vf_config) 1329 mhi_cntrl_config = info->vf_config; 1330 else 1331 mhi_cntrl_config = info->config; 1332 1333 /* Initialize health check monitor only for Physical functions */ 1334 if (pdev->is_physfn) 1335 timer_setup(&mhi_pdev->health_check_timer, health_check, 0); 1336 1337 mhi_cntrl = &mhi_pdev->mhi_cntrl; 1338 1339 dma_data_width = (pdev->is_virtfn && info->vf_dma_data_width) ? 1340 info->vf_dma_data_width : info->dma_data_width; 1341 1342 mhi_cntrl->cntrl_dev = &pdev->dev; 1343 mhi_cntrl->iova_start = 0; 1344 mhi_cntrl->iova_stop = (dma_addr_t)DMA_BIT_MASK(dma_data_width); 1345 mhi_cntrl->fw_image = info->fw; 1346 mhi_cntrl->edl_image = info->edl; 1347 1348 mhi_cntrl->read_reg = mhi_pci_read_reg; 1349 mhi_cntrl->write_reg = mhi_pci_write_reg; 1350 mhi_cntrl->status_cb = mhi_pci_status_cb; 1351 mhi_cntrl->runtime_get = mhi_pci_runtime_get; 1352 mhi_cntrl->runtime_put = mhi_pci_runtime_put; 1353 mhi_cntrl->mru = info->mru_default; 1354 mhi_cntrl->name = info->name; 1355 1356 if (pdev->is_physfn) 1357 mhi_pdev->reset_on_remove = info->reset_on_remove; 1358 1359 if (info->edl_trigger) 1360 mhi_cntrl->edl_trigger = mhi_pci_generic_edl_trigger; 1361 1362 if (info->sideband_wake) { 1363 mhi_cntrl->wake_get = mhi_pci_wake_get_nop; 1364 mhi_cntrl->wake_put = mhi_pci_wake_put_nop; 1365 mhi_cntrl->wake_toggle = mhi_pci_wake_toggle_nop; 1366 } 1367 1368 err = mhi_pci_claim(mhi_cntrl, info->bar_num, DMA_BIT_MASK(dma_data_width)); 1369 if (err) 1370 return err; 1371 1372 err = mhi_pci_get_irqs(mhi_cntrl, mhi_cntrl_config); 1373 if (err) 1374 return err; 1375 1376 pci_set_drvdata(pdev, mhi_pdev); 1377 1378 /* Have stored pci confspace at hand for restore in sudden PCI error. 1379 * cache the state locally and discard the PCI core one. 1380 */ 1381 pci_save_state(pdev); 1382 mhi_pdev->pci_state = pci_store_saved_state(pdev); 1383 pci_load_saved_state(pdev, NULL); 1384 1385 err = mhi_register_controller(mhi_cntrl, mhi_cntrl_config); 1386 if (err) 1387 return err; 1388 1389 /* MHI bus does not power up the controller by default */ 1390 err = mhi_prepare_for_power_up(mhi_cntrl); 1391 if (err) { 1392 dev_err(&pdev->dev, "failed to prepare MHI controller\n"); 1393 goto err_unregister; 1394 } 1395 1396 err = mhi_sync_power_up(mhi_cntrl); 1397 if (err) { 1398 dev_err(&pdev->dev, "failed to power up MHI controller\n"); 1399 goto err_unprepare; 1400 } 1401 1402 set_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status); 1403 1404 /* start health check */ 1405 if (pdev->is_physfn) 1406 mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); 1407 1408 /* Allow runtime suspend only if both PME from D3Hot and M3 are supported */ 1409 if (pci_pme_capable(pdev, PCI_D3hot) && !(info->no_m3)) { 1410 pm_runtime_set_autosuspend_delay(&pdev->dev, 2000); 1411 pm_runtime_use_autosuspend(&pdev->dev); 1412 pm_runtime_mark_last_busy(&pdev->dev); 1413 pm_runtime_put_noidle(&pdev->dev); 1414 } 1415 1416 return 0; 1417 1418 err_unprepare: 1419 mhi_unprepare_after_power_down(mhi_cntrl); 1420 err_unregister: 1421 mhi_unregister_controller(mhi_cntrl); 1422 1423 return err; 1424 } 1425 1426 static void mhi_pci_remove(struct pci_dev *pdev) 1427 { 1428 struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev); 1429 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1430 1431 pci_disable_sriov(pdev); 1432 1433 if (pdev->is_physfn) 1434 timer_delete_sync(&mhi_pdev->health_check_timer); 1435 cancel_work_sync(&mhi_pdev->recovery_work); 1436 1437 if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) { 1438 mhi_power_down(mhi_cntrl, true); 1439 mhi_unprepare_after_power_down(mhi_cntrl); 1440 } 1441 1442 /* balancing probe put_noidle */ 1443 if (pci_pme_capable(pdev, PCI_D3hot)) 1444 pm_runtime_get_noresume(&pdev->dev); 1445 1446 if (mhi_pdev->reset_on_remove) 1447 mhi_soc_reset(mhi_cntrl); 1448 1449 mhi_unregister_controller(mhi_cntrl); 1450 } 1451 1452 static void mhi_pci_shutdown(struct pci_dev *pdev) 1453 { 1454 mhi_pci_remove(pdev); 1455 pci_set_power_state(pdev, PCI_D3hot); 1456 } 1457 1458 static void mhi_pci_reset_prepare(struct pci_dev *pdev) 1459 { 1460 struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev); 1461 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1462 1463 dev_info(&pdev->dev, "reset\n"); 1464 1465 if (pdev->is_physfn) 1466 timer_delete(&mhi_pdev->health_check_timer); 1467 1468 /* Clean up MHI state */ 1469 if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) { 1470 mhi_power_down(mhi_cntrl, false); 1471 mhi_unprepare_after_power_down(mhi_cntrl); 1472 } 1473 1474 /* cause internal device reset */ 1475 mhi_soc_reset(mhi_cntrl); 1476 1477 /* Be sure device reset has been executed */ 1478 msleep(MHI_POST_RESET_DELAY_MS); 1479 } 1480 1481 static void mhi_pci_reset_done(struct pci_dev *pdev) 1482 { 1483 struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev); 1484 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1485 int err; 1486 1487 /* Restore initial known working PCI state */ 1488 pci_load_saved_state(pdev, mhi_pdev->pci_state); 1489 pci_restore_state(pdev); 1490 1491 /* Is device status available ? */ 1492 if (!mhi_pci_is_alive(mhi_cntrl)) { 1493 dev_err(&pdev->dev, "reset failed\n"); 1494 return; 1495 } 1496 1497 err = mhi_prepare_for_power_up(mhi_cntrl); 1498 if (err) { 1499 dev_err(&pdev->dev, "failed to prepare MHI controller\n"); 1500 return; 1501 } 1502 1503 err = mhi_sync_power_up(mhi_cntrl); 1504 if (err) { 1505 dev_err(&pdev->dev, "failed to power up MHI controller\n"); 1506 mhi_unprepare_after_power_down(mhi_cntrl); 1507 return; 1508 } 1509 1510 set_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status); 1511 if (pdev->is_physfn) 1512 mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); 1513 } 1514 1515 static pci_ers_result_t mhi_pci_error_detected(struct pci_dev *pdev, 1516 pci_channel_state_t state) 1517 { 1518 struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev); 1519 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1520 1521 dev_err(&pdev->dev, "PCI error detected, state = %u\n", state); 1522 1523 if (state == pci_channel_io_perm_failure) 1524 return PCI_ERS_RESULT_DISCONNECT; 1525 1526 /* Clean up MHI state */ 1527 if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) { 1528 mhi_power_down(mhi_cntrl, false); 1529 mhi_unprepare_after_power_down(mhi_cntrl); 1530 } else { 1531 /* Nothing to do */ 1532 return PCI_ERS_RESULT_RECOVERED; 1533 } 1534 1535 pci_disable_device(pdev); 1536 1537 return PCI_ERS_RESULT_NEED_RESET; 1538 } 1539 1540 static pci_ers_result_t mhi_pci_slot_reset(struct pci_dev *pdev) 1541 { 1542 if (pci_enable_device(pdev)) { 1543 dev_err(&pdev->dev, "Cannot re-enable PCI device after reset.\n"); 1544 return PCI_ERS_RESULT_DISCONNECT; 1545 } 1546 1547 return PCI_ERS_RESULT_RECOVERED; 1548 } 1549 1550 static void mhi_pci_io_resume(struct pci_dev *pdev) 1551 { 1552 struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev); 1553 1554 dev_err(&pdev->dev, "PCI slot reset done\n"); 1555 1556 queue_work(system_long_wq, &mhi_pdev->recovery_work); 1557 } 1558 1559 static const struct pci_error_handlers mhi_pci_err_handler = { 1560 .error_detected = mhi_pci_error_detected, 1561 .slot_reset = mhi_pci_slot_reset, 1562 .resume = mhi_pci_io_resume, 1563 .reset_prepare = mhi_pci_reset_prepare, 1564 .reset_done = mhi_pci_reset_done, 1565 }; 1566 1567 static int __maybe_unused mhi_pci_runtime_suspend(struct device *dev) 1568 { 1569 struct pci_dev *pdev = to_pci_dev(dev); 1570 struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev); 1571 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1572 int err; 1573 1574 if (test_and_set_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status)) 1575 return 0; 1576 1577 if (pdev->is_physfn) 1578 timer_delete(&mhi_pdev->health_check_timer); 1579 1580 cancel_work_sync(&mhi_pdev->recovery_work); 1581 1582 if (!test_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status) || 1583 mhi_cntrl->ee != MHI_EE_AMSS) 1584 goto pci_suspend; /* Nothing to do at MHI level */ 1585 1586 /* Transition to M3 state */ 1587 err = mhi_pm_suspend(mhi_cntrl); 1588 if (err) { 1589 dev_err(&pdev->dev, "failed to suspend device: %d\n", err); 1590 clear_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status); 1591 return -EBUSY; 1592 } 1593 1594 pci_suspend: 1595 pci_disable_device(pdev); 1596 pci_wake_from_d3(pdev, true); 1597 1598 return 0; 1599 } 1600 1601 static int __maybe_unused mhi_pci_runtime_resume(struct device *dev) 1602 { 1603 struct pci_dev *pdev = to_pci_dev(dev); 1604 struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev); 1605 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1606 int err; 1607 1608 if (!test_and_clear_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status)) 1609 return 0; 1610 1611 err = pci_enable_device(pdev); 1612 if (err) 1613 goto err_recovery; 1614 1615 pci_set_master(pdev); 1616 pci_wake_from_d3(pdev, false); 1617 1618 if (!test_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status) || 1619 mhi_cntrl->ee != MHI_EE_AMSS) 1620 return 0; /* Nothing to do at MHI level */ 1621 1622 /* Exit M3, transition to M0 state */ 1623 err = mhi_pm_resume(mhi_cntrl); 1624 if (err) { 1625 dev_err(&pdev->dev, "failed to resume device: %d\n", err); 1626 goto err_recovery; 1627 } 1628 1629 /* Resume health check */ 1630 if (pdev->is_physfn) 1631 mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD); 1632 1633 /* It can be a remote wakeup (no mhi runtime_get), update access time */ 1634 pm_runtime_mark_last_busy(dev); 1635 1636 return 0; 1637 1638 err_recovery: 1639 /* Do not fail to not mess up our PCI device state, the device likely 1640 * lost power (d3cold) and we simply need to reset it from the recovery 1641 * procedure, trigger the recovery asynchronously to prevent system 1642 * suspend exit delaying. 1643 */ 1644 queue_work(system_long_wq, &mhi_pdev->recovery_work); 1645 pm_runtime_mark_last_busy(dev); 1646 1647 return 0; 1648 } 1649 1650 static int __maybe_unused mhi_pci_suspend(struct device *dev) 1651 { 1652 pm_runtime_disable(dev); 1653 return mhi_pci_runtime_suspend(dev); 1654 } 1655 1656 static int __maybe_unused mhi_pci_resume(struct device *dev) 1657 { 1658 int ret; 1659 1660 /* Depending the platform, device may have lost power (d3cold), we need 1661 * to resume it now to check its state and recover when necessary. 1662 */ 1663 ret = mhi_pci_runtime_resume(dev); 1664 pm_runtime_enable(dev); 1665 1666 return ret; 1667 } 1668 1669 static int __maybe_unused mhi_pci_freeze(struct device *dev) 1670 { 1671 struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev); 1672 struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl; 1673 1674 /* We want to stop all operations, hibernation does not guarantee that 1675 * device will be in the same state as before freezing, especially if 1676 * the intermediate restore kernel reinitializes MHI device with new 1677 * context. 1678 */ 1679 flush_work(&mhi_pdev->recovery_work); 1680 if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) { 1681 mhi_power_down(mhi_cntrl, true); 1682 mhi_unprepare_after_power_down(mhi_cntrl); 1683 } 1684 1685 return 0; 1686 } 1687 1688 static int __maybe_unused mhi_pci_restore(struct device *dev) 1689 { 1690 struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev); 1691 1692 /* Reinitialize the device */ 1693 queue_work(system_long_wq, &mhi_pdev->recovery_work); 1694 1695 return 0; 1696 } 1697 1698 static const struct dev_pm_ops mhi_pci_pm_ops = { 1699 SET_RUNTIME_PM_OPS(mhi_pci_runtime_suspend, mhi_pci_runtime_resume, NULL) 1700 #ifdef CONFIG_PM_SLEEP 1701 .suspend = mhi_pci_suspend, 1702 .resume = mhi_pci_resume, 1703 .freeze = mhi_pci_freeze, 1704 .thaw = mhi_pci_restore, 1705 .poweroff = mhi_pci_freeze, 1706 .restore = mhi_pci_restore, 1707 #endif 1708 }; 1709 1710 static struct pci_driver mhi_pci_driver = { 1711 .name = "mhi-pci-generic", 1712 .id_table = mhi_pci_id_table, 1713 .probe = mhi_pci_probe, 1714 .remove = mhi_pci_remove, 1715 .shutdown = mhi_pci_shutdown, 1716 .err_handler = &mhi_pci_err_handler, 1717 .driver.pm = &mhi_pci_pm_ops, 1718 .sriov_configure = pci_sriov_configure_simple, 1719 }; 1720 module_pci_driver(mhi_pci_driver); 1721 1722 MODULE_AUTHOR("Loic Poulain <loic.poulain@linaro.org>"); 1723 MODULE_DESCRIPTION("Modem Host Interface (MHI) PCI controller driver"); 1724 MODULE_LICENSE("GPL"); 1725