[U-Boot] [PATCH 2/3] driver/mc: Add Layerscape Management Complex wrapper function
Lijun Pan
Lijun.Pan at freescale.com
Fri Aug 1 05:13:09 CEST 2014
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.Pan at 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.Rivera at freescale.com>
+ * Lijun Pan <Lijun.Pan at 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.Rivera at freescale.com>
+ * Lijun Pan <Lijun.Pan at 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
More information about the U-Boot
mailing list