diff --git a/src/soc/qualcomm/x1p42100/Makefile.mk b/src/soc/qualcomm/x1p42100/Makefile.mk index da3c25b005..719f53988d 100644 --- a/src/soc/qualcomm/x1p42100/Makefile.mk +++ b/src/soc/qualcomm/x1p42100/Makefile.mk @@ -40,6 +40,7 @@ ramstage-y += soc.c ramstage-y += cbmem.c ramstage-$(CONFIG_DRIVERS_UART) += ../common/qupv3_uart.c ramstage-$(CONFIG_PCI) += ../common/pcie_common.c +ramstage-$(CONFIG_PCI) += pcie.c ramstage-y += cpucp_load_reset.c ################################################################################ diff --git a/src/soc/qualcomm/x1p42100/clock.c b/src/soc/qualcomm/x1p42100/clock.c index 283428642e..510c2ca559 100644 --- a/src/soc/qualcomm/x1p42100/clock.c +++ b/src/soc/qualcomm/x1p42100/clock.c @@ -79,6 +79,169 @@ static struct clock_freq_config qupv3_wrap_cfg[] = { }, }; +static u32 *gdsc[MAX_GDSC] = { + [PCIE_6A_GDSC] = &gcc->pcie_6a.gdscr, + [PCIE_6_PHY_GDSC] = &gcc->pcie_6_phy_gdscr, +}; + +struct pcie pcie_cfg[] = { + [PCIE_6A_GDSC] = { + .gdscr = &gcc->pcie_6a.gdscr, + }, + [ANOC_PCIE_AT_CBCR] = { + .clk = &gcc->pcie_noc.anoc_pcie_at_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en2, + .vote_bit = ANOC_PCIE_AT_CLK_ENA, + }, + [ANOC_PCIE_QOSGEN_EXTREF_CBCR] = { + .clk = &gcc->pcie_noc.anoc_pcie_qosgen_extref_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en2, + .vote_bit = ANOC_PCIE_QOSGEN_EXTREF_CLK_ENA, + }, + [DDRSS_PCIE_SF_QTB_CBCR] = { + .clk = &gcc->pcie_noc.ddrss_pcie_sf_qtb_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en, + .vote_bit = DDRSS_PCIE_SF_QTB_CLK_ENA, + }, + [CNOC_PCIE_NORTH_SF_AXI_CBCR] = { + .clk = &gcc->pcie_noc.cnoc_pcie_north_sf_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en1, + .vote_bit = CNOC_PCIE_NORTH_SF_AXI_CLK_ENA, + }, + [CNOC_PCIE_SOUTH_SF_AXI_CBCR] = { + .clk = &gcc->pcie_noc.cnoc_pcie_south_sf_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = CNOC_PCIE_SOUTH_SF_AXI_CLK_ENA, + }, + [NOC_PCIE_DCD_XO_CBCR] = { + .clk = &gcc->pcie_noc.noc_pcie_dcd_xo_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = NOC_PCIE_DCD_XO_CLK_ENA, + }, + [NOC_PCIE_SOUTH_DCD_XO_CBCR] = { + .clk = &gcc->pcie_noc.noc_pcie_south_dcd_xo_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = NOC_PCIE_SOUTH_DCD_XO_CLK_ENA, + }, + [NOC_PCIE_NORTH_DCD_XO_CBCR] = { + .clk = &gcc->pcie_noc.noc_pcie_north_dcd_xo_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en1, + .vote_bit = NOC_PCIE_NORTH_DCD_XO_CLK_ENA, + }, + [CFG_NOC_PCIE_ANOC_AHB_CBCR] = { + .clk = &gcc->pcie_noc.cfg_noc_pcie_anoc_ahb_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = CFG_NOC_PCIE_ANOC_AHB_CLK_ENA, + }, + [CFG_NOC_PCIE_ANOC_NORTH_AHB_CBCR] = { + .clk = &gcc->pcie_noc.cfg_noc_pcie_anoc_north_ahb_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = CFG_NOC_PCIE_ANOC_NORTH_AHB_CLK_ENA, + }, + [CFG_NOC_PCIE_ANOC_SOUTH_AHB_CBCR] = { + .clk = &gcc->pcie_noc.cfg_noc_pcie_anoc_south_ahb_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en, + .vote_bit = CFG_NOC_PCIE_ANOC_SOUTH_AHB_CLK_ENA, + }, + [AGGRE_NOC_PCIE_NORTH_AXI_CBCR] = { + .clk = &gcc->pcie_noc.aggre_noc_pcie_north_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = AGGRE_NOC_PCIE_NORTH_AXI_CLK_ENA, + }, + [ANOC_PCIE_PWRCTL_CBCR] = { + .clk = &gcc->pcie_noc.anoc_pcie_pwrctl_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en1, + .vote_bit = ANOC_PCIE_PWRCTL_CLK_ENA, + }, + [AGGRE_NOC_PCIE_SOUTH_AXI_CBCR] = { + .clk = &gcc->pcie_noc.aggre_noc_pcie_south_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = AGGRE_NOC_PCIE_SOUTH_AXI_CLK_ENA, + }, + [AGGRE_NOC_PCIE_HS_AXI_CBCR] = { + .clk = &gcc->pcie_noc.aggre_noc_pcie_hs_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = AGGRE_NOC_PCIE_HS_AXI_CLK_ENA, + }, + [AGGRE_NOC_PCIE_HS_NORTH_AXI_CBCR] = { + .clk = &gcc->pcie_noc.aggre_noc_pcie_hs_north_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = AGGRE_NOC_PCIE_HS_NORTH_AXI_CLK_ENA, + }, + [AGGRE_NOC_PCIE_HS_SOUTH_AXI_CBCR] = { + .clk = &gcc->pcie_noc.aggre_noc_pcie_hs_south_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en5, + .vote_bit = AGGRE_NOC_PCIE_HS_SOUTH_AXI_CLK_ENA, + }, + [CNOC_PCIE_NORTH_SF_TUNNEL_AXI_CBCR] = { + .clk = &gcc->pcie_noc.cnoc_pcie_north_sf_tunnel_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en2, + .vote_bit = CNOC_PCIE_NORTH_SF_TUNNEL_AXI_CLK_ENA, + }, + [CNOC_PCIE_SOUTH_SF_TUNNEL_AXI_CBCR] = { + .clk = &gcc->pcie_noc.cnoc_pcie_south_sf_tunnel_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en2, + .vote_bit = CNOC_PCIE_SOUTH_SF_TUNNEL_AXI_CLK_ENA, + }, + [PCIE_6A_SLV_Q2A_AXI_CLK] = { + .clk = &gcc->pcie_6a.slv_q2a_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_SLV_Q2A_AXI_CLK_ENA, + }, + [PCIE_6A_SLV_AXI_CLK] = { + .clk = &gcc->pcie_6a.slv_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_SLV_AXI_CLK_ENA, + }, + [PCIE_6A_MSTR_AXI_CLK] = { + .clk = &gcc->pcie_6a.mstr_axi_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_MSTR_AXI_CLK_ENA, + }, + [PCIE_6A_CFG_AHB_CLK] = { + .clk = &gcc->pcie_6a.cfg_ahb_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_CFG_AHB_CLK_ENA, + }, + [PCIE_6A_AUX_CLK] = { + .clk = &gcc->pcie_6a.aux_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_AUX_CLK_ENA, + }, + [PCIE_6A_PHY_AUX_CLK] = { + .clk = &gcc->pcie_6a.phy_aux_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_PHY_AUX_CLK_ENA, + }, + [PCIE_6A_PHY_RCHNG_CLK] = { + .clk = &gcc->pcie_6a.phy_rchng_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_PHY_RCHNG_CLK_ENA, + }, + [PCIE_6A_PIPE_CLK] = { + .clk = &gcc->pcie_6a.pipe_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_PIPE_CLK_ENA, + }, + [PCIE_6A_PIPEDIV2_CLK] = { + .clk = &gcc->pcie_6a.pipediv2_cbcr, + .clk_br_en = &gcc->apcs_clk_br_en3, + .vote_bit = PCIE_6A_PIPEDIV2_CLK_ENA, + }, + [PCIE_6A_PIPE_MUXR] = { + .clk = &gcc->pcie_6a.pipe_muxr, + .vote_bit = NO_VOTE_BIT, + }, +}; + +static struct clock_freq_config pcie_core_cfg[] = { + { + .hz = 100 * MHz, + .src = SRC_GPLL0_MAIN_600MHZ, + .div = QCOM_CLOCK_DIV(6), + }, +}; + void clock_configure_qspi(uint32_t hz) { clock_configure(&gcc->qspi_core, qspi_core_cfg, hz, ARRAY_SIZE(qspi_core_cfg)); @@ -134,6 +297,48 @@ static enum cb_err clock_configure_gpll0(void) return clock_configure_enable_gpll(&gpll0_cfg, false, 0); } + +enum cb_err clock_enable_gdsc(enum clk_gdsc gdsc_type) +{ + if (gdsc_type > MAX_GDSC) + return CB_ERR; + + return enable_and_poll_gdsc_status(gdsc[gdsc_type]); +} + +enum cb_err clock_enable_pcie(enum clk_pcie clk_type) +{ + int clk_vote_bit; + + if (clk_type >= PCIE_CLK_COUNT) + return CB_ERR; + + clk_vote_bit = pcie_cfg[clk_type].vote_bit; + if (clk_vote_bit < 0) + return clock_enable(pcie_cfg[clk_type].clk); + + return clock_enable_vote(pcie_cfg[clk_type].clk, + pcie_cfg[clk_type].clk_br_en, pcie_cfg[clk_type].vote_bit); + +} + +enum cb_err clock_configure_mux(enum clk_pcie clk_type, u32 src_type) +{ + if (clk_type >= PCIE_CLK_COUNT) + return CB_ERR; + + /* Set clock src */ + write32(pcie_cfg[clk_type].clk, src_type); + + return CB_SUCCESS; +} + +void clock_configure_pcie(void) +{ + clock_configure(&gcc->pcie_6a.phy_rchng_rcg, + pcie_core_cfg, PCIE_PHY_RCHNG_FREQ, ARRAY_SIZE(pcie_core_cfg)); +} + static void speed_up_boot_cpu(void) { /* Placeholder */ diff --git a/src/soc/qualcomm/x1p42100/include/soc/addressmap.h b/src/soc/qualcomm/x1p42100/include/soc/addressmap.h index 818b3463b4..c79f300bd2 100644 --- a/src/soc/qualcomm/x1p42100/include/soc/addressmap.h +++ b/src/soc/qualcomm/x1p42100/include/soc/addressmap.h @@ -59,4 +59,46 @@ #define QUP_WRAP2_BASE 0x008C0000 #define QUP_2_GSI_BASE 0x00804000 +/* PCIE 6A */ +#define PCIE6A_PCIE_PARF 0x01BF8000 +#define PCIE6A_GEN1X4_PCIE_DBI 0x70000000 +#define PCIE6A_GEN1X4_PCIE_ELBI 0x70000F40 +#define PCIE6A_GEN1X4_DWC_PCIE_DM_IATU 0x70001000 +#define PCIE6A_SPACE_END_ADDR 0x74000000 +#define PCIE6A_BCR 0x131000 +#define GCC_PCIE_6A_PHY_BCR 0x1AC01C + +/* QMP PHY, Serdes,Tx, Rx and PCS register definitions */ +#define PCIE_6A_AQMP_PHY 0x01BFC000 +#define PCIE_6A_BQMP_PHY 0x01BFE000 + +#define PCIE6A_AQPHY_TX0 0x01BFC000 +#define PCIE6A_AQPHY_RX0 0x01BFC200 +#define PCIE6A_AQPHY_TX1 0x01BFC800 +#define PCIE6A_AQPHY_RX1 0x01BFCA00 +#define PCIE6A_AQPHY_LN_SHRD 0x01BFCE00 +#define PCIE6A_AQPHY_SERDES 0x01BFD000 +#define PCIE6A_AQPHY_PCS_COM 0x01BFD200 +#define PCIE6A_AQPHY_PCS_PCIE 0x01BFD400 +#define PCIE6A_AQPHY_PCS_LANE0 0x01BFD800 +#define PCIE6A_AQPHY_PCS_PCIE_LANE0 0x01BFDA00 +#define PCIE6A_AQPHY_PCS_LANE1 0x01BFDC00 +#define PCIE6A_AQPHY_PCS_PCIE_LANE1 0x01BFDE00 + +#define PCIE6A_BQPHY_TX0 0x01BFE000 +#define PCIE6A_BQPHY_RX0 0x01BFE200 +#define PCIE6A_BQPHY_TX1 0x01BFE800 +#define PCIE6A_BQPHY_RX1 0x01BFEA00 +#define PCIE6A_BQPHY_LN_SHRD 0x01BFEE00 +#define PCIE6A_BQPHY_SERDES 0x01BFF000 +#define PCIE6A_BQPHY_PCS_COM 0x01BFF200 +#define PCIE6A_BQPHY_PCS_PCIE 0x01BFF400 +#define PCIE6A_BQPHY_PCS_LANE0 0x01BFF800 +#define PCIE6A_BQPHY_PCS_PCIE_LANE0 0x01BFFA00 +#define PCIE6A_BQPHY_PCS_LANE1 0x01BFFC00 +#define PCIE6A_BQPHY_PCS_PCIE_LANE1 0x01BFFE00 + +/* TCSR */ +#define TCSR_GCC_PCIE_4L_CLKREF_EN_PCIE_ENABLE ((void *)0x1FD512C) + #endif /* __SOC_QUALCOMM_X1P42100_ADDRESS_MAP_H__ */ diff --git a/src/soc/qualcomm/x1p42100/include/soc/clock.h b/src/soc/qualcomm/x1p42100/include/soc/clock.h index f9848c697a..82556341ca 100644 --- a/src/soc/qualcomm/x1p42100/include/soc/clock.h +++ b/src/soc/qualcomm/x1p42100/include/soc/clock.h @@ -13,6 +13,8 @@ #define GPLL0_MAIN_HZ (600 * MHz) #define CLK_100MHZ (100 * MHz) +#define PCIE_PHY_RCHNG_FREQ CLK_100MHZ + #define QUPV3_WRAP0_CLK_ENA_S(idx) (10 + idx) #define QUPV3_WRAP1_CLK_ENA_S(idx) (22 + idx) #define QUPV3_WRAP2_CLK_ENA_S(idx) (4 + idx) @@ -50,6 +52,35 @@ enum apcs_branch_en_vote { QUPV3_WRAP2_CORE_CLK_ENA = 0, QUPV3_WRAP_2_M_AHB_CLK_ENA = 2, QUPV3_WRAP_2_S_AHB_CLK_ENA = 1, + ANOC_PCIE_AT_CLK_ENA = 11, + ANOC_PCIE_QOSGEN_EXTREF_CLK_ENA = 13, + DDRSS_PCIE_SF_QTB_CLK_ENA = 19, + CNOC_PCIE_NORTH_SF_AXI_CLK_ENA = 6, + CNOC_PCIE_SOUTH_SF_AXI_CLK_ENA = 12, + NOC_PCIE_DCD_XO_CLK_ENA = 24, + NOC_PCIE_SOUTH_DCD_XO_CLK_ENA = 25, + NOC_PCIE_NORTH_DCD_XO_CLK_ENA = 29, + CFG_NOC_PCIE_ANOC_AHB_CLK_ENA = 20, + CFG_NOC_PCIE_ANOC_NORTH_AHB_CLK_ENA = 22, + CFG_NOC_PCIE_ANOC_SOUTH_AHB_CLK_ENA = 20, + AGGRE_NOC_PCIE_NORTH_AXI_CLK_ENA = 19, + ANOC_PCIE_PWRCTL_CLK_ENA = 31, + AGGRE_NOC_PCIE_SOUTH_AXI_CLK_ENA = 13, + AGGRE_NOC_PCIE_HS_AXI_CLK_ENA = 14, + AGGRE_NOC_PCIE_HS_NORTH_AXI_CLK_ENA = 15, + AGGRE_NOC_PCIE_HS_SOUTH_AXI_CLK_ENA = 16, + CNOC_PCIE_NORTH_SF_TUNNEL_AXI_CLK_ENA = 14, + CNOC_PCIE_SOUTH_SF_TUNNEL_AXI_CLK_ENA = 15, + PCIE_6A_SLV_Q2A_AXI_CLK_ENA = 20, + PCIE_6A_SLV_AXI_CLK_ENA = 21, + PCIE_6A_MSTR_AXI_CLK_ENA = 22, + PCIE_6A_CFG_AHB_CLK_ENA = 23, + PCIE_6A_AUX_CLK_ENA = 24, + PCIE_6A_PHY_AUX_CLK_ENA = 25, + PCIE_6A_PIPE_CLK_ENA = 26, + PCIE_6A_PHY_RCHNG_CLK_ENA = 27, + PCIE_6A_PIPEDIV2_CLK_ENA = 28, + NO_VOTE_BIT = -1, }; struct x1p42100_gpll { @@ -66,9 +97,68 @@ struct x1p42100_gpll { u32 config_ctl_u1; }; +struct x1p42100_pcie_noc { + u32 anoc_pcie_at_cbcr; + u32 anoc_pcie_tsctr_cbcr; + u32 anoc_pcie_qosgen_extref_cbcr; + u32 ddrss_pcie_sf_qtb_cbcr; + u32 cnoc_pcie_north_sf_axi_cbcr; + u32 cnoc_pcie_south_sf_axi_cbcr; + u32 noc_pcie_north_dcd_xo_cbcr; + u32 noc_pcie_dcd_xo_cbcr; + u32 noc_pcie_south_dcd_xo_cbcr; + u32 cfg_noc_pcie_anoc_ahb_cbcr; + u32 cfg_noc_pcie_anoc_north_ahb_cbcr; + u32 cfg_noc_pcie_anoc_south_ahb_cbcr; + u32 aggre_noc_pcie_north_axi_cbcr; + u32 anoc_pcie_pwrctl_cbcr; + u32 aggre_noc_pcie_south_axi_cbcr; + u32 aggre_noc_pcie_hs_axi_cbcr; + u32 aggre_noc_pcie_hs_north_axi_cbcr; + u32 aggre_noc_pcie_hs_south_axi_cbcr; + u32 cnoc_pcie_north_sf_tunnel_axi_cbcr; + u32 cnoc_pcie_south_sf_tunnel_axi_cbcr; +}; + +struct x1p42100_pcie { + u32 bcr; + u32 gdscr; + u8 _res0[0x131018 - 0x131008]; + u32 slv_q2a_axi_cbcr; + u32 slv_axi_cbcr; + u8 _res1[0x131028 - 0x131020]; + u32 mstr_axi_cbcr; + u8 _res2[0x131034 - 0x13102c]; + u32 cfg_ahb_cbcr; + u32 aux_cbcr; + u8 _res3[0x131044 - 0x13103c]; + u32 phy_aux_cbcr; + u8 _res4[0x131050 - 0x131048]; + u32 pipe_cbcr; + u8 _res5[0x13105c - 0x131054]; + u32 phy_rchng_cbcr; + u32 pipediv2_cbcr; + u8 _res6[0x131070 - 0x131064]; + struct clock_rcg phy_rchng_rcg; + u8 _res7[0x131088 - 0x131078]; + u32 pipe_muxr; +}; + +check_member(x1p42100_pcie, slv_q2a_axi_cbcr, 0x18); +check_member(x1p42100_pcie, mstr_axi_cbcr, 0x28); +check_member(x1p42100_pcie, cfg_ahb_cbcr, 0x34); +check_member(x1p42100_pcie, phy_aux_cbcr, 0x44); +check_member(x1p42100_pcie, pipe_cbcr, 0x50); +check_member(x1p42100_pcie, phy_rchng_cbcr, 0x5c); +check_member(x1p42100_pcie, phy_rchng_rcg, 0x70); +check_member(x1p42100_pcie, pipe_muxr, 0x88); + struct x1p42100_gcc { struct x1p42100_gpll gpll0; - u8 _res1[0x18004 - 0x0002c]; + u8 _res0[0x10004 - 0x0002c]; + struct x1p42100_pcie_noc pcie_noc; + u8 _res1[0x18004 - 0x10054]; + struct qupv3_clock qup_wrap1_s[8]; u8 _res2[0x1e004 - 0x189c4]; struct qupv3_clock qup_wrap2_s[8]; @@ -99,27 +189,33 @@ struct x1p42100_gcc { u32 qup_wrap2_core_2x_cbcr; u8 _res11[0x232c4 - 0x232bc]; struct clock_rcg qup_wrap2_core_2x; - u8 _res12[0x42004 - 0x232cc]; + u8 _res12[0x31000 - 0x232cc]; + struct x1p42100_pcie pcie_6a; + u8 res13[0x42004-0x3108c]; struct qupv3_clock qup_wrap0_s[8]; - u8 _res13[0x4b000 - 0x429c4]; + u8 _res14[0x4b000 - 0x429c4]; u32 qspi_bcr; u32 qspi_cnoc_ahb_cbcr; u32 qspi_core_cbcr; struct clock_rcg qspi_core; - u8 _res14[0x52000 - 0x4b014]; + u8 _res15[0x52000 - 0x4b014]; u32 apcs_clk_br_en; - u8 _res15[0x52008 - 0x52004]; + u8 _res16[0x52008 - 0x52004]; u32 apcs_clk_br_en1; - u8 _res16[0x52010 - 0x5200C]; + u8 _res17[0x52010 - 0x5200c]; u32 apcs_clk_br_en2; - u8 _res17[0x52018 - 0x52014]; + u8 _res18[0x52018 - 0x52014]; u32 apcs_clk_br_en3; - u8 _res18[0x52020 - 0x5201c]; + u8 _res19[0x52020 - 0x5201c]; u32 apcs_clk_br_en4; - u8 _res19[0x52028 - 0x52024]; + u8 _res20[0x52028 - 0x52024]; u32 apcs_clk_br_en5; - u8 _res20[0x52030 - 0x5202c]; + u8 _res21[0x52030 - 0x5202c]; u32 apcs_pll_br_en; + u8 _res22[0x8e000 - 0x52034]; + u32 pcie_6_phy_gdscr; + u8 _res23[0xac01c - 0x8e004]; + u32 pcie_6a_phy_bcr; }; check_member(x1p42100_gcc, qup_wrap1_s, 0x18004); @@ -142,6 +238,8 @@ check_member(x1p42100_gcc, apcs_clk_br_en3, 0x52018); check_member(x1p42100_gcc, apcs_clk_br_en4, 0x52020); check_member(x1p42100_gcc, apcs_clk_br_en5, 0x52028); check_member(x1p42100_gcc, apcs_pll_br_en, 0x52030); +check_member(x1p42100_gcc, pcie_6_phy_gdscr, 0x8e000); +check_member(x1p42100_gcc, pcie_6a_phy_bcr, 0xac01c); enum clk_qup { QUP_WRAP0_S0, @@ -170,11 +268,70 @@ enum clk_qup { QUP_WRAP2_S7, }; +struct pcie { + uint32_t *gdscr; + uint32_t *clk; + uint32_t *clk_br_en; + int vote_bit; +}; + +enum clk_gdsc { + PCIE_6A_GDSC, + PCIE_6_PHY_GDSC, + MAX_GDSC +}; + +enum clk_pcie_src_sel { + PCIE_6A_PIPE_SRC_SEL = 0, + PCIE_6A_XO_SRC_SEL = 2, +}; + +enum clk_pcie { + ANOC_PCIE_AT_CBCR = 1, + ANOC_PCIE_QOSGEN_EXTREF_CBCR, + DDRSS_PCIE_SF_QTB_CBCR, + CNOC_PCIE_NORTH_SF_AXI_CBCR, + CNOC_PCIE_SOUTH_SF_AXI_CBCR, + NOC_PCIE_DCD_XO_CBCR, + NOC_PCIE_SOUTH_DCD_XO_CBCR, + NOC_PCIE_NORTH_DCD_XO_CBCR, + CFG_NOC_PCIE_ANOC_AHB_CBCR, + CFG_NOC_PCIE_ANOC_NORTH_AHB_CBCR, + CFG_NOC_PCIE_ANOC_SOUTH_AHB_CBCR, + AGGRE_NOC_PCIE_NORTH_AXI_CBCR, + ANOC_PCIE_PWRCTL_CBCR, + AGGRE_NOC_PCIE_SOUTH_AXI_CBCR, + AGGRE_NOC_PCIE_HS_AXI_CBCR, + AGGRE_NOC_PCIE_HS_NORTH_AXI_CBCR, + AGGRE_NOC_PCIE_HS_SOUTH_AXI_CBCR, + CNOC_PCIE_NORTH_SF_TUNNEL_AXI_CBCR, + CNOC_PCIE_SOUTH_SF_TUNNEL_AXI_CBCR, + PCIE_6A_SLV_Q2A_AXI_CLK, + PCIE_6A_SLV_AXI_CLK, + PCIE_6A_MSTR_AXI_CLK, + PCIE_6A_CFG_AHB_CLK, + PCIE_6A_AUX_CLK, + PCIE_6A_PHY_AUX_CLK, + PCIE_6A_PHY_RCHNG_CLK, + PCIE_6A_PIPE_CLK, + PCIE_6A_PIPEDIV2_CLK, + PCIE_6A_PIPE_MUXR, + PCIE_CLK_COUNT, +}; +enum subsystem_reset { + AOP_RESET_SHFT, + CORE_SW_RESET, +}; + /* TODO: update as per datasheet */ void clock_init(void); void clock_configure_qspi(uint32_t hz); void clock_enable_qup(int qup); void clock_configure_dfsr(int qup); +void clock_configure_pcie(void); +enum cb_err clock_enable_gdsc(enum clk_gdsc gdsc_type); +enum cb_err clock_enable_pcie(enum clk_pcie clk_type); +enum cb_err clock_configure_mux(enum clk_pcie clk_type, u32 src_type); /* Subsystem Reset */ static struct aoss *const aoss = (void *)AOSS_CC_BASE; diff --git a/src/soc/qualcomm/x1p42100/pcie.c b/src/soc/qualcomm/x1p42100/pcie.c index 3e38450c4b..031e15d8c8 100644 --- a/src/soc/qualcomm/x1p42100/pcie.c +++ b/src/soc/qualcomm/x1p42100/pcie.c @@ -1,11 +1,22 @@ /* SPDX-License-Identifier: GPL-2.0-only */ +#include +#include +#include +#include +#include +#include +#include #include /* Enable PIPE clock */ int qcom_dw_pcie_enable_pipe_clock(void) { - /* placeholder */ + /* Set pipe clock source */ + if (clock_configure_mux(PCIE_6A_PIPE_MUXR, PCIE_6A_PIPE_SRC_SEL)) { + printk(BIOS_ERR, " %s(): Pipe clock enable failed\n", __func__); + return -1; + } return 0; } @@ -13,9 +24,34 @@ int qcom_dw_pcie_enable_pipe_clock(void) /* Enable controller specific clocks */ int32_t qcom_dw_pcie_enable_clock(void) { - /* placeholder */ + int32_t ret, clk, gdsc; - return 0; + /* Enable gdsc before enable pcie clocks */ + for (gdsc = PCIE_6A_GDSC; gdsc < MAX_GDSC; gdsc++) { + ret = clock_enable_gdsc(gdsc); + if (ret) { + printk(BIOS_ERR, "Failed to enable gdsc\n"); + return ret; + } + } + + /* Configure gcc_pcie*_phy_rchng_clk to 100mhz */ + clock_configure_pcie(); + + /* Enable pcie and PHY clocks */ + for (clk = ANOC_PCIE_AT_CBCR; clk < PCIE_CLK_COUNT; clk++) { + if (clk == PCIE_6A_PIPE_MUXR) { + printk(BIOS_DEBUG, "Skipping pipe\n"); + continue; + } + ret = clock_enable_pcie(clk); + if (ret) { + printk(BIOS_ERR, "Failed to enable %d clock\n", clk); + return ret; + } + } + write32(TCSR_GCC_PCIE_4L_CLKREF_EN_PCIE_ENABLE, 0x1); + return ret; } /* Turn on NVMe */