xref: /rk3399_ARM-atf/drivers/marvell/secure_dfx_access/misc_dfx.c (revision 81c2a044e2d8cb06c66c44300741d449b969fcf1)
1*81c2a044SGrzegorz Jaszczyk /*
2*81c2a044SGrzegorz Jaszczyk  * Copyright (C) 2021 Marvell International Ltd.
3*81c2a044SGrzegorz Jaszczyk  *
4*81c2a044SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*81c2a044SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*81c2a044SGrzegorz Jaszczyk  */
7*81c2a044SGrzegorz Jaszczyk 
8*81c2a044SGrzegorz Jaszczyk #include <common/debug.h>
9*81c2a044SGrzegorz Jaszczyk #include <lib/mmio.h>
10*81c2a044SGrzegorz Jaszczyk #include "dfx.h"
11*81c2a044SGrzegorz Jaszczyk #include <mvebu_def.h>
12*81c2a044SGrzegorz Jaszczyk #include <mvebu.h>
13*81c2a044SGrzegorz Jaszczyk #include <errno.h>
14*81c2a044SGrzegorz Jaszczyk 
15*81c2a044SGrzegorz Jaszczyk /* #define DEBUG_DFX */
16*81c2a044SGrzegorz Jaszczyk #ifdef DEBUG_DFX
17*81c2a044SGrzegorz Jaszczyk #define debug(format...) NOTICE(format)
18*81c2a044SGrzegorz Jaszczyk #else
19*81c2a044SGrzegorz Jaszczyk #define debug(format, arg...)
20*81c2a044SGrzegorz Jaszczyk #endif
21*81c2a044SGrzegorz Jaszczyk 
22*81c2a044SGrzegorz Jaszczyk #define SAR_BASE			(MVEBU_REGS_BASE + 0x6F8200)
23*81c2a044SGrzegorz Jaszczyk #define SAR_SIZE			0x4
24*81c2a044SGrzegorz Jaszczyk #define AP_DEV_ID_STATUS_REG		(MVEBU_REGS_BASE + 0x6F8240)
25*81c2a044SGrzegorz Jaszczyk #define JTAG_DEV_ID_STATUS_REG		(MVEBU_REGS_BASE + 0x6F8244)
26*81c2a044SGrzegorz Jaszczyk #define EFUSE_CTRL			(MVEBU_REGS_BASE + 0x6F8008)
27*81c2a044SGrzegorz Jaszczyk #define EFUSE_LD_BASE			(MVEBU_REGS_BASE + 0x6F8F00)
28*81c2a044SGrzegorz Jaszczyk #define EFUSE_LD_SIZE			0x1C
29*81c2a044SGrzegorz Jaszczyk #define EFUSE_HD_BASE			(MVEBU_REGS_BASE + 0x6F9000)
30*81c2a044SGrzegorz Jaszczyk #define EFUSE_HD_SIZE			0x3F8
31*81c2a044SGrzegorz Jaszczyk 
32*81c2a044SGrzegorz Jaszczyk static _Bool is_valid(u_register_t addr)
33*81c2a044SGrzegorz Jaszczyk {
34*81c2a044SGrzegorz Jaszczyk 	switch (addr) {
35*81c2a044SGrzegorz Jaszczyk 	case AP_DEV_ID_STATUS_REG:
36*81c2a044SGrzegorz Jaszczyk 	case JTAG_DEV_ID_STATUS_REG:
37*81c2a044SGrzegorz Jaszczyk 	case SAR_BASE ... (SAR_BASE + SAR_SIZE):
38*81c2a044SGrzegorz Jaszczyk 	case EFUSE_LD_BASE ... (EFUSE_LD_BASE + EFUSE_LD_SIZE):
39*81c2a044SGrzegorz Jaszczyk 	case EFUSE_HD_BASE ... (EFUSE_HD_BASE + EFUSE_HD_SIZE):
40*81c2a044SGrzegorz Jaszczyk 	case EFUSE_CTRL:
41*81c2a044SGrzegorz Jaszczyk 		return true;
42*81c2a044SGrzegorz Jaszczyk 	default:
43*81c2a044SGrzegorz Jaszczyk 		return false;
44*81c2a044SGrzegorz Jaszczyk 	}
45*81c2a044SGrzegorz Jaszczyk }
46*81c2a044SGrzegorz Jaszczyk 
47*81c2a044SGrzegorz Jaszczyk static int armada_dfx_sread(u_register_t *read, u_register_t addr)
48*81c2a044SGrzegorz Jaszczyk {
49*81c2a044SGrzegorz Jaszczyk 	if (!is_valid(addr))
50*81c2a044SGrzegorz Jaszczyk 		return -EINVAL;
51*81c2a044SGrzegorz Jaszczyk 
52*81c2a044SGrzegorz Jaszczyk 	*read = mmio_read_32(addr);
53*81c2a044SGrzegorz Jaszczyk 
54*81c2a044SGrzegorz Jaszczyk 	return 0;
55*81c2a044SGrzegorz Jaszczyk }
56*81c2a044SGrzegorz Jaszczyk 
57*81c2a044SGrzegorz Jaszczyk static int armada_dfx_swrite(u_register_t addr, u_register_t val)
58*81c2a044SGrzegorz Jaszczyk {
59*81c2a044SGrzegorz Jaszczyk 	if (!is_valid(addr))
60*81c2a044SGrzegorz Jaszczyk 		return -EINVAL;
61*81c2a044SGrzegorz Jaszczyk 
62*81c2a044SGrzegorz Jaszczyk 	mmio_write_32(addr, val);
63*81c2a044SGrzegorz Jaszczyk 
64*81c2a044SGrzegorz Jaszczyk 	return 0;
65*81c2a044SGrzegorz Jaszczyk }
66*81c2a044SGrzegorz Jaszczyk 
67*81c2a044SGrzegorz Jaszczyk int mvebu_dfx_misc_handle(u_register_t func, u_register_t *read,
68*81c2a044SGrzegorz Jaszczyk 			  u_register_t addr, u_register_t val)
69*81c2a044SGrzegorz Jaszczyk {
70*81c2a044SGrzegorz Jaszczyk 	debug_enter();
71*81c2a044SGrzegorz Jaszczyk 
72*81c2a044SGrzegorz Jaszczyk 	debug("func %ld, addr 0x%lx, val 0x%lx\n", func, addr, val);
73*81c2a044SGrzegorz Jaszczyk 
74*81c2a044SGrzegorz Jaszczyk 	switch (func) {
75*81c2a044SGrzegorz Jaszczyk 	case MV_SIP_DFX_SREAD:
76*81c2a044SGrzegorz Jaszczyk 		return armada_dfx_sread(read, addr);
77*81c2a044SGrzegorz Jaszczyk 	case MV_SIP_DFX_SWRITE:
78*81c2a044SGrzegorz Jaszczyk 		return armada_dfx_swrite(addr, val);
79*81c2a044SGrzegorz Jaszczyk 	default:
80*81c2a044SGrzegorz Jaszczyk 		ERROR("unsupported dfx misc sub-func\n");
81*81c2a044SGrzegorz Jaszczyk 		return -EINVAL;
82*81c2a044SGrzegorz Jaszczyk 	}
83*81c2a044SGrzegorz Jaszczyk 
84*81c2a044SGrzegorz Jaszczyk 	debug_exit();
85*81c2a044SGrzegorz Jaszczyk 
86*81c2a044SGrzegorz Jaszczyk 	return 0;
87*81c2a044SGrzegorz Jaszczyk }
88