xref: /OK3568_Linux_fs/kernel/drivers/remoteproc/ti_sci_proc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Texas Instruments TI-SCI Processor Controller Helper Functions
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
6*4882a593Smuzhiyun  *	Suman Anna <s-anna@ti.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef REMOTEPROC_TI_SCI_PROC_H
10*4882a593Smuzhiyun #define REMOTEPROC_TI_SCI_PROC_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/soc/ti/ti_sci_protocol.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /**
15*4882a593Smuzhiyun  * struct ti_sci_proc - structure representing a processor control client
16*4882a593Smuzhiyun  * @sci: cached TI-SCI protocol handle
17*4882a593Smuzhiyun  * @ops: cached TI-SCI proc ops
18*4882a593Smuzhiyun  * @dev: cached client device pointer
19*4882a593Smuzhiyun  * @proc_id: processor id for the consumer remoteproc device
20*4882a593Smuzhiyun  * @host_id: host id to pass the control over for this consumer remoteproc
21*4882a593Smuzhiyun  *	     device
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun struct ti_sci_proc {
24*4882a593Smuzhiyun 	const struct ti_sci_handle *sci;
25*4882a593Smuzhiyun 	const struct ti_sci_proc_ops *ops;
26*4882a593Smuzhiyun 	struct device *dev;
27*4882a593Smuzhiyun 	u8 proc_id;
28*4882a593Smuzhiyun 	u8 host_id;
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
ti_sci_proc_request(struct ti_sci_proc * tsp)31*4882a593Smuzhiyun static inline int ti_sci_proc_request(struct ti_sci_proc *tsp)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	int ret;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	ret = tsp->ops->request(tsp->sci, tsp->proc_id);
36*4882a593Smuzhiyun 	if (ret)
37*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor request failed: %d\n",
38*4882a593Smuzhiyun 			ret);
39*4882a593Smuzhiyun 	return ret;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
ti_sci_proc_release(struct ti_sci_proc * tsp)42*4882a593Smuzhiyun static inline int ti_sci_proc_release(struct ti_sci_proc *tsp)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun 	int ret;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	ret = tsp->ops->release(tsp->sci, tsp->proc_id);
47*4882a593Smuzhiyun 	if (ret)
48*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor release failed: %d\n",
49*4882a593Smuzhiyun 			ret);
50*4882a593Smuzhiyun 	return ret;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
ti_sci_proc_handover(struct ti_sci_proc * tsp)53*4882a593Smuzhiyun static inline int ti_sci_proc_handover(struct ti_sci_proc *tsp)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	int ret;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	ret = tsp->ops->handover(tsp->sci, tsp->proc_id, tsp->host_id);
58*4882a593Smuzhiyun 	if (ret)
59*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor handover of %d to %d failed: %d\n",
60*4882a593Smuzhiyun 			tsp->proc_id, tsp->host_id, ret);
61*4882a593Smuzhiyun 	return ret;
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
ti_sci_proc_set_config(struct ti_sci_proc * tsp,u64 boot_vector,u32 cfg_set,u32 cfg_clr)64*4882a593Smuzhiyun static inline int ti_sci_proc_set_config(struct ti_sci_proc *tsp,
65*4882a593Smuzhiyun 					 u64 boot_vector,
66*4882a593Smuzhiyun 					 u32 cfg_set, u32 cfg_clr)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	int ret;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	ret = tsp->ops->set_config(tsp->sci, tsp->proc_id, boot_vector,
71*4882a593Smuzhiyun 				   cfg_set, cfg_clr);
72*4882a593Smuzhiyun 	if (ret)
73*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor set_config failed: %d\n",
74*4882a593Smuzhiyun 			ret);
75*4882a593Smuzhiyun 	return ret;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
ti_sci_proc_set_control(struct ti_sci_proc * tsp,u32 ctrl_set,u32 ctrl_clr)78*4882a593Smuzhiyun static inline int ti_sci_proc_set_control(struct ti_sci_proc *tsp,
79*4882a593Smuzhiyun 					  u32 ctrl_set, u32 ctrl_clr)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun 	int ret;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	ret = tsp->ops->set_control(tsp->sci, tsp->proc_id, ctrl_set, ctrl_clr);
84*4882a593Smuzhiyun 	if (ret)
85*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor set_control failed: %d\n",
86*4882a593Smuzhiyun 			ret);
87*4882a593Smuzhiyun 	return ret;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun 
ti_sci_proc_get_status(struct ti_sci_proc * tsp,u64 * boot_vector,u32 * cfg_flags,u32 * ctrl_flags,u32 * status_flags)90*4882a593Smuzhiyun static inline int ti_sci_proc_get_status(struct ti_sci_proc *tsp,
91*4882a593Smuzhiyun 					 u64 *boot_vector, u32 *cfg_flags,
92*4882a593Smuzhiyun 					 u32 *ctrl_flags, u32 *status_flags)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	int ret;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	ret = tsp->ops->get_status(tsp->sci, tsp->proc_id, boot_vector,
97*4882a593Smuzhiyun 				   cfg_flags, ctrl_flags, status_flags);
98*4882a593Smuzhiyun 	if (ret)
99*4882a593Smuzhiyun 		dev_err(tsp->dev, "ti-sci processor get_status failed: %d\n",
100*4882a593Smuzhiyun 			ret);
101*4882a593Smuzhiyun 	return ret;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #endif /* REMOTEPROC_TI_SCI_PROC_H */
105