diff mbox series

[2/2] Remove skiboot 'trace' infrastructure

Message ID 20181212002114.8576-3-joel@jms.id.au
State Rejected
Headers show
Series Tracing fixes | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success master/apply_patch Successfully applied
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master

Commit Message

Joel Stanley Dec. 12, 2018, 12:21 a.m. UTC
This feature has bit rotted. For instance, the FSP TCE mapping was
broken in 2015 by commit f2a7a5c23d81 ("Move boot_tracebuf to BSS"),
and no one seems to have noticed.

Signed-off-by: Joel Stanley <joel@jms.id.au>
---
 .gitignore                  |   2 -
 core/Makefile.inc           |   2 +-
 core/affinity.c             |   1 -
 core/cpu.c                  |   5 -
 core/init.c                 |   5 -
 core/opal.c                 |  26 ---
 core/test/Makefile.check    |   2 +-
 core/test/run-trace.c       | 398 ------------------------------------
 core/trace.c                | 246 ----------------------
 external/trace/Makefile     |   7 -
 external/trace/dump_trace.c | 198 ------------------
 external/trace/trace.c      | 112 ----------
 external/trace/trace.h      |  20 --
 hw/fsp/fsp.c                |  78 +------
 hw/lpc-mbox.c               |   1 -
 hw/lpc-uart.c               |  21 +-
 hw/psi.c                    |   1 -
 hw/sbe-p9.c                 |   1 -
 include/cpu.h               |   1 -
 include/debug_descriptor.h  |  10 +-
 include/trace.h             |  46 -----
 include/trace_types.h       | 134 ------------
 platforms/ibm-fsp/common.c  |  36 +---
 23 files changed, 8 insertions(+), 1345 deletions(-)
 delete mode 100644 core/test/run-trace.c
 delete mode 100644 core/trace.c
 delete mode 100644 external/trace/Makefile
 delete mode 100644 external/trace/dump_trace.c
 delete mode 100644 external/trace/trace.c
 delete mode 100644 external/trace/trace.h
 delete mode 100644 include/trace.h
 delete mode 100644 include/trace_types.h

Comments

Stewart Smith Dec. 12, 2018, 3:57 a.m. UTC | #1
Joel Stanley <joel@jms.id.au> writes:
> This feature has bit rotted. For instance, the FSP TCE mapping was
> broken in 2015 by commit f2a7a5c23d81 ("Move boot_tracebuf to BSS"),
> and no one seems to have noticed.

Oliver, you were showing signs in Slack of "volunteering" of becoming
the maintainer of this stuff and cleaning up.

Your thoughts on ripping it out for the moment versus just ripping out
the FSP bit in patch 1?
Joel Stanley Dec. 12, 2018, 4:06 a.m. UTC | #2
On Wed, 12 Dec 2018 at 14:28, Stewart Smith <stewart@linux.ibm.com> wrote:
>
> Joel Stanley <joel@jms.id.au> writes:
> > This feature has bit rotted. For instance, the FSP TCE mapping was
> > broken in 2015 by commit f2a7a5c23d81 ("Move boot_tracebuf to BSS"),
> > and no one seems to have noticed.
>
> Oliver, you were showing signs in Slack of "volunteering" of becoming
> the maintainer of this stuff and cleaning up.
>
> Your thoughts on ripping it out for the moment versus just ripping out
> the FSP bit in patch 1?

The linker script bit is a noop, as f2a7a5c23d81 stopped using the
section defined in the linker script.

The comment about FSP was from map_debug_areas in
platforms/ibm-fsp/common.c. I assumed that Ben had the traces in a
defined area for it to be mapped properly. But I could be interpreting
the intent of that wrong.>
> --
> Stewart Smith
> OPAL Architect, IBM.
>
Oliver O'Halloran Dec. 16, 2018, 12:30 a.m. UTC | #3
On Wed, Dec 12, 2018 at 3:07 PM Joel Stanley <joel@jms.id.au> wrote:
>
> On Wed, 12 Dec 2018 at 14:28, Stewart Smith <stewart@linux.ibm.com> wrote:
> >
> > Joel Stanley <joel@jms.id.au> writes:
> > > This feature has bit rotted. For instance, the FSP TCE mapping was
> > > broken in 2015 by commit f2a7a5c23d81 ("Move boot_tracebuf to BSS"),
> > > and no one seems to have noticed.
> >
> > Oliver, you were showing signs in Slack of "volunteering" of becoming
> > the maintainer of this stuff and cleaning up.
> >
> > Your thoughts on ripping it out for the moment versus just ripping out
> > the FSP bit in patch 1?
>
> The linker script bit is a noop, as f2a7a5c23d81 stopped using the
> section defined in the linker script.
>
> The comment about FSP was from map_debug_areas in
> platforms/ibm-fsp/common.c. I assumed that Ben had the traces in a
> defined area for it to be mapped properly. But I could be interpreting
> the intent of that wrong.

Yes, it was placed in it's own section so that the linker script could
force it to a 4K alignment. Moving it to .bss would be fine if we
fixed the linker script rather than removing the section annotation.

Anyway, I have plans to use this stuff and as soon as I do it's going
to require either:
a) Reverting this patch to remove it, or
b) Rewriting it entirely

There's not much point in either, so leave this alone.


> > Stewart Smith
> > OPAL Architect, IBM.
> >
Stewart Smith May 22, 2019, 3:25 a.m. UTC | #4
Oliver <oohall@gmail.com> writes:
> On Wed, Dec 12, 2018 at 3:07 PM Joel Stanley <joel@jms.id.au> wrote:
>>
>> On Wed, 12 Dec 2018 at 14:28, Stewart Smith <stewart@linux.ibm.com> wrote:
>> >
>> > Joel Stanley <joel@jms.id.au> writes:
>> > > This feature has bit rotted. For instance, the FSP TCE mapping was
>> > > broken in 2015 by commit f2a7a5c23d81 ("Move boot_tracebuf to BSS"),
>> > > and no one seems to have noticed.
>> >
>> > Oliver, you were showing signs in Slack of "volunteering" of becoming
>> > the maintainer of this stuff and cleaning up.
>> >
>> > Your thoughts on ripping it out for the moment versus just ripping out
>> > the FSP bit in patch 1?
>>
>> The linker script bit is a noop, as f2a7a5c23d81 stopped using the
>> section defined in the linker script.
>>
>> The comment about FSP was from map_debug_areas in
>> platforms/ibm-fsp/common.c. I assumed that Ben had the traces in a
>> defined area for it to be mapped properly. But I could be interpreting
>> the intent of that wrong.
>
> Yes, it was placed in it's own section so that the linker script could
> force it to a 4K alignment. Moving it to .bss would be fine if we
> fixed the linker script rather than removing the section annotation.
>
> Anyway, I have plans to use this stuff and as soon as I do it's going
> to require either:
> a) Reverting this patch to remove it, or
> b) Rewriting it entirely
>
> There's not much point in either, so leave this alone.

Jordan's series on updating things recently went in, so there's some
amount of care for the trace infrastructure. I'm going to hold off on
the removal of it, and maybe if nobody uses it for more than the 5 years
it's been between uses then we should look at ripping it out?
diff mbox series

Patch

diff --git a/.gitignore b/.gitignore
index fc09a0d28b9b..05f5069377ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,7 +61,6 @@  core/test/run-msg
 core/test/run-nvram-format
 core/test/run-pel
 core/test/run-pool
-core/test/run-trace
 core/test/run-api-test
 core/test/run-bitmap
 core/test/run-buddy
@@ -69,7 +68,6 @@  core/test/run-flash-subpartition
 core/test/*-gcov
 debian-jessie-vmlinux
 debian-jessie-initrd.gz
-external/dump_trace
 external/mambo/skiboot-boot_test.dump
 external/mambo/skiboot-hello_world.dump
 external/mambo/mambo-socket-proxy
diff --git a/core/Makefile.inc b/core/Makefile.inc
index 3bdfd09dab96..b97fbc606460 100644
--- a/core/Makefile.inc
+++ b/core/Makefile.inc
@@ -4,7 +4,7 @@  SUBDIRS += core
 CORE_OBJS = relocate.o console.o stack.o init.o chip.o mem_region.o
 CORE_OBJS += malloc.o lock.o cpu.o utils.o fdt.o opal.o interrupts.o timebase.o
 CORE_OBJS += opal-msg.o pci.o pci-iov.o pci-virt.o pci-slot.o pcie-slot.o
-CORE_OBJS += pci-opal.o fast-reboot.o device.o exceptions.o trace.o affinity.o
+CORE_OBJS += pci-opal.o fast-reboot.o device.o exceptions.o affinity.o
 CORE_OBJS += vpd.o hostservices.o platform.o nvram.o nvram-format.o hmi.o
 CORE_OBJS += console-log.o ipmi.o time-utils.o pel.o pool.o errorlog.o
 CORE_OBJS += timer.o i2c.o rtc.o flash.o sensor.o ipmi-opal.o
diff --git a/core/affinity.c b/core/affinity.c
index 10d483deb409..7a987a6f40b5 100644
--- a/core/affinity.c
+++ b/core/affinity.c
@@ -47,7 +47,6 @@ 
 #include <opal.h>
 #include <device.h>
 #include <console.h>
-#include <trace.h>
 #include <chip.h>
 #include <cpu.h>
 #include <affinity.h>
diff --git a/core/cpu.c b/core/cpu.c
index a83f8baf1031..19802061c02d 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -24,7 +24,6 @@ 
 #include <mem_region.h>
 #include <opal.h>
 #include <stack.h>
-#include <trace.h>
 #include <affinity.h>
 #include <chip.h>
 #include <timebase.h>
@@ -1027,7 +1026,6 @@  void init_boot_cpu(void)
 	/* Setup boot CPU state */
 	boot_cpu = &cpu_stacks[pir].cpu;
 	init_cpu_thread(boot_cpu, cpu_state_active, pir);
-	init_boot_tracebuf(boot_cpu);
 	assert(this_cpu() == boot_cpu);
 	init_hid();
 }
@@ -1167,8 +1165,6 @@  void init_all_cpus(void)
 		t = pt = &cpu_stacks[pir].cpu;
 		if (t != boot_cpu) {
 			init_cpu_thread(t, state, pir);
-			/* Each cpu gets its own later in init_trace_buffers */
-			t->trace = boot_cpu->trace;
 		}
 		t->server_no = server_no;
 		t->primary = t;
@@ -1196,7 +1192,6 @@  void init_all_cpus(void)
 			      thread);
 			t = &cpu_stacks[pir + thread].cpu;
 			init_cpu_thread(t, state, pir + thread);
-			t->trace = boot_cpu->trace;
 			t->server_no = ((const u32 *)p->prop)[thread];
 			t->is_secondary = true;
 			t->primary = pt;
diff --git a/core/init.c b/core/init.c
index 262ac5fb310d..a204a342007e 100644
--- a/core/init.c
+++ b/core/init.c
@@ -35,7 +35,6 @@ 
 #include <chip.h>
 #include <interrupts.h>
 #include <mem_region.h>
-#include <trace.h>
 #include <console.h>
 #include <fsi-master.h>
 #include <centaur.h>
@@ -74,7 +73,6 @@  struct debug_descriptor debug_descriptor = {
 	.version	= DEBUG_DESC_VERSION,
 	.state_flags	= 0,
 	.memcons_phys	= (uint64_t)&memcons,
-	.trace_mask	= 0, /* All traces disabled by default */
 	/* console log level:
 	 *   high 4 bits in memory, low 4 bits driver (e.g. uart). */
 #ifdef DEBUG
@@ -1038,9 +1036,6 @@  void __noreturn __nomcount main_cpu_entry(const void *fdt)
 	 */
 	probe_platform();
 
-	/* Allocate our split trace buffers now. Depends add_opal_node() */
-	init_trace_buffers();
-
 	/* On P7/P8, get the ICPs and make sure they are in a sane state */
 	init_interrupts();
 	if (proc_gen == proc_gen_p7 || proc_gen == proc_gen_p8)
diff --git a/core/opal.c b/core/opal.c
index 46035e836087..a5df054ba6e6 100644
--- a/core/opal.c
+++ b/core/opal.c
@@ -24,7 +24,6 @@ 
 #include <op-panel.h>
 #include <device.h>
 #include <console.h>
-#include <trace.h>
 #include <timebase.h>
 #include <affinity.h>
 #include <opal-msg.h>
@@ -93,27 +92,6 @@  long opal_bad_token(uint64_t token)
 	return OPAL_PARAMETER;
 }
 
-#ifdef OPAL_TRACE_ENTRY
-static void opal_trace_entry(struct stack_frame *eframe __unused)
-{
-	union trace t;
-	unsigned nargs, i;
-
-	if (eframe->gpr[0] > OPAL_LAST)
-		nargs = 0;
-	else
-		nargs = opal_num_args[eframe->gpr[0]];
-
-	t.opal.token = cpu_to_be64(eframe->gpr[0]);
-	t.opal.lr = cpu_to_be64(eframe->lr);
-	t.opal.sp = cpu_to_be64(eframe->gpr[1]);
-	for(i=0; i<nargs; i++)
-		t.opal.r3_to_11[i] = cpu_to_be64(eframe->gpr[3+i]);
-
-	trace_add(&t, TRACE_OPAL, offsetof(struct trace_opal, r3_to_11[nargs]));
-}
-#endif
-
 /*
  * opal_quiesce_state is used as a lock. Don't use an actual lock to avoid
  * lock busting.
@@ -138,10 +116,6 @@  int64_t opal_entry_check(struct stack_frame *eframe)
 		abort();
 	}
 
-#ifdef OPAL_TRACE_ENTRY
-	opal_trace_entry(eframe);
-#endif
-
 	if (!opal_check_token(token))
 		return opal_bad_token(token);
 
diff --git a/core/test/Makefile.check b/core/test/Makefile.check
index a5226a890361..2ef447da322c 100644
--- a/core/test/Makefile.check
+++ b/core/test/Makefile.check
@@ -13,7 +13,7 @@  CORE_TEST := \
 	core/test/run-mem_region_reservations \
 	core/test/run-mem_range_is_reserved \
 	core/test/run-nvram-format \
-	core/test/run-trace core/test/run-msg \
+	core/test/run-msg \
 	core/test/run-pel \
 	core/test/run-pool \
 	core/test/run-time-utils \
diff --git a/core/test/run-trace.c b/core/test/run-trace.c
deleted file mode 100644
index dd4cd450002c..000000000000
--- a/core/test/run-trace.c
+++ /dev/null
@@ -1,398 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <sched.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <skiboot-valgrind.h>
-
-/* Don't include these: PPC-specific */
-#define __CPU_H
-#define __TIME_H
-#define __PROCESSOR_H
-
-#if defined(__i386__) || defined(__x86_64__)
-/* This is more than a lwsync, but it'll work */
-static void full_barrier(void)
-{
-	asm volatile("mfence" : : : "memory");
-}
-#define lwsync full_barrier
-#elif defined(__powerpc__) || defined(__powerpc64__)
-static inline void lwsync(void)
-{
-	asm volatile("lwsync" : : : "memory");
-}
-#else
-#error "Define lwsync for this arch"
-#endif
-
-#define zalloc(size) calloc((size), 1)
-
-struct cpu_thread {
-	uint32_t pir;
-	uint32_t chip_id;
-	struct trace_info *trace;
-	int server_no;
-	bool is_secondary;
-	struct cpu_thread *primary;
-};
-static struct cpu_thread *this_cpu(void);
-
-#define CPUS 4
-
-static struct cpu_thread fake_cpus[CPUS];
-
-static inline struct cpu_thread *next_cpu(struct cpu_thread *cpu)
-{
-	if (cpu == NULL)
-		return &fake_cpus[0];
-	cpu++;
-	if (cpu == &fake_cpus[CPUS])
-		return NULL;
-	return cpu;
-}
-
-#define first_cpu() next_cpu(NULL)
-
-#define for_each_cpu(cpu)	\
-	for (cpu = first_cpu(); cpu; cpu = next_cpu(cpu))
-
-static unsigned long timestamp;
-static unsigned long mftb(void)
-{
-	return timestamp;
-}
-
-static void *local_alloc(unsigned int chip_id,
-			 size_t size, size_t align)
-{
-	void *p;
-
-	(void)chip_id;
-	if (posix_memalign(&p, align, size))
-		p = NULL;
-	return p;
-}
-
-struct dt_node;
-extern struct dt_node *opal_node;
-
-#include "../trace.c"
-
-#define rmb() lwsync()
-
-#include "../external/trace/trace.c"
-#include "../device.c"
-
-char __rodata_start[1], __rodata_end[1];
-struct dt_node *opal_node;
-struct debug_descriptor debug_descriptor = {
-	.trace_mask = -1
-};
-
-void lock_caller(struct lock *l, const char *caller)
-{
-	(void)caller;
-	assert(!l->lock_val);
-	l->lock_val = 1;
-}
-
-void unlock(struct lock *l)
-{
-	assert(l->lock_val);
-	l->lock_val = 0;
-}
-
-struct cpu_thread *my_fake_cpu;
-static struct cpu_thread *this_cpu(void)
-{
-	return my_fake_cpu;
-}
-
-#include <sys/mman.h>
-#define PER_CHILD_TRACES ((RUNNING_ON_VALGRIND) ? (1024*16) : (1024*1024))
-
-static void write_trace_entries(int id)
-{
-	void exit(int);
-	unsigned int i;
-	union trace trace;
-
-	timestamp = id;
-	for (i = 0; i < PER_CHILD_TRACES; i++) {
-		timestamp = i * CPUS + id;
-		assert(sizeof(trace.hdr) % 8 == 0);
-		/* First child never repeats, second repeats once, etc. */
-		trace_add(&trace, 3 + ((i / (id + 1)) % 0x40),
-			  sizeof(trace.hdr));
-	}
-
-	/* Final entry has special type, so parent knows it's over. */
-	trace_add(&trace, 0x70, sizeof(trace.hdr));
-	exit(0);
-}
-
-static bool all_done(const bool done[])
-{
-	unsigned int i;
-
-	for (i = 0; i < CPUS; i++)
-		if (!done[i])
-			return false;
-	return true;
-}
-
-static void test_parallel(void)
-{
-	void *p;
-	unsigned int cpu;
-	unsigned int i, counts[CPUS] = { 0 }, overflows[CPUS] = { 0 };
-	unsigned int repeats[CPUS] = { 0 }, num_overflows[CPUS] = { 0 };
-	bool done[CPUS] = { false };
-	size_t len = sizeof(struct trace_info) + TBUF_SZ + sizeof(union trace);
-	int last = 0;
-
-	/* Use a shared mmap to test actual parallel buffers. */
-	i = (CPUS*len + getpagesize()-1)&~(getpagesize()-1);
-	p = mmap(NULL, i, PROT_READ|PROT_WRITE,
-		 MAP_ANONYMOUS|MAP_SHARED, -1, 0);
-
-	for (i = 0; i < CPUS; i++) {
-		fake_cpus[i].trace = p + i * len;
-		fake_cpus[i].trace->tb.mask = cpu_to_be64(TBUF_SZ - 1);
-		fake_cpus[i].trace->tb.max_size = cpu_to_be32(sizeof(union trace));
-		fake_cpus[i].is_secondary = false;
-	}
-
-	for (i = 0; i < CPUS; i++) {
-		if (!fork()) {
-			/* Child. */
-			my_fake_cpu = &fake_cpus[i];
-			write_trace_entries(i);
-		}
-	}
-
-	while (!all_done(done)) {
-		union trace t;
-
-		for (i = 0; i < CPUS; i++) {
-			if (trace_get(&t, &fake_cpus[(i+last) % CPUS].trace->tb))
-				break;
-		}
-
-		if (i == CPUS) {
-			sched_yield();
-			continue;
-		}
-		i = (i + last) % CPUS;
-		last = i;
-
-		assert(be16_to_cpu(t.hdr.cpu) < CPUS);
-		assert(!done[be16_to_cpu(t.hdr.cpu)]);
-
-		if (t.hdr.type == TRACE_OVERFLOW) {
-			/* Conveniently, each record is 16 bytes here. */
-			assert(be64_to_cpu(t.overflow.bytes_missed) % 16 == 0);
-			overflows[i] += be64_to_cpu(t.overflow.bytes_missed) / 16;
-			num_overflows[i]++;
-			continue;
-		}
-
-		assert(be64_to_cpu(t.hdr.timestamp) % CPUS == be16_to_cpu(t.hdr.cpu));
-		if (t.hdr.type == TRACE_REPEAT) {
-			assert(t.hdr.len_div_8 * 8 == sizeof(t.repeat));
-			assert(be16_to_cpu(t.repeat.num) != 0);
-			assert(be16_to_cpu(t.repeat.num) <= be16_to_cpu(t.hdr.cpu));
-			repeats[be16_to_cpu(t.hdr.cpu)] += be16_to_cpu(t.repeat.num);
-		} else if (t.hdr.type == 0x70) {
-			cpu = be16_to_cpu(t.hdr.cpu);
-			assert(cpu < CPUS);
-			done[cpu] = true;
-		} else {
-			cpu = be16_to_cpu(t.hdr.cpu);
-			assert(cpu < CPUS);
-			counts[cpu]++;
-		}
-	}
-
-	/* Gather children. */
-	for (i = 0; i < CPUS; i++) {
-		int status;
-		wait(&status);
-	}
-
-	for (i = 0; i < CPUS; i++) {
-		printf("Child %i: %u produced, %u overflows, %llu total\n", i,
-		       counts[i], overflows[i],
-		       (long long)be64_to_cpu(fake_cpus[i].trace->tb.end));
-		assert(counts[i] + repeats[i] <= PER_CHILD_TRACES);
-	}
-	/* Child 0 never repeats. */
-	assert(repeats[0] == 0);
-	assert(counts[0] + overflows[0] == PER_CHILD_TRACES);
-
-	/*
-	 * FIXME: Other children have some fuzz, since overflows may
-	 * include repeat record we already read.  And odd-numbered
-	 * overflows may include more repeat records than normal
-	 * records (they alternate).
-	 */
-}
-
-int main(void)
-{
-	union trace minimal;
-	union trace large;
-	union trace trace;
-	unsigned int i, j;
-
-	opal_node = dt_new_root("opal");
-	for (i = 0; i < CPUS; i++) {
-		fake_cpus[i].server_no = i;
-		fake_cpus[i].is_secondary = (i & 0x1);
-		fake_cpus[i].primary = &fake_cpus[i & ~0x1];
-	}
-	init_trace_buffers();
-	my_fake_cpu = &fake_cpus[0];
-
-	for (i = 0; i < CPUS; i++) {
-		assert(trace_empty(&fake_cpus[i].trace->tb));
-		assert(!trace_get(&trace, &fake_cpus[i].trace->tb));
-	}
-
-	assert(sizeof(trace.hdr) % 8 == 0);
-	timestamp = 1;
-	trace_add(&minimal, 100, sizeof(trace.hdr));
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-	assert(be64_to_cpu(trace.hdr.timestamp) == timestamp);
-
-	/* Make it wrap once. */
-	for (i = 0; i < TBUF_SZ / (minimal.hdr.len_div_8 * 8) + 1; i++) {
-		timestamp = i;
-		trace_add(&minimal, 99 + (i%2), sizeof(trace.hdr));
-	}
-
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	/* First one must be overflow marker. */
-	assert(trace.hdr.type == TRACE_OVERFLOW);
-	assert(trace.hdr.len_div_8 * 8 == sizeof(trace.overflow));
-	assert(be64_to_cpu(trace.overflow.bytes_missed) == minimal.hdr.len_div_8 * 8);
-
-	for (i = 0; i < TBUF_SZ / (minimal.hdr.len_div_8 * 8); i++) {
-		assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-		assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-		assert(be64_to_cpu(trace.hdr.timestamp) == i+1);
-		assert(trace.hdr.type == 99 + ((i+1)%2));
-	}
-	assert(!trace_get(&trace, &my_fake_cpu->trace->tb));
-
-	/* Now put in some weird-length ones, to test overlap.
-	 * Last power of 2, minus 8. */
-	for (j = 0; (1 << j) < sizeof(large); j++);
-	for (i = 0; i < TBUF_SZ; i++) {
-		timestamp = i;
-		trace_add(&large, 100 + (i%2), (1 << (j-1)));
-	}
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.type == TRACE_OVERFLOW);
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.len_div_8 == large.hdr.len_div_8);
-	i = be64_to_cpu(trace.hdr.timestamp);
-	while (trace_get(&trace, &my_fake_cpu->trace->tb))
-		assert(be64_to_cpu(trace.hdr.timestamp) == ++i);
-
-	/* Test repeats. */
-	for (i = 0; i < 65538; i++) {
-		timestamp = i;
-		trace_add(&minimal, 100, sizeof(trace.hdr));
-	}
-	timestamp = i;
-	trace_add(&minimal, 101, sizeof(trace.hdr));
-	timestamp = i+1;
-	trace_add(&minimal, 101, sizeof(trace.hdr));
-
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.timestamp == 0);
-	assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-	assert(trace.hdr.type == 100);
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.type == TRACE_REPEAT);
-	assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));
-	assert(be16_to_cpu(trace.repeat.num) == 65535);
-	assert(be64_to_cpu(trace.repeat.timestamp) == 65535);
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(be64_to_cpu(trace.hdr.timestamp) == 65536);
-	assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-	assert(trace.hdr.type == 100);
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.type == TRACE_REPEAT);
-	assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));
-	assert(be16_to_cpu(trace.repeat.num) == 1);
-	assert(be64_to_cpu(trace.repeat.timestamp) == 65537);
-
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(be64_to_cpu(trace.hdr.timestamp) == 65538);
-	assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-	assert(trace.hdr.type == 101);
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(trace.hdr.type == TRACE_REPEAT);
-	assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));
-	assert(be16_to_cpu(trace.repeat.num) == 1);
-	assert(be64_to_cpu(trace.repeat.timestamp) == 65539);
-
-	/* Now, test adding repeat while we're reading... */
-	timestamp = 0;
-	trace_add(&minimal, 100, sizeof(trace.hdr));
-	assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-	assert(be64_to_cpu(trace.hdr.timestamp) == 0);
-	assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-	assert(trace.hdr.type == 100);
-
-	for (i = 1; i < TBUF_SZ; i++) {
-		timestamp = i;
-		trace_add(&minimal, 100, sizeof(trace.hdr));
-		assert(trace_get(&trace, &my_fake_cpu->trace->tb));
-		if (i % 65536 == 0) {
-			assert(trace.hdr.type == 100);
-			assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);
-		} else {
-			assert(trace.hdr.type == TRACE_REPEAT);
-			assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));
-			assert(be16_to_cpu(trace.repeat.num) == 1);
-		}
-		assert(be64_to_cpu(trace.repeat.timestamp) == i);
-		assert(!trace_get(&trace, &my_fake_cpu->trace->tb));
-	}
-
-	for (i = 0; i < CPUS; i++)
-		if (!fake_cpus[i].is_secondary)
-			free(fake_cpus[i].trace);
-
-	test_parallel();
-
-	return 0;
-}
diff --git a/core/trace.c b/core/trace.c
deleted file mode 100644
index d4e1b1d0d245..000000000000
--- a/core/trace.c
+++ /dev/null
@@ -1,246 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <trace.h>
-#include <timebase.h>
-#include <lock.h>
-#include <string.h>
-#include <stdlib.h>
-#include <cpu.h>
-#include <device.h>
-#include <libfdt.h>
-#include <processor.h>
-#include <skiboot.h>
-#include <opal-api.h>
-#include <debug_descriptor.h>
-
-#define DEBUG_TRACES
-
-#define MAX_SIZE (sizeof(union trace) + 7)
-
-/* Smaller trace buffer for early booting */
-#define BOOT_TBUF_SZ 65536
-static struct {
-	struct trace_info trace_info;
-	char buf[BOOT_TBUF_SZ + MAX_SIZE];
-} boot_tracebuf;
-
-void init_boot_tracebuf(struct cpu_thread *boot_cpu)
-{
-	init_lock(&boot_tracebuf.trace_info.lock);
-	boot_tracebuf.trace_info.tb.mask = cpu_to_be64(BOOT_TBUF_SZ - 1);
-	boot_tracebuf.trace_info.tb.max_size = cpu_to_be32(MAX_SIZE);
-
-	boot_cpu->trace = &boot_tracebuf.trace_info;
-}
-
-static size_t tracebuf_extra(void)
-{
-	/* We make room for the largest possible record */
-	return TBUF_SZ + MAX_SIZE;
-}
-
-/* To avoid bloating each entry, repeats are actually specific entries.
- * tb->last points to the last (non-repeat) entry. */
-static bool handle_repeat(struct tracebuf *tb, const union trace *trace)
-{
-	struct trace_hdr *prev;
-	struct trace_repeat *rpt;
-	u32 len;
-
-	prev = (void *)tb->buf + be64_to_cpu(tb->last & tb->mask);
-
-	if (prev->type != trace->hdr.type
-	    || prev->len_div_8 != trace->hdr.len_div_8
-	    || prev->cpu != trace->hdr.cpu)
-		return false;
-
-	len = prev->len_div_8 << 3;
-	if (memcmp(prev + 1, &trace->hdr + 1, len - sizeof(*prev)) != 0)
-		return false;
-
-	/* If they've consumed prev entry, don't repeat. */
-	if (be64_to_cpu(tb->last) < be64_to_cpu(tb->start))
-		return false;
-
-	/* OK, it's a duplicate.  Do we already have repeat? */
-	if (be64_to_cpu(tb->last) + len != be64_to_cpu(tb->end)) {
-		u64 pos = be64_to_cpu(tb->last) + len;
-		/* FIXME: Reader is not protected from seeing this! */
-		rpt = (void *)tb->buf + (pos & be64_to_cpu(tb->mask));
-		assert(pos + rpt->len_div_8*8 == be64_to_cpu(tb->end));
-		assert(rpt->type == TRACE_REPEAT);
-
-		/* If this repeat entry is full, don't repeat. */
-		if (be16_to_cpu(rpt->num) == 0xFFFF)
-			return false;
-
-		rpt->num = cpu_to_be16(be16_to_cpu(rpt->num) + 1);
-		rpt->timestamp = trace->hdr.timestamp;
-		return true;
-	}
-
-	/*
-	 * Generate repeat entry: it's the smallest possible entry, so we
-	 * must have eliminated old entries.
-	 */
-	assert(trace->hdr.len_div_8 * 8 >= sizeof(*rpt));
-
-	rpt = (void *)tb->buf + be64_to_cpu(tb->end & tb->mask);
-	rpt->timestamp = trace->hdr.timestamp;
-	rpt->type = TRACE_REPEAT;
-	rpt->len_div_8 = sizeof(*rpt) >> 3;
-	rpt->cpu = trace->hdr.cpu;
-	rpt->prev_len = cpu_to_be16(trace->hdr.len_div_8 << 3);
-	rpt->num = cpu_to_be16(1);
-	lwsync(); /* write barrier: complete repeat record before exposing */
-	tb->end = cpu_to_be64(be64_to_cpu(tb->end) + sizeof(*rpt));
-	return true;
-}
-
-void trace_add(union trace *trace, u8 type, u16 len)
-{
-	struct trace_info *ti = this_cpu()->trace;
-	unsigned int tsz;
-
-	trace->hdr.type = type;
-	trace->hdr.len_div_8 = (len + 7) >> 3;
-
-	tsz = trace->hdr.len_div_8 << 3;
-
-#ifdef DEBUG_TRACES
-	assert(tsz >= sizeof(trace->hdr));
-	assert(tsz <= sizeof(*trace));
-	assert(trace->hdr.type != TRACE_REPEAT);
-	assert(trace->hdr.type != TRACE_OVERFLOW);
-#endif
-	/* Skip traces not enabled in the debug descriptor */
-	if (trace->hdr.type < (8 * sizeof(debug_descriptor.trace_mask)) &&
-	    !((1ul << trace->hdr.type) & debug_descriptor.trace_mask))
-		return;
-
-	trace->hdr.timestamp = cpu_to_be64(mftb());
-	trace->hdr.cpu = cpu_to_be16(this_cpu()->server_no);
-
-	lock(&ti->lock);
-
-	/* Throw away old entries before we overwrite them. */
-	while ((be64_to_cpu(ti->tb.start) + be64_to_cpu(ti->tb.mask) + 1)
-	       < (be64_to_cpu(ti->tb.end) + tsz)) {
-		struct trace_hdr *hdr;
-
-		hdr = (void *)ti->tb.buf +
-			be64_to_cpu(ti->tb.start & ti->tb.mask);
-		ti->tb.start = cpu_to_be64(be64_to_cpu(ti->tb.start) +
-					   (hdr->len_div_8 << 3));
-	}
-
-	/* Must update ->start before we rewrite new entries. */
-	lwsync(); /* write barrier */
-
-	/* Check for duplicates... */
-	if (!handle_repeat(&ti->tb, trace)) {
-		/* This may go off end, and that's why ti->tb.buf is oversize */
-		memcpy(ti->tb.buf + be64_to_cpu(ti->tb.end & ti->tb.mask),
-		       trace, tsz);
-		ti->tb.last = ti->tb.end;
-		lwsync(); /* write barrier: write entry before exposing */
-		ti->tb.end = cpu_to_be64(be64_to_cpu(ti->tb.end) + tsz);
-	}
-	unlock(&ti->lock);
-}
-
-static void trace_add_dt_props(void)
-{
-	unsigned int i;
-	u64 *prop, tmask;
-
-	prop = malloc(sizeof(u64) * 2 * debug_descriptor.num_traces);
-
-	for (i = 0; i < debug_descriptor.num_traces; i++) {
-		prop[i * 2] = cpu_to_fdt64(debug_descriptor.trace_phys[i]);
-		prop[i * 2 + 1] = cpu_to_fdt64(debug_descriptor.trace_size[i]);
-	}
-
-	dt_add_property(opal_node, "ibm,opal-traces",
-			prop, sizeof(u64) * 2 * i);
-	free(prop);
-
-	tmask = (uint64_t)&debug_descriptor.trace_mask;
-	dt_add_property_u64(opal_node, "ibm,opal-trace-mask", tmask);
-}
-
-static void trace_add_desc(struct trace_info *t, uint64_t size)
-{
-	unsigned int i = debug_descriptor.num_traces;
-
-	if (i >= DEBUG_DESC_MAX_TRACES) {
-		prerror("TRACE: Debug descriptor trace list full !\n");
-		return;
-	}
-	debug_descriptor.num_traces++;
-
-	debug_descriptor.trace_phys[i] = (uint64_t)&t->tb;
-	debug_descriptor.trace_tce[i] = 0; /* populated later */
-	debug_descriptor.trace_size[i] = size;
-}
-
-/* Allocate trace buffers once we know memory topology */
-void init_trace_buffers(void)
-{
-	struct cpu_thread *t;
-	struct trace_info *any = &boot_tracebuf.trace_info;
-	uint64_t size;
-
-	/* Boot the boot trace in the debug descriptor */
-	trace_add_desc(any, sizeof(boot_tracebuf.buf));
-
-	/* Allocate a trace buffer for each primary cpu. */
-	for_each_cpu(t) {
-		if (t->is_secondary)
-			continue;
-
-		/* Use a 4K alignment for TCE mapping */
-		size = ALIGN_UP(sizeof(*t->trace) + tracebuf_extra(), 0x1000);
-		t->trace = local_alloc(t->chip_id, size, 0x1000);
-		if (t->trace) {
-			any = t->trace;
-			memset(t->trace, 0, size);
-			init_lock(&t->trace->lock);
-			t->trace->tb.mask = cpu_to_be64(TBUF_SZ - 1);
-			t->trace->tb.max_size = cpu_to_be32(MAX_SIZE);
-			trace_add_desc(any, sizeof(t->trace->tb) +
-				       tracebuf_extra());
-		} else
-			prerror("TRACE: cpu 0x%x allocation failed\n", t->pir);
-	}
-
-	/* In case any allocations failed, share trace buffers. */
-	for_each_cpu(t) {
-		if (!t->is_secondary && !t->trace)
-			t->trace = any;
-	}
-
-	/* And copy those to the secondaries. */
-	for_each_cpu(t) {
-		if (!t->is_secondary)
-			continue;
-		t->trace = t->primary->trace;
-	}
-
-	/* Trace node in DT. */
-	trace_add_dt_props();
-}
diff --git a/external/trace/Makefile b/external/trace/Makefile
deleted file mode 100644
index 3b6684bf1f4d..000000000000
--- a/external/trace/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@ 
-HOSTEND=$(shell uname -m | sed -e 's/^i.*86$$/LITTLE/' -e 's/^x86.*/LITTLE/' -e 's/^ppc.*/BIG/')
-CFLAGS=-g -Wall -DHAVE_$(HOSTEND)_ENDIAN -I../../include -I../../
-
-dump_trace: dump_trace.c
-
-clean:
-	rm -f dump_trace *.o
diff --git a/external/trace/dump_trace.c b/external/trace/dump_trace.c
deleted file mode 100644
index db53d785be57..000000000000
--- a/external/trace/dump_trace.c
+++ /dev/null
@@ -1,198 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <err.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-#include <inttypes.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <unistd.h>
-
-#include "../../ccan/endian/endian.h"
-#include "../../ccan/short_types/short_types.h"
-#include <trace_types.h>
-
-/* Handles trace from debugfs (one record at a time) or file */ 
-static bool get_trace(int fd, union trace *t, int *len)
-{
-	void *dest = t;
-	int r;
-
-	/* Move down any extra we read last time. */
-	if (*len >= sizeof(t->hdr) && *len >= t->hdr.len_div_8 * 8) {
-		u8 rlen = t->hdr.len_div_8 * 8;
-		memmove(dest, dest + rlen, *len - rlen);
-		*len -= rlen;
-	}
-
-	r = read(fd, dest + *len, sizeof(*t) - *len);
-	if (r < 0)
-		return false;
-
-	*len += r;
-	/* We should have a complete record. */
-	return *len >= sizeof(t->hdr) && *len >= t->hdr.len_div_8 * 8;
-}
-
-static void display_header(const struct trace_hdr *h)
-{
-	static u64 prev_ts;
-	u64 ts = be64_to_cpu(h->timestamp);
-
-	printf("%16lx (+%8lx) [%03x] : ",
-	       ts, prev_ts ? (ts - prev_ts) : 0, be16_to_cpu(h->cpu));
-	prev_ts = ts;
-}
-
-static void dump_fsp_event(struct trace_fsp_event *t)
-{
-	printf("FSP_EVT [st=%d] ", be16_to_cpu(t->fsp_state));
-
-	switch(be16_to_cpu(t->event)) {
-	case TRACE_FSP_EVT_LINK_DOWN:
-		printf("LINK DOWN");
-		break;
-	case TRACE_FSP_EVT_DISR_CHG:
-		printf("DISR CHANGE (0x%08x)", be32_to_cpu(t->data[0]));
-		break;
-	case TRACE_FSP_EVT_SOFT_RR:
-		printf("SOFT R&R (DISR=0x%08x)", be32_to_cpu(t->data[0]));
-		break;
-	case TRACE_FSP_EVT_RR_COMPL:
-		printf("R&R COMPLETE");
-		break;
-	case TRACE_FSP_EVT_HDES_CHG:
-		printf("HDES CHANGE (0x%08x)", be32_to_cpu(t->data[0]));
-		break;
-	case TRACE_FSP_EVT_POLL_IRQ:
-		printf("%s HDIR=%08x CTL=%08x PSI_IRQ=%d",
-		       t->data[0] ? "IRQ " : "POLL", be32_to_cpu(t->data[1]),
-		       be32_to_cpu(t->data[2]), be32_to_cpu(t->data[3]));
-		break;
-	default:
-		printf("Unknown %d (d: %08x %08x %08x %08x)",
-		       be16_to_cpu(t->event), be32_to_cpu(t->data[0]),
-		       be32_to_cpu(t->data[1]), be32_to_cpu(t->data[2]),
-		       be32_to_cpu(t->data[3]));
-	}
-	printf("\n");
-}
-
-static void dump_opal_call(struct trace_opal *t)
-{
-	unsigned int i, n;
-
-	printf("OPAL CALL %"PRIu64, be64_to_cpu(t->token));
-	printf(" LR=0x%016"PRIx64" SP=0x%016"PRIx64,
-	       be64_to_cpu(t->lr), be64_to_cpu(t->sp));
-	n = (t->hdr.len_div_8 * 8 - offsetof(union trace, opal.r3_to_11))
-		/ sizeof(u64);
-	for (i = 0; i < n; i++)
-		printf(" R%u=0x%016"PRIx64,
-		       i+3, be64_to_cpu(t->r3_to_11[i]));
-	printf("\n");
-}
-
-static void dump_fsp_msg(struct trace_fsp_msg *t)
-{
-	unsigned int i;
-
-	printf("FSP_MSG: CMD %u SEQ %u MOD %u SUB %u DLEN %u %s [",
-	       be32_to_cpu(t->word0) & 0xFFFF,
-	       be32_to_cpu(t->word0) >> 16,
-	       be32_to_cpu(t->word1) >> 8,
-	       be32_to_cpu(t->word1) & 0xFF,
-	       t->dlen,
-	       t->dir == TRACE_FSP_MSG_IN ? "IN" :
-	       (t->dir == TRACE_FSP_MSG_OUT ? "OUT" : "UNKNOWN"));
-
-	for (i = 0; i < t->dlen; i++) 
-		printf("%s%02x", i ? " " : "", t->data[i]);
-	printf("]\n");
-}
-
-static void dump_uart(struct trace_uart *t)
-{
-	switch(t->ctx) {
-	case TRACE_UART_CTX_IRQ:
-		printf(": IRQ  IRQEN=%d IN_CNT=%d\n",
-		       !t->irq_state, be16_to_cpu(t->in_count));
-		break;
-	case TRACE_UART_CTX_POLL:
-		printf(": POLL IRQEN=%d IN_CNT=%d\n",
-		       !t->irq_state, be16_to_cpu(t->in_count));
-		break;
-	case TRACE_UART_CTX_READ:
-		printf(": READ IRQEN=%d IN_CNT=%d READ=%d\n",
-		       !t->irq_state, be16_to_cpu(t->in_count), t->cnt);
-		break;
-	default:
-		printf(": ???? IRQEN=%d IN_CNT=%d\n",
-		       !t->irq_state, be16_to_cpu(t->in_count));
-		break;
-	}
-}
-
-int main(int argc, char *argv[])
-{
-	int fd, len = 0;
-	union trace t;
-	const char *in = "/sys/kernel/debug/powerpc/opal-trace";
-
-	if (argc > 2)
-		errx(1, "Usage: dump_trace [file]");
-
-	if (argv[1])
-		in = argv[1];
-	fd = open(in, O_RDONLY);
-	if (fd < 0)
-		err(1, "Opening %s", in);
-
-	while (get_trace(fd, &t, &len)) {
-		display_header(&t.hdr);
-		switch (t.hdr.type) {
-		case TRACE_REPEAT:
-			printf("REPEATS: %u times\n",
-			       be32_to_cpu(t.repeat.num));
-			break;
-		case TRACE_OVERFLOW:
-			printf("**OVERFLOW**: %"PRIu64" bytes missed\n",
-			       be64_to_cpu(t.overflow.bytes_missed));
-			break;
-		case TRACE_OPAL:
-			dump_opal_call(&t.opal);
-			break;
-		case TRACE_FSP_MSG:
-			dump_fsp_msg(&t.fsp_msg);
-			break;
-		case TRACE_FSP_EVENT:
-			dump_fsp_event(&t.fsp_evt);
-			break;
-		case TRACE_UART:
-			dump_uart(&t.uart);
-			break;
-		default:
-			printf("UNKNOWN(%u) CPU %u length %u\n",
-			       t.hdr.type, be16_to_cpu(t.hdr.cpu),
-			       t.hdr.len_div_8 * 8);
-		}
-	}
-	return 0;
-}
diff --git a/external/trace/trace.c b/external/trace/trace.c
deleted file mode 100644
index 745da53cbd9c..000000000000
--- a/external/trace/trace.c
+++ /dev/null
@@ -1,112 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* This example code shows how to read from the trace buffer. */
-#include <external/trace/trace.h>
-#include "../ccan/endian/endian.h"
-#include "../ccan/short_types/short_types.h"
-#include <trace_types.h>
-#include <errno.h>
-
-bool trace_empty(const struct tracebuf *tb)
-{
-	const struct trace_repeat *rep;
-
-	if (tb->rpos == tb->end)
-		return true;
-
-	/*
-	 * If we have a single element only, and it's a repeat buffer
-	 * we've already seen every repeat for (yet which may be
-	 * incremented in future), we're also empty.
-	 */
-	rep = (void *)tb->buf + be64_to_cpu(tb->rpos & tb->mask);
-	if (be64_to_cpu(tb->end) != be64_to_cpu(tb->rpos) + sizeof(*rep))
-		return false;
-
-	if (rep->type != TRACE_REPEAT)
-		return false;
-
-	if (be16_to_cpu(rep->num) != be32_to_cpu(tb->last_repeat))
-		return false;
-
-	return true;
-}
-
-/* You can't read in parallel, so some locking required in caller. */
-bool trace_get(union trace *t, struct tracebuf *tb)
-{
-	u64 start, rpos;
-	size_t len;
-
-	len = sizeof(*t) < be32_to_cpu(tb->max_size) ? sizeof(*t) :
-		be32_to_cpu(tb->max_size);
-
-	if (trace_empty(tb))
-		return false;
-
-again:
-	/*
-	 * The actual buffer is slightly larger than tbsize, so this
-	 * memcpy is always valid.
-	 */
-	memcpy(t, tb->buf + be64_to_cpu(tb->rpos & tb->mask), len);
-
-	rmb(); /* read barrier, so we read tb->start after copying record. */
-
-	start = be64_to_cpu(tb->start);
-	rpos = be64_to_cpu(tb->rpos);
-
-	/* Now, was that overwritten? */
-	if (rpos < start) {
-		/* Create overflow record. */
-		t->overflow.unused64 = 0;
-		t->overflow.type = TRACE_OVERFLOW;
-		t->overflow.len_div_8 = sizeof(t->overflow) / 8;
-		t->overflow.bytes_missed = cpu_to_be64(start - rpos);
-		tb->rpos = cpu_to_be64(start);
-		return true;
-	}
-
-	/* Repeat entries need special handling */
-	if (t->hdr.type == TRACE_REPEAT) {
-		u32 num = be16_to_cpu(t->repeat.num);
-
-		/* In case we've read some already... */
-		t->repeat.num = cpu_to_be16(num - be32_to_cpu(tb->last_repeat));
-
-		/* Record how many repeats we saw this time. */
-		tb->last_repeat = cpu_to_be32(num);
-
-		/* Don't report an empty repeat buffer. */
-		if (t->repeat.num == 0) {
-			/*
-			 * This can't be the last buffer, otherwise
-			 * trace_empty would have returned true.
-			 */
-			assert(be64_to_cpu(tb->end) >
-			       rpos + t->hdr.len_div_8 * 8);
-			/* Skip to next entry. */
-			tb->rpos = cpu_to_be64(rpos + t->hdr.len_div_8 * 8);
-			tb->last_repeat = 0;
-			goto again;
-		}
-	} else {
-		tb->last_repeat = 0;
-		tb->rpos = cpu_to_be64(rpos + t->hdr.len_div_8 * 8);
-	}
-
-	return true;
-}
diff --git a/external/trace/trace.h b/external/trace/trace.h
deleted file mode 100644
index 4d2dbc796289..000000000000
--- a/external/trace/trace.h
+++ /dev/null
@@ -1,20 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Is this tracebuf empty? */
-bool trace_empty(const struct tracebuf *tracebuf);
-
-/* Get the next trace from this buffer (false if empty). */
-bool trace_get(union trace *t, struct tracebuf *tb);
diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index f7e674830f79..fc1be1035238 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -31,7 +31,6 @@ 
 #include <interrupts.h>
 #include <gx.h>
 #include <device.h>
-#include <trace.h>
 #include <timebase.h>
 #include <cpu.h>
 #include <errorlog.h>
@@ -125,9 +124,7 @@  static u64 fsp_hir_timeout;
 
 /*
  * We keep track on last logged values for some things to print only on
- * value changes, but also to relieve pressure on the tracer which
- * doesn't do a very good job at detecting repeats when called from
- * many different CPUs
+ * value changes
  */
 static u32 disr_last_print;
 static u32 drcr_last_print;
@@ -180,22 +177,6 @@  static struct fsp_cmdclass fsp_cmdclass[FSP_MCLASS_LAST - FSP_MCLASS_FIRST + 1]
 	DEF_CLASS(FSP_MCLASS_OCC,		16),
 };
 
-static void fsp_trace_msg(struct fsp_msg *msg, u8 dir __unused)
-{
-	union trace fsp __unused;
-#ifdef FSP_TRACE_MSG
-	size_t len = offsetof(struct trace_fsp_msg, data[msg->dlen]);
-
-	fsp.fsp_msg.dlen = msg->dlen;
-	fsp.fsp_msg.word0 = msg->word0;
-	fsp.fsp_msg.word1 = msg->word1;
-	fsp.fsp_msg.dir = dir;
-	memcpy(fsp.fsp_msg.data, msg->data.bytes, msg->dlen);
-	trace_add(&fsp, TRACE_FSP_MSG, len);
-#endif /* FSP_TRACE_MSG */
-	assert(msg->dlen <= sizeof(fsp.fsp_msg.data));
-}
-
 static struct fsp *fsp_get_active(void)
 {
 	/* XXX Handle transition between FSPs */
@@ -633,23 +614,6 @@  void fsp_reset_links(void)
 	return;
 }
 
-static void fsp_trace_event(struct fsp *fsp, u32 evt,
-			    u32 data0, u32 data1, u32 data2, u32 data3)
-{
-	union trace tfsp __unused;
-#ifdef FSP_TRACE_EVENT
-	size_t len = sizeof(struct trace_fsp_event);
-
-	tfsp.fsp_evt.event = evt;
-	tfsp.fsp_evt.fsp_state = fsp->state;
-	tfsp.fsp_evt.data[0] = data0;
-	tfsp.fsp_evt.data[1] = data1;
-	tfsp.fsp_evt.data[2] = data2;
-	tfsp.fsp_evt.data[3] = data3;
-	trace_add(&tfsp, TRACE_FSP_EVENT, len);
-#endif /* FSP_TRACE_EVENT */
-}
-
 static void fsp_handle_errors(struct fsp *fsp)
 {
 	u32 hstate;
@@ -678,7 +642,6 @@  static void fsp_handle_errors(struct fsp *fsp)
 	 */
 	if (!psi_check_link_active(psi)) {
 		/* Start R&R process */
-		fsp_trace_event(fsp, TRACE_FSP_EVT_LINK_DOWN, 0, 0, 0, 0);
 		prerror("FSP #%d: Link down, starting R&R\n", fsp->index);
 
 		fsp_start_rr(fsp);
@@ -690,8 +653,6 @@  static void fsp_handle_errors(struct fsp *fsp)
 
 	/* If in R&R, log values */
 	if (disr != disr_last_print) {
-		fsp_trace_event(fsp, TRACE_FSP_EVT_DISR_CHG, disr, 0, 0, 0);
-
 		prlog(PR_TRACE, "FSP #%d: DISR stat change = 0x%08x\n",
 		      fsp->index, disr);
 		disr_last_print = disr;
@@ -751,7 +712,6 @@  static void fsp_handle_errors(struct fsp *fsp)
 	if (disr & FSP_DISR_HIR_TRIGGER_MASK) {
 		const char *reason = "Unknown FSP_DISR_HIR_TRIGGER";
 		uint32_t plid;
-		fsp_trace_event(fsp, TRACE_FSP_EVT_SOFT_RR, disr, 0, 0, 0);
 
 		if (disr & FSP_DISR_FSP_UNIT_CHECK)
 			reason = "DISR Unit Check set";
@@ -783,8 +743,6 @@  static void fsp_handle_errors(struct fsp *fsp)
 		 * only do it while still in R&R state
 		 */
 		if (fsp->state == fsp_mbx_rr) {
-			fsp_trace_event(fsp, TRACE_FSP_EVT_RR_COMPL, 0,0,0,0);
-
 			prlog(PR_NOTICE, "FSP #%d: Detected R&R complete,"
 			      " acking\n", fsp->index);
 
@@ -821,8 +779,6 @@  static void fsp_handle_errors(struct fsp *fsp)
 
 	hstate = fsp_rreg(fsp, FSP_HDES_REG);
 	if (hstate != hstate_last_print) {
-		fsp_trace_event(fsp, TRACE_FSP_EVT_HDES_CHG, hstate, 0, 0, 0);
-
 		prlog(PR_DEBUG, "FSP #%d: HDES stat change = 0x%08x\n",
 		      fsp->index, hstate);
 		hstate_last_print = hstate;
@@ -926,11 +882,6 @@  static bool fsp_post_msg(struct fsp *fsp, struct fsp_msg *msg)
 	fsp->state = fsp_mbx_send;
 	msg->state = fsp_msg_sent;
 
-	/* We trace after setting the mailbox state so that if the
-	 * tracing recurses, it ends up just queuing the message up
-	 */
-	fsp_trace_msg(msg, TRACE_FSP_MSG_OUT);
-
 	/* Build the message in the mailbox */
 	reg = FSP_MBX1_HDATA_AREA;
 	fsp_wreg(fsp, reg, msg->word0); reg += 4;
@@ -1424,8 +1375,6 @@  static void __fsp_fill_incoming(struct fsp *fsp, struct fsp_msg *msg,
 		 FSP_MBX_CTL_HPEND |
 		 FSP_MBX_CTL_HCSP_MASK |
 		 FSP_MBX_CTL_DCSP_MASK);
-
-	fsp_trace_msg(msg, TRACE_FSP_MSG_IN);
 }
 
 static void __fsp_drop_incoming(struct fsp *fsp)
@@ -1558,16 +1507,6 @@  static void __fsp_poll(bool interrupt)
 	u32 ctl, hdir = 0;
 	bool psi_irq;
 
-	/*
-	 * The tracer isn't terribly efficient at detecting dups
-	 * especially when coming from multiple CPUs so we do our
-	 * own change-detection locally
-	 */
-	static u32 hdir_last_trace;
-	static u32 ctl_last_trace;
-	static bool psi_irq_last_trace;
-	static bool irq_last_trace;
-
 	if (!fsp)
 		return;
 
@@ -1620,24 +1559,9 @@  static void __fsp_poll(bool interrupt)
 	/* Read interrupt status (we may or may not use it) */
 	hdir = fsp_rreg(fsp, FSP_HDIR_REG);
 
-	/* Read control now as well so we can trace them */
 	ctl = fsp_rreg(fsp, FSP_MBX1_HCTL_REG);
-
-	/* Ditto with PSI irq state */
 	psi_irq = psi_poll_fsp_interrupt(iop->psi);
 
-	/* Trace it if anything changes */
-	if (hdir != hdir_last_trace || ctl != ctl_last_trace ||
-	    interrupt != irq_last_trace || psi_irq != psi_irq_last_trace) {
-		fsp_trace_event(fsp, TRACE_FSP_EVT_POLL_IRQ,
-				interrupt, hdir, ctl, psi_irq);
-
-		hdir_last_trace = hdir;
-		ctl_last_trace = ctl;
-		irq_last_trace = interrupt;
-		psi_irq_last_trace = psi_irq;
-	}
-
 	/*
 	 * We *MUST* ignore the MBOX2 bits here. While MBOX2 cannot generate
 	 * interrupt, it might still latch some bits here (and we found cases
diff --git a/hw/lpc-mbox.c b/hw/lpc-mbox.c
index 58a99692511e..6fe99c261508 100644
--- a/hw/lpc-mbox.c
+++ b/hw/lpc-mbox.c
@@ -24,7 +24,6 @@ 
 #include <interrupts.h>
 #include <processor.h>
 #include <errorlog.h>
-#include <trace.h>
 #include <timebase.h>
 #include <timer.h>
 #include <cpu.h>
diff --git a/hw/lpc-uart.c b/hw/lpc-uart.c
index 365bf3e27094..ebf9197186bb 100644
--- a/hw/lpc-uart.c
+++ b/hw/lpc-uart.c
@@ -22,7 +22,6 @@ 
 #include <interrupts.h>
 #include <processor.h>
 #include <errorlog.h>
-#include <trace.h>
 #include <timebase.h>
 #include <cpu.h>
 #include <chip.h>
@@ -77,17 +76,6 @@  void uart_set_console_policy(int policy)
 	uart_console_policy = policy;
 }
 
-static void uart_trace(u8 ctx, u8 cnt, u8 irq_state, u8 in_count)
-{
-	union trace t;
-
-	t.uart.ctx = ctx;
-	t.uart.cnt = cnt;
-	t.uart.irq_state = irq_state;
-	t.uart.in_count = cpu_to_be16(in_count);
-	trace_add(&t, TRACE_UART, sizeof(struct trace_uart));
-}
-
 static inline uint8_t uart_read(unsigned int reg)
 {
 	if (mmio_uart_base)
@@ -375,8 +363,6 @@  static int64_t uart_opal_read(int64_t term_number, int64_t *length,
 	/* Finally, flush whatever's left in the UART into our buffer */
 	uart_read_to_buffer();
 
-	uart_trace(TRACE_UART_CTX_READ, read_cnt, tx_full, in_count);
-
 	unlock(&uart_lock);
 
 	/* Adjust the OPAL event */
@@ -400,7 +386,7 @@  static int64_t uart_opal_flush(int64_t term_number)
 	return rc;
 }
 
-static void __uart_do_poll(u8 trace_ctx)
+static void __uart_do_poll(void)
 {
 	if (!in_buf)
 		return;
@@ -408,7 +394,6 @@  static void __uart_do_poll(u8 trace_ctx)
 	lock(&uart_lock);
 	uart_read_to_buffer();
 	uart_con_flush();
-	uart_trace(trace_ctx, 0, tx_full, in_count);
 	unlock(&uart_lock);
 
 	uart_adjust_opal_event();
@@ -416,7 +401,7 @@  static void __uart_do_poll(u8 trace_ctx)
 
 static void uart_console_poll(void *data __unused)
 {
-	__uart_do_poll(TRACE_UART_CTX_POLL);
+	__uart_do_poll();
 }
 
 static void uart_irq(uint32_t chip_id __unused, uint32_t irq_mask __unused)
@@ -425,7 +410,7 @@  static void uart_irq(uint32_t chip_id __unused, uint32_t irq_mask __unused)
 		prlog(PR_DEBUG, "UART: IRQ functional !\n");
 		irq_ok = true;
 	}
-	__uart_do_poll(TRACE_UART_CTX_IRQ);
+	__uart_do_poll();
 }
 
 /*
diff --git a/hw/psi.c b/hw/psi.c
index cbdbeaa9aeff..9c673b61d86c 100644
--- a/hw/psi.c
+++ b/hw/psi.c
@@ -24,7 +24,6 @@ 
 #include <gx.h>
 #include <interrupts.h>
 #include <cpu.h>
-#include <trace.h>
 #include <xscom.h>
 #include <chip.h>
 #include <lpc.h>
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
index d52ada15a39f..4da72b9f2ae4 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -54,7 +54,6 @@ 
 #include <skiboot.h>
 #include <timebase.h>
 #include <timer.h>
-#include <trace.h>
 #include <xscom.h>
 
 enum p9_sbe_mbox_state {
diff --git a/include/cpu.h b/include/cpu.h
index 851fb8e808f9..25db03f81cad 100644
--- a/include/cpu.h
+++ b/include/cpu.h
@@ -57,7 +57,6 @@  struct cpu_thread {
 	struct cpu_thread		*primary;
 	enum cpu_thread_state		state;
 	struct dt_node			*node;
-	struct trace_info		*trace;
 	uint64_t			save_r1;
 	void				*icp_regs;
 	uint32_t			in_opal_call;
diff --git a/include/debug_descriptor.h b/include/debug_descriptor.h
index 619f49374385..6679728280b9 100644
--- a/include/debug_descriptor.h
+++ b/include/debug_descriptor.h
@@ -23,7 +23,7 @@ 
  */
 struct debug_descriptor {
 	u8	eye_catcher[8];	/* "OPALdbug" */
-#define DEBUG_DESC_VERSION	1
+#define DEBUG_DESC_VERSION	2
 	u32	version;
 	u8	console_log_levels;	/* high 4 bits in memory,
 					 * low 4 bits driver (e.g. uart). */
@@ -36,14 +36,6 @@  struct debug_descriptor {
 	u32	memcons_tce;
 	u32	memcons_obuf_tce;
 	u32	memcons_ibuf_tce;
-
-	/* Traces */
-	u64	trace_mask;
-	u32	num_traces;
-#define DEBUG_DESC_MAX_TRACES	256
-	u64	trace_phys[DEBUG_DESC_MAX_TRACES];
-	u32	trace_size[DEBUG_DESC_MAX_TRACES];
-	u32	trace_tce[DEBUG_DESC_MAX_TRACES];
 };
 extern struct debug_descriptor debug_descriptor;
 
diff --git a/include/trace.h b/include/trace.h
deleted file mode 100644
index da43572e2d06..000000000000
--- a/include/trace.h
+++ /dev/null
@@ -1,46 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __TRACE_H
-#define __TRACE_H
-#include <ccan/short_types/short_types.h>
-#include <stddef.h>
-#include <lock.h>
-#include <trace_types.h>
-
-#define TBUF_SZ (1024 * 1024)
-
-struct cpu_thread;
-
-/* Here's one we prepared earlier. */
-void init_boot_tracebuf(struct cpu_thread *boot_cpu);
-
-struct trace_info {
-	/* Lock for writers. */
-	struct lock lock;
-	/* Exposed to kernel. */
-	struct tracebuf tb;
-};
-
-/* Allocate trace buffers once we know memory topology */
-void init_trace_buffers(void);
-
-/* This will fill in timestamp and cpu; you must do type and len. */
-void trace_add(union trace *trace, u8 type, u16 len);
-
-/* Put trace node into dt. */
-void trace_add_node(void);
-#endif /* __TRACE_H */
diff --git a/include/trace_types.h b/include/trace_types.h
deleted file mode 100644
index 83c49a263c92..000000000000
--- a/include/trace_types.h
+++ /dev/null
@@ -1,134 +0,0 @@ 
-/* Copyright 2013-2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 	http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* API for kernel to read trace buffer. */
-#ifndef __TRACE_TYPES_H
-#define __TRACE_TYPES_H
-
-#include <types.h>
-
-#define TRACE_REPEAT	1
-#define TRACE_OVERFLOW	2
-#define TRACE_OPAL	3	/* OPAL call */
-#define TRACE_FSP_MSG	4	/* FSP message sent/received */
-#define TRACE_FSP_EVENT	5	/* FSP driver event */
-#define TRACE_UART	6	/* UART driver traces */
-
-/* One per cpu, plus one for NMIs */
-struct tracebuf {
-	/* Mask to apply to get buffer offset. */
-	__be64 mask;
-	/* This where the buffer starts. */
-	__be64 start;
-	/* This is where writer has written to. */
-	__be64 end;
-	/* This is where the writer wrote to previously. */
-	__be64 last;
-	/* This is where the reader is up to. */
-	__be64 rpos;
-	/* If the last one we read was a repeat, this shows how many. */
-	__be32 last_repeat;
-	/* Maximum possible size of a record. */
-	__be32 max_size;
-
-	char buf[/* TBUF_SZ + max_size */];
-};
-
-/* Common header for all trace entries. */
-struct trace_hdr {
-	__be64 timestamp;
-	u8 type;
-	u8 len_div_8;
-	__be16 cpu;
-	u8 unused[4];
-};
-
-/* Note: all other entries must be at least as large as this! */
-struct trace_repeat {
-	__be64 timestamp; /* Last repeat happened at this timestamp */
-	u8 type; /* == TRACE_REPEAT */
-	u8 len_div_8;
-	__be16 cpu;
-	__be16 prev_len;
-	__be16 num; /* Starts at 1, ie. 1 repeat, or two traces. */
-	/* Note that the count can be one short, if read races a repeat. */
-};
-
-/* Overflow is special */
-struct trace_overflow {
-	__be64 unused64; /* Timestamp is unused */
-	u8 type; /* == TRACE_OVERFLOW */
-	u8 len_div_8;
-	u8 unused[6]; /* ie. hdr.cpu is indeterminate */
-	__be64 bytes_missed;
-};
-
-/* All other trace types have a full header */
-struct trace_opal {
-	struct trace_hdr hdr;
-	__be64 token, lr, sp, r3_to_11[9];
-};
-
-#define TRACE_FSP_MSG_IN	0
-#define TRACE_FSP_MSG_OUT	1
-
-struct trace_fsp_msg {
-	struct trace_hdr hdr;
-	__be32 word0;
-	__be32 word1;
-	u8 dlen;
-	u8 dir; /* TRACE_FSP_MSG_IN or TRACE_FSP_MSG_OUT */
-	u8 data[56]; /* See dlen, but max is 56 bytes. */
-};
-
-#define TRACE_FSP_EVT_LINK_DOWN		0
-#define TRACE_FSP_EVT_DISR_CHG		1 /* 0:disr */
-#define TRACE_FSP_EVT_SOFT_RR		2 /* 0:disr */
-#define TRACE_FSP_EVT_RR_COMPL		3
-#define TRACE_FSP_EVT_HDES_CHG		4 /* 0:hdes */
-#define TRACE_FSP_EVT_POLL_IRQ		5 /* 0:irq? 1:hdir 2:ctl 3:psi_irq */
-
-struct trace_fsp_event {
-	struct trace_hdr hdr;
-	__be16 event;
-	__be16 fsp_state;
-	__be32 data[4]; /* event type specific */
-};
-
-#define TRACE_UART_CTX_IRQ		0
-#define TRACE_UART_CTX_POLL		1
-#define TRACE_UART_CTX_READ		2
-
-struct trace_uart {
-	struct trace_hdr hdr;
-	u8 ctx;
-	u8 cnt;
-	u8 irq_state;
-	u8 unused;
-	__be16 in_count;
-};
-
-union trace {
-	struct trace_hdr hdr;
-	/* Trace types go here... */
-	struct trace_repeat repeat;
-	struct trace_overflow overflow;
-	struct trace_opal opal;
-	struct trace_fsp_msg fsp_msg;
-	struct trace_fsp_event fsp_evt;
-	struct trace_uart uart;
-};
-
-#endif /* __TRACE_TYPES_H */
diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c
index a7f2beedcb78..eed0ec81088e 100644
--- a/platforms/ibm-fsp/common.c
+++ b/platforms/ibm-fsp/common.c
@@ -29,7 +29,7 @@ 
 
 static void map_debug_areas(void)
 {
-	uint64_t t, i;
+	uint64_t t;
 
 	/* Our memcons is in a section of its own and already
 	 * aligned to 4K. The buffers are mapped as a whole
@@ -42,40 +42,6 @@  static void map_debug_areas(void)
 	debug_descriptor.memcons_obuf_tce = t;
 	t = memcons.ibuf_phys - INMEM_CON_START + PSI_DMA_LOG_BUF;
 	debug_descriptor.memcons_ibuf_tce = t;
-
-	/* We only have space in the TCE table for the trace
-	 * areas on P8
-	 */
-	if (proc_gen != proc_gen_p8)
-		return;
-
-	t = PSI_DMA_TRACE_BASE;
-	for (i = 0; i < debug_descriptor.num_traces; i++) {
-		/*
-		 * Trace buffers are misaligned by 0x10 due to the lock
-		 * in the trace structure, and their size is also not
-		 * completely aligned. (They are allocated so that with
-		 * the lock included, they do cover entire multiple of
-		 * a 4K page however).
-		 *
-		 * This means we have to map the lock into the TCEs and
-		 * align everything. Not a huge deal but needs to be
-		 * taken into account.
-		 *
-		 * Note: Maybe we should map them read-only...
-		 */
-		uint64_t tstart, tend, toff, tsize;
-
-		tstart = ALIGN_DOWN(debug_descriptor.trace_phys[i], 0x1000);
-		tend = ALIGN_UP(debug_descriptor.trace_phys[i] +
-				debug_descriptor.trace_size[i], 0x1000);
-		toff = debug_descriptor.trace_phys[i] - tstart;
-		tsize = tend - tstart;
-
-		fsp_tce_map(t, (void *)tstart, tsize);
-		debug_descriptor.trace_tce[i] = t + toff;
-		t += tsize;
-	}
 }