xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_dbgmcu.c (revision dec286dd7d7b1aae486a05069a80b8791ab0ba55)
173680c23SYann Gautier /*
273680c23SYann Gautier  * Copyright (c) 2016-2019, STMicroelectronics - All Rights Reserved
373680c23SYann Gautier  *
473680c23SYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
573680c23SYann Gautier  */
673680c23SYann Gautier 
773680c23SYann Gautier #include <errno.h>
873680c23SYann Gautier 
973680c23SYann Gautier #include <platform_def.h>
1073680c23SYann Gautier 
1173680c23SYann Gautier #include <common/debug.h>
1273680c23SYann Gautier #include <drivers/st/bsec.h>
1373680c23SYann Gautier #include <drivers/st/stm32mp1_rcc.h>
1473680c23SYann Gautier #include <lib/mmio.h>
1573680c23SYann Gautier #include <lib/utils_def.h>
1673680c23SYann Gautier 
1773680c23SYann Gautier #include <stm32mp1_dbgmcu.h>
1873680c23SYann Gautier 
19*dec286ddSYann Gautier #define DBGMCU_IDC		U(0x00)
2073680c23SYann Gautier #define DBGMCU_APB4FZ1		U(0x2C)
21*dec286ddSYann Gautier 
22*dec286ddSYann Gautier #define DBGMCU_IDC_DEV_ID_MASK	GENMASK(11, 0)
23*dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_MASK	GENMASK(31, 16)
24*dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_SHIFT	16
25*dec286ddSYann Gautier 
2673680c23SYann Gautier #define DBGMCU_APB4FZ1_IWDG2	BIT(2)
2773680c23SYann Gautier 
2873680c23SYann Gautier static uintptr_t get_rcc_base(void)
2973680c23SYann Gautier {
3073680c23SYann Gautier 	/* This is called before stm32mp_rcc_base() is available */
3173680c23SYann Gautier 	return RCC_BASE;
3273680c23SYann Gautier }
3373680c23SYann Gautier 
3473680c23SYann Gautier static int stm32mp1_dbgmcu_init(void)
3573680c23SYann Gautier {
3673680c23SYann Gautier 	uint32_t dbg_conf;
3773680c23SYann Gautier 	uintptr_t rcc_base = get_rcc_base();
3873680c23SYann Gautier 
3973680c23SYann Gautier 	dbg_conf = bsec_read_debug_conf();
4073680c23SYann Gautier 
4173680c23SYann Gautier 	if ((dbg_conf & BSEC_DBGSWGEN) == 0U) {
4273680c23SYann Gautier 		uint32_t result = bsec_write_debug_conf(dbg_conf |
4373680c23SYann Gautier 							BSEC_DBGSWGEN);
4473680c23SYann Gautier 
4573680c23SYann Gautier 		if (result != BSEC_OK) {
4673680c23SYann Gautier 			ERROR("Error enabling DBGSWGEN\n");
4773680c23SYann Gautier 			return -1;
4873680c23SYann Gautier 		}
4973680c23SYann Gautier 	}
5073680c23SYann Gautier 
5173680c23SYann Gautier 	mmio_setbits_32(rcc_base + RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
5273680c23SYann Gautier 
5373680c23SYann Gautier 	return 0;
5473680c23SYann Gautier }
5573680c23SYann Gautier 
56*dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_version(uint32_t *chip_version)
57*dec286ddSYann Gautier {
58*dec286ddSYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
59*dec286ddSYann Gautier 		return -EPERM;
60*dec286ddSYann Gautier 	}
61*dec286ddSYann Gautier 
62*dec286ddSYann Gautier 	*chip_version = (mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) &
63*dec286ddSYann Gautier 			 DBGMCU_IDC_REV_ID_MASK) >> DBGMCU_IDC_REV_ID_SHIFT;
64*dec286ddSYann Gautier 
65*dec286ddSYann Gautier 	return 0;
66*dec286ddSYann Gautier }
67*dec286ddSYann Gautier 
68*dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_dev_id(uint32_t *chip_dev_id)
69*dec286ddSYann Gautier {
70*dec286ddSYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
71*dec286ddSYann Gautier 		return -EPERM;
72*dec286ddSYann Gautier 	}
73*dec286ddSYann Gautier 
74*dec286ddSYann Gautier 	*chip_dev_id = mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) &
75*dec286ddSYann Gautier 		DBGMCU_IDC_DEV_ID_MASK;
76*dec286ddSYann Gautier 
77*dec286ddSYann Gautier 	return 0;
78*dec286ddSYann Gautier }
79*dec286ddSYann Gautier 
8073680c23SYann Gautier int stm32mp1_dbgmcu_freeze_iwdg2(void)
8173680c23SYann Gautier {
8273680c23SYann Gautier 	uint32_t dbg_conf;
8373680c23SYann Gautier 
8473680c23SYann Gautier 	if (stm32mp1_dbgmcu_init() != 0) {
8573680c23SYann Gautier 		return -EPERM;
8673680c23SYann Gautier 	}
8773680c23SYann Gautier 
8873680c23SYann Gautier 	dbg_conf = bsec_read_debug_conf();
8973680c23SYann Gautier 
9073680c23SYann Gautier 	if ((dbg_conf & (BSEC_SPIDEN | BSEC_SPINDEN)) != 0U) {
9173680c23SYann Gautier 		mmio_setbits_32(DBGMCU_BASE + DBGMCU_APB4FZ1,
9273680c23SYann Gautier 				DBGMCU_APB4FZ1_IWDG2);
9373680c23SYann Gautier 	}
9473680c23SYann Gautier 
9573680c23SYann Gautier 	return 0;
9673680c23SYann Gautier }
97