mirror of
https://github.com/opnsense/src.git
synced 2026-04-22 23:02:02 -04:00
We must check MagicValue not just Version before anything else, and then we must check DeviceID and immediately abort if zero (and this must not be an error). Do all this when probing rather than at the start of attaching as that's where this belongs, and provides a clear boundary between the device detection and device initialisation parts of the specified driver initialisation process. This also means we don't create empty device instances for placeholder devices, reducing clutter on systems that pre-allocate a large number, such as QEMU's AArch64 virt machine (which provides 32). Reviewed by: bryanv Differential Revision: https://reviews.freebsd.org/D28070
93 lines
3.6 KiB
C
93 lines
3.6 KiB
C
/*-
|
|
* Copyright (c) 2014 Ruslan Bukin <br@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.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _VIRTIO_MMIO_H
|
|
#define _VIRTIO_MMIO_H
|
|
|
|
DECLARE_CLASS(vtmmio_driver);
|
|
|
|
struct vtmmio_virtqueue;
|
|
|
|
struct vtmmio_softc {
|
|
device_t dev;
|
|
device_t platform;
|
|
struct resource *res[2];
|
|
|
|
uint64_t vtmmio_features;
|
|
uint32_t vtmmio_flags;
|
|
uint32_t vtmmio_version;
|
|
|
|
/* This "bus" will only ever have one child. */
|
|
device_t vtmmio_child_dev;
|
|
struct virtio_feature_desc *vtmmio_child_feat_desc;
|
|
|
|
int vtmmio_nvqs;
|
|
struct vtmmio_virtqueue *vtmmio_vqs;
|
|
void *ih;
|
|
};
|
|
|
|
int vtmmio_probe(device_t);
|
|
int vtmmio_attach(device_t);
|
|
|
|
#define VIRTIO_MMIO_MAGIC_VALUE 0x000
|
|
#define VIRTIO_MMIO_VERSION 0x004
|
|
#define VIRTIO_MMIO_DEVICE_ID 0x008
|
|
#define VIRTIO_MMIO_VENDOR_ID 0x00c
|
|
#define VIRTIO_MMIO_HOST_FEATURES 0x010
|
|
#define VIRTIO_MMIO_HOST_FEATURES_SEL 0x014
|
|
#define VIRTIO_MMIO_GUEST_FEATURES 0x020
|
|
#define VIRTIO_MMIO_GUEST_FEATURES_SEL 0x024
|
|
#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 /* version 1 only */
|
|
#define VIRTIO_MMIO_QUEUE_SEL 0x030
|
|
#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
|
|
#define VIRTIO_MMIO_QUEUE_NUM 0x038
|
|
#define VIRTIO_MMIO_QUEUE_ALIGN 0x03c /* version 1 only */
|
|
#define VIRTIO_MMIO_QUEUE_PFN 0x040 /* version 1 only */
|
|
#define VIRTIO_MMIO_QUEUE_READY 0x044 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
|
|
#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
|
|
#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
|
|
#define VIRTIO_MMIO_STATUS 0x070
|
|
#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0 /* requires version 2 */
|
|
#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4 /* requires version 2 */
|
|
#define VIRTIO_MMIO_CONFIG_GENERATION 0x100 /* requires version 2 */
|
|
#define VIRTIO_MMIO_CONFIG 0x100
|
|
#define VIRTIO_MMIO_MAGIC_VIRT 0x74726976
|
|
#define VIRTIO_MMIO_INT_VRING (1 << 0)
|
|
#define VIRTIO_MMIO_INT_CONFIG (1 << 1)
|
|
#define VIRTIO_MMIO_VRING_ALIGN 4096
|
|
|
|
#endif /* _VIRTIO_MMIO_H */
|