xref: /arm-trusted-firmware/drivers/marvell/secure_dfx_access/misc_dfx.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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