Management Complex wrapper functions are built upon the Management Complex hardware interface. These wrapper functions are OS dependent, which vary in U-boot and Linux. Current patch supports MC portal flib version 0.4.
Signed-off-by: Lijun Pan <lijun....@freescale.com> --- arch/arm/cpu/armv8/fsl-lsch3/cpu.c | 2 +- board/freescale/ls2085a/ls2085a.c | 2 +- drivers/net/fsl_mc/Makefile | 4 +- drivers/net/fsl_mc/fsl_mc_dpmng_cmd_wrappers.c | 29 +++++++++ drivers/net/fsl_mc/fsl_mc_io_wrapper.c | 89 ++++++++++++++++++++++++++ drivers/net/fsl_mc/mc.c | 2 +- include/{ => layerscape}/fsl_mc.h | 0 include/layerscape/fsl_mc_dpmng_cmd_wrappers.h | 19 ++++++ include/layerscape/fsl_mc_io_wrapper.h | 25 ++++++++ 9 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 drivers/net/fsl_mc/fsl_mc_dpmng_cmd_wrappers.c create mode 100644 drivers/net/fsl_mc/fsl_mc_io_wrapper.c rename include/{ => layerscape}/fsl_mc.h (100%) create mode 100644 include/layerscape/fsl_mc_dpmng_cmd_wrappers.h create mode 100644 include/layerscape/fsl_mc_io_wrapper.h diff --git a/arch/arm/cpu/armv8/fsl-lsch3/cpu.c b/arch/arm/cpu/armv8/fsl-lsch3/cpu.c index c129d03..e05567e 100644 --- a/arch/arm/cpu/armv8/fsl-lsch3/cpu.c +++ b/arch/arm/cpu/armv8/fsl-lsch3/cpu.c @@ -10,9 +10,9 @@ #include <asm/armv8/mmu.h> #include <asm/io.h> #include <asm/arch-fsl-lsch3/immap_lsch3.h> +#include <layerscape/fsl_mc.h> #include "cpu.h" #include "speed.h" -#include <fsl_mc.h> DECLARE_GLOBAL_DATA_PTR; diff --git a/board/freescale/ls2085a/ls2085a.c b/board/freescale/ls2085a/ls2085a.c index a18db1d..263a604 100644 --- a/board/freescale/ls2085a/ls2085a.c +++ b/board/freescale/ls2085a/ls2085a.c @@ -12,7 +12,7 @@ #include <asm/io.h> #include <fdt_support.h> #include <libfdt.h> -#include <fsl_mc.h> +#include <layerscape/fsl_mc.h> DECLARE_GLOBAL_DATA_PTR; diff --git a/drivers/net/fsl_mc/Makefile b/drivers/net/fsl_mc/Makefile index 4834086..1470c40 100644 --- a/drivers/net/fsl_mc/Makefile +++ b/drivers/net/fsl_mc/Makefile @@ -5,4 +5,6 @@ # # Layerscape MC driver -obj-y += mc.o +obj-y += mc.o \ + fsl_mc_io_wrapper.o \ + fsl_mc_dpmng_cmd_wrappers.o diff --git a/drivers/net/fsl_mc/fsl_mc_dpmng_cmd_wrappers.c b/drivers/net/fsl_mc/fsl_mc_dpmng_cmd_wrappers.c new file mode 100644 index 0000000..613439f --- /dev/null +++ b/drivers/net/fsl_mc/fsl_mc_dpmng_cmd_wrappers.c @@ -0,0 +1,29 @@ +/* + * Freescale Layerscape MC DPMNG command wrappers + * + * Copyright (C) 2014 Freescale Semiconductor, Inc. + * Author: German Rivera <german.riv...@freescale.com> + * Lijun Pan <lijun....@freescale.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <linux/types.h> +#include <linux/string.h> +#include <layerscape/fsl_mc_dpmng_cmd_wrappers.h> +#include <layerscape/fsl_mc_io_wrapper.h> + +int mc_get_version(struct mc_portal_wrapper *mc_portal, + struct mc_version *mc_ver_info) +{ + int error; + struct mc_command cmd; + + build_cmd_mc_get_version(&cmd); + error = mc_portal_wrapper_send_command(mc_portal, &cmd); + if (error < 0) + return error; + + parse_resp_mc_get_version(&cmd, mc_ver_info); + return 0; +} diff --git a/drivers/net/fsl_mc/fsl_mc_io_wrapper.c b/drivers/net/fsl_mc/fsl_mc_io_wrapper.c new file mode 100644 index 0000000..47938a7 --- /dev/null +++ b/drivers/net/fsl_mc/fsl_mc_io_wrapper.c @@ -0,0 +1,89 @@ +/* + * Freescale Layerscape MC I/O wrapper + * + * Copyright (C) 2014 Freescale Semiconductor, Inc. + * Author: German Rivera <german.riv...@freescale.com> + * Lijun Pan <lijun....@freescale.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <errno.h> +#include <asm/io.h> +#include <layerscape/fsl_mc_io_wrapper.h> +#include <layerscape/mc_hardware/fsl_mc_io.h> + +/** + * mc_portal_wrapper_send_command - Send MC command and wait for response + * + * @mc_portal: Pointer to MC portal wrapper to be used + * @cmd: MC command buffer. On input, it contains the command to send to the MC. + * On output, it contains the response from the MC if any. + * + * Depending on the sharing option specified when creating the MC portal + * wrapper, this function will use a spinlock or mutex to ensure exclusive + * access to the MC portal from the point when the command is sent until a + * response is received from the MC. + */ +int mc_portal_wrapper_send_command(struct mc_portal_wrapper *mc_portal, + struct mc_command *cmd) +{ + enum mc_cmd_status status; + int error; + int timeout = 2000; + + mc_write_command(mc_portal->mmio_regs, cmd); + + do { + udelay(1000); /* throttle polling */ + if (timeout-- <= 0) { + error = -ETIMEDOUT; + goto out; + } + status = mc_read_response(mc_portal->mmio_regs, cmd); + } while (status == MC_CMD_STATUS_READY); + /* MC_CMD_STATUS_READY means command has been send to MC portal, it is + * ready to read the result from the MC portal. */ + + switch (status) { + case MC_CMD_STATUS_OK: + error = 0; + break; + case MC_CMD_STATUS_AUTH_ERR: + error = -EACCES; /* Authentication error */ + break; + case MC_CMD_STATUS_NO_PRIVILEGE: + error = -EPERM; /* Permission denied */ + break; + case MC_CMD_STATUS_DMA_ERR: + error = -EIO; /* Input/Output error */ + break; + case MC_CMD_STATUS_CONFIG_ERR: + error = -EINVAL; /* Device not configured */ + break; + case MC_CMD_STATUS_TIMEOUT: + error = -ETIMEDOUT; /* Operation timed out */ + break; + case MC_CMD_STATUS_NO_RESOURCE: + error = -ENAVAIL; /* Resource temporarily unavailable */ + break; + case MC_CMD_STATUS_NO_MEMORY: + error = -ENOMEM; /* Cannot allocate memory */ + break; + case MC_CMD_STATUS_BUSY: + error = -EBUSY; /* Device busy */ + break; + case MC_CMD_STATUS_UNSUPPORTED_OP: + error = -EINVAL; /* Operation not supported by device */ + break; + case MC_CMD_STATUS_INVALID_STATE: + error = -ENODEV; /* Invalid device state */ + break; + default: + error = -EINVAL; + } + +out: + return error; +} diff --git a/drivers/net/fsl_mc/mc.c b/drivers/net/fsl_mc/mc.c index df84568..e8ee4f3 100644 --- a/drivers/net/fsl_mc/mc.c +++ b/drivers/net/fsl_mc/mc.c @@ -5,7 +5,7 @@ */ #include <errno.h> #include <asm/io.h> -#include <fsl_mc.h> +#include <layerscape/fsl_mc.h> DECLARE_GLOBAL_DATA_PTR; static int mc_boot_status; diff --git a/include/fsl_mc.h b/include/layerscape/fsl_mc.h similarity index 100% rename from include/fsl_mc.h rename to include/layerscape/fsl_mc.h diff --git a/include/layerscape/fsl_mc_dpmng_cmd_wrappers.h b/include/layerscape/fsl_mc_dpmng_cmd_wrappers.h new file mode 100644 index 0000000..532db1e --- /dev/null +++ b/include/layerscape/fsl_mc_dpmng_cmd_wrappers.h @@ -0,0 +1,19 @@ +/* + * Freescale Layerscape Management Complex (MC) dpmng command wrappers + * + * Copyright (C) 2014 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _FSL_MC_DPMNG_CMD_WRAPPERS_H +#define _FSL_MC_DPMNG_CMD_WRAPPERS_H + +#include <layerscape/mc_hardware/fsl_mc_dpmng_commands.h> + +struct mc_portal_wrapper; + +int mc_get_version(struct mc_portal_wrapper *mc_portal, + struct mc_version *mc_ver_info); + +#endif /* _FSL_MC_DPMNG_CMD_WRAPPERS_H */ diff --git a/include/layerscape/fsl_mc_io_wrapper.h b/include/layerscape/fsl_mc_io_wrapper.h new file mode 100644 index 0000000..6aed2ce --- /dev/null +++ b/include/layerscape/fsl_mc_io_wrapper.h @@ -0,0 +1,25 @@ +/* + * Freescale Layerscape Management Complex (MC) I/O wrapper + * + * Copyright (C) 2014 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _FSL_MC_IO_WRAPPER_H +#define _FSL_MC_IO_WRAPPER_H + +#include <asm/io.h> + +/* + * struct mc_portal_wrapper - MC command portal wrapper object + */ +struct mc_portal_wrapper { + struct mc_command __iomem *mmio_regs; +}; + +int __must_check mc_portal_wrapper_send_command(struct mc_portal_wrapper + *mc_portal, + struct mc_command *cmd); + +#endif /* _FSL_MC_IO_WRAPPER_H */ -- 1.9.3 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot