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