ufs: Add a PCI based UFS controller driver

This adds a simple PCI based UFS controller driver with a QEMU
emulated UFS controller on the PCI bus.

Requiring QEMU v8.2+.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Neha Malcom Francis <n-francis@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Bin Meng 2023-10-11 21:15:50 +08:00 committed by Tom Rini
parent e5c19ce47c
commit 2ec7d657c0
3 changed files with 57 additions and 0 deletions

View file

@ -15,6 +15,17 @@ config CADENCE_UFS
This selects the platform driver for the Cadence UFS host This selects the platform driver for the Cadence UFS host
controller present on present TI's J721e devices. controller present on present TI's J721e devices.
config UFS_PCI
bool "PCI bus based UFS Controller support"
depends on PCI && UFS
help
This selects the PCI UFS Host Controller Interface. Select this if
you have UFS Host Controller with PCI Interface.
If you have a controller with this interface, say Y here.
If unsure, say N.
config TI_J721E_UFS config TI_J721E_UFS
bool "Glue Layer driver for UFS on TI J721E devices" bool "Glue Layer driver for UFS on TI J721E devices"
help help

View file

@ -6,4 +6,5 @@
obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o
obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o
obj-$(CONFIG_TI_J721E_UFS) += ti-j721e-ufs.o obj-$(CONFIG_TI_J721E_UFS) += ti-j721e-ufs.o
obj-$(CONFIG_UFS_PCI) += ufs-pci.o
obj-$(CONFIG_UFS_RENESAS) += ufs-renesas.o obj-$(CONFIG_UFS_RENESAS) += ufs-renesas.o

45
drivers/ufs/ufs-pci.c Normal file
View file

@ -0,0 +1,45 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2023 tinylab.org
* Author: Bin Meng <bmeng@tinylab.org>
*/
#include <common.h>
#include <dm.h>
#include <errno.h>
#include <pci.h>
#include <ufs.h>
#include <dm/device_compat.h>
#include "ufs.h"
static int ufs_pci_bind(struct udevice *dev)
{
struct udevice *scsi_dev;
return ufs_scsi_bind(dev, &scsi_dev);
}
static int ufs_pci_probe(struct udevice *dev)
{
int err;
err = ufshcd_probe(dev, NULL);
if (err)
dev_err(dev, "%s failed (ret=%d)\n", __func__, err);
return err;
}
U_BOOT_DRIVER(ufs_pci) = {
.name = "ufs_pci",
.id = UCLASS_UFS,
.bind = ufs_pci_bind,
.probe = ufs_pci_probe,
};
static struct pci_device_id ufs_supported[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_UFS) },
{},
};
U_BOOT_PCI_DEVICE(ufs_pci, ufs_supported);