1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2021 Marvell International Ltd. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * https://spdx.org/licenses 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <lib/mmio.h> 10*91f16700Schasinglulu #include "dfx.h" 11*91f16700Schasinglulu #include <mvebu_def.h> 12*91f16700Schasinglulu #include <mvebu.h> 13*91f16700Schasinglulu #include <errno.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu /* #define DEBUG_DFX */ 16*91f16700Schasinglulu #ifdef DEBUG_DFX 17*91f16700Schasinglulu #define debug(format...) NOTICE(format) 18*91f16700Schasinglulu #else 19*91f16700Schasinglulu #define debug(format, arg...) 20*91f16700Schasinglulu #endif 21*91f16700Schasinglulu 22*91f16700Schasinglulu #define SAR_BASE (MVEBU_REGS_BASE + 0x6F8200) 23*91f16700Schasinglulu #define SAR_SIZE 0x4 24*91f16700Schasinglulu #define AP_DEV_ID_STATUS_REG (MVEBU_REGS_BASE + 0x6F8240) 25*91f16700Schasinglulu #define JTAG_DEV_ID_STATUS_REG (MVEBU_REGS_BASE + 0x6F8244) 26*91f16700Schasinglulu #define EFUSE_CTRL (MVEBU_REGS_BASE + 0x6F8008) 27*91f16700Schasinglulu #define EFUSE_LD_BASE (MVEBU_REGS_BASE + 0x6F8F00) 28*91f16700Schasinglulu #define EFUSE_LD_SIZE 0x1C 29*91f16700Schasinglulu #define EFUSE_HD_BASE (MVEBU_REGS_BASE + 0x6F9000) 30*91f16700Schasinglulu #define EFUSE_HD_SIZE 0x3F8 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* AP806 CPU DFS register mapping*/ 33*91f16700Schasinglulu #define AP806_CA72MP2_0_PLL_CR_0_BASE (MVEBU_REGS_BASE + 0x6F8278) 34*91f16700Schasinglulu #define AP806_CA72MP2_0_PLL_CR_1_BASE (MVEBU_REGS_BASE + 0x6F8280) 35*91f16700Schasinglulu #define AP806_CA72MP2_0_PLL_CR_2_BASE (MVEBU_REGS_BASE + 0x6F8284) 36*91f16700Schasinglulu #define AP806_CA72MP2_0_PLL_SR_BASE (MVEBU_REGS_BASE + 0x6F8C94) 37*91f16700Schasinglulu 38*91f16700Schasinglulu /* AP807 CPU DFS register mapping */ 39*91f16700Schasinglulu #define AP807_DEVICE_GENERAL_CR_10_BASE (MVEBU_REGS_BASE + 0x6F8278) 40*91f16700Schasinglulu #define AP807_DEVICE_GENERAL_CR_11_BASE (MVEBU_REGS_BASE + 0x6F827C) 41*91f16700Schasinglulu #define AP807_DEVICE_GENERAL_STATUS_6_BASE (MVEBU_REGS_BASE + 0x6F8C98) 42*91f16700Schasinglulu 43*91f16700Schasinglulu #ifdef MVEBU_SOC_AP807 44*91f16700Schasinglulu #define CLUSTER_OFFSET 0x8 45*91f16700Schasinglulu #define CLK_DIVIDER_REG AP807_DEVICE_GENERAL_CR_10_BASE 46*91f16700Schasinglulu #define CLK_FORCE_REG AP807_DEVICE_GENERAL_CR_11_BASE 47*91f16700Schasinglulu #define CLK_RATIO_REG AP807_DEVICE_GENERAL_CR_11_BASE 48*91f16700Schasinglulu #define CLK_RATIO_STATE_REG AP807_DEVICE_GENERAL_STATUS_6_BASE 49*91f16700Schasinglulu #else 50*91f16700Schasinglulu #define CLUSTER_OFFSET 0x14 51*91f16700Schasinglulu #define CLK_DIVIDER_REG AP806_CA72MP2_0_PLL_CR_0_BASE 52*91f16700Schasinglulu #define CLK_FORCE_REG AP806_CA72MP2_0_PLL_CR_1_BASE 53*91f16700Schasinglulu #define CLK_RATIO_REG AP806_CA72MP2_0_PLL_CR_2_BASE 54*91f16700Schasinglulu #define CLK_RATIO_STATE_REG AP806_CA72MP2_0_PLL_SR_BASE 55*91f16700Schasinglulu #endif /* MVEBU_SOC_AP807 */ 56*91f16700Schasinglulu 57*91f16700Schasinglulu static _Bool is_valid(u_register_t addr) 58*91f16700Schasinglulu { 59*91f16700Schasinglulu switch (addr) { 60*91f16700Schasinglulu case AP_DEV_ID_STATUS_REG: 61*91f16700Schasinglulu case JTAG_DEV_ID_STATUS_REG: 62*91f16700Schasinglulu case SAR_BASE ... (SAR_BASE + SAR_SIZE): 63*91f16700Schasinglulu case EFUSE_LD_BASE ... (EFUSE_LD_BASE + EFUSE_LD_SIZE): 64*91f16700Schasinglulu case EFUSE_HD_BASE ... (EFUSE_HD_BASE + EFUSE_HD_SIZE): 65*91f16700Schasinglulu case EFUSE_CTRL: 66*91f16700Schasinglulu /* cpu-clk related registers */ 67*91f16700Schasinglulu case CLK_DIVIDER_REG: 68*91f16700Schasinglulu case CLK_DIVIDER_REG + CLUSTER_OFFSET: 69*91f16700Schasinglulu case CLK_FORCE_REG: 70*91f16700Schasinglulu case CLK_FORCE_REG + CLUSTER_OFFSET: 71*91f16700Schasinglulu #ifndef MVEBU_SOC_AP807 72*91f16700Schasinglulu case CLK_RATIO_REG: 73*91f16700Schasinglulu case CLK_RATIO_REG + CLUSTER_OFFSET: 74*91f16700Schasinglulu #endif 75*91f16700Schasinglulu case CLK_RATIO_STATE_REG: 76*91f16700Schasinglulu case CLK_RATIO_STATE_REG + CLUSTER_OFFSET: 77*91f16700Schasinglulu return true; 78*91f16700Schasinglulu default: 79*91f16700Schasinglulu return false; 80*91f16700Schasinglulu } 81*91f16700Schasinglulu } 82*91f16700Schasinglulu 83*91f16700Schasinglulu static int armada_dfx_sread(u_register_t *read, u_register_t addr) 84*91f16700Schasinglulu { 85*91f16700Schasinglulu if (!is_valid(addr)) 86*91f16700Schasinglulu return -EINVAL; 87*91f16700Schasinglulu 88*91f16700Schasinglulu *read = mmio_read_32(addr); 89*91f16700Schasinglulu 90*91f16700Schasinglulu return 0; 91*91f16700Schasinglulu } 92*91f16700Schasinglulu 93*91f16700Schasinglulu static int armada_dfx_swrite(u_register_t addr, u_register_t val) 94*91f16700Schasinglulu { 95*91f16700Schasinglulu if (!is_valid(addr)) 96*91f16700Schasinglulu return -EINVAL; 97*91f16700Schasinglulu 98*91f16700Schasinglulu mmio_write_32(addr, val); 99*91f16700Schasinglulu 100*91f16700Schasinglulu return 0; 101*91f16700Schasinglulu } 102*91f16700Schasinglulu 103*91f16700Schasinglulu int mvebu_dfx_misc_handle(u_register_t func, u_register_t *read, 104*91f16700Schasinglulu u_register_t addr, u_register_t val) 105*91f16700Schasinglulu { 106*91f16700Schasinglulu debug_enter(); 107*91f16700Schasinglulu 108*91f16700Schasinglulu debug("func %ld, addr 0x%lx, val 0x%lx\n", func, addr, val); 109*91f16700Schasinglulu 110*91f16700Schasinglulu switch (func) { 111*91f16700Schasinglulu case MV_SIP_DFX_SREAD: 112*91f16700Schasinglulu return armada_dfx_sread(read, addr); 113*91f16700Schasinglulu case MV_SIP_DFX_SWRITE: 114*91f16700Schasinglulu return armada_dfx_swrite(addr, val); 115*91f16700Schasinglulu default: 116*91f16700Schasinglulu ERROR("unsupported dfx misc sub-func\n"); 117*91f16700Schasinglulu return -EINVAL; 118*91f16700Schasinglulu } 119*91f16700Schasinglulu 120*91f16700Schasinglulu debug_exit(); 121*91f16700Schasinglulu 122*91f16700Schasinglulu return 0; 123*91f16700Schasinglulu } 124