ATAController.h revision fbad775ac7689eb33561f4f57ffe22cc85cc7714
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/* $Id$ */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/** @file
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * DevATA, DevAHCI - Shared ATA/ATAPI controller types.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync * Copyright (C) 2006-2008 Sun Microsystems, Inc.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * available from http://www.virtualbox.org. This file is free software;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * General Public License (GPL) as published by the Free Software
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * additional information or have any questions.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#ifndef ___Storage_ATAController_h
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#define ___Storage_ATAController_h
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*******************************************************************************
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync* Header Files *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync*******************************************************************************/
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include <VBox/pdmdev.h>
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync#ifdef IN_RING3
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync# include <iprt/semaphore.h>
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync# include <iprt/thread.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#endif /* IN_RING3 */
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#include <iprt/critsect.h>
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync#include <VBox/stam.h>
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include "PIIX3ATABmDma.h"
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#include "ide.h"
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync/*******************************************************************************
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync* Defined Constants And Macros *
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync*******************************************************************************/
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Maximum number of sectors to transfer in a READ/WRITE MULTIPLE request.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Set to 1 to disable multi-sector read support. According to the ATA
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync * specification this must be a power of 2 and it must fit in an 8 bit
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync * value. Thus the only valid values are 1, 2, 4, 8, 16, 32, 64 and 128.
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync */
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync#define ATA_MAX_MULT_SECTORS 128
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync/**
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync * Fastest PIO mode supported by the drive.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync#define ATA_PIO_MODE_MAX 4
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/**
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync * Fastest MDMA mode supported by the drive.
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync */
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync#define ATA_MDMA_MODE_MAX 2
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync/**
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync * Fastest UDMA mode supported by the drive.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATA_UDMA_MODE_MAX 6
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/** ATAPI sense info size. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATAPI_SENSE_SIZE 64
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/** The maximum number of release log entries per device. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define MAX_LOG_REL_ERRORS 1024
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/* MediaEventStatus */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATA_EVENT_STATUS_UNCHANGED 0 /**< medium event status not changed */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATA_EVENT_STATUS_MEDIA_NEW 1 /**< new medium inserted */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATA_EVENT_STATUS_MEDIA_REMOVED 2 /**< medium removed */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATA_EVENT_STATUS_MEDIA_CHANGED 3 /**< medium was removed + new medium was inserted */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*******************************************************************************
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync* Structures and Typedefs *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync*******************************************************************************/
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsynctypedef struct AHCIATADevState {
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag indicating whether the current command uses LBA48 mode. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fLBA48;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag indicating whether this drive implements the ATAPI command set. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fATAPI;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Set if this interface has asserted the IRQ. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fIrqPending;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Currently configured number of sectors in a multi-sector transfer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t cMultSectors;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** PCHS disk geometry. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync PDMMEDIAGEOMETRY PCHSGeometry;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Total number of sectors on this disk. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint64_t cTotalSectors;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Number of sectors to transfer per IRQ. */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint32_t cSectorsPerIRQ;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** ATA/ATAPI register 1: feature (write-only). */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint8_t uATARegFeature;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** ATA/ATAPI register 1: feature, high order byte. */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint8_t uATARegFeatureHOB;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** ATA/ATAPI register 1: error (read-only). */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint8_t uATARegError;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** ATA/ATAPI register 2: sector count (read/write). */
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync uint8_t uATARegNSector;
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync /** ATA/ATAPI register 2: sector count, high order byte. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t uATARegNSectorHOB;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** ATA/ATAPI register 3: sector (read/write). */
63e3a547845f7c31bb4e892a66684b560dc63611vboxsync uint8_t uATARegSector;
63e3a547845f7c31bb4e892a66684b560dc63611vboxsync /** ATA/ATAPI register 3: sector, high order byte. */
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync uint8_t uATARegSectorHOB;
63e3a547845f7c31bb4e892a66684b560dc63611vboxsync /** ATA/ATAPI register 4: cylinder low (read/write). */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t uATARegLCyl;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** ATA/ATAPI register 4: cylinder low, high order byte. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync uint8_t uATARegLCylHOB;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** ATA/ATAPI register 5: cylinder high (read/write). */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t uATARegHCyl;
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync /** ATA/ATAPI register 5: cylinder high, high order byte. */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATARegHCylHOB;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** ATA/ATAPI register 6: select drive/head (read/write). */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATARegSelect;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** ATA/ATAPI register 7: status (read-only). */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATARegStatus;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** ATA/ATAPI register 7: command (write-only). */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATARegCommand;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** ATA/ATAPI drive control register (write-only). */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATARegDevCtl;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** Currently active transfer mode (MDMA/UDMA) and speed. */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uATATransferMode;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** Current transfer direction. */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t uTxDir;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** Index of callback for begin transfer. */
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync uint8_t iBeginTransfer;
c060166f65b9dd2f1ed53e6e4cffdad948e01722vboxsync /** Index of callback for source/sink of data. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint8_t iSourceSink;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** Flag indicating whether the current command transfers data in DMA mode. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync bool fDMA;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** Set to indicate that ATAPI transfer semantics must be used. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync bool fATAPITransfer;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** Total ATA/ATAPI transfer size, shared PIO/DMA. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t cbTotalTransfer;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** Elementary ATA/ATAPI transfer size, shared PIO/DMA. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t cbElementaryTransfer;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** Current read/write buffer position, shared PIO/DMA. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t iIOBufferCur;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** First element beyond end of valid buffer content, shared PIO/DMA. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t iIOBufferEnd;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATA/ATAPI current PIO read/write transfer position. Not shared with DMA for safety reasons. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t iIOBufferPIODataStart;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATA/ATAPI current PIO read/write transfer end. Not shared with DMA for safety reasons. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t iIOBufferPIODataEnd;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATAPI current LBA position. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t iATAPILBA;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATAPI current sector size. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint32_t cbATAPISector;
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATAPI current command. */
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync uint8_t aATAPICmd[ATAPI_PACKET_SIZE];
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync /** ATAPI sense data. */
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync uint8_t abATAPISense[ATAPI_SENSE_SIZE];
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync /** HACK: Countdown till we report a newly unmounted drive as mounted. */
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync uint8_t cNotifiedMediaChange;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The same for GET_EVENT_STATUS for mechanism */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync volatile uint32_t MediaEventStatus;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The status LED state for this drive. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(PPDMLED) pLed;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#if HC_ARCH_BITS == 64
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint32_t uAlignment3;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#endif
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Size of I/O buffer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint32_t cbIOBuffer;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to the I/O buffer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(uint8_t *) pbIOBufferR3;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to the I/O buffer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R0PTRTYPE(uint8_t *) pbIOBufferR0;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to the I/O buffer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RCPTRTYPE(uint8_t *) pbIOBufferRC;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync RTRCPTR Aligmnent1; /**< Align the statistics at an 8-byte boundrary. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /*
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * No data that is part of the saved state after this point!!!!!
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /* Release statistics: number of ATA DMA commands. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync STAMCOUNTER StatATADMA;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /* Release statistics: number of ATA PIO commands. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync STAMCOUNTER StatATAPIO;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Release statistics: number of ATAPI PIO commands. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync STAMCOUNTER StatATAPIDMA;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Release statistics: number of ATAPI PIO commands. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync STAMCOUNTER StatATAPIPIO;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#ifdef VBOX_INSTRUMENT_DMA_WRITES
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /* Release statistics: number of DMA sector writes and the time spent. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILEADV StatInstrVDWrites;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync#endif
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Statistics: number of read operations and the time spent reading. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILEADV StatReads;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Statistics: number of bytes read. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(PSTAMCOUNTER) pStatBytesRead;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync#if HC_ARCH_BITS == 64
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint64_t uAlignment4;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#endif
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Statistics: number of write operations and the time spent writing. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILEADV StatWrites;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Statistics: number of bytes written. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(PSTAMCOUNTER) pStatBytesWritten;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#if HC_ARCH_BITS == 64
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint64_t uAlignment5;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#endif
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Statistics: number of flush operations and the time spend flushing. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILE StatFlushes;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Enable passing through commands directly to the ATAPI drive. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fATAPIPassthrough;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Number of errors we've reported to the release log.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * This is to prevent flooding caused by something going horribly wrong.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * this value against MAX_LOG_REL_ERRORS in places likely to cause floods
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * like the ones we currently seeing on the linux smoke tests (2006-11-10). */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync uint32_t cErrors;
8742e4a4ddb7b62d21d96d56dd1baf01c9f22cecvboxsync /** Timestamp of last started command. 0 if no command pending. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint64_t u64CmdTS;
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to the attached driver's base interface. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(PPDMIBASE) pDrvBase;
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync /** Pointer to the attached driver's block interface. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync R3PTRTYPE(PPDMIBLOCK) pDrvBlock;
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync /** Pointer to the attached driver's block bios interface. */
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync R3PTRTYPE(PPDMIBLOCKBIOS) pDrvBlockBios;
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync /** Pointer to the attached driver's mount interface.
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync * This is NULL if the driver isn't a removable unit. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync R3PTRTYPE(PPDMIMOUNT) pDrvMount;
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync /** The base interface. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync PDMIBASE IBase;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The block port interface. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync PDMIBLOCKPORT IPort;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The mount notify interface. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync PDMIMOUNTNOTIFY IMountNotify;
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync /** The LUN #. */
8287c906b9b1d215824d4cdf6c1eaf40681ebfa8vboxsync RTUINT iLUN;
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync#if HC_ARCH_BITS == 64
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync RTUINT Alignment2; /**< Align pDevInsR3 correctly. */
f2a212e40c7307d2b8ef9b2658a539f5ac41e683vboxsync#endif
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync /** Pointer to device instance. */
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync PPDMDEVINSR3 pDevInsR3;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to controller instance. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R3PTRTYPE(struct AHCIATACONTROLLER *) pControllerR3;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to device instance. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync PPDMDEVINSR0 pDevInsR0;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to controller instance. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync R0PTRTYPE(struct AHCIATACONTROLLER *) pControllerR0;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Pointer to device instance. */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync PPDMDEVINSRC pDevInsRC;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Pointer to controller instance. */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync RCPTRTYPE(struct AHCIATACONTROLLER *) pControllerRC;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync} AHCIATADevState;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsynctypedef struct AHCIATATransferRequest
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync{
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync uint8_t iIf;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint8_t iBeginTransfer;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint8_t iSourceSink;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync uint32_t cbTotalTransfer;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t uTxDir;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync} AHCIATATransferRequest;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsynctypedef struct AHCIATAAbortRequest
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync{
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t iIf;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fResetDrive;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync} AHCIATAAbortRequest;
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsynctypedef enum
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync{
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Begin a new transfer. */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync AHCIATA_AIO_NEW = 0,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Continue a DMA transfer. */
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync AHCIATA_AIO_DMA,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Continue a PIO transfer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATA_AIO_PIO,
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync /** Reset the drives on current controller, stop all transfer activity. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATA_AIO_RESET_ASSERTED,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Reset the drives on current controller, resume operation. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATA_AIO_RESET_CLEARED,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Abort the current transfer of a particular drive. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATA_AIO_ABORT
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync} AHCIATAAIO;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsynctypedef struct AHCIATARequest
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync{
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync AHCIATAAIO ReqType;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync union
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync {
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATATransferRequest t;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATAAbortRequest a;
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync } u;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync} AHCIATARequest;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsynctypedef struct AHCIATACONTROLLER
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync{
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** The base of the first I/O Port range. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTIOPORT IOPortBase1;
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync /** The base of the second I/O Port range. (0 if none) */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync RTIOPORT IOPortBase2;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The assigned IRQ. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTUINT irq;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync /** Access critical section */
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync PDMCRITSECT lock;
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Selected drive. */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync uint8_t iSelectedIf;
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync /** The interface on which to handle async I/O. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t iAIOIf;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The state of the async I/O thread. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync uint8_t uAsyncIOState;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag indicating whether the next transfer is part of the current command. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fChainedTransfer;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Set when the reset processing is currently active on this controller. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync bool fReset;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag whether the current transfer needs to be redone. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fRedo;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag whether the redo suspend has been finished. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync bool fRedoIdle;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Flag whether the DMA operation to be redone is the final transfer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync bool fRedoDMALastDesc;
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync /** The BusMaster DMA state. */
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync BMDMAState BmDma;
7697e43970d863558b6c168a55e8948ccb18d8d1vboxsync /** Pointer to first DMA descriptor. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTGCPHYS32 pFirstDMADesc;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to last DMA descriptor. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync RTGCPHYS32 pLastDMADesc;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to current DMA buffer (for redo operations). */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTGCPHYS32 pRedoDMABuffer;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Size of current DMA buffer (for redo operations). */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint32_t cbRedoDMABuffer;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The ATA/ATAPI interfaces of this controller. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync AHCIATADevState aIfs[2];
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Pointer to device instance. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync PPDMDEVINSR3 pDevInsR3;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Pointer to device instance. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync PPDMDEVINSR0 pDevInsR0;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Pointer to device instance. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync PPDMDEVINSRC pDevInsRC;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** Set when the destroying the device instance and the thread must exit. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync uint32_t volatile fShutdown;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The async I/O thread handle. NIL_RTTHREAD if no thread. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTTHREAD AsyncIOThread;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The event semaphore the thread is waiting on for requests. */
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync RTSEMEVENT AsyncIOSem;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync /** The request queue for the AIO thread. One element is always unused. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync AHCIATARequest aAsyncIORequests[4];
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The position at which to insert a new request for the AIO thread. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint8_t AsyncIOReqHead;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** The position at which to get a new request for the AIO thread. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint8_t AsyncIOReqTail;
9674ed871d32468dd791ad601151f46d2e843350vboxsync /** Whether to call RTThreadUserSignal and PDMDevHlpAsyncNotificationCompleted
9674ed871d32468dd791ad601151f46d2e843350vboxsync * when idle. Before setting this, call RTThreadUserReset. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync bool volatile fSignalIdle;
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint8_t Alignment3[1]; /**< Explicit padding of the 1 byte gap. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync /** Magic delay before triggering interrupts in DMA mode. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint32_t DelayIRQMillies;
9674ed871d32468dd791ad601151f46d2e843350vboxsync /** The mutex protecting the request queue. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync RTSEMMUTEX AsyncIORequestMutex;
9674ed871d32468dd791ad601151f46d2e843350vboxsync /** The event semaphore the thread is waiting on during suspended I/O. */
9674ed871d32468dd791ad601151f46d2e843350vboxsync RTSEMEVENT SuspendIOSem;
9674ed871d32468dd791ad601151f46d2e843350vboxsync#if 0 /*HC_ARCH_BITS == 32*/
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint32_t Alignment0;
9674ed871d32468dd791ad601151f46d2e843350vboxsync#endif
9674ed871d32468dd791ad601151f46d2e843350vboxsync
9674ed871d32468dd791ad601151f46d2e843350vboxsync /* Statistics */
9674ed871d32468dd791ad601151f46d2e843350vboxsync STAMCOUNTER StatAsyncOps;
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint64_t StatAsyncMinWait;
9674ed871d32468dd791ad601151f46d2e843350vboxsync uint64_t StatAsyncMaxWait;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync STAMCOUNTER StatAsyncTimeUS;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILEADV StatAsyncTime;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync STAMPROFILE StatLockWait;
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync} AHCIATACONTROLLER, *PAHCIATACONTROLLER;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync#ifndef VBOX_DEVICE_STRUCT_TESTCASE
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define ATADEVSTATE_2_CONTROLLER(pIf) ( (pIf)->CTX_SUFF(pController) )
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync#define ATADEVSTATE_2_DEVINS(pIf) ( (pIf)->CTX_SUFF(pDevIns) )
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#define CONTROLLER_2_DEVINS(pController) ( (pController)->CTX_SUFF(pDevIns) )
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync#define PDMIBASE_2_ATASTATE(pInterface) ( (AHCIATADevState *)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCIATADevState, IBase)) )
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*******************************************************************************
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync * Internal Functions *
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync ******************************************************************************/
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncRT_C_DECLS_BEGIN
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsyncint ataControllerIOPortWrite1(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t u32, unsigned cb);
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsyncint ataControllerIOPortRead1(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t *u32, unsigned cb);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncint ataControllerIOPortWriteStr1(PAHCIATACONTROLLER pCtl, RTIOPORT Port, RTGCPTR *pGCPtrSrc, PRTGCUINTREG pcTransfer, unsigned cb);
3956d0151065a11e49d2213b38a5efdad46807e0vboxsyncint ataControllerIOPortReadStr1(PAHCIATACONTROLLER pCtl, RTIOPORT Port, RTGCPTR *pGCPtrDst, PRTGCUINTREG pcTransfer, unsigned cb);
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsyncint ataControllerIOPortWrite2(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t u32, unsigned cb);
7c48fdac0546978ed14617c8096734ce2d18c8e5vboxsyncint ataControllerIOPortRead2(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t *u32, unsigned cb);
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsyncint ataControllerBMDMAIOPortRead(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t *pu32, unsigned cb);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncint ataControllerBMDMAIOPortWrite(PAHCIATACONTROLLER pCtl, RTIOPORT Port, uint32_t u32, unsigned cb);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncRT_C_DECLS_END
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync#ifdef IN_RING3
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync/**
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync * Initialize a controller state.
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @returns VBox status code.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param pDevIns Pointer to the device instance which creates a controller.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param pCtl Pointer to the unitialized ATA controller structure.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param pDrvBaseMaster Pointer to the base driver interface which acts as the master.
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync * @param pDrvBaseSlave Pointer to the base driver interface which acts as the slave.
b2bc8de1367ae24e1b27b53921d0b32ee3df7acdvboxsync * @param pcbSSMState Where to store the size of the device state for loading/saving.
9674ed871d32468dd791ad601151f46d2e843350vboxsync * @param szName Name of the controller (Used to initialize the critical section).
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncint ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl, PPDMIBASE pDrvBaseMaster, PPDMIBASE pDrvBaseSlave,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync uint32_t *pcbSSMState, const char *szName, PPDMLED pLed, PSTAMCOUNTER pStatBytesRead, PSTAMCOUNTER pStatBytesWritten);
3b1aa24d99d0f9cc157cf72ca76444b2feca3277vboxsync
8a54ed337392872c7cfcfb96f173468bbbb0f7fcvboxsync/**
8a54ed337392872c7cfcfb96f173468bbbb0f7fcvboxsync * Free all allocated resources for one controller instance.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns VBox status code.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pCtl The controller instance.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsyncint ataControllerDestroy(PAHCIATACONTROLLER pCtl);
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync/**
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * Tests if the controller is idle, leaving the PDM notifications on if busy.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns true if idle, false if idle.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pCtl the controller instance.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncbool ataControllerIsIdle(PAHCIATACONTROLLER pCtl);
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync
e562a8bb17c0dfa1c316708e085a3a92fcc80521vboxsync/**
63787aca0a2a16ec959a5294148726ccf898ddf1vboxsync * Reset a controller instance to an initial state.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns VBox status code.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pCtl Pointer to the controller.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsyncvoid ataControllerReset(PAHCIATACONTROLLER pCtl);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Resume operation of an controller.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns nothing
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param pCtl The controller instance.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsyncvoid ataControllerResume(PAHCIATACONTROLLER pCtl);
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/**
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * Relocate neccessary pointers.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns nothing.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pCtl The controller instance.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param offDelta The relocation delta relative to the old location.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncvoid ataControllerRelocate(PAHCIATACONTROLLER pCtl, RTGCINTPTR offDelta);
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync/**
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Execute state save operation.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @returns VBox status code.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pCtl The controller instance.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pSSM SSM operation handle.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsyncint ataControllerSaveExec(PAHCIATACONTROLLER pCtl, PSSMHANDLE pSSM);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync/**
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * Excute state load operation.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync *
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @returns VBox status code.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * @param pCtl The controller instance.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync * @param pSSM SSM operation handle.
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsyncint ataControllerLoadExec(PAHCIATACONTROLLER pCtl, PSSMHANDLE pSSM);
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync#endif /* IN_RING3 */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync#endif /* !VBOX_DEVICE_STRUCT_TESTCASE */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync#endif /* !___Storage_ATAController_h */
3ebd5757516d21eccdad25ddd456d2913c2fb215vboxsync
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync