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