/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2020 Ruslan Bukin <[email protected]>4*5* This work was supported by Innovate UK project 105694, "Digital Security6* by Design (DSbD) Technology Platform Prototype".7*8* Redistribution and use in source and binary forms, with or without9* modification, are permitted provided that the following conditions10* are met:11* 1. Redistributions of source code must retain the above copyright12* notice, this list of conditions and the following disclaimer.13* 2. Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in the15* documentation and/or other materials provided with the distribution.16*17* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND18* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE21* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27* SUCH DAMAGE.28*/2930#include "opt_platform.h"3132#include <sys/param.h>33#include <sys/bitstring.h>34#include <sys/systm.h>35#include <sys/bus.h>36#include <sys/kernel.h>37#include <sys/tree.h>38#include <sys/taskqueue.h>39#include <sys/sysctl.h>40#include <vm/vm.h>41#include <vm/pmap.h>42#include <dev/pci/pcireg.h>43#include <dev/pci/pcivar.h>44#include <dev/iommu/iommu.h>4546#include "smmuvar.h"4748struct smmu_quirk_entry {49uint16_t vendor;50uint16_t device;51const char *name;52uint8_t event_id;53uintptr_t input_address;54};5556/* List of events that are known and will be silenced. */57static const struct smmu_quirk_entry smmu_quirk_table[] = {58{ 0x10ec, 0x8168, "RealTek 8168/8111", 0x10 /* F_TRANSLATION */, 0x0 },59{ 0, 0, NULL, 0, 0 },60};6162bool63smmu_quirks_check(device_t dev, u_int sid, uint8_t event_id,64uintptr_t input_addr)65{66const struct smmu_quirk_entry *q;67struct smmu_ctx *ctx;68int i;6970ctx = smmu_ctx_lookup_by_sid(dev, sid);71if (!ctx)72return (false);7374for (i = 0; smmu_quirk_table[i].vendor != 0; i++) {75q = &smmu_quirk_table[i];76if (ctx->vendor == q->vendor &&77ctx->device == q->device &&78input_addr == q->input_address &&79event_id == q->event_id)80return (true);81}8283return (false);84}858687