Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
2102198c
Commit
2102198c
authored
5 years ago
by
Paul Beesley
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "intel: agilex: Fix reliance on hard coded clock information" into integration
parents
a8ab58e9
4e865bd2
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
plat/intel/soc/agilex/bl2_plat_setup.c
+3
-3
plat/intel/soc/agilex/bl2_plat_setup.c
plat/intel/soc/agilex/include/agilex_clock_manager.h
+24
-25
plat/intel/soc/agilex/include/agilex_clock_manager.h
plat/intel/soc/agilex/include/agilex_private.h
+4
-5
plat/intel/soc/agilex/include/agilex_private.h
plat/intel/soc/agilex/include/agilex_system_manager.h
+5
-0
plat/intel/soc/agilex/include/agilex_system_manager.h
plat/intel/soc/agilex/soc/agilex_clock_manager.c
+123
-45
plat/intel/soc/agilex/soc/agilex_clock_manager.c
with
159 additions
and
78 deletions
+159
-78
plat/intel/soc/agilex/bl2_plat_setup.c
View file @
2102198c
...
...
@@ -69,9 +69,9 @@ void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1,
deassert_peripheral_reset
();
config_hps_hs_before_warm_reset
();
watchdog_init
(
get_wdt_clk
(
&
reverse_handoff_ptr
));
watchdog_init
(
get_wdt_clk
());
console_16550_register
(
PLAT_UART0_BASE
,
PLAT_UART_CLOCK
,
PLAT_BAUDRATE
,
console_16550_register
(
PLAT_UART0_BASE
,
get_uart_clk
()
,
PLAT_BAUDRATE
,
&
console
);
socfpga_delay_timer_init
();
...
...
@@ -105,7 +105,7 @@ void bl2_el3_plat_arch_setup(void)
enable_mmu_el3
(
0
);
dw_mmc_params_t
params
=
EMMC_INIT_PARAMS
(
0x100000
);
dw_mmc_params_t
params
=
EMMC_INIT_PARAMS
(
0x100000
,
get_mmc_clk
()
);
info
.
mmc_dev_type
=
MMC_IS_SD
;
info
.
ocr_voltage
=
OCR_3_3_3_4
|
OCR_3_2_3_3
;
...
...
This diff is collapsed.
Click to expand it.
plat/intel/soc/agilex/include/agilex_clock_manager.h
View file @
2102198c
...
...
@@ -80,41 +80,38 @@
#define CLKMGR_STAT_PERPLLLOCKED(x) (((x) & 0x00010000) >> 16)
#define CLKMGR_INTRCLR_MAINLOCKLOST_SET_MSK 0x00000004
#define CLKMGR_INTRCLR_PERLOCKLOST_SET_MSK 0x00000008
#define CLKMGR_INTOSC_HZ 460000000
/* Main PLL Macros */
#define CLKMGR_MAINPLL_EN_RESET 0x000000ff
#define CLKMGR_MAINPLL_PLLM_MDIV(x) ((x) & 0x000003ff)
#define CLKMGR_MAINPLL_PLLGLOB_PD_SET_MSK 0x00000001
#define CLKMGR_MAINPLL_PLLGLOB_RST_SET_MSK 0x00000002
#define CLKMGR_MAINPLL_PLLGLOB_REFCLKDIV(x) (((x) & 0x00003f00) >> 8)
#define CLKMGR_MAINPLL_PLLGLOB_AREFCLKDIV(x) (((x) & 0x00000f00) >> 8)
#define CLKMGR_MAINPLL_PLLGLOB_DREFCLKDIV(x) (((x) & 0x00003000) >> 12)
#define CLKMGR_MAINPLL_PLLGLOB_PSRC(x) (((x) & 0x00030000) >> 16)
#define CLKMGR_MAINPLL_PLLGLOB_PSRC_EOSC1 0x0
#define CLKMGR_MAINPLL_PLLGLOB_PSRC_INTOSC 0x1
#define CLKMGR_MAINPLL_PLLGLOB_PSRC_F2S 0x2
#define CLKMGR_MAINPLL_VCOCALIB_HSCNT_SET(x) (((x) << 0) & 0x000003ff)
#define CLKMGR_MAINPLL_VCOCALIB_MSCNT_SET(x) (((x) << 16) & 0x00ff0000)
/* Peripheral PLL Macros */
#define CLKMGR_PERPLL_EN_RESET 0x00000fff
#define CLKMGR_PERPLL_PLLM_MDIV(x) ((x) & 0x000003ff)
#define CLKMGR_PERPLL_GPIODIV_GPIODBCLK_SET(x) (((x) << 0) & 0x0000ffff)
#define CLKMGR_PERPLL_PLLGLOB_PD_SET_MSK 0x00000001
#define CLKMGR_PERPLL_PLLGLOB_REFCLKDIV(x) (((x) & 0x00003f00) >> 8)
#define CLKMGR_PERPLL_PLLGLOB_AREFCLKDIV(x) (((x) & 0x00000f00) >> 8)
#define CLKMGR_PERPLL_PLLGLOB_DREFCLKDIV(x) (((x) & 0x00003000) >> 12)
#define CLKMGR_PERPLL_PLLGLOB_RST_SET_MSK 0x00000002
#define CLKMGR_PERPLL_VCOCALIB_HSCNT_SET(x) (((x) << 0) & 0x000003ff)
#define CLKMGR_PERPLL_VCOCALIB_MSCNT_SET(x) (((x) << 16) & 0x00ff0000)
/* Altera Macros */
#define CLKMGR_ALTERA_EXTCNTRST_RESET 0xff
/* Shared Macros */
#define CLKMGR_PSRC(x) (((x) & 0x00030000) >> 16)
#define CLKMGR_PSRC_MAIN 0
#define CLKMGR_PSRC_PER 1
#define CLKMGR_PLLGLOB_PSRC_EOSC1 0x0
#define CLKMGR_PLLGLOB_PSRC_INTOSC 0x1
#define CLKMGR_PLLGLOB_PSRC_F2S 0x2
#define CLKMGR_PLLM_MDIV(x) ((x) & 0x000003ff)
#define CLKMGR_PLLGLOB_PD_SET_MSK 0x00000001
#define CLKMGR_PLLGLOB_RST_SET_MSK 0x00000002
#define CLKMGR_PLLGLOB_REFCLKDIV(x) (((x) & 0x00003f00) >> 8)
#define CLKMGR_PLLGLOB_AREFCLKDIV(x) (((x) & 0x00000f00) >> 8)
#define CLKMGR_PLLGLOB_DREFCLKDIV(x) (((x) & 0x00003000) >> 12)
#define CLKMGR_VCOCALIB_HSCNT_SET(x) (((x) << 0) & 0x000003ff)
#define CLKMGR_VCOCALIB_MSCNT_SET(x) (((x) << 16) & 0x00ff0000)
typedef
struct
{
uint32_t
clk_freq_of_eosc1
;
...
...
@@ -123,6 +120,8 @@ typedef struct {
}
CLOCK_SOURCE_CONFIG
;
void
config_clkmgr_handoff
(
handoff
*
hoff_ptr
);
int
get_wdt_clk
(
handoff
*
hoff_ptr
);
uint32_t
get_wdt_clk
(
void
);
uint32_t
get_uart_clk
(
void
);
uint32_t
get_mmc_clk
(
void
);
#endif
This diff is collapsed.
Click to expand it.
plat/intel/soc/agilex/include/agilex_private.h
View file @
2102198c
...
...
@@ -11,14 +11,13 @@
#define AGX_MMC_REG_BASE 0xff808000
#define EMMC_DESC_SIZE (1<<20)
#define EMMC_INIT_PARAMS(base)
\
#define EMMC_INIT_PARAMS(base
, clk
) \
{ .bus_width = MMC_BUS_WIDTH_4, \
.clk_rate =
50000000
, \
.clk_rate =
(clk)
, \
.desc_base = (base), \
.desc_size = EMMC_DESC_SIZE, \
.flags = 0, \
.reg_base = AGX_MMC_REG_BASE, \
\
.reg_base = AGX_MMC_REG_BASE \
}
typedef
enum
{
...
...
@@ -26,7 +25,7 @@ typedef enum {
BOOT_SOURCE_SDMMC
,
BOOT_SOURCE_NAND
,
BOOT_SOURCE_RSVD
,
BOOT_SOURCE_QSPI
,
BOOT_SOURCE_QSPI
}
boot_source_type
;
void
enable_nonsecure_access
(
void
);
...
...
This diff is collapsed.
Click to expand it.
plat/intel/soc/agilex/include/agilex_system_manager.h
View file @
2102198c
...
...
@@ -65,6 +65,11 @@
#define AGX_CCU_NOC_CPU0_RAMSPACE0_0 0xf7004688
#define AGX_CCU_NOC_IOM_RAMSPACE0_0 0xf7018628
#define AGX_SYSMGR_CORE(x) (0xffd12000 + (x))
#define SYSMGR_BOOT_SCRATCH_COLD_0 0x200
#define SYSMGR_BOOT_SCRATCH_COLD_1 0x204
#define SYSMGR_BOOT_SCRATCH_COLD_2 0x208
#define DISABLE_BRIDGE_FIREWALL 0x0ffe0101
#define DISABLE_L4_FIREWALL (BIT(0) | BIT(16) | BIT(24))
...
...
This diff is collapsed.
Click to expand it.
plat/intel/soc/agilex/soc/agilex_clock_manager.c
View file @
2102198c
...
...
@@ -12,15 +12,8 @@
#include "agilex_clock_manager.h"
#include "agilex_handoff.h"
#include "agilex_system_manager.h"
static
const
CLOCK_SOURCE_CONFIG
clk_source
=
{
/* clk_freq_of_eosc1 */
(
uint32_t
)
25000000
,
/* clk_freq_of_f2h_free */
(
uint32_t
)
400000000
,
/* clk_freq_of_cb_intosc_ls */
(
uint32_t
)
50000000
,
};
uint32_t
wait_pll_lock
(
void
)
{
...
...
@@ -114,18 +107,18 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
/* Put both PLL in reset and power down */
mmio_clrbits_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_PLLGLOB
,
CLKMGR_
MAINPLL_
PLLGLOB_PD_SET_MSK
|
CLKMGR_
MAINPLL_
PLLGLOB_RST_SET_MSK
);
CLKMGR_PLLGLOB_PD_SET_MSK
|
CLKMGR_PLLGLOB_RST_SET_MSK
);
mmio_clrbits_32
(
CLKMGR_PERPLL
+
CLKMGR_PERPLL_PLLGLOB
,
CLKMGR_
PERPLL_
PLLGLOB_PD_SET_MSK
|
CLKMGR_
PERPLL_
PLLGLOB_RST_SET_MSK
);
CLKMGR_PLLGLOB_PD_SET_MSK
|
CLKMGR_PLLGLOB_RST_SET_MSK
);
/* Setup main PLL dividers */
mdiv
=
CLKMGR_
MAINPLL_
PLLM_MDIV
(
hoff_ptr
->
main_pll_pllm
);
mdiv
=
CLKMGR_PLLM_MDIV
(
hoff_ptr
->
main_pll_pllm
);
arefclk_div
=
CLKMGR_
MAINPLL_
PLLGLOB_AREFCLKDIV
(
arefclk_div
=
CLKMGR_PLLGLOB_AREFCLKDIV
(
hoff_ptr
->
main_pll_pllglob
);
drefclk_div
=
CLKMGR_
MAINPLL_
PLLGLOB_DREFCLKDIV
(
drefclk_div
=
CLKMGR_PLLGLOB_DREFCLKDIV
(
hoff_ptr
->
main_pll_pllglob
);
mscnt
=
100
/
(
mdiv
/
BIT
(
drefclk_div
));
...
...
@@ -134,8 +127,8 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
hscnt
=
(
mdiv
*
mscnt
*
BIT
(
drefclk_div
)
/
arefclk_div
)
-
4
;
mmio_write_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_VCOCALIB
,
CLKMGR_
MAINPLL_
VCOCALIB_HSCNT_SET
(
hscnt
)
|
CLKMGR_
MAINPLL_
VCOCALIB_MSCNT_SET
(
mscnt
));
CLKMGR_VCOCALIB_HSCNT_SET
(
hscnt
)
|
CLKMGR_VCOCALIB_MSCNT_SET
(
mscnt
));
mmio_write_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_NOCDIV
,
hoff_ptr
->
main_pll_nocdiv
);
...
...
@@ -159,11 +152,11 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
hoff_ptr
->
main_pll_nocclk
);
/* Setup peripheral PLL dividers */
mdiv
=
CLKMGR_
PERPLL_
PLLM_MDIV
(
hoff_ptr
->
per_pll_pllm
);
mdiv
=
CLKMGR_PLLM_MDIV
(
hoff_ptr
->
per_pll_pllm
);
arefclk_div
=
CLKMGR_
PERPLL_
PLLGLOB_AREFCLKDIV
(
arefclk_div
=
CLKMGR_PLLGLOB_AREFCLKDIV
(
hoff_ptr
->
per_pll_pllglob
);
drefclk_div
=
CLKMGR_
PERPLL_
PLLGLOB_DREFCLKDIV
(
drefclk_div
=
CLKMGR_PLLGLOB_DREFCLKDIV
(
hoff_ptr
->
per_pll_pllglob
);
mscnt
=
100
/
(
mdiv
/
BIT
(
drefclk_div
));
...
...
@@ -172,8 +165,8 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
hscnt
=
(
mdiv
*
mscnt
*
BIT
(
drefclk_div
)
/
arefclk_div
)
-
4
;
mmio_write_32
(
CLKMGR_PERPLL
+
CLKMGR_PERPLL_VCOCALIB
,
CLKMGR_
PERPLL_
VCOCALIB_HSCNT_SET
(
hscnt
)
|
CLKMGR_
PERPLL_
VCOCALIB_MSCNT_SET
(
mscnt
));
CLKMGR_VCOCALIB_HSCNT_SET
(
hscnt
)
|
CLKMGR_VCOCALIB_MSCNT_SET
(
mscnt
));
mmio_write_32
(
CLKMGR_PERPLL
+
CLKMGR_PERPLL_EMACCTL
,
hoff_ptr
->
per_pll_emacctl
);
...
...
@@ -197,11 +190,11 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
/* Take both PLL out of reset and power up */
mmio_setbits_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_PLLGLOB
,
CLKMGR_
MAINPLL_
PLLGLOB_PD_SET_MSK
|
CLKMGR_
MAINPLL_
PLLGLOB_RST_SET_MSK
);
CLKMGR_PLLGLOB_PD_SET_MSK
|
CLKMGR_PLLGLOB_RST_SET_MSK
);
mmio_setbits_32
(
CLKMGR_PERPLL
+
CLKMGR_PERPLL_PLLGLOB
,
CLKMGR_
PERPLL_
PLLGLOB_PD_SET_MSK
|
CLKMGR_
PERPLL_
PLLGLOB_RST_SET_MSK
);
CLKMGR_PLLGLOB_PD_SET_MSK
|
CLKMGR_PLLGLOB_RST_SET_MSK
);
wait_pll_lock
();
...
...
@@ -256,24 +249,31 @@ void config_clkmgr_handoff(handoff *hoff_ptr)
CLKMGR_MAINPLL_EN_RESET
);
mmio_write_32
(
CLKMGR_PERPLL
+
CLKMGR_PERPLL_EN
,
CLKMGR_PERPLL_EN_RESET
);
/* Pass clock source frequency into scratch register */
mmio_write_32
(
AGX_SYSMGR_CORE
(
SYSMGR_BOOT_SCRATCH_COLD_1
),
hoff_ptr
->
hps_osc_clk_h
);
mmio_write_32
(
AGX_SYSMGR_CORE
(
SYSMGR_BOOT_SCRATCH_COLD_2
),
hoff_ptr
->
fpga_clk_hz
);
}
int
get_wdt_clk
(
handoff
*
hoff_ptr
)
/* Extract reference clock from platform clock source */
uint32_t
get_ref_clk
(
uint32_t
pllglob
)
{
int
main_noc_base_clk
,
l3_main_free_clk
,
l4_sys_free_clk
;
int
data32
,
mdiv
,
arefclkdiv
,
ref_clk
;
data32
=
mmio_read_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_PLLGLOB
);
uint32_t
arefclkdiv
,
ref_clk
;
uint32_t
scr_reg
;
switch
(
CLKMGR_MAINPLL_PLLGLOB_PSRC
(
data32
))
{
case
CLKMGR_MAINPLL_PLLGLOB_PSRC_EOSC1
:
ref_clk
=
clk_source
.
clk_freq_of_eosc1
;
switch
(
CLKMGR_PSRC
(
pllglob
))
{
case
CLKMGR_PLLGLOB_PSRC_EOSC1
:
scr_reg
=
AGX_SYSMGR_CORE
(
SYSMGR_BOOT_SCRATCH_COLD_1
);
ref_clk
=
mmio_read_32
(
scr_reg
);
break
;
case
CLKMGR_
MAINPLL_
PLLGLOB_PSRC_INTOSC
:
ref_clk
=
clk_source
.
clk_freq_of_cb_intosc_ls
;
case
CLKMGR_PLLGLOB_PSRC_INTOSC
:
ref_clk
=
CLKMGR_INTOSC_HZ
;
break
;
case
CLKMGR_MAINPLL_PLLGLOB_PSRC_F2S
:
ref_clk
=
clk_source
.
clk_freq_of_f2h_free
;
case
CLKMGR_PLLGLOB_PSRC_F2S
:
scr_reg
=
AGX_SYSMGR_CORE
(
SYSMGR_BOOT_SCRATCH_COLD_2
);
ref_clk
=
mmio_read_32
(
scr_reg
);
break
;
default:
ref_clk
=
0
;
...
...
@@ -281,13 +281,91 @@ int get_wdt_clk(handoff *hoff_ptr)
break
;
}
arefclkdiv
=
CLKMGR_MAINPLL_PLLGLOB_AREFCLKDIV
(
data32
);
mdiv
=
CLKMGR_MAINPLL_PLLM_MDIV
(
hoff_ptr
->
main_pll_pllm
);
arefclkdiv
=
CLKMGR_PLLGLOB_AREFCLKDIV
(
pllglob
);
ref_clk
/=
arefclkdiv
;
return
ref_clk
;
}
/* Calculate clock frequency based on parameter */
uint32_t
get_clk_freq
(
uint32_t
psrc_reg
,
uint32_t
main_pllc
,
uint32_t
per_pllc
)
{
uint32_t
clk_psrc
,
mdiv
,
ref_clk
;
uint32_t
pllm_reg
,
pllc_reg
,
pllc_div
,
pllglob_reg
;
clk_psrc
=
mmio_read_32
(
CLKMGR_MAINPLL
+
psrc_reg
);
switch
(
CLKMGR_PSRC
(
clk_psrc
))
{
case
CLKMGR_PSRC_MAIN
:
pllm_reg
=
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_PLLM
;
pllc_reg
=
CLKMGR_MAINPLL
+
main_pllc
;
pllglob_reg
=
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_PLLGLOB
;
break
;
case
CLKMGR_PSRC_PER
:
pllm_reg
=
CLKMGR_PERPLL
+
CLKMGR_PERPLL_PLLM
;
pllc_reg
=
CLKMGR_PERPLL
+
per_pllc
;
pllglob_reg
=
CLKMGR_PERPLL
+
CLKMGR_PERPLL_PLLGLOB
;
break
;
default:
return
0
;
}
ref_clk
=
get_ref_clk
(
mmio_read_32
(
pllglob_reg
));
mdiv
=
CLKMGR_PLLM_MDIV
(
mmio_read_32
(
pllm_reg
));
ref_clk
*=
mdiv
;
pllc_div
=
mmio_read_32
(
pllc_reg
)
&
0x7ff
;
return
ref_clk
/
pllc_div
;
}
/* Return L3 interconnect clock */
uint32_t
get_l3_clk
(
void
)
{
uint32_t
l3_clk
;
l3_clk
=
get_clk_freq
(
CLKMGR_MAINPLL_NOCCLK
,
CLKMGR_MAINPLL_PLLC1
,
CLKMGR_PERPLL_PLLC1
);
return
l3_clk
;
}
/* Calculate clock frequency to be used for watchdog timer */
uint32_t
get_wdt_clk
(
void
)
{
uint32_t
l3_clk
,
l4_sys_clk
;
l3_clk
=
get_l3_clk
();
l4_sys_clk
=
l3_clk
/
4
;
return
l4_sys_clk
;
}
/* Calculate clock frequency to be used for UART driver */
uint32_t
get_uart_clk
(
void
)
{
uint32_t
data32
,
l3_clk
,
l4_sp_clk
;
l3_clk
=
get_l3_clk
();
data32
=
mmio_read_32
(
CLKMGR_MAINPLL
+
CLKMGR_MAINPLL_NOCDIV
);
data32
=
(
data32
>>
16
)
&
0x3
;
l4_sp_clk
=
l3_clk
>>
data32
;
return
l4_sp_clk
;
}
/* Calculate clock frequency to be used for SDMMC driver */
uint32_t
get_mmc_clk
(
void
)
{
uint32_t
data32
,
mmc_clk
;
mmc_clk
=
get_clk_freq
(
CLKMGR_ALTERA_SDMMCCTR
,
CLKMGR_MAINPLL_PLLC3
,
CLKMGR_PERPLL_PLLC3
);
ref_clk
=
(
ref_clk
/
arefclkdiv
)
*
mdiv
;
main_noc_base_clk
=
ref_clk
/
(
hoff_ptr
->
main_pll_pllc1
&
0x7ff
);
l3_main_free_clk
=
main_noc_base_clk
/
(
hoff_ptr
->
main_pll_nocclk
+
1
);
l4_sys_free_clk
=
l3_main_free_clk
/
4
;
data32
=
mmio_read_32
(
CLKMGR_ALTERA
+
CLKMGR_ALTERA_SDMMCCTR
);
data32
=
(
data32
&
0x7ff
)
+
1
;
mmc_clk
=
(
mmc_clk
/
data32
)
/
4
;
return
l4_sys_free
_clk
;
return
mmc
_clk
;
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help