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