1/*- 2 * Copyright (c) 2023 Juniper Networks, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 18 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 22 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 23 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 * POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28#include <sys/types.h> 29#include <sys/bus.h> 30#include "tpm_if.h" 31#include "tpm20.h" 32 33/* Override accessors */ 34static uint8_t 35tpm_read_1(device_t dev, bus_size_t off) 36{ 37 struct tpm_sc *sc = device_get_softc(dev); 38 39 return (bus_read_1(sc->mem_res, off)); 40} 41 42static uint32_t 43tpm_read_4(device_t dev, bus_size_t off) 44{ 45 struct tpm_sc *sc = device_get_softc(dev); 46 47 return (bus_read_4(sc->mem_res, off)); 48} 49 50/* 51 * Only i386 is missing bus_space_read_8. 52 */ 53#ifndef __i386__ 54static uint64_t 55tpm_read_8(device_t dev, bus_size_t off) 56{ 57 struct tpm_sc *sc = device_get_softc(dev); 58 59 return (bus_read_8(sc->mem_res, off)); 60} 61#endif 62 63static void 64tpm_write_1(device_t dev, bus_size_t off, uint8_t val) 65{ 66 struct tpm_sc *sc = device_get_softc(dev); 67 68 bus_write_1(sc->mem_res, off, val); 69} 70 71static void 72tpm_write_4(device_t dev, bus_size_t off, uint32_t val) 73{ 74 struct tpm_sc *sc = device_get_softc(dev); 75 76 bus_write_4(sc->mem_res, off, val); 77} 78 79static void 80tpm_write_barrier(device_t dev, bus_size_t off, bus_size_t length) 81{ 82 struct tpm_sc *sc = device_get_softc(dev); 83 84 bus_barrier(sc->mem_res, off, length, BUS_SPACE_BARRIER_WRITE); 85} 86 87static device_method_t tpm_bus_methods[] = { 88 DEVMETHOD(tpm_read_1, tpm_read_1), 89 DEVMETHOD(tpm_read_4, tpm_read_4), 90#ifndef __i386__ 91 DEVMETHOD(tpm_read_8, tpm_read_8), 92#endif 93 DEVMETHOD(tpm_write_1, tpm_write_1), 94 DEVMETHOD(tpm_write_4, tpm_write_4), 95 DEVMETHOD(tpm_write_barrier, tpm_write_barrier), 96 DEVMETHOD_END 97}; 98 99DEFINE_CLASS_0(tpm_lbc, tpm_bus_driver, tpm_bus_methods, sizeof(struct tpm_sc)); 100