Char/Misc driver patches for 3.19-rc1
Here's the big char/misc driver update for 3.19-rc1 Lots of little things all over the place in different drivers, and a new subsystem, "coresight" has been added. Full details are in the shortlog. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlSODosACgkQMUfUDdst+ykSNwCfcqx1Z3rQzbLwSrR2sa1fV3Zb yEAAniJoLZ4ZkoQK4/1ozsFc31q+gXNm =/epr -----END PGP SIGNATURE----- Merge tag 'char-misc-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc driver updates from Greg KH: "Here's the big char/misc driver update for 3.19-rc1 Lots of little things all over the place in different drivers, and a new subsystem, "coresight" has been added. Full details are in the shortlog" * tag 'char-misc-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (73 commits) parport: parport_pc, do not remove parent devices early spmi: Remove shutdown/suspend/resume kernel-doc carma-fpga-program: drop videobuf dependency carma-fpga: drop videobuf dependency carma-fpga-program.c: fix compile errors i8k: Fix temperature bug handling in i8k_get_temp() cxl: Name interrupts in /proc/interrupt CXL: Return error to PSL if IRQ demultiplexing fails & print clearer warning coresight-replicator: remove .owner field for driver coresight: fixed comments in coresight.h coresight: fix typo in comment in coresight-priv.h coresight: bindings for coresight drivers coresight: Adding ABI documentation w1: support auto-load of w1_bq27000 module. w1: avoid potential u16 overflow cn: verify msg->len before making callback mei: export fw status registers through sysfs mei: read and print all six FW status registers mei: txe: add cherrytrail device id mei: kill cached host and me csr values ...
This commit is contained in:
commit
6ae840e7cc
93 changed files with 9174 additions and 1177 deletions
24
Documentation/ABI/testing/sysfs-bus-coresight-devices-etb10
Normal file
24
Documentation/ABI/testing/sysfs-bus-coresight-devices-etb10
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
What: /sys/bus/coresight/devices/<memory_map>.etb/enable_sink
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Add/remove a sink from a trace path. There can be multiple
|
||||
source for a single sink.
|
||||
ex: echo 1 > /sys/bus/coresight/devices/20010000.etb/enable_sink
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.etb/status
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) List various control and status registers. The specific
|
||||
layout and content is driver specific.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.etb/trigger_cntr
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Disables write access to the Trace RAM by stopping the
|
||||
formatter after a defined number of words have been stored
|
||||
following the trigger event. The number of 32-bit words written
|
||||
into the Trace RAM following the trigger event is equal to the
|
||||
value stored in this register+1 (from ARM ETB-TRM).
|
||||
253
Documentation/ABI/testing/sysfs-bus-coresight-devices-etm3x
Normal file
253
Documentation/ABI/testing/sysfs-bus-coresight-devices-etm3x
Normal file
|
|
@ -0,0 +1,253 @@
|
|||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/enable_source
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Enable/disable tracing on this specific trace entiry.
|
||||
Enabling a source implies the source has been configured
|
||||
properly and a sink has been identidifed for it. The path
|
||||
of coresight components linking the source to the sink is
|
||||
configured and managed automatically by the coresight framework.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/status
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) List various control and status registers. The specific
|
||||
layout and content is driver specific.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_idx
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: Select which address comparator or pair (of comparators) to
|
||||
work with.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_acctype
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with @addr_idx. Specifies
|
||||
characteristics about the address comparator being configure,
|
||||
for example the access type, the kind of instruction to trace,
|
||||
processor contect ID to trigger on, etc. Individual fields in
|
||||
the access type register may vary on the version of the trace
|
||||
entity.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_range
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with @addr_idx. Specifies the range of
|
||||
addresses to trigger on. Inclusion or exclusion is specificed
|
||||
in the corresponding access type register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_single
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with @addr_idx. Specifies the single
|
||||
address to trigger on, highly influenced by the configuration
|
||||
options of the corresponding access type register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_start
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with @addr_idx. Specifies the single
|
||||
address to start tracing on, highly influenced by the
|
||||
configuration options of the corresponding access type register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/addr_stop
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with @addr_idx. Specifies the single
|
||||
address to stop tracing on, highly influenced by the
|
||||
configuration options of the corresponding access type register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/cntr_idx
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Specifies the counter to work on.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/cntr_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with cntr_idx, give access to the
|
||||
counter event register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/cntr_val
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with cntr_idx, give access to the
|
||||
counter value register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/cntr_rld_val
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with cntr_idx, give access to the
|
||||
counter reload value register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/cntr_rld_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used in conjunction with cntr_idx, give access to the
|
||||
counter reload event register.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/ctxid_idx
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Specifies the index of the context ID register to be
|
||||
selected.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/ctxid_mask
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Mask to apply to all the context ID comparator.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/ctxid_val
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Used with the ctxid_idx, specify with context ID to trigger
|
||||
on.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/enable_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines which event triggers a trace.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/etmsr
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Gives access to the ETM status register, which holds
|
||||
programming information and status on certains events.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/fifofull_level
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Number of byte left in the fifo before considering it full.
|
||||
Depending on the tracer's version, can also hold threshold for
|
||||
data suppression.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/mode
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Interface with the driver's 'mode' field, controlling
|
||||
various aspect of the trace entity such as time stamping,
|
||||
context ID size and cycle accurate tracing. Driver specific
|
||||
and bound to change depending on the driver.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/nr_addr_cmp
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) Provides the number of address comparators pairs accessible
|
||||
on a trace unit, as specified by bit 3:0 of register ETMCCR.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/nr_cntr
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) Provides the number of counters accessible on a trace unit,
|
||||
as specified by bit 15:13 of register ETMCCR.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/nr_ctxid_cmp
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) Provides the number of context ID comparator available on a
|
||||
trace unit, as specified by bit 25:24 of register ETMCCR.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/reset
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (W) Cancels all configuration on a trace unit and set it back
|
||||
to its boot configuration.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_12_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 1 to state 2.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_13_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 1 to state 3.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_21_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 2 to state 1.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_23_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 2 to state 3.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_31_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 3 to state 1.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/seq_32_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines the event that causes the sequencer to transition
|
||||
from state 3 to state 2.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/curr_seq_state
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (R) Holds the current state of the sequencer.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/sync_freq
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Holds the trace synchronization frequency value - must be
|
||||
programmed with the various implementation behavior in mind.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/timestamp_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines an event that requests the insertion of a timestamp
|
||||
into the trace stream.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/traceid
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Holds the trace ID that will appear in the trace stream
|
||||
coming from this trace entity.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.[etm|ptm]/trigger_event
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Define the event that controls the trigger.
|
||||
12
Documentation/ABI/testing/sysfs-bus-coresight-devices-funnel
Normal file
12
Documentation/ABI/testing/sysfs-bus-coresight-devices-funnel
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
What: /sys/bus/coresight/devices/<memory_map>.funnel/funnel_ctrl
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Enables the slave ports and defines the hold time of the
|
||||
slave ports.
|
||||
|
||||
What: /sys/bus/coresight/devices/<memory_map>.funnel/priority
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Defines input port priority order.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
What: /sys/bus/coresight/devices/<memory_map>.tmc/trigger_cntr
|
||||
Date: November 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Description: (RW) Disables write access to the Trace RAM by stopping the
|
||||
formatter after a defined number of words have been stored
|
||||
following the trigger event. Additional interface for this
|
||||
driver are expected to be added as it matures.
|
||||
|
|
@ -540,7 +540,7 @@ appears in sysfs.
|
|||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>unsigned long size</varname>: Fill in the size of the
|
||||
<varname>resource_size_t size</varname>: Fill in the size of the
|
||||
memory block that <varname>addr</varname> points to. If <varname>size</varname>
|
||||
is zero, the mapping is considered unused. Note that you
|
||||
<emphasis>must</emphasis> initialize <varname>size</varname> with zero for
|
||||
|
|
|
|||
204
Documentation/devicetree/bindings/arm/coresight.txt
Normal file
204
Documentation/devicetree/bindings/arm/coresight.txt
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
* CoreSight Components:
|
||||
|
||||
CoreSight components are compliant with the ARM CoreSight architecture
|
||||
specification and can be connected in various topologies to suit a particular
|
||||
SoCs tracing needs. These trace components can generally be classified as
|
||||
sinks, links and sources. Trace data produced by one or more sources flows
|
||||
through the intermediate links connecting the source to the currently selected
|
||||
sink. Each CoreSight component device should use these properties to describe
|
||||
its hardware characteristcs.
|
||||
|
||||
* Required properties for all components *except* non-configurable replicators:
|
||||
|
||||
* compatible: These have to be supplemented with "arm,primecell" as
|
||||
drivers are using the AMBA bus interface. Possible values include:
|
||||
- "arm,coresight-etb10", "arm,primecell";
|
||||
- "arm,coresight-tpiu", "arm,primecell";
|
||||
- "arm,coresight-tmc", "arm,primecell";
|
||||
- "arm,coresight-funnel", "arm,primecell";
|
||||
- "arm,coresight-etm3x", "arm,primecell";
|
||||
|
||||
* reg: physical base address and length of the register
|
||||
set(s) of the component.
|
||||
|
||||
* clocks: the clock associated to this component.
|
||||
|
||||
* clock-names: the name of the clock as referenced by the code.
|
||||
Since we are using the AMBA framework, the name should be
|
||||
"apb_pclk".
|
||||
|
||||
* port or ports: The representation of the component's port
|
||||
layout using the generic DT graph presentation found in
|
||||
"bindings/graph.txt".
|
||||
|
||||
* Required properties for devices that don't show up on the AMBA bus, such as
|
||||
non-configurable replicators:
|
||||
|
||||
* compatible: Currently supported value is (note the absence of the
|
||||
AMBA markee):
|
||||
- "arm,coresight-replicator"
|
||||
|
||||
* id: a unique number that will identify this replicator.
|
||||
|
||||
* port or ports: same as above.
|
||||
|
||||
* Optional properties for ETM/PTMs:
|
||||
|
||||
* arm,cp14: must be present if the system accesses ETM/PTM management
|
||||
registers via co-processor 14.
|
||||
|
||||
* cpu: the cpu phandle this ETM/PTM is affined to. When omitted the
|
||||
source is considered to belong to CPU0.
|
||||
|
||||
* Optional property for TMC:
|
||||
|
||||
* arm,buffer-size: size of contiguous buffer space for TMC ETR
|
||||
(embedded trace router)
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
1. Sinks
|
||||
etb@20010000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0x20010000 0 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
tpiu@20030000 {
|
||||
compatible = "arm,coresight-tpiu", "arm,primecell";
|
||||
reg = <0 0x20030000 0 0x1000>;
|
||||
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
tpiu_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator_out_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
2. Links
|
||||
replicator {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
/* this will show up in debugfs as "0.replicator" */
|
||||
id = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator_out_port0: endpoint {
|
||||
remote-endpoint = <&etb_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator_out_port1: endpoint {
|
||||
remote-endpoint = <&tpiu_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@20040000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0x20040000 0 0x1000>;
|
||||
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm0_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm1_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm0_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
3. Sources
|
||||
ptm@2201c000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2201c000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu0>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
ptm0_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@2201d000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2201d000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu1>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
ptm1_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
299
Documentation/trace/coresight.txt
Normal file
299
Documentation/trace/coresight.txt
Normal file
|
|
@ -0,0 +1,299 @@
|
|||
Coresight - HW Assisted Tracing on ARM
|
||||
======================================
|
||||
|
||||
Author: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
Date: September 11th, 2014
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
Coresight is an umbrella of technologies allowing for the debugging of ARM
|
||||
based SoC. It includes solutions for JTAG and HW assisted tracing. This
|
||||
document is concerned with the latter.
|
||||
|
||||
HW assisted tracing is becoming increasingly useful when dealing with systems
|
||||
that have many SoCs and other components like GPU and DMA engines. ARM has
|
||||
developed a HW assisted tracing solution by means of different components, each
|
||||
being added to a design at systhesis time to cater to specific tracing needs.
|
||||
Compoments are generally categorised as source, link and sinks and are
|
||||
(usually) discovered using the AMBA bus.
|
||||
|
||||
"Sources" generate a compressed stream representing the processor instruction
|
||||
path based on tracing scenarios as configured by users. From there the stream
|
||||
flows through the coresight system (via ATB bus) using links that are connecting
|
||||
the emanating source to a sink(s). Sinks serve as endpoints to the coresight
|
||||
implementation, either storing the compressed stream in a memory buffer or
|
||||
creating an interface to the outside world where data can be transferred to a
|
||||
host without fear of filling up the onboard coresight memory buffer.
|
||||
|
||||
At typical coresight system would look like this:
|
||||
|
||||
*****************************************************************
|
||||
**************************** AMBA AXI ****************************===||
|
||||
***************************************************************** ||
|
||||
^ ^ | ||
|
||||
| | * **
|
||||
0000000 ::::: 0000000 ::::: ::::: @@@@@@@ ||||||||||||
|
||||
0 CPU 0<-->: C : 0 CPU 0<-->: C : : C : @ STM @ || System ||
|
||||
|->0000000 : T : |->0000000 : T : : T :<--->@@@@@ || Memory ||
|
||||
| #######<-->: I : | #######<-->: I : : I : @@@<-| ||||||||||||
|
||||
| # ETM # ::::: | # PTM # ::::: ::::: @ |
|
||||
| ##### ^ ^ | ##### ^ ! ^ ! . | |||||||||
|
||||
| |->### | ! | |->### | ! | ! . | || DAP ||
|
||||
| | # | ! | | # | ! | ! . | |||||||||
|
||||
| | . | ! | | . | ! | ! . | | |
|
||||
| | . | ! | | . | ! | ! . | | *
|
||||
| | . | ! | | . | ! | ! . | | SWD/
|
||||
| | . | ! | | . | ! | ! . | | JTAG
|
||||
*****************************************************************<-|
|
||||
*************************** AMBA Debug ABP ************************
|
||||
*****************************************************************
|
||||
| . ! . ! ! . |
|
||||
| . * . * * . |
|
||||
*****************************************************************
|
||||
******************** Cross Trigger Matrix (CTM) *******************
|
||||
*****************************************************************
|
||||
| . ^ . . |
|
||||
| * ! * * |
|
||||
*****************************************************************
|
||||
****************** AMBA Advanced Trace Bus (ATB) ******************
|
||||
*****************************************************************
|
||||
| ! =============== |
|
||||
| * ===== F =====<---------|
|
||||
| ::::::::: ==== U ====
|
||||
|-->:: CTI ::<!! === N ===
|
||||
| ::::::::: ! == N ==
|
||||
| ^ * == E ==
|
||||
| ! &&&&&&&&& IIIIIII == L ==
|
||||
|------>&& ETB &&<......II I =======
|
||||
| ! &&&&&&&&& II I .
|
||||
| ! I I .
|
||||
| ! I REP I<..........
|
||||
| ! I I
|
||||
| !!>&&&&&&&&& II I *Source: ARM ltd.
|
||||
|------>& TPIU &<......II I DAP = Debug Access Port
|
||||
&&&&&&&&& IIIIIII ETM = Embedded Trace Macrocell
|
||||
; PTM = Program Trace Macrocell
|
||||
; CTI = Cross Trigger Interface
|
||||
* ETB = Embedded Trace Buffer
|
||||
To trace port TPIU= Trace Port Interface Unit
|
||||
SWD = Serial Wire Debug
|
||||
|
||||
While on target configuration of the components is done via the ABP bus,
|
||||
all trace data are carried out-of-band on the ATB bus. The CTM provides
|
||||
a way to aggregate and distribute signals between CoreSight components.
|
||||
|
||||
The coresight framework provides a central point to represent, configure and
|
||||
manage coresight devices on a platform. This first implementation centers on
|
||||
the basic tracing functionality, enabling components such ETM/PTM, funnel,
|
||||
replicator, TMC, TPIU and ETB. Future work will enable more
|
||||
intricate IP blocks such as STM and CTI.
|
||||
|
||||
|
||||
Acronyms and Classification
|
||||
---------------------------
|
||||
|
||||
Acronyms:
|
||||
|
||||
PTM: Program Trace Macrocell
|
||||
ETM: Embedded Trace Macrocell
|
||||
STM: System trace Macrocell
|
||||
ETB: Embedded Trace Buffer
|
||||
ITM: Instrumentation Trace Macrocell
|
||||
TPIU: Trace Port Interface Unit
|
||||
TMC-ETR: Trace Memory Controller, configured as Embedded Trace Router
|
||||
TMC-ETF: Trace Memory Controller, configured as Embedded Trace FIFO
|
||||
CTI: Cross Trigger Interface
|
||||
|
||||
Classification:
|
||||
|
||||
Source:
|
||||
ETMv3.x ETMv4, PTMv1.0, PTMv1.1, STM, STM500, ITM
|
||||
Link:
|
||||
Funnel, replicator (intelligent or not), TMC-ETR
|
||||
Sinks:
|
||||
ETBv1.0, ETB1.1, TPIU, TMC-ETF
|
||||
Misc:
|
||||
CTI
|
||||
|
||||
|
||||
Device Tree Bindings
|
||||
----------------------
|
||||
|
||||
See Documentation/devicetree/bindings/arm/coresight.txt for details.
|
||||
|
||||
As of this writing drivers for ITM, STMs and CTIs are not provided but are
|
||||
expected to be added as the solution matures.
|
||||
|
||||
|
||||
Framework and implementation
|
||||
----------------------------
|
||||
|
||||
The coresight framework provides a central point to represent, configure and
|
||||
manage coresight devices on a platform. Any coresight compliant device can
|
||||
register with the framework for as long as they use the right APIs:
|
||||
|
||||
struct coresight_device *coresight_register(struct coresight_desc *desc);
|
||||
void coresight_unregister(struct coresight_device *csdev);
|
||||
|
||||
The registering function is taking a "struct coresight_device *csdev" and
|
||||
register the device with the core framework. The unregister function takes
|
||||
a reference to a "strut coresight_device", obtained at registration time.
|
||||
|
||||
If everything goes well during the registration process the new devices will
|
||||
show up under /sys/bus/coresight/devices, as showns here for a TC2 platform:
|
||||
|
||||
root:~# ls /sys/bus/coresight/devices/
|
||||
replicator 20030000.tpiu 2201c000.ptm 2203c000.etm 2203e000.etm
|
||||
20010000.etb 20040000.funnel 2201d000.ptm 2203d000.etm
|
||||
root:~#
|
||||
|
||||
The functions take a "struct coresight_device", which looks like this:
|
||||
|
||||
struct coresight_desc {
|
||||
enum coresight_dev_type type;
|
||||
struct coresight_dev_subtype subtype;
|
||||
const struct coresight_ops *ops;
|
||||
struct coresight_platform_data *pdata;
|
||||
struct device *dev;
|
||||
const struct attribute_group **groups;
|
||||
};
|
||||
|
||||
|
||||
The "coresight_dev_type" identifies what the device is, i.e, source link or
|
||||
sink while the "coresight_dev_subtype" will characterise that type further.
|
||||
|
||||
The "struct coresight_ops" is mandatory and will tell the framework how to
|
||||
perform base operations related to the components, each component having
|
||||
a different set of requirement. For that "struct coresight_ops_sink",
|
||||
"struct coresight_ops_link" and "struct coresight_ops_source" have been
|
||||
provided.
|
||||
|
||||
The next field, "struct coresight_platform_data *pdata" is acquired by calling
|
||||
"of_get_coresight_platform_data()", as part of the driver's _probe routine and
|
||||
"struct device *dev" gets the device reference embedded in the "amba_device":
|
||||
|
||||
static int etm_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
{
|
||||
...
|
||||
...
|
||||
drvdata->dev = &adev->dev;
|
||||
...
|
||||
}
|
||||
|
||||
Specific class of device (source, link, or sink) have generic operations
|
||||
that can be performed on them (see "struct coresight_ops"). The
|
||||
"**groups" is a list of sysfs entries pertaining to operations
|
||||
specific to that component only. "Implementation defined" customisations are
|
||||
expected to be accessed and controlled using those entries.
|
||||
|
||||
Last but not least, "struct module *owner" is expected to be set to reflect
|
||||
the information carried in "THIS_MODULE".
|
||||
|
||||
How to use
|
||||
----------
|
||||
|
||||
Before trace collection can start, a coresight sink needs to be identify.
|
||||
There is no limit on the amount of sinks (nor sources) that can be enabled at
|
||||
any given moment. As a generic operation, all device pertaining to the sink
|
||||
class will have an "active" entry in sysfs:
|
||||
|
||||
root:/sys/bus/coresight/devices# ls
|
||||
replicator 20030000.tpiu 2201c000.ptm 2203c000.etm 2203e000.etm
|
||||
20010000.etb 20040000.funnel 2201d000.ptm 2203d000.etm
|
||||
root:/sys/bus/coresight/devices# ls 20010000.etb
|
||||
enable_sink status trigger_cntr
|
||||
root:/sys/bus/coresight/devices# echo 1 > 20010000.etb/enable_sink
|
||||
root:/sys/bus/coresight/devices# cat 20010000.etb/enable_sink
|
||||
1
|
||||
root:/sys/bus/coresight/devices#
|
||||
|
||||
At boot time the current etm3x driver will configure the first address
|
||||
comparator with "_stext" and "_etext", essentially tracing any instruction
|
||||
that falls within that range. As such "enabling" a source will immediately
|
||||
trigger a trace capture:
|
||||
|
||||
root:/sys/bus/coresight/devices# echo 1 > 2201c000.ptm/enable_source
|
||||
root:/sys/bus/coresight/devices# cat 2201c000.ptm/enable_source
|
||||
1
|
||||
root:/sys/bus/coresight/devices# cat 20010000.etb/status
|
||||
Depth: 0x2000
|
||||
Status: 0x1
|
||||
RAM read ptr: 0x0
|
||||
RAM wrt ptr: 0x19d3 <----- The write pointer is moving
|
||||
Trigger cnt: 0x0
|
||||
Control: 0x1
|
||||
Flush status: 0x0
|
||||
Flush ctrl: 0x2001
|
||||
root:/sys/bus/coresight/devices#
|
||||
|
||||
Trace collection is stopped the same way:
|
||||
|
||||
root:/sys/bus/coresight/devices# echo 0 > 2201c000.ptm/enable_source
|
||||
root:/sys/bus/coresight/devices#
|
||||
|
||||
The content of the ETB buffer can be harvested directly from /dev:
|
||||
|
||||
root:/sys/bus/coresight/devices# dd if=/dev/20010000.etb \
|
||||
of=~/cstrace.bin
|
||||
|
||||
64+0 records in
|
||||
64+0 records out
|
||||
32768 bytes (33 kB) copied, 0.00125258 s, 26.2 MB/s
|
||||
root:/sys/bus/coresight/devices#
|
||||
|
||||
The file cstrace.bin can be decompressed using "ptm2human", DS-5 or Trace32.
|
||||
|
||||
Following is a DS-5 output of an experimental loop that increments a variable up
|
||||
to a certain value. The example is simple and yet provides a glimpse of the
|
||||
wealth of possibilities that coresight provides.
|
||||
|
||||
Info Tracing enabled
|
||||
Instruction 106378866 0x8026B53C E52DE004 false PUSH {lr}
|
||||
Instruction 0 0x8026B540 E24DD00C false SUB sp,sp,#0xc
|
||||
Instruction 0 0x8026B544 E3A03000 false MOV r3,#0
|
||||
Instruction 0 0x8026B548 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Timestamp Timestamp: 17106715833
|
||||
Instruction 319 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Instruction 9 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Instruction 7 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Instruction 7 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Instruction 10 0x8026B54C E59D3004 false LDR r3,[sp,#4]
|
||||
Instruction 0 0x8026B550 E3530004 false CMP r3,#4
|
||||
Instruction 0 0x8026B554 E2833001 false ADD r3,r3,#1
|
||||
Instruction 0 0x8026B558 E58D3004 false STR r3,[sp,#4]
|
||||
Instruction 0 0x8026B55C DAFFFFFA true BLE {pc}-0x10 ; 0x8026b54c
|
||||
Instruction 6 0x8026B560 EE1D3F30 false MRC p15,#0x0,r3,c13,c0,#1
|
||||
Instruction 0 0x8026B564 E1A0100D false MOV r1,sp
|
||||
Instruction 0 0x8026B568 E3C12D7F false BIC r2,r1,#0x1fc0
|
||||
Instruction 0 0x8026B56C E3C2203F false BIC r2,r2,#0x3f
|
||||
Instruction 0 0x8026B570 E59D1004 false LDR r1,[sp,#4]
|
||||
Instruction 0 0x8026B574 E59F0010 false LDR r0,[pc,#16] ; [0x8026B58C] = 0x80550368
|
||||
Instruction 0 0x8026B578 E592200C false LDR r2,[r2,#0xc]
|
||||
Instruction 0 0x8026B57C E59221D0 false LDR r2,[r2,#0x1d0]
|
||||
Instruction 0 0x8026B580 EB07A4CF true BL {pc}+0x1e9344 ; 0x804548c4
|
||||
Info Tracing enabled
|
||||
Instruction 13570831 0x8026B584 E28DD00C false ADD sp,sp,#0xc
|
||||
Instruction 0 0x8026B588 E8BD8000 true LDM sp!,{pc}
|
||||
Timestamp Timestamp: 17107041535
|
||||
|
|
@ -920,6 +920,15 @@ M: Hubert Feurstein <hubert.feurstein@contec.at>
|
|||
S: Maintained
|
||||
F: arch/arm/mach-ep93xx/micro9.c
|
||||
|
||||
ARM/CORESIGHT FRAMEWORK AND DRIVERS
|
||||
M: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/coresight/*
|
||||
F: Documentation/trace/coresight.txt
|
||||
F: Documentation/devicetree/bindings/arm/coresight.txt
|
||||
F: Documentation/ABI/testing/sysfs-bus-coresight-devices-*
|
||||
|
||||
ARM/CORGI MACHINE SUPPORT
|
||||
M: Richard Purdie <rpurdie@rpsys.net>
|
||||
S: Maintained
|
||||
|
|
|
|||
|
|
@ -1452,14 +1452,6 @@ config EARLY_PRINTK
|
|||
kernel low-level debugging functions. Add earlyprintk to your
|
||||
kernel parameters to enable this console.
|
||||
|
||||
config OC_ETM
|
||||
bool "On-chip ETM and ETB"
|
||||
depends on ARM_AMBA
|
||||
help
|
||||
Enables the on-chip embedded trace macrocell and embedded trace
|
||||
buffer driver that will allow you to collect traces of the
|
||||
kernel code.
|
||||
|
||||
config ARM_KPROBES_TEST
|
||||
tristate "Kprobes test module"
|
||||
depends on KPROBES && MODULES
|
||||
|
|
@ -1486,4 +1478,59 @@ config DEBUG_SET_MODULE_RONX
|
|||
against certain classes of kernel exploits.
|
||||
If in doubt, say "N".
|
||||
|
||||
menuconfig CORESIGHT
|
||||
bool "CoreSight Tracing Support"
|
||||
select ARM_AMBA
|
||||
help
|
||||
This framework provides a kernel interface for the CoreSight debug
|
||||
and trace drivers to register themselves with. It's intended to build
|
||||
a topological view of the CoreSight components based on a DT
|
||||
specification and configure the right serie of components when a
|
||||
trace source gets enabled.
|
||||
|
||||
if CORESIGHT
|
||||
config CORESIGHT_LINKS_AND_SINKS
|
||||
bool "CoreSight Link and Sink drivers"
|
||||
help
|
||||
This enables support for CoreSight link and sink drivers that are
|
||||
responsible for transporting and collecting the trace data
|
||||
respectively. Link and sinks are dynamically aggregated with a trace
|
||||
entity at run time to form a complete trace path.
|
||||
|
||||
config CORESIGHT_LINK_AND_SINK_TMC
|
||||
bool "Coresight generic TMC driver"
|
||||
depends on CORESIGHT_LINKS_AND_SINKS
|
||||
help
|
||||
This enables support for the Trace Memory Controller driver. Depending
|
||||
on its configuration the device can act as a link (embedded trace router
|
||||
- ETR) or sink (embedded trace FIFO). The driver complies with the
|
||||
generic implementation of the component without special enhancement or
|
||||
added features.
|
||||
|
||||
config CORESIGHT_SINK_TPIU
|
||||
bool "Coresight generic TPIU driver"
|
||||
depends on CORESIGHT_LINKS_AND_SINKS
|
||||
help
|
||||
This enables support for the Trace Port Interface Unit driver, responsible
|
||||
for bridging the gap between the on-chip coresight components and a trace
|
||||
port collection engine, typically connected to an external host for use
|
||||
case capturing more traces than the on-board coresight memory can handle.
|
||||
|
||||
config CORESIGHT_SINK_ETBV10
|
||||
bool "Coresight ETBv1.0 driver"
|
||||
depends on CORESIGHT_LINKS_AND_SINKS
|
||||
help
|
||||
This enables support for the Embedded Trace Buffer version 1.0 driver
|
||||
that complies with the generic implementation of the component without
|
||||
special enhancement or added features.
|
||||
|
||||
config CORESIGHT_SOURCE_ETM3X
|
||||
bool "CoreSight Embedded Trace Macrocell 3.x driver"
|
||||
select CORESIGHT_LINKS_AND_SINKS
|
||||
help
|
||||
This driver provides support for processor ETM3.x and PTM1.x modules,
|
||||
which allows tracing the instructions that a processor is executing
|
||||
This is primarily useful for instruction level tracing. Depending
|
||||
the ETM version data tracing may also be available.
|
||||
endif
|
||||
endmenu
|
||||
|
|
|
|||
|
|
@ -190,6 +190,12 @@
|
|||
clock-frequency = <168000000>;
|
||||
};
|
||||
|
||||
clk_375m: clk_375m {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <375000000>;
|
||||
};
|
||||
|
||||
soc {
|
||||
/* It's a 32-bit SoC. */
|
||||
#address-cells = <1>;
|
||||
|
|
@ -264,4 +270,715 @@
|
|||
};
|
||||
|
||||
};
|
||||
|
||||
etb@0,e3c42000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0xe3c42000 0 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb0_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator0_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etb@0,e3c82000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0xe3c82000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb1_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator1_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etb@0,e3cc2000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0xe3cc2000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb2_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator2_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etb@0,e3d02000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0xe3d02000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb3_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator3_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
tpiu@0,e3c05000 {
|
||||
compatible = "arm,coresight-tpiu", "arm,primecell";
|
||||
reg = <0 0xe3c05000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
tpiu_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel4_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
replicator0 {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator0_out_port0: endpoint {
|
||||
remote-endpoint = <&etb0_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator0_out_port1: endpoint {
|
||||
remote-endpoint = <&funnel4_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator0_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel0_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
replicator1 {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator1_out_port0: endpoint {
|
||||
remote-endpoint = <&etb1_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator1_out_port1: endpoint {
|
||||
remote-endpoint = <&funnel4_in_port1>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator1_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel1_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
replicator2 {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator2_out_port0: endpoint {
|
||||
remote-endpoint = <&etb2_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator2_out_port1: endpoint {
|
||||
remote-endpoint = <&funnel4_in_port2>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator2_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel2_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
replicator3 {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator3_out_port0: endpoint {
|
||||
remote-endpoint = <&etb3_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator3_out_port1: endpoint {
|
||||
remote-endpoint = <&funnel4_in_port3>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator3_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel3_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,e3c41000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0xe3c41000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel0_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator0_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel0_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm0_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel0_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm1_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel0_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm2_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <3>;
|
||||
funnel0_in_port3: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm3_out_port>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,e3c81000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0xe3c81000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel1_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator1_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel1_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm4_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel1_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm5_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel1_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm6_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <3>;
|
||||
funnel1_in_port3: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm7_out_port>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,e3cc1000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0xe3cc1000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel2_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator2_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel2_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm8_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel2_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm9_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel2_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm10_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <3>;
|
||||
funnel2_in_port3: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm11_out_port>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,e3d01000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0xe3d01000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel3_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator3_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel3_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm12_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel3_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm13_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel3_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm14_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <3>;
|
||||
funnel3_in_port3: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm15_out_port>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,e3c04000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0xe3c04000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel4_out_port0: endpoint {
|
||||
remote-endpoint = <&tpiu_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel4_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint =
|
||||
<&replicator0_out_port1>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel4_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint =
|
||||
<&replicator1_out_port1>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel4_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint =
|
||||
<&replicator2_out_port1>;
|
||||
};
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <3>;
|
||||
funnel4_in_port3: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint =
|
||||
<&replicator3_out_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3c7c000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3c7c000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU0>;
|
||||
port {
|
||||
ptm0_out_port: endpoint {
|
||||
remote-endpoint = <&funnel0_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3c7d000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3c7d000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU1>;
|
||||
port {
|
||||
ptm1_out_port: endpoint {
|
||||
remote-endpoint = <&funnel0_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3c7e000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3c7e000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU2>;
|
||||
port {
|
||||
ptm2_out_port: endpoint {
|
||||
remote-endpoint = <&funnel0_in_port2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3c7f000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3c7f000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU3>;
|
||||
port {
|
||||
ptm3_out_port: endpoint {
|
||||
remote-endpoint = <&funnel0_in_port3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cbc000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cbc000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU4>;
|
||||
port {
|
||||
ptm4_out_port: endpoint {
|
||||
remote-endpoint = <&funnel1_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cbd000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cbd000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU5>;
|
||||
port {
|
||||
ptm5_out_port: endpoint {
|
||||
remote-endpoint = <&funnel1_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cbe000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cbe000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU6>;
|
||||
port {
|
||||
ptm6_out_port: endpoint {
|
||||
remote-endpoint = <&funnel1_in_port2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cbf000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cbf000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU7>;
|
||||
port {
|
||||
ptm7_out_port: endpoint {
|
||||
remote-endpoint = <&funnel1_in_port3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cfc000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cfc000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU8>;
|
||||
port {
|
||||
ptm8_out_port: endpoint {
|
||||
remote-endpoint = <&funnel2_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cfd000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cfd000 0 0x1000>;
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU9>;
|
||||
port {
|
||||
ptm9_out_port: endpoint {
|
||||
remote-endpoint = <&funnel2_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cfe000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cfe000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU10>;
|
||||
port {
|
||||
ptm10_out_port: endpoint {
|
||||
remote-endpoint = <&funnel2_in_port2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3cff000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3cff000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU11>;
|
||||
port {
|
||||
ptm11_out_port: endpoint {
|
||||
remote-endpoint = <&funnel2_in_port3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3d3c000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3d3c000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU12>;
|
||||
port {
|
||||
ptm12_out_port: endpoint {
|
||||
remote-endpoint = <&funnel3_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3d3d000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3d3d000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU13>;
|
||||
port {
|
||||
ptm13_out_port: endpoint {
|
||||
remote-endpoint = <&funnel3_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3d3e000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3d3e000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU14>;
|
||||
port {
|
||||
ptm14_out_port: endpoint {
|
||||
remote-endpoint = <&funnel3_in_port2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,e3d3f000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0xe3d3f000 0 0x1000>;
|
||||
|
||||
clocks = <&clk_375m>;
|
||||
clock-names = "apb_pclk";
|
||||
cpu = <&CPU15>;
|
||||
port {
|
||||
ptm15_out_port: endpoint {
|
||||
remote-endpoint = <&funnel3_in_port3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -145,6 +145,34 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
etb@5401b000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0x5401b000 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&emu_src_ck>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb_in: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etm@54010000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0x54010000 0x1000>;
|
||||
|
||||
clocks = <&emu_src_ck>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etm_out: endpoint {
|
||||
remote-endpoint = <&etb_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&omap3_pmx_wkup {
|
||||
|
|
|
|||
|
|
@ -140,6 +140,34 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
etb@540000000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0x5401b000 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&emu_src_ck>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb_in: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etm@54010000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0x54010000 0x1000>;
|
||||
|
||||
clocks = <&emu_src_ck>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etm_out: endpoint {
|
||||
remote-endpoint = <&etb_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&omap3_pmx_wkup {
|
||||
|
|
|
|||
|
|
@ -358,6 +358,205 @@
|
|||
};
|
||||
};
|
||||
|
||||
etb@0,20010000 {
|
||||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0x20010000 0 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etb_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
tpiu@0,20030000 {
|
||||
compatible = "arm,coresight-tpiu", "arm,primecell";
|
||||
reg = <0 0x20030000 0 0x1000>;
|
||||
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
tpiu_in_port: endpoint@0 {
|
||||
slave-mode;
|
||||
remote-endpoint = <&replicator_out_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
replicator {
|
||||
/* non-configurable replicators don't show up on the
|
||||
* AMBA bus. As such no need to add "arm,primecell".
|
||||
*/
|
||||
compatible = "arm,coresight-replicator";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* replicator output ports */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
replicator_out_port0: endpoint {
|
||||
remote-endpoint = <&etb_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
replicator_out_port1: endpoint {
|
||||
remote-endpoint = <&tpiu_in_port>;
|
||||
};
|
||||
};
|
||||
|
||||
/* replicator input port */
|
||||
port@2 {
|
||||
reg = <0>;
|
||||
replicator_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&funnel_out_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
funnel@0,20040000 {
|
||||
compatible = "arm,coresight-funnel", "arm,primecell";
|
||||
reg = <0 0x20040000 0 0x1000>;
|
||||
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
/* funnel output port */
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
funnel_out_port0: endpoint {
|
||||
remote-endpoint =
|
||||
<&replicator_in_port0>;
|
||||
};
|
||||
};
|
||||
|
||||
/* funnel input ports */
|
||||
port@1 {
|
||||
reg = <0>;
|
||||
funnel_in_port0: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm0_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <1>;
|
||||
funnel_in_port1: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&ptm1_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <2>;
|
||||
funnel_in_port2: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm0_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Input port #3 is for ITM, not supported here */
|
||||
|
||||
port@4 {
|
||||
reg = <4>;
|
||||
funnel_in_port4: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm1_out_port>;
|
||||
};
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
funnel_in_port5: endpoint {
|
||||
slave-mode;
|
||||
remote-endpoint = <&etm2_out_port>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,2201c000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2201c000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu0>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
ptm0_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ptm@0,2201d000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2201d000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu1>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
ptm1_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etm@0,2203c000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2203c000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu2>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etm0_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etm@0,2203d000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2203d000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu3>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etm1_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port4>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
etm@0,2203e000 {
|
||||
compatible = "arm,coresight-etm3x", "arm,primecell";
|
||||
reg = <0 0x2203e000 0 0x1000>;
|
||||
|
||||
cpu = <&cpu4>;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
etm2_out_port: endpoint {
|
||||
remote-endpoint = <&funnel_in_port5>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
smb {
|
||||
compatible = "simple-bus";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,157 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/include/asm/hardware/coresight.h
|
||||
*
|
||||
* CoreSight components' registers
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation.
|
||||
* Alexander Shishkin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_HARDWARE_CORESIGHT_H
|
||||
#define __ASM_HARDWARE_CORESIGHT_H
|
||||
|
||||
#define TRACER_ACCESSED_BIT 0
|
||||
#define TRACER_RUNNING_BIT 1
|
||||
#define TRACER_CYCLE_ACC_BIT 2
|
||||
#define TRACER_ACCESSED BIT(TRACER_ACCESSED_BIT)
|
||||
#define TRACER_RUNNING BIT(TRACER_RUNNING_BIT)
|
||||
#define TRACER_CYCLE_ACC BIT(TRACER_CYCLE_ACC_BIT)
|
||||
|
||||
#define TRACER_TIMEOUT 10000
|
||||
|
||||
#define etm_writel(t, v, x) \
|
||||
(writel_relaxed((v), (t)->etm_regs + (x)))
|
||||
#define etm_readl(t, x) (readl_relaxed((t)->etm_regs + (x)))
|
||||
|
||||
/* CoreSight Management Registers */
|
||||
#define CSMR_LOCKACCESS 0xfb0
|
||||
#define CSMR_LOCKSTATUS 0xfb4
|
||||
#define CSMR_AUTHSTATUS 0xfb8
|
||||
#define CSMR_DEVID 0xfc8
|
||||
#define CSMR_DEVTYPE 0xfcc
|
||||
/* CoreSight Component Registers */
|
||||
#define CSCR_CLASS 0xff4
|
||||
|
||||
#define CS_LAR_KEY 0xc5acce55
|
||||
|
||||
/* ETM control register, "ETM Architecture", 3.3.1 */
|
||||
#define ETMR_CTRL 0
|
||||
#define ETMCTRL_POWERDOWN 1
|
||||
#define ETMCTRL_PROGRAM (1 << 10)
|
||||
#define ETMCTRL_PORTSEL (1 << 11)
|
||||
#define ETMCTRL_DO_CONTEXTID (3 << 14)
|
||||
#define ETMCTRL_PORTMASK1 (7 << 4)
|
||||
#define ETMCTRL_PORTMASK2 (1 << 21)
|
||||
#define ETMCTRL_PORTMASK (ETMCTRL_PORTMASK1 | ETMCTRL_PORTMASK2)
|
||||
#define ETMCTRL_PORTSIZE(x) ((((x) & 7) << 4) | (!!((x) & 8)) << 21)
|
||||
#define ETMCTRL_DO_CPRT (1 << 1)
|
||||
#define ETMCTRL_DATAMASK (3 << 2)
|
||||
#define ETMCTRL_DATA_DO_DATA (1 << 2)
|
||||
#define ETMCTRL_DATA_DO_ADDR (1 << 3)
|
||||
#define ETMCTRL_DATA_DO_BOTH (ETMCTRL_DATA_DO_DATA | ETMCTRL_DATA_DO_ADDR)
|
||||
#define ETMCTRL_BRANCH_OUTPUT (1 << 8)
|
||||
#define ETMCTRL_CYCLEACCURATE (1 << 12)
|
||||
|
||||
/* ETM configuration code register */
|
||||
#define ETMR_CONFCODE (0x04)
|
||||
|
||||
/* ETM trace start/stop resource control register */
|
||||
#define ETMR_TRACESSCTRL (0x18)
|
||||
|
||||
/* ETM trigger event register */
|
||||
#define ETMR_TRIGEVT (0x08)
|
||||
|
||||
/* address access type register bits, "ETM architecture",
|
||||
* table 3-27 */
|
||||
/* - access type */
|
||||
#define ETMAAT_IFETCH 0
|
||||
#define ETMAAT_IEXEC 1
|
||||
#define ETMAAT_IEXECPASS 2
|
||||
#define ETMAAT_IEXECFAIL 3
|
||||
#define ETMAAT_DLOADSTORE 4
|
||||
#define ETMAAT_DLOAD 5
|
||||
#define ETMAAT_DSTORE 6
|
||||
/* - comparison access size */
|
||||
#define ETMAAT_JAVA (0 << 3)
|
||||
#define ETMAAT_THUMB (1 << 3)
|
||||
#define ETMAAT_ARM (3 << 3)
|
||||
/* - data value comparison control */
|
||||
#define ETMAAT_NOVALCMP (0 << 5)
|
||||
#define ETMAAT_VALMATCH (1 << 5)
|
||||
#define ETMAAT_VALNOMATCH (3 << 5)
|
||||
/* - exact match */
|
||||
#define ETMAAT_EXACTMATCH (1 << 7)
|
||||
/* - context id comparator control */
|
||||
#define ETMAAT_IGNCONTEXTID (0 << 8)
|
||||
#define ETMAAT_VALUE1 (1 << 8)
|
||||
#define ETMAAT_VALUE2 (2 << 8)
|
||||
#define ETMAAT_VALUE3 (3 << 8)
|
||||
/* - security level control */
|
||||
#define ETMAAT_IGNSECURITY (0 << 10)
|
||||
#define ETMAAT_NSONLY (1 << 10)
|
||||
#define ETMAAT_SONLY (2 << 10)
|
||||
|
||||
#define ETMR_COMP_VAL(x) (0x40 + (x) * 4)
|
||||
#define ETMR_COMP_ACC_TYPE(x) (0x80 + (x) * 4)
|
||||
|
||||
/* ETM status register, "ETM Architecture", 3.3.2 */
|
||||
#define ETMR_STATUS (0x10)
|
||||
#define ETMST_OVERFLOW BIT(0)
|
||||
#define ETMST_PROGBIT BIT(1)
|
||||
#define ETMST_STARTSTOP BIT(2)
|
||||
#define ETMST_TRIGGER BIT(3)
|
||||
|
||||
#define etm_progbit(t) (etm_readl((t), ETMR_STATUS) & ETMST_PROGBIT)
|
||||
#define etm_started(t) (etm_readl((t), ETMR_STATUS) & ETMST_STARTSTOP)
|
||||
#define etm_triggered(t) (etm_readl((t), ETMR_STATUS) & ETMST_TRIGGER)
|
||||
|
||||
#define ETMR_TRACEENCTRL2 0x1c
|
||||
#define ETMR_TRACEENCTRL 0x24
|
||||
#define ETMTE_INCLEXCL BIT(24)
|
||||
#define ETMR_TRACEENEVT 0x20
|
||||
#define ETMCTRL_OPTS (ETMCTRL_DO_CPRT | \
|
||||
ETMCTRL_DATA_DO_ADDR | \
|
||||
ETMCTRL_BRANCH_OUTPUT | \
|
||||
ETMCTRL_DO_CONTEXTID)
|
||||
|
||||
/* ETM management registers, "ETM Architecture", 3.5.24 */
|
||||
#define ETMMR_OSLAR 0x300
|
||||
#define ETMMR_OSLSR 0x304
|
||||
#define ETMMR_OSSRR 0x308
|
||||
#define ETMMR_PDSR 0x314
|
||||
|
||||
/* ETB registers, "CoreSight Components TRM", 9.3 */
|
||||
#define ETBR_DEPTH 0x04
|
||||
#define ETBR_STATUS 0x0c
|
||||
#define ETBR_READMEM 0x10
|
||||
#define ETBR_READADDR 0x14
|
||||
#define ETBR_WRITEADDR 0x18
|
||||
#define ETBR_TRIGGERCOUNT 0x1c
|
||||
#define ETBR_CTRL 0x20
|
||||
#define ETBR_FORMATTERCTRL 0x304
|
||||
#define ETBFF_ENFTC 1
|
||||
#define ETBFF_ENFCONT BIT(1)
|
||||
#define ETBFF_FONFLIN BIT(4)
|
||||
#define ETBFF_MANUAL_FLUSH BIT(6)
|
||||
#define ETBFF_TRIGIN BIT(8)
|
||||
#define ETBFF_TRIGEVT BIT(9)
|
||||
#define ETBFF_TRIGFL BIT(10)
|
||||
|
||||
#define etb_writel(t, v, x) \
|
||||
(writel_relaxed((v), (t)->etb_regs + (x)))
|
||||
#define etb_readl(t, x) (readl_relaxed((t)->etb_regs + (x)))
|
||||
|
||||
#define etm_lock(t) do { etm_writel((t), 0, CSMR_LOCKACCESS); } while (0)
|
||||
#define etm_unlock(t) \
|
||||
do { etm_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0)
|
||||
|
||||
#define etb_lock(t) do { etb_writel((t), 0, CSMR_LOCKACCESS); } while (0)
|
||||
#define etb_unlock(t) \
|
||||
do { etb_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0)
|
||||
|
||||
#endif /* __ASM_HARDWARE_CORESIGHT_H */
|
||||
|
||||
542
arch/arm/include/asm/hardware/cp14.h
Normal file
542
arch/arm/include/asm/hardware/cp14.h
Normal file
|
|
@ -0,0 +1,542 @@
|
|||
/* Copyright (c) 2011-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.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_HARDWARE_CP14_H
|
||||
#define __ASM_HARDWARE_CP14_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Accessors for CP14 registers */
|
||||
#define dbg_read(reg) RCP14_##reg()
|
||||
#define dbg_write(val, reg) WCP14_##reg(val)
|
||||
#define etm_read(reg) RCP14_##reg()
|
||||
#define etm_write(val, reg) WCP14_##reg(val)
|
||||
|
||||
/* MRC14 and MCR14 */
|
||||
#define MRC14(op1, crn, crm, op2) \
|
||||
({ \
|
||||
u32 val; \
|
||||
asm volatile("mrc p14, "#op1", %0, "#crn", "#crm", "#op2 : "=r" (val)); \
|
||||
val; \
|
||||
})
|
||||
|
||||
#define MCR14(val, op1, crn, crm, op2) \
|
||||
({ \
|
||||
asm volatile("mcr p14, "#op1", %0, "#crn", "#crm", "#op2 : : "r" (val));\
|
||||
})
|
||||
|
||||
/*
|
||||
* Debug Registers
|
||||
*
|
||||
* Available only in DBGv7
|
||||
* DBGECR, DBGDSCCR, DBGDSMCR, DBGDRCR
|
||||
*
|
||||
* Available only in DBGv7.1
|
||||
* DBGBXVRm, DBGOSDLR, DBGDEVID2, DBGDEVID1
|
||||
*
|
||||
* Read only
|
||||
* DBGDIDR, DBGDSCRint, DBGDTRRXint, DBGDRAR, DBGOSLSR, DBGOSSRR, DBGPRSR,
|
||||
* DBGPRSR, DBGDSAR, DBGAUTHSTATUS, DBGDEVID2, DBGDEVID1, DBGDEVID
|
||||
*
|
||||
* Write only
|
||||
* DBGDTRTXint, DBGOSLAR
|
||||
*/
|
||||
#define RCP14_DBGDIDR() MRC14(0, c0, c0, 0)
|
||||
#define RCP14_DBGDSCRint() MRC14(0, c0, c1, 0)
|
||||
#define RCP14_DBGDTRRXint() MRC14(0, c0, c5, 0)
|
||||
#define RCP14_DBGWFAR() MRC14(0, c0, c6, 0)
|
||||
#define RCP14_DBGVCR() MRC14(0, c0, c7, 0)
|
||||
#define RCP14_DBGECR() MRC14(0, c0, c9, 0)
|
||||
#define RCP14_DBGDSCCR() MRC14(0, c0, c10, 0)
|
||||
#define RCP14_DBGDSMCR() MRC14(0, c0, c11, 0)
|
||||
#define RCP14_DBGDTRRXext() MRC14(0, c0, c0, 2)
|
||||
#define RCP14_DBGDSCRext() MRC14(0, c0, c2, 2)
|
||||
#define RCP14_DBGDTRTXext() MRC14(0, c0, c3, 2)
|
||||
#define RCP14_DBGDRCR() MRC14(0, c0, c4, 2)
|
||||
#define RCP14_DBGBVR0() MRC14(0, c0, c0, 4)
|
||||
#define RCP14_DBGBVR1() MRC14(0, c0, c1, 4)
|
||||
#define RCP14_DBGBVR2() MRC14(0, c0, c2, 4)
|
||||
#define RCP14_DBGBVR3() MRC14(0, c0, c3, 4)
|
||||
#define RCP14_DBGBVR4() MRC14(0, c0, c4, 4)
|
||||
#define RCP14_DBGBVR5() MRC14(0, c0, c5, 4)
|
||||
#define RCP14_DBGBVR6() MRC14(0, c0, c6, 4)
|
||||
#define RCP14_DBGBVR7() MRC14(0, c0, c7, 4)
|
||||
#define RCP14_DBGBVR8() MRC14(0, c0, c8, 4)
|
||||
#define RCP14_DBGBVR9() MRC14(0, c0, c9, 4)
|
||||
#define RCP14_DBGBVR10() MRC14(0, c0, c10, 4)
|
||||
#define RCP14_DBGBVR11() MRC14(0, c0, c11, 4)
|
||||
#define RCP14_DBGBVR12() MRC14(0, c0, c12, 4)
|
||||
#define RCP14_DBGBVR13() MRC14(0, c0, c13, 4)
|
||||
#define RCP14_DBGBVR14() MRC14(0, c0, c14, 4)
|
||||
#define RCP14_DBGBVR15() MRC14(0, c0, c15, 4)
|
||||
#define RCP14_DBGBCR0() MRC14(0, c0, c0, 5)
|
||||
#define RCP14_DBGBCR1() MRC14(0, c0, c1, 5)
|
||||
#define RCP14_DBGBCR2() MRC14(0, c0, c2, 5)
|
||||
#define RCP14_DBGBCR3() MRC14(0, c0, c3, 5)
|
||||
#define RCP14_DBGBCR4() MRC14(0, c0, c4, 5)
|
||||
#define RCP14_DBGBCR5() MRC14(0, c0, c5, 5)
|
||||
#define RCP14_DBGBCR6() MRC14(0, c0, c6, 5)
|
||||
#define RCP14_DBGBCR7() MRC14(0, c0, c7, 5)
|
||||
#define RCP14_DBGBCR8() MRC14(0, c0, c8, 5)
|
||||
#define RCP14_DBGBCR9() MRC14(0, c0, c9, 5)
|
||||
#define RCP14_DBGBCR10() MRC14(0, c0, c10, 5)
|
||||
#define RCP14_DBGBCR11() MRC14(0, c0, c11, 5)
|
||||
#define RCP14_DBGBCR12() MRC14(0, c0, c12, 5)
|
||||
#define RCP14_DBGBCR13() MRC14(0, c0, c13, 5)
|
||||
#define RCP14_DBGBCR14() MRC14(0, c0, c14, 5)
|
||||
#define RCP14_DBGBCR15() MRC14(0, c0, c15, 5)
|
||||
#define RCP14_DBGWVR0() MRC14(0, c0, c0, 6)
|
||||
#define RCP14_DBGWVR1() MRC14(0, c0, c1, 6)
|
||||
#define RCP14_DBGWVR2() MRC14(0, c0, c2, 6)
|
||||
#define RCP14_DBGWVR3() MRC14(0, c0, c3, 6)
|
||||
#define RCP14_DBGWVR4() MRC14(0, c0, c4, 6)
|
||||
#define RCP14_DBGWVR5() MRC14(0, c0, c5, 6)
|
||||
#define RCP14_DBGWVR6() MRC14(0, c0, c6, 6)
|
||||
#define RCP14_DBGWVR7() MRC14(0, c0, c7, 6)
|
||||
#define RCP14_DBGWVR8() MRC14(0, c0, c8, 6)
|
||||
#define RCP14_DBGWVR9() MRC14(0, c0, c9, 6)
|
||||
#define RCP14_DBGWVR10() MRC14(0, c0, c10, 6)
|
||||
#define RCP14_DBGWVR11() MRC14(0, c0, c11, 6)
|
||||
#define RCP14_DBGWVR12() MRC14(0, c0, c12, 6)
|
||||
#define RCP14_DBGWVR13() MRC14(0, c0, c13, 6)
|
||||
#define RCP14_DBGWVR14() MRC14(0, c0, c14, 6)
|
||||
#define RCP14_DBGWVR15() MRC14(0, c0, c15, 6)
|
||||
#define RCP14_DBGWCR0() MRC14(0, c0, c0, 7)
|
||||
#define RCP14_DBGWCR1() MRC14(0, c0, c1, 7)
|
||||
#define RCP14_DBGWCR2() MRC14(0, c0, c2, 7)
|
||||
#define RCP14_DBGWCR3() MRC14(0, c0, c3, 7)
|
||||
#define RCP14_DBGWCR4() MRC14(0, c0, c4, 7)
|
||||
#define RCP14_DBGWCR5() MRC14(0, c0, c5, 7)
|
||||
#define RCP14_DBGWCR6() MRC14(0, c0, c6, 7)
|
||||
#define RCP14_DBGWCR7() MRC14(0, c0, c7, 7)
|
||||
#define RCP14_DBGWCR8() MRC14(0, c0, c8, 7)
|
||||
#define RCP14_DBGWCR9() MRC14(0, c0, c9, 7)
|
||||
#define RCP14_DBGWCR10() MRC14(0, c0, c10, 7)
|
||||
#define RCP14_DBGWCR11() MRC14(0, c0, c11, 7)
|
||||
#define RCP14_DBGWCR12() MRC14(0, c0, c12, 7)
|
||||
#define RCP14_DBGWCR13() MRC14(0, c0, c13, 7)
|
||||
#define RCP14_DBGWCR14() MRC14(0, c0, c14, 7)
|
||||
#define RCP14_DBGWCR15() MRC14(0, c0, c15, 7)
|
||||
#define RCP14_DBGDRAR() MRC14(0, c1, c0, 0)
|
||||
#define RCP14_DBGBXVR0() MRC14(0, c1, c0, 1)
|
||||
#define RCP14_DBGBXVR1() MRC14(0, c1, c1, 1)
|
||||
#define RCP14_DBGBXVR2() MRC14(0, c1, c2, 1)
|
||||
#define RCP14_DBGBXVR3() MRC14(0, c1, c3, 1)
|
||||
#define RCP14_DBGBXVR4() MRC14(0, c1, c4, 1)
|
||||
#define RCP14_DBGBXVR5() MRC14(0, c1, c5, 1)
|
||||
#define RCP14_DBGBXVR6() MRC14(0, c1, c6, 1)
|
||||
#define RCP14_DBGBXVR7() MRC14(0, c1, c7, 1)
|
||||
#define RCP14_DBGBXVR8() MRC14(0, c1, c8, 1)
|
||||
#define RCP14_DBGBXVR9() MRC14(0, c1, c9, 1)
|
||||
#define RCP14_DBGBXVR10() MRC14(0, c1, c10, 1)
|
||||
#define RCP14_DBGBXVR11() MRC14(0, c1, c11, 1)
|
||||
#define RCP14_DBGBXVR12() MRC14(0, c1, c12, 1)
|
||||
#define RCP14_DBGBXVR13() MRC14(0, c1, c13, 1)
|
||||
#define RCP14_DBGBXVR14() MRC14(0, c1, c14, 1)
|
||||
#define RCP14_DBGBXVR15() MRC14(0, c1, c15, 1)
|
||||
#define RCP14_DBGOSLSR() MRC14(0, c1, c1, 4)
|
||||
#define RCP14_DBGOSSRR() MRC14(0, c1, c2, 4)
|
||||
#define RCP14_DBGOSDLR() MRC14(0, c1, c3, 4)
|
||||
#define RCP14_DBGPRCR() MRC14(0, c1, c4, 4)
|
||||
#define RCP14_DBGPRSR() MRC14(0, c1, c5, 4)
|
||||
#define RCP14_DBGDSAR() MRC14(0, c2, c0, 0)
|
||||
#define RCP14_DBGITCTRL() MRC14(0, c7, c0, 4)
|
||||
#define RCP14_DBGCLAIMSET() MRC14(0, c7, c8, 6)
|
||||
#define RCP14_DBGCLAIMCLR() MRC14(0, c7, c9, 6)
|
||||
#define RCP14_DBGAUTHSTATUS() MRC14(0, c7, c14, 6)
|
||||
#define RCP14_DBGDEVID2() MRC14(0, c7, c0, 7)
|
||||
#define RCP14_DBGDEVID1() MRC14(0, c7, c1, 7)
|
||||
#define RCP14_DBGDEVID() MRC14(0, c7, c2, 7)
|
||||
|
||||
#define WCP14_DBGDTRTXint(val) MCR14(val, 0, c0, c5, 0)
|
||||
#define WCP14_DBGWFAR(val) MCR14(val, 0, c0, c6, 0)
|
||||
#define WCP14_DBGVCR(val) MCR14(val, 0, c0, c7, 0)
|
||||
#define WCP14_DBGECR(val) MCR14(val, 0, c0, c9, 0)
|
||||
#define WCP14_DBGDSCCR(val) MCR14(val, 0, c0, c10, 0)
|
||||
#define WCP14_DBGDSMCR(val) MCR14(val, 0, c0, c11, 0)
|
||||
#define WCP14_DBGDTRRXext(val) MCR14(val, 0, c0, c0, 2)
|
||||
#define WCP14_DBGDSCRext(val) MCR14(val, 0, c0, c2, 2)
|
||||
#define WCP14_DBGDTRTXext(val) MCR14(val, 0, c0, c3, 2)
|
||||
#define WCP14_DBGDRCR(val) MCR14(val, 0, c0, c4, 2)
|
||||
#define WCP14_DBGBVR0(val) MCR14(val, 0, c0, c0, 4)
|
||||
#define WCP14_DBGBVR1(val) MCR14(val, 0, c0, c1, 4)
|
||||
#define WCP14_DBGBVR2(val) MCR14(val, 0, c0, c2, 4)
|
||||
#define WCP14_DBGBVR3(val) MCR14(val, 0, c0, c3, 4)
|
||||
#define WCP14_DBGBVR4(val) MCR14(val, 0, c0, c4, 4)
|
||||
#define WCP14_DBGBVR5(val) MCR14(val, 0, c0, c5, 4)
|
||||
#define WCP14_DBGBVR6(val) MCR14(val, 0, c0, c6, 4)
|
||||
#define WCP14_DBGBVR7(val) MCR14(val, 0, c0, c7, 4)
|
||||
#define WCP14_DBGBVR8(val) MCR14(val, 0, c0, c8, 4)
|
||||
#define WCP14_DBGBVR9(val) MCR14(val, 0, c0, c9, 4)
|
||||
#define WCP14_DBGBVR10(val) MCR14(val, 0, c0, c10, 4)
|
||||
#define WCP14_DBGBVR11(val) MCR14(val, 0, c0, c11, 4)
|
||||
#define WCP14_DBGBVR12(val) MCR14(val, 0, c0, c12, 4)
|
||||
#define WCP14_DBGBVR13(val) MCR14(val, 0, c0, c13, 4)
|
||||
#define WCP14_DBGBVR14(val) MCR14(val, 0, c0, c14, 4)
|
||||
#define WCP14_DBGBVR15(val) MCR14(val, 0, c0, c15, 4)
|
||||
#define WCP14_DBGBCR0(val) MCR14(val, 0, c0, c0, 5)
|
||||
#define WCP14_DBGBCR1(val) MCR14(val, 0, c0, c1, 5)
|
||||
#define WCP14_DBGBCR2(val) MCR14(val, 0, c0, c2, 5)
|
||||
#define WCP14_DBGBCR3(val) MCR14(val, 0, c0, c3, 5)
|
||||
#define WCP14_DBGBCR4(val) MCR14(val, 0, c0, c4, 5)
|
||||
#define WCP14_DBGBCR5(val) MCR14(val, 0, c0, c5, 5)
|
||||
#define WCP14_DBGBCR6(val) MCR14(val, 0, c0, c6, 5)
|
||||
#define WCP14_DBGBCR7(val) MCR14(val, 0, c0, c7, 5)
|
||||
#define WCP14_DBGBCR8(val) MCR14(val, 0, c0, c8, 5)
|
||||
#define WCP14_DBGBCR9(val) MCR14(val, 0, c0, c9, 5)
|
||||
#define WCP14_DBGBCR10(val) MCR14(val, 0, c0, c10, 5)
|
||||
#define WCP14_DBGBCR11(val) MCR14(val, 0, c0, c11, 5)
|
||||
#define WCP14_DBGBCR12(val) MCR14(val, 0, c0, c12, 5)
|
||||
#define WCP14_DBGBCR13(val) MCR14(val, 0, c0, c13, 5)
|
||||
#define WCP14_DBGBCR14(val) MCR14(val, 0, c0, c14, 5)
|
||||
#define WCP14_DBGBCR15(val) MCR14(val, 0, c0, c15, 5)
|
||||
#define WCP14_DBGWVR0(val) MCR14(val, 0, c0, c0, 6)
|
||||
#define WCP14_DBGWVR1(val) MCR14(val, 0, c0, c1, 6)
|
||||
#define WCP14_DBGWVR2(val) MCR14(val, 0, c0, c2, 6)
|
||||
#define WCP14_DBGWVR3(val) MCR14(val, 0, c0, c3, 6)
|
||||
#define WCP14_DBGWVR4(val) MCR14(val, 0, c0, c4, 6)
|
||||
#define WCP14_DBGWVR5(val) MCR14(val, 0, c0, c5, 6)
|
||||
#define WCP14_DBGWVR6(val) MCR14(val, 0, c0, c6, 6)
|
||||
#define WCP14_DBGWVR7(val) MCR14(val, 0, c0, c7, 6)
|
||||
#define WCP14_DBGWVR8(val) MCR14(val, 0, c0, c8, 6)
|
||||
#define WCP14_DBGWVR9(val) MCR14(val, 0, c0, c9, 6)
|
||||
#define WCP14_DBGWVR10(val) MCR14(val, 0, c0, c10, 6)
|
||||
#define WCP14_DBGWVR11(val) MCR14(val, 0, c0, c11, 6)
|
||||
#define WCP14_DBGWVR12(val) MCR14(val, 0, c0, c12, 6)
|
||||
#define WCP14_DBGWVR13(val) MCR14(val, 0, c0, c13, 6)
|
||||
#define WCP14_DBGWVR14(val) MCR14(val, 0, c0, c14, 6)
|
||||
#define WCP14_DBGWVR15(val) MCR14(val, 0, c0, c15, 6)
|
||||
#define WCP14_DBGWCR0(val) MCR14(val, 0, c0, c0, 7)
|
||||
#define WCP14_DBGWCR1(val) MCR14(val, 0, c0, c1, 7)
|
||||
#define WCP14_DBGWCR2(val) MCR14(val, 0, c0, c2, 7)
|
||||
#define WCP14_DBGWCR3(val) MCR14(val, 0, c0, c3, 7)
|
||||
#define WCP14_DBGWCR4(val) MCR14(val, 0, c0, c4, 7)
|
||||
#define WCP14_DBGWCR5(val) MCR14(val, 0, c0, c5, 7)
|
||||
#define WCP14_DBGWCR6(val) MCR14(val, 0, c0, c6, 7)
|
||||
#define WCP14_DBGWCR7(val) MCR14(val, 0, c0, c7, 7)
|
||||
#define WCP14_DBGWCR8(val) MCR14(val, 0, c0, c8, 7)
|
||||
#define WCP14_DBGWCR9(val) MCR14(val, 0, c0, c9, 7)
|
||||
#define WCP14_DBGWCR10(val) MCR14(val, 0, c0, c10, 7)
|
||||
#define WCP14_DBGWCR11(val) MCR14(val, 0, c0, c11, 7)
|
||||
#define WCP14_DBGWCR12(val) MCR14(val, 0, c0, c12, 7)
|
||||
#define WCP14_DBGWCR13(val) MCR14(val, 0, c0, c13, 7)
|
||||
#define WCP14_DBGWCR14(val) MCR14(val, 0, c0, c14, 7)
|
||||
#define WCP14_DBGWCR15(val) MCR14(val, 0, c0, c15, 7)
|
||||
#define WCP14_DBGBXVR0(val) MCR14(val, 0, c1, c0, 1)
|
||||
#define WCP14_DBGBXVR1(val) MCR14(val, 0, c1, c1, 1)
|
||||
#define WCP14_DBGBXVR2(val) MCR14(val, 0, c1, c2, 1)
|
||||
#define WCP14_DBGBXVR3(val) MCR14(val, 0, c1, c3, 1)
|
||||
#define WCP14_DBGBXVR4(val) MCR14(val, 0, c1, c4, 1)
|
||||
#define WCP14_DBGBXVR5(val) MCR14(val, 0, c1, c5, 1)
|
||||
#define WCP14_DBGBXVR6(val) MCR14(val, 0, c1, c6, 1)
|
||||
#define WCP14_DBGBXVR7(val) MCR14(val, 0, c1, c7, 1)
|
||||
#define WCP14_DBGBXVR8(val) MCR14(val, 0, c1, c8, 1)
|
||||
#define WCP14_DBGBXVR9(val) MCR14(val, 0, c1, c9, 1)
|
||||
#define WCP14_DBGBXVR10(val) MCR14(val, 0, c1, c10, 1)
|
||||
#define WCP14_DBGBXVR11(val) MCR14(val, 0, c1, c11, 1)
|
||||
#define WCP14_DBGBXVR12(val) MCR14(val, 0, c1, c12, 1)
|
||||
#define WCP14_DBGBXVR13(val) MCR14(val, 0, c1, c13, 1)
|
||||
#define WCP14_DBGBXVR14(val) MCR14(val, 0, c1, c14, 1)
|
||||
#define WCP14_DBGBXVR15(val) MCR14(val, 0, c1, c15, 1)
|
||||
#define WCP14_DBGOSLAR(val) MCR14(val, 0, c1, c0, 4)
|
||||
#define WCP14_DBGOSSRR(val) MCR14(val, 0, c1, c2, 4)
|
||||
#define WCP14_DBGOSDLR(val) MCR14(val, 0, c1, c3, 4)
|
||||
#define WCP14_DBGPRCR(val) MCR14(val, 0, c1, c4, 4)
|
||||
#define WCP14_DBGITCTRL(val) MCR14(val, 0, c7, c0, 4)
|
||||
#define WCP14_DBGCLAIMSET(val) MCR14(val, 0, c7, c8, 6)
|
||||
#define WCP14_DBGCLAIMCLR(val) MCR14(val, 0, c7, c9, 6)
|
||||
|
||||
/*
|
||||
* ETM Registers
|
||||
*
|
||||
* Available only in ETMv3.3, 3.4, 3.5
|
||||
* ETMASICCR, ETMTECR2, ETMFFRR, ETMVDEVR, ETMVDCR1, ETMVDCR2, ETMVDCR3,
|
||||
* ETMDCVRn, ETMDCMRn
|
||||
*
|
||||
* Available only in ETMv3.5 as read only
|
||||
* ETMIDR2
|
||||
*
|
||||
* Available only in ETMv3.5, PFTv1.0, 1.1
|
||||
* ETMTSEVR, ETMVMIDCVR, ETMPDCR
|
||||
*
|
||||
* Read only
|
||||
* ETMCCR, ETMSCR, ETMIDR, ETMCCER, ETMOSLSR
|
||||
* ETMLSR, ETMAUTHSTATUS, ETMDEVID, ETMDEVTYPE, ETMPIDR4, ETMPIDR5, ETMPIDR6,
|
||||
* ETMPIDR7, ETMPIDR0, ETMPIDR1, ETMPIDR2, ETMPIDR2, ETMPIDR3, ETMCIDR0,
|
||||
* ETMCIDR1, ETMCIDR2, ETMCIDR3
|
||||
*
|
||||
* Write only
|
||||
* ETMOSLAR, ETMLAR
|
||||
* Note: ETMCCER[11] controls WO nature of certain regs. Refer ETM arch spec.
|
||||
*/
|
||||
#define RCP14_ETMCR() MRC14(1, c0, c0, 0)
|
||||
#define RCP14_ETMCCR() MRC14(1, c0, c1, 0)
|
||||
#define RCP14_ETMTRIGGER() MRC14(1, c0, c2, 0)
|
||||
#define RCP14_ETMASICCR() MRC14(1, c0, c3, 0)
|
||||
#define RCP14_ETMSR() MRC14(1, c0, c4, 0)
|
||||
#define RCP14_ETMSCR() MRC14(1, c0, c5, 0)
|
||||
#define RCP14_ETMTSSCR() MRC14(1, c0, c6, 0)
|
||||
#define RCP14_ETMTECR2() MRC14(1, c0, c7, 0)
|
||||
#define RCP14_ETMTEEVR() MRC14(1, c0, c8, 0)
|
||||
#define RCP14_ETMTECR1() MRC14(1, c0, c9, 0)
|
||||
#define RCP14_ETMFFRR() MRC14(1, c0, c10, 0)
|
||||
#define RCP14_ETMFFLR() MRC14(1, c0, c11, 0)
|
||||
#define RCP14_ETMVDEVR() MRC14(1, c0, c12, 0)
|
||||
#define RCP14_ETMVDCR1() MRC14(1, c0, c13, 0)
|
||||
#define RCP14_ETMVDCR2() MRC14(1, c0, c14, 0)
|
||||
#define RCP14_ETMVDCR3() MRC14(1, c0, c15, 0)
|
||||
#define RCP14_ETMACVR0() MRC14(1, c0, c0, 1)
|
||||
#define RCP14_ETMACVR1() MRC14(1, c0, c1, 1)
|
||||
#define RCP14_ETMACVR2() MRC14(1, c0, c2, 1)
|
||||
#define RCP14_ETMACVR3() MRC14(1, c0, c3, 1)
|
||||
#define RCP14_ETMACVR4() MRC14(1, c0, c4, 1)
|
||||
#define RCP14_ETMACVR5() MRC14(1, c0, c5, 1)
|
||||
#define RCP14_ETMACVR6() MRC14(1, c0, c6, 1)
|
||||
#define RCP14_ETMACVR7() MRC14(1, c0, c7, 1)
|
||||
#define RCP14_ETMACVR8() MRC14(1, c0, c8, 1)
|
||||
#define RCP14_ETMACVR9() MRC14(1, c0, c9, 1)
|
||||
#define RCP14_ETMACVR10() MRC14(1, c0, c10, 1)
|
||||
#define RCP14_ETMACVR11() MRC14(1, c0, c11, 1)
|
||||
#define RCP14_ETMACVR12() MRC14(1, c0, c12, 1)
|
||||
#define RCP14_ETMACVR13() MRC14(1, c0, c13, 1)
|
||||
#define RCP14_ETMACVR14() MRC14(1, c0, c14, 1)
|
||||
#define RCP14_ETMACVR15() MRC14(1, c0, c15, 1)
|
||||
#define RCP14_ETMACTR0() MRC14(1, c0, c0, 2)
|
||||
#define RCP14_ETMACTR1() MRC14(1, c0, c1, 2)
|
||||
#define RCP14_ETMACTR2() MRC14(1, c0, c2, 2)
|
||||
#define RCP14_ETMACTR3() MRC14(1, c0, c3, 2)
|
||||
#define RCP14_ETMACTR4() MRC14(1, c0, c4, 2)
|
||||
#define RCP14_ETMACTR5() MRC14(1, c0, c5, 2)
|
||||
#define RCP14_ETMACTR6() MRC14(1, c0, c6, 2)
|
||||
#define RCP14_ETMACTR7() MRC14(1, c0, c7, 2)
|
||||
#define RCP14_ETMACTR8() MRC14(1, c0, c8, 2)
|
||||
#define RCP14_ETMACTR9() MRC14(1, c0, c9, 2)
|
||||
#define RCP14_ETMACTR10() MRC14(1, c0, c10, 2)
|
||||
#define RCP14_ETMACTR11() MRC14(1, c0, c11, 2)
|
||||
#define RCP14_ETMACTR12() MRC14(1, c0, c12, 2)
|
||||
#define RCP14_ETMACTR13() MRC14(1, c0, c13, 2)
|
||||
#define RCP14_ETMACTR14() MRC14(1, c0, c14, 2)
|
||||
#define RCP14_ETMACTR15() MRC14(1, c0, c15, 2)
|
||||
#define RCP14_ETMDCVR0() MRC14(1, c0, c0, 3)
|
||||
#define RCP14_ETMDCVR2() MRC14(1, c0, c2, 3)
|
||||
#define RCP14_ETMDCVR4() MRC14(1, c0, c4, 3)
|
||||
#define RCP14_ETMDCVR6() MRC14(1, c0, c6, 3)
|
||||
#define RCP14_ETMDCVR8() MRC14(1, c0, c8, 3)
|
||||
#define RCP14_ETMDCVR10() MRC14(1, c0, c10, 3)
|
||||
#define RCP14_ETMDCVR12() MRC14(1, c0, c12, 3)
|
||||
#define RCP14_ETMDCVR14() MRC14(1, c0, c14, 3)
|
||||
#define RCP14_ETMDCMR0() MRC14(1, c0, c0, 4)
|
||||
#define RCP14_ETMDCMR2() MRC14(1, c0, c2, 4)
|
||||
#define RCP14_ETMDCMR4() MRC14(1, c0, c4, 4)
|
||||
#define RCP14_ETMDCMR6() MRC14(1, c0, c6, 4)
|
||||
#define RCP14_ETMDCMR8() MRC14(1, c0, c8, 4)
|
||||
#define RCP14_ETMDCMR10() MRC14(1, c0, c10, 4)
|
||||
#define RCP14_ETMDCMR12() MRC14(1, c0, c12, 4)
|
||||
#define RCP14_ETMDCMR14() MRC14(1, c0, c14, 4)
|
||||
#define RCP14_ETMCNTRLDVR0() MRC14(1, c0, c0, 5)
|
||||
#define RCP14_ETMCNTRLDVR1() MRC14(1, c0, c1, 5)
|
||||
#define RCP14_ETMCNTRLDVR2() MRC14(1, c0, c2, 5)
|
||||
#define RCP14_ETMCNTRLDVR3() MRC14(1, c0, c3, 5)
|
||||
#define RCP14_ETMCNTENR0() MRC14(1, c0, c4, 5)
|
||||
#define RCP14_ETMCNTENR1() MRC14(1, c0, c5, 5)
|
||||
#define RCP14_ETMCNTENR2() MRC14(1, c0, c6, 5)
|
||||
#define RCP14_ETMCNTENR3() MRC14(1, c0, c7, 5)
|
||||
#define RCP14_ETMCNTRLDEVR0() MRC14(1, c0, c8, 5)
|
||||
#define RCP14_ETMCNTRLDEVR1() MRC14(1, c0, c9, 5)
|
||||
#define RCP14_ETMCNTRLDEVR2() MRC14(1, c0, c10, 5)
|
||||
#define RCP14_ETMCNTRLDEVR3() MRC14(1, c0, c11, 5)
|
||||
#define RCP14_ETMCNTVR0() MRC14(1, c0, c12, 5)
|
||||
#define RCP14_ETMCNTVR1() MRC14(1, c0, c13, 5)
|
||||
#define RCP14_ETMCNTVR2() MRC14(1, c0, c14, 5)
|
||||
#define RCP14_ETMCNTVR3() MRC14(1, c0, c15, 5)
|
||||
#define RCP14_ETMSQ12EVR() MRC14(1, c0, c0, 6)
|
||||
#define RCP14_ETMSQ21EVR() MRC14(1, c0, c1, 6)
|
||||
#define RCP14_ETMSQ23EVR() MRC14(1, c0, c2, 6)
|
||||
#define RCP14_ETMSQ31EVR() MRC14(1, c0, c3, 6)
|
||||
#define RCP14_ETMSQ32EVR() MRC14(1, c0, c4, 6)
|
||||
#define RCP14_ETMSQ13EVR() MRC14(1, c0, c5, 6)
|
||||
#define RCP14_ETMSQR() MRC14(1, c0, c7, 6)
|
||||
#define RCP14_ETMEXTOUTEVR0() MRC14(1, c0, c8, 6)
|
||||
#define RCP14_ETMEXTOUTEVR1() MRC14(1, c0, c9, 6)
|
||||
#define RCP14_ETMEXTOUTEVR2() MRC14(1, c0, c10, 6)
|
||||
#define RCP14_ETMEXTOUTEVR3() MRC14(1, c0, c11, 6)
|
||||
#define RCP14_ETMCIDCVR0() MRC14(1, c0, c12, 6)
|
||||
#define RCP14_ETMCIDCVR1() MRC14(1, c0, c13, 6)
|
||||
#define RCP14_ETMCIDCVR2() MRC14(1, c0, c14, 6)
|
||||
#define RCP14_ETMCIDCMR() MRC14(1, c0, c15, 6)
|
||||
#define RCP14_ETMIMPSPEC0() MRC14(1, c0, c0, 7)
|
||||
#define RCP14_ETMIMPSPEC1() MRC14(1, c0, c1, 7)
|
||||
#define RCP14_ETMIMPSPEC2() MRC14(1, c0, c2, 7)
|
||||
#define RCP14_ETMIMPSPEC3() MRC14(1, c0, c3, 7)
|
||||
#define RCP14_ETMIMPSPEC4() MRC14(1, c0, c4, 7)
|
||||
#define RCP14_ETMIMPSPEC5() MRC14(1, c0, c5, 7)
|
||||
#define RCP14_ETMIMPSPEC6() MRC14(1, c0, c6, 7)
|
||||
#define RCP14_ETMIMPSPEC7() MRC14(1, c0, c7, 7)
|
||||
#define RCP14_ETMSYNCFR() MRC14(1, c0, c8, 7)
|
||||
#define RCP14_ETMIDR() MRC14(1, c0, c9, 7)
|
||||
#define RCP14_ETMCCER() MRC14(1, c0, c10, 7)
|
||||
#define RCP14_ETMEXTINSELR() MRC14(1, c0, c11, 7)
|
||||
#define RCP14_ETMTESSEICR() MRC14(1, c0, c12, 7)
|
||||
#define RCP14_ETMEIBCR() MRC14(1, c0, c13, 7)
|
||||
#define RCP14_ETMTSEVR() MRC14(1, c0, c14, 7)
|
||||
#define RCP14_ETMAUXCR() MRC14(1, c0, c15, 7)
|
||||
#define RCP14_ETMTRACEIDR() MRC14(1, c1, c0, 0)
|
||||
#define RCP14_ETMIDR2() MRC14(1, c1, c2, 0)
|
||||
#define RCP14_ETMVMIDCVR() MRC14(1, c1, c0, 1)
|
||||
#define RCP14_ETMOSLSR() MRC14(1, c1, c1, 4)
|
||||
/* Not available in PFTv1.1 */
|
||||
#define RCP14_ETMOSSRR() MRC14(1, c1, c2, 4)
|
||||
#define RCP14_ETMPDCR() MRC14(1, c1, c4, 4)
|
||||
#define RCP14_ETMPDSR() MRC14(1, c1, c5, 4)
|
||||
#define RCP14_ETMITCTRL() MRC14(1, c7, c0, 4)
|
||||
#define RCP14_ETMCLAIMSET() MRC14(1, c7, c8, 6)
|
||||
#define RCP14_ETMCLAIMCLR() MRC14(1, c7, c9, 6)
|
||||
#define RCP14_ETMLSR() MRC14(1, c7, c13, 6)
|
||||
#define RCP14_ETMAUTHSTATUS() MRC14(1, c7, c14, 6)
|
||||
#define RCP14_ETMDEVID() MRC14(1, c7, c2, 7)
|
||||
#define RCP14_ETMDEVTYPE() MRC14(1, c7, c3, 7)
|
||||
#define RCP14_ETMPIDR4() MRC14(1, c7, c4, 7)
|
||||
#define RCP14_ETMPIDR5() MRC14(1, c7, c5, 7)
|
||||
#define RCP14_ETMPIDR6() MRC14(1, c7, c6, 7)
|
||||
#define RCP14_ETMPIDR7() MRC14(1, c7, c7, 7)
|
||||
#define RCP14_ETMPIDR0() MRC14(1, c7, c8, 7)
|
||||
#define RCP14_ETMPIDR1() MRC14(1, c7, c9, 7)
|
||||
#define RCP14_ETMPIDR2() MRC14(1, c7, c10, 7)
|
||||
#define RCP14_ETMPIDR3() MRC14(1, c7, c11, 7)
|
||||
#define RCP14_ETMCIDR0() MRC14(1, c7, c12, 7)
|
||||
#define RCP14_ETMCIDR1() MRC14(1, c7, c13, 7)
|
||||
#define RCP14_ETMCIDR2() MRC14(1, c7, c14, 7)
|
||||
#define RCP14_ETMCIDR3() MRC14(1, c7, c15, 7)
|
||||
|
||||
#define WCP14_ETMCR(val) MCR14(val, 1, c0, c0, 0)
|
||||
#define WCP14_ETMTRIGGER(val) MCR14(val, 1, c0, c2, 0)
|
||||
#define WCP14_ETMASICCR(val) MCR14(val, 1, c0, c3, 0)
|
||||
#define WCP14_ETMSR(val) MCR14(val, 1, c0, c4, 0)
|
||||
#define WCP14_ETMTSSCR(val) MCR14(val, 1, c0, c6, 0)
|
||||
#define WCP14_ETMTECR2(val) MCR14(val, 1, c0, c7, 0)
|
||||
#define WCP14_ETMTEEVR(val) MCR14(val, 1, c0, c8, 0)
|
||||
#define WCP14_ETMTECR1(val) MCR14(val, 1, c0, c9, 0)
|
||||
#define WCP14_ETMFFRR(val) MCR14(val, 1, c0, c10, 0)
|
||||
#define WCP14_ETMFFLR(val) MCR14(val, 1, c0, c11, 0)
|
||||
#define WCP14_ETMVDEVR(val) MCR14(val, 1, c0, c12, 0)
|
||||
#define WCP14_ETMVDCR1(val) MCR14(val, 1, c0, c13, 0)
|
||||
#define WCP14_ETMVDCR2(val) MCR14(val, 1, c0, c14, 0)
|
||||
#define WCP14_ETMVDCR3(val) MCR14(val, 1, c0, c15, 0)
|
||||
#define WCP14_ETMACVR0(val) MCR14(val, 1, c0, c0, 1)
|
||||
#define WCP14_ETMACVR1(val) MCR14(val, 1, c0, c1, 1)
|
||||
#define WCP14_ETMACVR2(val) MCR14(val, 1, c0, c2, 1)
|
||||
#define WCP14_ETMACVR3(val) MCR14(val, 1, c0, c3, 1)
|
||||
#define WCP14_ETMACVR4(val) MCR14(val, 1, c0, c4, 1)
|
||||
#define WCP14_ETMACVR5(val) MCR14(val, 1, c0, c5, 1)
|
||||
#define WCP14_ETMACVR6(val) MCR14(val, 1, c0, c6, 1)
|
||||
#define WCP14_ETMACVR7(val) MCR14(val, 1, c0, c7, 1)
|
||||
#define WCP14_ETMACVR8(val) MCR14(val, 1, c0, c8, 1)
|
||||
#define WCP14_ETMACVR9(val) MCR14(val, 1, c0, c9, 1)
|
||||
#define WCP14_ETMACVR10(val) MCR14(val, 1, c0, c10, 1)
|
||||
#define WCP14_ETMACVR11(val) MCR14(val, 1, c0, c11, 1)
|
||||
#define WCP14_ETMACVR12(val) MCR14(val, 1, c0, c12, 1)
|
||||
#define WCP14_ETMACVR13(val) MCR14(val, 1, c0, c13, 1)
|
||||
#define WCP14_ETMACVR14(val) MCR14(val, 1, c0, c14, 1)
|
||||
#define WCP14_ETMACVR15(val) MCR14(val, 1, c0, c15, 1)
|
||||
#define WCP14_ETMACTR0(val) MCR14(val, 1, c0, c0, 2)
|
||||
#define WCP14_ETMACTR1(val) MCR14(val, 1, c0, c1, 2)
|
||||
#define WCP14_ETMACTR2(val) MCR14(val, 1, c0, c2, 2)
|
||||
#define WCP14_ETMACTR3(val) MCR14(val, 1, c0, c3, 2)
|
||||
#define WCP14_ETMACTR4(val) MCR14(val, 1, c0, c4, 2)
|
||||
#define WCP14_ETMACTR5(val) MCR14(val, 1, c0, c5, 2)
|
||||
#define WCP14_ETMACTR6(val) MCR14(val, 1, c0, c6, 2)
|
||||
#define WCP14_ETMACTR7(val) MCR14(val, 1, c0, c7, 2)
|
||||
#define WCP14_ETMACTR8(val) MCR14(val, 1, c0, c8, 2)
|
||||
#define WCP14_ETMACTR9(val) MCR14(val, 1, c0, c9, 2)
|
||||
#define WCP14_ETMACTR10(val) MCR14(val, 1, c0, c10, 2)
|
||||
#define WCP14_ETMACTR11(val) MCR14(val, 1, c0, c11, 2)
|
||||
#define WCP14_ETMACTR12(val) MCR14(val, 1, c0, c12, 2)
|
||||
#define WCP14_ETMACTR13(val) MCR14(val, 1, c0, c13, 2)
|
||||
#define WCP14_ETMACTR14(val) MCR14(val, 1, c0, c14, 2)
|
||||
#define WCP14_ETMACTR15(val) MCR14(val, 1, c0, c15, 2)
|
||||
#define WCP14_ETMDCVR0(val) MCR14(val, 1, c0, c0, 3)
|
||||
#define WCP14_ETMDCVR2(val) MCR14(val, 1, c0, c2, 3)
|
||||
#define WCP14_ETMDCVR4(val) MCR14(val, 1, c0, c4, 3)
|
||||
#define WCP14_ETMDCVR6(val) MCR14(val, 1, c0, c6, 3)
|
||||
#define WCP14_ETMDCVR8(val) MCR14(val, 1, c0, c8, 3)
|
||||
#define WCP14_ETMDCVR10(val) MCR14(val, 1, c0, c10, 3)
|
||||
#define WCP14_ETMDCVR12(val) MCR14(val, 1, c0, c12, 3)
|
||||
#define WCP14_ETMDCVR14(val) MCR14(val, 1, c0, c14, 3)
|
||||
#define WCP14_ETMDCMR0(val) MCR14(val, 1, c0, c0, 4)
|
||||
#define WCP14_ETMDCMR2(val) MCR14(val, 1, c0, c2, 4)
|
||||
#define WCP14_ETMDCMR4(val) MCR14(val, 1, c0, c4, 4)
|
||||
#define WCP14_ETMDCMR6(val) MCR14(val, 1, c0, c6, 4)
|
||||
#define WCP14_ETMDCMR8(val) MCR14(val, 1, c0, c8, 4)
|
||||
#define WCP14_ETMDCMR10(val) MCR14(val, 1, c0, c10, 4)
|
||||
#define WCP14_ETMDCMR12(val) MCR14(val, 1, c0, c12, 4)
|
||||
#define WCP14_ETMDCMR14(val) MCR14(val, 1, c0, c14, 4)
|
||||
#define WCP14_ETMCNTRLDVR0(val) MCR14(val, 1, c0, c0, 5)
|
||||
#define WCP14_ETMCNTRLDVR1(val) MCR14(val, 1, c0, c1, 5)
|
||||
#define WCP14_ETMCNTRLDVR2(val) MCR14(val, 1, c0, c2, 5)
|
||||
#define WCP14_ETMCNTRLDVR3(val) MCR14(val, 1, c0, c3, 5)
|
||||
#define WCP14_ETMCNTENR0(val) MCR14(val, 1, c0, c4, 5)
|
||||
#define WCP14_ETMCNTENR1(val) MCR14(val, 1, c0, c5, 5)
|
||||
#define WCP14_ETMCNTENR2(val) MCR14(val, 1, c0, c6, 5)
|
||||
#define WCP14_ETMCNTENR3(val) MCR14(val, 1, c0, c7, 5)
|
||||
#define WCP14_ETMCNTRLDEVR0(val) MCR14(val, 1, c0, c8, 5)
|
||||
#define WCP14_ETMCNTRLDEVR1(val) MCR14(val, 1, c0, c9, 5)
|
||||
#define WCP14_ETMCNTRLDEVR2(val) MCR14(val, 1, c0, c10, 5)
|
||||
#define WCP14_ETMCNTRLDEVR3(val) MCR14(val, 1, c0, c11, 5)
|
||||
#define WCP14_ETMCNTVR0(val) MCR14(val, 1, c0, c12, 5)
|
||||
#define WCP14_ETMCNTVR1(val) MCR14(val, 1, c0, c13, 5)
|
||||
#define WCP14_ETMCNTVR2(val) MCR14(val, 1, c0, c14, 5)
|
||||
#define WCP14_ETMCNTVR3(val) MCR14(val, 1, c0, c15, 5)
|
||||
#define WCP14_ETMSQ12EVR(val) MCR14(val, 1, c0, c0, 6)
|
||||
#define WCP14_ETMSQ21EVR(val) MCR14(val, 1, c0, c1, 6)
|
||||
#define WCP14_ETMSQ23EVR(val) MCR14(val, 1, c0, c2, 6)
|
||||
#define WCP14_ETMSQ31EVR(val) MCR14(val, 1, c0, c3, 6)
|
||||
#define WCP14_ETMSQ32EVR(val) MCR14(val, 1, c0, c4, 6)
|
||||
#define WCP14_ETMSQ13EVR(val) MCR14(val, 1, c0, c5, 6)
|
||||
#define WCP14_ETMSQR(val) MCR14(val, 1, c0, c7, 6)
|
||||
#define WCP14_ETMEXTOUTEVR0(val) MCR14(val, 1, c0, c8, 6)
|
||||
#define WCP14_ETMEXTOUTEVR1(val) MCR14(val, 1, c0, c9, 6)
|
||||
#define WCP14_ETMEXTOUTEVR2(val) MCR14(val, 1, c0, c10, 6)
|
||||
#define WCP14_ETMEXTOUTEVR3(val) MCR14(val, 1, c0, c11, 6)
|
||||
#define WCP14_ETMCIDCVR0(val) MCR14(val, 1, c0, c12, 6)
|
||||
#define WCP14_ETMCIDCVR1(val) MCR14(val, 1, c0, c13, 6)
|
||||
#define WCP14_ETMCIDCVR2(val) MCR14(val, 1, c0, c14, 6)
|
||||
#define WCP14_ETMCIDCMR(val) MCR14(val, 1, c0, c15, 6)
|
||||
#define WCP14_ETMIMPSPEC0(val) MCR14(val, 1, c0, c0, 7)
|
||||
#define WCP14_ETMIMPSPEC1(val) MCR14(val, 1, c0, c1, 7)
|
||||
#define WCP14_ETMIMPSPEC2(val) MCR14(val, 1, c0, c2, 7)
|
||||
#define WCP14_ETMIMPSPEC3(val) MCR14(val, 1, c0, c3, 7)
|
||||
#define WCP14_ETMIMPSPEC4(val) MCR14(val, 1, c0, c4, 7)
|
||||
#define WCP14_ETMIMPSPEC5(val) MCR14(val, 1, c0, c5, 7)
|
||||
#define WCP14_ETMIMPSPEC6(val) MCR14(val, 1, c0, c6, 7)
|
||||
#define WCP14_ETMIMPSPEC7(val) MCR14(val, 1, c0, c7, 7)
|
||||
/* Can be read only in ETMv3.4, ETMv3.5 */
|
||||
#define WCP14_ETMSYNCFR(val) MCR14(val, 1, c0, c8, 7)
|
||||
#define WCP14_ETMEXTINSELR(val) MCR14(val, 1, c0, c11, 7)
|
||||
#define WCP14_ETMTESSEICR(val) MCR14(val, 1, c0, c12, 7)
|
||||
#define WCP14_ETMEIBCR(val) MCR14(val, 1, c0, c13, 7)
|
||||
#define WCP14_ETMTSEVR(val) MCR14(val, 1, c0, c14, 7)
|
||||
#define WCP14_ETMAUXCR(val) MCR14(val, 1, c0, c15, 7)
|
||||
#define WCP14_ETMTRACEIDR(val) MCR14(val, 1, c1, c0, 0)
|
||||
#define WCP14_ETMIDR2(val) MCR14(val, 1, c1, c2, 0)
|
||||
#define WCP14_ETMVMIDCVR(val) MCR14(val, 1, c1, c0, 1)
|
||||
#define WCP14_ETMOSLAR(val) MCR14(val, 1, c1, c0, 4)
|
||||
/* Not available in PFTv1.1 */
|
||||
#define WCP14_ETMOSSRR(val) MCR14(val, 1, c1, c2, 4)
|
||||
#define WCP14_ETMPDCR(val) MCR14(val, 1, c1, c4, 4)
|
||||
#define WCP14_ETMPDSR(val) MCR14(val, 1, c1, c5, 4)
|
||||
#define WCP14_ETMITCTRL(val) MCR14(val, 1, c7, c0, 4)
|
||||
#define WCP14_ETMCLAIMSET(val) MCR14(val, 1, c7, c8, 6)
|
||||
#define WCP14_ETMCLAIMCLR(val) MCR14(val, 1, c7, c9, 6)
|
||||
/* Writes to this from CP14 interface are ignored */
|
||||
#define WCP14_ETMLAR(val) MCR14(val, 1, c7, c12, 6)
|
||||
|
||||
#endif
|
||||
|
|
@ -30,7 +30,6 @@ else
|
|||
obj-y += entry-armv.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_OC_ETM) += etm.o
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||
obj-$(CONFIG_FIQ) += fiq.o fiqasm.o
|
||||
|
|
|
|||
|
|
@ -1,654 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/kernel/etm.c
|
||||
*
|
||||
* Driver for ARM's Embedded Trace Macrocell and Embedded Trace Buffer.
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation.
|
||||
* Alexander Shishkin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/hardware/coresight.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Alexander Shishkin");
|
||||
|
||||
/*
|
||||
* ETM tracer state
|
||||
*/
|
||||
struct tracectx {
|
||||
unsigned int etb_bufsz;
|
||||
void __iomem *etb_regs;
|
||||
void __iomem *etm_regs;
|
||||
unsigned long flags;
|
||||
int ncmppairs;
|
||||
int etm_portsz;
|
||||
struct device *dev;
|
||||
struct clk *emu_clk;
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
static struct tracectx tracer;
|
||||
|
||||
static inline bool trace_isrunning(struct tracectx *t)
|
||||
{
|
||||
return !!(t->flags & TRACER_RUNNING);
|
||||
}
|
||||
|
||||
static int etm_setup_address_range(struct tracectx *t, int n,
|
||||
unsigned long start, unsigned long end, int exclude, int data)
|
||||
{
|
||||
u32 flags = ETMAAT_ARM | ETMAAT_IGNCONTEXTID | ETMAAT_NSONLY | \
|
||||
ETMAAT_NOVALCMP;
|
||||
|
||||
if (n < 1 || n > t->ncmppairs)
|
||||
return -EINVAL;
|
||||
|
||||
/* comparators and ranges are numbered starting with 1 as opposed
|
||||
* to bits in a word */
|
||||
n--;
|
||||
|
||||
if (data)
|
||||
flags |= ETMAAT_DLOADSTORE;
|
||||
else
|
||||
flags |= ETMAAT_IEXEC;
|
||||
|
||||
/* first comparator for the range */
|
||||
etm_writel(t, flags, ETMR_COMP_ACC_TYPE(n * 2));
|
||||
etm_writel(t, start, ETMR_COMP_VAL(n * 2));
|
||||
|
||||
/* second comparator is right next to it */
|
||||
etm_writel(t, flags, ETMR_COMP_ACC_TYPE(n * 2 + 1));
|
||||
etm_writel(t, end, ETMR_COMP_VAL(n * 2 + 1));
|
||||
|
||||
flags = exclude ? ETMTE_INCLEXCL : 0;
|
||||
etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int trace_start(struct tracectx *t)
|
||||
{
|
||||
u32 v;
|
||||
unsigned long timeout = TRACER_TIMEOUT;
|
||||
|
||||
etb_unlock(t);
|
||||
|
||||
etb_writel(t, 0, ETBR_FORMATTERCTRL);
|
||||
etb_writel(t, 1, ETBR_CTRL);
|
||||
|
||||
etb_lock(t);
|
||||
|
||||
/* configure etm */
|
||||
v = ETMCTRL_OPTS | ETMCTRL_PROGRAM | ETMCTRL_PORTSIZE(t->etm_portsz);
|
||||
|
||||
if (t->flags & TRACER_CYCLE_ACC)
|
||||
v |= ETMCTRL_CYCLEACCURATE;
|
||||
|
||||
etm_unlock(t);
|
||||
|
||||
etm_writel(t, v, ETMR_CTRL);
|
||||
|
||||
while (!(etm_readl(t, ETMR_CTRL) & ETMCTRL_PROGRAM) && --timeout)
|
||||
;
|
||||
if (!timeout) {
|
||||
dev_dbg(t->dev, "Waiting for progbit to assert timed out\n");
|
||||
etm_lock(t);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
etm_setup_address_range(t, 1, (unsigned long)_stext,
|
||||
(unsigned long)_etext, 0, 0);
|
||||
etm_writel(t, 0, ETMR_TRACEENCTRL2);
|
||||
etm_writel(t, 0, ETMR_TRACESSCTRL);
|
||||
etm_writel(t, 0x6f, ETMR_TRACEENEVT);
|
||||
|
||||
v &= ~ETMCTRL_PROGRAM;
|
||||
v |= ETMCTRL_PORTSEL;
|
||||
|
||||
etm_writel(t, v, ETMR_CTRL);
|
||||
|
||||
timeout = TRACER_TIMEOUT;
|
||||
while (etm_readl(t, ETMR_CTRL) & ETMCTRL_PROGRAM && --timeout)
|
||||
;
|
||||
if (!timeout) {
|
||||
dev_dbg(t->dev, "Waiting for progbit to deassert timed out\n");
|
||||
etm_lock(t);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
etm_lock(t);
|
||||
|
||||
t->flags |= TRACER_RUNNING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int trace_stop(struct tracectx *t)
|
||||
{
|
||||
unsigned long timeout = TRACER_TIMEOUT;
|
||||
|
||||
etm_unlock(t);
|
||||
|
||||
etm_writel(t, 0x440, ETMR_CTRL);
|
||||
while (!(etm_readl(t, ETMR_CTRL) & ETMCTRL_PROGRAM) && --timeout)
|
||||
;
|
||||
if (!timeout) {
|
||||
dev_dbg(t->dev, "Waiting for progbit to assert timed out\n");
|
||||
etm_lock(t);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
etm_lock(t);
|
||||
|
||||
etb_unlock(t);
|
||||
etb_writel(t, ETBFF_MANUAL_FLUSH, ETBR_FORMATTERCTRL);
|
||||
|
||||
timeout = TRACER_TIMEOUT;
|
||||
while (etb_readl(t, ETBR_FORMATTERCTRL) &
|
||||
ETBFF_MANUAL_FLUSH && --timeout)
|
||||
;
|
||||
if (!timeout) {
|
||||
dev_dbg(t->dev, "Waiting for formatter flush to commence "
|
||||
"timed out\n");
|
||||
etb_lock(t);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
etb_writel(t, 0, ETBR_CTRL);
|
||||
|
||||
etb_lock(t);
|
||||
|
||||
t->flags &= ~TRACER_RUNNING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int etb_getdatalen(struct tracectx *t)
|
||||
{
|
||||
u32 v;
|
||||
int rp, wp;
|
||||
|
||||
v = etb_readl(t, ETBR_STATUS);
|
||||
|
||||
if (v & 1)
|
||||
return t->etb_bufsz;
|
||||
|
||||
rp = etb_readl(t, ETBR_READADDR);
|
||||
wp = etb_readl(t, ETBR_WRITEADDR);
|
||||
|
||||
if (rp > wp) {
|
||||
etb_writel(t, 0, ETBR_READADDR);
|
||||
etb_writel(t, 0, ETBR_WRITEADDR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return wp - rp;
|
||||
}
|
||||
|
||||
/* sysrq+v will always stop the running trace and leave it at that */
|
||||
static void etm_dump(void)
|
||||
{
|
||||
struct tracectx *t = &tracer;
|
||||
u32 first = 0;
|
||||
int length;
|
||||
|
||||
if (!t->etb_regs) {
|
||||
pr_info("No tracing hardware found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (trace_isrunning(t))
|
||||
trace_stop(t);
|
||||
|
||||
etb_unlock(t);
|
||||
|
||||
length = etb_getdatalen(t);
|
||||
|
||||
if (length == t->etb_bufsz)
|
||||
first = etb_readl(t, ETBR_WRITEADDR);
|
||||
|
||||
etb_writel(t, first, ETBR_READADDR);
|
||||
|
||||
pr_info("Trace buffer contents length: %d\n", length);
|
||||
pr_info("--- ETB buffer begin ---\n");
|
||||
for (; length; length--)
|
||||
printk("%08x", cpu_to_be32(etb_readl(t, ETBR_READMEM)));
|
||||
pr_info("\n--- ETB buffer end ---\n");
|
||||
|
||||
/* deassert the overflow bit */
|
||||
etb_writel(t, 1, ETBR_CTRL);
|
||||
etb_writel(t, 0, ETBR_CTRL);
|
||||
|
||||
etb_writel(t, 0, ETBR_TRIGGERCOUNT);
|
||||
etb_writel(t, 0, ETBR_READADDR);
|
||||
etb_writel(t, 0, ETBR_WRITEADDR);
|
||||
|
||||
etb_lock(t);
|
||||
}
|
||||
|
||||
static void sysrq_etm_dump(int key)
|
||||
{
|
||||
dev_dbg(tracer.dev, "Dumping ETB buffer\n");
|
||||
etm_dump();
|
||||
}
|
||||
|
||||
static struct sysrq_key_op sysrq_etm_op = {
|
||||
.handler = sysrq_etm_dump,
|
||||
.help_msg = "etm-buffer-dump(v)",
|
||||
.action_msg = "etm",
|
||||
};
|
||||
|
||||
static int etb_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (!tracer.etb_regs)
|
||||
return -ENODEV;
|
||||
|
||||
file->private_data = &tracer;
|
||||
|
||||
return nonseekable_open(inode, file);
|
||||
}
|
||||
|
||||
static ssize_t etb_read(struct file *file, char __user *data,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
int total, i;
|
||||
long length;
|
||||
struct tracectx *t = file->private_data;
|
||||
u32 first = 0;
|
||||
u32 *buf;
|
||||
|
||||
mutex_lock(&t->mutex);
|
||||
|
||||
if (trace_isrunning(t)) {
|
||||
length = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
etb_unlock(t);
|
||||
|
||||
total = etb_getdatalen(t);
|
||||
if (total == t->etb_bufsz)
|
||||
first = etb_readl(t, ETBR_WRITEADDR);
|
||||
|
||||
etb_writel(t, first, ETBR_READADDR);
|
||||
|
||||
length = min(total * 4, (int)len);
|
||||
buf = vmalloc(length);
|
||||
|
||||
dev_dbg(t->dev, "ETB buffer length: %d\n", total);
|
||||
dev_dbg(t->dev, "ETB status reg: %x\n", etb_readl(t, ETBR_STATUS));
|
||||
for (i = 0; i < length / 4; i++)
|
||||
buf[i] = etb_readl(t, ETBR_READMEM);
|
||||
|
||||
/* the only way to deassert overflow bit in ETB status is this */
|
||||
etb_writel(t, 1, ETBR_CTRL);
|
||||
etb_writel(t, 0, ETBR_CTRL);
|
||||
|
||||
etb_writel(t, 0, ETBR_WRITEADDR);
|
||||
etb_writel(t, 0, ETBR_READADDR);
|
||||
etb_writel(t, 0, ETBR_TRIGGERCOUNT);
|
||||
|
||||
etb_lock(t);
|
||||
|
||||
length -= copy_to_user(data, buf, length);
|
||||
vfree(buf);
|
||||
|
||||
out:
|
||||
mutex_unlock(&t->mutex);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static int etb_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
/* there's nothing to do here, actually */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations etb_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = etb_read,
|
||||
.open = etb_open,
|
||||
.release = etb_release,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
||||
static struct miscdevice etb_miscdev = {
|
||||
.name = "tracebuf",
|
||||
.minor = 0,
|
||||
.fops = &etb_fops,
|
||||
};
|
||||
|
||||
static int etb_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
{
|
||||
struct tracectx *t = &tracer;
|
||||
int ret = 0;
|
||||
|
||||
ret = amba_request_regions(dev, NULL);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
t->etb_regs = ioremap_nocache(dev->res.start, resource_size(&dev->res));
|
||||
if (!t->etb_regs) {
|
||||
ret = -ENOMEM;
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
amba_set_drvdata(dev, t);
|
||||
|
||||
etb_miscdev.parent = &dev->dev;
|
||||
|
||||
ret = misc_register(&etb_miscdev);
|
||||
if (ret)
|
||||
goto out_unmap;
|
||||
|
||||
t->emu_clk = clk_get(&dev->dev, "emu_src_ck");
|
||||
if (IS_ERR(t->emu_clk)) {
|
||||
dev_dbg(&dev->dev, "Failed to obtain emu_src_ck.\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
clk_enable(t->emu_clk);
|
||||
|
||||
etb_unlock(t);
|
||||
t->etb_bufsz = etb_readl(t, ETBR_DEPTH);
|
||||
dev_dbg(&dev->dev, "Size: %x\n", t->etb_bufsz);
|
||||
|
||||
/* make sure trace capture is disabled */
|
||||
etb_writel(t, 0, ETBR_CTRL);
|
||||
etb_writel(t, 0x1000, ETBR_FORMATTERCTRL);
|
||||
etb_lock(t);
|
||||
|
||||
dev_dbg(&dev->dev, "ETB AMBA driver initialized.\n");
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_unmap:
|
||||
iounmap(t->etb_regs);
|
||||
|
||||
out_release:
|
||||
amba_release_regions(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int etb_remove(struct amba_device *dev)
|
||||
{
|
||||
struct tracectx *t = amba_get_drvdata(dev);
|
||||
|
||||
iounmap(t->etb_regs);
|
||||
t->etb_regs = NULL;
|
||||
|
||||
clk_disable(t->emu_clk);
|
||||
clk_put(t->emu_clk);
|
||||
|
||||
amba_release_regions(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct amba_id etb_ids[] = {
|
||||
{
|
||||
.id = 0x0003b907,
|
||||
.mask = 0x0007ffff,
|
||||
},
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
static struct amba_driver etb_driver = {
|
||||
.drv = {
|
||||
.name = "etb",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = etb_probe,
|
||||
.remove = etb_remove,
|
||||
.id_table = etb_ids,
|
||||
};
|
||||
|
||||
/* use a sysfs file "trace_running" to start/stop tracing */
|
||||
static ssize_t trace_running_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%x\n", trace_isrunning(&tracer));
|
||||
}
|
||||
|
||||
static ssize_t trace_running_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t n)
|
||||
{
|
||||
unsigned int value;
|
||||
int ret;
|
||||
|
||||
if (sscanf(buf, "%u", &value) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&tracer.mutex);
|
||||
ret = value ? trace_start(&tracer) : trace_stop(&tracer);
|
||||
mutex_unlock(&tracer.mutex);
|
||||
|
||||
return ret ? : n;
|
||||
}
|
||||
|
||||
static struct kobj_attribute trace_running_attr =
|
||||
__ATTR(trace_running, 0644, trace_running_show, trace_running_store);
|
||||
|
||||
static ssize_t trace_info_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
u32 etb_wa, etb_ra, etb_st, etb_fc, etm_ctrl, etm_st;
|
||||
int datalen;
|
||||
|
||||
etb_unlock(&tracer);
|
||||
datalen = etb_getdatalen(&tracer);
|
||||
etb_wa = etb_readl(&tracer, ETBR_WRITEADDR);
|
||||
etb_ra = etb_readl(&tracer, ETBR_READADDR);
|
||||
etb_st = etb_readl(&tracer, ETBR_STATUS);
|
||||
etb_fc = etb_readl(&tracer, ETBR_FORMATTERCTRL);
|
||||
etb_lock(&tracer);
|
||||
|
||||
etm_unlock(&tracer);
|
||||
etm_ctrl = etm_readl(&tracer, ETMR_CTRL);
|
||||
etm_st = etm_readl(&tracer, ETMR_STATUS);
|
||||
etm_lock(&tracer);
|
||||
|
||||
return sprintf(buf, "Trace buffer len: %d\nComparator pairs: %d\n"
|
||||
"ETBR_WRITEADDR:\t%08x\n"
|
||||
"ETBR_READADDR:\t%08x\n"
|
||||
"ETBR_STATUS:\t%08x\n"
|
||||
"ETBR_FORMATTERCTRL:\t%08x\n"
|
||||
"ETMR_CTRL:\t%08x\n"
|
||||
"ETMR_STATUS:\t%08x\n",
|
||||
datalen,
|
||||
tracer.ncmppairs,
|
||||
etb_wa,
|
||||
etb_ra,
|
||||
etb_st,
|
||||
etb_fc,
|
||||
etm_ctrl,
|
||||
etm_st
|
||||
);
|
||||
}
|
||||
|
||||
static struct kobj_attribute trace_info_attr =
|
||||
__ATTR(trace_info, 0444, trace_info_show, NULL);
|
||||
|
||||
static ssize_t trace_mode_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d %d\n",
|
||||
!!(tracer.flags & TRACER_CYCLE_ACC),
|
||||
tracer.etm_portsz);
|
||||
}
|
||||
|
||||
static ssize_t trace_mode_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t n)
|
||||
{
|
||||
unsigned int cycacc, portsz;
|
||||
|
||||
if (sscanf(buf, "%u %u", &cycacc, &portsz) != 2)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&tracer.mutex);
|
||||
if (cycacc)
|
||||
tracer.flags |= TRACER_CYCLE_ACC;
|
||||
else
|
||||
tracer.flags &= ~TRACER_CYCLE_ACC;
|
||||
|
||||
tracer.etm_portsz = portsz & 0x0f;
|
||||
mutex_unlock(&tracer.mutex);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static struct kobj_attribute trace_mode_attr =
|
||||
__ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);
|
||||
|
||||
static int etm_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
{
|
||||
struct tracectx *t = &tracer;
|
||||
int ret = 0;
|
||||
|
||||
if (t->etm_regs) {
|
||||
dev_dbg(&dev->dev, "ETM already initialized\n");
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = amba_request_regions(dev, NULL);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
t->etm_regs = ioremap_nocache(dev->res.start, resource_size(&dev->res));
|
||||
if (!t->etm_regs) {
|
||||
ret = -ENOMEM;
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
amba_set_drvdata(dev, t);
|
||||
|
||||
mutex_init(&t->mutex);
|
||||
t->dev = &dev->dev;
|
||||
t->flags = TRACER_CYCLE_ACC;
|
||||
t->etm_portsz = 1;
|
||||
|
||||
etm_unlock(t);
|
||||
(void)etm_readl(t, ETMMR_PDSR);
|
||||
/* dummy first read */
|
||||
(void)etm_readl(&tracer, ETMMR_OSSRR);
|
||||
|
||||
t->ncmppairs = etm_readl(t, ETMR_CONFCODE) & 0xf;
|
||||
etm_writel(t, 0x440, ETMR_CTRL);
|
||||
etm_lock(t);
|
||||
|
||||
ret = sysfs_create_file(&dev->dev.kobj,
|
||||
&trace_running_attr.attr);
|
||||
if (ret)
|
||||
goto out_unmap;
|
||||
|
||||
/* failing to create any of these two is not fatal */
|
||||
ret = sysfs_create_file(&dev->dev.kobj, &trace_info_attr.attr);
|
||||
if (ret)
|
||||
dev_dbg(&dev->dev, "Failed to create trace_info in sysfs\n");
|
||||
|
||||
ret = sysfs_create_file(&dev->dev.kobj, &trace_mode_attr.attr);
|
||||
if (ret)
|
||||
dev_dbg(&dev->dev, "Failed to create trace_mode in sysfs\n");
|
||||
|
||||
dev_dbg(t->dev, "ETM AMBA driver initialized.\n");
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_unmap:
|
||||
iounmap(t->etm_regs);
|
||||
|
||||
out_release:
|
||||
amba_release_regions(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int etm_remove(struct amba_device *dev)
|
||||
{
|
||||
struct tracectx *t = amba_get_drvdata(dev);
|
||||
|
||||
iounmap(t->etm_regs);
|
||||
t->etm_regs = NULL;
|
||||
|
||||
amba_release_regions(dev);
|
||||
|
||||
sysfs_remove_file(&dev->dev.kobj, &trace_running_attr.attr);
|
||||
sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr);
|
||||
sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct amba_id etm_ids[] = {
|
||||
{
|
||||
.id = 0x0003b921,
|
||||
.mask = 0x0007ffff,
|
||||
},
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
static struct amba_driver etm_driver = {
|
||||
.drv = {
|
||||
.name = "etm",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = etm_probe,
|
||||
.remove = etm_remove,
|
||||
.id_table = etm_ids,
|
||||
};
|
||||
|
||||
static int __init etm_init(void)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = amba_driver_register(&etb_driver);
|
||||
if (retval) {
|
||||
pr_err("Failed to register etb\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = amba_driver_register(&etm_driver);
|
||||
if (retval) {
|
||||
amba_driver_unregister(&etb_driver);
|
||||
pr_err("Failed to probe etm\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* not being able to install this handler is not fatal */
|
||||
(void)register_sysrq_key('v', &sysrq_etm_op);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(etm_init);
|
||||
|
||||
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/cpu_pm.h>
|
||||
#include <linux/coresight.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cputype.h>
|
||||
|
|
@ -36,7 +37,6 @@
|
|||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/kdebug.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/hardware/coresight.h>
|
||||
|
||||
/* Breakpoint currently in use for each BRP. */
|
||||
static DEFINE_PER_CPU(struct perf_event *, bp_on_reg[ARM_MAX_BRP]);
|
||||
|
|
@ -976,7 +976,7 @@ static void reset_ctrl_regs(void *unused)
|
|||
* Unconditionally clear the OS lock by writing a value
|
||||
* other than CS_LAR_KEY to the access register.
|
||||
*/
|
||||
ARM_DBG_WRITE(c1, c0, 4, ~CS_LAR_KEY);
|
||||
ARM_DBG_WRITE(c1, c0, 4, ~CORESIGHT_UNLOCK);
|
||||
isb();
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -278,14 +278,6 @@ config MACH_SBC3530
|
|||
default y
|
||||
select OMAP_PACKAGE_CUS
|
||||
|
||||
config OMAP3_EMU
|
||||
bool "OMAP3 debugging peripherals"
|
||||
depends on ARCH_OMAP3
|
||||
select ARM_AMBA
|
||||
select OC_ETM
|
||||
help
|
||||
Say Y here to enable debugging hardware of omap3
|
||||
|
||||
config OMAP3_SDRC_AC_TIMING
|
||||
bool "Enable SDRC AC timing register changes"
|
||||
depends on ARCH_OMAP3
|
||||
|
|
|
|||
|
|
@ -228,7 +228,6 @@ obj-$(CONFIG_SOC_OMAP5) += omap_hwmod_54xx_data.o
|
|||
obj-$(CONFIG_SOC_DRA7XX) += omap_hwmod_7xx_data.o
|
||||
|
||||
# EMU peripherals
|
||||
obj-$(CONFIG_OMAP3_EMU) += emu.o
|
||||
obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o
|
||||
|
||||
iommu-$(CONFIG_OMAP_IOMMU) := omap-iommu.o
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue