162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ARConnect IP Support (Multi core enabler: Cross core IPI, RTC ...)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __SOC_ARC_MCIP_H
962306a36Sopenharmony_ci#define __SOC_ARC_MCIP_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <soc/arc/aux.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define ARC_REG_MCIP_BCR	0x0d0
1462306a36Sopenharmony_ci#define ARC_REG_MCIP_IDU_BCR	0x0D5
1562306a36Sopenharmony_ci#define ARC_REG_GFRC_BUILD	0x0D6
1662306a36Sopenharmony_ci#define ARC_REG_MCIP_CMD	0x600
1762306a36Sopenharmony_ci#define ARC_REG_MCIP_WDATA	0x601
1862306a36Sopenharmony_ci#define ARC_REG_MCIP_READBACK	0x602
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct mcip_cmd {
2162306a36Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN
2262306a36Sopenharmony_ci	unsigned int pad:8, param:16, cmd:8;
2362306a36Sopenharmony_ci#else
2462306a36Sopenharmony_ci	unsigned int cmd:8, param:16, pad:8;
2562306a36Sopenharmony_ci#endif
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define CMD_INTRPT_GENERATE_IRQ		0x01
2862306a36Sopenharmony_ci#define CMD_INTRPT_GENERATE_ACK		0x02
2962306a36Sopenharmony_ci#define CMD_INTRPT_READ_STATUS		0x03
3062306a36Sopenharmony_ci#define CMD_INTRPT_CHECK_SOURCE		0x04
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* Semaphore Commands */
3362306a36Sopenharmony_ci#define CMD_SEMA_CLAIM_AND_READ		0x11
3462306a36Sopenharmony_ci#define CMD_SEMA_RELEASE		0x12
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define CMD_DEBUG_SET_MASK		0x34
3762306a36Sopenharmony_ci#define CMD_DEBUG_READ_MASK		0x35
3862306a36Sopenharmony_ci#define CMD_DEBUG_SET_SELECT		0x36
3962306a36Sopenharmony_ci#define CMD_DEBUG_READ_SELECT		0x37
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define CMD_GFRC_READ_LO		0x42
4262306a36Sopenharmony_ci#define CMD_GFRC_READ_HI		0x43
4362306a36Sopenharmony_ci#define CMD_GFRC_SET_CORE		0x47
4462306a36Sopenharmony_ci#define CMD_GFRC_READ_CORE		0x48
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define CMD_IDU_ENABLE			0x71
4762306a36Sopenharmony_ci#define CMD_IDU_DISABLE			0x72
4862306a36Sopenharmony_ci#define CMD_IDU_SET_MODE		0x74
4962306a36Sopenharmony_ci#define CMD_IDU_READ_MODE		0x75
5062306a36Sopenharmony_ci#define CMD_IDU_SET_DEST		0x76
5162306a36Sopenharmony_ci#define CMD_IDU_ACK_CIRQ		0x79
5262306a36Sopenharmony_ci#define CMD_IDU_SET_MASK		0x7C
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define IDU_M_TRIG_LEVEL		0x0
5562306a36Sopenharmony_ci#define IDU_M_TRIG_EDGE			0x1
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define IDU_M_DISTRI_RR			0x0
5862306a36Sopenharmony_ci#define IDU_M_DISTRI_DEST		0x2
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistruct mcip_bcr {
6262306a36Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN
6362306a36Sopenharmony_ci		unsigned int pad4:6, pw_dom:1, pad3:1,
6462306a36Sopenharmony_ci			     idu:1, pad2:1, num_cores:6,
6562306a36Sopenharmony_ci			     pad:1,  gfrc:1, dbg:1, pw:1,
6662306a36Sopenharmony_ci			     msg:1, sem:1, ipi:1, slv:1,
6762306a36Sopenharmony_ci			     ver:8;
6862306a36Sopenharmony_ci#else
6962306a36Sopenharmony_ci		unsigned int ver:8,
7062306a36Sopenharmony_ci			     slv:1, ipi:1, sem:1, msg:1,
7162306a36Sopenharmony_ci			     pw:1, dbg:1, gfrc:1, pad:1,
7262306a36Sopenharmony_ci			     num_cores:6, pad2:1, idu:1,
7362306a36Sopenharmony_ci			     pad3:1, pw_dom:1, pad4:6;
7462306a36Sopenharmony_ci#endif
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct mcip_idu_bcr {
7862306a36Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN
7962306a36Sopenharmony_ci	unsigned int pad:21, cirqnum:3, ver:8;
8062306a36Sopenharmony_ci#else
8162306a36Sopenharmony_ci	unsigned int ver:8, cirqnum:3, pad:21;
8262306a36Sopenharmony_ci#endif
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/*
8762306a36Sopenharmony_ci * Build register for IDU contains not an actual number of supported common
8862306a36Sopenharmony_ci * interrupts but an exponent of 2 which must be multiplied by 4 to
8962306a36Sopenharmony_ci * get a number of supported common interrupts.
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_ci#define mcip_idu_bcr_to_nr_irqs(bcr) (4 * (1 << (bcr).cirqnum))
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/*
9462306a36Sopenharmony_ci * MCIP programming model
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci * - Simple commands write {cmd:8,param:16} to MCIP_CMD aux reg
9762306a36Sopenharmony_ci *   (param could be irq, common_irq, core_id ...)
9862306a36Sopenharmony_ci * - More involved commands setup MCIP_WDATA with cmd specific data
9962306a36Sopenharmony_ci *   before invoking the simple command
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_cistatic inline void __mcip_cmd(unsigned int cmd, unsigned int param)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	struct mcip_cmd buf;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	buf.pad = 0;
10662306a36Sopenharmony_ci	buf.cmd = cmd;
10762306a36Sopenharmony_ci	buf.param = param;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	WRITE_AUX(ARC_REG_MCIP_CMD, buf);
11062306a36Sopenharmony_ci}
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/*
11362306a36Sopenharmony_ci * Setup additional data for a cmd
11462306a36Sopenharmony_ci * Callers need to lock to ensure atomicity
11562306a36Sopenharmony_ci */
11662306a36Sopenharmony_cistatic inline void __mcip_cmd_data(unsigned int cmd, unsigned int param,
11762306a36Sopenharmony_ci				   unsigned int data)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	write_aux_reg(ARC_REG_MCIP_WDATA, data);
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	__mcip_cmd(cmd, param);
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/*
12562306a36Sopenharmony_ci * Read MCIP register
12662306a36Sopenharmony_ci */
12762306a36Sopenharmony_cistatic inline unsigned int __mcip_cmd_read(unsigned int cmd, unsigned int param)
12862306a36Sopenharmony_ci{
12962306a36Sopenharmony_ci	__mcip_cmd(cmd, param);
13062306a36Sopenharmony_ci	return read_aux_reg(ARC_REG_MCIP_READBACK);
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#endif
134