soc/qualcomm/x1p42100: Add PCIE Clock support for x1p42100

Add support to enable PCIE NOC, Controller and PHY clocks.
The register details are part of HRD-X1P42100-S1 document.
https://docs.qualcomm.com/bundle/resource/topics/HRD-X1P42100-S1/

TEST=Create an image.serial.bin, ensure it boots on X1P42100 and
check clock status

Change-Id: I6007a8315343a2d56d51c8472ace831a10146768
Signed-off-by: Hari L <haril@qualcomm.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/88481
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Subrata Banik <subratabanik@google.com>
This commit is contained in:
haril 2025-07-16 16:55:00 +05:30 committed by Matt DeVillier
commit 1b8dd662a9
5 changed files with 454 additions and 13 deletions

View file

@ -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
################################################################################

View file

@ -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 */

View file

@ -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__ */

View file

@ -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;

View file

@ -1,11 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
#include <device/device.h>
#include <device/mmio.h>
#include <device/pci.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/qcom_qmp_phy.h>
#include <soc/pcie.h>
/* 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 */