1 /*- 2 * Copyright (c) 2018-2020 Ruslan Bukin <br@bsdpad.com> 3 * All rights reserved. 4 * 5 * This software was developed by BAE Systems, the University of Cambridge 6 * Computer Laboratory, and Memorial University under DARPA/AFRL contract 7 * FA8650-15-C-7558 ("CADETS"), as part of the DARPA Transparent Computing 8 * (TC) research program. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __FBSDID("$FreeBSD$"); 34 35 #include <sys/param.h> 36 #include <sys/systm.h> 37 #include <sys/bus.h> 38 #include <sys/rman.h> 39 #include <sys/kernel.h> 40 #include <sys/module.h> 41 #include <machine/bus.h> 42 43 #include <arm64/coresight/coresight.h> 44 #include <arm64/coresight/coresight_replicator.h> 45 46 #include "coresight_if.h" 47 48 static struct resource_spec replicator_spec[] = { 49 { SYS_RES_MEMORY, 0, RF_ACTIVE }, 50 { -1, 0 } 51 }; 52 53 static int 54 replicator_init(device_t dev) 55 { 56 struct replicator_softc *sc; 57 58 sc = device_get_softc(dev); 59 60 /* Unlock Coresight */ 61 bus_write_4(sc->res, CORESIGHT_LAR, CORESIGHT_UNLOCK); 62 63 return (0); 64 } 65 66 static int 67 replicator_enable(device_t dev, struct endpoint *endp, 68 struct coresight_event *event) 69 { 70 struct replicator_softc *sc; 71 72 sc = device_get_softc(dev); 73 74 /* Enable the port. Keep the other port disabled */ 75 if (endp->reg == 0) { 76 bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0x00); 77 bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0xff); 78 } else { 79 bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0xff); 80 bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0x00); 81 } 82 83 return (0); 84 } 85 86 static void 87 replicator_disable(device_t dev, struct endpoint *endp, 88 struct coresight_event *event) 89 { 90 struct replicator_softc *sc; 91 92 sc = device_get_softc(dev); 93 94 bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0xff); 95 bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0xff); 96 } 97 98 int 99 replicator_attach(device_t dev) 100 { 101 struct replicator_softc *sc; 102 struct coresight_desc desc; 103 104 sc = device_get_softc(dev); 105 106 if (bus_alloc_resources(dev, replicator_spec, &sc->res) != 0) { 107 device_printf(dev, "cannot allocate resources for device\n"); 108 return (ENXIO); 109 } 110 111 desc.pdata = sc->pdata; 112 desc.dev = dev; 113 desc.dev_type = CORESIGHT_DYNAMIC_REPLICATOR; 114 coresight_register(&desc); 115 116 return (0); 117 } 118 119 static device_method_t replicator_methods[] = { 120 /* Coresight interface */ 121 DEVMETHOD(coresight_init, replicator_init), 122 DEVMETHOD(coresight_enable, replicator_enable), 123 DEVMETHOD(coresight_disable, replicator_disable), 124 DEVMETHOD_END 125 }; 126 127 DEFINE_CLASS_0(replicator, replicator_driver, replicator_methods, 128 sizeof(struct replicator_softc)); 129