Skip to content

Commit e24ae0f

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
wifi: rtw89: pci: add LTR v2 for WiFi 7 chip
PCI LTR (Latency Tolerance Reporting) is a capability to yield expected power consumption, and we configure the parameters according to design. Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 2daafe9 commit e24ae0f

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-0
lines changed

drivers/net/wireless/realtek/rtw89/pci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,7 @@ void rtw89_pci_remove(struct pci_dev *pdev);
13171317
void rtw89_pci_ops_reset(struct rtw89_dev *rtwdev);
13181318
int rtw89_pci_ltr_set(struct rtw89_dev *rtwdev, bool en);
13191319
int rtw89_pci_ltr_set_v1(struct rtw89_dev *rtwdev, bool en);
1320+
int rtw89_pci_ltr_set_v2(struct rtw89_dev *rtwdev, bool en);
13201321
u32 rtw89_pci_fill_txaddr_info(struct rtw89_dev *rtwdev,
13211322
void *txaddr_info_addr, u32 total_len,
13221323
dma_addr_t dma, u8 *add_info_nr);

drivers/net/wireless/realtek/rtw89/pci_be.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,63 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev)
328328
return 0;
329329
}
330330

331+
int rtw89_pci_ltr_set_v2(struct rtw89_dev *rtwdev, bool en)
332+
{
333+
u32 ctrl0, cfg0, cfg1, dec_ctrl, idle_ltcy, act_ltcy, dis_ltcy;
334+
335+
ctrl0 = rtw89_read32(rtwdev, R_BE_LTR_CTRL_0);
336+
if (rtw89_pci_ltr_is_err_reg_val(ctrl0))
337+
return -EINVAL;
338+
cfg0 = rtw89_read32(rtwdev, R_BE_LTR_CFG_0);
339+
if (rtw89_pci_ltr_is_err_reg_val(cfg0))
340+
return -EINVAL;
341+
cfg1 = rtw89_read32(rtwdev, R_BE_LTR_CFG_1);
342+
if (rtw89_pci_ltr_is_err_reg_val(cfg1))
343+
return -EINVAL;
344+
dec_ctrl = rtw89_read32(rtwdev, R_BE_LTR_DECISION_CTRL_V1);
345+
if (rtw89_pci_ltr_is_err_reg_val(dec_ctrl))
346+
return -EINVAL;
347+
idle_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX3_V1);
348+
if (rtw89_pci_ltr_is_err_reg_val(idle_ltcy))
349+
return -EINVAL;
350+
act_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX1_V1);
351+
if (rtw89_pci_ltr_is_err_reg_val(act_ltcy))
352+
return -EINVAL;
353+
dis_ltcy = rtw89_read32(rtwdev, R_BE_LTR_LATENCY_IDX0_V1);
354+
if (rtw89_pci_ltr_is_err_reg_val(dis_ltcy))
355+
return -EINVAL;
356+
357+
if (en) {
358+
dec_ctrl |= B_BE_ENABLE_LTR_CTL_DECISION | B_BE_LTR_HW_DEC_EN_V1;
359+
ctrl0 |= B_BE_LTR_HW_EN;
360+
} else {
361+
dec_ctrl &= ~(B_BE_ENABLE_LTR_CTL_DECISION | B_BE_LTR_HW_DEC_EN_V1 |
362+
B_BE_LTR_EN_PORT_V1_MASK);
363+
ctrl0 &= ~B_BE_LTR_HW_EN;
364+
}
365+
366+
dec_ctrl = u32_replace_bits(dec_ctrl, PCI_LTR_SPC_500US,
367+
B_BE_LTR_SPACE_IDX_MASK);
368+
cfg0 = u32_replace_bits(cfg0, PCI_LTR_IDLE_TIMER_3_2MS,
369+
B_BE_LTR_IDLE_TIMER_IDX_MASK);
370+
cfg1 = u32_replace_bits(cfg1, 0xC0, B_BE_LTR_CMAC0_RX_USE_PG_TH_MASK);
371+
cfg1 = u32_replace_bits(cfg1, 0xC0, B_BE_LTR_CMAC1_RX_USE_PG_TH_MASK);
372+
cfg0 = u32_replace_bits(cfg0, 1, B_BE_LTR_IDX_ACTIVE_MASK);
373+
cfg0 = u32_replace_bits(cfg0, 3, B_BE_LTR_IDX_IDLE_MASK);
374+
dec_ctrl = u32_replace_bits(dec_ctrl, 0, B_BE_LTR_IDX_DISABLE_V1_MASK);
375+
376+
rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX3_V1, 0x90039003);
377+
rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX1_V1, 0x880b880b);
378+
rtw89_write32(rtwdev, R_BE_LTR_LATENCY_IDX0_V1, 0);
379+
rtw89_write32(rtwdev, R_BE_LTR_DECISION_CTRL_V1, dec_ctrl);
380+
rtw89_write32(rtwdev, R_BE_LTR_CFG_0, cfg0);
381+
rtw89_write32(rtwdev, R_BE_LTR_CFG_1, cfg1);
382+
rtw89_write32(rtwdev, R_BE_LTR_CTRL_0, ctrl0);
383+
384+
return 0;
385+
}
386+
EXPORT_SYMBOL(rtw89_pci_ltr_set_v2);
387+
331388
const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
332389
.mac_pre_init = rtw89_pci_ops_mac_pre_init_be,
333390

drivers/net/wireless/realtek/rtw89/reg.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3960,6 +3960,49 @@
39603960
#define B_BE_WDT_R_BYPASS BIT(1)
39613961
#define B_BE_WDT_R_ENABLE BIT(0)
39623962

3963+
#define R_BE_LTR_DECISION_CTRL_V1 0x3610
3964+
#define B_BE_ENABLE_LTR_CTL_DECISION BIT(31)
3965+
#define B_BE_LAT_LTR_IDX_DRV_VLD_V1 BIT(24)
3966+
#define B_BE_LAT_LTR_IDX_DRV_V1_MASK GENMASK(23, 22)
3967+
#define B_BE_LAT_LTR_IDX_FW_VLD_V1 BIT(21)
3968+
#define B_BE_LAT_LTR_IDX_FW_V1_MASK GENMASK(20, 19)
3969+
#define B_BE_LAT_LTR_IDX_HW_VLD_V1 BIT(18)
3970+
#define B_BE_LAT_LTR_IDX_HW_V1_MASK GENMASK(17, 16)
3971+
#define B_BE_LTR_IDX_DRV_V1_MASK GENMASK(15, 14)
3972+
#define B_BE_LTR_REQ_DRV_V1 BIT(13)
3973+
#define B_BE_LTR_IDX_DISABLE_V1_MASK GENMASK(9, 8)
3974+
#define B_BE_LTR_EN_PORT_V1_MASK GENMASK(6, 4)
3975+
#define B_BE_LTR_DRV_DEC_EN_V1 BIT(6)
3976+
#define B_BE_LTR_FW_DEC_EN_V1 BIT(5)
3977+
#define B_BE_LTR_HW_DEC_EN_V1 BIT(4)
3978+
#define B_BE_LTR_SPACE_IDX_MASK GENMASK(1, 0)
3979+
3980+
#define R_BE_LTR_LATENCY_IDX0_V1 0x3614
3981+
#define R_BE_LTR_LATENCY_IDX1_V1 0x3618
3982+
#define R_BE_LTR_LATENCY_IDX2_V1 0x361C
3983+
#define R_BE_LTR_LATENCY_IDX3_V1 0x3620
3984+
3985+
#define R_BE_LTR_CTRL_0 0x8410
3986+
#define B_BE_LTR_REQ_FW BIT(18)
3987+
#define B_BE_LTR_IDX_FW_MASK GENMASK(17, 16)
3988+
#define B_BE_LTR_IDLE_TIMER_IDX_MASK GENMASK(10, 8)
3989+
#define B_BE_LTR_WD_NOEMP_CHK BIT(1)
3990+
#define B_BE_LTR_HW_EN BIT(0)
3991+
3992+
#define R_BE_LTR_CFG_0 0x8414
3993+
#define B_BE_LTR_IDX_DISABLE_MASK GENMASK(17, 16)
3994+
#define B_BE_LTR_IDX_IDLE_MASK GENMASK(15, 14)
3995+
#define B_BE_LTR_IDX_ACTIVE_MASK GENMASK(13, 12)
3996+
#define B_BE_LTR_IDLE_TIMER_IDX_MASK GENMASK(10, 8)
3997+
#define B_BE_EN_LTR_CMAC_RX_USE_PG_CHK BIT(3)
3998+
#define B_BE_EN_LTR_WD_NON_EMPTY_CHK BIT(2)
3999+
#define B_BE_EN_LTR_HAXIDMA_TX_IDLE_CHK BIT(1)
4000+
#define B_BE_EN_LTR_HAXIDMA_RX_IDLE_CHK BIT(0)
4001+
4002+
#define R_BE_LTR_CFG_1 0x8418
4003+
#define B_BE_LTR_CMAC1_RX_USE_PG_TH_MASK GENMASK(27, 16)
4004+
#define B_BE_LTR_CMAC0_RX_USE_PG_TH_MASK GENMASK(11, 0)
4005+
39634006
#define R_BE_PLE_DBG_FUN_INTF_CTL 0x9110
39644007
#define B_BE_PLE_DFI_ACTIVE BIT(31)
39654008
#define B_BE_PLE_DFI_TRGSEL_MASK GENMASK(19, 16)

drivers/net/wireless/realtek/rtw89/rtw8922ae.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static const struct rtw89_pci_info rtw8922a_pci_info = {
4848
.dma_addr_set = &rtw89_pci_ch_dma_addr_set_be,
4949
.bd_ram_table = NULL,
5050

51+
.ltr_set = rtw89_pci_ltr_set_v2,
5152
.fill_txaddr_info = rtw89_pci_fill_txaddr_info_v1,
5253
};
5354

0 commit comments

Comments
 (0)