xref: /linux/drivers/remoteproc/ti_k3_common.h (revision 23ca32e4ead48f68e37000f2552b973ef1439acb)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * TI K3 Remote Processor(s) driver common code
4  *
5  * Refactored out of ti_k3_r5_remoteproc.c, ti_k3_dsp_remoteproc.c and
6  * ti_k3_m4_remoteproc.c.
7  *
8  * ti_k3_r5_remoteproc.c:
9  * Copyright (C) 2017-2022 Texas Instruments Incorporated - https://www.ti.com/
10  *	Suman Anna <s-anna@ti.com>
11  *
12  * ti_k3_dsp_remoteproc.c:
13  * Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/
14  *	Suman Anna <s-anna@ti.com>
15  *
16  * ti_k3_m4_remoteproc.c:
17  * Copyright (C) 2021-2024 Texas Instruments Incorporated - https://www.ti.com/
18  *	Hari Nagalla <hnagalla@ti.com>
19  */
20 
21 #ifndef REMOTEPROC_TI_K3_COMMON_H
22 #define REMOTEPROC_TI_K3_COMMON_H
23 
24 #define KEYSTONE_RPROC_LOCAL_ADDRESS_MASK	(SZ_16M - 1)
25 
26 /**
27  * struct k3_rproc_mem - internal memory structure
28  * @cpu_addr: MPU virtual address of the memory region
29  * @bus_addr: Bus address used to access the memory region
30  * @dev_addr: Device address of the memory region from remote processor view
31  * @size: Size of the memory region
32  */
33 struct k3_rproc_mem {
34 	void __iomem *cpu_addr;
35 	phys_addr_t bus_addr;
36 	u32 dev_addr;
37 	size_t size;
38 };
39 
40 /**
41  * struct k3_rproc_mem_data - memory definitions for a remote processor
42  * @name: name for this memory entry
43  * @dev_addr: device address for the memory entry
44  */
45 struct k3_rproc_mem_data {
46 	const char *name;
47 	const u32 dev_addr;
48 };
49 
50 /**
51  * struct k3_rproc_dev_data - device data structure for a remote processor
52  * @mems: pointer to memory definitions for a remote processor
53  * @num_mems: number of memory regions in @mems
54  * @boot_align_addr: boot vector address alignment granularity
55  * @uses_lreset: flag to denote the need for local reset management
56  */
57 struct k3_rproc_dev_data {
58 	const struct k3_rproc_mem_data *mems;
59 	u32 num_mems;
60 	u32 boot_align_addr;
61 	bool uses_lreset;
62 };
63 
64 /**
65  * struct k3_rproc - k3 remote processor driver structure
66  * @dev: cached device pointer
67  * @rproc: remoteproc device handle
68  * @mem: internal memory regions data
69  * @num_mems: number of internal memory regions
70  * @rmem: reserved memory regions data
71  * @num_rmems: number of reserved memory regions
72  * @reset: reset control handle
73  * @data: pointer to DSP-specific device data
74  * @tsp: TI-SCI processor control handle
75  * @ti_sci: TI-SCI handle
76  * @ti_sci_id: TI-SCI device identifier
77  * @mbox: mailbox channel handle
78  * @client: mailbox client to request the mailbox channel
79  * @priv: void pointer to carry any private data
80  */
81 struct k3_rproc {
82 	struct device *dev;
83 	struct rproc *rproc;
84 	struct k3_rproc_mem *mem;
85 	int num_mems;
86 	struct k3_rproc_mem *rmem;
87 	int num_rmems;
88 	struct reset_control *reset;
89 	const struct k3_rproc_dev_data *data;
90 	struct ti_sci_proc *tsp;
91 	const struct ti_sci_handle *ti_sci;
92 	u32 ti_sci_id;
93 	struct mbox_chan *mbox;
94 	struct mbox_client client;
95 	void *priv;
96 };
97 
98 void k3_rproc_mbox_callback(struct mbox_client *client, void *data);
99 void k3_rproc_kick(struct rproc *rproc, int vqid);
100 int k3_rproc_reset(struct k3_rproc *kproc);
101 int k3_rproc_release(struct k3_rproc *kproc);
102 int k3_rproc_request_mbox(struct rproc *rproc);
103 int k3_rproc_prepare(struct rproc *rproc);
104 int k3_rproc_unprepare(struct rproc *rproc);
105 int k3_rproc_start(struct rproc *rproc);
106 int k3_rproc_stop(struct rproc *rproc);
107 int k3_rproc_attach(struct rproc *rproc);
108 int k3_rproc_detach(struct rproc *rproc);
109 struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
110 					       size_t *rsc_table_sz);
111 void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len,
112 			bool *is_iomem);
113 int k3_rproc_of_get_memories(struct platform_device *pdev,
114 			     struct k3_rproc *kproc);
115 void k3_mem_release(void *data);
116 int k3_reserved_mem_init(struct k3_rproc *kproc);
117 void k3_release_tsp(void *data);
118 #endif /* REMOTEPROC_TI_K3_COMMON_H */
119