blob: b5ae2ea3eb56db1920a0e123c0190153ffa0f32d [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
J. German Rivera7b3bd9a2015-01-06 13:19:02 -08002/*
3 * Freescale Layerscape MC I/O wrapper
4 *
Prabhakar Kushwahaa2a55e52015-03-19 09:20:45 -07005 * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
J. German Rivera7b3bd9a2015-01-06 13:19:02 -08006 * Author: German Rivera <German.Rivera@freescale.com>
J. German Rivera7b3bd9a2015-01-06 13:19:02 -08007 */
8
9#include <fsl-mc/fsl_mc_sys.h>
10#include <fsl-mc/fsl_mc_cmd.h>
11#include <common.h>
12#include <errno.h>
13#include <asm/io.h>
Simon Glassc05ed002020-05-10 11:40:11 -060014#include <linux/delay.h>
J. German Rivera7b3bd9a2015-01-06 13:19:02 -080015
16#define MC_CMD_HDR_READ_CMDID(_hdr) \
Prabhakar Kushwaha87457d12015-07-07 15:40:06 +053017 ((uint16_t)mc_dec((_hdr), MC_CMD_HDR_CMDID_O, MC_CMD_HDR_CMDID_S))
J. German Rivera7b3bd9a2015-01-06 13:19:02 -080018
19/**
20 * mc_send_command - Send MC command and wait for response
21 *
22 * @mc_io: Pointer to MC I/O object to be used
23 * @cmd: MC command buffer. On input, it contains the command to send to the MC.
24 * On output, it contains the response from the MC if any.
25 *
26 * Depending on the sharing option specified when creating the MC portal
27 * wrapper, this function will use a spinlock or mutex to ensure exclusive
28 * access to the MC portal from the point when the command is sent until a
29 * response is received from the MC.
30 */
31int mc_send_command(struct fsl_mc_io *mc_io,
32 struct mc_command *cmd)
33{
34 enum mc_cmd_status status;
Prabhakar Kushwaha553d2752015-11-04 12:25:57 +053035 int timeout = 12000;
J. German Rivera7b3bd9a2015-01-06 13:19:02 -080036
37 mc_write_command(mc_io->mmio_regs, cmd);
38
39 for ( ; ; ) {
40 status = mc_read_response(mc_io->mmio_regs, cmd);
41 if (status != MC_CMD_STATUS_READY)
42 break;
43
44 if (--timeout == 0) {
45 printf("Error: Timeout waiting for MC response\n");
46 return -ETIMEDOUT;
47 }
48
49 udelay(500);
50 }
51
52 if (status != MC_CMD_STATUS_OK) {
53 printf("Error: MC command failed (portal: %p, obj handle: %#x, command: %#x, status: %#x)\n",
54 mc_io->mmio_regs,
Prabhakar Kushwahaa2a55e52015-03-19 09:20:45 -070055 (unsigned int)MC_CMD_HDR_READ_TOKEN(cmd->header),
J. German Rivera7b3bd9a2015-01-06 13:19:02 -080056 (unsigned int)MC_CMD_HDR_READ_CMDID(cmd->header),
57 (unsigned int)status);
58
59 return -EIO;
60 }
61
62 return 0;
63}