/*
 	File:		DriverFamilyMatching.h
 
 	Contains:	Interfaces for create native drivers NDRV
 
 	Version:	Technology:	
 				Release:	QuickTime 4.0
 
 	Copyright:	(c) 1995-1998 by Apple Computer, Inc., all rights reserved.
 
 	Bugs?:		For bug reports, consult the following page on
 				the World Wide Web:
 
 					http://developer.apple.com/bugreporter/
 
*/
#ifndef __DRIVERFAMILYMATCHING__
#define __DRIVERFAMILYMATCHING__

#ifndef __MACTYPES__
#include <MacTypes.h>
#endif
#ifndef __NAMEREGISTRY__
#include <NameRegistry.h>
#endif
#ifndef __CODEFRAGMENTS__
#include <CodeFragments.h>
#endif



#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
	#pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
	#pragma pack(2)
#endif

/*
  ##############################################
   Well known properties in the Name Registry
  ##############################################
*/

#define kPropertyName					"name"
#define kPropertyCompatible				"compatible"
#define	kPropertyDriverPtr				"driver-ptr"
#define kPropertyDriverDesc				"driver-description"
#define kPropertyReg					"reg"
#define kPropertyAAPLAddress			"AAPL,address"
#define kPropertyMatching				"matching"

/* CPassThru */
/*
  #########################################################
   Descriptor for Drivers and NDRVs
  #########################################################
*/
/* 
	QuickTime 3.0: "DriverType" has a name collision with cross-platform code.
	Use Mac prefix to avoid collision 
*/
/* Driver Typing Information Used to Match Drivers With Devices */

struct MacDriverType {
	Str31 							nameInfoStr;				/* Driver Name/Info String*/
	NumVersion 						version;					/* Driver Version Number*/
};
typedef struct MacDriverType			MacDriverType;
#if TARGET_OS_MAC

typedef MacDriverType 					DriverType;
#endif  /* TARGET_OS_MAC */

typedef MacDriverType *					DriverTypePtr;
/* OS Runtime Information Used to Setup and Maintain a Driver's Runtime Environment */
typedef OptionBits 						RuntimeOptions;

enum {
	kDriverIsLoadedUponDiscovery = 0x00000001,					/* auto-load driver when discovered*/
	kDriverIsOpenedUponLoad		= 0x00000002,					/* auto-open driver when loaded*/
	kDriverIsUnderExpertControl	= 0x00000004,					/* I/O expert handles loads/opens*/
	kDriverIsConcurrent			= 0x00000008,					/* supports concurrent requests*/
	kDriverQueuesIOPB			= 0x00000010,					/* device manager doesn't queue IOPB*/
	kDriverIsLoadedAtBoot		= 0x00000020,					/* Driver is loaded at the boot time */
	kDriverIsForVirtualDevice	= 0x00000040,					/* Driver is for a virtual Device */
	kDriverSupportDMSuspendAndResume = 0x00000080				/* Driver supports Device Manager Suspend and Resume command */
};


struct DriverOSRuntime {
	RuntimeOptions 					driverRuntime;				/* Options for OS Runtime*/
	Str31 							driverName;					/* Driver's name to the OS*/
	UInt32 							driverDescReserved[8];		/* Reserved area*/
};
typedef struct DriverOSRuntime			DriverOSRuntime;
typedef DriverOSRuntime *				DriverOSRuntimePtr;
/* OS Service Information Used To Declare What APIs a Driver Supports */

typedef UInt32 							ServiceCount;

struct DriverServiceInfo {
	OSType 							serviceCategory;			/* Service Category Name*/
	OSType 							serviceType;				/* Type within Category*/
	NumVersion 						serviceVersion;				/* Version of service*/
};
typedef struct DriverServiceInfo		DriverServiceInfo;
typedef DriverServiceInfo *				DriverServiceInfoPtr;

struct DriverOSService {
	ServiceCount 					nServices;					/* Number of Services Supported*/
	DriverServiceInfo 				service[1];					/* The List of Services (at least one)*/
};
typedef struct DriverOSService			DriverOSService;
typedef DriverOSService *				DriverOSServicePtr;
/* Categories */

enum {
	kServiceCategoryDisplay		= FOUR_CHAR_CODE('disp'),		/* Display Manager*/
	kServiceCategoryOpenTransport = FOUR_CHAR_CODE('otan'),		/* Open Transport*/
	kServiceCategoryBlockStorage = FOUR_CHAR_CODE('blok'),		/* Block Storage*/
	kServiceCategoryNdrvDriver	= FOUR_CHAR_CODE('ndrv'),		/* Generic Native Driver*/
	kServiceCategoryScsiSIM		= FOUR_CHAR_CODE('scsi'),		/* SCSI */
	kServiceCategoryFileManager	= FOUR_CHAR_CODE('file'),		/* File Manager */
	kServiceCategoryIDE			= FOUR_CHAR_CODE('ide-'),		/* ide */
	kServiceCategoryADB			= FOUR_CHAR_CODE('adb-'),		/* adb */
	kServiceCategoryPCI			= FOUR_CHAR_CODE('pci-'),		/* pci bus */
																/* Nu Bus */
	kServiceCategoryDFM			= FOUR_CHAR_CODE('dfm-'),		/* DFM */
	kServiceCategoryMotherBoard	= FOUR_CHAR_CODE('mrbd'),		/* mother Board */
	kServiceCategoryKeyboard	= FOUR_CHAR_CODE('kybd'),		/* Keyboard */
	kServiceCategoryPointing	= FOUR_CHAR_CODE('poit'),		/* Pointing */
	kServiceCategoryRTC			= FOUR_CHAR_CODE('rtc-'),		/* RTC */
	kServiceCategoryNVRAM		= FOUR_CHAR_CODE('nram'),		/* NVRAM */
	kServiceCategorySound		= FOUR_CHAR_CODE('sond'),		/* Sound (1/3/96 MCS) */
	kServiceCategoryPowerMgt	= FOUR_CHAR_CODE('pgmt'),		/* Power Management */
	kServiceCategoryGeneric		= FOUR_CHAR_CODE('genr')		/* Generic Service Category to receive general Events */
};

/* Ndrv ServiceCategory Types */

enum {
	kNdrvTypeIsGeneric			= FOUR_CHAR_CODE('genr'),		/* generic*/
	kNdrvTypeIsVideo			= FOUR_CHAR_CODE('vido'),		/* video*/
	kNdrvTypeIsBlockStorage		= FOUR_CHAR_CODE('blok'),		/* block storage*/
	kNdrvTypeIsNetworking		= FOUR_CHAR_CODE('netw'),		/* networking*/
	kNdrvTypeIsSerial			= FOUR_CHAR_CODE('serl'),		/* serial*/
	kNdrvTypeIsParallel			= FOUR_CHAR_CODE('parl'),		/* parallel */
	kNdrvTypeIsSound			= FOUR_CHAR_CODE('sond'),		/* sound*/
	kNdrvTypeIsBusBridge		= FOUR_CHAR_CODE('brdg')
};


typedef UInt32 							DriverDescVersion;
/*	The Driver Description */

enum {
	kInitialDriverDescriptor	= 0,
	kVersionOneDriverDescriptor	= 1
};


enum {
	kTheDescriptionSignature	= FOUR_CHAR_CODE('mtej'),
	kDriverDescriptionSignature	= FOUR_CHAR_CODE('pdes')
};



struct DriverDescription {
	OSType 							driverDescSignature;		/* Signature field of this structure*/
	DriverDescVersion 				driverDescVersion;			/* Version of this data structure*/
	MacDriverType 					driverType;					/* Type of Driver*/
	DriverOSRuntime 				driverOSRuntimeInfo;		/* OS Runtime Requirements of Driver*/
	DriverOSService 				driverServices;				/* Apple Service API Membership*/
};
typedef struct DriverDescription		DriverDescription;
typedef DriverDescription *				DriverDescriptionPtr;



#if PRAGMA_STRUCT_ALIGN
	#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
	#pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __DRIVERFAMILYMATCHING__ */

