rawpci.h revision 1e4093b98e92fd2f47c3126f2dfb3ba33d7f77dc
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** @file
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * PDM - Pluggable Device Manager, raw PCI Devices. (VMM)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/*
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Copyright (C) 2010-2011 Oracle Corporation
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * available from http://www.virtualbox.org. This file is free software;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * General Public License (GPL) as published by the Free Software
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * The contents of this file may alternatively be used under the terms
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * of the Common Development and Distribution License Version 1.0
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * VirtualBox OSE distribution, in which case the provisions of the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * CDDL are applicable instead of those of the GPL.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * You may elect to license modified versions of this file under the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * terms and conditions of either the GPL or the CDDL or both.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#ifndef ___VBox_rawpci_h
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#define ___VBox_rawpci_h
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#include <iprt/types.h>
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsyncRT_C_DECLS_BEGIN
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Handle for the raw PCI device.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef RTR0PTR PCIRAWDEVHANDLE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_OPEN_DEVICE call */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t PciAddress;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* out */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWDEVHANDLE Device;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQOPENDEVICE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_CLOSE_DEVICE call */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQCLOSEDEVICE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_GET_REGION_INFO call */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* out */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTGCPHYS RegionStart;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t u64RegionSize;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync bool fPresent;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQGETREGIONINFO;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_MAP_REGION call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTGCPHYS StartAddress;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t iRegionSize;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* out */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR3PTR pvAddressR3;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR pvAddressR0;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQMAPREGION;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_UNMAP_REGION call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTGCPHYS StartAddress;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t iRegionSize;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR3PTR pvAddressR3;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR pvAddressR0;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQUNMAPREGION;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_PIO_WRITE call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint16_t iPort;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint16_t cb;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t iValue;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQPIOWRITE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_PIO_READ call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint16_t iPort;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint16_t cb;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* out */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t iValue;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQPIOREAD;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Memory operand. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync union
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint8_t u8;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint16_t u16;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t u32;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t u64;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync } u;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint8_t cb;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWMEMLOC;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_MMIO_WRITE call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR Address;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC Value;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQMMIOWRITE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_MMIO_READ call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR Address;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* inout (Value.cb is in) */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC Value;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQMMIOREAD;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/* Parameters buffer for PCIRAWR0_DO_PCICFG_WRITE call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t iOffset;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC Value;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQPCICFGWRITE;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Parameters buffer for PCIRAWR0_DO_PCICFG_READ call. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* in */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t iOffset;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* inout (Value.cb is in) */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC Value;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWREQPCICFGREAD;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Request buffer use for communication with the driver.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct PCIRAWSENDREQ
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** The request header. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync SUPVMMR0REQHDR Hdr;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Alternative to passing the taking the session from the VM handle.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Either use this member or use the VM handle, don't do both.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PSUPDRVSESSION pSession;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Request type. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRequest;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Host device request targetted to. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWDEVHANDLE TargetDevice;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Call parameters. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync union
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync {
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQOPENDEVICE aOpenDevice;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQCLOSEDEVICE aCloseDevice;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQGETREGIONINFO aGetRegionInfo;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQMAPREGION aMapRegion;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQUNMAPREGION aUnmapRegion;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQPIOWRITE aPioWrite;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQPIOREAD aPioRead;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQMMIOWRITE aMmioWrite;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQMMIOREAD aMmioRead;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQPCICFGWRITE aPciCfgWrite;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWREQPCICFGREAD aPciCfgRead;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync } u;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWSENDREQ;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef PCIRAWSENDREQ *PPCIRAWSENDREQ;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
8b90eb0585fa16024709ca374c69f1eb5d5a5a7cvboxsync * Operations performed by the driver.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef enum PCIRAWR0OPERATION
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Open device. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_OPEN_DEVICE,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Close device. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_CLOSE_DEVICE,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Get PCI region info. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_GET_REGION_INFO,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Map PCI region into VM address space. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_MAP_REGION,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Unmap PCI region from VM address space. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_UNMAP_REGION,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform PIO write. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_PIO_WRITE,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform PIO read. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_PIO_READ,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform MMIO write. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_MMIO_WRITE,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform MMIO read. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_MMIO_READ,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform PCI config write. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_PCICFG_WRITE,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /* Perform PCI config read. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_PCICFG_READ,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** The usual 32-bit type blow up. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWR0_DO_32BIT_HACK = 0x7fffffff
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} PCIRAWR0OPERATION;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/** Forward declarations. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct RAWPCIFACTORY *PRAWPCIFACTORY;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct RAWPCIDEVPORT *PRAWPCIDEVPORT;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * This is the port on the device interface, i.e. the driver side which the
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * host device is connected to.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * This is only used for the in-kernel PCI device connections.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct RAWPCIDEVPORT
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Structure version number. (RAWPCIDEVPORT_VERSION) */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t u32Version;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Retain the object.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * It will normally be called while owning the internal semaphore.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(void, pfnRetain,(PRAWPCIDEVPORT pPort));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Releases the object.
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * This must be called for every pfnRetain call.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(void, pfnRelease,(PRAWPCIDEVPORT pPort));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Init device.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param fFlags Initialization flags.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnInit,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Deinit device.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param fFlags Initialization flags.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnDeinit,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t fFlags));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Get PCI region info.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnGetRegionInfo,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTHCPHYS *pRegionStart,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t *pu64RegionSize,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync bool *pfPresent,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t *pfFlags));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Map PCI region.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnMapRegion,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTHCPHYS RegionStart,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t u64RegionSize,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t fFlags,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR *pRegionBaseR0));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Unmap PCI region.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnUnmapRegion,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync int32_t iRegion,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTHCPHYS RegionStart,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint64_t u64RegionSize,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync RTR0PTR RegionBase));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Read device PCI register.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
8b90eb0585fa16024709ca374c69f1eb5d5a5a7cvboxsync * @param fFlags Initialization flags.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnPciCfgRead,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t Register,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC *pValue));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * Write device PCI register.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pPort Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param fFlags Initialization flags.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(int, pfnPciCfgWrite,(PRAWPCIDEVPORT pPort,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t Register,
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync PCIRAWMEMLOC *pValue));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /** Structure version number. (RAWPCIDEVPORT_VERSION) */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync uint32_t u32VersionEnd;
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync} RAWPCIDEVPORT;
8b90eb0585fa16024709ca374c69f1eb5d5a5a7cvboxsync/** Version number for the RAWPCIDEVPORT::u32Version and RAWPCIIFPORT::u32VersionEnd fields. */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync#define RAWPCIDEVPORT_VERSION UINT32_C(0xAFBDCC01)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync/**
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * The component factory interface for create a raw PCI interfaces.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsynctypedef struct RAWPCIFACTORY
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync{
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync /**
8b90eb0585fa16024709ca374c69f1eb5d5a5a7cvboxsync * Release this factory.
8b90eb0585fa16024709ca374c69f1eb5d5a5a7cvboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * SUPR0ComponentQueryFactory (SUPDRVFACTORY::pfnQueryFactoryInterface to be precise)
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * will retain a reference to the factory and the caller has to call this method to
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * release it once the pfnCreateAndConnect call(s) has been done.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync *
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync * @param pIfFactory Pointer to this structure.
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync */
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync DECLR0CALLBACKMEMBER(void, pfnRelease,(PRAWPCIFACTORY pFactory));
9dca051a5f8ff457ef1692990f6ecfa280daf265vboxsync
/**
* Create an instance for the specfied host PCI card and connects it
* to the driver.
*
*
* @returns VBox status code.
*
* @param pIfFactory Pointer to this structure.
* @param u32HostAddress Address of PCI device on the host.
* @param fFlags Creation flags.
* @param ppDevPort Where to store the pointer to the device port
* on success.
*
*/
DECLR0CALLBACKMEMBER(int, pfnCreateAndConnect,(PRAWPCIFACTORY pFactory,
uint32_t u32HostAddress,
uint32_t fFlags,
PRAWPCIDEVPORT *ppDevPort));
} RAWPCIFACTORY;
#define RAWPCIFACTORY_UUID_STR "c0268f49-e1e4-402b-b7e0-eb8d09659a9b"
/**
* Flags passed to pfnPciDeviceConstructStart(), to notify driver
* about options to be used to open device.
*/
typedef enum PCIRAWDRIVERFLAGS
{
/** If runtime shall try to detach host driver. */
PCIRAWDRIVERRFLAG_DETACH_HOST_DRIVER = (1 << 0),
/** The usual 32-bit type blow up. */
PCIRAWDRIVERRFLAG_32BIT_HACK = 0x7fffffff
} PCIRAWDRIVERFLAGS;
/**
* Flags used to describe PCI region, matches to PCIADDRESSSPACE
* in pci.h.
*/
typedef enum PCIRAWADDRESSSPACE
{
/** Memory. */
PCIRAW_ADDRESS_SPACE_MEM = 0x00,
/** I/O space. */
PCIRAW_ADDRESS_SPACE_IO = 0x01,
/** 32-bit BAR. */
PCIRAW_ADDRESS_SPACE_BAR32 = 0x00,
/** 64-bit BAR. */
PCIRAW_ADDRESS_SPACE_BAR64 = 0x04,
/** Prefetch memory. */
PCIRAW_ADDRESS_SPACE_MEM_PREFETCH = 0x08,
/** The usual 32-bit type blow up. */
PCIRAW_ADDRESS_SPACE_32BIT_HACK = 0x7fffffff
} PCIRAWADDRESSSPACE;
RT_C_DECLS_END
#endif