bool has_erratum_a010151(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_ARM64 case SVR_LS2080A: case SVR_LS2085A: case SVR_LS1046A: case SVR_LS1012A: return IS_SVR_REV(svr, 1, 0); case SVR_LS1043A: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); #endif #ifdef CONFIG_LS102XA case SOC_VER_LS1020: case SOC_VER_LS1021: case SOC_VER_LS1022: case SOC_VER_SLS1020: return IS_SVR_REV(svr, 2, 0); #endif } return false; }
bool has_erratum_a010151(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); #ifdef CONFIG_ARM64 if (IS_SVR_DEV(svr, SVR_DEV(SVR_LS1043A))) return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); #endif switch (soc) { #ifdef CONFIG_ARM64 case SVR_LS2080A: case SVR_LS2085A: /* fallthrough */ case SVR_LS2088A: /* fallthrough */ case SVR_LS2081A: case SVR_LS1046A: case SVR_LS1012A: return IS_SVR_REV(svr, 1, 0); #endif #ifdef CONFIG_ARCH_LS1021A case SOC_VER_LS1020: case SOC_VER_LS1021: case SOC_VER_LS1022: case SOC_VER_SLS1020: return IS_SVR_REV(svr, 2, 0); #endif } return false; }
bool has_dual_phy(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_PPC case SVR_T1023: case SVR_T1024: case SVR_T1013: case SVR_T1014: return IS_SVR_REV(svr, 1, 0); case SVR_T1040: case SVR_T1042: case SVR_T1020: case SVR_T1022: case SVR_T2080: case SVR_T2081: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); case SVR_T4240: case SVR_T4160: case SVR_T4080: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); #endif } return false; }
bool has_erratum_a007798(void) { #ifdef CONFIG_PPC return SVR_SOC_VER(get_svr()) == SVR_T4240 && IS_SVR_REV(get_svr(), 2, 0); #endif return false; }
bool has_erratum_a007075(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_PPC case SVR_B4860: case SVR_B4420: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); case SVR_P1010: return IS_SVR_REV(svr, 1, 0); case SVR_P4080: return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0); #endif } return false; }
bool has_erratum_a005697(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_PPC case SVR_9131: case SVR_9132: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); #endif #ifdef ONFIG_ARM64 case SVR_LS1012A: return IS_SVR_REV(svr, 1, 0); #endif } return false; }
bool has_erratum_a008751(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_ARM64 case SVR_LS2080A: case SVR_LS2085A: return IS_SVR_REV(svr, 1, 0); #endif } return false; }
/* Set up the buffers and their descriptors, and bring up the * interface */ static void startup_tsec(struct eth_device *dev) { int i; struct tsec_private *priv = (struct tsec_private *)dev->priv; tsec_t *regs = priv->regs; /* reset the indices to zero */ rxIdx = 0; txIdx = 0; #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129 uint svr; #endif /* Point to the buffer descriptors */ out_be32(®s->tbase, (unsigned int)(&rtx.txbd[txIdx])); out_be32(®s->rbase, (unsigned int)(&rtx.rxbd[rxIdx])); /* Initialize the Rx Buffer descriptors */ for (i = 0; i < PKTBUFSRX; i++) { rtx.rxbd[i].status = RXBD_EMPTY; rtx.rxbd[i].length = 0; rtx.rxbd[i].bufPtr = (uint) NetRxPackets[i]; } rtx.rxbd[PKTBUFSRX - 1].status |= RXBD_WRAP; /* Initialize the TX Buffer Descriptors */ for (i = 0; i < TX_BUF_CNT; i++) { rtx.txbd[i].status = 0; rtx.txbd[i].length = 0; rtx.txbd[i].bufPtr = 0; } rtx.txbd[TX_BUF_CNT - 1].status |= TXBD_WRAP; #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129 svr = get_svr(); if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) redundant_init(dev); #endif /* Enable Transmit and Receive */ setbits_be32(®s->maccfg1, MACCFG1_RX_EN | MACCFG1_TX_EN); /* Tell the DMA it is clear to go */ setbits_be32(®s->dmactrl, DMACTRL_INIT_SETTINGS); out_be32(®s->tstat, TSTAT_CLEAR_THALT); out_be32(®s->rstat, RSTAT_CLEAR_RHALT); clrbits_be32(®s->dmactrl, DMACTRL_GRS | DMACTRL_GTS); }
static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { __maybe_unused u32 svr = get_svr(); #if defined(CONFIG_FSL_SATA_V2) && defined(CONFIG_FSL_SATA_ERRATUM_A001) if (IS_SVR_REV(svr, 1, 0)) { switch (SVR_SOC_VER(svr)) { case SVR_P1013: case SVR_P1013_E: case SVR_P1022: case SVR_P1022_E: puts("Work-around for Erratum SATA A001 enabled\n"); } } #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES8) puts("Work-around for Erratum SERDES8 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) puts("Work-around for Erratum CPU22 enabled\n"); #endif return 0; }
bool has_erratum_a006261(void) { u32 svr = get_svr(); u32 soc = SVR_SOC_VER(svr); switch (soc) { #ifdef CONFIG_PPC case SVR_P1010: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); case SVR_P2041: case SVR_P2040: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1) || IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); case SVR_P3041: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1) || IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); case SVR_P5010: case SVR_P5020: case SVR_P5021: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); case SVR_T4240: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); case SVR_P5040: return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); #endif } return false; }
void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, unsigned int ctrl_num, int step) { unsigned int i; struct ccsr_ddr __iomem *ddr = (struct ccsr_ddr __iomem *)CONFIG_SYS_FSL_DDR_ADDR; #if defined(CONFIG_SYS_FSL_ERRATUM_NMG_DDR120) && defined(CONFIG_MPC85xx) ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); uint svr; #endif if (ctrl_num) { printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num); return; } #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_DDR120 /* * Set the DDR IO receiver to an acceptable bias point. * Fixed in Rev 2.1. */ svr = get_svr(); if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) { if ((regs->ddr_sdram_cfg & SDRAM_CFG_SDRAM_TYPE_MASK) == SDRAM_CFG_SDRAM_TYPE_DDR2) out_be32(&gur->ddrioovcr, 0x90000000); else out_be32(&gur->ddrioovcr, 0xA8000000); } #endif for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) { if (i == 0) { out_be32(&ddr->cs0_bnds, regs->cs[i].bnds); out_be32(&ddr->cs0_config, regs->cs[i].config); } else if (i == 1) { out_be32(&ddr->cs1_bnds, regs->cs[i].bnds); out_be32(&ddr->cs1_config, regs->cs[i].config); } else if (i == 2) { out_be32(&ddr->cs2_bnds, regs->cs[i].bnds); out_be32(&ddr->cs2_config, regs->cs[i].config); } else if (i == 3) { out_be32(&ddr->cs3_bnds, regs->cs[i].bnds); out_be32(&ddr->cs3_config, regs->cs[i].config); } } out_be32(&ddr->timing_cfg_3, regs->timing_cfg_3); out_be32(&ddr->timing_cfg_0, regs->timing_cfg_0); out_be32(&ddr->timing_cfg_1, regs->timing_cfg_1); out_be32(&ddr->timing_cfg_2, regs->timing_cfg_2); out_be32(&ddr->sdram_cfg_2, regs->ddr_sdram_cfg_2); out_be32(&ddr->sdram_mode, regs->ddr_sdram_mode); out_be32(&ddr->sdram_mode_2, regs->ddr_sdram_mode_2); out_be32(&ddr->sdram_md_cntl, regs->ddr_sdram_md_cntl); out_be32(&ddr->sdram_interval, regs->ddr_sdram_interval); out_be32(&ddr->sdram_data_init, regs->ddr_data_init); out_be32(&ddr->sdram_clk_cntl, regs->ddr_sdram_clk_cntl); out_be32(&ddr->init_addr, regs->ddr_init_addr); out_be32(&ddr->init_ext_addr, regs->ddr_init_ext_addr); /* * 200 painful micro-seconds must elapse between * the DDR clock setup and the DDR config enable. */ udelay(200); asm volatile("sync;isync"); out_be32(&ddr->sdram_cfg, regs->ddr_sdram_cfg); /* Poll DDR_SDRAM_CFG_2[D_INIT] bit until auto-data init is done. */ while (in_be32(&ddr->sdram_cfg_2) & 0x10) { udelay(10000); /* throttle polling rate */ } }
static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011 extern int enable_cpu_a011_workaround; #endif __maybe_unused u32 svr = get_svr(); #if defined(CONFIG_FSL_SATA_V2) && defined(CONFIG_FSL_SATA_ERRATUM_A001) if (IS_SVR_REV(svr, 1, 0)) { switch (SVR_SOC_VER(svr)) { case SVR_P1013: case SVR_P1022: puts("Work-around for Erratum SATA A001 enabled\n"); } } #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES8) puts("Work-around for Erratum SERDES8 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES9) puts("Work-around for Erratum SERDES9 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES_A005) puts("Work-around for Erratum SERDES-A005 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) if (SVR_MAJ(svr) < 3) puts("Work-around for Erratum CPU22 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011 /* * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0 * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1 * The SVR has been checked by cpu_init_r(). */ if (enable_cpu_a011_workaround) puts("Work-around for Erratum CPU-A011 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_CPU_A003999) puts("Work-around for Erratum CPU-A003999 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_DDR_A003474) puts("Work-around for Erratum DDR-A003474 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_DDR_MSYNC_IN) puts("Work-around for DDR MSYNC_IN Erratum enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC111) puts("Work-around for Erratum ESDHC111 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004468 puts("Work-around for Erratum A004468 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC135) puts("Work-around for Erratum ESDHC135 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC13) if (SVR_MAJ(svr) < 3) puts("Work-around for Erratum ESDHC13 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC_A001) puts("Work-around for Erratum ESDHC-A001 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_CPC_A002 puts("Work-around for Erratum CPC-A002 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_CPC_A003 puts("Work-around for Erratum CPC-A003 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_ELBC_A001 puts("Work-around for Erratum ELBC-A001 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR_A003 puts("Work-around for Erratum DDR-A003 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR_115 puts("Work-around for Erratum DDR115 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 puts("Work-around for Erratum DDR111 enabled\n"); puts("Work-around for Erratum DDR134 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_IFC_A002769 puts("Work-around for Erratum IFC-A002769 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_P1010_A003549 puts("Work-around for Erratum P1010-A003549 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_IFC_A003399 puts("Work-around for Erratum IFC A-003399 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_DDR120 if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) puts("Work-around for Erratum NMG DDR120 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_LBC103 puts("Work-around for Erratum NMG_LBC103 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129 if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) puts("Work-around for Erratum NMG ETSEC129 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004508 puts("Work-around for Erratum A004508 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004510 puts("Work-around for Erratum A004510 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_SRIO_A004034 puts("Work-around for Erratum SRIO-A004034 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A_004934 puts("Work-around for Erratum A004934 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A005871 if (IS_SVR_REV(svr, 1, 0)) puts("Work-around for Erratum A005871 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A006475 if (SVR_MAJ(get_svr()) == 1) puts("Work-around for Erratum A006475 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A006384 if (SVR_MAJ(get_svr()) == 1) puts("Work-around for Erratum A006384 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004849 /* This work-around is implemented in PBI, so just check for it */ check_erratum_a4849(svr); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004580 /* This work-around is implemented in PBI, so just check for it */ check_erratum_a4580(svr); #endif #ifdef CONFIG_SYS_P4080_ERRATUM_PCIE_A003 puts("Work-around for Erratum PCIe-A003 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_USB14 puts("Work-around for Erratum USB14 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A007186 if (has_erratum_a007186()) puts("Work-around for Erratum A007186 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A006593 puts("Work-around for Erratum A006593 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A006379 if (has_erratum_a006379()) puts("Work-around for Erratum A006379 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_SEC_A003571 if (IS_SVR_REV(svr, 1, 0)) puts("Work-around for Erratum A003571 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A005812 puts("Work-around for Erratum A-005812 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A005125 puts("Work-around for Erratum A005125 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A007075 if (has_erratum_a007075()) puts("Work-around for Erratum A007075 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A007798 if (has_erratum_a007798()) puts("Work-around for Erratum A007798 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A004477 if (has_erratum_a004477()) puts("Work-around for Erratum A004477 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_I2C_A004447 if ((SVR_SOC_VER(svr) == SVR_8548 && IS_SVR_REV(svr, 3, 1)) || (SVR_REV(svr) <= CONFIG_SYS_FSL_A004447_SVR_REV)) puts("Work-around for Erratum I2C-A004447 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A006261 if (has_erratum_a006261()) puts("Work-around for Erratum A006261 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A007212 check_erratum_a007212(); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A005434 puts("Work-around for Erratum A-005434 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_A008044) && \ defined(CONFIG_A008044_WORKAROUND) if (IS_SVR_REV(svr, 1, 0)) puts("Work-around for Erratum A-008044 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_B4860QDS_XFI_ERR) && defined(CONFIG_B4860QDS) puts("Work-around for Erratum XFI on B4860QDS enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_A009663 puts("Work-around for Erratum A009663 enabled\n"); #endif return 0; }
int init_sata(int dev) { u32 length, align; cmd_hdr_tbl_t *cmd_hdr; u32 cda; u32 val32; fsl_sata_reg_t *reg; u32 sig; int i; fsl_sata_t *sata; if (dev < 0 || dev > (CONFIG_SYS_SATA_MAX_DEVICE - 1)) { printf("the sata index %d is out of ranges\n\r", dev); return -1; } #ifdef CONFIG_MPC85xx if ((dev == 0) && (!is_serdes_configured(SATA1))) { printf("SATA%d [dev = %d] is not enabled\n", dev+1, dev); return -1; } if ((dev == 1) && (!is_serdes_configured(SATA2))) { printf("SATA%d [dev = %d] is not enabled\n", dev+1, dev); return -1; } #endif /* Allocate SATA device driver struct */ sata = (fsl_sata_t *)malloc(sizeof(fsl_sata_t)); if (!sata) { printf("alloc the sata device struct failed\n\r"); return -1; } /* Zero all of the device driver struct */ memset((void *)sata, 0, sizeof(fsl_sata_t)); /* Save the private struct to block device struct */ sata_dev_desc[dev].priv = (void *)sata; sprintf(sata->name, "SATA%d", dev); /* Set the controller register base address to device struct */ reg = (fsl_sata_reg_t *)(fsl_sata_info[dev].sata_reg_base); sata->reg_base = reg; /* Allocate the command header table, 4 bytes aligned */ length = sizeof(struct cmd_hdr_tbl); align = SATA_HC_CMD_HDR_TBL_ALIGN; sata->cmd_hdr_tbl_offset = (void *)malloc(length + align); if (!sata) { printf("alloc the command header failed\n\r"); return -1; } cmd_hdr = (cmd_hdr_tbl_t *)(((u32)sata->cmd_hdr_tbl_offset + align) & ~(align - 1)); sata->cmd_hdr = cmd_hdr; /* Zero all of the command header table */ memset((void *)sata->cmd_hdr_tbl_offset, 0, length + align); /* Allocate command descriptor for all command */ length = sizeof(struct cmd_desc) * SATA_HC_MAX_CMD; align = SATA_HC_CMD_DESC_ALIGN; sata->cmd_desc_offset = (void *)malloc(length + align); if (!sata->cmd_desc_offset) { printf("alloc the command descriptor failed\n\r"); return -1; } sata->cmd_desc = (cmd_desc_t *)(((u32)sata->cmd_desc_offset + align) & ~(align - 1)); /* Zero all of command descriptor */ memset((void *)sata->cmd_desc_offset, 0, length + align); /* Link the command descriptor to command header */ for (i = 0; i < SATA_HC_MAX_CMD; i++) { cda = ((u32)sata->cmd_desc + SATA_HC_CMD_DESC_SIZE * i) & ~(CMD_HDR_CDA_ALIGN - 1); cmd_hdr->cmd_slot[i].cda = cpu_to_le32(cda); } /* To have safe state, force the controller offline */ val32 = in_le32(®->hcontrol); val32 &= ~HCONTROL_ONOFF; val32 |= HCONTROL_FORCE_OFFLINE; out_le32(®->hcontrol, val32); /* Wait the controller offline */ ata_wait_register(®->hstatus, HSTATUS_ONOFF, 0, 1000); #if defined(CONFIG_FSL_SATA_V2) && defined(CONFIG_FSL_SATA_ERRATUM_A001) /* * For P1022/1013 Rev1.0 silicon, after power on SATA host * controller is configured in legacy mode instead of the * expected enterprise mode. software needs to clear bit[28] * of HControl register to change to enterprise mode from * legacy mode. */ { u32 svr = get_svr(); if (IS_SVR_REV(svr, 1, 0) && ((SVR_SOC_VER(svr) == SVR_P1022) || (SVR_SOC_VER(svr) == SVR_P1022_E) || (SVR_SOC_VER(svr) == SVR_P1013) || (SVR_SOC_VER(svr) == SVR_P1013_E))) { out_le32(®->hstatus, 0x20000000); out_le32(®->hcontrol, 0x00000100); } } #endif /* Set the command header base address to CHBA register to tell DMA */ out_le32(®->chba, (u32)cmd_hdr & ~0x3); /* Snoop for the command header */ val32 = in_le32(®->hcontrol); val32 |= HCONTROL_HDR_SNOOP; out_le32(®->hcontrol, val32); /* Disable all of interrupts */ val32 = in_le32(®->hcontrol); val32 &= ~HCONTROL_INT_EN_ALL; out_le32(®->hcontrol, val32); /* Clear all of interrupts */ val32 = in_le32(®->hstatus); out_le32(®->hstatus, val32); /* Set the ICC, no interrupt coalescing */ out_le32(®->icc, 0x01000000); /* No PM attatched, the SATA device direct connect */ out_le32(®->cqpmp, 0); /* Clear SError register */ val32 = in_le32(®->serror); out_le32(®->serror, val32); /* Clear CER register */ val32 = in_le32(®->cer); out_le32(®->cer, val32); /* Clear DER register */ val32 = in_le32(®->der); out_le32(®->der, val32); /* No device detection or initialization action requested */ out_le32(®->scontrol, 0x00000300); /* Configure the transport layer, default value */ out_le32(®->transcfg, 0x08000016); /* Configure the link layer, default value */ out_le32(®->linkcfg, 0x0000ff34); /* Bring the controller online */ val32 = in_le32(®->hcontrol); val32 |= HCONTROL_ONOFF; out_le32(®->hcontrol, val32); mdelay(100); /* print sata device name */ if (!dev) printf("%s ", sata->name); else printf(" %s ", sata->name); /* Wait PHY RDY signal changed for 500ms */ ata_wait_register(®->hstatus, HSTATUS_PHY_RDY, HSTATUS_PHY_RDY, 500); /* Check PHYRDY */ val32 = in_le32(®->hstatus); if (val32 & HSTATUS_PHY_RDY) { sata->link = 1; } else { sata->link = 0; printf("(No RDY)\n\r"); return -1; } /* Wait for signature updated, which is 1st D2H */ ata_wait_register(®->hstatus, HSTATUS_SIGNATURE, HSTATUS_SIGNATURE, 10000); if (val32 & HSTATUS_SIGNATURE) { sig = in_le32(®->sig); debug("Signature updated, the sig =%08x\n\r", sig); sata->ata_device_type = ata_dev_classify(sig); } /* Check the speed */ val32 = in_le32(®->sstatus); if ((val32 & SSTATUS_SPD_MASK) == SSTATUS_SPD_GEN1) printf("(1.5 Gbps)\n\r"); else if ((val32 & SSTATUS_SPD_MASK) == SSTATUS_SPD_GEN2) printf("(3 Gbps)\n\r"); return 0; }
static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { __maybe_unused u32 svr = get_svr(); #if defined(CONFIG_FSL_SATA_V2) && defined(CONFIG_FSL_SATA_ERRATUM_A001) if (IS_SVR_REV(svr, 1, 0)) { switch (SVR_SOC_VER(svr)) { case SVR_P1013: case SVR_P1022: puts("Work-around for Erratum SATA A001 enabled\n"); } } #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES8) puts("Work-around for Erratum SERDES8 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES9) puts("Work-around for Erratum SERDES9 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_SERDES_A005) puts("Work-around for Erratum SERDES-A005 enabled\n"); #endif #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) if (SVR_MAJ(svr) < 3) puts("Work-around for Erratum CPU22 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011 /* * NMG_CPU_A011 applies to P4080 rev 1.0, 2.0, fixed in 3.0 * also applies to P3041 rev 1.0, 1.1, P2041 rev 1.0, 1.1 */ if (SVR_SOC_VER(svr) != SVR_P4080 || SVR_MAJ(svr) < 3) puts("Work-around for Erratum CPU-A011 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_CPU_A003999) puts("Work-around for Erratum CPU-A003999 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_DDR_A003474) puts("Work-around for Erratum DDR-A003473 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_DDR_MSYNC_IN) puts("Work-around for DDR MSYNC_IN Erratum enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC111) puts("Work-around for Erratum ESDHC111 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC135) puts("Work-around for Erratum ESDHC135 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC136) puts("Work-around for Erratum ESDHC136 enabled\n"); #endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC_A001) puts("Work-around for Erratum ESDHC-A001 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_CPC_A002 puts("Work-around for Erratum CPC-A002 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_CPC_A003 puts("Work-around for Erratum CPC-A003 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_ELBC_A001 puts("Work-around for Erratum ELBC-A001 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR_A003 puts("Work-around for Erratum DDR-A003 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR_115 puts("Work-around for Erratum DDR115 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 puts("Work-around for Erratum DDR111 enabled\n"); puts("Work-around for Erratum DDR134 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_IFC_A002769 puts("Work-around for Erratum IFC-A002769 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_P1010_A003549 puts("Work-around for Erratum P1010-A003549 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_IFC_A003399 puts("Work-around for Erratum IFC A-003399 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_DDR120 if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) puts("Work-around for Erratum NMG DDR120 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_LBC103 puts("Work-around for Erratum NMG_LBC103 enabled\n"); #endif #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129 if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0)) puts("Work-around for Erratum NMG ETSEC129 enabled\n"); #endif return 0; }