On 25.5.2018 11:06, andy.t...@nxp.com wrote: > From: Yuantian Tang <andy.t...@nxp.com> > > Adjust the code structure more general so that more socs can be > added easily. > Add the ls1012a sata support as well. >
Please also mentioned that speed limitation restriction here. > Signed-off-by: Tang Yuantian <andy.t...@nxp.com> > --- > drivers/ata/sata_ceva.c | 87 +++++++++++++++++++++++++++++----------------- > 1 files changed, 55 insertions(+), 32 deletions(-) > > diff --git a/drivers/ata/sata_ceva.c b/drivers/ata/sata_ceva.c > index a7d45e8..4c9ebe4 100644 > --- a/drivers/ata/sata_ceva.c > +++ b/drivers/ata/sata_ceva.c > @@ -18,6 +18,7 @@ > #define AHCI_VEND_PP3C 0xB0 > #define AHCI_VEND_PP4C 0xB4 > #define AHCI_VEND_PP5C 0xB8 > +#define AHCI_VEND_AXICC 0xBc > #define AHCI_VEND_PAXIC 0xC0 > #define AHCI_VEND_PTC 0xC8 > > @@ -72,45 +73,57 @@ > #define DRV_NAME "ahci-ceva" > #define CEVA_FLAG_BROKEN_GEN2 1 > > +/* flag bit definition */ > +#define FLAG_COHERENT 1 > + > +/* register config value */ > +#define CEVA_PHY1_CFG 0xa003fffe > +#define CEVA_PHY2_CFG 0x28184d1f > +#define CEVA_PHY3_CFG 0x0e081509 > +#define CEVA_TRANS_CFG 0x08000029 > +#define CEVA_AXICC_CFG 0x3fffffff > + > +/* ecc addr-val pair */ > +#define ECC_DIS_ADDR_CH2 0x80000000 > +#define ECC_DIS_VAL_CH2 0x20140520 > + > +enum ceva_soc { > + CEVA_1V84, > + CEVA_LS1012A, > +}; > + > struct ceva_sata_priv { > ulong base; > + enum ceva_soc soc; > + ulong flag; > }; > > -static int ceva_init_sata(ulong mmio) > +static int ceva_init_sata(struct ceva_sata_priv *priv) > { > + ulong base = priv->base; > ulong tmp; > - int i; > - > - /* > - * AXI Data bus width to 64 > - * Set Mem Addr Read, Write ID for data transfers > - * Transfer limit to 72 DWord > - */ > - tmp = PAXIC_ADBW_BW64 | PAXIC_MAWIDD | PAXIC_MARIDD | PAXIC_OTL; > - writel(tmp, mmio + AHCI_VEND_PAXIC); > - > - /* Set AHCI Enable */ > - tmp = readl(mmio + HOST_CTL); > - tmp |= HOST_AHCI_EN; > - writel(tmp, mmio + HOST_CTL); > - > - for (i = 0; i < NR_PORTS; i++) { > - /* TPSS TPRS scalars, CISE and Port Addr */ > - tmp = PCFG_TPSS_VAL | PCFG_TPRS_VAL | (PCFG_PAD_VAL + i); > - writel(tmp, mmio + AHCI_VEND_PCFG); > - > - /* Port Phy Cfg register enables */ > - tmp = PPCFG_TTA | PPCFG_PSS_EN | PPCFG_ESDF_EN; > - writel(tmp, mmio + AHCI_VEND_PPCFG); > > - /* Rx Watermark setting */ > + switch (priv->soc) { > + case CEVA_1V84: > + tmp = PAXIC_ADBW_BW64 | PAXIC_MAWIDD | PAXIC_MARIDD | PAXIC_OTL; > + writel(tmp, base + AHCI_VEND_PAXIC); > + tmp = PCFG_TPSS_VAL | PCFG_TPRS_VAL | PCFG_PAD_VAL; > + writel(tmp, base + AHCI_VEND_PCFG); > + tmp = PPCFG_TTA | PPCFG_PSS_EN | PPCFG_ESDF_EN; > + writel(tmp, base + AHCI_VEND_PPCFG); > tmp = PTC_RX_WM_VAL | PTC_RSVD; > - writel(tmp, mmio + AHCI_VEND_PTC); > - > - /* Default to Gen 2 Speed and Gen 1 if Gen2 is broken */ > - tmp = PORT_SCTL_SPD_GEN3 | PORT_SCTL_IPM; > - writel(tmp, mmio + PORT_SCR_CTL + PORT_BASE + PORT_OFFSET * i); > + writel(tmp, base + AHCI_VEND_PTC); > + break; > + > + case CEVA_LS1012A: > + writel(ECC_DIS_ADDR_CH2, ECC_DIS_VAL_CH2); > + writel(CEVA_PHY1_CFG, base + AHCI_VEND_PPCFG); > + writel(CEVA_TRANS_CFG, base + AHCI_VEND_PTC); > + if (priv->flag & FLAG_COHERENT) > + writel(CEVA_AXICC_CFG, base + AHCI_VEND_AXICC); > + break; > } > + > return 0; > } > > @@ -125,24 +138,34 @@ static int sata_ceva_probe(struct udevice *dev) > { > struct ceva_sata_priv *priv = dev_get_priv(dev); > > - ceva_init_sata(priv->base); > + ceva_init_sata(priv); > > return ahci_probe_scsi(dev, priv->base); > } > > static const struct udevice_id sata_ceva_ids[] = { > - { .compatible = "ceva,ahci-1v84" }, > + { .compatible = "ceva,ahci-1v84", .data = CEVA_1V84 }, > + { .compatible = "fsl,ls1012a-ahci", .data = CEVA_LS1012A }, > { } > }; > > static int sata_ceva_ofdata_to_platdata(struct udevice *dev) > { > struct ceva_sata_priv *priv = dev_get_priv(dev); > + ofnode node = dev_ofnode(dev); > + > + if (!ofnode_valid(node)) > + return -EINVAL; > + > + if (ofnode_read_bool(node, "dma-coherent")) Please use of live tree functions. if (dev_read_bool(dev, "dma-coherent")) > + priv->flag |= FLAG_COHERENT; > > priv->base = devfdt_get_addr(dev); And we need to fix also this to priv->base = dev_read_addr(dev); > if (priv->base == FDT_ADDR_T_NONE) > return -EINVAL; > > + priv->soc = dev_get_driver_data(dev); > + > return 0; > } > > When above fixed please add. Reviewed-by: Michal Simek <michal.si...@xilinx.com> Tested-by: Michal Simek <michal.si...@xilinx.com> (with and without CONFIG_OF_LIVE on zynqmp zcu102) Thanks, Michal _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot