1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* Copyright(c) 2023 Realtek Corporation 3 */ 4 5 #include <linux/pci.h> 6 7 #include "mac.h" 8 #include "pci.h" 9 #include "reg.h" 10 11 enum pcie_rxbd_mode { 12 PCIE_RXBD_NORM = 0, 13 PCIE_RXBD_SEP, 14 PCIE_RXBD_EXT, 15 }; 16 17 #define PL0_TMR_SCALE_ASIC 1 18 #define PL0_TMR_ANA_172US 0x800 19 #define PL0_TMR_MAC_1MS 0x27100 20 #define PL0_TMR_AUX_1MS 0x1E848 21 22 static void rtw89_pci_aspm_set_be(struct rtw89_dev *rtwdev, bool enable) 23 { 24 struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; 25 struct pci_dev *pdev = rtwpci->pdev; 26 u8 value = 0; 27 int ret; 28 29 ret = pci_read_config_byte(pdev, RTW89_PCIE_ASPM_CTRL, &value); 30 if (ret) 31 rtw89_warn(rtwdev, "failed to read ASPM Delay\n"); 32 33 u8p_replace_bits(&value, PCIE_L1DLY_16US, RTW89_L1DLY_MASK); 34 35 ret = pci_write_config_byte(pdev, RTW89_PCIE_ASPM_CTRL, value); 36 if (ret) 37 rtw89_warn(rtwdev, "failed to write ASPM Delay\n"); 38 39 if (enable) 40 rtw89_write32_set(rtwdev, R_AX_PCIE_MIX_CFG_V1, 41 B_BE_ASPM_CTRL_L1); 42 else 43 rtw89_write32_clr(rtwdev, R_AX_PCIE_MIX_CFG_V1, 44 B_BE_ASPM_CTRL_L1); 45 } 46 47 static void rtw89_pci_l1ss_set_be(struct rtw89_dev *rtwdev, bool enable) 48 { 49 if (enable) 50 rtw89_write32_set(rtwdev, R_BE_PCIE_MIX_CFG, 51 B_BE_L1SUB_ENABLE); 52 else 53 rtw89_write32_clr(rtwdev, R_BE_PCIE_MIX_CFG, 54 B_BE_L1SUB_ENABLE); 55 } 56 57 static void rtw89_pci_clkreq_set_be(struct rtw89_dev *rtwdev, bool enable) 58 { 59 rtw89_write32_mask(rtwdev, R_BE_PCIE_LAT_CTRL, B_BE_CLK_REQ_LAT_MASK, 60 PCIE_CLKDLY_HW_V1_0); 61 62 if (enable) 63 rtw89_write32_set(rtwdev, R_BE_L1_CLK_CTRL, 64 B_BE_CLK_PM_EN); 65 else 66 rtw89_write32_clr(rtwdev, R_AX_L1_CLK_CTRL, 67 B_BE_CLK_PM_EN); 68 } 69 70 static void _patch_pcie_power_wake_be(struct rtw89_dev *rtwdev, bool power_up) 71 { 72 if (power_up) 73 rtw89_write32_set(rtwdev, R_BE_HCI_OPT_CTRL, BIT_WAKE_CTRL_V1); 74 else 75 rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, BIT_WAKE_CTRL_V1); 76 } 77 78 static void rtw89_pci_set_io_rcy_be(struct rtw89_dev *rtwdev) 79 { 80 const struct rtw89_pci_info *info = rtwdev->pci_info; 81 u32 scale = PL0_TMR_SCALE_ASIC; 82 u32 val32; 83 84 if (info->io_rcy_en == MAC_AX_PCIE_ENABLE) { 85 val32 = info->io_rcy_tmr == MAC_AX_IO_RCY_ANA_TMR_DEF ? 86 PL0_TMR_ANA_172US : info->io_rcy_tmr; 87 val32 /= scale; 88 89 rtw89_write32(rtwdev, R_BE_AON_WDT_TMR, val32); 90 rtw89_write32(rtwdev, R_BE_MDIO_WDT_TMR, val32); 91 rtw89_write32(rtwdev, R_BE_LA_MODE_WDT_TMR, val32); 92 rtw89_write32(rtwdev, R_BE_WDT_AR_TMR, val32); 93 rtw89_write32(rtwdev, R_BE_WDT_AW_TMR, val32); 94 rtw89_write32(rtwdev, R_BE_WDT_W_TMR, val32); 95 rtw89_write32(rtwdev, R_BE_WDT_B_TMR, val32); 96 rtw89_write32(rtwdev, R_BE_WDT_R_TMR, val32); 97 98 val32 = info->io_rcy_tmr == MAC_AX_IO_RCY_ANA_TMR_DEF ? 99 PL0_TMR_MAC_1MS : info->io_rcy_tmr; 100 val32 /= scale; 101 rtw89_write32(rtwdev, R_BE_WLAN_WDT_TMR, val32); 102 rtw89_write32(rtwdev, R_BE_AXIDMA_WDT_TMR, val32); 103 104 val32 = info->io_rcy_tmr == MAC_AX_IO_RCY_ANA_TMR_DEF ? 105 PL0_TMR_AUX_1MS : info->io_rcy_tmr; 106 val32 /= scale; 107 rtw89_write32(rtwdev, R_BE_LOCAL_WDT_TMR, val32); 108 } else { 109 rtw89_write32_clr(rtwdev, R_BE_WLAN_WDT, B_BE_WLAN_WDT_ENABLE); 110 rtw89_write32_clr(rtwdev, R_BE_AXIDMA_WDT, B_BE_AXIDMA_WDT_ENABLE); 111 rtw89_write32_clr(rtwdev, R_BE_AON_WDT, B_BE_AON_WDT_ENABLE); 112 rtw89_write32_clr(rtwdev, R_BE_LOCAL_WDT, B_BE_LOCAL_WDT_ENABLE); 113 rtw89_write32_clr(rtwdev, R_BE_MDIO_WDT, B_BE_MDIO_WDT_ENABLE); 114 rtw89_write32_clr(rtwdev, R_BE_LA_MODE_WDT, B_BE_LA_MODE_WDT_ENABLE); 115 rtw89_write32_clr(rtwdev, R_BE_WDT_AR, B_BE_WDT_AR_ENABLE); 116 rtw89_write32_clr(rtwdev, R_BE_WDT_AW, B_BE_WDT_AW_ENABLE); 117 rtw89_write32_clr(rtwdev, R_BE_WDT_W, B_BE_WDT_W_ENABLE); 118 rtw89_write32_clr(rtwdev, R_BE_WDT_B, B_BE_WDT_B_ENABLE); 119 rtw89_write32_clr(rtwdev, R_BE_WDT_R, B_BE_WDT_R_ENABLE); 120 } 121 } 122 123 static void rtw89_pci_ctrl_wpdma_pcie_be(struct rtw89_dev *rtwdev, bool en) 124 { 125 if (en) 126 rtw89_write32_clr(rtwdev, R_BE_HAXI_DMA_STOP1, B_BE_STOP_WPDMA); 127 else 128 rtw89_write32_set(rtwdev, R_BE_HAXI_DMA_STOP1, B_BE_STOP_WPDMA); 129 } 130 131 static void rtw89_pci_ctrl_trxdma_pcie_be(struct rtw89_dev *rtwdev, 132 enum mac_ax_pcie_func_ctrl tx_en, 133 enum mac_ax_pcie_func_ctrl rx_en, 134 enum mac_ax_pcie_func_ctrl io_en) 135 { 136 u32 val; 137 138 val = rtw89_read32(rtwdev, R_BE_HAXI_INIT_CFG1); 139 140 if (tx_en == MAC_AX_PCIE_ENABLE) 141 val |= B_BE_TXDMA_EN; 142 else if (tx_en == MAC_AX_PCIE_DISABLE) 143 val &= ~B_BE_TXDMA_EN; 144 145 if (rx_en == MAC_AX_PCIE_ENABLE) 146 val |= B_BE_RXDMA_EN; 147 else if (rx_en == MAC_AX_PCIE_DISABLE) 148 val &= ~B_BE_RXDMA_EN; 149 150 if (io_en == MAC_AX_PCIE_ENABLE) 151 val &= ~B_BE_STOP_AXI_MST; 152 else if (io_en == MAC_AX_PCIE_DISABLE) 153 val |= B_BE_STOP_AXI_MST; 154 155 rtw89_write32(rtwdev, R_BE_HAXI_INIT_CFG1, val); 156 157 if (io_en == MAC_AX_PCIE_ENABLE) 158 rtw89_write32_mask(rtwdev, R_BE_HAXI_MST_WDT_TIMEOUT_SEL_V1, 159 B_BE_HAXI_MST_WDT_TIMEOUT_SEL_MASK, 4); 160 } 161 162 static void rtw89_pci_clr_idx_all_be(struct rtw89_dev *rtwdev) 163 { 164 struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; 165 struct rtw89_pci_rx_ring *rx_ring; 166 u32 val; 167 168 val = B_BE_CLR_CH0_IDX | B_BE_CLR_CH1_IDX | B_BE_CLR_CH2_IDX | 169 B_BE_CLR_CH3_IDX | B_BE_CLR_CH4_IDX | B_BE_CLR_CH5_IDX | 170 B_BE_CLR_CH6_IDX | B_BE_CLR_CH7_IDX | B_BE_CLR_CH8_IDX | 171 B_BE_CLR_CH9_IDX | B_BE_CLR_CH10_IDX | B_BE_CLR_CH11_IDX | 172 B_BE_CLR_CH12_IDX | B_BE_CLR_CH13_IDX | B_BE_CLR_CH14_IDX; 173 rtw89_write32(rtwdev, R_BE_TXBD_RWPTR_CLR1, val); 174 175 rtw89_write32(rtwdev, R_BE_RXBD_RWPTR_CLR1_V1, 176 B_BE_CLR_RXQ0_IDX | B_BE_CLR_RPQ0_IDX); 177 178 rx_ring = &rtwpci->rx_rings[RTW89_RXCH_RXQ]; 179 rtw89_write16(rtwdev, R_BE_RXQ0_RXBD_IDX_V1, rx_ring->bd_ring.len - 1); 180 181 rx_ring = &rtwpci->rx_rings[RTW89_RXCH_RPQ]; 182 rtw89_write16(rtwdev, R_BE_RPQ0_RXBD_IDX_V1, rx_ring->bd_ring.len - 1); 183 } 184 185 static int rtw89_pci_poll_txdma_ch_idle_be(struct rtw89_dev *rtwdev) 186 { 187 u32 val; 188 189 return read_poll_timeout(rtw89_read32, val, (val & DMA_BUSY1_CHECK_BE) == 0, 190 10, 1000, false, rtwdev, R_BE_HAXI_DMA_BUSY1); 191 } 192 193 static int rtw89_pci_poll_rxdma_ch_idle_be(struct rtw89_dev *rtwdev) 194 { 195 u32 check; 196 u32 val; 197 198 check = B_BE_RXQ0_BUSY_V1 | B_BE_RPQ0_BUSY_V1; 199 200 return read_poll_timeout(rtw89_read32, val, (val & check) == 0, 201 10, 1000, false, rtwdev, R_BE_HAXI_DMA_BUSY1); 202 } 203 204 static int rtw89_pci_poll_dma_all_idle_be(struct rtw89_dev *rtwdev) 205 { 206 int ret; 207 208 ret = rtw89_pci_poll_txdma_ch_idle_be(rtwdev); 209 if (ret) { 210 rtw89_err(rtwdev, "txdma ch busy\n"); 211 return ret; 212 } 213 214 ret = rtw89_pci_poll_rxdma_ch_idle_be(rtwdev); 215 if (ret) { 216 rtw89_err(rtwdev, "rxdma ch busy\n"); 217 return ret; 218 } 219 220 return 0; 221 } 222 223 static void rtw89_pci_mode_op_be(struct rtw89_dev *rtwdev) 224 { 225 const struct rtw89_pci_info *info = rtwdev->pci_info; 226 u32 val32_init1, val32_rxapp, val32_exp; 227 228 val32_init1 = rtw89_read32(rtwdev, R_BE_HAXI_INIT_CFG1); 229 val32_rxapp = rtw89_read32(rtwdev, R_BE_RX_APPEND_MODE); 230 val32_exp = rtw89_read32(rtwdev, R_BE_HAXI_EXP_CTRL_V1); 231 232 if (info->rxbd_mode == MAC_AX_RXBD_PKT) { 233 val32_init1 = u32_replace_bits(val32_init1, PCIE_RXBD_NORM, 234 B_BE_RXQ_RXBD_MODE_MASK); 235 } else if (info->rxbd_mode == MAC_AX_RXBD_SEP) { 236 val32_init1 = u32_replace_bits(val32_init1, PCIE_RXBD_SEP, 237 B_BE_RXQ_RXBD_MODE_MASK); 238 val32_rxapp = u32_replace_bits(val32_rxapp, 0, 239 B_BE_APPEND_LEN_MASK); 240 } 241 242 val32_init1 = u32_replace_bits(val32_init1, info->tx_burst, 243 B_BE_MAX_TXDMA_MASK); 244 val32_init1 = u32_replace_bits(val32_init1, info->rx_burst, 245 B_BE_MAX_RXDMA_MASK); 246 val32_exp = u32_replace_bits(val32_exp, info->multi_tag_num, 247 B_BE_MAX_TAG_NUM_MASK); 248 val32_init1 = u32_replace_bits(val32_init1, info->wd_dma_idle_intvl, 249 B_BE_CFG_WD_PERIOD_IDLE_MASK); 250 val32_init1 = u32_replace_bits(val32_init1, info->wd_dma_act_intvl, 251 B_BE_CFG_WD_PERIOD_ACTIVE_MASK); 252 253 rtw89_write32(rtwdev, R_BE_HAXI_INIT_CFG1, val32_init1); 254 rtw89_write32(rtwdev, R_BE_RX_APPEND_MODE, val32_rxapp); 255 rtw89_write32(rtwdev, R_BE_HAXI_EXP_CTRL_V1, val32_exp); 256 } 257 258 static int rtw89_pci_rst_bdram_be(struct rtw89_dev *rtwdev) 259 { 260 u32 val; 261 262 rtw89_write32_set(rtwdev, R_BE_HAXI_INIT_CFG1, B_BE_SET_BDRAM_BOUND); 263 264 return read_poll_timeout(rtw89_read32, val, !(val & B_BE_SET_BDRAM_BOUND), 265 50, 500000, false, rtwdev, R_BE_HAXI_INIT_CFG1); 266 } 267 268 static void rtw89_pci_debounce_be(struct rtw89_dev *rtwdev) 269 { 270 u32 val32; 271 272 val32 = rtw89_read32(rtwdev, R_BE_SYS_PAGE_CLK_GATED); 273 val32 = u32_replace_bits(val32, 0, B_BE_PCIE_PRST_DEBUNC_PERIOD_MASK); 274 val32 |= B_BE_SYM_PRST_DEBUNC_SEL; 275 rtw89_write32(rtwdev, R_BE_SYS_PAGE_CLK_GATED, val32); 276 } 277 278 static void rtw89_pci_ldo_low_pwr_be(struct rtw89_dev *rtwdev) 279 { 280 rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_PSUS_OFF_CAPC_EN); 281 rtw89_write32_set(rtwdev, R_BE_SYS_PAGE_CLK_GATED, 282 B_BE_SOP_OFFPOOBS_PC | B_BE_CPHY_AUXCLK_OP | 283 B_BE_CPHY_POWER_READY_CHK); 284 rtw89_write32_clr(rtwdev, R_BE_SYS_SDIO_CTRL, B_BE_PCIE_FORCE_IBX_EN | 285 B_BE_PCIE_DIS_L2_RTK_PERST | 286 B_BE_PCIE_DIS_L2__CTRL_LDO_HCI); 287 rtw89_write32_clr(rtwdev, R_BE_L1_2_CTRL_HCILDO, B_BE_PCIE_DIS_L1_2_CTRL_HCILDO); 288 } 289 290 static void rtw89_pci_pcie_setting_be(struct rtw89_dev *rtwdev) 291 { 292 const struct rtw89_chip_info *chip = rtwdev->chip; 293 struct rtw89_hal *hal = &rtwdev->hal; 294 295 rtw89_write32_set(rtwdev, R_BE_PCIE_FRZ_CLK, B_BE_PCIE_EN_AUX_CLK); 296 rtw89_write32_clr(rtwdev, R_BE_PCIE_PS_CTRL, B_BE_CMAC_EXIT_L1_EN); 297 298 if (chip->chip_id == RTL8922A && hal->cv == CHIP_CAV) 299 return; 300 301 rtw89_write32_set(rtwdev, R_BE_EFUSE_CTRL_2_V1, B_BE_R_SYM_AUTOLOAD_WITH_PMC_SEL); 302 rtw89_write32_set(rtwdev, R_BE_PCIE_LAT_CTRL, B_BE_SYM_AUX_CLK_SEL); 303 } 304 305 static void rtw89_pci_ser_setting_be(struct rtw89_dev *rtwdev) 306 { 307 u32 val32; 308 309 rtw89_write32(rtwdev, R_BE_PL1_DBG_INFO, 0x0); 310 rtw89_write32_set(rtwdev, R_BE_FWS1IMR, B_BE_PCIE_SER_TIMEOUT_INDIC_EN); 311 rtw89_write32_set(rtwdev, R_BE_SER_PL1_CTRL, B_BE_PL1_SER_PL1_EN); 312 rtw89_write32_mask(rtwdev, R_BE_SER_PL1_CTRL, B_BE_PL1_TIMER_UNIT_MASK, 1); 313 314 val32 = rtw89_read32(rtwdev, R_BE_REG_PL1_MASK); 315 val32 |= B_BE_SER_PMU_IMR | B_BE_SER_L1SUB_IMR | B_BE_SER_PM_MASTER_IMR | 316 B_BE_SER_LTSSM_IMR | B_BE_SER_PM_CLK_MASK | B_BE_SER_PCLKREQ_ACK_MASK; 317 rtw89_write32(rtwdev, R_BE_REG_PL1_MASK, val32); 318 } 319 320 static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool enable) 321 { 322 u32 mask_all; 323 u32 val; 324 325 mask_all = B_BE_STOP_CH0 | B_BE_STOP_CH1 | B_BE_STOP_CH2 | 326 B_BE_STOP_CH3 | B_BE_STOP_CH4 | B_BE_STOP_CH5 | 327 B_BE_STOP_CH6 | B_BE_STOP_CH7 | B_BE_STOP_CH8 | 328 B_BE_STOP_CH9 | B_BE_STOP_CH10 | B_BE_STOP_CH11; 329 330 val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1); 331 val |= B_BE_STOP_CH13 | B_BE_STOP_CH14; 332 333 if (enable) 334 val &= ~mask_all; 335 else 336 val |= mask_all; 337 338 rtw89_write32(rtwdev, R_BE_HAXI_DMA_STOP1, val); 339 } 340 341 static void rtw89_pci_ctrl_txdma_fw_ch_be(struct rtw89_dev *rtwdev, bool enable) 342 { 343 u32 val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1); 344 345 if (enable) 346 val &= ~B_BE_STOP_CH12; 347 else 348 val |= B_BE_STOP_CH12; 349 350 rtw89_write32(rtwdev, R_BE_HAXI_DMA_STOP1, val); 351 } 352 353 static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev) 354 { 355 int ret; 356 357 rtw89_pci_set_io_rcy_be(rtwdev); 358 _patch_pcie_power_wake_be(rtwdev, true); 359 rtw89_pci_ctrl_wpdma_pcie_be(rtwdev, false); 360 rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_DISABLE, 361 MAC_AX_PCIE_DISABLE, MAC_AX_PCIE_DISABLE); 362 rtw89_pci_clr_idx_all_be(rtwdev); 363 364 ret = rtw89_pci_poll_dma_all_idle_be(rtwdev); 365 if (ret) { 366 rtw89_err(rtwdev, "[ERR] poll pcie dma all idle\n"); 367 return ret; 368 } 369 370 rtw89_pci_mode_op_be(rtwdev); 371 rtw89_pci_ops_reset(rtwdev); 372 373 ret = rtw89_pci_rst_bdram_be(rtwdev); 374 if (ret) { 375 rtw89_err(rtwdev, "[ERR]pcie rst bdram\n"); 376 return ret; 377 } 378 379 rtw89_pci_debounce_be(rtwdev); 380 rtw89_pci_ldo_low_pwr_be(rtwdev); 381 rtw89_pci_pcie_setting_be(rtwdev); 382 rtw89_pci_ser_setting_be(rtwdev); 383 384 rtw89_pci_ctrl_txdma_ch_be(rtwdev, false); 385 rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true); 386 rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_ENABLE, 387 MAC_AX_PCIE_ENABLE, MAC_AX_PCIE_ENABLE); 388 389 return 0; 390 } 391 392 static int rtw89_pci_ops_mac_pre_deinit_be(struct rtw89_dev *rtwdev) 393 { 394 u32 val; 395 396 _patch_pcie_power_wake_be(rtwdev, false); 397 398 val = rtw89_read32_mask(rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK); 399 if (val == 0) 400 return 0; 401 402 rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_DISABLE, 403 MAC_AX_PCIE_DISABLE, MAC_AX_PCIE_DISABLE); 404 rtw89_pci_clr_idx_all_be(rtwdev); 405 406 return 0; 407 } 408 409 int rtw89_pci_ltr_set_v2(struct rtw89_dev *rtwdev, bool en) 410 { 411 u32 ctrl0, cfg0, cfg1, dec_ctrl, idle_ltcy, act_ltcy, dis_ltcy; 412 413 ctrl0 = rtw89_read32(rtwdev, R_BE_LTR_CTRL_0); 414 if (rtw89_pci_ltr_is_err_reg_val(ctrl0)) 415 return -EINVAL; 416 cfg0 = rtw89_read32(rtwdev, R_BE_LTR_CFG_0); 417 if (rtw89_pci_ltr_is_err_reg_val(cfg0)) 418 return -EINVAL; 419 cfg1 = rtw89_read32(rtwdev, R_BE_LTR_CFG_1); 420 if (rtw89_pci_ltr_is_err_reg_val(cfg1)) 421 return -EINVAL; 422 dec_ctrl = rtw89_read32(rtwdev, R_BE_LTR_DECISION_CTRL_V1); 423 if (rtw89_pci_ltr_is_err_reg_val(dec_ctrl)) 424 return -EINVAL; 425 idle_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX3_V1); 426 if (rtw89_pci_ltr_is_err_reg_val(idle_ltcy)) 427 return -EINVAL; 428 act_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX1_V1); 429 if (rtw89_pci_ltr_is_err_reg_val(act_ltcy)) 430 return -EINVAL; 431 dis_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX0_V1); 432 if (rtw89_pci_ltr_is_err_reg_val(dis_ltcy)) 433 return -EINVAL; 434 435 if (en) { 436 dec_ctrl |= B_BE_ENABLE_LTR_CTL_DECISION | B_BE_LTR_HW_DEC_EN_V1; 437 ctrl0 |= B_BE_LTR_HW_EN; 438 } else { 439 dec_ctrl &= ~(B_BE_ENABLE_LTR_CTL_DECISION | B_BE_LTR_HW_DEC_EN_V1 | 440 B_BE_LTR_EN_PORT_V1_MASK); 441 ctrl0 &= ~B_BE_LTR_HW_EN; 442 } 443 444 dec_ctrl = u32_replace_bits(dec_ctrl, PCI_LTR_SPC_500US, 445 B_BE_LTR_SPACE_IDX_MASK); 446 cfg0 = u32_replace_bits(cfg0, PCI_LTR_IDLE_TIMER_3_2MS, 447 B_BE_LTR_IDLE_TIMER_IDX_MASK); 448 cfg1 = u32_replace_bits(cfg1, 0xC0, B_BE_LTR_CMAC0_RX_USE_PG_TH_MASK); 449 cfg1 = u32_replace_bits(cfg1, 0xC0, B_BE_LTR_CMAC1_RX_USE_PG_TH_MASK); 450 cfg0 = u32_replace_bits(cfg0, 1, B_BE_LTR_IDX_ACTIVE_MASK); 451 cfg0 = u32_replace_bits(cfg0, 3, B_BE_LTR_IDX_IDLE_MASK); 452 dec_ctrl = u32_replace_bits(dec_ctrl, 0, B_BE_LTR_IDX_DISABLE_V1_MASK); 453 454 rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX3_V1, 0x90039003); 455 rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX1_V1, 0x880b880b); 456 rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX0_V1, 0); 457 rtw89_write32(rtwdev, R_BE_LTR_DECISION_CTRL_V1, dec_ctrl); 458 rtw89_write32(rtwdev, R_BE_LTR_CFG_0, cfg0); 459 rtw89_write32(rtwdev, R_BE_LTR_CFG_1, cfg1); 460 rtw89_write32(rtwdev, R_BE_LTR_CTRL_0, ctrl0); 461 462 return 0; 463 } 464 EXPORT_SYMBOL(rtw89_pci_ltr_set_v2); 465 466 static void rtw89_pci_configure_mit_be(struct rtw89_dev *rtwdev) 467 { 468 u32 cnt; 469 u32 val; 470 471 rtw89_write32_mask(rtwdev, R_BE_PCIE_MIT0_TMR, 472 B_BE_PCIE_MIT0_RX_TMR_MASK, BE_MIT0_TMR_UNIT_1MS); 473 474 val = rtw89_read32(rtwdev, R_BE_PCIE_MIT0_CNT); 475 cnt = min_t(u32, U8_MAX, RTW89_PCI_RXBD_NUM_MAX / 2); 476 val = u32_replace_bits(val, cnt, B_BE_PCIE_RX_MIT0_CNT_MASK); 477 val = u32_replace_bits(val, 2, B_BE_PCIE_RX_MIT0_TMR_CNT_MASK); 478 rtw89_write32(rtwdev, R_BE_PCIE_MIT0_CNT, val); 479 } 480 481 static int rtw89_pci_ops_mac_post_init_be(struct rtw89_dev *rtwdev) 482 { 483 const struct rtw89_pci_info *info = rtwdev->pci_info; 484 int ret; 485 486 ret = info->ltr_set(rtwdev, true); 487 if (ret) { 488 rtw89_err(rtwdev, "pci ltr set fail\n"); 489 return ret; 490 } 491 492 rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_IGNORE, 493 MAC_AX_PCIE_IGNORE, MAC_AX_PCIE_ENABLE); 494 rtw89_pci_ctrl_wpdma_pcie_be(rtwdev, true); 495 rtw89_pci_ctrl_txdma_ch_be(rtwdev, true); 496 rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true); 497 rtw89_pci_configure_mit_be(rtwdev); 498 499 return 0; 500 } 501 502 static int rtw89_pci_poll_io_idle_be(struct rtw89_dev *rtwdev) 503 { 504 u32 sts; 505 int ret; 506 507 ret = read_poll_timeout_atomic(rtw89_read32, sts, 508 !(sts & B_BE_HAXI_MST_BUSY), 509 10, 1000, false, rtwdev, 510 R_BE_HAXI_DMA_BUSY1); 511 if (ret) { 512 rtw89_err(rtwdev, "pci dmach busy1 0x%X\n", sts); 513 return ret; 514 } 515 516 return 0; 517 } 518 519 static int rtw89_pci_lv1rst_stop_dma_be(struct rtw89_dev *rtwdev) 520 { 521 int ret; 522 523 rtw89_pci_ctrl_dma_all(rtwdev, false); 524 ret = rtw89_pci_poll_io_idle_be(rtwdev); 525 if (!ret) 526 return 0; 527 528 rtw89_debug(rtwdev, RTW89_DBG_HCI, 529 "[PCIe] poll_io_idle fail; reset hci dma trx\n"); 530 531 rtw89_mac_ctrl_hci_dma_trx(rtwdev, false); 532 rtw89_mac_ctrl_hci_dma_trx(rtwdev, true); 533 534 return rtw89_pci_poll_io_idle_be(rtwdev); 535 } 536 537 static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev) 538 { 539 int ret; 540 541 rtw89_mac_ctrl_hci_dma_trx(rtwdev, false); 542 rtw89_mac_ctrl_hci_dma_trx(rtwdev, true); 543 rtw89_pci_clr_idx_all(rtwdev); 544 545 ret = rtw89_pci_rst_bdram_be(rtwdev); 546 if (ret) 547 return ret; 548 549 rtw89_pci_ctrl_dma_all(rtwdev, true); 550 return 0; 551 } 552 553 static void rtw89_pci_disable_eq_be(struct rtw89_dev *rtwdev) 554 { 555 u32 backup_aspm, phy_offset; 556 u16 oobs_val, offset_cal; 557 u16 g1_oobs, g2_oobs; 558 u8 gen; 559 560 if (rtwdev->chip->chip_id != RTL8922A) 561 return; 562 563 g1_oobs = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 + 564 RAC_ANA09 * RAC_MULT, BAC_OOBS_SEL); 565 g2_oobs = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G2 + 566 RAC_ANA09 * RAC_MULT, BAC_OOBS_SEL); 567 if (g1_oobs && g2_oobs) 568 return; 569 570 backup_aspm = rtw89_read32(rtwdev, R_BE_PCIE_MIX_CFG); 571 rtw89_write32_clr(rtwdev, R_BE_PCIE_MIX_CFG, B_BE_RTK_ASPM_CTRL_MASK); 572 573 /* offset K */ 574 for (gen = 1; gen <= 2; gen++) { 575 phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 : 576 R_RAC_DIRECT_OFFSET_BE_LANE0_G2; 577 578 rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA19 * RAC_MULT, 579 B_PCIE_BIT_RD_SEL); 580 } 581 582 offset_cal = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 + 583 RAC_ANA1F * RAC_MULT, OFFSET_CAL_MASK); 584 585 for (gen = 1; gen <= 2; gen++) { 586 phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 : 587 R_RAC_DIRECT_OFFSET_BE_LANE0_G2; 588 589 rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA0B * RAC_MULT, 590 MANUAL_LVL_MASK, offset_cal); 591 rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA0D * RAC_MULT, 592 OFFSET_CAL_MODE); 593 } 594 595 /* OOBS */ 596 for (gen = 1; gen <= 2; gen++) { 597 phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 : 598 R_RAC_DIRECT_OFFSET_BE_LANE0_G2; 599 600 rtw89_write16_set(rtwdev, phy_offset + RAC_ANA0D * RAC_MULT, 601 BAC_RX_TEST_EN); 602 rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA10 * RAC_MULT, 603 ADDR_SEL_MASK, ADDR_SEL_VAL); 604 rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA10 * RAC_MULT, 605 B_PCIE_BIT_PINOUT_DIS); 606 rtw89_write16_set(rtwdev, phy_offset + RAC_ANA19 * RAC_MULT, 607 B_PCIE_BIT_RD_SEL); 608 } 609 610 oobs_val = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 + 611 RAC_ANA1F * RAC_MULT, OOBS_LEVEL_MASK); 612 613 for (gen = 1; gen <= 2; gen++) { 614 phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 : 615 R_RAC_DIRECT_OFFSET_BE_LANE0_G2; 616 617 rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA03 * RAC_MULT, 618 OOBS_SEN_MASK, oobs_val); 619 rtw89_write16_set(rtwdev, phy_offset + RAC_ANA09 * RAC_MULT, 620 BAC_OOBS_SEL); 621 } 622 623 rtw89_write32(rtwdev, R_BE_PCIE_MIX_CFG, backup_aspm); 624 } 625 626 static int __maybe_unused rtw89_pci_suspend_be(struct device *dev) 627 { 628 struct ieee80211_hw *hw = dev_get_drvdata(dev); 629 struct rtw89_dev *rtwdev = hw->priv; 630 631 rtw89_write32_set(rtwdev, R_BE_RSV_CTRL, B_BE_WLOCK_1C_BIT6); 632 rtw89_write32_set(rtwdev, R_BE_RSV_CTRL, B_BE_R_DIS_PRST); 633 rtw89_write32_clr(rtwdev, R_BE_RSV_CTRL, B_BE_WLOCK_1C_BIT6); 634 rtw89_write32_set(rtwdev, R_BE_PCIE_FRZ_CLK, B_BE_PCIE_FRZ_REG_RST); 635 rtw89_write32_clr(rtwdev, R_BE_REG_PL1_MASK, B_BE_SER_PM_MASTER_IMR); 636 return 0; 637 } 638 639 static int __maybe_unused rtw89_pci_resume_be(struct device *dev) 640 { 641 struct ieee80211_hw *hw = dev_get_drvdata(dev); 642 struct rtw89_dev *rtwdev = hw->priv; 643 u32 polling; 644 int ret; 645 646 rtw89_write32_set(rtwdev, R_BE_RSV_CTRL, B_BE_WLOCK_1C_BIT6); 647 rtw89_write32_clr(rtwdev, R_BE_RSV_CTRL, B_BE_R_DIS_PRST); 648 rtw89_write32_clr(rtwdev, R_BE_RSV_CTRL, B_BE_WLOCK_1C_BIT6); 649 rtw89_write32_clr(rtwdev, R_BE_PCIE_FRZ_CLK, B_BE_PCIE_FRZ_REG_RST); 650 rtw89_write32_clr(rtwdev, R_BE_SER_PL1_CTRL, B_BE_PL1_SER_PL1_EN); 651 652 ret = read_poll_timeout_atomic(rtw89_read32, polling, !polling, 1, 1000, 653 false, rtwdev, R_BE_REG_PL1_ISR); 654 if (ret) 655 rtw89_warn(rtwdev, "[ERR] PCIE SER clear polling fail\n"); 656 657 rtw89_write32_set(rtwdev, R_BE_SER_PL1_CTRL, B_BE_PL1_SER_PL1_EN); 658 rtw89_write32_set(rtwdev, R_BE_REG_PL1_MASK, B_BE_SER_PM_MASTER_IMR); 659 660 rtw89_pci_basic_cfg(rtwdev, true); 661 662 return 0; 663 } 664 665 SIMPLE_DEV_PM_OPS(rtw89_pm_ops_be, rtw89_pci_suspend_be, rtw89_pci_resume_be); 666 EXPORT_SYMBOL(rtw89_pm_ops_be); 667 668 const struct rtw89_pci_gen_def rtw89_pci_gen_be = { 669 .isr_rdu = B_BE_RDU_CH1_INT | B_BE_RDU_CH0_INT, 670 .isr_halt_c2h = B_BE_HALT_C2H_INT, 671 .isr_wdt_timeout = B_BE_WDT_TIMEOUT_INT, 672 .isr_clear_rpq = {R_BE_PCIE_DMA_ISR, B_BE_PCIE_RX_RPQ0_ISR_V1}, 673 .isr_clear_rxq = {R_BE_PCIE_DMA_ISR, B_BE_PCIE_RX_RX0P2_ISR_V1}, 674 675 .mac_pre_init = rtw89_pci_ops_mac_pre_init_be, 676 .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_be, 677 .mac_post_init = rtw89_pci_ops_mac_post_init_be, 678 679 .clr_idx_all = rtw89_pci_clr_idx_all_be, 680 .rst_bdram = rtw89_pci_rst_bdram_be, 681 682 .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_be, 683 .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_be, 684 685 .ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_be, 686 .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_be, 687 .poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle_be, 688 689 .aspm_set = rtw89_pci_aspm_set_be, 690 .clkreq_set = rtw89_pci_clkreq_set_be, 691 .l1ss_set = rtw89_pci_l1ss_set_be, 692 693 .disable_eq = rtw89_pci_disable_eq_be, 694 }; 695 EXPORT_SYMBOL(rtw89_pci_gen_be); 696