1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * HND SiliconBackplane PMU support. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10*4882a593Smuzhiyun * following added to such license: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 18*4882a593Smuzhiyun * modifications of the software. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>> 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _hndpmu_h_ 25*4882a593Smuzhiyun #define _hndpmu_h_ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #include <typedefs.h> 28*4882a593Smuzhiyun #include <osl_decl.h> 29*4882a593Smuzhiyun #include <siutils.h> 30*4882a593Smuzhiyun #include <sbchipc.h> 31*4882a593Smuzhiyun #if defined(BTOVERPCIE) || defined(BT_WLAN_REG_ON_WAR) 32*4882a593Smuzhiyun #include <hnd_gcisem.h> 33*4882a593Smuzhiyun #endif /* BTOVERPCIE || BT_WLAN_REG_ON_WAR */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #if !defined(BCMDONGLEHOST) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO1 1 38*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO2 2 39*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO3 3 40*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_PAREF 4 41*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CLDO_PWM 5 42*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CLDO_BURST 6 43*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CBUCK_PWM 7 44*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_CBUCK_BURST 8 45*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LNLDO1 9 46*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LNLDO2_SEL 10 47*4882a593Smuzhiyun #define SET_LNLDO_PWERUP_LATCH_CTRL 11 48*4882a593Smuzhiyun #define SET_LDO_VOLTAGE_LDO3P3 12 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define BBPLL_NDIV_FRAC_BITS 24 51*4882a593Smuzhiyun #define P1_DIV_SCALE_BITS 12 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define PMUREQTIMER (1 << 0) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define XTAL_FREQ_40MHZ 40000 56*4882a593Smuzhiyun #define XTAL_FREQ_54MHZ 54000 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* selects core based on AOB_ENAB() */ 59*4882a593Smuzhiyun #define PMUREGADDR(sih, pmur, ccr, member) \ 60*4882a593Smuzhiyun (AOB_ENAB(sih) ? (&(pmur)->member) : (&(ccr)->member)) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* prevents backplane stall caused by subsequent writes to 'ilp domain' PMU registers */ 63*4882a593Smuzhiyun #define HND_PMU_SYNC_WR(sih, pmur, ccr, osh, r, v) do { \ 64*4882a593Smuzhiyun if ((sih) && (sih)->pmurev >= 22) { \ 65*4882a593Smuzhiyun while (R_REG(osh, PMUREGADDR(sih, pmur, ccr, pmustatus)) & \ 66*4882a593Smuzhiyun PST_SLOW_WR_PENDING) { \ 67*4882a593Smuzhiyun ; /* empty */ \ 68*4882a593Smuzhiyun } \ 69*4882a593Smuzhiyun } \ 70*4882a593Smuzhiyun W_REG(osh, r, v); \ 71*4882a593Smuzhiyun (void)R_REG(osh, r); \ 72*4882a593Smuzhiyun } while (0) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* PMU Stat Timer */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* for count mode */ 77*4882a593Smuzhiyun enum { 78*4882a593Smuzhiyun PMU_STATS_LEVEL_HIGH = 0, 79*4882a593Smuzhiyun PMU_STATS_LEVEL_LOW, 80*4882a593Smuzhiyun PMU_STATS_EDGE_RISE, 81*4882a593Smuzhiyun PMU_STATS_EDGE_FALL 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun typedef struct { 85*4882a593Smuzhiyun uint8 src_num; /* predefined source hw signal num to map timer */ 86*4882a593Smuzhiyun bool enable; /* timer enable/disable */ 87*4882a593Smuzhiyun bool int_enable; /* overflow interrupts enable/disable */ 88*4882a593Smuzhiyun uint8 cnt_mode; 89*4882a593Smuzhiyun } pmu_stats_timer_t; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* internal hw signal source number for Timer */ 92*4882a593Smuzhiyun #define SRC_PMU_RESRC_OFFSET 0x40 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define SRC_LINK_IN_L12 0 95*4882a593Smuzhiyun #define SRC_LINK_IN_L23 1 96*4882a593Smuzhiyun #define SRC_PM_ST_IN_D0 2 97*4882a593Smuzhiyun #define SRC_PM_ST_IN_D3 3 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define SRC_XTAL_PU (SRC_PMU_RESRC_OFFSET + RES4347_XTAL_PU) 100*4882a593Smuzhiyun #define SRC_CORE_RDY_MAIN (SRC_PMU_RESRC_OFFSET + RES4347_CORE_RDY_MAIN) 101*4882a593Smuzhiyun #define SRC_CORE_RDY_AUX (SRC_PMU_RESRC_OFFSET + RES4347_CORE_RDY_AUX) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #ifdef BCMPMU_STATS 104*4882a593Smuzhiyun extern bool _pmustatsenab; 105*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK) 106*4882a593Smuzhiyun #define PMU_STATS_ENAB() (_pmustatsenab) 107*4882a593Smuzhiyun #elif defined(BCMPMU_STATS_DISABLED) 108*4882a593Smuzhiyun #define PMU_STATS_ENAB() (0) 109*4882a593Smuzhiyun #else 110*4882a593Smuzhiyun #define PMU_STATS_ENAB() (1) 111*4882a593Smuzhiyun #endif 112*4882a593Smuzhiyun #else 113*4882a593Smuzhiyun #define PMU_STATS_ENAB() (0) 114*4882a593Smuzhiyun #endif /* BCMPMU_STATS */ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define RES4369_HTAVAIL_VAL 0x00a80022 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #if defined(BTOVERPCIE) && defined(BT_WLAN_REG_ON_WAR) 119*4882a593Smuzhiyun #error "'BT over PCIe' and 'WLAN/BT REG_ON WAR' are mutually exclusive as " 120*4882a593Smuzhiyun "both share the same GCI semaphore - THREAD_0_GCI_SEM_3_ID" 121*4882a593Smuzhiyun #endif /* BTOVERPCIE && BT_WLAN_REG_ON_WAR */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #if defined(BTOVERPCIE) 124*4882a593Smuzhiyun #define GCI_PLL_LOCK_SEM THREAD_0_GCI_SEM_3_ID 125*4882a593Smuzhiyun /* changed from msec to usec */ 126*4882a593Smuzhiyun #define GCI_PLL_LOCK_SEM_TIMEOUT (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000) 127*4882a593Smuzhiyun #endif /* BTOVERPCIE */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #if defined(BT_WLAN_REG_ON_WAR) 130*4882a593Smuzhiyun #define GCI_BT_WLAN_REG_ON_WAR_SEM THREAD_0_GCI_SEM_3_ID 131*4882a593Smuzhiyun #define GCI_BT_WLAN_REG_ON_WAR_SEM_TIMEOUT (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000) 132*4882a593Smuzhiyun #endif /* BT_WLAN_REG_ON_WAR */ 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define GCI_INDIRECT_ACCESS_SEM THREAD_0_GCI_SEM_2_ID 135*4882a593Smuzhiyun #define GCI_INDIRECT_ACCESS_SEM_TIMEOUT (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define GCI_TREFUP_DS_SEM THREAD_0_GCI_SEM_5_ID 138*4882a593Smuzhiyun #define GCI_TREFUP_DS_SEM_TIMEOUT (GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_MEMOFFSET (0x570u) 141*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_WAIT 0u /* BT ROM code waiting on FW boot */ 142*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_BOOT 2u /* upon FW boot/start */ 143*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_TRAP 3u /* upon a trap */ 144*4882a593Smuzhiyun #define GCI_BT_BOOTSTAGE_FW_INVALID 0xFFu 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define GCI_TREFUP_DS_MEMOFFSET (0x57Cu) 147*4882a593Smuzhiyun #define GCI_TREFUP_DS_WLAN (1u << 0u) 148*4882a593Smuzhiyun #define GCI_TREFUP_DS_BT (1u << 1u) 149*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_RSVD (1u << 2u) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM THREAD_0_GCI_SEM_6_ID 152*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM_TIMEOUT GCI_SEM_TIMEOUT_AFTER_RESERVE * 1000 153*4882a593Smuzhiyun #define GCI_SHARED_SFLASH_SEM_ERASE_RSVD_TIMEOUT 50 + 30 /* 50 us + headroom */ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4369 (PMU_VREG_6) 156*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4369(x) (9u + (x * 8u)) 157*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4369 (3u) 158*4882a593Smuzhiyun #define SLEW_RATE_MASK_4369 ((1u << SLEW_RATE_SIZE_4369) - 1u) 159*4882a593Smuzhiyun #define SOFT_START_EN_REG_4369 (PMU_VREG_5) 160*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4369(x) (4u + x) 161*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4369 (1u) 162*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4369 ((1u << SOFT_START_EN_SIZE_4369) - 1u) 163*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4369 (1u) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4378 (PMU_VREG_6) 166*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4378(x) (9u + (x * 8u)) 167*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4378 (3u) 168*4882a593Smuzhiyun #define SLEW_RATE_MASK_4378 ((1u << SLEW_RATE_SIZE_4378) - 1u) 169*4882a593Smuzhiyun #define SOFT_START_EN_REG_4378 (PMU_VREG_5) 170*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4378(x) (4u + x) 171*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4378 (1u) 172*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4378 ((1u << SOFT_START_EN_SIZE_4378) - 1u) 173*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4378 (1u) 174*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4378_REV37 (0u) 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define SLEW_RATE_VALUE_REG_4387 (PMU_VREG_6) 177*4882a593Smuzhiyun #define SLEW_RATE_SHIFT_4387(x) (18u) 178*4882a593Smuzhiyun #define SLEW_RATE_SIZE_4387 (2u) 179*4882a593Smuzhiyun #define SLEW_RATE_MASK_4387 ((1u << SLEW_RATE_SIZE_4387) - 1u) 180*4882a593Smuzhiyun #define SOFT_START_EN_REG_4387 (PMU_VREG_6) 181*4882a593Smuzhiyun #define SOFT_START_EN_SHIFT_4387(x) (17u) 182*4882a593Smuzhiyun #define SOFT_START_EN_SIZE_4387 (1u) 183*4882a593Smuzhiyun #define SOFT_START_EN_MASK_4387 ((1u << SOFT_START_EN_SIZE_4387) - 1u) 184*4882a593Smuzhiyun #define SOFT_START_EN_VALUE_4387 (0u) 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun extern void si_pmu_init(si_t *sih, osl_t *osh); 187*4882a593Smuzhiyun extern void si_pmu_chip_init(si_t *sih, osl_t *osh); 188*4882a593Smuzhiyun extern void si_pmu_pll_init(si_t *sih, osl_t *osh, uint32 xtalfreq); 189*4882a593Smuzhiyun extern void si_pmu_res_init(si_t *sih, osl_t *osh); 190*4882a593Smuzhiyun extern void si_pmu_swreg_init(si_t *sih, osl_t *osh); 191*4882a593Smuzhiyun extern void si_pmu_res_minmax_update(si_t *sih, osl_t *osh); 192*4882a593Smuzhiyun extern void si_pmu_clear_intmask(si_t *sih); 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun extern uint32 si_pmu_si_clock(si_t *sih, osl_t *osh); /* returns [Hz] units */ 195*4882a593Smuzhiyun extern uint32 si_pmu_cpu_clock(si_t *sih, osl_t *osh); /* returns [hz] units */ 196*4882a593Smuzhiyun extern uint32 si_pmu_mem_clock(si_t *sih, osl_t *osh); /* returns [Hz] units */ 197*4882a593Smuzhiyun extern uint32 si_pmu_alp_clock(si_t *sih, osl_t *osh); /* returns [Hz] units */ 198*4882a593Smuzhiyun extern void si_pmu_ilp_clock_set(uint32 cycles); 199*4882a593Smuzhiyun extern uint32 si_pmu_ilp_clock(si_t *sih, osl_t *osh); /* returns [Hz] units */ 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun extern void si_pmu_set_ldo_voltage(si_t *sih, osl_t *osh, uint8 ldo, uint8 voltage); 202*4882a593Smuzhiyun extern uint16 si_pmu_fast_pwrup_delay(si_t *sih, osl_t *osh); 203*4882a593Smuzhiyun extern uint si_pmu_fast_pwrup_delay_dig(si_t *sih, osl_t *osh); 204*4882a593Smuzhiyun extern void si_pmu_pllupd(si_t *sih); 205*4882a593Smuzhiyun extern void si_pmu_spuravoid(si_t *sih, osl_t *osh, uint8 spuravoid); 206*4882a593Smuzhiyun extern void si_pmu_pll_off_PARR(si_t *sih, osl_t *osh, uint32 *min_res_mask, 207*4882a593Smuzhiyun uint32 *max_res_mask, uint32 *clk_ctl_st); 208*4882a593Smuzhiyun extern uint32 si_pmu_pll28nm_fvco(si_t *sih); 209*4882a593Smuzhiyun /* below function are only for BBPLL parallel purpose */ 210*4882a593Smuzhiyun extern void si_pmu_gband_spurwar(si_t *sih, osl_t *osh); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun extern bool si_pmu_is_otp_powered(si_t *sih, osl_t *osh); 213*4882a593Smuzhiyun extern uint32 si_pmu_measure_alpclk(si_t *sih, osl_t *osh); 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun extern uint32 si_pmu_chipcontrol(si_t *sih, uint reg, uint32 mask, uint32 val); 216*4882a593Smuzhiyun #if defined(SAVERESTORE) 217*4882a593Smuzhiyun extern void si_set_abuck_mode_4362(si_t *sih, uint8 mode); 218*4882a593Smuzhiyun #endif /* SAVERESTORE */ 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #define si_pmu_regcontrol si_pmu_vreg_control /* prevents build err because of usage in PHY */ 221*4882a593Smuzhiyun extern uint32 si_pmu_vreg_control(si_t *sih, uint reg, uint32 mask, uint32 val); 222*4882a593Smuzhiyun extern uint32 si_pmu_pllcontrol(si_t *sih, uint reg, uint32 mask, uint32 val); 223*4882a593Smuzhiyun extern void si_pmu_pllupd(si_t *sih); 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun extern uint32 si_pmu_waitforclk_on_backplane(si_t *sih, osl_t *osh, uint32 clk, uint32 delay); 226*4882a593Smuzhiyun extern uint32 si_pmu_get_bb_vcofreq(si_t *sih, osl_t *osh, int xtalfreq); 227*4882a593Smuzhiyun typedef void (*si_pmu_callback_t)(void* arg); 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun extern uint32 si_mac_clk(si_t *sih, osl_t *osh); 230*4882a593Smuzhiyun extern void si_pmu_switch_on_PARLDO(si_t *sih, osl_t *osh); 231*4882a593Smuzhiyun extern void si_pmu_switch_off_PARLDO(si_t *sih, osl_t *osh); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* TODO: need a better fn name or better abstraction than the raw fvco 234*4882a593Smuzhiyun * and MAC clock channel divisor... 235*4882a593Smuzhiyun */ 236*4882a593Smuzhiyun extern int si_pmu_fvco_macdiv(si_t *sih, uint32 *fvco, uint32 *div); 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun extern bool si_pmu_reset_ret_sleep_log(si_t *sih, osl_t *osh); 239*4882a593Smuzhiyun extern bool si_pmu_reset_chip_sleep_log(si_t *sih, osl_t *osh); 240*4882a593Smuzhiyun extern int si_pmu_openloop_cal(si_t *sih, uint16 currtemp); 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #ifdef LDO3P3_MIN_RES_MASK 243*4882a593Smuzhiyun extern int si_pmu_min_res_ldo3p3_set(si_t *sih, osl_t *osh, bool on); 244*4882a593Smuzhiyun extern int si_pmu_min_res_ldo3p3_get(si_t *sih, osl_t *osh, int *res); 245*4882a593Smuzhiyun #endif /* LDO3P3_MIN_RES_MASK */ 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun void si_pmu_bt_ldo_pu(si_t *sih, bool up); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_wl_get(si_t *sih, osl_t *osh, int *res); 250*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_wl_set(si_t *sih, osl_t *osh, uint32 slew_rate); 251*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_bt_get(si_t *sih, osl_t *osh, int *res); 252*4882a593Smuzhiyun int si_pmu_ldo3p3_soft_start_bt_set(si_t *sih, osl_t *osh, uint32 slew_rate); 253*4882a593Smuzhiyun extern int si_pmu_min_res_otp_pu_set(si_t *sih, osl_t *osh, bool on); 254*4882a593Smuzhiyun #endif /* !defined(BCMDONGLEHOST) */ 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun #if defined(EDV) 257*4882a593Smuzhiyun extern uint32 si_pmu_get_backplaneclkspeed(si_t *sih); 258*4882a593Smuzhiyun extern void si_pmu_update_backplane_clock(si_t *sih, osl_t *osh, uint reg, uint32 mask, uint32 val); 259*4882a593Smuzhiyun #endif 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_macphy_clk_deps(si_t *sih, osl_t *osh, int maccore_index); 262*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_ht_avail_clk_deps(si_t *sih, osl_t *osh); 263*4882a593Smuzhiyun extern uint32 si_pmu_rsrc_cb_ready_deps(si_t *sih, osl_t *osh); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun extern void si_pmu_otp_power(si_t *sih, osl_t *osh, bool on, uint32* min_res_mask); 266*4882a593Smuzhiyun extern void si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength); 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun extern void si_pmu_slow_clk_reinit(si_t *sih, osl_t *osh); 269*4882a593Smuzhiyun extern void si_pmu_avbtimer_enable(si_t *sih, osl_t *osh, bool set_flag); 270*4882a593Smuzhiyun extern uint32 si_pmu_dump_pmucap_binary(si_t *sih, uchar *p); 271*4882a593Smuzhiyun extern uint32 si_pmu_dump_buf_size_pmucap(si_t *sih); 272*4882a593Smuzhiyun extern int si_pmu_wait_for_steady_state(si_t *sih, osl_t *osh, pmuregs_t *pmu); 273*4882a593Smuzhiyun #ifdef ATE_BUILD 274*4882a593Smuzhiyun extern void hnd_pmu_clr_int_sts_req_active(osl_t *hnd_osh, si_t *hnd_sih); 275*4882a593Smuzhiyun #endif 276*4882a593Smuzhiyun extern uint32 si_pmu_wake_bit_offset(si_t *sih); 277*4882a593Smuzhiyun extern uint32 si_pmu_get_pmutimer(si_t *sih); 278*4882a593Smuzhiyun extern void si_pmu_set_min_res_mask(si_t *sih, osl_t *osh, uint min_res_mask); 279*4882a593Smuzhiyun extern void si_pmu_set_mac_rsrc_req(si_t *sih, int macunit); 280*4882a593Smuzhiyun extern void si_pmu_set_mac_rsrc_req_sc(si_t *sih, osl_t *osh); 281*4882a593Smuzhiyun extern bool si_pmu_fast_lpo_enable_pcie(si_t *sih); 282*4882a593Smuzhiyun extern bool si_pmu_fast_lpo_enable_pmu(si_t *sih); 283*4882a593Smuzhiyun extern uint32 si_cur_pmu_time(si_t *sih); 284*4882a593Smuzhiyun extern bool si_pmu_cap_fast_lpo(si_t *sih); 285*4882a593Smuzhiyun extern int si_pmu_fast_lpo_disable(si_t *sih); 286*4882a593Smuzhiyun extern void si_pmu_dmn1_perst_wakeup(si_t *sih, bool set); 287*4882a593Smuzhiyun #ifdef BCMPMU_STATS 288*4882a593Smuzhiyun extern void si_pmustatstimer_init(si_t *sih); 289*4882a593Smuzhiyun extern void si_pmustatstimer_dump(si_t *sih); 290*4882a593Smuzhiyun extern void si_pmustatstimer_start(si_t *sih, uint8 timerid); 291*4882a593Smuzhiyun extern void si_pmustatstimer_stop(si_t *sih, uint8 timerid); 292*4882a593Smuzhiyun extern void si_pmustatstimer_clear(si_t *sih, uint8 timerid); 293*4882a593Smuzhiyun extern void si_pmustatstimer_clear_overflow(si_t *sih); 294*4882a593Smuzhiyun extern uint32 si_pmustatstimer_read(si_t *sih, uint8 timerid); 295*4882a593Smuzhiyun extern void si_pmustatstimer_cfg_src_num(si_t *sih, uint8 src_num, uint8 timerid); 296*4882a593Smuzhiyun extern void si_pmustatstimer_cfg_cnt_mode(si_t *sih, uint8 cnt_mode, uint8 timerid); 297*4882a593Smuzhiyun extern void si_pmustatstimer_int_enable(si_t *sih); 298*4882a593Smuzhiyun extern void si_pmustatstimer_int_disable(si_t *sih); 299*4882a593Smuzhiyun #endif /* BCMPMU_STATS */ 300*4882a593Smuzhiyun extern int si_pmu_min_res_set(si_t *sih, osl_t *osh, uint min_mask, bool set); 301*4882a593Smuzhiyun extern void si_pmu_disable_intr_pwrreq(si_t *sih); 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun #ifdef DONGLEBUILD 304*4882a593Smuzhiyun /* Get PMU registers in rodata */ 305*4882a593Smuzhiyun extern int si_pmu_regs_in_rodata_dump(void *sih, void *arg2, uint32 *bufptr, uint16 *len); 306*4882a593Smuzhiyun #endif 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun extern void si_pmu_fis_setup(si_t *sih); 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun extern uint si_pmu_get_mac_rsrc_req_tmr_cnt(si_t *sih); 311*4882a593Smuzhiyun extern uint si_pmu_get_pmu_interrupt_rcv_cnt(si_t *sih); 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun extern bool _bcm_pwr_opt_dis; 314*4882a593Smuzhiyun #define BCM_PWR_OPT_ENAB() (FALSE) 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun extern int si_pmu_mem_pwr_off(si_t *sih, int core_idx); 317*4882a593Smuzhiyun extern int si_pmu_mem_pwr_on(si_t *sih); 318*4882a593Smuzhiyun extern int si_pmu_lvm_csr_update(si_t *sih, bool lvm); 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun #if defined(BT_WLAN_REG_ON_WAR) 321*4882a593Smuzhiyun #define REG_ON_WAR_PMU_EXT_WAKE_REQ_MASK0_VAL 0x060000CDu 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun extern void si_pmu_reg_on_war_ext_wake_perst_set(si_t *sih); 324*4882a593Smuzhiyun extern void si_pmu_reg_on_war_ext_wake_perst_clear(si_t *sih); 325*4882a593Smuzhiyun #endif /* BT_WLAN_REG_ON_WAR */ 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #if defined (BCMSRTOPOFF) 328*4882a593Smuzhiyun extern bool _srtopoff_enab; 329*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD) 330*4882a593Smuzhiyun #define BCMSRTOPOFF_ENAB() (_srtopoff_enab) 331*4882a593Smuzhiyun #elif defined(BCMSRTOPOFF_DISABLED) 332*4882a593Smuzhiyun #define BCMSRTOPOFF_ENAB() (0) 333*4882a593Smuzhiyun #else 334*4882a593Smuzhiyun #define BCMSRTOPOFF_ENAB() (_srtopoff_enab) 335*4882a593Smuzhiyun #endif 336*4882a593Smuzhiyun #else 337*4882a593Smuzhiyun #define BCMSRTOPOFF_ENAB() (0) 338*4882a593Smuzhiyun #endif /* BCMSRTOPOFF */ 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #ifdef BCM_PMU_FLL_PU_MANAGE 341*4882a593Smuzhiyun #define PMU_FLL_PU_ENAB() (TRUE) 342*4882a593Smuzhiyun #else 343*4882a593Smuzhiyun #define PMU_FLL_PU_ENAB() (FALSE) 344*4882a593Smuzhiyun #endif 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun extern pmuregs_t *hnd_pmur; /* PMU core regs */ 347*4882a593Smuzhiyun extern void si_pmu_res_state_wait(si_t *sih, uint rsrc); 348*4882a593Smuzhiyun #endif /* _hndpmu_h_ */ 349