[U-Boot] [PATCH 4/5] x86: Support PCI UART in the x86_serial driver

Simon Glass sjg at chromium.org
Fri Dec 19 22:52:27 CET 2014


Hi BIn,

On 19 December 2014 at 00:19, Bin Meng <bmeng.cn at gmail.com> wrote:
> Newer x86 Platform Controller Hub chipset starts to integrate NS16550
> compatible PCI UART devices. The board configuration file needs to
> supply the PCI UART vendor ID and device ID via CONFIG_PCI_UART_DEV
> if we want to use the PCI UART as the U-Boot serial console.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
>  drivers/serial/serial_x86.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
>
> diff --git a/drivers/serial/serial_x86.c b/drivers/serial/serial_x86.c
> index e81e035..7ddd596 100644
> --- a/drivers/serial/serial_x86.c
> +++ b/drivers/serial/serial_x86.c
> @@ -8,6 +8,17 @@
>  #include <dm.h>
>  #include <ns16550.h>
>  #include <serial.h>
> +#include <asm/pci.h>
> +#include <errno.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#ifdef CONFIG_PCI_UART
> +static struct pci_device_id uart_supported[] = {
> +       CONFIG_PCI_UART_DEV,
> +       { }
> +};
> +#endif
>
>  static const struct udevice_id x86_serial_ids[] = {
>         { .compatible = "x86-uart" },
> @@ -17,6 +28,9 @@ static const struct udevice_id x86_serial_ids[] = {
>  static int x86_serial_ofdata_to_platdata(struct udevice *dev)
>  {
>         struct ns16550_platdata *plat = dev_get_platdata(dev);
> +#ifdef CONFIG_PCI_UART
> +       pci_dev_t devbusfn;
> +#endif
>         int ret;
>
>         ret = ns16550_serial_ofdata_to_platdata(dev);
> @@ -24,6 +38,22 @@ static int x86_serial_ofdata_to_platdata(struct udevice *dev)
>                 return ret;
>         plat->clock = 1843200;
>
> +#ifdef CONFIG_PCI_UART
> +       /*
> +        * Newer x86 Platform Controller Hub chipset starts to integrate
> +        * NS16550 compatible PCI UART devices. The board configuration
> +        * file needs to supply the PCI UART vendor ID and device ID via
> +        * CONFIG_PCI_UART_DEV if we want to use the PCI UART as the U-Boot
> +        * serial console.
> +        */
> +       devbusfn = pci_early_find_devices(uart_supported, 0);
> +       if (devbusfn == -1)
> +               return -ENODEV;

I'm not sure why we need this. Is it because we don't know the device
address of the UART?

> +
> +       /* override the register base here for PCI UART */
> +       plat->base = pci_read_bar32(gd->arch.hose, devbusfn, 0);
> +#endif
> +
>         return 0;
>  }
>  U_BOOT_DRIVER(serial_ns16550) = {
> --
> 1.8.2.1
>

Regards,
Simon


More information about the U-Boot mailing list