aboutsummaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
Diffstat (limited to 'samples')
-rw-r--r--samples/bpf/hbm.c1
-rw-r--r--samples/bpf/tcp_basertt_kern.c2
-rw-r--r--samples/v4l/v4l2-pci-skeleton.c2
-rw-r--r--samples/vfio-mdev/mdpy-fb.c8
-rw-r--r--samples/xilinx_apm/Makefile71
-rw-r--r--samples/xilinx_apm/main.c134
-rw-r--r--samples/xilinx_apm/xaxipmon.c1269
-rw-r--r--samples/xilinx_apm/xaxipmon.h943
8 files changed, 2427 insertions, 3 deletions
diff --git a/samples/bpf/hbm.c b/samples/bpf/hbm.c
index e0fbab9bec83..6d6d4e4ea843 100644
--- a/samples/bpf/hbm.c
+++ b/samples/bpf/hbm.c
@@ -307,6 +307,7 @@ static int run_bpf_prog(char *prog, int cg_id)
fout = fopen(fname, "w");
fprintf(fout, "id:%d\n", cg_id);
fprintf(fout, "ERROR: Could not lookup queue_stats\n");
+ fclose(fout);
} else if (stats_flag && qstats.lastPacketTime >
qstats.firstPacketTime) {
long long delta_us = (qstats.lastPacketTime -
diff --git a/samples/bpf/tcp_basertt_kern.c b/samples/bpf/tcp_basertt_kern.c
index 9dba48c2b920..66dd58f78d52 100644
--- a/samples/bpf/tcp_basertt_kern.c
+++ b/samples/bpf/tcp_basertt_kern.c
@@ -47,7 +47,7 @@ int bpf_basertt(struct bpf_sock_ops *skops)
case BPF_SOCK_OPS_BASE_RTT:
n = bpf_getsockopt(skops, SOL_TCP, TCP_CONGESTION,
cong, sizeof(cong));
- if (!n && !__builtin_memcmp(cong, nv, sizeof(nv)+1)) {
+ if (!n && !__builtin_memcmp(cong, nv, sizeof(nv))) {
/* Set base_rtt to 80us */
rv = 80;
} else if (n) {
diff --git a/samples/v4l/v4l2-pci-skeleton.c b/samples/v4l/v4l2-pci-skeleton.c
index f6a551bd57ef..3fa6582b4a68 100644
--- a/samples/v4l/v4l2-pci-skeleton.c
+++ b/samples/v4l/v4l2-pci-skeleton.c
@@ -879,7 +879,7 @@ static int skeleton_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
vdev->tvnorms = SKEL_TVNORMS;
video_set_drvdata(vdev, skel);
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
if (ret)
goto free_hdl;
diff --git a/samples/vfio-mdev/mdpy-fb.c b/samples/vfio-mdev/mdpy-fb.c
index a760e130bd0d..8ad1aa13ddd9 100644
--- a/samples/vfio-mdev/mdpy-fb.c
+++ b/samples/vfio-mdev/mdpy-fb.c
@@ -109,7 +109,7 @@ static int mdpy_fb_probe(struct pci_dev *pdev,
ret = pci_request_regions(pdev, "mdpy-fb");
if (ret < 0)
- return ret;
+ goto err_disable_dev;
pci_read_config_dword(pdev, MDPY_FORMAT_OFFSET, &format);
pci_read_config_dword(pdev, MDPY_WIDTH_OFFSET, &width);
@@ -191,6 +191,9 @@ err_release_fb:
err_release_regions:
pci_release_regions(pdev);
+err_disable_dev:
+ pci_disable_device(pdev);
+
return ret;
}
@@ -199,7 +202,10 @@ static void mdpy_fb_remove(struct pci_dev *pdev)
struct fb_info *info = pci_get_drvdata(pdev);
unregister_framebuffer(info);
+ iounmap(info->screen_base);
framebuffer_release(info);
+ pci_release_regions(pdev);
+ pci_disable_device(pdev);
}
static struct pci_device_id mdpy_fb_pci_table[] = {
diff --git a/samples/xilinx_apm/Makefile b/samples/xilinx_apm/Makefile
new file mode 100644
index 000000000000..6182750c4479
--- /dev/null
+++ b/samples/xilinx_apm/Makefile
@@ -0,0 +1,71 @@
+#
+# 'make depend' uses makedepend to automatically generate dependencies
+# (dependencies are added to end of Makefile)
+# 'make' build executable file 'mycc'
+# 'make clean' removes all .o and executable files
+#
+
+# define the C compiler to use
+CC = $(CROSS_COMPILE)gcc
+
+# define any compile-time flags
+CFLAGS = -Wall -g
+
+# define any directories containing header files other than /usr/include
+#
+INCLUDES =
+
+# define library paths in addition to /usr/lib
+# if I wanted to include libraries not in /usr/lib I'd specify
+# their path using -Lpath, something like:
+LFLAGS =
+
+# define any libraries to link into executable:
+# if I want to link in libraries (libx.so or libx.a) I use the -llibname
+# option, something like (this will link in libmylib.so and libm.so:
+LIBS = -lm
+
+# define the C source files
+SRCS = main.c xaxipmon.c
+
+# define the C object files
+#
+# This uses Suffix Replacement within a macro:
+# $(name:string1=string2)
+# For each word in 'name' replace 'string1' with 'string2'
+# Below we are replacing the suffix .c of all words in the macro SRCS
+# with the .o suffix
+#
+OBJS = $(SRCS:.c=.o)
+
+# define the executable file
+MAIN = main
+
+#
+# The following part of the makefile is generic; it can be used to
+# build any executable just by changing the definitions above and by
+# deleting dependencies appended to the file from 'make depend'
+#
+
+.PHONY: depend clean
+
+all: $(MAIN)
+ @echo Xilinx AXI Performance Monitor application compiled
+
+$(MAIN): $(OBJS)
+ $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)
+
+# this is a suffix replacement rule for building .o's from .c's
+# it uses automatic variables $<: the name of the prerequisite of
+# the rule(a .c file) and $@: the name of the target of the rule (a .o file)
+# (see the gnu make manual section about automatic variables)
+.c.o:
+ $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+clean:
+ $(RM) *.o *~ $(MAIN)
+
+depend: $(SRCS)
+ makedepend $(INCLUDES) $^
+
+# DO NOT DELETE THIS LINE -- make depend needs it
diff --git a/samples/xilinx_apm/main.c b/samples/xilinx_apm/main.c
new file mode 100644
index 000000000000..2a7eda4ab256
--- /dev/null
+++ b/samples/xilinx_apm/main.c
@@ -0,0 +1,134 @@
+/*
+ * Xilinx AXI Performance Monitor Example
+ *
+ * Copyright (c) 2013 Xilinx Inc.
+ *
+ * The code may be used by anyone for any purpose and can serve as a
+ * starting point for developing applications using Xilinx AXI
+ * Performance Monitor.
+ *
+ * This example based on Xilinx AXI Performance Monitor UIO driver shows
+ * sequence to read metrics from Xilinx AXI Performance Monitor IP.
+ * User need to provide the uio device file with option -d:
+ * main -d /dev/uio0, say /dev/uio0 as device file for AXI Performance
+ * Monitor driver. User need not clear Interrupt Status Register after
+ * waiting for interrupt on read since driver clears it.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <sys/msg.h>
+#include <sys/ipc.h>
+#include <stdint.h>
+#include "xaxipmon.h"
+
+#define MAP_SIZE 4096
+
+void usage(void)
+{
+ printf("*argv[0] -d <UIO_DEV_FILE> -i|-o <VALUE>\n");
+ printf(" -d UIO device file. e.g. /dev/uio0\n");
+ return;
+}
+
+static void start(int fd)
+{
+ u8 slot = 2;
+ int tmp;
+ u32 isr;
+
+ setmetrics(slot, XAPM_METRIC_SET_4, XAPM_METRIC_COUNTER_0);
+ setsampleinterval(0x3FFFFFF);
+
+ loadsic();
+
+ intrenable(XAPM_IXR_SIC_OVERFLOW_MASK);
+
+ intrglobalenable();
+
+ enablemetricscounter();
+
+ enablesic();
+
+ isr = intrgetstatus();
+ /* Wait for SIC overflow interrupt */
+ if (read(fd, &tmp, 4) < 0)
+ perror("Read\n");
+ /* Driver clears the interrupt and occured interrupt status is
+ stored in param->isr */
+ isr = intrgetstatus();
+ if (isr & XAPM_IXR_SIC_OVERFLOW_MASK)
+ disablesic();
+
+ disablemetricscounter();
+
+ intrdisable(XAPM_IXR_SIC_OVERFLOW_MASK);
+
+ intrglobaldisable();
+
+ printf("Required metrics: %u\n",
+ getsampledmetriccounter(XAPM_METRIC_COUNTER_0) *
+ params->scalefactor);
+}
+
+int main(int argc, char *argv[])
+{
+ int c;
+ char *uiod;
+ int fd;
+
+ while ((c = getopt(argc, argv, "d:h")) != -1) {
+ switch (c) {
+ case 'd':
+ uiod = optarg;
+ break;
+ case 'h':
+ usage();
+ return 0;
+ default:
+ printf("invalid option: %c\n", (char)c);
+ usage();
+ return -1;
+ }
+ }
+
+ /* Open the UIO device file */
+ fd = open(uiod, O_RDWR);
+ if (fd < 1) {
+ perror(argv[0]);
+ printf("Invalid UIO device file:%s.\n", uiod);
+ usage();
+ return -1;
+ }
+
+ baseaddr = (ulong)mmap(0, MAP_SIZE , PROT_READ|PROT_WRITE,
+ MAP_SHARED , fd, 0);
+ if ((u32 *)baseaddr == MAP_FAILED)
+ perror("mmap failed\n");
+
+ /* mmap the UIO device */
+ params = (struct xapm_param *)mmap(0, MAP_SIZE , PROT_READ|PROT_WRITE,
+ MAP_SHARED , fd, getpagesize());
+ if (params == MAP_FAILED)
+ perror("mmap failed\n");
+
+ if (params->mode == 1)
+ printf("AXI PMON is in Advanced Mode\n");
+ else if (params->mode == 2)
+ printf("AXI PMON is in Profile Mode\n");
+ else
+ printf("AXI PMON is in trace Mode\n");
+
+ start(fd);
+
+ close(fd);
+ munmap((u32 *)baseaddr, MAP_SIZE);
+ munmap(params, MAP_SIZE);
+
+ return 0;
+}
diff --git a/samples/xilinx_apm/xaxipmon.c b/samples/xilinx_apm/xaxipmon.c
new file mode 100644
index 000000000000..94a4e7511057
--- /dev/null
+++ b/samples/xilinx_apm/xaxipmon.c
@@ -0,0 +1,1269 @@
+#include "xaxipmon.h"
+/*****************************************************************************/
+/**
+*
+* This function resets all Metric Counters and Sampled Metric Counters of
+* AXI Performance Monitor.
+*
+* @return XST_SUCCESS
+*
+*
+* @note None.
+*
+******************************************************************************/
+int resetmetriccounter(void)
+{
+ u32 regval;
+
+ /*
+ * Write the reset value to the Control register to reset
+ * Metric counters
+ */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval | XAPM_CR_MCNTR_RESET_MASK));
+ /*
+ * Release from Reset
+ */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval & ~(XAPM_CR_MCNTR_RESET_MASK)));
+ return XST_SUCCESS;
+
+}
+
+/*****************************************************************************/
+/**
+*
+* This function resets Global Clock Counter of AXI Performance Monitor
+*
+* @return None.
+*
+* @note None.
+*
+******************************************************************************/
+void resetglobalclkcounter(void)
+{
+
+ u32 regval;
+
+ /*
+ * Write the reset value to the Control register to reset
+ * Global Clock Counter
+ */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval | XAPM_CR_GCC_RESET_MASK));
+
+ /*
+ * Release from Reset
+ */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval & ~(XAPM_CR_GCC_RESET_MASK)));
+
+}
+
+/*****************************************************************************/
+/**
+*
+* This function resets Streaming FIFO of AXI Performance Monitor
+*
+* @return XST_SUCCESS
+*
+* @note None.
+*
+******************************************************************************/
+int resetfifo(void)
+{
+ u32 regval;
+
+ /* Check Event Logging is enabled in Hardware */
+ if (params->eventlog == 0)
+ /*Event Logging not enabled in Hardware*/
+ return XST_SUCCESS;
+
+ /*
+ * Write the reset value to the Control register to reset
+ * FIFO
+ */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval | XAPM_CR_FIFO_RESET_MASK));
+ /*
+ * Release from Reset
+ */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ (regval & ~(XAPM_CR_FIFO_RESET_MASK)));
+
+ return XST_SUCCESS;
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Ranges for Incrementers depending on parameters passed.
+*
+* @param incrementer specifies the Incrementer for which Ranges
+* need to be set
+* @param rangehigh specifies the Upper limit in 32 bit Register
+* @param rangelow specifies the Lower limit in 32 bit Register
+*
+* @return None.
+*
+* @note None
+*
+*****************************************************************************/
+void setincrementerrange(u8 incrementer, u16 rangehigh, u16 rangelow)
+{
+ u32 regval;
+
+ /*
+ * Write to the specified Range register
+ */
+ regval = rangehigh << 16;
+ regval |= rangelow;
+ writereg(baseaddr,
+ (XAPM_RANGE0_OFFSET + (incrementer * 16)), regval);
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the Ranges of Incrementers Registers.
+*
+* @param incrementer specifies the Incrementer for which Ranges
+* need to be returned.
+* @param rangehigh specifies the user reference variable which returns
+* the Upper Range Value of the specified Incrementer.
+* @param rangelow specifies the user reference variable which returns
+* the Lower Range Value of the specified Incrementer.
+*
+* @return None.
+*
+* @note None
+*
+*****************************************************************************/
+void getincrementerrange(u8 incrementer, u16 *rangehigh, u16 *rangelow)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, (XAPM_RANGE0_OFFSET +
+ (incrementer * 16)));
+
+ *rangelow = regval & 0xFFFF;
+ *rangehigh = (regval >> 16) & 0xFFFF;
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets the Sample Interval Register
+*
+* @param sampleinterval is the Sample Interval
+*
+* @return None
+*
+* @note None.
+*
+*****************************************************************************/
+void setsampleinterval(u32 sampleinterval)
+{
+ /*
+ * Set Sample Interval
+ */
+ writereg(baseaddr, XAPM_SI_LOW_OFFSET, sampleinterval);
+
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of Sample Interval Register
+*
+* @param sampleinterval is a pointer where Sample Interval register
+* contents are returned.
+* @return None.
+*
+* @note None.
+*
+******************************************************************************/
+void getsampleinterval(u32 *sampleinterval)
+{
+ /*
+ * Set Sample Interval Lower
+ */
+ *sampleinterval = readreg(baseaddr, XAPM_SI_LOW_OFFSET);
+
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets metrics for specified Counter in the corresponding
+* Metric Selector Register.
+*
+* @param slot is the slot ID for which specified counter has to
+* be connected.
+* @param metrics is one of the Metric Sets. User has to use
+* XAPM_METRIC_SET_* macros in xaxipmon.h for this parameter
+* @param counter is the Counter Number.
+* The valid values are 0 to 9.
+*
+* @return XST_SUCCESS if Success
+* XST_FAILURE if Failure
+*
+* @note None.
+*
+*****************************************************************************/
+int setmetrics(u8 slot, u8 metrics, u8 counter)
+{
+ u32 regval;
+ u32 mask;
+
+ /* Find mask value to force zero in counternum byte range */
+ if (counter == 0 || counter == 4 || counter == 8)
+ mask = 0xFFFFFF00;
+ else if (counter == 1 || counter == 5 || counter == 9)
+ mask = 0xFFFF00FF;
+ else if (counter == 2 || counter == 6)
+ mask = 0xFF00FFFF;
+ else
+ mask = 0x00FFFFFF;
+
+ if (counter <= 3) {
+ regval = readreg(baseaddr, XAPM_MSR0_OFFSET);
+ regval = regval & mask;
+ regval = regval | (metrics << (counter * 8));
+ regval = regval | (slot << (counter * 8 + 5));
+ writereg(baseaddr, XAPM_MSR0_OFFSET, regval);
+ } else if ((counter >= 4) && (counter <= 7)) {
+ counter = counter - 4;
+ regval = readreg(baseaddr, XAPM_MSR1_OFFSET);
+ regval = regval & mask;
+ regval = regval | (metrics << (counter * 8));
+ regval = regval | (slot << (counter * 8 + 5));
+ writereg(baseaddr, XAPM_MSR1_OFFSET, regval);
+ } else {
+ counter = counter - 8;
+ regval = readreg(baseaddr, XAPM_MSR2_OFFSET);
+
+ regval = regval & mask;
+ regval = regval | (metrics << (counter * 8));
+ regval = regval | (slot << (counter * 8 + 5));
+ writereg(baseaddr, XAPM_MSR2_OFFSET, regval);
+ }
+ return XST_SUCCESS;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function returns metrics in the specified Counter from the corresponding
+* Metric Selector Register.
+*
+* @param counter is the Counter Number.
+* The valid values are 0 to 9.
+* @param metrics is a reference parameter from application where metrics
+* of specified counter is filled.
+* @praram slot is a reference parameter in which slot Id of
+* specified counter is filled
+* @return XST_SUCCESS if Success
+* XST_FAILURE if Failure
+*
+* @note None.
+*
+*****************************************************************************/
+int getmetrics(u8 counter, u8 *metrics, u8 *slot)
+{
+ u32 regval;
+
+ if (counter <= 3) {
+ regval = readreg(baseaddr, XAPM_MSR0_OFFSET);
+ *metrics = (regval >> (counter * 8)) & 0x1F;
+ *slot = (regval >> (counter * 8 + 5)) & 0x7;
+ } else if ((counter >= 4) && (counter <= 7)) {
+ counter = counter - 4;
+ regval = readreg(baseaddr, XAPM_MSR1_OFFSET);
+ *metrics = (regval >> (counter * 8)) & 0x1F;
+ *slot = (regval >> (counter * 8 + 5)) & 0x7;
+ } else {
+ counter = counter - 8;
+ regval = readreg(baseaddr, XAPM_MSR2_OFFSET);
+ *metrics = (regval >> (counter * 8)) & 0x1F;
+ *slot = (regval >> (counter * 8 + 5)) & 0x7;
+ }
+ return XST_SUCCESS;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of the Global Clock Counter Register.
+*
+* @param cnthigh is the user space pointer with which upper 32 bits
+* of Global Clock Counter has to be filled
+* @param cntlow is the user space pointer with which lower 32 bits
+* of Global Clock Counter has to be filled
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void getglobalclkcounter(u32 *cnthigh, u32 *cntlow)
+{
+ *cnthigh = 0x0;
+ *cntlow = 0x0;
+
+ /*
+ * If Counter width is 64 bit then Counter Value has to be
+ * filled at CntHighValue address also.
+ */
+ if (params->globalcntwidth == 64) {
+ /* Bits[63:32] exists at XAPM_GCC_HIGH_OFFSET */
+ *cnthigh = readreg(baseaddr, XAPM_GCC_HIGH_OFFSET);
+ }
+ /* Bits[31:0] exists at XAPM_GCC_LOW_OFFSET */
+ *cntlow = readreg(baseaddr, XAPM_GCC_LOW_OFFSET);
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of the Metric Counter Register.
+*
+* @param counter is the number of the Metric Counter to be read.
+* Use the XAPM_METRIC_COUNTER* defines for the counter number in
+* xaxipmon.h. The valid values are 0 (XAPM_METRIC_COUNTER_0) to
+* 9 (XAPM_METRIC_COUNTER_9).
+* @return regval is the content of specified Metric Counter.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getmetriccounter(u32 counter)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr,
+ (XAPM_MC0_OFFSET + (counter * 16)));
+ return regval;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of the Sampled Metric Counter Register.
+*
+* @param counter is the number of the Sampled Metric Counter to read.
+* Use the XAPM_METRIC_COUNTER* defines for the counter number in
+* xaxipmon.h. The valid values are 0 (XAPM_METRIC_COUNTER_0) to
+* 9 (XAPM_METRIC_COUNTER_9).
+*
+* @return regval is the content of specified Sampled Metric Counter.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getsampledmetriccounter(u32 counter)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, (XAPM_SMC0_OFFSET +
+ (counter * 16)));
+ return regval;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of the Incrementer Register.
+*
+* @param incrementer is the number of the Incrementer register to
+* read.Use the XAPM_INCREMENTER_* defines for the Incrementer
+* number.The valid values are 0 (XAPM_INCREMENTER_0) to
+* 9 (XAPM_INCREMENTER_9).
+* @param incrementer is the number of the specified Incrementer
+* register
+* @return regval is content of specified Metric Incrementer register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getincrementer(u32 incrementer)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, (XAPM_INC0_OFFSET +
+ (incrementer * 16)));
+ return regval;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the contents of the Sampled Incrementer Register.
+*
+* @param incrementer is the number of the Sampled Incrementer
+* register to read.Use the XAPM_INCREMENTER_* defines for the
+* Incrementer number.The valid values are 0 (XAPM_INCREMENTER_0)
+* to 9 (XAPM_INCREMENTER_9).
+* @param incrementer is the number of the specified Sampled
+* Incrementer register
+* @return regval is content of specified Sampled Incrementer register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getsampledincrementer(u32 incrementer)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, (XAPM_SINC0_OFFSET +
+ (incrementer * 16)));
+ return regval;
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Software-written Data Register.
+*
+* @param swdata is the Software written Data.
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void setswdatareg(u32 swdata)
+{
+ /*
+ * Set Software-written Data Register
+ */
+ writereg(baseaddr, XAPM_SWD_OFFSET, swdata);
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns contents of Software-written Data Register.
+*
+* @return swdata.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getswdatareg(void)
+{
+ u32 swdata;
+
+ /*
+ * Set Metric Selector Register
+ */
+ swdata = (u32)readreg(baseaddr, XAPM_SWD_OFFSET);
+ return swdata;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables the following in the AXI Performance Monitor:
+* - Event logging
+*
+* @param flagenables is a value to write to the flag enables
+* register defined by XAPM_FEC_OFFSET. It is recommended
+* to use the XAPM_FEC_*_MASK mask bits to generate.
+* A value of 0x0 will disable all events to the event
+* log streaming FIFO.
+*
+* @return XST_SUCCESS
+*
+* @note None
+*
+******************************************************************************/
+int starteventlog(u32 flagenables)
+{
+ u32 regval;
+
+ /* Read current register value */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ /* Now write to flag enables register */
+ writereg(baseaddr, XAPM_FEC_OFFSET, flagenables);
+ /* Write the new value to the Control register to
+ * enable event logging */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval | XAPM_CR_EVENTLOG_ENABLE_MASK);
+ return XST_SUCCESS;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function disables the following in the AXI Performance Monitor:
+* - Event logging
+*
+* @return XST_SUCCESS
+*
+* @note None
+*
+******************************************************************************/
+int stopeventlog(void)
+{
+ u32 regval;
+
+ /* Read current register value */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ /* Write the new value to the Control register to disable
+ * event logging */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval & ~XAPM_CR_EVENTLOG_ENABLE_MASK);
+
+ return XST_SUCCESS;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables the following in the AXI Performance Monitor:
+* - Global clock counter
+* - All metric counters
+* - All sampled metric counters
+*
+* @param sampleinterval is the sample interval
+* @return XST_SUCCESS
+*
+* @note None
+******************************************************************************/
+int startcounters(u32 sampleinterval)
+{
+ u32 regval;
+
+ /* Read current register value */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ /* Global Clock Counter is present in Advanced Mode only */
+ if (params->mode == 1)
+ regval = regval | XAPM_CR_GCC_ENABLE_MASK;
+ /*
+ * Write the new value to the Control register to enable
+ * global clock counter and metric counters
+ */
+ writereg(baseaddr, XAPM_CTL_OFFSET, regval | XAPM_CR_MCNTR_ENABLE_MASK);
+
+ /* Set, enable, and load sampled counters */
+ setsampleinterval(sampleinterval);
+ loadsic();
+ enablesic();
+
+ return XST_SUCCESS;
+}
+
+/****************************************************************************/
+/**
+*
+* This function disables the following in the AXI Performance Monitor:
+* - Global clock counter
+* - All metric counters
+*
+* @return XST_SUCCESS
+*
+* @note None
+*
+******************************************************************************/
+int stopcounters(void)
+{
+ u32 regval;
+
+ /* Read current register value */
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ /* Global Clock Counter is present in Advanced Mode only */
+ if (params->mode == 1)
+ regval = regval & ~XAPM_CR_GCC_ENABLE_MASK;
+
+ /*
+ * Write the new value to the Control register to disable
+ * global clock counter and metric counters
+ */
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval & ~XAPM_CR_MCNTR_ENABLE_MASK);
+
+ return XST_SUCCESS;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables Metric Counters.
+*
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void enablemetricscounter(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval | XAPM_CR_MCNTR_ENABLE_MASK);
+}
+/****************************************************************************/
+/**
+*
+* This function disables the Metric Counters.
+*
+* @return None
+*
+* @note None
+*
+*****************************************************************************/
+void disablemetricscounter(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval & ~(XAPM_CR_MCNTR_ENABLE_MASK));
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets the Upper and Lower Ranges for specified Metric Counter
+* Log Enable Register.Event Logging starts when corresponding Metric Counter
+* value falls in between these ranges
+*
+* @param counter is the Metric Counter number for which
+* Ranges are to be assigned.Use the XAPM_METRIC_COUNTER*
+* defines for the counter number in xaxipmon.h.
+* The valid values are 0 (XAPM_METRIC_COUNTER_0) to
+* 9 (XAPM_METRIC_COUNTER_9).
+* @param rangehigh specifies the Upper limit in 32 bit Register
+* @param rangelow specifies the Lower limit in 32 bit Register
+* @return None
+*
+* @note None.
+*
+*****************************************************************************/
+void setlogenableranges(u32 counter, u16 rangehigh, u16 rangelow)
+{
+ u32 regval;
+
+ /*
+ * Write the specified Ranges to corresponding Metric Counter Log
+ * Enable Register
+ */
+ regval = rangehigh << 16;
+ regval |= rangelow;
+ writereg(baseaddr, (XAPM_MC0LOGEN_OFFSET +
+ (counter * 16)), regval);
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns the Ranges of specified Metric Counter Log
+* Enable Register.
+*
+* @param counter is the Metric Counter number for which
+* Ranges are to be returned.Use the XAPM_METRIC_COUNTER*
+* defines for the counter number in xaxipmon.h.
+* The valid values are 0 (XAPM_METRIC_COUNTER_0) to
+* 9 (XAPM_METRIC_COUNTER_9).
+*
+* @param rangehigh specifies the user reference variable which returns
+* the Upper Range Value of the specified Metric Counter
+* Log Enable Register.
+* @param rangelow specifies the user reference variable which returns
+* the Lower Range Value of the specified Metric Counter
+* Log Enable Register.
+*
+* @note None.
+*
+*****************************************************************************/
+void getlogenableranges(u32 counter, u16 *rangehigh, u16 *rangelow)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr,
+ (XAPM_MC0LOGEN_OFFSET + (counter * 16)));
+
+ *rangelow = regval & 0xFFFF;
+ *rangehigh = (regval >> 16) & 0xFFFF;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables Event Logging.
+*
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void enableeventlog(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval | XAPM_CR_EVENTLOG_ENABLE_MASK);
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables External trigger pulse so that Metric Counters can be
+* started on external trigger pulse for a slot.
+*
+*
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void enablemctrigger(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval | XAPM_CR_MCNTR_EXTTRIGGER_MASK);
+}
+
+/****************************************************************************/
+/**
+*
+* This function disables the External trigger pulse used to start Metric
+* Counters on external trigger pulse for a slot.
+*
+* @return None
+*
+* @note None
+*
+*****************************************************************************/
+void disablemctrigger(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval & ~(XAPM_CR_MCNTR_EXTTRIGGER_MASK));
+}
+
+/*****************************************************************************/
+/**
+*
+* This function enables External trigger pulse for Event Log
+* so that Event Logging can be started on external trigger pulse for a slot.
+*
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void enableeventlogtrigger(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval | XAPM_CR_EVTLOG_EXTTRIGGER_MASK);
+}
+
+/****************************************************************************/
+/**
+*
+* This function disables the External trigger pulse used to start Event
+* Log on external trigger pulse for a slot.
+*
+* @return None
+*
+* @note None
+*
+*****************************************************************************/
+void disableeventlogtrigger(void)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+
+ writereg(baseaddr, XAPM_CTL_OFFSET,
+ regval & ~(XAPM_CR_EVTLOG_EXTTRIGGER_MASK));
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns a name for a given Metric.
+*
+* @param metrics is one of the Metric Sets. User has to use
+* XAPM_METRIC_SET_* macros in xaxipmon.h for this parameter
+*
+* @return const char *
+*
+* @note None
+*
+*****************************************************************************/
+const char *getmetricname(u8 metrics)
+{
+ if (metrics == XAPM_METRIC_SET_0)
+ return "Write Transaction Count";
+ if (metrics == XAPM_METRIC_SET_1)
+ return "Read Transaction Count";
+ if (metrics == XAPM_METRIC_SET_2)
+ return "Write Byte Count";
+ if (metrics == XAPM_METRIC_SET_3)
+ return "Read Byte Count";
+ if (metrics == XAPM_METRIC_SET_4)
+ return "Write Beat Count";
+ if (metrics == XAPM_METRIC_SET_5)
+ return "Total Read Latency";
+ if (metrics == XAPM_METRIC_SET_6)
+ return "Total Write Latency";
+ if (metrics == XAPM_METRIC_SET_7)
+ return "Slv_Wr_Idle_Cnt";
+ if (metrics == XAPM_METRIC_SET_8)
+ return "Mst_Rd_Idle_Cnt";
+ if (metrics == XAPM_METRIC_SET_9)
+ return "Num_BValids";
+ if (metrics == XAPM_METRIC_SET_10)
+ return "Num_WLasts";
+ if (metrics == XAPM_METRIC_SET_11)
+ return "Num_RLasts";
+ if (metrics == XAPM_METRIC_SET_12)
+ return "Minimum Write Latency";
+ if (metrics == XAPM_METRIC_SET_13)
+ return "Maximum Write Latency";
+ if (metrics == XAPM_METRIC_SET_14)
+ return "Minimum Read Latency";
+ if (metrics == XAPM_METRIC_SET_15)
+ return "Maximum Read Latency";
+ if (metrics == XAPM_METRIC_SET_16)
+ return "Transfer Cycle Count";
+ if (metrics == XAPM_METRIC_SET_17)
+ return "Packet Count";
+ if (metrics == XAPM_METRIC_SET_18)
+ return "Data Byte Count";
+ if (metrics == XAPM_METRIC_SET_19)
+ return "Position Byte Count";
+ if (metrics == XAPM_METRIC_SET_20)
+ return "Null Byte Count";
+ if (metrics == XAPM_METRIC_SET_21)
+ return "Slv_Idle_Cnt";
+ if (metrics == XAPM_METRIC_SET_22)
+ return "Mst_Idle_Cnt";
+ if (metrics == XAPM_METRIC_SET_30)
+ return "External event count";
+ return "Unsupported";
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Write ID in Latency ID register to capture Write
+* Latency metrics.
+*
+* @param writeid is the Write ID to be written in Latency ID register.
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void setwriteid(u32 writeid)
+{
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_ID_OFFSET);
+ regval = regval & ~(XAPM_ID_WID_MASK);
+ regval = regval | writeid;
+ writereg(baseaddr, XAPM_ID_OFFSET, regval);
+ } else {
+ writereg(baseaddr, XAPM_ID_OFFSET, writeid);
+ }
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Read ID in Latency ID register to capture
+* Read Latency metrics.
+*
+* @param readid is the Read ID to be written in Latency ID register.
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void setreadid(u32 readid)
+{
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_ID_OFFSET);
+ regval = regval & ~(XAPM_ID_RID_MASK);
+ regval = regval | (readid << 16);
+ writereg(baseaddr, XAPM_ID_OFFSET, regval);
+ } else {
+ writereg(baseaddr, XAPM_RID_OFFSET, readid);
+ }
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns Write ID in Latency ID register.
+*
+* @return writeid is the required Write ID in Latency ID register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getwriteid(void)
+{
+
+ u32 writeid;
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_ID_OFFSET);
+ writeid = regval & XAPM_ID_WID_MASK;
+ } else {
+ writeid = XAPM_IDMASK_OFFSET;
+ }
+
+ return writeid;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns Read ID in Latency ID register.
+*
+* @return readid is the required Read ID in Latency ID register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getreadid(void)
+{
+
+ u32 readid;
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_ID_OFFSET);
+ regval = regval & XAPM_ID_RID_MASK;
+ readid = regval >> 16;
+ } else {
+ readid = XAPM_RID_OFFSET;
+ }
+
+ return readid;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function sets Latency Start point to calculate write latency.
+*
+* @param Param can be 0 - XAPM_LATENCY_ADDR_ISSUE
+* or 1 - XAPM_LATENCY_ADDR_ACCEPT
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void setwrlatencystart(u8 param)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ if (param == XAPM_LATENCY_ADDR_ACCEPT)
+ writereg(baseaddr, XAPM_CTL_OFFSET, regval |
+ XAPM_CR_WRLATENCY_START_MASK);
+ else
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr,
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_WRLATENCY_START_MASK));
+}
+
+/*****************************************************************************/
+/**
+*
+* This function sets Latency End point to calculate write latency.
+*
+* @param Param can be 0 - XAPM_LATENCY_LASTWR
+* or 1 - XAPM_LATENCY_FIRSTWR
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void setwrlatencyend(u8 param)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ if (param == XAPM_LATENCY_FIRSTWR)
+ writereg(baseaddr, XAPM_CTL_OFFSET, regval |
+ XAPM_CR_WRLATENCY_END_MASK);
+ else
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr,
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_WRLATENCY_END_MASK));
+}
+
+/*****************************************************************************/
+/**
+*
+* This function sets Latency Start point to calculate read latency.
+*
+* @param Param can be 0 - XAPM_LATENCY_ADDR_ISSUE
+* or 1 - XAPM_LATENCY_ADDR_ACCEPT
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void setrdlatencystart(u8 param)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ if (param == XAPM_LATENCY_ADDR_ACCEPT)
+ writereg(baseaddr, XAPM_CTL_OFFSET, regval |
+ XAPM_CR_RDLATENCY_START_MASK);
+ else
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr,
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_RDLATENCY_START_MASK));
+}
+
+/*****************************************************************************/
+/**
+*
+* This function sets Latency End point to calculate read latency.
+*
+* @param Param can be 0 - XAPM_LATENCY_LASTRD
+* or 1 - XAPM_LATENCY_FIRSTRD
+* @return None
+*
+* @note None
+*
+******************************************************************************/
+void setrdlatencyend(u8 param)
+{
+ u32 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ if (param == XAPM_LATENCY_FIRSTRD)
+ writereg(baseaddr, XAPM_CTL_OFFSET, regval |
+ XAPM_CR_RDLATENCY_END_MASK);
+ else
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr,
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_RDLATENCY_END_MASK));
+}
+
+/*****************************************************************************/
+/**
+*
+* This function returns Write Latency Start point.
+*
+* @return Returns 0 - XAPM_LATENCY_ADDR_ISSUE or
+* 1 - XAPM_LATENCY_ADDR_ACCEPT
+*
+* @note None
+*
+******************************************************************************/
+u8 getwrlatencystart(void)
+{
+ u8 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ regval = regval & XAPM_CR_WRLATENCY_START_MASK;
+ if (regval != XAPM_LATENCY_ADDR_ISSUE)
+ return XAPM_LATENCY_ADDR_ACCEPT;
+ else
+ return XAPM_LATENCY_ADDR_ISSUE;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function returns Write Latency End point.
+*
+* @return Returns 0 - XAPM_LATENCY_LASTWR or
+* 1 - XAPM_LATENCY_FIRSTWR.
+*
+* @note None
+*
+******************************************************************************/
+u8 getwrlatencyend(void)
+{
+ u8 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ regval = regval & XAPM_CR_WRLATENCY_END_MASK;
+ if (regval != XAPM_LATENCY_LASTWR)
+ return XAPM_LATENCY_FIRSTWR;
+ else
+ return XAPM_LATENCY_LASTWR;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function returns read Latency Start point.
+*
+* @return Returns 0 - XAPM_LATENCY_ADDR_ISSUE or
+* 1 - XAPM_LATENCY_ADDR_ACCEPT
+*
+* @note None
+*
+******************************************************************************/
+u8 getrdlatencystart(void)
+{
+ u8 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ regval = regval & XAPM_CR_RDLATENCY_START_MASK;
+
+ if (regval != XAPM_LATENCY_ADDR_ISSUE)
+ return XAPM_LATENCY_ADDR_ACCEPT;
+ else
+ return XAPM_LATENCY_ADDR_ISSUE;
+}
+
+/*****************************************************************************/
+/**
+*
+* This function returns Read Latency End point.
+*
+* @return Returns 0 - XAPM_LATENCY_LASTRD or
+* 1 - XAPM_LATENCY_FIRSTRD.
+*
+* @note None
+*
+******************************************************************************/
+u8 getrdlatencyend(void)
+{
+ u8 regval;
+
+ regval = readreg(baseaddr, XAPM_CTL_OFFSET);
+ regval = regval & XAPM_CR_RDLATENCY_END_MASK;
+ if (regval != XAPM_LATENCY_LASTRD)
+ return XAPM_LATENCY_FIRSTRD;
+ else
+ return XAPM_LATENCY_LASTRD;
+
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Write ID Mask in ID Mask register.
+*
+* @param wrmask is the Write ID mask to be written in ID register.
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void setwriteidmask(u32 wrmask)
+{
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_IDMASK_OFFSET);
+ regval = regval & ~(XAPM_MASKID_WID_MASK);
+ regval = regval | wrmask;
+ writereg(baseaddr, XAPM_IDMASK_OFFSET, regval);
+ } else {
+ writereg(baseaddr, XAPM_IDMASK_OFFSET, wrmask);
+ }
+}
+
+/****************************************************************************/
+/**
+*
+* This function sets Read ID Mask in ID Mask register.
+*
+* @param rdmask is the Read ID mask to be written in ID Mask register.
+*
+* @return None.
+*
+* @note None.
+*
+*****************************************************************************/
+void setreadidmask(u32 rdmask)
+{
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_IDMASK_OFFSET);
+ regval = regval & ~(XAPM_MASKID_RID_MASK);
+ regval = regval | (rdmask << 16);
+ writereg(baseaddr, XAPM_IDMASK_OFFSET, regval);
+ } else {
+ writereg(baseaddr, XAPM_RIDMASK_OFFSET, rdmask);
+ }
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns Write ID Mask in ID Mask register.
+*
+* @return wrmask is the required Write ID Mask in ID Mask register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getwriteidmask(void)
+{
+
+ u32 wrmask;
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_IDMASK_OFFSET);
+ wrmask = regval & XAPM_MASKID_WID_MASK;
+ } else {
+ wrmask = XAPM_IDMASK_OFFSET;
+ }
+ return wrmask;
+}
+
+/****************************************************************************/
+/**
+*
+* This function returns Read ID Mask in ID Mask register.
+*
+* @return rdmask is the required Read ID Mask in ID Mask register.
+*
+* @note None.
+*
+*****************************************************************************/
+u32 getreadidmask(void)
+{
+
+ u32 rdmask;
+ u32 regval;
+
+ if (params->is_32bit_filter == 0) {
+ regval = readreg(baseaddr, XAPM_IDMASK_OFFSET);
+ regval = regval & XAPM_MASKID_RID_MASK;
+ rdmask = regval >> 16;
+ } else {
+ rdmask = XAPM_RIDMASK_OFFSET;
+ }
+ return rdmask;
+}
diff --git a/samples/xilinx_apm/xaxipmon.h b/samples/xilinx_apm/xaxipmon.h
new file mode 100644
index 000000000000..85e0e902a1c5
--- /dev/null
+++ b/samples/xilinx_apm/xaxipmon.h
@@ -0,0 +1,943 @@
+#ifndef XAXIPMON_H /* Prevent circular inclusions */
+#define XAXIPMON_H /* by using protection macros */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdbool.h>
+
+
+#define XST_SUCCESS 0
+#define XST_FAILURE 1
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#define XAPM_GCC_HIGH_OFFSET 0x0000 /* Global Clock Counter
+ 32 to 63 bits */
+#define XAPM_GCC_LOW_OFFSET 0x0004 /* Global Clock Counter Lower
+ 0-31 bits */
+#define XAPM_SI_HIGH_OFFSET 0x0020 /* Sample Interval MSB */
+#define XAPM_SI_LOW_OFFSET 0x0024 /* Sample Interval LSB */
+#define XAPM_SICR_OFFSET 0x0028 /* Sample Interval Control
+ Register */
+#define XAPM_SR_OFFSET 0x002C /* Sample Register */
+#define XAPM_GIE_OFFSET 0x0030 /* Global Interrupt Enable
+ Register */
+#define XAPM_IE_OFFSET 0x0034 /* Interrupt Enable Register */
+#define XAPM_IS_OFFSET 0x0038 /* Interrupt Status Register */
+
+#define XAPM_MSR0_OFFSET 0x0044 /* Metric Selector 0 Register*/
+#define XAPM_MSR1_OFFSET 0x0048 /* Metric Selector 1 Register*/
+#define XAPM_MSR2_OFFSET 0x004C /* Metric Selector 2 Register*/
+
+#define XAPM_MC0_OFFSET 0x0100 /* Metric Counter 0 Register */
+#define XAPM_INC0_OFFSET 0x0104 /* Incrementer 0 Register */
+#define XAPM_RANGE0_OFFSET 0x0108 /* Range 0 Register */
+#define XAPM_MC0LOGEN_OFFSET 0x010C /* Metric Counter 0
+ Log Enable Register */
+#define XAPM_MC1_OFFSET 0x0110 /* Metric Counter 1 Register */
+#define XAPM_INC1_OFFSET 0x0114 /* Incrementer 1 Register */
+#define XAPM_RANGE1_OFFSET 0x0118 /* Range 1 Register */
+#define XAPM_MC1LOGEN_OFFSET 0x011C /* Metric Counter 1
+ Log Enable Register */
+#define XAPM_MC2_OFFSET 0x0120 /* Metric Counter 2 Register */
+#define XAPM_INC2_OFFSET 0x0124 /* Incrementer 2 Register */
+#define XAPM_RANGE2_OFFSET 0x0128 /* Range 2 Register */
+#define XAPM_MC2LOGEN_OFFSET 0x012C /* Metric Counter 2
+ Log Enable Register */
+#define XAPM_MC3_OFFSET 0x0130 /* Metric Counter 3 Register */
+#define XAPM_INC3_OFFSET 0x0134 /* Incrementer 3 Register */
+#define XAPM_RANGE3_OFFSET 0x0138 /* Range 3 Register */
+#define XAPM_MC3LOGEN_OFFSET 0x013C /* Metric Counter 3
+ Log Enable Register */
+#define XAPM_MC4_OFFSET 0x0140 /* Metric Counter 4 Register */
+#define XAPM_INC4_OFFSET 0x0144 /* Incrementer 4 Register */
+#define XAPM_RANGE4_OFFSET 0x0148 /* Range 4 Register */
+#define XAPM_MC4LOGEN_OFFSET 0x014C /* Metric Counter 4
+ Log Enable Register */
+#define XAPM_MC5_OFFSET 0x0150 /* Metric Counter 5
+ Register */
+#define XAPM_INC5_OFFSET 0x0154 /* Incrementer 5 Register */
+#define XAPM_RANGE5_OFFSET 0x0158 /* Range 5 Register */
+#define XAPM_MC5LOGEN_OFFSET 0x015C /* Metric Counter 5
+ Log Enable Register */
+#define XAPM_MC6_OFFSET 0x0160 /* Metric Counter 6
+ Register */
+#define XAPM_INC6_OFFSET 0x0164 /* Incrementer 6 Register */
+#define XAPM_RANGE6_OFFSET 0x0168 /* Range 6 Register */
+#define XAPM_MC6LOGEN_OFFSET 0x016C /* Metric Counter 6
+ Log Enable Register */
+#define XAPM_MC7_OFFSET 0x0170 /* Metric Counter 7
+ Register */
+#define XAPM_INC7_OFFSET 0x0174 /* Incrementer 7 Register */
+#define XAPM_RANGE7_OFFSET 0x0178 /* Range 7 Register */
+#define XAPM_MC7LOGEN_OFFSET 0x017C /* Metric Counter 7
+ Log Enable Register */
+#define XAPM_MC8_OFFSET 0x0180 /* Metric Counter 8
+ Register */
+#define XAPM_INC8_OFFSET 0x0184 /* Incrementer 8 Register */
+#define XAPM_RANGE8_OFFSET 0x0188 /* Range 8 Register */
+#define XAPM_MC8LOGEN_OFFSET 0x018C /* Metric Counter 8
+ Log Enable Register */
+#define XAPM_MC9_OFFSET 0x0190 /* Metric Counter 9
+ Register */
+#define XAPM_INC9_OFFSET 0x0194 /* Incrementer 9 Register */
+#define XAPM_RANGE9_OFFSET 0x0198 /* Range 9 Register */
+#define XAPM_MC9LOGEN_OFFSET 0x019C /* Metric Counter 9
+ Log Enable Register */
+
+#define XAPM_MC10_OFFSET 0x01A0 /* Metric Counter 10
+ Register */
+#define XAPM_MC11_OFFSET 0x01B0 /* Metric Counter 11
+ Register */
+#define XAPM_MC12_OFFSET 0x0500 /* Metric Counter 12
+ Register */
+#define XAPM_MC13_OFFSET 0x0510 /* Metric Counter 13
+ Register */
+#define XAPM_MC14_OFFSET 0x0520 /* Metric Counter 14
+ Register */
+#define XAPM_MC15_OFFSET 0x0530 /* Metric Counter 15
+ Register */
+#define XAPM_MC16_OFFSET 0x0540 /* Metric Counter 16
+ Register */
+#define XAPM_MC17_OFFSET 0x0550 /* Metric Counter 17
+ Register */
+#define XAPM_MC18_OFFSET 0x0560 /* Metric Counter 18
+ Register */
+#define XAPM_MC19_OFFSET 0x0570 /* Metric Counter 19
+ Register */
+#define XAPM_MC20_OFFSET 0x0580 /* Metric Counter 20
+ Register */
+#define XAPM_MC21_OFFSET 0x0590 /* Metric Counter 21
+ Register */
+#define XAPM_MC22_OFFSET 0x05A0 /* Metric Counter 22
+ Register */
+#define XAPM_MC23_OFFSET 0x05B0 /* Metric Counter 23
+ Register */
+#define XAPM_MC24_OFFSET 0x0700 /* Metric Counter 24
+ Register */
+#define XAPM_MC25_OFFSET 0x0710 /* Metric Counter 25
+ Register */
+#define XAPM_MC26_OFFSET 0x0720 /* Metric Counter 26
+ Register */
+#define XAPM_MC27_OFFSET 0x0730 /* Metric Counter 27
+ Register */
+#define XAPM_MC28_OFFSET 0x0740 /* Metric Counter 28
+ Register */
+#define XAPM_MC29_OFFSET 0x0750 /* Metric Counter 29
+ Register */
+#define XAPM_MC30_OFFSET 0x0760 /* Metric Counter 30
+ Register */
+#define XAPM_MC31_OFFSET 0x0770 /* Metric Counter 31
+ Register */
+#define XAPM_MC32_OFFSET 0x0780 /* Metric Counter 32
+ Register */
+#define XAPM_MC33_OFFSET 0x0790 /* Metric Counter 33
+ Register */
+#define XAPM_MC34_OFFSET 0x07A0 /* Metric Counter 34
+ Register */
+#define XAPM_MC35_OFFSET 0x07B0 /* Metric Counter 35
+ Register */
+#define XAPM_MC36_OFFSET 0x0900 /* Metric Counter 36
+ Register */
+#define XAPM_MC37_OFFSET 0x0910 /* Metric Counter 37
+ Register */
+#define XAPM_MC38_OFFSET 0x0920 /* Metric Counter 38
+ Register */
+#define XAPM_MC39_OFFSET 0x0930 /* Metric Counter 39
+ Register */
+#define XAPM_MC40_OFFSET 0x0940 /* Metric Counter 40
+ Register */
+#define XAPM_MC41_OFFSET 0x0950 /* Metric Counter 41
+ Register */
+#define XAPM_MC42_OFFSET 0x0960 /* Metric Counter 42
+ Register */
+#define XAPM_MC43_OFFSET 0x0970 /* Metric Counter 43
+ Register */
+#define XAPM_MC44_OFFSET 0x0980 /* Metric Counter 44
+ Register */
+#define XAPM_MC45_OFFSET 0x0990 /* Metric Counter 45
+ Register */
+#define XAPM_MC46_OFFSET 0x09A0 /* Metric Counter 46
+ Register */
+#define XAPM_MC47_OFFSET 0x09B0 /* Metric Counter 47
+ Register */
+
+#define XAPM_SMC0_OFFSET 0x0200 /* Sampled Metric Counter
+ 0 Register */
+#define XAPM_SINC0_OFFSET 0x0204 /* Sampled Incrementer
+ 0 Register */
+#define XAPM_SMC1_OFFSET 0x0210 /* Sampled Metric Counter
+ 1 Register */
+#define XAPM_SINC1_OFFSET 0x0214 /* Sampled Incrementer
+ 1 Register */
+#define XAPM_SMC2_OFFSET 0x0220 /* Sampled Metric Counter
+ 2 Register */
+#define XAPM_SINC2_OFFSET 0x0224 /* Sampled Incrementer
+ 2 Register */
+#define XAPM_SMC3_OFFSET 0x0230 /* Sampled Metric Counter
+ 3 Register */
+#define XAPM_SINC3_OFFSET 0x0234 /* Sampled Incrementer
+ 3 Register */
+#define XAPM_SMC4_OFFSET 0x0240 /* Sampled Metric Counter
+ 4 Register */
+#define XAPM_SINC4_OFFSET 0x0244 /* Sampled Incrementer
+ 4 Register */
+#define XAPM_SMC5_OFFSET 0x0250 /* Sampled Metric Counter
+ 5 Register */
+#define XAPM_SINC5_OFFSET 0x0254 /* Sampled Incrementer
+ 5 Register */
+#define XAPM_SMC6_OFFSET 0x0260 /* Sampled Metric Counter
+ 6 Register */
+#define XAPM_SINC6_OFFSET 0x0264 /* Sampled Incrementer
+ 6 Register */
+#define XAPM_SMC7_OFFSET 0x0270 /* Sampled Metric Counter
+ 7 Register */
+#define XAPM_SINC7_OFFSET 0x0274 /* Sampled Incrementer
+ 7 Register */
+#define XAPM_SMC8_OFFSET 0x0280 /* Sampled Metric Counter
+ 8 Register */
+#define XAPM_SINC8_OFFSET 0x0284 /* Sampled Incrementer
+ 8 Register */
+#define XAPM_SMC9_OFFSET 0x0290 /* Sampled Metric Counter
+ 9 Register */
+#define XAPM_SINC9_OFFSET 0x0294 /* Sampled Incrementer
+ 9 Register */
+#define XAPM_SMC10_OFFSET 0x02A0 /* Sampled Metric Counter
+ 10 Register */
+#define XAPM_SMC11_OFFSET 0x02B0 /* Sampled Metric Counter
+ 11 Register */
+#define XAPM_SMC12_OFFSET 0x0600 /* Sampled Metric Counter
+ 12 Register */
+#define XAPM_SMC13_OFFSET 0x0610 /* Sampled Metric Counter
+ 13 Register */
+#define XAPM_SMC14_OFFSET 0x0620 /* Sampled Metric Counter
+ 14 Register */
+#define XAPM_SMC15_OFFSET 0x0630 /* Sampled Metric Counter
+ 15 Register */
+#define XAPM_SMC16_OFFSET 0x0640 /* Sampled Metric Counter
+ 16 Register */
+#define XAPM_SMC17_OFFSET 0x0650 /* Sampled Metric Counter
+ 17 Register */
+#define XAPM_SMC18_OFFSET 0x0660 /* Sampled Metric Counter
+ 18 Register */
+#define XAPM_SMC19_OFFSET 0x0670 /* Sampled Metric Counter
+ 19 Register */
+#define XAPM_SMC20_OFFSET 0x0680 /* Sampled Metric Counter
+ 20 Register */
+#define XAPM_SMC21_OFFSET 0x0690 /* Sampled Metric Counter
+ 21 Register */
+#define XAPM_SMC22_OFFSET 0x06A0 /* Sampled Metric Counter
+ 22 Register */
+#define XAPM_SMC23_OFFSET 0x06B0 /* Sampled Metric Counter
+ 23 Register */
+#define XAPM_SMC24_OFFSET 0x0800 /* Sampled Metric Counter
+ 24 Register */
+#define XAPM_SMC25_OFFSET 0x0810 /* Sampled Metric Counter
+ 25 Register */
+#define XAPM_SMC26_OFFSET 0x0820 /* Sampled Metric Counter
+ 26 Register */
+#define XAPM_SMC27_OFFSET 0x0830 /* Sampled Metric Counter
+ 27 Register */
+#define XAPM_SMC28_OFFSET 0x0840 /* Sampled Metric Counter
+ 28 Register */
+#define XAPM_SMC29_OFFSET 0x0850 /* Sampled Metric Counter
+ 29 Register */
+#define XAPM_SMC30_OFFSET 0x0860 /* Sampled Metric Counter
+ 30 Register */
+#define XAPM_SMC31_OFFSET 0x0870 /* Sampled Metric Counter
+ 31 Register */
+#define XAPM_SMC32_OFFSET 0x0880 /* Sampled Metric Counter
+ 32 Register */
+#define XAPM_SMC33_OFFSET 0x0890 /* Sampled Metric Counter
+ 33 Register */
+#define XAPM_SMC34_OFFSET 0x08A0 /* Sampled Metric Counter
+ 34 Register */
+#define XAPM_SMC35_OFFSET 0x08B0 /* Sampled Metric Counter
+ 35 Register */
+#define XAPM_SMC36_OFFSET 0x0A00 /* Sampled Metric Counter
+ 36 Register */
+#define XAPM_SMC37_OFFSET 0x0A10 /* Sampled Metric Counter
+ 37 Register */
+#define XAPM_SMC38_OFFSET 0x0A20 /* Sampled Metric Counter
+ 38 Register */
+#define XAPM_SMC39_OFFSET 0x0A30 /* Sampled Metric Counter
+ 39 Register */
+#define XAPM_SMC40_OFFSET 0x0A40 /* Sampled Metric Counter
+ 40 Register */
+#define XAPM_SMC41_OFFSET 0x0A50 /* Sampled Metric Counter
+ 41 Register */
+#define XAPM_SMC42_OFFSET 0x0A60 /* Sampled Metric Counter
+ 42 Register */
+#define XAPM_SMC43_OFFSET 0x0A70 /* Sampled Metric Counter
+ 43 Register */
+#define XAPM_SMC44_OFFSET 0x0A80 /* Sampled Metric Counter
+ 44 Register */
+#define XAPM_SMC45_OFFSET 0x0A90 /* Sampled Metric Counter
+ 45 Register */
+#define XAPM_SMC46_OFFSET 0x0AA0 /* Sampled Metric Counter
+ 46 Register */
+#define XAPM_SMC47_OFFSET 0x0AB0 /* Sampled Metric Counter
+ 47 Register */
+
+#define XAPM_CTL_OFFSET 0x0300 /* Control Register */
+
+#define XAPM_ID_OFFSET 0x0304 /* Latency ID Register */
+
+#define XAPM_IDMASK_OFFSET 0x0308 /* ID Mask Register */
+
+#define XAPM_RID_OFFSET 0x030C /* Latency Write ID Register */
+
+#define XAPM_RIDMASK_OFFSET 0x0310 /* Read ID mask register */
+
+#define XAPM_FEC_OFFSET 0x0400 /* flag Enable
+ Control Register */
+
+#define XAPM_SWD_OFFSET 0x0404 /* Software-written
+ Data Register */
+
+#define XAPM_SICR_MCNTR_RST_MASK 0x00000100 /* Enable the Metric
+ Counter Reset */
+#define XAPM_SICR_LOAD_MASK 0x00000002 /* Load the Sample Interval
+ Register Value into
+ the counter */
+#define XAPM_SICR_ENABLE_MASK 0x00000001 /* Enable the downcounter */
+
+#define XAPM_IXR_MC9_OVERFLOW_MASK 0x00001000 /**< Metric Counter 9
+ * Overflow> */
+#define XAPM_IXR_MC8_OVERFLOW_MASK 0x00000800 /**< Metric Counter 8
+ * Overflow> */
+#define XAPM_IXR_MC7_OVERFLOW_MASK 0x00000400 /**< Metric Counter 7
+ * Overflow> */
+#define XAPM_IXR_MC6_OVERFLOW_MASK 0x00000200 /**< Metric Counter 6
+ * Overflow> */
+#define XAPM_IXR_MC5_OVERFLOW_MASK 0x00000100 /**< Metric Counter 5
+ * Overflow> */
+#define XAPM_IXR_MC4_OVERFLOW_MASK 0x00000080 /**< Metric Counter 4
+ * Overflow> */
+#define XAPM_IXR_MC3_OVERFLOW_MASK 0x00000040 /**< Metric Counter 3
+ * Overflow> */
+#define XAPM_IXR_MC2_OVERFLOW_MASK 0x00000020 /**< Metric Counter 2
+ * Overflow> */
+#define XAPM_IXR_MC1_OVERFLOW_MASK 0x00000010 /**< Metric Counter 1
+ * Overflow> */
+#define XAPM_IXR_MC0_OVERFLOW_MASK 0x00000008 /**< Metric Counter 0
+ * Overflow> */
+#define XAPM_IXR_FIFO_FULL_MASK 0x00000004 /**< Event Log FIFO
+ * full> */
+#define XAPM_IXR_SIC_OVERFLOW_MASK 0x00000002 /**< Sample Interval
+ * Counter Overflow */
+#define XAPM_IXR_GCC_OVERFLOW_MASK 0x00000001 /**< Global Clock
+ Counter Overflow */
+#define XAPM_IXR_ALL_MASK (XAPM_IXR_SIC_OVERFLOW_MASK | \
+ XAPM_IXR_GCC_OVERFLOW_MASK | \
+ XAPM_IXR_FIFO_FULL_MASK | \
+ XAPM_IXR_MC0_OVERFLOW_MASK | \
+ XAPM_IXR_MC1_OVERFLOW_MASK | \
+ XAPM_IXR_MC2_OVERFLOW_MASK | \
+ XAPM_IXR_MC3_OVERFLOW_MASK | \
+ XAPM_IXR_MC4_OVERFLOW_MASK | \
+ XAPM_IXR_MC5_OVERFLOW_MASK | \
+ XAPM_IXR_MC6_OVERFLOW_MASK | \
+ XAPM_IXR_MC7_OVERFLOW_MASK | \
+ XAPM_IXR_MC8_OVERFLOW_MASK | \
+ XAPM_IXR_MC9_OVERFLOW_MASK)
+
+#define XAPM_CR_FIFO_RESET_MASK 0x02000000
+ /**< FIFO Reset */
+#define XAPM_CR_MUXSEL_MASK 0x01000000
+ /**< Mux Selector mask */
+#define XAPM_CR_GCC_RESET_MASK 0x00020000
+ /**< Global Clk
+ Counter Reset */
+#define XAPM_CR_GCC_ENABLE_MASK 0x00010000
+ /**< Global Clk
+ Counter Enable */
+#define XAPM_CR_EVTLOG_EXTTRIGGER_MASK 0x00000200
+ /**< Enable External trigger
+ to start event Log */
+#define XAPM_CR_EVENTLOG_ENABLE_MASK 0x00000100
+ /**< Event Log Enable */
+#define XAPM_CR_RDLATENCY_END_MASK 0x00000080
+ /**< Write Latency
+ End point */
+#define XAPM_CR_RDLATENCY_START_MASK 0x00000040
+ /**< Read Latency
+ Start point */
+#define XAPM_CR_WRLATENCY_END_MASK 0x00000020
+ /**< Write Latency
+ End point */
+#define XAPM_CR_WRLATENCY_START_MASK 0x00000010
+ /**< Write Latency
+ Start point */
+#define XAPM_CR_IDFILTER_ENABLE_MASK 0x00000008
+ /**< ID Filter Enable */
+#define XAPM_CR_MCNTR_EXTTRIGGER_MASK 0x00000004
+ /**< Enable External
+ trigger to start
+ Metric Counters */
+#define XAPM_CR_MCNTR_RESET_MASK 0x00000002
+ /**< Metrics Counter
+ Reset */
+#define XAPM_CR_MCNTR_ENABLE_MASK 0x00000001
+ /**< Metrics Counter
+ Enable */
+
+#define XAPM_ID_RID_MASK 0xFFFF0000 /**< Read ID */
+
+#define XAPM_ID_WID_MASK 0x0000FFFF /**< Write ID */
+
+#define XAPM_MASKID_RID_MASK 0xFFFF0000 /**< Read ID Mask */
+
+#define XAPM_MASKID_WID_MASK 0x0000FFFF /**< Write ID Mask*/
+
+
+#define XAPM_MAX_COUNTERS 10 /**< Maximum number of Counters */
+#define XAPM_MAX_COUNTERS_PROFILE 48 /**< Maximum number of Counters in
+ profile mode */
+
+#define XAPM_METRIC_COUNTER_0 0 /**< Metric Counter 0 Register Index */
+#define XAPM_METRIC_COUNTER_1 1 /**< Metric Counter 1 Register Index */
+#define XAPM_METRIC_COUNTER_2 2 /**< Metric Counter 2 Register Index */
+#define XAPM_METRIC_COUNTER_3 3 /**< Metric Counter 3 Register Index */
+#define XAPM_METRIC_COUNTER_4 4 /**< Metric Counter 4 Register Index */
+#define XAPM_METRIC_COUNTER_5 5 /**< Metric Counter 5 Register Index */
+#define XAPM_METRIC_COUNTER_6 6 /**< Metric Counter 6 Register Index */
+#define XAPM_METRIC_COUNTER_7 7 /**< Metric Counter 7 Register Index */
+#define XAPM_METRIC_COUNTER_8 8 /**< Metric Counter 8 Register Index */
+#define XAPM_METRIC_COUNTER_9 9 /**< Metric Counter 9 Register Index */
+
+#define XAPM_INCREMENTER_0 0 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_1 1 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_2 2 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_3 3 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_4 4 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_5 5 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_6 6 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_7 7 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_8 8 /**< Metric Counter 0 Register Index */
+#define XAPM_INCREMENTER_9 9 /**< Metric Counter 0 Register Index */
+
+#define XAPM_METRIC_SET_0 0 /**< Write Transaction Count */
+#define XAPM_METRIC_SET_1 1 /**< Read Transaction Count */
+#define XAPM_METRIC_SET_2 2 /**< Write Byte Count */
+#define XAPM_METRIC_SET_3 3 /**< Read Byte Count */
+#define XAPM_METRIC_SET_4 4 /**< Write Beat Count */
+#define XAPM_METRIC_SET_5 5 /**< Total Read Latency */
+#define XAPM_METRIC_SET_6 6 /**< Total Write Latency */
+#define XAPM_METRIC_SET_7 7 /**< Slv_Wr_Idle_Cnt */
+#define XAPM_METRIC_SET_8 8 /**< Mst_Rd_Idle_Cnt */
+#define XAPM_METRIC_SET_9 9 /**< Num_BValids */
+#define XAPM_METRIC_SET_10 10 /**< Num_WLasts */
+#define XAPM_METRIC_SET_11 11 /**< Num_RLasts */
+#define XAPM_METRIC_SET_12 12 /**< Minimum Write Latency */
+#define XAPM_METRIC_SET_13 13 /**< Maximum Write Latency */
+#define XAPM_METRIC_SET_14 14 /**< Minimum Read Latency */
+#define XAPM_METRIC_SET_15 15 /**< Maximum Read Latency */
+#define XAPM_METRIC_SET_16 16 /**< Transfer Cycle Count */
+#define XAPM_METRIC_SET_17 17 /**< Packet Count */
+#define XAPM_METRIC_SET_18 18 /**< Data Byte Count */
+#define XAPM_METRIC_SET_19 19 /**< Position Byte Count */
+#define XAPM_METRIC_SET_20 20 /**< Null Byte Count */
+#define XAPM_METRIC_SET_21 21 /**< Slv_Idle_Cnt */
+#define XAPM_METRIC_SET_22 22 /**< Mst_Idle_Cnt */
+#define XAPM_METRIC_SET_30 30 /**< External event count */
+
+#define XAPM_MAX_AGENTS 8 /**< Maximum number of Agents */
+
+#define XAPM_FLAG_WRADDR 0x00000001 /**< Write Address flag */
+#define XAPM_FLAG_FIRSTWR 0x00000002 /**< First Write flag */
+#define XAPM_FLAG_LASTWR 0x00000004 /**< Last Write flag */
+#define XAPM_FLAG_RESPONSE 0x00000008 /**< Response flag */
+#define XAPM_FLAG_RDADDR 0x00000010 /**< Read Address flag */
+#define XAPM_FLAG_FIRSTRD 0x00000020 /**< First Read flag */
+#define XAPM_FLAG_LASTRD 0x00000040 /**< Last Read flag */
+#define XAPM_FLAG_SWDATA 0x00010000 /**< Software-written Data flag */
+#define XAPM_FLAG_EVENT 0x00020000 /**< Last Read flag */
+#define XAPM_FLAG_EVNTSTOP 0x00040000 /**< Last Read flag */
+#define XAPM_FLAG_EVNTSTART 0x00080000 /**< Last Read flag */
+#define XAPM_FLAG_GCCOVF 0x00100000 /**< Global Clock Counter Overflow
+ * flag */
+#define XAPM_FLAG_SCLAPSE 0x00200000 /**< Sample Counter Lapse flag */
+#define XAPM_FLAG_MC0 0x00400000 /**< Metric Counter 0 flag */
+#define XAPM_FLAG_MC1 0x00800000 /**< Metric Counter 1 flag */
+#define XAPM_FLAG_MC2 0x01000000 /**< Metric Counter 2 flag */
+#define XAPM_FLAG_MC3 0x02000000 /**< Metric Counter 3 flag */
+#define XAPM_FLAG_MC4 0x04000000 /**< Metric Counter 4 flag */
+#define XAPM_FLAG_MC5 0x08000000 /**< Metric Counter 5 flag */
+#define XAPM_FLAG_MC6 0x10000000 /**< Metric Counter 6 flag */
+#define XAPM_FLAG_MC7 0x20000000 /**< Metric Counter 7 flag */
+#define XAPM_FLAG_MC8 0x40000000 /**< Metric Counter 8 flag */
+#define XAPM_FLAG_MC9 0x80000000 /**< Metric Counter 9 flag */
+
+#define XAPM_LATENCY_ADDR_ISSUE 0 /**< Address Issue as start
+ point for Latency calculation*/
+#define XAPM_LATENCY_ADDR_ACCEPT 1 /**< Address Acceptance as start
+ point for Latency calculation*/
+#define XAPM_LATENCY_LASTRD 0 /**< Last Read as end point for
+ Latency calculation */
+#define XAPM_LATENCY_LASTWR 0 /**< Last Write as end point for
+ Latency calculation */
+#define XAPM_LATENCY_FIRSTRD 1 /**< First Read as end point for
+ Latency calculation */
+#define XAPM_LATENCY_FIRSTWR 1 /**< First Write as end point for
+ Latency calculation */
+
+#define XAPM_MODE_TRACE 2 /**< APM in Trace mode */
+
+#define XAPM_MODE_PROFILE 1 /**< APM in Profile mode */
+
+#define XAPM_MODE_ADVANCED 0 /**< APM in Advanced mode */
+
+typedef unsigned char u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef unsigned long ulong;
+
+ulong baseaddr;
+
+struct xapm_param {
+ u32 mode;
+ u32 maxslots;
+ u32 eventcnt;
+ u32 eventlog;
+ u32 sampledcnt;
+ u32 numcounters;
+ u32 metricwidth;
+ u32 sampledwidth;
+ u32 globalcntwidth;
+ u32 scalefactor;
+ u32 isr;
+ bool is_32bit_filter;
+};
+
+static struct xapm_param *params;
+
+/*****************************************************************************/
+/**
+*
+* Read a register of the AXI Performance Monitor device. This macro provides
+* register access to all registers using the register offsets defined above.
+*
+* @param baseaddr contains the base address of the device.
+* @param regoffset is the offset of the register to read.
+*
+* @return The contents of the register.
+*
+* @note C-style Signature:
+* u32 readreg(u32 baseaddr, u32 regoffset);
+*
+******************************************************************************/
+#define readreg(baseaddr, regoffset) \
+ (*(u32 *)(baseaddr + regoffset))
+
+/*****************************************************************************/
+/**
+*
+* Write a register of the AXI Performance Monitor device. This macro provides
+* register access to all registers using the register offsets defined above.
+*
+* @param baseaddr contains the base address of the device.
+* @param regoffset is the offset of the register to write.
+* @param data is the value to write to the register.
+*
+* @return None.
+*
+* @note C-style Signature:
+* void writereg(u32 baseaddr,
+* u32 regoffset,u32 Data)
+*
+******************************************************************************/
+#define writereg(baseaddr, regoffset, data) \
+ (*(u32 *)(baseaddr + regoffset) = data)
+
+/****************************************************************************/
+/**
+*
+* This routine enables the Global Interrupt.
+*
+* @note C-Style signature:
+* void intrglobalenable()
+*
+*****************************************************************************/
+#define intrglobalenable() \
+ writereg(baseaddr, XAPM_GIE_OFFSET, 1)
+
+
+/****************************************************************************/
+/**
+*
+* This routine disables the Global Interrupt.
+*
+* @note C-Style signature:
+* void intrglobaldisable(void)
+*
+*****************************************************************************/
+#define intrglobaldisable() \
+ writereg(baseaddr, XAPM_GIE_OFFSET, 0)
+
+/****************************************************************************/
+/**
+*
+* This routine enables interrupt(s). Use the XAPM_IXR_* constants defined in
+* xaxipmon_hw.h to create the bit-mask to enable interrupts.
+*
+* @param mask is the mask to enable. Bit positions of 1 will be enabled.
+* Bit positions of 0 will keep the previous setting. This mask is
+* formed by OR'ing XAPM_IXR__* bits defined in xaxipmon_hw.h.
+*
+* @return None.
+*
+* @note C-Style signature:
+* void intrenable(u32 mask)
+*
+*****************************************************************************/
+#define intrenable(mask) \
+ writereg(baseaddr, XAPM_IE_OFFSET, readreg(baseaddr, \
+ XAPM_IE_OFFSET) | mask);
+
+
+/****************************************************************************/
+/**
+*
+* This routine disable interrupt(s). Use the XAPM_IXR_* constants defined in
+* xaxipmon_hw.h to create the bit-mask to disable interrupts.
+*
+* @param mask is the mask to disable. Bit positions of 1 will be
+* disabled. Bit positions of 0 will keep the previous setting.
+* This mask is formed by OR'ing XAPM_IXR_* bits defined in
+* xaxipmon_hw.h.
+*
+* @return None.
+*
+* @note C-Style signature:
+* void intrdisable(u32 mask)
+*
+*****************************************************************************/
+#define intrdisable(mask) \
+ writereg(baseaddr, XAPM_IE_OFFSET, readreg(baseaddr, \
+ XAPM_IE_OFFSET) | mask);
+
+/****************************************************************************/
+/**
+*
+* This routine clears the specified interrupt(s).
+*
+* @param mask is the mask to clear. Bit positions of 1 will be cleared.
+* This mask is formed by OR'ing XAPM_IXR_* bits defined in
+* xaxipmon_hw.h.
+*
+* @return None.
+*
+* @note C-Style signature:
+* void intrclear(u32 mask)
+*
+*****************************************************************************/
+#define intrclear(mask) \
+ writereg(baseaddr, XAPM_IS_OFFSET, readreg(baseaddr, \
+ XAPM_IS_OFFSET) | mask);
+
+/****************************************************************************/
+/**
+*
+* This routine returns the Interrupt Status Register.
+*
+* @return isr value updated by kernel driver
+*
+* @note This macro returns isr value updated by kernel driver.
+* C-Style signature:
+* void intrgetstatus(void)
+*
+*****************************************************************************/
+#define intrgetstatus() (params->isr)
+
+/****************************************************************************/
+/**
+*
+* This routine returns the Interrupt Status Register.
+*
+* @return Interrupt Status Register contents
+*
+* @note C-Style signature:
+* void intrhwgetstatus(void)
+*
+*****************************************************************************/
+#define intrhwgetstatus() (params->isr)
+
+/****************************************************************************/
+/**
+*
+* This function enables the Global Clock Counter.
+*
+* @note C-Style signature:
+* void enablegcc(void);
+*
+*****************************************************************************/
+#define enablegcc() \
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr, \
+ XAPM_CTL_OFFSET) | XAPM_CR_GCC_ENABLE_MASK);
+
+/****************************************************************************/
+/**
+*
+* This function disbles the Global Clock Counter.
+*
+* @note C-Style signature:
+* void disablegcc(void);
+*
+*****************************************************************************/
+#define disablegcc() \
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr, \
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_GCC_ENABLE_MASK));
+
+/****************************************************************************/
+/**
+*
+* This function enables the specified flag in flag Control Register.
+*
+* @param flag is one of the XAPM_FLAG_* masks defined in xaxipmon.h
+*
+* @return None
+*
+* @note C-Style signature:
+* void enableflag(void);
+*
+*****************************************************************************/
+#define enableflag(flag) \
+ writereg(baseaddr, XAPM_FEC_OFFSET, \
+ readreg(baseaddr, XAPM_FEC_OFFSET) | flag);
+
+/****************************************************************************/
+/**
+*
+* This function disables the specified flag in flag Control Register.
+*
+* @param flag is one of the XAPM_FLAG_* masks defined in xaxipmon.h*
+* @return None
+*
+* @note C-Style signature:
+* void disableflag(void);
+*
+*****************************************************************************/
+#define disableflag(flag) \
+ writereg(baseaddr, XAPM_FEC_OFFSET, \
+ readreg(baseaddr, XAPM_FEC_OFFSET) & ~(flag));
+
+/****************************************************************************/
+/**
+*
+* This function loads the sample interval register value into the sample
+* interval counter.
+*
+* @note C-Style signature:
+* void loadsic(void);
+*
+*****************************************************************************/
+#define loadsic() \
+ writereg(baseaddr, XAPM_SICR_OFFSET, XAPM_SICR_LOAD_MASK)
+
+
+/****************************************************************************/
+/**
+*
+* This enables the down count of the sample interval counter.
+*
+* @note C-Style signature:
+* void enablesic(void);
+*
+*****************************************************************************/
+#define enablesic() \
+ writereg(baseaddr, XAPM_SICR_OFFSET, XAPM_SICR_ENABLE_MASK)
+
+/****************************************************************************/
+/**
+*
+* This disables the down count of the sample interval counter.
+*
+* @note C-Style signature:
+* void disablesic(void);
+*
+*****************************************************************************/
+#define disablesic() \
+ writereg(baseaddr, XAPM_SICR_OFFSET, \
+ readreg(baseaddr, XAPM_SICR_OFFSET) & ~(XAPM_SICR_ENABLE_MASK));
+
+/****************************************************************************/
+/**
+*
+* This enables Reset of Metric Counters when Sample Interval Counter lapses.
+*
+* @note C-Style signature:
+* void enablemcreset(void);
+*
+*****************************************************************************/
+#define enablemcreset() \
+ writereg(baseaddr, XAPM_SICR_OFFSET, XAPM_SICR_MCNTR_RST_MASK);
+
+/****************************************************************************/
+/**
+*
+* This disables the down count of the sample interval counter.
+*
+* @note C-Style signature:
+* void disablemcreset(void);
+*
+*****************************************************************************/
+#define disablemcreset() \
+ writereg(baseaddr, XAPM_SICR_OFFSET, \
+ readreg(baseaddr, XAPM_SICR_OFFSET) & ~(XAPM_SICR_MCNTR_RST_MASK));
+
+/****************************************************************************/
+/**
+*
+* This function enables the ID Filter Masking.
+*
+* @note C-Style signature:
+* void enableidfilter(void);
+*
+*****************************************************************************/
+#define enableidfilter() \
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr, \
+ XAPM_CTL_OFFSET) | XAPM_CR_IDFILTER_ENABLE_MASK);
+
+/****************************************************************************/
+/**
+*
+* This function disbles the ID Filter masking.
+*
+* @note C-Style signature:
+* void disableidfilter(void);
+*
+*****************************************************************************/
+#define disableidfilter() \
+ writereg(baseaddr, XAPM_CTL_OFFSET, readreg(baseaddr, \
+ XAPM_CTL_OFFSET) & ~(XAPM_CR_IDFILTER_ENABLE_MASK));
+
+/****************************************************************************/
+/**
+*
+* This function samples Metric Counters to Sampled Metric Counters by
+* reading Sample Register and also returns interval. i.e. the number of
+* clocks in between previous read to the current read of sample register.
+*
+* @return Interval. i.e. the number of clocks in between previous
+* read to the current read of sample register.
+*
+* @note C-Style signature:
+* u32 samplemetrics(void);
+*
+*****************************************************************************/
+#define samplemetrics() readreg(baseaddr, XAPM_SR_OFFSET);
+
+
+/************************** Function Prototypes *****************************/
+
+int resetmetriccounter(void);
+
+void resetglobalclkcounter(void);
+
+int resetfifo(void);
+
+void setincrementerrange(u8 incrementer, u16 rangehigh, u16 rangelow);
+
+void getincrementerrange(u8 incrementer, u16 *rangehigh, u16 *rangelow);
+
+void setsampleinterval(u32 sampleinterval);
+
+void getsampleinterval(u32 *sampleinterval);
+
+int setmetrics(u8 slot, u8 metrics, u8 counter);
+
+int getmetrics(u8 counter, u8 *metrics, u8 *slot);
+void getglobalclkcounter(u32 *cnthigh, u32 *cntlow);
+
+u32 getmetriccounter(u32 counter);
+
+u32 getsampledmetriccounter(u32 counter);
+
+u32 getincrementer(u32 incrementer);
+
+u32 getsampledincrementer(u32 incrementer);
+
+void setswdatareg(u32 swdata);
+
+u32 getswdatareg(void);
+
+int starteventlog(u32 flagenables);
+
+int stopeventlog(void);
+
+int startcounters(u32 sampleinterval);
+
+int stopcounters(void);
+
+void enablemetricscounter(void);
+
+void disablemetricscounter(void);
+
+void setlogenableranges(u32 counter, u16 rangehigh, u16 rangelow);
+
+void getlogenableranges(u32 counter, u16 *rangehigh, u16 *rangelow);
+
+void enableeventlog(void);
+
+void enablemctrigger(void);
+
+void disablemctrigger(void);
+
+void enableeventlogtrigger(void);
+
+void disableeventlogtrigger(void);
+
+const char *getmetricname(u8 metrics);
+
+void setwriteid(u32 writeid);
+
+void setreadid(u32 readid);
+
+u32 getwriteid(void);
+
+u32 getreadid(void);
+
+void setwrlatencystart(u8 param);
+
+void setwrlatencyend(u8 param);
+
+void setrdlatencystart(u8 param);
+
+void setrdlatencyend(u8 param);
+
+u8 getwrlatencystart(void);
+
+u8 getwrlatencyend(void);
+
+u8 getrdlatencystart(void);
+
+u8 getrdlatencyend(void);
+
+void setwriteidmask(u32 wrmask);
+
+void setreadidmask(u32 rdmask);
+
+u32 getwriteidmask(void);
+
+u32 getreadidmask(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* End of protection macro. */