[U-Boot] [PATCH 1/3] driver/mc: Add Layerscape Management Complex hardware interface
Lijun Pan
Lijun.Pan at freescale.com
Fri Aug 1 05:13:08 CEST 2014
Management Complex (MC) Portal is an interface between MC firmware
and U-boot/Linux. U-boot/Linux could interact with MC firmware
through sending/receiving MC commands to/from MC firmware.
This patch enables the hardware interface between MC firmware and
U-boot/Linux. Current patch supports MC portal flib version 0.4.
Signed-off-by: Lijun Pan <Lijun.Pan at freescale.com>
---
include/layerscape/mc_hardware/fsl_mc_cmd_common.h | 54 ++++++++++++++++++
.../layerscape/mc_hardware/fsl_mc_dpmng_commands.h | 60 ++++++++++++++++++++
include/layerscape/mc_hardware/fsl_mc_io.h | 65 ++++++++++++++++++++++
3 files changed, 179 insertions(+)
create mode 100644 include/layerscape/mc_hardware/fsl_mc_cmd_common.h
create mode 100644 include/layerscape/mc_hardware/fsl_mc_dpmng_commands.h
create mode 100644 include/layerscape/mc_hardware/fsl_mc_io.h
diff --git a/include/layerscape/mc_hardware/fsl_mc_cmd_common.h b/include/layerscape/mc_hardware/fsl_mc_cmd_common.h
new file mode 100644
index 0000000..bf2a3d0
--- /dev/null
+++ b/include/layerscape/mc_hardware/fsl_mc_cmd_common.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __FSL_MC_CMD_COMMON_H
+#define __FSL_MC_CMD_COMMON_H
+
+#define MC_CMD_NUM_OF_PARAMS 7
+
+struct mc_command {
+ uint64_t header;
+ uint64_t params[MC_CMD_NUM_OF_PARAMS];
+};
+
+enum mc_cmd_status {
+ MC_CMD_STATUS_OK = 0x0, /* passed */
+ MC_CMD_STATUS_READY = 0x1, /* Ready to be processed */
+ MC_CMD_STATUS_AUTH_ERR = 0x3, /* Authentication error */
+ MC_CMD_STATUS_NO_PRIVILEGE = 0x4,
+ MC_CMD_STATUS_DMA_ERR = 0x5,
+ MC_CMD_STATUS_CONFIG_ERR = 0x6,
+ MC_CMD_STATUS_TIMEOUT = 0x7,
+ MC_CMD_STATUS_NO_RESOURCE = 0x8,
+ MC_CMD_STATUS_NO_MEMORY = 0x9,
+ MC_CMD_STATUS_BUSY = 0xA,
+ MC_CMD_STATUS_UNSUPPORTED_OP = 0xB,
+ MC_CMD_STATUS_INVALID_STATE = 0xC
+};
+
+/*
+ * MC command priorities
+ */
+enum mc_cmd_priorities {
+ CMDIF_PRI_LOW = 0, /* Low Priority command indication */
+ CMDIF_PRI_HIGH = 1 /* High Priority command indication */
+};
+
+static inline uint64_t mc_encode_cmd_header(uint16_t cmd_id,
+ uint8_t cmd_size,
+ uint8_t priority, uint16_t auth_id)
+{
+ uint64_t header;
+
+ header = (cmd_id & 0xfffULL) << 52;
+ header |= (auth_id & 0x3ffULL) << 38;
+ header |= (cmd_size & 0x3fULL) << 31;
+ header |= (priority & 0x1ULL) << 15;
+ header |= (MC_CMD_STATUS_READY & 0xff) << 16;
+
+ return header;
+}
+#endif /* __FSL_MC_CMD_COMMON_H */
diff --git a/include/layerscape/mc_hardware/fsl_mc_dpmng_commands.h b/include/layerscape/mc_hardware/fsl_mc_dpmng_commands.h
new file mode 100644
index 0000000..fa3c078
--- /dev/null
+++ b/include/layerscape/mc_hardware/fsl_mc_dpmng_commands.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * fsl_mc_dpmng_commands.h
+ * Management Complex (MC) Data Path Management commands
+ */
+#ifndef _FSL_MC_DPMNG_COMMANDS_H
+#define _FSL_MC_DPMNG_COMMANDS_H
+
+#include <layerscape/mc_hardware/fsl_mc_cmd_common.h>
+#include <linux/compat.h>
+
+/*
+ * Define Management Complex firmware version information
+ */
+#define MC_VER_MAJOR 2
+#define MC_VER_MINOR 0
+
+/*
+ * Management Complex firmware version information
+ */
+struct mc_version {
+ uint32_t major;
+ /* Major version number: incremented on API compatibility changes */
+ uint32_t minor;
+ /* Minor version number: incremented on API additions (backward
+ * compatible); reset when major version is incremented. */
+ uint32_t revision;
+ /* Internal revision number: incremented on implementation changes
+ * and/or bug fixes that have no impact on API */
+};
+
+/*
+ * Retrieves the Management Complex firmware version information
+ */
+#define DPMNG_CMDID_GET_VERSION 0x831
+#define DPMNG_CMDSZ_GET_VERSION (8 * 2)
+
+static inline void build_cmd_mc_get_version(struct mc_command *cmd)
+{
+ cmd->header = mc_encode_cmd_header(DPMNG_CMDID_GET_VERSION,
+ DPMNG_CMDSZ_GET_VERSION,
+ CMDIF_PRI_LOW, 0);
+
+ memset(cmd->params, 0, sizeof(cmd->params));
+}
+
+static inline void parse_resp_mc_get_version(struct mc_command *cmd,
+ struct mc_version *mc_ver_info)
+{
+ mc_ver_info->revision = lower_32_bits(cmd->params[0]);
+ mc_ver_info->major = upper_32_bits(cmd->params[0]);
+ mc_ver_info->minor = cmd->params[1] & 0xff;
+}
+
+#endif /* _FSL_MC_DPMNG_COMMANDS_H */
diff --git a/include/layerscape/mc_hardware/fsl_mc_io.h b/include/layerscape/mc_hardware/fsl_mc_io.h
new file mode 100644
index 0000000..f121238
--- /dev/null
+++ b/include/layerscape/mc_hardware/fsl_mc_io.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __FSL_MC_IO_H
+#define __FSL_MC_IO_H
+
+#include <layerscape/mc_hardware/fsl_mc_cmd_common.h>
+
+/**
+ * mc_write_command - writes a command to a Management Complex (MC) portal
+ *
+ * @portal_regs: pointer to an MC portal's MMIO registers
+ * @cmd: pointer to a filled command
+ */
+static inline void __must_check mc_write_command(struct mc_command __iomem *
+ portal_regs,
+ struct mc_command *cmd)
+{
+ int i;
+
+ /* copy command parameters into the portal MMIO registers */
+ for (i = 0; i < MC_CMD_NUM_OF_PARAMS; i++)
+ writeq(cmd->params[i], &portal_regs->params[i]);
+
+ /* submit the command by writing the header */
+ writeq(cmd->header, &portal_regs->header);
+}
+
+/**
+ * mc_read_response - reads the response for the last MC command from a
+ * Management Complex (MC) portal
+ *
+ * @portal_regs: pointer to an MC portal's MMIO registers
+ * @response: pointer to command response buffer
+ *
+ * Returns MC_CMD_STATUS_OK on Success; Error code otherwise.
+ */
+static inline enum mc_cmd_status __must_check mc_read_response(struct mc_command
+ __iomem *
+ portal_regs,
+ struct mc_command
+ *response)
+{
+ int i;
+ enum mc_cmd_status status;
+
+ /* Copy command response header from MC portal MMIO space: */
+ response->header = readq(&portal_regs->header);
+ status = (response->header >> 16) & 0xff;
+
+ if (status != MC_CMD_STATUS_OK)
+ goto out;
+
+ /* Copy command response data from MC portal MMIO space: */
+ for (i = 0; i < MC_CMD_NUM_OF_PARAMS; i++)
+ response->params[i] = readq(&portal_regs->params[i]);
+
+out:
+ return status;
+}
+
+#endif /* __FSL_MC_IO_H */
--
1.9.3
More information about the U-Boot
mailing list