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