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