soc/qualcomm/x1p42100: Add API to enable display clocks

Add API to enable the essential display clocks required for display
subsystem initialization.

Test=1. Build and boot on X1P42100.

Change-Id: Ifc634f2c00eb933bf03b898e132ab5bf137149f8
Signed-off-by: Swathi Tamilselvan <tswathi@qualcomm.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90468
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Kapil Porwal <kapilporwal@google.com>
Reviewed-by: Subrata Banik <subratabanik@google.com>
This commit is contained in:
Swathi Tamilselvan 2025-12-15 14:54:16 +05:30 committed by Matt DeVillier
commit e1e7b9b203
3 changed files with 130 additions and 0 deletions

View file

@ -294,6 +294,26 @@ static u32 *usb_sec_cbcr[USB_SEC_CLK_COUNT] = {
[USB_SEC_SYS_NOC_USB_AXI_CBCR] = &gcc->gcc_sys_noc_usb_axi_cbcr,
};
static u32 *disp_gdsc[MAX_DISP_GDSC] = {
[DISP_CC_CORE_GDSC] = &disp_cc->mdss_core_gdscr,
};
static u32 *mdss_cbcr[MDSS_CLK_COUNT] = {
[GCC_DISP_AHB_CBCR] = &gcc->gcc_disp_ahb_cbcr,
[GCC_DISP_XO_CBCR] = &gcc->gcc_disp_xo_cbcr,
[GCC_DISP_HF_AXI_CBCR] = &gcc->gcc_disp_hf_axi_cbcr,
[DISP_CC_MDSS_AHB_CBCR] = &disp_cc->mdss_ahb_cbcr,
[DISP_CC_MDSS_MDP_CBCR] = &disp_cc->mdss_mdp_cbcr,
[DISP_CC_MDSS_VSYNC_CBCR] = &disp_cc->mdss_vsync_cbcr,
[DISP_CC_MDSS_RSCC_AHB_CBCR] = &disp_cc->mdss_rscc_ahb_cbcr,
[DISP_CC_MDSS_RSCC_VSYNC_CBCR] = &disp_cc->mdss_rscc_vsync_cbcr,
[DISP_CC_XO_CBCR] = &disp_cc->xo_cbcr,
[DISP_CC_MDSS_DPTX3_PIXEL0_CBCR] = &disp_cc->mdss_dptx3_pixel0_cbcr,
[DISP_CC_MDSS_DPTX3_LINK_CBCR] = &disp_cc->mdss_dptx3_link_cbcr,
[DISP_CC_MDSS_DPTX3_AUX_CBCR] = &disp_cc->mdss_dptx3_aux_cbcr,
[DISP_CC_MDSS_DPTX3_LINK_INTF_CBCR] = &disp_cc->mdss_dptx3_link_intf_cbcr,
};
static struct clock_freq_config pcie_core_cfg[] = {
{
.hz = 100 * MHz,
@ -500,6 +520,14 @@ enum cb_err clock_enable_usb_gdsc(enum clk_usb_gdsc gdsc_type)
return enable_and_poll_gdsc_status(usb_gdsc[gdsc_type]);
}
enum cb_err clock_enable_disp_gdsc(enum clk_disp_gdsc gdsc_type)
{
if (gdsc_type >= MAX_DISP_GDSC)
return CB_ERR;
return enable_and_poll_gdsc_status(disp_gdsc[gdsc_type]);
}
enum cb_err usb_clock_enable(enum clk_usb clk_type)
{
if (clk_type >= USB_CLK_COUNT)
@ -623,6 +651,45 @@ static enum cb_err pll_init_and_set(struct x1p42100_ncc0_clock *ncc0, u32 l_val)
return CB_SUCCESS;
}
enum cb_err disp_pll_init_and_set(struct x1p42100_disp_pll_clock *disp_pll, u32 l_val, u32 alpha_val)
{
int ret;
struct alpha_pll_reg_val_config disp_pll_cfg = {0};
disp_pll_cfg.reg_l = &disp_pll->pll_l;
disp_pll_cfg.l_val = l_val;
disp_pll_cfg.reg_alpha = &disp_pll->pll_alpha;
disp_pll_cfg.alpha_val = alpha_val;
disp_pll_cfg.reg_user_ctl = &disp_pll->pll_user_ctl;
disp_pll_cfg.user_ctl_val = 0x1;
clock_configure_enable_gpll(&disp_pll_cfg, false, 0);
disp_pll_cfg.reg_mode = &disp_pll->pll_mode;
disp_pll_cfg.reg_opmode = &disp_pll->pll_opmode;
ret = lucidole_pll_enable(&disp_pll_cfg);
if (ret != CB_SUCCESS)
return CB_ERR;
return CB_SUCCESS;
}
enum cb_err mdss_clock_enable(enum clk_mdss clk_type)
{
if (clk_type >= MDSS_CLK_COUNT)
return CB_ERR;
/* Enable clock */
return clock_enable(mdss_cbcr[clk_type]);
}
void enable_disp_clock_tcsr(void)
{
write32(TCSR_GCC_EDP_CLKREF_EN_ADDR, 0x1);
}
static void speed_up_boot_cpu(void)
{
/* 1363.2 MHz */

View file

@ -4,12 +4,68 @@
#include <console/console.h>
#include <timer.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/cmd_db.h>
#include <soc/rpmh.h>
#include <soc/rpmh_bcm.h>
#include <soc/rpmh_config.h>
#include <soc/rpmh_regulator.h>
static struct clock_freq_config disp_cc_mdss_ahb_cfg[] = {
{
.hz = SRC_XO_HZ, /* 19.2MHz */
.src = SRC_XO_19_2MHZ_AHB,
.div = QCOM_CLOCK_DIV(1),
},
{
.hz = CLK_37_5MHZ,
.src = SRC_DISP_CC_PLL1_MAIN_AHB,
.div = QCOM_CLOCK_DIV(16),
},
{
.hz = CLK_75MHZ,
.src = SRC_DISP_CC_PLL1_MAIN_AHB,
.div = QCOM_CLOCK_DIV(8),
},
};
static struct clock_freq_config disp_cc_mdss_mdp_cfg[] = {
{
.hz = CLK_575MHZ,
.src = SRC_DISP_CC_PLL0_MAIN_MDP,
.div = QCOM_CLOCK_DIV(3),
},
{
.hz = CLK_400MHZ,
.src = SRC_DISP_CC_PLL1_MAIN_MDP,
.div = QCOM_CLOCK_DIV(1.5),
},
};
void enable_mdss_clk(void)
{
/*
* Display clock initialization sequence
* 1. Enable GCC clocks (AHB, AXI) - GCC clocks that are required for display
* 2. Enable GDSC (power domain) - powers up the display subsystem
* 3. Initialize display PLLs - required to use clock sources from disp_cc domain
* 4. Configure and enable disp_cc clocks - enable display clocks
*/
mdss_clock_enable(GCC_DISP_AHB_CBCR);
clock_enable_disp_gdsc(DISP_CC_CORE_GDSC);
mdss_clock_enable(GCC_DISP_HF_AXI_CBCR);
disp_pll_init_and_set(apss_disp_pll0, L_VAL_1725MHz, DISP_PLL0_ALPHA_VAL);
disp_pll_init_and_set(apss_disp_pll1, L_VAL_600MHz, DISP_PLL1_ALPHA_VAL);
clock_configure(&disp_cc->mdss_ahb_rcg,
disp_cc_mdss_ahb_cfg, CLK_75MHZ, ARRAY_SIZE(disp_cc_mdss_ahb_cfg));
mdss_clock_enable(DISP_CC_MDSS_AHB_CBCR);
clock_configure(&disp_cc->mdss_mdp_rcg,
disp_cc_mdss_mdp_cfg, CLK_575MHZ, ARRAY_SIZE(disp_cc_mdss_mdp_cfg));
mdss_clock_enable(DISP_CC_MDSS_MDP_CBCR);
mdss_clock_enable(DISP_CC_MDSS_VSYNC_CBCR);
enable_disp_clock_tcsr();
}
/**
* display_rpmh_init() - Initialize RPMh for display power management
*

View file

@ -16,6 +16,7 @@
#define CLK_400MHZ (400 * MHz)
#define CLK_75MHZ (75 * MHz)
#define CLK_575MHZ (575 * MHz)
#define CLK_37_5MHZ (37.5 * MHz)
/* CPU PLL*/
#define L_VAL_1363P2MHz 0x47
@ -745,14 +746,20 @@ void clock_enable_qup(int qup);
void clock_configure_dfsr(int qup);
void clock_configure_pcie(void);
void clock_configure_usb(void);
void enable_disp_clock_tcsr(void);
void enable_mdss_clk(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);
enum cb_err usb_clock_configure_mux(enum clk_pipe_usb clk_type, u32 src_type);
enum cb_err usb_clock_enable(enum clk_usb clk_type);
enum cb_err clock_enable_usb_gdsc(enum clk_usb_gdsc gdsc_type);
enum cb_err clock_enable_disp_gdsc(enum clk_disp_gdsc gdsc_type);
enum cb_err usb_prim_clock_enable(enum clk_usb_prim clk_type);
enum cb_err usb_sec_clock_enable(enum clk_usb_sec clk_type);
enum cb_err mdss_clock_enable(enum clk_mdss clk_type);
enum cb_err disp_pll_init_and_set(struct x1p42100_disp_pll_clock *disp_pll,
u32 l_val, u32 alpha_val);
void clock_configure_dfsr_table_x1p42100(int qup, struct clock_freq_config *clk_cfg,
uint32_t num_perfs);