mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 00:56:49 +07:00
a939fc5a71
This driver manages CoreSight ETM (Embedded Trace Macrocell) that supports processor tracing. Currently supported version are ARM ETMv3.x and PTM1.x. Signed-off-by: Pratik Patel <pratikp@codeaurora.org> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> coresight-etm3x: adding missing error checking Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
592 lines
12 KiB
C
592 lines
12 KiB
C
/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/bug.h>
|
|
#include <asm/hardware/cp14.h>
|
|
|
|
#include "coresight-etm.h"
|
|
|
|
int etm_readl_cp14(u32 reg, unsigned int *val)
|
|
{
|
|
switch (reg) {
|
|
case ETMCR:
|
|
*val = etm_read(ETMCR);
|
|
return 0;
|
|
case ETMCCR:
|
|
*val = etm_read(ETMCCR);
|
|
return 0;
|
|
case ETMTRIGGER:
|
|
*val = etm_read(ETMTRIGGER);
|
|
return 0;
|
|
case ETMSR:
|
|
*val = etm_read(ETMSR);
|
|
return 0;
|
|
case ETMSCR:
|
|
*val = etm_read(ETMSCR);
|
|
return 0;
|
|
case ETMTSSCR:
|
|
*val = etm_read(ETMTSSCR);
|
|
return 0;
|
|
case ETMTEEVR:
|
|
*val = etm_read(ETMTEEVR);
|
|
return 0;
|
|
case ETMTECR1:
|
|
*val = etm_read(ETMTECR1);
|
|
return 0;
|
|
case ETMFFLR:
|
|
*val = etm_read(ETMFFLR);
|
|
return 0;
|
|
case ETMACVRn(0):
|
|
*val = etm_read(ETMACVR0);
|
|
return 0;
|
|
case ETMACVRn(1):
|
|
*val = etm_read(ETMACVR1);
|
|
return 0;
|
|
case ETMACVRn(2):
|
|
*val = etm_read(ETMACVR2);
|
|
return 0;
|
|
case ETMACVRn(3):
|
|
*val = etm_read(ETMACVR3);
|
|
return 0;
|
|
case ETMACVRn(4):
|
|
*val = etm_read(ETMACVR4);
|
|
return 0;
|
|
case ETMACVRn(5):
|
|
*val = etm_read(ETMACVR5);
|
|
return 0;
|
|
case ETMACVRn(6):
|
|
*val = etm_read(ETMACVR6);
|
|
return 0;
|
|
case ETMACVRn(7):
|
|
*val = etm_read(ETMACVR7);
|
|
return 0;
|
|
case ETMACVRn(8):
|
|
*val = etm_read(ETMACVR8);
|
|
return 0;
|
|
case ETMACVRn(9):
|
|
*val = etm_read(ETMACVR9);
|
|
return 0;
|
|
case ETMACVRn(10):
|
|
*val = etm_read(ETMACVR10);
|
|
return 0;
|
|
case ETMACVRn(11):
|
|
*val = etm_read(ETMACVR11);
|
|
return 0;
|
|
case ETMACVRn(12):
|
|
*val = etm_read(ETMACVR12);
|
|
return 0;
|
|
case ETMACVRn(13):
|
|
*val = etm_read(ETMACVR13);
|
|
return 0;
|
|
case ETMACVRn(14):
|
|
*val = etm_read(ETMACVR14);
|
|
return 0;
|
|
case ETMACVRn(15):
|
|
*val = etm_read(ETMACVR15);
|
|
return 0;
|
|
case ETMACTRn(0):
|
|
*val = etm_read(ETMACTR0);
|
|
return 0;
|
|
case ETMACTRn(1):
|
|
*val = etm_read(ETMACTR1);
|
|
return 0;
|
|
case ETMACTRn(2):
|
|
*val = etm_read(ETMACTR2);
|
|
return 0;
|
|
case ETMACTRn(3):
|
|
*val = etm_read(ETMACTR3);
|
|
return 0;
|
|
case ETMACTRn(4):
|
|
*val = etm_read(ETMACTR4);
|
|
return 0;
|
|
case ETMACTRn(5):
|
|
*val = etm_read(ETMACTR5);
|
|
return 0;
|
|
case ETMACTRn(6):
|
|
*val = etm_read(ETMACTR6);
|
|
return 0;
|
|
case ETMACTRn(7):
|
|
*val = etm_read(ETMACTR7);
|
|
return 0;
|
|
case ETMACTRn(8):
|
|
*val = etm_read(ETMACTR8);
|
|
return 0;
|
|
case ETMACTRn(9):
|
|
*val = etm_read(ETMACTR9);
|
|
return 0;
|
|
case ETMACTRn(10):
|
|
*val = etm_read(ETMACTR10);
|
|
return 0;
|
|
case ETMACTRn(11):
|
|
*val = etm_read(ETMACTR11);
|
|
return 0;
|
|
case ETMACTRn(12):
|
|
*val = etm_read(ETMACTR12);
|
|
return 0;
|
|
case ETMACTRn(13):
|
|
*val = etm_read(ETMACTR13);
|
|
return 0;
|
|
case ETMACTRn(14):
|
|
*val = etm_read(ETMACTR14);
|
|
return 0;
|
|
case ETMACTRn(15):
|
|
*val = etm_read(ETMACTR15);
|
|
return 0;
|
|
case ETMCNTRLDVRn(0):
|
|
*val = etm_read(ETMCNTRLDVR0);
|
|
return 0;
|
|
case ETMCNTRLDVRn(1):
|
|
*val = etm_read(ETMCNTRLDVR1);
|
|
return 0;
|
|
case ETMCNTRLDVRn(2):
|
|
*val = etm_read(ETMCNTRLDVR2);
|
|
return 0;
|
|
case ETMCNTRLDVRn(3):
|
|
*val = etm_read(ETMCNTRLDVR3);
|
|
return 0;
|
|
case ETMCNTENRn(0):
|
|
*val = etm_read(ETMCNTENR0);
|
|
return 0;
|
|
case ETMCNTENRn(1):
|
|
*val = etm_read(ETMCNTENR1);
|
|
return 0;
|
|
case ETMCNTENRn(2):
|
|
*val = etm_read(ETMCNTENR2);
|
|
return 0;
|
|
case ETMCNTENRn(3):
|
|
*val = etm_read(ETMCNTENR3);
|
|
return 0;
|
|
case ETMCNTRLDEVRn(0):
|
|
*val = etm_read(ETMCNTRLDEVR0);
|
|
return 0;
|
|
case ETMCNTRLDEVRn(1):
|
|
*val = etm_read(ETMCNTRLDEVR1);
|
|
return 0;
|
|
case ETMCNTRLDEVRn(2):
|
|
*val = etm_read(ETMCNTRLDEVR2);
|
|
return 0;
|
|
case ETMCNTRLDEVRn(3):
|
|
*val = etm_read(ETMCNTRLDEVR3);
|
|
return 0;
|
|
case ETMCNTVRn(0):
|
|
*val = etm_read(ETMCNTVR0);
|
|
return 0;
|
|
case ETMCNTVRn(1):
|
|
*val = etm_read(ETMCNTVR1);
|
|
return 0;
|
|
case ETMCNTVRn(2):
|
|
*val = etm_read(ETMCNTVR2);
|
|
return 0;
|
|
case ETMCNTVRn(3):
|
|
*val = etm_read(ETMCNTVR3);
|
|
return 0;
|
|
case ETMSQ12EVR:
|
|
*val = etm_read(ETMSQ12EVR);
|
|
return 0;
|
|
case ETMSQ21EVR:
|
|
*val = etm_read(ETMSQ21EVR);
|
|
return 0;
|
|
case ETMSQ23EVR:
|
|
*val = etm_read(ETMSQ23EVR);
|
|
return 0;
|
|
case ETMSQ31EVR:
|
|
*val = etm_read(ETMSQ31EVR);
|
|
return 0;
|
|
case ETMSQ32EVR:
|
|
*val = etm_read(ETMSQ32EVR);
|
|
return 0;
|
|
case ETMSQ13EVR:
|
|
*val = etm_read(ETMSQ13EVR);
|
|
return 0;
|
|
case ETMSQR:
|
|
*val = etm_read(ETMSQR);
|
|
return 0;
|
|
case ETMEXTOUTEVRn(0):
|
|
*val = etm_read(ETMEXTOUTEVR0);
|
|
return 0;
|
|
case ETMEXTOUTEVRn(1):
|
|
*val = etm_read(ETMEXTOUTEVR1);
|
|
return 0;
|
|
case ETMEXTOUTEVRn(2):
|
|
*val = etm_read(ETMEXTOUTEVR2);
|
|
return 0;
|
|
case ETMEXTOUTEVRn(3):
|
|
*val = etm_read(ETMEXTOUTEVR3);
|
|
return 0;
|
|
case ETMCIDCVRn(0):
|
|
*val = etm_read(ETMCIDCVR0);
|
|
return 0;
|
|
case ETMCIDCVRn(1):
|
|
*val = etm_read(ETMCIDCVR1);
|
|
return 0;
|
|
case ETMCIDCVRn(2):
|
|
*val = etm_read(ETMCIDCVR2);
|
|
return 0;
|
|
case ETMCIDCMR:
|
|
*val = etm_read(ETMCIDCMR);
|
|
return 0;
|
|
case ETMIMPSPEC0:
|
|
*val = etm_read(ETMIMPSPEC0);
|
|
return 0;
|
|
case ETMIMPSPEC1:
|
|
*val = etm_read(ETMIMPSPEC1);
|
|
return 0;
|
|
case ETMIMPSPEC2:
|
|
*val = etm_read(ETMIMPSPEC2);
|
|
return 0;
|
|
case ETMIMPSPEC3:
|
|
*val = etm_read(ETMIMPSPEC3);
|
|
return 0;
|
|
case ETMIMPSPEC4:
|
|
*val = etm_read(ETMIMPSPEC4);
|
|
return 0;
|
|
case ETMIMPSPEC5:
|
|
*val = etm_read(ETMIMPSPEC5);
|
|
return 0;
|
|
case ETMIMPSPEC6:
|
|
*val = etm_read(ETMIMPSPEC6);
|
|
return 0;
|
|
case ETMIMPSPEC7:
|
|
*val = etm_read(ETMIMPSPEC7);
|
|
return 0;
|
|
case ETMSYNCFR:
|
|
*val = etm_read(ETMSYNCFR);
|
|
return 0;
|
|
case ETMIDR:
|
|
*val = etm_read(ETMIDR);
|
|
return 0;
|
|
case ETMCCER:
|
|
*val = etm_read(ETMCCER);
|
|
return 0;
|
|
case ETMEXTINSELR:
|
|
*val = etm_read(ETMEXTINSELR);
|
|
return 0;
|
|
case ETMTESSEICR:
|
|
*val = etm_read(ETMTESSEICR);
|
|
return 0;
|
|
case ETMEIBCR:
|
|
*val = etm_read(ETMEIBCR);
|
|
return 0;
|
|
case ETMTSEVR:
|
|
*val = etm_read(ETMTSEVR);
|
|
return 0;
|
|
case ETMAUXCR:
|
|
*val = etm_read(ETMAUXCR);
|
|
return 0;
|
|
case ETMTRACEIDR:
|
|
*val = etm_read(ETMTRACEIDR);
|
|
return 0;
|
|
case ETMVMIDCVR:
|
|
*val = etm_read(ETMVMIDCVR);
|
|
return 0;
|
|
case ETMOSLSR:
|
|
*val = etm_read(ETMOSLSR);
|
|
return 0;
|
|
case ETMOSSRR:
|
|
*val = etm_read(ETMOSSRR);
|
|
return 0;
|
|
case ETMPDCR:
|
|
*val = etm_read(ETMPDCR);
|
|
return 0;
|
|
case ETMPDSR:
|
|
*val = etm_read(ETMPDSR);
|
|
return 0;
|
|
default:
|
|
*val = 0;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
int etm_writel_cp14(u32 reg, u32 val)
|
|
{
|
|
switch (reg) {
|
|
case ETMCR:
|
|
etm_write(val, ETMCR);
|
|
break;
|
|
case ETMTRIGGER:
|
|
etm_write(val, ETMTRIGGER);
|
|
break;
|
|
case ETMSR:
|
|
etm_write(val, ETMSR);
|
|
break;
|
|
case ETMTSSCR:
|
|
etm_write(val, ETMTSSCR);
|
|
break;
|
|
case ETMTEEVR:
|
|
etm_write(val, ETMTEEVR);
|
|
break;
|
|
case ETMTECR1:
|
|
etm_write(val, ETMTECR1);
|
|
break;
|
|
case ETMFFLR:
|
|
etm_write(val, ETMFFLR);
|
|
break;
|
|
case ETMACVRn(0):
|
|
etm_write(val, ETMACVR0);
|
|
break;
|
|
case ETMACVRn(1):
|
|
etm_write(val, ETMACVR1);
|
|
break;
|
|
case ETMACVRn(2):
|
|
etm_write(val, ETMACVR2);
|
|
break;
|
|
case ETMACVRn(3):
|
|
etm_write(val, ETMACVR3);
|
|
break;
|
|
case ETMACVRn(4):
|
|
etm_write(val, ETMACVR4);
|
|
break;
|
|
case ETMACVRn(5):
|
|
etm_write(val, ETMACVR5);
|
|
break;
|
|
case ETMACVRn(6):
|
|
etm_write(val, ETMACVR6);
|
|
break;
|
|
case ETMACVRn(7):
|
|
etm_write(val, ETMACVR7);
|
|
break;
|
|
case ETMACVRn(8):
|
|
etm_write(val, ETMACVR8);
|
|
break;
|
|
case ETMACVRn(9):
|
|
etm_write(val, ETMACVR9);
|
|
break;
|
|
case ETMACVRn(10):
|
|
etm_write(val, ETMACVR10);
|
|
break;
|
|
case ETMACVRn(11):
|
|
etm_write(val, ETMACVR11);
|
|
break;
|
|
case ETMACVRn(12):
|
|
etm_write(val, ETMACVR12);
|
|
break;
|
|
case ETMACVRn(13):
|
|
etm_write(val, ETMACVR13);
|
|
break;
|
|
case ETMACVRn(14):
|
|
etm_write(val, ETMACVR14);
|
|
break;
|
|
case ETMACVRn(15):
|
|
etm_write(val, ETMACVR15);
|
|
break;
|
|
case ETMACTRn(0):
|
|
etm_write(val, ETMACTR0);
|
|
break;
|
|
case ETMACTRn(1):
|
|
etm_write(val, ETMACTR1);
|
|
break;
|
|
case ETMACTRn(2):
|
|
etm_write(val, ETMACTR2);
|
|
break;
|
|
case ETMACTRn(3):
|
|
etm_write(val, ETMACTR3);
|
|
break;
|
|
case ETMACTRn(4):
|
|
etm_write(val, ETMACTR4);
|
|
break;
|
|
case ETMACTRn(5):
|
|
etm_write(val, ETMACTR5);
|
|
break;
|
|
case ETMACTRn(6):
|
|
etm_write(val, ETMACTR6);
|
|
break;
|
|
case ETMACTRn(7):
|
|
etm_write(val, ETMACTR7);
|
|
break;
|
|
case ETMACTRn(8):
|
|
etm_write(val, ETMACTR8);
|
|
break;
|
|
case ETMACTRn(9):
|
|
etm_write(val, ETMACTR9);
|
|
break;
|
|
case ETMACTRn(10):
|
|
etm_write(val, ETMACTR10);
|
|
break;
|
|
case ETMACTRn(11):
|
|
etm_write(val, ETMACTR11);
|
|
break;
|
|
case ETMACTRn(12):
|
|
etm_write(val, ETMACTR12);
|
|
break;
|
|
case ETMACTRn(13):
|
|
etm_write(val, ETMACTR13);
|
|
break;
|
|
case ETMACTRn(14):
|
|
etm_write(val, ETMACTR14);
|
|
break;
|
|
case ETMACTRn(15):
|
|
etm_write(val, ETMACTR15);
|
|
break;
|
|
case ETMCNTRLDVRn(0):
|
|
etm_write(val, ETMCNTRLDVR0);
|
|
break;
|
|
case ETMCNTRLDVRn(1):
|
|
etm_write(val, ETMCNTRLDVR1);
|
|
break;
|
|
case ETMCNTRLDVRn(2):
|
|
etm_write(val, ETMCNTRLDVR2);
|
|
break;
|
|
case ETMCNTRLDVRn(3):
|
|
etm_write(val, ETMCNTRLDVR3);
|
|
break;
|
|
case ETMCNTENRn(0):
|
|
etm_write(val, ETMCNTENR0);
|
|
break;
|
|
case ETMCNTENRn(1):
|
|
etm_write(val, ETMCNTENR1);
|
|
break;
|
|
case ETMCNTENRn(2):
|
|
etm_write(val, ETMCNTENR2);
|
|
break;
|
|
case ETMCNTENRn(3):
|
|
etm_write(val, ETMCNTENR3);
|
|
break;
|
|
case ETMCNTRLDEVRn(0):
|
|
etm_write(val, ETMCNTRLDEVR0);
|
|
break;
|
|
case ETMCNTRLDEVRn(1):
|
|
etm_write(val, ETMCNTRLDEVR1);
|
|
break;
|
|
case ETMCNTRLDEVRn(2):
|
|
etm_write(val, ETMCNTRLDEVR2);
|
|
break;
|
|
case ETMCNTRLDEVRn(3):
|
|
etm_write(val, ETMCNTRLDEVR3);
|
|
break;
|
|
case ETMCNTVRn(0):
|
|
etm_write(val, ETMCNTVR0);
|
|
break;
|
|
case ETMCNTVRn(1):
|
|
etm_write(val, ETMCNTVR1);
|
|
break;
|
|
case ETMCNTVRn(2):
|
|
etm_write(val, ETMCNTVR2);
|
|
break;
|
|
case ETMCNTVRn(3):
|
|
etm_write(val, ETMCNTVR3);
|
|
break;
|
|
case ETMSQ12EVR:
|
|
etm_write(val, ETMSQ12EVR);
|
|
break;
|
|
case ETMSQ21EVR:
|
|
etm_write(val, ETMSQ21EVR);
|
|
break;
|
|
case ETMSQ23EVR:
|
|
etm_write(val, ETMSQ23EVR);
|
|
break;
|
|
case ETMSQ31EVR:
|
|
etm_write(val, ETMSQ31EVR);
|
|
break;
|
|
case ETMSQ32EVR:
|
|
etm_write(val, ETMSQ32EVR);
|
|
break;
|
|
case ETMSQ13EVR:
|
|
etm_write(val, ETMSQ13EVR);
|
|
break;
|
|
case ETMSQR:
|
|
etm_write(val, ETMSQR);
|
|
break;
|
|
case ETMEXTOUTEVRn(0):
|
|
etm_write(val, ETMEXTOUTEVR0);
|
|
break;
|
|
case ETMEXTOUTEVRn(1):
|
|
etm_write(val, ETMEXTOUTEVR1);
|
|
break;
|
|
case ETMEXTOUTEVRn(2):
|
|
etm_write(val, ETMEXTOUTEVR2);
|
|
break;
|
|
case ETMEXTOUTEVRn(3):
|
|
etm_write(val, ETMEXTOUTEVR3);
|
|
break;
|
|
case ETMCIDCVRn(0):
|
|
etm_write(val, ETMCIDCVR0);
|
|
break;
|
|
case ETMCIDCVRn(1):
|
|
etm_write(val, ETMCIDCVR1);
|
|
break;
|
|
case ETMCIDCVRn(2):
|
|
etm_write(val, ETMCIDCVR2);
|
|
break;
|
|
case ETMCIDCMR:
|
|
etm_write(val, ETMCIDCMR);
|
|
break;
|
|
case ETMIMPSPEC0:
|
|
etm_write(val, ETMIMPSPEC0);
|
|
break;
|
|
case ETMIMPSPEC1:
|
|
etm_write(val, ETMIMPSPEC1);
|
|
break;
|
|
case ETMIMPSPEC2:
|
|
etm_write(val, ETMIMPSPEC2);
|
|
break;
|
|
case ETMIMPSPEC3:
|
|
etm_write(val, ETMIMPSPEC3);
|
|
break;
|
|
case ETMIMPSPEC4:
|
|
etm_write(val, ETMIMPSPEC4);
|
|
break;
|
|
case ETMIMPSPEC5:
|
|
etm_write(val, ETMIMPSPEC5);
|
|
break;
|
|
case ETMIMPSPEC6:
|
|
etm_write(val, ETMIMPSPEC6);
|
|
break;
|
|
case ETMIMPSPEC7:
|
|
etm_write(val, ETMIMPSPEC7);
|
|
break;
|
|
case ETMSYNCFR:
|
|
etm_write(val, ETMSYNCFR);
|
|
break;
|
|
case ETMEXTINSELR:
|
|
etm_write(val, ETMEXTINSELR);
|
|
break;
|
|
case ETMTESSEICR:
|
|
etm_write(val, ETMTESSEICR);
|
|
break;
|
|
case ETMEIBCR:
|
|
etm_write(val, ETMEIBCR);
|
|
break;
|
|
case ETMTSEVR:
|
|
etm_write(val, ETMTSEVR);
|
|
break;
|
|
case ETMAUXCR:
|
|
etm_write(val, ETMAUXCR);
|
|
break;
|
|
case ETMTRACEIDR:
|
|
etm_write(val, ETMTRACEIDR);
|
|
break;
|
|
case ETMVMIDCVR:
|
|
etm_write(val, ETMVMIDCVR);
|
|
break;
|
|
case ETMOSLAR:
|
|
etm_write(val, ETMOSLAR);
|
|
break;
|
|
case ETMOSSRR:
|
|
etm_write(val, ETMOSSRR);
|
|
break;
|
|
case ETMPDCR:
|
|
etm_write(val, ETMPDCR);
|
|
break;
|
|
case ETMPDSR:
|
|
etm_write(val, ETMPDSR);
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
|
|
return 0;
|
|
}
|