173680c23SYann Gautier /* 2*072d7532SNicolas Le Bayon * Copyright (c) 2016-2022, STMicroelectronics - All Rights Reserved 373680c23SYann Gautier * 473680c23SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 573680c23SYann Gautier */ 673680c23SYann Gautier 7a24d5947SNicolas Le Bayon #include <assert.h> 873680c23SYann Gautier #include <errno.h> 973680c23SYann Gautier 1073680c23SYann Gautier #include <common/debug.h> 1173680c23SYann Gautier #include <drivers/st/bsec.h> 12*072d7532SNicolas Le Bayon #include <drivers/st/bsec2_reg.h> 1373680c23SYann Gautier #include <drivers/st/stm32mp1_rcc.h> 1473680c23SYann Gautier #include <lib/mmio.h> 1573680c23SYann Gautier #include <lib/utils_def.h> 1673680c23SYann Gautier 17*072d7532SNicolas Le Bayon #include <platform_def.h> 1873680c23SYann Gautier #include <stm32mp1_dbgmcu.h> 1973680c23SYann Gautier 20dec286ddSYann Gautier #define DBGMCU_IDC U(0x00) 21dec286ddSYann Gautier 22dec286ddSYann Gautier #define DBGMCU_IDC_DEV_ID_MASK GENMASK(11, 0) 23dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_MASK GENMASK(31, 16) 24dec286ddSYann Gautier #define DBGMCU_IDC_REV_ID_SHIFT 16 25dec286ddSYann Gautier 2673680c23SYann Gautier static int stm32mp1_dbgmcu_init(void) 2773680c23SYann Gautier { 2821cfa453SYann Gautier if ((bsec_read_debug_conf() & BSEC_DBGSWGEN) == 0U) { 2921cfa453SYann Gautier INFO("Software access to all debug components is disabled\n"); 3073680c23SYann Gautier return -1; 3173680c23SYann Gautier } 3273680c23SYann Gautier 33a24d5947SNicolas Le Bayon mmio_setbits_32(RCC_BASE + RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN); 3473680c23SYann Gautier 3573680c23SYann Gautier return 0; 3673680c23SYann Gautier } 3773680c23SYann Gautier 38a24d5947SNicolas Le Bayon /* 39a24d5947SNicolas Le Bayon * @brief Get silicon revision from DBGMCU registers. 40a24d5947SNicolas Le Bayon * @param chip_version: pointer to the read value. 41a24d5947SNicolas Le Bayon * @retval 0 on success, negative value on failure. 42a24d5947SNicolas Le Bayon */ 43dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_version(uint32_t *chip_version) 44dec286ddSYann Gautier { 45a24d5947SNicolas Le Bayon assert(chip_version != NULL); 46a24d5947SNicolas Le Bayon 47dec286ddSYann Gautier if (stm32mp1_dbgmcu_init() != 0) { 48dec286ddSYann Gautier return -EPERM; 49dec286ddSYann Gautier } 50dec286ddSYann Gautier 51dec286ddSYann Gautier *chip_version = (mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) & 52dec286ddSYann Gautier DBGMCU_IDC_REV_ID_MASK) >> DBGMCU_IDC_REV_ID_SHIFT; 53dec286ddSYann Gautier 54dec286ddSYann Gautier return 0; 55dec286ddSYann Gautier } 56dec286ddSYann Gautier 57a24d5947SNicolas Le Bayon /* 58a24d5947SNicolas Le Bayon * @brief Get device ID from DBGMCU registers. 59a24d5947SNicolas Le Bayon * @param chip_dev_id: pointer to the read value. 60a24d5947SNicolas Le Bayon * @retval 0 on success, negative value on failure. 61a24d5947SNicolas Le Bayon */ 62dec286ddSYann Gautier int stm32mp1_dbgmcu_get_chip_dev_id(uint32_t *chip_dev_id) 63dec286ddSYann Gautier { 64a24d5947SNicolas Le Bayon assert(chip_dev_id != NULL); 65a24d5947SNicolas Le Bayon 66dec286ddSYann Gautier if (stm32mp1_dbgmcu_init() != 0) { 67dec286ddSYann Gautier return -EPERM; 68dec286ddSYann Gautier } 69dec286ddSYann Gautier 70dec286ddSYann Gautier *chip_dev_id = mmio_read_32(DBGMCU_BASE + DBGMCU_IDC) & 71dec286ddSYann Gautier DBGMCU_IDC_DEV_ID_MASK; 72dec286ddSYann Gautier 73dec286ddSYann Gautier return 0; 74dec286ddSYann Gautier } 75