VBoxPciInternal.h revision a0a39b1e5c38b17c62e1fe70e6ab455e3cda7063
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* $Id$ */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @file
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VBoxPci - PCI driver (Host), Internal Header.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (C) 2011 Oracle Corporation
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * available from http://www.virtualbox.org. This file is free software;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * General Public License (GPL) as published by the Free Software
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifndef ___VBoPciInternal_h___
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define ___VBoxPciInternal_h___
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/sup.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/rawpci.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/semaphore.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/assert.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef RT_OS_LINUX
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync# ifdef DEBUG_nike
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync# define VBOX_WITH_IOMMU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync# endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef VBOX_WITH_IOMMU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <linux/iommu.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncRT_C_DECLS_BEGIN
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* Forward declaration. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIGLOBALS *PVBOXRAWPCIGLOBALS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIDRVVM *PVBOXRAWPCIDRVVM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIINS *PVBOXRAWPCIINS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The per-instance data of the VBox raw PCI interface.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This is data associated with a host PCI card attached to the VM.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIINS
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Pointer to the globals. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PVBOXRAWPCIGLOBALS pGlobals;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Mutex protecting device access. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSEMFASTMUTEX hFastMtx;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The spinlock protecting the state variables and device access. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSPINLOCK hSpinlock;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Pointer to the next device in the list. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PVBOXRAWPCIINS pNext;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Reference count. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32_t volatile cRefs;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Host PCI address of this device. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32_t HostPciAddress;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef RT_OS_LINUX
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct pci_dev * pPciDev;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool fMsiUsed;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool fMsixUsed;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool fIommuUsed;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool fPad0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Temporary: host IRQ we were given. Assumes single IRQ devices. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int32_t iHostIrq;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Port, given to the outside world. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RAWPCIDEVPORT DevPort;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32_t cHandlersCount;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PFNRAWPCIISR pfnIrqHandler;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync void *pIrqContext;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRAWPCIVM pVmCtx;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync} VBOXRAWPCIINS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Per-VM data of the VBox PCI driver. Pointed to by pVM->rawpci.s.pOsData.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIDRVVM
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Mutex protecting state changes. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSEMFASTMUTEX hFastMtx;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef RT_OS_LINUX
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync# ifdef VBOX_WITH_IOMMU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct iommu_domain* iommu_domain;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync# endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync} VBOXRAWPCIDRVVM;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The global data of the VBox PCI driver.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This contains the bit required for communicating with support driver, VBoxDrv
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * (start out as SupDrv).
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsynctypedef struct VBOXRAWPCIGLOBALS
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Mutex protecting the list of instances and state changes. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTSEMFASTMUTEX hFastMtx;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Pointer to a list of instance data. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PVBOXRAWPCIINS pInstanceHead;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The raw PCI interface factory. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RAWPCIFACTORY RawPciFactory;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The SUPDRV component factory registration. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync SUPDRVFACTORY SupDrvFactory;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The number of current factory references. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int32_t volatile cFactoryRefs;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** Whether the IDC connection is open or not.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This is only for cleaning up correctly after the separate IDC init on Windows. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool fIDCOpen;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** The SUPDRV IDC handle (opaque struct). */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync SUPDRVIDCHANDLE SupDrvIDC;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef RT_OS_LINUX
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync struct module * pciStubModule;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync} VBOXRAWPCIGLOBALS;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciInit(PVBOXRAWPCIGLOBALS pGlobals);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(void) vboxPciShutdown(PVBOXRAWPCIGLOBALS pGlobals);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsInitVm(PVBOXRAWPCIDRVVM pThis, PVM pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(void) vboxPciOsDeinitVm(PVBOXRAWPCIDRVVM pThis, PVM pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevInit (PVBOXRAWPCIINS pIns, uint32_t fFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevDeinit(PVBOXRAWPCIINS pIns, uint32_t fFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevDestroy(PVBOXRAWPCIINS pIns);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevGetRegionInfo(PVBOXRAWPCIINS pIns,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int32_t iRegion,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHCPHYS *pRegionStart,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint64_t *pu64RegionSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync bool *pfPresent,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32_t *pfFlags);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevMapRegion(PVBOXRAWPCIINS pIns,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int32_t iRegion,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHCPHYS pRegionStart,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint64_t u64RegionSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint32_t fFlags,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0PTR *pRegionBase);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevUnmapRegion(PVBOXRAWPCIINS pIns,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int32_t iRegion,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTHCPHYS RegionStart,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint64_t u64RegionSize,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTR0PTR RegionBase);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevPciCfgWrite(PVBOXRAWPCIINS pIns, uint32_t Register, PCIRAWMEMLOC *pValue);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevPciCfgRead (PVBOXRAWPCIINS pIns, uint32_t Register, PCIRAWMEMLOC *pValue);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevRegisterIrqHandler (PVBOXRAWPCIINS pIns, PFNRAWPCIISR pfnHandler, void* pIrqContext, int32_t *piHostIrq);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevUnregisterIrqHandler(PVBOXRAWPCIINS pIns, int32_t iHostIrq);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDECLHIDDEN(int) vboxPciOsDevPowerStateChange(PVBOXRAWPCIINS pIns, PCIRAWPOWERSTATE aState);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define VBOX_DRV_VMDATA(pIns) ((PVBOXRAWPCIDRVVM)(pIns->pVmCtx->pDriverData))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncRT_C_DECLS_END
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync