1b09de0b3SRuslan Bukin /*- 2c9ea007cSRuslan Bukin * Copyright (c) 2018-2020 Ruslan Bukin <br@bsdpad.com> 3b09de0b3SRuslan Bukin * All rights reserved. 4b09de0b3SRuslan Bukin * 5b09de0b3SRuslan Bukin * This software was developed by SRI International and the University of 6b09de0b3SRuslan Bukin * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-10-C-0237 7b09de0b3SRuslan Bukin * ("CTSRD"), as part of the DARPA CRASH research programme. 8b09de0b3SRuslan Bukin * 9b09de0b3SRuslan Bukin * Redistribution and use in source and binary forms, with or without 10b09de0b3SRuslan Bukin * modification, are permitted provided that the following conditions 11b09de0b3SRuslan Bukin * are met: 12b09de0b3SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 13b09de0b3SRuslan Bukin * notice, this list of conditions and the following disclaimer. 14b09de0b3SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 15b09de0b3SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 16b09de0b3SRuslan Bukin * documentation and/or other materials provided with the distribution. 17b09de0b3SRuslan Bukin * 18b09de0b3SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19b09de0b3SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20b09de0b3SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21b09de0b3SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22b09de0b3SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23b09de0b3SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24b09de0b3SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25b09de0b3SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26b09de0b3SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27b09de0b3SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28b09de0b3SRuslan Bukin * SUCH DAMAGE. 29b09de0b3SRuslan Bukin */ 30b09de0b3SRuslan Bukin 31b09de0b3SRuslan Bukin #ifndef _ARM64_CORESIGHT_CORESIGHT_H_ 32b09de0b3SRuslan Bukin #define _ARM64_CORESIGHT_CORESIGHT_H_ 33b09de0b3SRuslan Bukin 34c9ea007cSRuslan Bukin #include "opt_acpi.h" 35c9ea007cSRuslan Bukin #include "opt_platform.h" 36c9ea007cSRuslan Bukin 37c9ea007cSRuslan Bukin #include <sys/bus.h> 38*b4c2a5b6SKyle Evans #include <sys/malloc.h> 39c9ea007cSRuslan Bukin 40c9ea007cSRuslan Bukin #ifdef FDT 41b09de0b3SRuslan Bukin #include <dev/ofw/openfirm.h> 42c9ea007cSRuslan Bukin #endif 43c9ea007cSRuslan Bukin 44c9ea007cSRuslan Bukin #ifdef DEV_ACPI 45c9ea007cSRuslan Bukin #include <contrib/dev/acpica/include/acpi.h> 46c9ea007cSRuslan Bukin #include <dev/acpica/acpivar.h> 47c9ea007cSRuslan Bukin #endif 48b09de0b3SRuslan Bukin 49b09de0b3SRuslan Bukin #define CORESIGHT_ITCTRL 0xf00 50b09de0b3SRuslan Bukin #define CORESIGHT_CLAIMSET 0xfa0 51b09de0b3SRuslan Bukin #define CORESIGHT_CLAIMCLR 0xfa4 52b09de0b3SRuslan Bukin #define CORESIGHT_LAR 0xfb0 53b09de0b3SRuslan Bukin #define CORESIGHT_UNLOCK 0xc5acce55 54b09de0b3SRuslan Bukin #define CORESIGHT_LSR 0xfb4 55b09de0b3SRuslan Bukin #define CORESIGHT_AUTHSTATUS 0xfb8 56b09de0b3SRuslan Bukin #define CORESIGHT_DEVID 0xfc8 57b09de0b3SRuslan Bukin #define CORESIGHT_DEVTYPE 0xfcc 58b09de0b3SRuslan Bukin 59b09de0b3SRuslan Bukin enum cs_dev_type { 60b09de0b3SRuslan Bukin CORESIGHT_ETMV4, 61b09de0b3SRuslan Bukin CORESIGHT_TMC, 62b09de0b3SRuslan Bukin CORESIGHT_DYNAMIC_REPLICATOR, 63b09de0b3SRuslan Bukin CORESIGHT_FUNNEL, 64b09de0b3SRuslan Bukin CORESIGHT_CPU_DEBUG, 65b09de0b3SRuslan Bukin }; 66b09de0b3SRuslan Bukin 67c9ea007cSRuslan Bukin enum cs_bus_type { 68c9ea007cSRuslan Bukin CORESIGHT_BUS_ACPI, 69c9ea007cSRuslan Bukin CORESIGHT_BUS_FDT, 70c9ea007cSRuslan Bukin }; 71c9ea007cSRuslan Bukin 72b09de0b3SRuslan Bukin struct coresight_device { 73b09de0b3SRuslan Bukin TAILQ_ENTRY(coresight_device) link; 74b09de0b3SRuslan Bukin device_t dev; 75b09de0b3SRuslan Bukin enum cs_dev_type dev_type; 76b09de0b3SRuslan Bukin struct coresight_platform_data *pdata; 77b09de0b3SRuslan Bukin }; 78b09de0b3SRuslan Bukin 79b09de0b3SRuslan Bukin struct endpoint { 80b09de0b3SRuslan Bukin TAILQ_ENTRY(endpoint) link; 81c9ea007cSRuslan Bukin #ifdef FDT 82b09de0b3SRuslan Bukin phandle_t my_node; 83b09de0b3SRuslan Bukin phandle_t their_node; 84b09de0b3SRuslan Bukin phandle_t dev_node; 85c9ea007cSRuslan Bukin #endif 86c9ea007cSRuslan Bukin #ifdef DEV_ACPI 87c9ea007cSRuslan Bukin ACPI_HANDLE their_handle; 88c9ea007cSRuslan Bukin ACPI_HANDLE my_handle; 89c9ea007cSRuslan Bukin #endif 90c9ea007cSRuslan Bukin boolean_t input; 91b09de0b3SRuslan Bukin int reg; 92b09de0b3SRuslan Bukin struct coresight_device *cs_dev; 93b09de0b3SRuslan Bukin LIST_ENTRY(endpoint) endplink; 94b09de0b3SRuslan Bukin }; 95b09de0b3SRuslan Bukin 96b09de0b3SRuslan Bukin struct coresight_platform_data { 97b09de0b3SRuslan Bukin int cpu; 98b09de0b3SRuslan Bukin int in_ports; 99b09de0b3SRuslan Bukin int out_ports; 100b09de0b3SRuslan Bukin struct mtx mtx_lock; 101b09de0b3SRuslan Bukin TAILQ_HEAD(endpoint_list, endpoint) endpoints; 102c9ea007cSRuslan Bukin enum cs_bus_type bus_type; 103b09de0b3SRuslan Bukin }; 104b09de0b3SRuslan Bukin 105b09de0b3SRuslan Bukin struct coresight_desc { 106b09de0b3SRuslan Bukin struct coresight_platform_data *pdata; 107b09de0b3SRuslan Bukin device_t dev; 108b09de0b3SRuslan Bukin enum cs_dev_type dev_type; 109b09de0b3SRuslan Bukin }; 110b09de0b3SRuslan Bukin 111b09de0b3SRuslan Bukin TAILQ_HEAD(coresight_device_list, coresight_device); 112b09de0b3SRuslan Bukin 113b09de0b3SRuslan Bukin #define ETM_N_COMPRATOR 16 114b09de0b3SRuslan Bukin 115b09de0b3SRuslan Bukin struct etm_state { 116b09de0b3SRuslan Bukin uint32_t trace_id; 117b09de0b3SRuslan Bukin }; 118b09de0b3SRuslan Bukin 119b09de0b3SRuslan Bukin struct etr_state { 120b09de0b3SRuslan Bukin boolean_t started; 121b09de0b3SRuslan Bukin uint32_t cycle; 122b09de0b3SRuslan Bukin uint32_t offset; 123b09de0b3SRuslan Bukin uint32_t low; 124b09de0b3SRuslan Bukin uint32_t high; 125b09de0b3SRuslan Bukin uint32_t bufsize; 126b09de0b3SRuslan Bukin uint32_t flags; 127b09de0b3SRuslan Bukin #define ETR_FLAG_ALLOCATE (1 << 0) 128b09de0b3SRuslan Bukin #define ETR_FLAG_RELEASE (1 << 1) 129b09de0b3SRuslan Bukin }; 130b09de0b3SRuslan Bukin 131b09de0b3SRuslan Bukin struct coresight_event { 132b09de0b3SRuslan Bukin LIST_HEAD(, endpoint) endplist; 133b09de0b3SRuslan Bukin 134b09de0b3SRuslan Bukin uint64_t addr[ETM_N_COMPRATOR]; 135b09de0b3SRuslan Bukin uint32_t naddr; 136b09de0b3SRuslan Bukin uint8_t excp_level; 137b09de0b3SRuslan Bukin enum cs_dev_type src; 138b09de0b3SRuslan Bukin enum cs_dev_type sink; 139b09de0b3SRuslan Bukin 140b09de0b3SRuslan Bukin struct etr_state etr; 141b09de0b3SRuslan Bukin struct etm_state etm; 142b09de0b3SRuslan Bukin }; 143b09de0b3SRuslan Bukin 144b09de0b3SRuslan Bukin struct etm_config { 145b09de0b3SRuslan Bukin uint64_t addr[ETM_N_COMPRATOR]; 146b09de0b3SRuslan Bukin uint32_t naddr; 147b09de0b3SRuslan Bukin uint8_t excp_level; 148b09de0b3SRuslan Bukin }; 149b09de0b3SRuslan Bukin 150c9ea007cSRuslan Bukin static MALLOC_DEFINE(M_CORESIGHT, "coresight", "ARM Coresight"); 151c9ea007cSRuslan Bukin 152c9ea007cSRuslan Bukin struct coresight_platform_data *coresight_fdt_get_platform_data(device_t dev); 153c9ea007cSRuslan Bukin struct coresight_platform_data *coresight_acpi_get_platform_data(device_t dev); 154b09de0b3SRuslan Bukin struct endpoint * coresight_get_output_endpoint(struct coresight_platform_data *pdata); 155b09de0b3SRuslan Bukin struct coresight_device * coresight_get_output_device(struct endpoint *endp, struct endpoint **); 156b09de0b3SRuslan Bukin int coresight_register(struct coresight_desc *desc); 157b09de0b3SRuslan Bukin int coresight_init_event(int cpu, struct coresight_event *event); 158b09de0b3SRuslan Bukin void coresight_enable(int cpu, struct coresight_event *event); 159b09de0b3SRuslan Bukin void coresight_disable(int cpu, struct coresight_event *event); 160b09de0b3SRuslan Bukin void coresight_read(int cpu, struct coresight_event *event); 161b09de0b3SRuslan Bukin 162b09de0b3SRuslan Bukin #endif /* !_ARM64_CORESIGHT_CORESIGHT_H_ */ 163