summaryrefslogtreecommitdiff
path: root/drivers/remoteproc/ti_sci_proc.h
blob: f3911ce75252ec534d7918b9b17193c2b63aa13e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Texas Instruments TI-SCI Processor Controller Helper Functions
 *
 * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
 *	Suman Anna <s-anna@ti.com>
 */

#ifndef REMOTEPROC_TI_SCI_PROC_H
#define REMOTEPROC_TI_SCI_PROC_H

#include <linux/soc/ti/ti_sci_protocol.h>

/**
 * struct ti_sci_proc - structure representing a processor control client
 * @sci: cached TI-SCI protocol handle
 * @ops: cached TI-SCI proc ops
 * @dev: cached client device pointer
 * @proc_id: processor id for the consumer remoteproc device
 * @host_id: host id to pass the control over for this consumer remoteproc
 *	     device
 */
struct ti_sci_proc {
	const struct ti_sci_handle *sci;
	const struct ti_sci_proc_ops *ops;
	struct device *dev;
	u8 proc_id;
	u8 host_id;
};

static inline
struct ti_sci_proc *ti_sci_proc_of_get_tsp(struct device *dev,
					   const struct ti_sci_handle *sci)
{
	struct ti_sci_proc *tsp;
	u32 temp[2];
	int ret;

	ret = of_property_read_u32_array(dev_of_node(dev), "ti,sci-proc-ids",
					 temp, 2);
	if (ret < 0)
		return ERR_PTR(ret);

	tsp = devm_kzalloc(dev, sizeof(*tsp), GFP_KERNEL);
	if (!tsp)
		return ERR_PTR(-ENOMEM);

	tsp->dev = dev;
	tsp->sci = sci;
	tsp->ops = &sci->ops.proc_ops;
	tsp->proc_id = temp[0];
	tsp->host_id = temp[1];

	return tsp;
}

static inline int ti_sci_proc_request(struct ti_sci_proc *tsp)
{
	int ret;

	ret = tsp->ops->request(tsp->sci, tsp->proc_id);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor request failed: %d\n",
			ret);
	return ret;
}

static inline int ti_sci_proc_release(struct ti_sci_proc *tsp)
{
	int ret;

	ret = tsp->ops->release(tsp->sci, tsp->proc_id);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor release failed: %d\n",
			ret);
	return ret;
}

static inline int ti_sci_proc_handover(struct ti_sci_proc *tsp)
{
	int ret;

	ret = tsp->ops->handover(tsp->sci, tsp->proc_id, tsp->host_id);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor handover of %d to %d failed: %d\n",
			tsp->proc_id, tsp->host_id, ret);
	return ret;
}

static inline int ti_sci_proc_set_config(struct ti_sci_proc *tsp,
					 u64 boot_vector,
					 u32 cfg_set, u32 cfg_clr)
{
	int ret;

	ret = tsp->ops->set_config(tsp->sci, tsp->proc_id, boot_vector,
				   cfg_set, cfg_clr);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor set_config failed: %d\n",
			ret);
	return ret;
}

static inline int ti_sci_proc_set_control(struct ti_sci_proc *tsp,
					  u32 ctrl_set, u32 ctrl_clr)
{
	int ret;

	ret = tsp->ops->set_control(tsp->sci, tsp->proc_id, ctrl_set, ctrl_clr);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor set_control failed: %d\n",
			ret);
	return ret;
}

static inline int ti_sci_proc_get_status(struct ti_sci_proc *tsp,
					 u64 *boot_vector, u32 *cfg_flags,
					 u32 *ctrl_flags, u32 *status_flags)
{
	int ret;

	ret = tsp->ops->get_status(tsp->sci, tsp->proc_id, boot_vector,
				   cfg_flags, ctrl_flags, status_flags);
	if (ret)
		dev_err(tsp->dev, "ti-sci processor get_status failed: %d\n",
			ret);
	return ret;
}

#endif /* REMOTEPROC_TI_SCI_PROC_H */