/*
 * This file is part of the libpayload project.
 *
 * Copyright (C) 2012 secunet Security Networks AG
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef _AHCI_PRIVATE_H
#define _AHCI_PRIVATE_H

#include <stdint.h>
#include <storage/ata.h>
#include <storage/atapi.h>

typedef volatile struct {
	u64 cmdlist_base;
	u64 frameinfo_base;
	u32 intr_status;
	u32 intr_enable;
	u32 cmd_stat;
	u32 _reserved0;
	u32 taskfile_data;
	u32 signature;
	u32 sata_status;
	u32 sata_control;
	u32 sata_error;
	u32 sata_active;
	u32 cmd_issue;
	u32 sata_notify;
	u32 fis_based_switch;
	u32 _reserved1[11];
	u32 _vendor[4];
} hba_port_t;

#define HBA_PxIS_TFES	(1 << 30)	/* TFES - Task File Error Status */
#define HBA_PxIS_HBFS	(1 << 29)	/* HBFS - Host Bus Fatal Error Status */
#define HBA_PxIS_HBDS	(1 << 28)	/* HBDS - Host Bus Data Error Status */
#define HBA_PxIS_IFS	(1 << 27)	/* IFS - Interface Fatal Error Status */
#define HBA_PxIS_FATAL	(HBA_PxIS_TFES | HBA_PxIS_HBFS | \
				HBA_PxIS_HBDS | HBA_PxIS_IFS)
#define HBA_PxIS_PCS	(1 <<  6)	/* PCS - Port Connect Change Status */

#define HBA_PxCMD_ICC_SHIFT	28
#define HBA_PxCMD_ICC_MASK	(0xf << HBA_PxCMD_ICC_SHIFT)
#define HBA_PxCMD_ICC_ACTIVE	(0x1 << HBA_PxCMD_ICC_SHIFT)
#define HBA_PxCMD_CR		(1 << 15) /* CR - Command list Running */
#define HBA_PxCMD_FR		(1 << 14) /* FR - FIS receive Running */
#define HBA_PxCMD_FRE		(1 <<  4) /* FRE - FIS Receive Enable */
#define HBA_PxCMD_SUD		(1 <<  1) /* SUD - Spin-Up Device */
#define HBA_PxCMD_ST		(1 <<  0) /* ST - Start (command processing) */

#define HBA_PxTFD_BSY		(1 <<  7)
#define HBA_PxTFD_DRQ		(1 <<  3)

#define HBA_PxSSTS_IPM_SHIFT		8
#define HBA_PxSSTS_IPM_MASK		(0xf << HBA_PxSSTS_IPM_SHIFT)
#define HBA_PxSSTS_IPM_ACTIVE		(1 << HBA_PxSSTS_IPM_SHIFT)
#define HBA_PxSSTS_DET_SHIFT		0
#define HBA_PxSSTS_DET_MASK		(0xf << HBA_PxSSTS_DET_SHIFT)
#define HBA_PxSSTS_DET_ESTABLISHED	(3 << HBA_PxSSTS_DET_SHIFT)

#define HBA_PxSCTL_DET_SHIFT		0
#define HBA_PxSCTL_DET_MASK		(0xf << HBA_PxSCTL_DET_SHIFT)
#define HBA_PxSCTL_DET_COMRESET		(0x1 << HBA_PxSCTL_DET_SHIFT)

#define	HBA_PxSIG_ATA	0x00000101 /* SATA drive */
#define	HBA_PxSIG_ATAPI	0xeb140101 /* SATAPI drive */
#define	HBA_PxSIG_SEMB	0xc33c0101 /* Enclosure management bridge */
#define	HBA_PxSIG_PM	0x96690101 /* Port multiplier */

typedef volatile struct {
	u32 caps;
	u32 global_ctrl;
	u32 intr_status;
	u32 ports_impl;
	u32 version;
	u32 ccc_ctrl;		/* CCC - Command Completion Coalescing */
	u32 ccc_ports;
	u32 em_location;	/* EM - Enclosure Management */
	u32 em_ctrl;
	u32 ext_caps;
	u32 handoff_ctrl_stat;
	u32 _reserved0[13];
	u32 _reserved_nvmchi[16];
	u32 _vendor[24];
	hba_port_t ports[32];
} hba_ctrl_t;

#define HBA_CAPS_SSS		(1 << 27) /* SSS - Supports Staggered Spin-up */
#define HBA_CAPS_NCS_SHIFT	8	/* NCS - Number of Command Slots */
#define HBA_CAPS_NCS_MASK	(0x1f << HBA_CAPS_NCS_SHIFT)

#define HBA_CAPS_DECODE_NCS(caps)	(((caps & HBA_CAPS_NCS_MASK)	\
					  >> HBA_CAPS_NCS_SHIFT)	\
					 + 1)

#define HBA_CTRL_AHCI_EN	(1 << 31)
#define HBA_CTRL_INTR_EN	(1 <<  1)
#define HBA_CTRL_RESET		(1 <<  0)


typedef volatile struct {
	u8 dma_setup_fis[28];
	u8 _reserved0[4];
	u8 pio_setup_fis[20];
	u8 _reserved1[12];
	u8 d2h_register_fis[20];
	u8 _reserved2[4];
	u8 set_device_bits_fis[8];
	u8 unknown_fis[64];
	u8 _reserved3[96];
} rcvd_fis_t;

typedef volatile struct {
	u16 cmd;
	u16 prdt_length;
	u32 prd_bytes;
	u64 cmdtable_base;
	u8 _reserved[16];
} cmd_t;

#define CMD_PMP_SHIFT	12		/* PMP - Port Multiplier Port */
#define CMD_PMP_MASK	(0xf << CMD_PMP_SHIFT)
#define CMD_PMP(x)	((x << CMD_PMP_SHIFT) & CMD_PMP_MASK)
#define CMD_CBuROK	(1 << 10)	/* C - Clear Busy upon R_OK */
#define CMD_BIST	(1 <<  9)	/* B - BIST - Built-In Selft Test */
#define CMD_RESET	(1 <<  8)	/* R - Reset */
#define CMD_PREFETCH	(1 <<  7)	/* P - Prefetch (PRDTs or ATAPI cmd) */
#define CMD_WRITE	(1 <<  6)	/* W - Write (host to device) */
#define CMD_ATAPI	(1 <<  5)	/* A - ATAPI cmd */
#define CMD_CFL_SHIFT	0		/* CFL - Command FIS Length */
#define CMD_CFL_MASK	(0xf << CMD_CFL_SHIFT)
#define CMD_CFL(x)	((((x) >> 2) << CMD_CFL_SHIFT) & CMD_CFL_MASK)

typedef volatile struct {
	u8 fis[64];
	u8 atapi_cmd[16];
	u8 _reserved0[48];
	struct {
		u64 data_base;
		u32 _reserved0;
		u32 flags;
	} prdt[8]; /* Can be up to 65,535 prds,
		      but implementation needs multiple of 128 bytes. */
} cmdtable_t;

#define BYTES_PER_PRD_SHIFT	20
#define BYTES_PER_PRD		(4 << 20)

enum {
	FIS_HOST_TO_DEVICE	= 0x27,
};
#define FIS_H2D_CMD	(1 << 7)
#define FIS_H2D_FIS_LEN	20
#define FIS_H2D_DEV_LBA	(1 << 6)

#define PRD_TABLE_I		(1 << 31) /* I - Interrupt on Completion */
#define PRD_TABLE_BYTES_MASK	0x3fffff
#define PRD_TABLE_BYTES(x)	(((x) - 1) & PRD_TABLE_BYTES_MASK)

typedef struct {
	union {
		ata_dev_t ata_dev;
		atapi_dev_t atapi_dev;
	};

	hba_ctrl_t *ctrl;
	hba_port_t *port;

	cmd_t *cmdlist;
	cmdtable_t *cmdtable;
	rcvd_fis_t *rcvd_fis;

	u8 *buf, *user_buf;
	int write_back;
	size_t buflen;
} ahci_dev_t;

#endif
