/*
 * Copyright (c) 2009, ETH Zurich. All rights reserved.
 *
 * This file is distributed under the terms in the attached LICENSE file.
 * If you do not find this file, copies can be found by writing to:
 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
 */

/*
 * ahci_hba.dev
 *
 * DESCRIPTION: AHCI (SATA) Host bus adaptor, generic registers (ports
 *              have their own devive definition. 
 * 
 * Section numbers refer to the Serial ATA Advanced Host Controller
 *   Interface (AHCI) specification 1.3, June 2008
 */

device ahci_hba msbfirst (addr b) "AHCI generic" {

    // 3.1.1
    
    constants speed "Interface speed" {
	gen1	= 0b0001 "Gen 1 (1.5 Gbps)";
	gen2	= 0b0010 "Gen 2 (3 Gbps)";
	gen3	= 0b0011 "Gen 3 (6 Gbps)";
    };

    register cap ro addr(b,0x00) "HBA capabilities" {
	s64a	1 "Supports 64-bit addressing";
	sncq	1 "Supports native command queueing";
	ssntf	1 "Supports SNotification register";
	smps	1 "Supports mechanical presence switch";
	sss	1 "Supports staggered spin-up";
	salp	1 "Supports aggressive link power management";
	sal	1 "Supports activity LED";
	sclo	1 "Supports command list override";
	iss	4 type(speed) "Interface speed support";
	_	1 rsvd;
	sam	1 "Supports AHCI mode only";
	spm	1 "Supports port multiplier";
	fbss	1 "FIS-based switching supported";
	pmd	1 "PIO multiple DRQ block";
	ssc	1 "Slumber state capable";
	psc	1 "Partial state capable";
	ncs	5 "Number of command slots";
	cccs	1 "Command completion coalescing supported";
	ems	1 "Enclosure management supported";
	sxs	1 "Supports external SATA";
	np	5 "Number of ports";
    };
    
    // 3.1.2
    register ghc rw addr(b,0x04) "Global HBA control" {
	ae	1 rw "AHCI enable";
	_	28 rsvd;
	mrsm	1 ro "MSI revert to single message";
	ie	1 rw "Interrupt enable";
	hr	1 rw "HBA reset";
    };
    
    // 3.1.3
    register is rwc addr(b,0x08) "Interrupt status" type(uint32);
    
    // 3.1.4
    register pi ro addr(b,0x0c) "Ports implemented" type(uint32);
    
    // 3.1.5 
    register vs ro addr(b,0x10) "AHCI version" {
	major	16 "Major version";
	minor	16 "Minor version";
    };
    
    // 3.1.6
    register ccc_ctl rw addr(b,0x14) "Command completion coalescing control" {
	tv	16 "Timeout value";
	cc	8 "Command completions";
	intr	5 ro "Interrupt";
	_	2 rsvd;
	en	1 "Enable";
    };
    
    // 3.1.7
    register ccc_ports rw addr(b,0x18) "Command completions coalescing ports"
	type(uint32);

    // 3.1.8 
    register em_loc ro addr(b,0x1c) "Enclosure management location" {
	ofst	16 "Offset";
	sz	16 "Bufer size";
    };
    
    // 3.1.9
    register em_ctl addr(b,0x20) "Enclosure management control" {
	_	4 rsvd;
	pm	1 ro "Port multiplier support";
	alhd	1 ro "Activity LED hardware driven";
	xmt	1 ro "Transmit only";
	smb	1 ro "Single message buffer";
	_	4 rsvd;
	sgpio	1 ro "SGPIO enclosure management messages";
	ses2	1 ro "SES-2 enclosure management messages";
	safte	1 ro "SAF-TE enclosure management messages";
	led	1 ro "LED message types";
	_	6 rsvd;
	rst	1 rw "Reset";
	tm	1 rw "Transmit message";
	_	7 rsvd;
	mr	1 rw1c "Message received";
    };

    // 3.1.10 
    register cap2 ro addr(b,0x24) "HBA capabilities extended" {
	_	29 rsvd;
	apst	1 "Automatic partial to slumber transitions";
	nvmp	1 "NVMHCI present";
	boh	1 "BIOS/OS handoff";
    };
    
    // 3.1.11
    register bohc addr(b,0x28) "BIOS/OS handoff control and status" {
	_	27 rsvd;
	bb	1 rw "BIOS busy";
	ooc	1 rw1c "OS ownership change";
	sooe	1 rw "SMI on OS ownership change enable";
	oos	1 rw "OS owned semaphore";
	bos	1 rw "BIOS owned semaphore";
    };
};

    
	    

    
    
	
