svn commit: r362278 - in head/sys: arm64/coresight conf
Ruslan Bukin
br at FreeBSD.org
Wed Jun 17 15:54:53 UTC 2020
Author: br
Date: Wed Jun 17 15:54:51 2020
New Revision: 362278
URL: https://svnweb.freebsd.org/changeset/base/362278
Log:
Complete the ACPI support for ARM Coresight:
o Parse the ACPI DSD (Device Specific Data) graph property and record
device connections.
o Split-out FDT support to a separate file.
o Get the corresponding (FDT/ACPI) Coresight platform data in
the device drivers.
Sponsored by: DARPA, AFRL
Added:
head/sys/arm64/coresight/coresight_acpi.c (contents, props changed)
head/sys/arm64/coresight/coresight_fdt.c (contents, props changed)
Modified:
head/sys/arm64/coresight/coresight.c
head/sys/arm64/coresight/coresight.h
head/sys/arm64/coresight/coresight_cmd.c
head/sys/arm64/coresight/coresight_cpu_debug.c
head/sys/arm64/coresight/coresight_etm4x.c
head/sys/arm64/coresight/coresight_etm4x.h
head/sys/arm64/coresight/coresight_etm4x_acpi.c
head/sys/arm64/coresight/coresight_etm4x_fdt.c
head/sys/arm64/coresight/coresight_funnel.c
head/sys/arm64/coresight/coresight_funnel.h
head/sys/arm64/coresight/coresight_funnel_acpi.c
head/sys/arm64/coresight/coresight_funnel_fdt.c
head/sys/arm64/coresight/coresight_replicator.c
head/sys/arm64/coresight/coresight_replicator.h
head/sys/arm64/coresight/coresight_replicator_acpi.c
head/sys/arm64/coresight/coresight_replicator_fdt.c
head/sys/arm64/coresight/coresight_tmc.c
head/sys/arm64/coresight/coresight_tmc.h
head/sys/arm64/coresight/coresight_tmc_acpi.c
head/sys/arm64/coresight/coresight_tmc_fdt.c
head/sys/conf/files.arm64
Modified: head/sys/arm64/coresight/coresight.c
==============================================================================
--- head/sys/arm64/coresight/coresight.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by SRI International and the University of
@@ -41,78 +41,11 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <machine/bus.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
#include <arm64/coresight/coresight.h>
-MALLOC_DEFINE(M_CORESIGHT, "coresight", "ARM Coresight");
static struct mtx cs_mtx;
-
struct coresight_device_list cs_devs;
-static int
-coresight_get_ports(phandle_t dev_node,
- struct coresight_platform_data *pdata)
-{
- phandle_t node, child;
- pcell_t port_reg;
- phandle_t xref;
- char *name;
- int ret;
- phandle_t endpoint_child;
- struct endpoint *endp;
-
- child = ofw_bus_find_child(dev_node, "ports");
- if (child)
- node = child;
- else
- node = dev_node;
-
- for (child = OF_child(node); child != 0; child = OF_peer(child)) {
- ret = OF_getprop_alloc(child, "name", (void **)&name);
- if (ret == -1)
- continue;
-
- if (strcasecmp(name, "port") ||
- strncasecmp(name, "port@", 6)) {
-
- port_reg = -1;
- OF_getencprop(child, "reg", (void *)&port_reg,
- sizeof(port_reg));
-
- endpoint_child = ofw_bus_find_child(child, "endpoint");
- if (endpoint_child) {
- if (OF_getencprop(endpoint_child,
- "remote-endpoint", &xref,
- sizeof(xref)) == -1) {
- printf("failed\n");
- continue;
- }
- endp = malloc(sizeof(struct endpoint),
- M_CORESIGHT, M_WAITOK | M_ZERO);
- endp->my_node = endpoint_child;
- endp->their_node = OF_node_from_xref(xref);
- endp->dev_node = dev_node;
- endp->reg = port_reg;
- if (OF_getproplen(endpoint_child,
- "slave-mode") >= 0) {
- pdata->in_ports++;
- endp->slave = 1;
- } else
- pdata->out_ports++;
-
- mtx_lock(&pdata->mtx_lock);
- TAILQ_INSERT_TAIL(&pdata->endpoints,
- endp, link);
- mtx_unlock(&pdata->mtx_lock);
- }
- }
- }
-
- return (0);
-}
-
int
coresight_register(struct coresight_desc *desc)
{
@@ -121,7 +54,6 @@ coresight_register(struct coresight_desc *desc)
cs_dev = malloc(sizeof(struct coresight_device),
M_CORESIGHT, M_WAITOK | M_ZERO);
cs_dev->dev = desc->dev;
- cs_dev->node = ofw_bus_get_node(desc->dev);
cs_dev->pdata = desc->pdata;
cs_dev->dev_type = desc->dev_type;
@@ -141,7 +73,7 @@ coresight_get_output_endpoint(struct coresight_platfor
return (NULL);
TAILQ_FOREACH(endp, &pdata->endpoints, link) {
- if (endp->slave == 0)
+ if (endp->input == 0)
return (endp);
}
@@ -151,62 +83,36 @@ coresight_get_output_endpoint(struct coresight_platfor
struct coresight_device *
coresight_get_output_device(struct endpoint *endp, struct endpoint **out_endp)
{
+ struct coresight_platform_data *pdata;
struct coresight_device *cs_dev;
struct endpoint *endp2;
TAILQ_FOREACH(cs_dev, &cs_devs, link) {
+ pdata = cs_dev->pdata;
TAILQ_FOREACH(endp2, &cs_dev->pdata->endpoints, link) {
- if (endp->their_node == endp2->my_node) {
- *out_endp = endp2;
- return (cs_dev);
+ switch (pdata->bus_type) {
+ case CORESIGHT_BUS_FDT:
+#ifdef FDT
+ if (endp->their_node == endp2->my_node) {
+ *out_endp = endp2;
+ return (cs_dev);
+ }
+#endif
+ break;
+
+ case CORESIGHT_BUS_ACPI:
+#ifdef DEV_ACPI
+ if (endp->their_handle == endp2->my_handle) {
+ *out_endp = endp2;
+ return (cs_dev);
+ }
+#endif
+ break;
}
}
}
return (NULL);
-}
-
-static int
-coresight_get_cpu(phandle_t node,
- struct coresight_platform_data *pdata)
-{
- phandle_t cpu_node;
- pcell_t xref;
- pcell_t cpu_reg;
-
- if (OF_getencprop(node, "cpu", &xref, sizeof(xref)) != -1) {
- cpu_node = OF_node_from_xref(xref);
- if (OF_getencprop(cpu_node, "reg", (void *)&cpu_reg,
- sizeof(cpu_reg)) > 0) {
- pdata->cpu = cpu_reg;
- return (0);
- }
- }
-
- return (-1);
-}
-
-struct coresight_platform_data *
-coresight_get_platform_data(device_t dev)
-{
- struct coresight_platform_data *pdata;
- phandle_t node;
-
- node = ofw_bus_get_node(dev);
-
- pdata = malloc(sizeof(struct coresight_platform_data),
- M_CORESIGHT, M_WAITOK | M_ZERO);
- mtx_init(&pdata->mtx_lock, "Coresight Platform Data", NULL, MTX_DEF);
- TAILQ_INIT(&pdata->endpoints);
-
- coresight_get_cpu(node, pdata);
- coresight_get_ports(node, pdata);
-
- if (bootverbose)
- printf("Total ports: in %d out %d\n",
- pdata->in_ports, pdata->out_ports);
-
- return (pdata);
}
static void
Modified: head/sys/arm64/coresight/coresight.h
==============================================================================
--- head/sys/arm64/coresight/coresight.h Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight.h Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by SRI International and the University of
@@ -33,8 +33,20 @@
#ifndef _ARM64_CORESIGHT_CORESIGHT_H_
#define _ARM64_CORESIGHT_CORESIGHT_H_
+#include "opt_acpi.h"
+#include "opt_platform.h"
+
+#include <sys/bus.h>
+
+#ifdef FDT
#include <dev/ofw/openfirm.h>
+#endif
+#ifdef DEV_ACPI
+#include <contrib/dev/acpica/include/acpi.h>
+#include <dev/acpica/acpivar.h>
+#endif
+
#define CORESIGHT_ITCTRL 0xf00
#define CORESIGHT_CLAIMSET 0xfa0
#define CORESIGHT_CLAIMCLR 0xfa4
@@ -53,20 +65,30 @@ enum cs_dev_type {
CORESIGHT_CPU_DEBUG,
};
+enum cs_bus_type {
+ CORESIGHT_BUS_ACPI,
+ CORESIGHT_BUS_FDT,
+};
+
struct coresight_device {
TAILQ_ENTRY(coresight_device) link;
device_t dev;
- phandle_t node;
enum cs_dev_type dev_type;
struct coresight_platform_data *pdata;
};
struct endpoint {
TAILQ_ENTRY(endpoint) link;
+#ifdef FDT
phandle_t my_node;
phandle_t their_node;
phandle_t dev_node;
- boolean_t slave;
+#endif
+#ifdef DEV_ACPI
+ ACPI_HANDLE their_handle;
+ ACPI_HANDLE my_handle;
+#endif
+ boolean_t input;
int reg;
struct coresight_device *cs_dev;
LIST_ENTRY(endpoint) endplink;
@@ -78,6 +100,7 @@ struct coresight_platform_data {
int out_ports;
struct mtx mtx_lock;
TAILQ_HEAD(endpoint_list, endpoint) endpoints;
+ enum cs_bus_type bus_type;
};
struct coresight_desc {
@@ -125,7 +148,10 @@ struct etm_config {
uint8_t excp_level;
};
-struct coresight_platform_data * coresight_get_platform_data(device_t dev);
+static MALLOC_DEFINE(M_CORESIGHT, "coresight", "ARM Coresight");
+
+struct coresight_platform_data *coresight_fdt_get_platform_data(device_t dev);
+struct coresight_platform_data *coresight_acpi_get_platform_data(device_t dev);
struct endpoint * coresight_get_output_endpoint(struct coresight_platform_data *pdata);
struct coresight_device * coresight_get_output_device(struct endpoint *endp, struct endpoint **);
int coresight_register(struct coresight_desc *desc);
Added: head/sys/arm64/coresight/coresight_acpi.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm64/coresight/coresight_acpi.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -0,0 +1,373 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2020 Ruslan Bukin <br at bsdpad.com>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <sys/uuid.h>
+#include <machine/bus.h>
+
+#include <contrib/dev/acpica/include/acpi.h>
+#include <dev/acpica/acpivar.h>
+
+#include <arm64/coresight/coresight.h>
+
+#define ACPI_CORESIGHT_LINK_OUTPUT 1
+#define ACPI_CORESIGHT_LINK_INPUT 0
+
+static const struct uuid acpi_graph_uuid = {
+ 0xab02a46b, 0x74c7, 0x45a2, 0xbd, 0x68,
+ { 0xf7, 0xd3, 0x44, 0xef, 0x21, 0x53 },
+};
+
+static const struct uuid coresight_graph_uuid = {
+ 0x3ecbc8b6, 0x1d0e, 0x4fb3, 0x81, 0x07,
+ { 0xe6, 0x27, 0xf8, 0x05, 0xc6, 0xcd },
+};
+
+static inline bool
+cs_acpi_validate_dsd_graph(const union acpi_object *graph)
+{
+ const union acpi_object *rev, *nr_graphs;
+ const union acpi_object *obj;
+ int i, n;
+
+ if (graph->Package.Count < 2)
+ return (false);
+
+ rev = &graph->Package.Elements[0];
+ nr_graphs = &graph->Package.Elements[1];
+
+ if (rev->Type != ACPI_TYPE_INTEGER ||
+ nr_graphs->Type != ACPI_TYPE_INTEGER)
+ return (false);
+
+ /* Revision 0 supported only. */
+ if (rev->Integer.Value != 0)
+ return (false);
+
+ /* We are looking for a single graph. */
+ n = nr_graphs->Integer.Value;
+ if (n != 1)
+ return (false);
+
+ /* Check the number of elements. */
+ if (graph->Package.Count != (n + 2))
+ return (false);
+
+ for (i = 2; i < n + 2; i++) {
+ obj = &graph->Package.Elements[i];
+ if (obj->Type != ACPI_TYPE_PACKAGE || obj->Package.Count < 3)
+ return (false);
+ }
+
+ return (true);
+}
+
+static inline bool
+cs_is_acpi_guid(const union acpi_object *obj)
+{
+
+ return (obj->Type == ACPI_TYPE_BUFFER) && (obj->Buffer.Length == 16);
+}
+
+static inline bool
+cs_guid_equal(const struct uuid *u1, const struct uuid *u2)
+{
+
+ if (memcmp(u1, u2, 16) == 0)
+ return (true);
+
+ return (false);
+}
+
+static inline bool
+cs_acpi_guid_matches(const union acpi_object *obj, const struct uuid *guid)
+{
+
+ if (cs_is_acpi_guid(obj) &&
+ cs_guid_equal((struct uuid *)obj->Buffer.Pointer, guid))
+ return (true);
+
+ return (false);
+}
+
+static inline bool
+is_acpi_dsd_graph_guid(const union acpi_object *obj)
+{
+
+ return (cs_acpi_guid_matches(obj, &acpi_graph_uuid));
+}
+
+static inline bool
+cs_is_acpi_coresight_graph_guid(const union acpi_object *obj)
+{
+
+ return (cs_acpi_guid_matches(obj, &coresight_graph_uuid));
+}
+
+static inline bool
+cs_is_acpi_coresight_graph(const union acpi_object *obj)
+{
+ const union acpi_object *graphid, *guid, *links;
+
+ if (obj->Type != ACPI_TYPE_PACKAGE ||
+ obj->Package.Count < 3)
+ return (false);
+
+ graphid = &obj->Package.Elements[0];
+ guid = &obj->Package.Elements[1];
+ links = &obj->Package.Elements[2];
+
+ if (graphid->Type != ACPI_TYPE_INTEGER ||
+ links->Type != ACPI_TYPE_INTEGER)
+ return (false);
+
+ if (cs_is_acpi_coresight_graph_guid(guid))
+ return (true);
+
+ return (false);
+}
+
+static const union acpi_object *
+cs_get_dsd_graph(device_t dev)
+{
+ const union acpi_object *guid, *package;
+ union acpi_object *dsd;
+ ACPI_STATUS status;
+ ACPI_BUFFER buf;
+ device_t bus;
+ int i;
+
+ buf.Length = PAGE_SIZE;
+ buf.Pointer = malloc(buf.Length, M_TEMP, M_NOWAIT | M_ZERO);
+ if (buf.Pointer == NULL) {
+ printf("Failed to allocate memory.\n");
+ return (NULL);
+ }
+
+ bus = device_get_parent(dev);
+ status = ACPI_EVALUATE_OBJECT(bus, dev, "_DSD", NULL, &buf);
+ if (ACPI_FAILURE(status)) {
+ printf("Failed to evaluate object.\n");
+ return (NULL);
+ }
+
+ dsd = buf.Pointer;
+
+ for (i = 0; i + 1 < dsd->Package.Count; i += 2) {
+ guid = &dsd->Package.Elements[i];
+ package = &dsd->Package.Elements[i + 1];
+
+ if (!cs_is_acpi_guid(guid) ||
+ package->Type != ACPI_TYPE_PACKAGE)
+ break;
+
+ if (!is_acpi_dsd_graph_guid(guid))
+ continue;
+
+ if (cs_acpi_validate_dsd_graph(package))
+ return (package);
+ }
+
+ return (NULL);
+}
+
+static inline bool
+cs_acpi_validate_coresight_graph(const union acpi_object *cs_graph)
+{
+ int nlinks;
+
+ nlinks = cs_graph->Package.Elements[2].Integer.Value;
+ if (cs_graph->Package.Count != (nlinks + 3))
+ return (false);
+
+ return (true);
+}
+
+static const union acpi_object *
+cs_get_coresight_graph(device_t dev)
+{
+ const union acpi_object *graph_list, *graph;
+ int i, nr_graphs;
+
+ graph_list = cs_get_dsd_graph(dev);
+ if (!graph_list) {
+ printf("failed to get graph list\n");
+ return (NULL);
+ }
+
+ nr_graphs = graph_list->Package.Elements[1].Integer.Value;
+ for (i = 2; i < nr_graphs + 2; i++) {
+ graph = &graph_list->Package.Elements[i];
+ if (!cs_is_acpi_coresight_graph(graph))
+ continue;
+ if (cs_acpi_validate_coresight_graph(graph))
+ return (graph);
+ break;
+ }
+
+ return (NULL);
+}
+
+static int
+cs_acpi_record_endpoint(device_t dev,
+ struct coresight_platform_data *pdata,
+ const union acpi_object *link)
+{
+ const union acpi_object *fields;
+ struct endpoint *endp;
+ ACPI_HANDLE handle;
+ int dir;
+
+ if (link->Type != ACPI_TYPE_PACKAGE ||
+ link->Package.Count != 4)
+ return (ENXIO);
+
+ fields = link->Package.Elements;
+ if (fields[0].Type != ACPI_TYPE_INTEGER ||
+ fields[1].Type != ACPI_TYPE_INTEGER ||
+ fields[2].Type != ACPI_TYPE_LOCAL_REFERENCE ||
+ fields[3].Type != ACPI_TYPE_INTEGER)
+ return (ENXIO);
+
+ handle = fields[2].Reference.Handle;
+ dir = fields[3].Integer.Value;
+
+ endp = malloc(sizeof(struct endpoint),
+ M_CORESIGHT, M_WAITOK | M_ZERO);
+ if (endp == NULL) {
+ device_printf(dev, "Failed to allocate memory.\n");
+ return (ENXIO);
+ }
+
+ endp->their_handle = handle;
+ endp->my_handle = acpi_get_handle(dev);
+
+ mtx_lock(&pdata->mtx_lock);
+ TAILQ_INSERT_TAIL(&pdata->endpoints, endp, link);
+ mtx_unlock(&pdata->mtx_lock);
+
+ if (dir == ACPI_CORESIGHT_LINK_OUTPUT) {
+ pdata->out_ports++;
+ } else {
+ endp->input = true;
+ pdata->in_ports++;
+ }
+
+ return (0);
+}
+
+static int
+coresight_acpi_get_ports(device_t dev,
+ struct coresight_platform_data *pdata)
+{
+ const union acpi_object *graph;
+ const union acpi_object *link;
+ int nlinks;
+ int error;
+ int i;
+
+ graph = cs_get_coresight_graph(dev);
+ if (graph == NULL) {
+ device_printf(dev, "Coresight graph not found.\n");
+ return (ENXIO);
+ }
+
+ nlinks = graph->Package.Elements[2].Integer.Value;
+ if (!nlinks)
+ return (0);
+
+ for (i = 0; i < nlinks; i++) {
+ link = &graph->Package.Elements[3 + i];
+ error = cs_acpi_record_endpoint(dev, pdata, link);
+ if (error < 0)
+ return (error);
+ }
+
+ return (0);
+}
+
+static int
+coresight_acpi_get_cpu(device_t dev, struct coresight_platform_data *pdata)
+{
+ ACPI_HANDLE handle, parent;
+ ACPI_STATUS status;
+ int cpuid;
+
+ handle = acpi_get_handle(dev);
+
+ status = AcpiGetParent(handle, &parent);
+ if (!ACPI_SUCCESS(status))
+ return (ENXIO);
+
+ if (!acpi_MatchHid(parent, "ACPI0007"))
+ return (ENXIO);
+
+ status = acpi_GetInteger(parent, "_UID", &cpuid);
+ if (ACPI_SUCCESS(status)) {
+ pdata->cpu = cpuid;
+ return (0);
+ }
+
+ return (ENXIO);
+}
+
+struct coresight_platform_data *
+coresight_acpi_get_platform_data(device_t dev)
+{
+ struct coresight_platform_data *pdata;
+
+ pdata = malloc(sizeof(struct coresight_platform_data),
+ M_CORESIGHT, M_WAITOK | M_ZERO);
+ pdata->bus_type = CORESIGHT_BUS_ACPI;
+
+ mtx_init(&pdata->mtx_lock, "Coresight Platform Data", NULL, MTX_DEF);
+ TAILQ_INIT(&pdata->endpoints);
+
+ coresight_acpi_get_cpu(dev, pdata);
+ coresight_acpi_get_ports(dev, pdata);
+
+ if (bootverbose)
+ printf("Total ports: in %d out %d\n",
+ pdata->in_ports, pdata->out_ports);
+
+ return (pdata);
+}
Modified: head/sys/arm64/coresight/coresight_cmd.c
==============================================================================
--- head/sys/arm64/coresight/coresight_cmd.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_cmd.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by SRI International and the University of
@@ -54,7 +54,7 @@ coresight_next_device(struct coresight_device *cs_dev,
struct endpoint *endp;
TAILQ_FOREACH(endp, &cs_dev->pdata->endpoints, link) {
- if (endp->slave != 0)
+ if (endp->input != 0)
continue;
out = coresight_get_output_device(endp, &out_endp);
@@ -67,6 +67,9 @@ coresight_next_device(struct coresight_device *cs_dev,
}
/* Add output device */
+ if (bootverbose)
+ printf("Adding device %s to the chain\n",
+ device_get_nameunit(out->dev));
out_endp->cs_dev = out;
LIST_INSERT_HEAD(&event->endplist, out_endp, endplink);
Modified: head/sys/arm64/coresight/coresight_cpu_debug.c
==============================================================================
--- head/sys/arm64/coresight/coresight_cpu_debug.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_cpu_debug.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by BAE Systems, the University of Cambridge
@@ -132,7 +132,7 @@ debug_attach(device_t dev)
return (ENXIO);
}
- sc->pdata = coresight_get_platform_data(dev);
+ sc->pdata = coresight_fdt_get_platform_data(dev);
desc.pdata = sc->pdata;
desc.dev = dev;
desc.dev_type = CORESIGHT_CPU_DEBUG;
Modified: head/sys/arm64/coresight/coresight_etm4x.c
==============================================================================
--- head/sys/arm64/coresight/coresight_etm4x.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_etm4x.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by BAE Systems, the University of Cambridge
@@ -234,7 +234,7 @@ etm_disable(device_t dev, struct endpoint *endp,
} while ((reg & TRCSTATR_IDLE) == 0);
}
-static int
+int
etm_attach(device_t dev)
{
struct coresight_desc desc;
@@ -247,7 +247,6 @@ etm_attach(device_t dev)
return (ENXIO);
}
- sc->pdata = coresight_get_platform_data(dev);
desc.pdata = sc->pdata;
desc.dev = dev;
desc.dev_type = CORESIGHT_ETMV4;
@@ -257,8 +256,6 @@ etm_attach(device_t dev)
}
static device_method_t etm_methods[] = {
- /* Device interface */
- DEVMETHOD(device_attach, etm_attach),
/* Coresight interface */
DEVMETHOD(coresight_init, etm_init),
Modified: head/sys/arm64/coresight/coresight_etm4x.h
==============================================================================
--- head/sys/arm64/coresight/coresight_etm4x.h Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_etm4x.h Wed Jun 17 15:54:51 2020 (r362278)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2018 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
* All rights reserved.
*
* This software was developed by BAE Systems, the University of Cambridge
@@ -34,13 +34,6 @@
#ifndef _ARM64_CORESIGHT_ETM4X_H_
#define _ARM64_CORESIGHT_ETM4X_H_
-DECLARE_CLASS(etm_driver);
-
-struct etm_softc {
- struct resource *res;
- struct coresight_platform_data *pdata;
-};
-
#define TRCPRGCTLR 0x004 /* Trace Programming Control Register */
#define TRCPRGCTLR_EN (1 << 0) /* Trace unit enable bit */
#define TRCPROCSELR 0x008 /* Trace PE Select Control Register */
@@ -178,5 +171,14 @@ struct etm_softc {
#define TRCPIDR(n) (0xFE0 + (n) * 0x4) /* Management Peripheral IDn Register [n=0-3] */
#define TRCPIDR567(n) (0xFD4 + ((n) - 5) * 0x4) /* Management Peripheral ID5 to Peripheral ID7 Registers */
#define TRCCIDR(n) (0xFF0 + (n) * 0x4) /* Management Component IDn Register [n=0-4] */
+
+DECLARE_CLASS(etm_driver);
+
+struct etm_softc {
+ struct resource *res;
+ struct coresight_platform_data *pdata;
+};
+
+int etm_attach(device_t dev);
#endif /* !_ARM64_CORESIGHT_ETM4X_H_ */
Modified: head/sys/arm64/coresight/coresight_etm4x_acpi.c
==============================================================================
--- head/sys/arm64/coresight/coresight_etm4x_acpi.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_etm4x_acpi.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <contrib/dev/acpica/include/acpi.h>
#include <dev/acpica/acpivar.h>
+#include <arm64/coresight/coresight.h>
#include <arm64/coresight/coresight_etm4x.h>
static int
@@ -62,9 +63,21 @@ etm_acpi_probe(device_t dev)
return (error);
}
+static int
+etm_acpi_attach(device_t dev)
+{
+ struct etm_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->pdata = coresight_acpi_get_platform_data(dev);
+
+ return (etm_attach(dev));
+}
+
static device_method_t etm_acpi_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, etm_acpi_probe),
+ DEVMETHOD(device_attach, etm_acpi_attach),
/* End */
DEVMETHOD_END
Modified: head/sys/arm64/coresight/coresight_etm4x_fdt.c
==============================================================================
--- head/sys/arm64/coresight/coresight_etm4x_fdt.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_etm4x_fdt.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -67,9 +67,21 @@ etm_fdt_probe(device_t dev)
return (BUS_PROBE_DEFAULT);
}
+static int
+etm_fdt_attach(device_t dev)
+{
+ struct etm_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->pdata = coresight_fdt_get_platform_data(dev);
+
+ return (etm_attach(dev));
+}
+
static device_method_t etm_fdt_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, etm_fdt_probe),
+ DEVMETHOD(device_attach, etm_fdt_attach),
DEVMETHOD_END
};
Added: head/sys/arm64/coresight/coresight_fdt.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/arm64/coresight/coresight_fdt.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -0,0 +1,154 @@
+/*-
+ * Copyright (c) 2018-2020 Ruslan Bukin <br at bsdpad.com>
+ * All rights reserved.
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-10-C-0237
+ * ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <machine/bus.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <arm64/coresight/coresight.h>
+
+static int
+coresight_fdt_get_ports(phandle_t dev_node,
+ struct coresight_platform_data *pdata)
+{
+ phandle_t node, child;
+ pcell_t port_reg;
+ phandle_t xref;
+ char *name;
+ int ret;
+ phandle_t endpoint_child;
+ struct endpoint *endp;
+
+ child = ofw_bus_find_child(dev_node, "ports");
+ if (child)
+ node = child;
+ else
+ node = dev_node;
+
+ for (child = OF_child(node); child != 0; child = OF_peer(child)) {
+ ret = OF_getprop_alloc(child, "name", (void **)&name);
+ if (ret == -1)
+ continue;
+
+ if (strcasecmp(name, "port") ||
+ strncasecmp(name, "port@", 6)) {
+
+ port_reg = -1;
+ OF_getencprop(child, "reg", (void *)&port_reg,
+ sizeof(port_reg));
+
+ endpoint_child = ofw_bus_find_child(child, "endpoint");
+ if (endpoint_child) {
+ if (OF_getencprop(endpoint_child,
+ "remote-endpoint", &xref,
+ sizeof(xref)) == -1) {
+ printf("failed\n");
+ continue;
+ }
+ endp = malloc(sizeof(struct endpoint),
+ M_CORESIGHT, M_WAITOK | M_ZERO);
+ endp->my_node = endpoint_child;
+ endp->their_node = OF_node_from_xref(xref);
+ endp->dev_node = dev_node;
+ endp->reg = port_reg;
+ if (OF_getproplen(endpoint_child,
+ "slave-mode") >= 0) {
+ pdata->in_ports++;
+ endp->input = 1;
+ } else
+ pdata->out_ports++;
+
+ mtx_lock(&pdata->mtx_lock);
+ TAILQ_INSERT_TAIL(&pdata->endpoints,
+ endp, link);
+ mtx_unlock(&pdata->mtx_lock);
+ }
+ }
+ }
+
+ return (0);
+}
+
+static int
+coresight_fdt_get_cpu(phandle_t node,
+ struct coresight_platform_data *pdata)
+{
+ phandle_t cpu_node;
+ pcell_t xref;
+ pcell_t cpu_reg;
+
+ if (OF_getencprop(node, "cpu", &xref, sizeof(xref)) != -1) {
+ cpu_node = OF_node_from_xref(xref);
+ if (OF_getencprop(cpu_node, "reg", (void *)&cpu_reg,
+ sizeof(cpu_reg)) > 0) {
+ pdata->cpu = cpu_reg;
+ return (0);
+ }
+ }
+
+ return (-1);
+}
+
+struct coresight_platform_data *
+coresight_fdt_get_platform_data(device_t dev)
+{
+ struct coresight_platform_data *pdata;
+ phandle_t node;
+
+ node = ofw_bus_get_node(dev);
+
+ pdata = malloc(sizeof(struct coresight_platform_data),
+ M_CORESIGHT, M_WAITOK | M_ZERO);
+ pdata->bus_type = CORESIGHT_BUS_FDT;
+
+ mtx_init(&pdata->mtx_lock, "Coresight Platform Data", NULL, MTX_DEF);
+ TAILQ_INIT(&pdata->endpoints);
+
+ coresight_fdt_get_cpu(node, pdata);
+ coresight_fdt_get_ports(node, pdata);
+
+ if (bootverbose)
+ printf("Total ports: in %d out %d\n",
+ pdata->in_ports, pdata->out_ports);
+
+ return (pdata);
+}
Modified: head/sys/arm64/coresight/coresight_funnel.c
==============================================================================
--- head/sys/arm64/coresight/coresight_funnel.c Wed Jun 17 15:27:45 2020 (r362277)
+++ head/sys/arm64/coresight/coresight_funnel.c Wed Jun 17 15:54:51 2020 (r362278)
@@ -111,7 +111,7 @@ funnel_disable(device_t dev, struct endpoint *endp,
bus_write_4(sc->res, FUNNEL_FUNCTL, reg);
}
-static int
+int
funnel_attach(device_t dev)
{
struct coresight_desc desc;
@@ -124,7 +124,6 @@ funnel_attach(device_t dev)
return (ENXIO);
}
- sc->pdata = coresight_get_platform_data(dev);
desc.pdata = sc->pdata;
desc.dev = dev;
desc.dev_type = CORESIGHT_FUNNEL;
@@ -134,9 +133,6 @@ funnel_attach(device_t dev)
}
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list