1/*
2 * Copyright 2007, Marcus Overhagen. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _AHCI_CONTROLLER_H
6#define _AHCI_CONTROLLER_H
7
8
9#include "ahci_defs.h"
10#include "ahci_port.h"
11
12
13class AHCIController {
14public:
15							AHCIController(device_node *node,
16								pci_device_module_info *pciModule,
17								pci_device *pciDevice);
18							~AHCIController();
19
20			status_t		Init();
21			void			Uninit();
22
23			void			ExecuteRequest(scsi_ccb *request);
24			uchar			AbortRequest(scsi_ccb *request);
25			uchar			TerminateRequest(scsi_ccb *request);
26			uchar			ResetDevice(uchar targetID, uchar targetLUN);
27			void			GetRestrictions(uchar targetID, bool *isATAPI,
28								bool *noAutoSense, uint32 *maxBlocks);
29
30			device_node *	DeviceNode() { return fNode; }
31
32private:
33			bool			IsDevicePresent(uint device);
34			status_t		ResetController();
35			void			FlushPostedWrites();
36
37	static	int32			Interrupt(void *data);
38
39	friend class AHCIPort;
40
41private:
42	device_node *			fNode;
43	pci_device_module_info *fPCI;
44	pci_device *			fPCIDevice;
45	uint16					fPCIVendorID;
46	uint16					fPCIDeviceID;
47	uint32					fFlags;
48
49	volatile ahci_hba *		fRegs;
50	area_id					fRegsArea;
51	int						fCommandSlotCount;
52	int						fPortCount;
53	uint32					fPortImplementedMask;
54	uint32					fIRQ;
55	bool					fUseMSI;
56	AHCIPort *				fPort[32];
57
58// --- Instance check workaround begin
59	port_id fInstanceCheck;
60// --- Instance check workaround end
61
62};
63
64
65inline void
66AHCIController::FlushPostedWrites()
67{
68	volatile uint32 dummy = fRegs->ghc;
69	dummy = dummy;
70}
71
72#endif	// _AHCI_CONTROLLER_H
73