#ifndef _IOKIT_MACRISC4CPU_H
#define _IOKIT_MACRISC4CPU_H
#include <IOKit/IOCPU.h>
#include "MacRISC4PE.h"
#include "IOPlatformPlugin.h"
class MacRISC4PE;
class MacRISC4CPUInterruptController;
typedef struct
{
const char * i2c_iface; UInt8 i2c_port; UInt8 i2c_addr; UInt8 i2c_subaddr; UInt8 mask; UInt8 enable_value; UInt8 disable_value; } cpu_timebase_params_t;
enum {
kMaxPCIBridges = 32
};
class MacRISC4CPU : public IOCPU
{
OSDeclareDefaultStructors(MacRISC4CPU);
private:
bool bootCPU;
bool flushOnLock;
UInt32 l2crValue;
MacRISC4PE *macRISC4PE;
IOService *uniN;
IOService *ioPPlugin;
OSDictionary *ioPPluginDict;
UInt32 numCPUs;
bool rememberNap;
IOService *mpic;
IOService *keyLargo;
IOService *pmu;
UInt32 soft_reset_offset;
IOPMrootDomain *pmRootDomain;
bool doSleep;
bool processorSpeedChange;
UInt32 currentProcessorSpeed;
UInt32 topLevelPCIBridgeCount;
IOPCIBridge *topLevelPCIBridges[kMaxPCIBridges];
static void sIPIHandler( OSObject* self, void* refCon, IOService* nub, int source );
virtual void ipiHandler(void *refCon, void *nub, int source);
const OSSymbol *mpic_dispatchIPI;
const OSSymbol *mpic_getProvider;
const OSSymbol *mpic_getIPIVector;
const OSSymbol *mpic_setCurrentTaskPriority;
const OSSymbol *mpic_setUpForSleep;
const OSSymbol *keyLargo_restoreRegisterState;
const OSSymbol *keyLargo_syncTimeBase;
const OSSymbol *keyLargo_saveRegisterState;
const OSSymbol *keyLargo_turnOffIO;
const OSSymbol *keyLargo_writeRegUInt8;
const OSSymbol *keyLargo_setPowerSupply;
const OSSymbol *UniNSetPowerState;
const OSSymbol *UniNPrepareForSleep;
const OSSymbol *i2c_openI2CBus;
const OSSymbol *i2c_closeI2CBus;
const OSSymbol *i2c_setCombinedMode;
const OSSymbol *i2c_readI2CBus;
const OSSymbol *i2c_writeI2CBus;
const OSSymbol *u3APIPhyDisableProcessor1;
static void sEnableCPUTimeBase( cpu_id_t self, boolean_t enable );
public:
virtual const OSSymbol *getCPUName(void);
virtual bool start(IOService *provider);
virtual void performPMUSpeedChange (UInt32 newLevel);
virtual void initCPU(bool boot);
virtual void quiesceCPU(void);
virtual kern_return_t startCPU(vm_offset_t start_paddr, vm_offset_t arg_paddr);
virtual void haltCPU(void);
virtual void signalCPU(IOCPU *target);
virtual void enableCPUTimeBase(bool enable);
};
#endif