Files
QualcommWireless/QualcommWireless/include/IOKit/ata/IOPCIATA.h
T
2026-10-15 18:07:10 +02:00

201 lines
6.2 KiB
C++

/*
* Copyright (c) 1998-2008 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
#ifndef _DRV_PCI_ATA_H
#define _DRV_PCI_ATA_H
#include <libkern/c++/OSObject.h>
#include <IOKit/IOTypes.h>
#include "IOATAController.h"
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include <IOKit/IOInterruptEventSource.h>
/*! @class IOPCIATA
@abstract The base class for PCI-IDE ata controller family.
@discussion class defining the common elements of bus-mastering PCI ATA controllers which meet or at least loosely follow the pci bus mastering pci-ide controller spec. Header doc is incomplete, but source is heavily commented.
*/
class IOPCIATA : public IOATAController
{
OSDeclareDefaultStructors(IOPCIATA);
public:
/*--- Overrides from IOATAController ---*/
virtual bool init(OSDictionary * properties);
virtual bool start( IOService* provider );
protected:
// The DMA states: not in use, in use and running with additional passes needed,
// in use on final pass, transfer complete, and failure
enum ATADMAState
{
// DMA state flags
kATADMAInactive,
kATADMAStarting,
kATADMAActive,
kATADMAStatus,
kATADMAComplete,
kATADMAError,
};
enum {
// PRD flags
kLast_PRD = 0x8000,
kContinue_PRD = 0,
};
enum {
mBMCmdStartOutput = 0x01, // start engine to transfer from memory to device.
mBMCmdStartInput = (1 << 3 ) | 0x01, // start engine to transfer from device to memory
mBMCmdStop = 0x00, // halt engine.
};
enum {
// bus master status register definitions.
bBMStatusSimplex = 7, // 0 = simultaneous transactions allowed. 1 = primary and secondary busses may not be active at same time.
bBMStatusDrv1 = 6, // 1 = device 1 and bus are already configured by some other software/firmware
bBMStatusDrv0 = 5, // 1 = device 0 and bus are already configured by some other software/firmware
bBMStatusInt = 2, // 1 = device has asserted INTRQ and all data is flushed to/from memory.
bBMStatusError = 1, // 1 = an error in the DMA has occured. Software clears by writing 1 to this bit.
bBMStatusActive = 0, // 1 = DMA engine is active.
};
enum{
mBMStatusSimplex = 1 << 7,
mBMStatusDrv1 = 1 << 6,
mBMStatusDrv0 = 1 << 5,
mBMStatusInt = 1 << 2,
mBMStatusError = 1 << 1,
mBMStatusActive = 1
};
// the physical region descriptor used for the dma engine.
struct PRD
{
UInt32 bufferPtr; // address
UInt16 byteCount; // 16 bit byte count where 0x0000 = 64K
UInt16 flags; // 0 in flags means contine, 0x80 means stop
};
// descendants of this class MUST initialize these values
// prior to activating any DMA command.
IOATARegPtr8 _bmCommandReg;
IOATARegPtr8 _bmStatusReg;
IOATARegPtr32 _bmPRDAddresReg;
// semaphore for DMA state
UInt32 _dmaState;
// table of PRD descriptors
PRD* _prdTable;
IOPhysicalAddress _prdTablePhysical;
IONaturalMemoryCursor* _DMACursor;
// override from IOATAController
// activate the DMA engine as per the current command
virtual IOReturn startDMA( void );
// override from IOATAController
// safely halt the DMA engine regardless of state
virtual IOReturn stopDMA( void );
// allocate memory for the PRD descriptors.
virtual bool allocDMAChannel(void);
// fill CC with stop commands.
virtual void initATADMAChains (PRD* descPtr);
// fill out a PRD, respecting endianess
virtual void setPRD(UInt8 *bffr, UInt16 count, PRD *tableElement, UInt16 end);
// setup the CC with IO commands
virtual IOReturn createChannelCommands(void);
// deallocate memory for the DMA engine
virtual bool freeDMAChannel(void);
// clean up on device interrupt
virtual IOReturn handleDeviceInterrupt(void);
// activate the DMA engine
virtual void activateDMAEngine(void);
// shutdown the DMA engine
virtual void stopDMAEngine(void);
// safely suspend the DMA engine
virtual void shutDownATADMA (void);
// overrides
virtual void free();
protected:
/*! @struct ExpansionData
@discussion This structure will be used to expand the capablilties of the IOPCIATA class in the future.
*/
typedef struct ExpansionData
{
IOBufferMemoryDescriptor* _prdBuffer;
} ExpansionData;
/*! @var reserved
Reserved for future use. (Internal use only) */
ExpansionData *reserved;
private:
OSMetaClassDeclareReservedUnused(IOPCIATA, 0);
OSMetaClassDeclareReservedUnused(IOPCIATA, 1);
OSMetaClassDeclareReservedUnused(IOPCIATA, 2);
OSMetaClassDeclareReservedUnused(IOPCIATA, 3);
OSMetaClassDeclareReservedUnused(IOPCIATA, 4);
OSMetaClassDeclareReservedUnused(IOPCIATA, 5);
OSMetaClassDeclareReservedUnused(IOPCIATA, 6);
OSMetaClassDeclareReservedUnused(IOPCIATA, 7);
OSMetaClassDeclareReservedUnused(IOPCIATA, 8);
OSMetaClassDeclareReservedUnused(IOPCIATA, 9);
OSMetaClassDeclareReservedUnused(IOPCIATA, 10);
OSMetaClassDeclareReservedUnused(IOPCIATA, 11);
OSMetaClassDeclareReservedUnused(IOPCIATA, 12);
OSMetaClassDeclareReservedUnused(IOPCIATA, 13);
OSMetaClassDeclareReservedUnused(IOPCIATA, 14);
OSMetaClassDeclareReservedUnused(IOPCIATA, 15);
OSMetaClassDeclareReservedUnused(IOPCIATA, 16);
OSMetaClassDeclareReservedUnused(IOPCIATA, 17);
OSMetaClassDeclareReservedUnused(IOPCIATA, 18);
OSMetaClassDeclareReservedUnused(IOPCIATA, 19);
OSMetaClassDeclareReservedUnused(IOPCIATA, 20);
};
#endif // _DRV_PCI_ATA_H