
The patch adds the RapidIO framework into U-Boot. The board configuration can be added into individual rio_init_board() function. Some functions about RapidIO can be added later.
The support for Freescale PowerPC RapidIO controller is also added.
Signed-off-by: Zhang Wei wei.zhang@freescale.com --- Makefile | 1 + drivers/rio/Makefile | 35 ++++++++++++++++++++++++++ drivers/rio/fsl_rio.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/rio/rio.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ include/common.h | 3 ++ include/rio.h | 46 ++++++++++++++++++++++++++++++++++ include/rio_ids.h | 9 +++++++ lib_ppc/board.c | 5 ++++ 8 files changed, 228 insertions(+), 0 deletions(-) create mode 100644 drivers/rio/Makefile create mode 100644 drivers/rio/fsl_rio.c create mode 100644 drivers/rio/rio.c create mode 100644 include/rio.h create mode 100644 include/rio_ids.h
diff --git a/Makefile b/Makefile index 1983ca0..1f3f26a 100644 --- a/Makefile +++ b/Makefile @@ -228,6 +228,7 @@ endif ifeq ($(CPU),mpc85xx) LIBS += drivers/qe/qe.a endif +LIBS += drivers/rio/librio.a LIBS += drivers/rtc/librtc.a LIBS += drivers/serial/libserial.a LIBS += drivers/usb/libusb.a diff --git a/drivers/rio/Makefile b/drivers/rio/Makefile new file mode 100644 index 0000000..4b940c2 --- /dev/null +++ b/drivers/rio/Makefile @@ -0,0 +1,35 @@ +# +# Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. +# +# Author: Zhang Wei, wei.zhang@freescale.com, Jan 2008 +# +# This is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# + +include $(TOPDIR)/config.mk + +LIB := $(obj)librio.a + +COBJS-y += rio.o +COBJS-y += fsl_rio.o + +COBJS := $(COBJS-y) +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +all: $(LIB) + +$(LIB): $(obj).depend $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/drivers/rio/fsl_rio.c b/drivers/rio/fsl_rio.c new file mode 100644 index 0000000..c8bfa92 --- /dev/null +++ b/drivers/rio/fsl_rio.c @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. + * + * Author: Zhang Wei, wei.zhang@freescale.com, Jan 2008 + * + * Description: + * Freescale PowerPC RapidIO controller initialization file. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ + +#include <common.h> + +#ifdef CONFIG_RAPIDIO +#include <command.h> +#include <malloc.h> +#include <rio.h> +#include <rio_ids.h> + +#include <asm/processor.h> +#include <asm/io.h> +#include <asm/immap_86xx.h> +#include <asm/io.h> + +void fsl_rio_init(void *base, int busno) +{ + struct rio_dev *dev; + volatile ccsr_rio_t *rio = base; + struct rio_controller *hose; + + dev = malloc(sizeof(struct rio_dev)); + memset(dev, 0, sizeof(struct rio_dev)); + + dev->vendor = in_be32(&rio->didcar) & 0xffff; + dev->device = (in_be32(&rio->didcar) >> 16) & 0xffff; + + hose = malloc(sizeof(struct rio_controller)); + memset(hose, 0, sizeof(struct rio_controller)); + + INIT_LIST_HEAD(&hose->dev_list); + hose->busno = busno; + hose->base = base; + hose->self = dev; + list_add_tail(&hose->node, &rio_hose_list); + + printf("RIO%d (%04x:%04x) on 0x%08x\n", hose->busno, dev->vendor, + dev->device, base); +} + +void fsl_rio_quirk(struct rio_controller *hose, struct rio_dev *rdev) +{ +#ifdef FSL_RIO_IP_V2 + volatile ccsr_rio_t *rio = hose->base; + /* Set the controller to accept all packets + * without checking the target ID + */ + out_be32(&rio->ptaacr, 1); +#endif +} +#endif diff --git a/drivers/rio/rio.c b/drivers/rio/rio.c new file mode 100644 index 0000000..9391384 --- /dev/null +++ b/drivers/rio/rio.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2008 Freescale Semiconductor, Inc. All rights reserved. + * + * Author: Zhang Wei, wei.zhang@freescale.com, Jun 2007 + * + * Description: + * RapidIO initialization file. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ + +#include <common.h> + +#ifdef CONFIG_RAPIDIO + +#include <command.h> +#include <linux/list.h> +#include <rio.h> +#include <rio_ids.h> +#include <asm/processor.h> +#include <asm/io.h> + +struct list_head rio_hose_list; + +struct rio_quirk rio_post_quirk[] = { + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8548E, fsl_rio_quirk}, + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8548, fsl_rio_quirk}, + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8568E, fsl_rio_quirk}, + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8568, fsl_rio_quirk}, + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8641, fsl_rio_quirk}, + {RIO_VENDOR_ID_FREESCALE, RIO_DEVICE_ID_MPC8641D, fsl_rio_quirk}, + {}, +}; + +void rio_hose_post(void) +{ + struct rio_controller *hose; + struct rio_quirk *post_quirk; + + list_for_each_entry(hose, &rio_hose_list, node) + for (post_quirk = rio_post_quirk; + post_quirk->vendor || post_quirk->device; post_quirk++) + if ((post_quirk->vendor == hose->self->vendor) + && (post_quirk->device == hose->self->device) + && post_quirk->quirk) { + post_quirk->quirk(hose, hose->self); + break; + } +} + +void rio_init(void) +{ + INIT_LIST_HEAD(&rio_hose_list); + + /* Call board specific rio_init() */ + rio_init_board(); + + rio_hose_post(); +} + +#endif /* CONFIG_RAPIDIO */ diff --git a/include/common.h b/include/common.h index 9ef9344..84ff943 100644 --- a/include/common.h +++ b/include/common.h @@ -275,6 +275,9 @@ void pciinfo (int, int); #endif #endif
+void rio_init (void); +void rio_init_board(void); + int misc_init_f (void); int misc_init_r (void);
diff --git a/include/rio.h b/include/rio.h new file mode 100644 index 0000000..379c56c --- /dev/null +++ b/include/rio.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + */ + +#ifndef __INCLUDE_RIO_H_ +#define __INCLUDE_RIO_H_ + +#include <linux/list.h> + +struct rio_dev { + struct list_head node; + u16 vendor; /* Vendor ID */ + u16 device; /* Device ID */ + + u32 devno; /* Device number */ + u32 hostno; /* Host number in the bus */ +}; + +struct rio_controller { + struct list_head node; + struct list_head dev_list; + + int busno; + + struct rio_dev *self; /* Controler RIO device */ + void *base; /* Register base */ +}; + +struct rio_quirk { + u16 vendor; + u16 device; + void (*quirk)(struct rio_controller *hose, struct rio_dev *dev); +}; + +void fsl_rio_init(void *base, int busno); +void fsl_rio_quirk(struct rio_controller *hose, struct rio_dev *rdev); + +extern struct list_head rio_hose_list; + +#endif /* __INCLUDE_RIO_H_ */ diff --git a/include/rio_ids.h b/include/rio_ids.h new file mode 100644 index 0000000..b6a4ab8 --- /dev/null +++ b/include/rio_ids.h @@ -0,0 +1,9 @@ + +#define RIO_VENDOR_ID_FREESCALE 0x0002 + +#define RIO_DEVICE_ID_MPC8548E 0x0012 +#define RIO_DEVICE_ID_MPC8548 0x0013 +#define RIO_DEVICE_ID_MPC8568E 0x0020 +#define RIO_DEVICE_ID_MPC8568 0x0021 +#define RIO_DEVICE_ID_MPC8641 0x7010 +#define RIO_DEVICE_ID_MPC8641D 0x7011 diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 0719745..75746ff 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -921,6 +921,11 @@ void board_init_r (gd_t *id, ulong dest_addr) pci_init (); #endif
+#if defined(CONFIG_RAPIDIO) + /* Do RapidIO configuration */ + rio_init (); +#endif + /** leave this here (after malloc(), environment and PCI are working) **/ /* Initialize devices */ devices_init ();