#ifndef _MVSATAREG_H_
#define _MVSATAREG_H_
#define SATAHC_REGISTER_SIZE 0x10000
#define SATAHC(hc) ((hc) * SATAHC_REGISTER_SIZE)
#define SATAHC_C 0x000
#define SATAHC_C_TIMEOUT_MASK (0xff << 0)
#define SATAHC_C_TIMEOUTEN (1 << 16)
#define SATAHC_C_COALDIS(p) (1 << ((p) + 24))
#define SATAHC_RQOP 0x004
#define SATAHC_RQIP 0x008
#define SATAHC_RQP_ERPQP(p, x) (((x) >> ((p) * 8)) & 0x7f)
#define SATAHC_ICT 0x00c
#define SATAHC_ICT_SAICOALT_MASK 0x000000ff
#define SATAHC_ITT 0x010
#define SATAHC_ITT_SAITMTH 0x00ffffff
#define SATAHC_IC 0x014
#define SATAHC_IC_DONE(p) (1 << (p))
#define SATAHC_IC_SAINTCOAL (1 << 4)
#define SATAHC_IC_SADEVINTERRUPT(p) (1 << ((p) + 8))
#define SATAHC_I_R02(p) ((p) * 0x100 + 0x108)
#define SATAHC_I_PHYCONTROL(p) ((p) * 0x100 + 0x10c)
#define SATAHC_I_LTMODE(p) ((p) * 0x100 + 0x130)
#define SATAHC_I_PHYMODE(p) ((p) * 0x100 + 0x174)
#define EDMA_REGISTERS_OFFSET 0x2000
#define EDMA_REGISTERS_SIZE 0x2000
#define EDMA_CFG 0x000
#define EDMA_CFG_RESERVED (0x1f << 0)
#define EDMA_CFG_ESATANATVCMDQUE (1 << 5)
#define EDMA_CFG_ERDBSZ (1 << 8)
#define EDMA_CFG_EQUE (1 << 9)
#define EDMA_CFG_ERDBSZEXT (1 << 11)
#define EDMA_CFG_RESERVED2 (1 << 12)
#define EDMA_CFG_EWRBUFFERLEN (1 << 13)
#define EDMA_CFG_EDEVERR (1 << 14)
#define EDMA_CFG_EEDMAFBS (1 << 16)
#define EDMA_CFG_ECUTTHROUGHEN (1 << 17)
#define EDMA_CFG_EEARLYCOMPLETIONEN (1 << 18)
#define EDMA_CFG_EEDMAQUELEN (1 << 19)
#define EDMA_CFG_EHOSTQUEUECACHEEN (1 << 22)
#define EDMA_CFG_EMASKRXPM (1 << 23)
#define EDMA_CFG_RESUMEDIS (1 << 24)
#define EDMA_CFG_EDMAFBS (1 << 26)
#define EDMA_T 0x004
#define EDMA_IEC 0x008
#define EDMA_IEM 0x00c
#define EDMA_IE_EDEVERR (1 << 2)
#define EDMA_IE_EDEVDIS (1 << 3)
#define EDMA_IE_EDEVCON (1 << 4)
#define EDMA_IE_SERRINT (1 << 5)
#define EDMA_IE_ESELFDIS (1 << 7)
#define EDMA_IE_ETRANSINT (1 << 8)
#define EDMA_IE_EIORDYERR (1 << 12)
# define EDMA_IE_LINKXERR_SATACRC (1 << 0)
# define EDMA_IE_LINKXERR_INTERNALFIFO (1 << 1)
# define EDMA_IE_LINKXERR_LINKLAYERRESET (1 << 2)
# define EDMA_IE_LINKXERR_OTHERERRORS (1 << 3)
# define EDMA_IE_LINKTXERR_FISTXABORTED (1 << 4)
#define EDMA_IE_LINKCTLRXERR(x) ((x) << 13)
#define EDMA_IE_LINKDATARXERR(x) ((x) << 17)
#define EDMA_IE_LINKCTLTXERR(x) ((x) << 21)
#define EDMA_IE_LINKDATATXERR(x) ((x) << 26)
#define EDMA_IE_TRANSPROTERR (1 << 31)
#define EDMA_REQQBAH 0x010
#define EDMA_REQQIP 0x014
#define EDMA_REQQOP 0x018
#define EDMA_REQQP_ERQQP_SHIFT 5
#define EDMA_REQQP_ERQQP_MASK 0x000003e0
#define EDMA_REQQP_ERQQBAP_MASK 0x00000c00
#define EDMA_REQQP_ERQQBA_MASK 0xfffff000
#define EDMA_RESQBAH 0x01c
#define EDMA_RESQIP 0x020
#define EDMA_RESQOP 0x024
#define EDMA_RESQP_ERPQP_SHIFT 3
#define EDMA_RESQP_ERPQP_MASK 0x000000f8
#define EDMA_RESQP_ERPQBAP_MASK 0x00000300
#define EDMA_RESQP_ERPQBA_MASK 0xfffffc00
#define EDMA_CMD 0x028
#define EDMA_CMD_EENEDMA (1 << 0)
#define EDMA_CMD_EDSEDMA (1 << 1)
#define EDMA_CMD_EATARST (1 << 2)
#define EDMA_CMD_EEDMAFRZ (1 << 4)
#define EDMA_TC 0x02c
#define EDMA_S 0x030
#define EDMA_S_EDEVQUETAG(s) ((s) & 0x0000001f)
#define EDMA_S_EDEVDIR_WRITE (0 << 5)
#define EDMA_S_EDEVDIR_READ (1 << 5)
#define EDMA_S_ECACHEEMPTY (1 << 6)
#define EDMA_S_EDMAIDLE (1 << 7)
#define EDMA_S_ESTATE(s) (((s) & 0x0000ff00) >> 8)
#define EDMA_S_EIOID(s) (((s) & 0x003f0000) >> 16)
#define EDMA_IORT 0x034
#define EDMA_CDT 0x040
#define EDMA_HC 0x060
#define EDMA_CQDCQOS(x) (0x090 + ((x) << 2)
#define SHADOW_REG_BLOCK_OFFSET 0x100
#define SHADOW_REG_BLOCK_SIZE 0x100
#define SRB_PIOD 0x000
#define SRB_FE 0x004
#define SRB_SC 0x008
#define SRB_LBAL 0x00c
#define SRB_LBAM 0x010
#define SRB_LBAH 0x014
#define SRB_H 0x018
#define SRB_CS 0x01c
#define SRB_CAS 0x020
#define DMA_C 0x224
#define DMA_C_START (1 << 0)
#define DMA_C_READ (1 << 3)
#define DMA_C_DREGIONVALID (1 << 8)
#define DMA_C_DREGIONLAST (1 << 9)
#define DMA_C_CONTFROMPREV (1 << 10)
#define DMA_C_DRBC(n) (((n) & 0xffff) << 16)
#define DMA_S 0x228
#define DMA_DTLBA 0x22c
#define DMA_DTLBA_MASK 0xfffffff0
#define DMA_DTHBA 0x230
#define DMA_DRLA 0x234
#define DMA_DRHA 0x238
#define SATA_SS 0x300
#define SATA_SE 0x304
#define SATA_SEIM 0x340
#define SATA_SC 0x308
#define SATA_LTM 0x30c
#define SATA_PHYM3 0x310
#define SATA_PHYM4 0x314
#define SATA_PHYM1 0x32c
#define SATA_PHYM2 0x330
#define SATA_BISTC 0x334
#define SATA_BISTDW1 0x338
#define SATA_BISTDW2 0x33c
#define SATA_SATAICFG 0x050
#define SATA_SATAICFG_REFCLKCNF_20MHZ (0 << 0)
#define SATA_SATAICFG_REFCLKCNF_25MHZ (1 << 0)
#define SATA_SATAICFG_REFCLKCNF_30MHZ (2 << 0)
#define SATA_SATAICFG_REFCLKCNF_40MHZ (3 << 0)
#define SATA_SATAICFG_REFCLKCNF_MASK (3 << 0)
#define SATA_SATAICFG_REFCLKDIV_1 (0 << 2)
#define SATA_SATAICFG_REFCLKDIV_2 (1 << 2)
#define SATA_SATAICFG_REFCLKDIV_4 (2 << 2)
#define SATA_SATAICFG_REFCLKDIV_3 (3 << 2)
#define SATA_SATAICFG_REFCLKDIV_MASK (3 << 2)
#define SATA_SATAICFG_REFCLKFEEDDIV_50 (0 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_60 (1 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_75 (2 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_90 (3 << 4)
#define SATA_SATAICFG_REFCLKFEEDDIV_MASK (3 << 4)
#define SATA_SATAICFG_PHYSSCEN (1 << 6)
#define SATA_SATAICFG_GEN2EN (1 << 7)
#define SATA_SATAICFG_COMMEN (1 << 8)
#define SATA_SATAICFG_PHYSHUTDOWN (1 << 9)
#define SATA_SATAICFG_TARGETMODE (1 << 10)
#define SATA_SATAICFG_COMCHANNEL (1 << 11)
#define SATA_SATAICFG_IGNOREBSY (1 << 24)
#define SATA_SATAICFG_LINKRSTEN (1 << 25)
#define SATA_SATAICFG_CMDRETXDS (1 << 26)
#define SATA_SATAICTL 0x344
#define SATA_SATAITC 0x348
#define SATA_SATAIS 0x34c
#define SATA_VU 0x35c
#define SATA_FISC 0x360
#define SATA_FISC_FISWAIT4RDYEN_B0 (1 << 0)
#define SATA_FISC_FISWAIT4RDYEN_B1 (1 << 1)
#define SATA_FISC_FISWAIT4RDYEN_B2 (1 << 2)
#define SATA_FISC_FISWAIT4RDYEN_B3 (1 << 3)
#define SATA_FISC_FISWAIT4RDYEN_B4 (1 << 4)
#define SATA_FISC_FISWAIT4RDYEN_B5 (1 << 5)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B0 (1 << 8)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B1 (1 << 9)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B2 (1 << 10)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B3 (1 << 11)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B4 (1 << 12)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B5 (1 << 13)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B6 (1 << 14)
#define SATA_FISC_FISWAIT4HOSTRDYEN_B7 (1 << 15)
#define SATA_FISC_FISDMAACTIVATESYNCRESP (1 << 16)
#define SATA_FISC_FISUNRECTYPECONT (1 << 17)
#define SATA_FISIC 0x364
#define SATA_FISIM 0x368
#define SATA_FISDW0 0x370
#define SATA_FISDW1 0x374
#define SATA_FISDW2 0x378
#define SATA_FISDW3 0x37c
#define SATA_FISDW4 0x380
#define SATA_FISDW5 0x384
#define SATA_FISDW6 0x388
struct crqb {
uint32_t cprdbl;
uint32_t cprdbh;
uint16_t ctrlflg;
uint16_t atacommand[11];
} __packed __aligned(8);
struct crqb_gen2e {
uint32_t cprdbl;
uint32_t cprdbh;
uint32_t ctrlflg;
uint32_t drbc;
uint8_t atacommand[16];
} __packed __aligned(8);
#define CRQB_CRQBL_EPRD_MASK 0xfffffff0
#define CRQB_CRQBL_SDR_MASK 0xfffffffe
#define CRQB_CDIR_WRITE (0 << 0)
#define CRQB_CDIR_READ (1 << 0)
#define CRQB_CDEVICEQUETAG(x) (((x) & 0x1f) << 1)
#define CRQB_CHOSTQUETAG(x) (((x) & 0x7f) << 1)
#define CRQB_CPMPORT(x) (((x) & 0xf) << 12)
#define CRQB_CPRDMODE_EPRD (0 << 16)
#define CRQB_CPRDMODE_SDR (1 << 16)
#define CRQB_CHOSTQUETAG_GEN2(x) (((x) & 0x7f) << 17)
#define CRQB_CDRBC(x) (((x) & 0xfffe) << 0)
#define CRQB_ATACOMMAND(reg, val) \
((reg << 8) | (val & 0xff))
#define CRQB_ATACOMMAND_LAST (1 << 15)
#define CRQB_ATACOMMAND_REG(reg) (((reg) >> 2) + 0x10)
#define CRQB_ATACOMMAND_FEATURES CRQB_ATACOMMAND_REG(SRB_FE)
#define CRQB_ATACOMMAND_SECTORCOUNT CRQB_ATACOMMAND_REG(SRB_SC)
#define CRQB_ATACOMMAND_LBALOW CRQB_ATACOMMAND_REG(SRB_LBAL)
#define CRQB_ATACOMMAND_LBAMID CRQB_ATACOMMAND_REG(SRB_LBAM)
#define CRQB_ATACOMMAND_LBAHIGH CRQB_ATACOMMAND_REG(SRB_LBAH)
#define CRQB_ATACOMMAND_DEVICE CRQB_ATACOMMAND_REG(SRB_H)
#define CRQB_ATACOMMAND_COMMAND CRQB_ATACOMMAND_REG(SRB_CS)
struct eprd {
uint32_t prdbal;
uint16_t bytecount;
uint16_t eot;
uint32_t prdbah;
uint32_t resv;
} __packed __aligned(8);
#define EPRD_PRDBAL_MASK 0xfffffffe
#define EPRD_BYTECOUNT(x) (((x) & 0xffff) << 0)
#define EPRD_EOT (1 << 15)
struct crpb {
uint16_t id;
uint16_t rspflg;
uint32_t ts;
} __packed __aligned(8);
#define CRPB_CHOSTQUETAG(x) (((x) >> 0) & 0x7f)
#define CRPB_CEDMASTS(x) (((x) >> 0) & 0x7f)
#define CRPB_CDEVSTS(x) (((x) >> 8) & 0xff)
#endif