xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_dbgmcu.c (revision a24d5947af5921beab566e7f9e9d23e2f9dd9072)
173680c23SYann Gautier /*
2*a24d5947SNicolas Le Bayon  * Copyright (c) 2016-2021, STMicroelectronics - All Rights Reserved
373680c23SYann Gautier  *
473680c23SYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
573680c23SYann Gautier  */
673680c23SYann Gautier 
7*a24d5947SNicolas Le Bayon #include <assert.h>
873680c23SYann Gautier #include <errno.h>
973680c23SYann Gautier 
1073680c23SYann Gautier #include <platform_def.h>
1173680c23SYann Gautier 
1273680c23SYann Gautier #include <common/debug.h>
1373680c23SYann Gautier #include <drivers/st/bsec.h>
1473680c23SYann Gautier #include <drivers/st/stm32mp1_rcc.h>
1573680c23SYann Gautier #include <lib/mmio.h>
1673680c23SYann Gautier #include <lib/utils_def.h>
1773680c23SYann Gautier 
1873680c23SYann Gautier #include <stm32mp1_dbgmcu.h>
1973680c23SYann Gautier 
20dec286ddSYann Gautier #define DBGMCU_IDC		U(0x00)
2173680c23SYann Gautier #define DBGMCU_APB4FZ1		U(0x2C)
22dec286ddSYann Gautier 
23dec286ddSYann Gautier #define DBGMCU_IDC_DEV_ID_MASK	GENMASK(11, 0)
24dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_MASK	GENMASK(31, 16)
25dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_SHIFT	16
26dec286ddSYann Gautier 
2773680c23SYann Gautier #define DBGMCU_APB4FZ1_IWDG2	BIT(2)
2873680c23SYann Gautier 
2973680c23SYann Gautier static int stm32mp1_dbgmcu_init(void)
3073680c23SYann Gautier {
3173680c23SYann Gautier 	uint32_t dbg_conf;
3273680c23SYann Gautier 
3373680c23SYann Gautier 	dbg_conf = bsec_read_debug_conf();
3473680c23SYann Gautier 
3573680c23SYann Gautier 	if ((dbg_conf & BSEC_DBGSWGEN) == 0U) {
3673680c23SYann Gautier 		uint32_t result = bsec_write_debug_conf(dbg_conf |
3773680c23SYann Gautier 							BSEC_DBGSWGEN);
3873680c23SYann Gautier 
3973680c23SYann Gautier 		if (result != BSEC_OK) {
4073680c23SYann Gautier 			ERROR("Error enabling DBGSWGEN\n");
4173680c23SYann Gautier 			return -1;
4273680c23SYann Gautier 		}
4373680c23SYann Gautier 	}
4473680c23SYann Gautier 
45*a24d5947SNicolas Le Bayon 	mmio_setbits_32(RCC_BASE + RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
4673680c23SYann Gautier 
4773680c23SYann Gautier 	return 0;
4873680c23SYann Gautier }
4973680c23SYann Gautier 
50*a24d5947SNicolas Le Bayon /*
51*a24d5947SNicolas Le Bayon  * @brief  Get silicon revision from DBGMCU registers.
52*a24d5947SNicolas Le Bayon  * @param  chip_version: pointer to the read value.
53*a24d5947SNicolas Le Bayon  * @retval 0 on success, negative value on failure.
54*a24d5947SNicolas Le Bayon  */
55dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_version(uint32_t *chip_version)
56dec286ddSYann Gautier {
57*a24d5947SNicolas Le Bayon 	assert(chip_version != NULL);
58*a24d5947SNicolas Le Bayon 
59dec286ddSYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
60dec286ddSYann Gautier 		return -EPERM;
61dec286ddSYann Gautier 	}
62dec286ddSYann Gautier 
63dec286ddSYann Gautier 	*chip_version = (mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) &
64dec286ddSYann Gautier 			 DBGMCU_IDC_REV_ID_MASK) >> DBGMCU_IDC_REV_ID_SHIFT;
65dec286ddSYann Gautier 
66dec286ddSYann Gautier 	return 0;
67dec286ddSYann Gautier }
68dec286ddSYann Gautier 
69*a24d5947SNicolas Le Bayon /*
70*a24d5947SNicolas Le Bayon  * @brief  Get device ID from DBGMCU registers.
71*a24d5947SNicolas Le Bayon  * @param  chip_dev_id: pointer to the read value.
72*a24d5947SNicolas Le Bayon  * @retval 0 on success, negative value on failure.
73*a24d5947SNicolas Le Bayon  */
74dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_dev_id(uint32_t *chip_dev_id)
75dec286ddSYann Gautier {
76*a24d5947SNicolas Le Bayon 	assert(chip_dev_id != NULL);
77*a24d5947SNicolas Le Bayon 
78dec286ddSYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
79dec286ddSYann Gautier 		return -EPERM;
80dec286ddSYann Gautier 	}
81dec286ddSYann Gautier 
82dec286ddSYann Gautier 	*chip_dev_id = mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) &
83dec286ddSYann Gautier 		       DBGMCU_IDC_DEV_ID_MASK;
84dec286ddSYann Gautier 
85dec286ddSYann Gautier 	return 0;
86dec286ddSYann Gautier }
87dec286ddSYann Gautier 
88*a24d5947SNicolas Le Bayon /*
89*a24d5947SNicolas Le Bayon  * @brief  Freeze IWDG2 in debug mode.
90*a24d5947SNicolas Le Bayon  * @retval None.
91*a24d5947SNicolas Le Bayon  */
9273680c23SYann Gautier int stm32mp1_dbgmcu_freeze_iwdg2(void)
9373680c23SYann Gautier {
9473680c23SYann Gautier 	uint32_t dbg_conf;
9573680c23SYann Gautier 
9673680c23SYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
9773680c23SYann Gautier 		return -EPERM;
9873680c23SYann Gautier 	}
9973680c23SYann Gautier 
10073680c23SYann Gautier 	dbg_conf = bsec_read_debug_conf();
10173680c23SYann Gautier 
10273680c23SYann Gautier 	if ((dbg_conf & (BSEC_SPIDEN | BSEC_SPINDEN)) != 0U) {
10373680c23SYann Gautier 		mmio_setbits_32(DBGMCU_BASE + DBGMCU_APB4FZ1,
10473680c23SYann Gautier 				DBGMCU_APB4FZ1_IWDG2);
10573680c23SYann Gautier 	}
10673680c23SYann Gautier 
10773680c23SYann Gautier 	return 0;
10873680c23SYann Gautier }
109