[U-Boot] [PATCH 3/4] scsi: ceva: add ls1012a soc support
Michal Simek
michal.simek at xilinx.com
Mon May 28 08:29:01 UTC 2018
On 25.5.2018 11:06, andy.tang at nxp.com wrote:
> From: Yuantian Tang <andy.tang at 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.tang at 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.simek at xilinx.com>
Tested-by: Michal Simek <michal.simek at xilinx.com>
(with and without CONFIG_OF_LIVE on zynqmp zcu102)
Thanks,
Michal
More information about the U-Boot
mailing list