/* SPDX-License-Identifier: GPL-2.0-only */ /* * TI K3 Remote Processor(s) driver common code * * Refactored out of ti_k3_r5_remoteproc.c, ti_k3_dsp_remoteproc.c and * ti_k3_m4_remoteproc.c. * * ti_k3_r5_remoteproc.c: * Copyright (C) 2017-2022 Texas Instruments Incorporated - https://www.ti.com/ * Suman Anna * * ti_k3_dsp_remoteproc.c: * Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/ * Suman Anna * * ti_k3_m4_remoteproc.c: * Copyright (C) 2021-2024 Texas Instruments Incorporated - https://www.ti.com/ * Hari Nagalla */ #ifndef REMOTEPROC_TI_K3_COMMON_H #define REMOTEPROC_TI_K3_COMMON_H #define KEYSTONE_RPROC_LOCAL_ADDRESS_MASK (SZ_16M - 1) /** * struct k3_rproc_mem - internal memory structure * @cpu_addr: MPU virtual address of the memory region * @bus_addr: Bus address used to access the memory region * @dev_addr: Device address of the memory region from remote processor view * @size: Size of the memory region */ struct k3_rproc_mem { void __iomem *cpu_addr; phys_addr_t bus_addr; u32 dev_addr; size_t size; }; /** * struct k3_rproc_mem_data - memory definitions for a remote processor * @name: name for this memory entry * @dev_addr: device address for the memory entry */ struct k3_rproc_mem_data { const char *name; const u32 dev_addr; }; /** * struct k3_rproc_dev_data - device data structure for a remote processor * @mems: pointer to memory definitions for a remote processor * @num_mems: number of memory regions in @mems * @boot_align_addr: boot vector address alignment granularity * @uses_lreset: flag to denote the need for local reset management */ struct k3_rproc_dev_data { const struct k3_rproc_mem_data *mems; u32 num_mems; u32 boot_align_addr; bool uses_lreset; }; /** * struct k3_rproc - k3 remote processor driver structure * @dev: cached device pointer * @rproc: remoteproc device handle * @mem: internal memory regions data * @num_mems: number of internal memory regions * @rmem: reserved memory regions data * @num_rmems: number of reserved memory regions * @reset: reset control handle * @data: pointer to DSP-specific device data * @tsp: TI-SCI processor control handle * @ti_sci: TI-SCI handle * @ti_sci_id: TI-SCI device identifier * @mbox: mailbox channel handle * @client: mailbox client to request the mailbox channel * @priv: void pointer to carry any private data */ struct k3_rproc { struct device *dev; struct rproc *rproc; struct k3_rproc_mem *mem; int num_mems; struct k3_rproc_mem *rmem; int num_rmems; struct reset_control *reset; const struct k3_rproc_dev_data *data; struct ti_sci_proc *tsp; const struct ti_sci_handle *ti_sci; u32 ti_sci_id; struct mbox_chan *mbox; struct mbox_client client; void *priv; }; void k3_rproc_mbox_callback(struct mbox_client *client, void *data); void k3_rproc_kick(struct rproc *rproc, int vqid); int k3_rproc_reset(struct k3_rproc *kproc); int k3_rproc_release(struct k3_rproc *kproc); int k3_rproc_request_mbox(struct rproc *rproc); int k3_rproc_prepare(struct rproc *rproc); int k3_rproc_unprepare(struct rproc *rproc); int k3_rproc_start(struct rproc *rproc); int k3_rproc_stop(struct rproc *rproc); int k3_rproc_attach(struct rproc *rproc); int k3_rproc_detach(struct rproc *rproc); struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc, size_t *rsc_table_sz); void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem); int k3_rproc_of_get_memories(struct platform_device *pdev, struct k3_rproc *kproc); void k3_mem_release(void *data); int k3_reserved_mem_init(struct k3_rproc *kproc); void k3_release_tsp(void *data); #endif /* REMOTEPROC_TI_K3_COMMON_H */