mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
remoteproc: k3: Refactor .get_loaded_rsc_table ops into common driver
The .get_loaded_rsc_table rproc ops implementations in TI K3 R5, DSP and M4 remoteproc drivers return a pointer to the resource table that was pre-loaded at the base address of the DDR region reserved for firmware usage. Refactor the implementations into ti_k3_common.c driver as k3_get_loaded_rsc_table() and register this common function as .get_loaded_rsc_table ops in R5, DSP and M4 drivers. Signed-off-by: Beleswar Padhi <b-padhi@ti.com> Tested-by: Judith Mendez <jm@ti.com> Reviewed-by: Andrew Davis <afd@ti.com> Link: https://lore.kernel.org/r/20250513054510.3439842-32-b-padhi@ti.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
This commit is contained in:
parent
8715d4c04a
commit
1d7f38dde7
|
|
@ -318,5 +318,38 @@ EXPORT_SYMBOL_GPL(k3_rproc_attach);
|
|||
int k3_rproc_detach(struct rproc *rproc) { return 0; }
|
||||
EXPORT_SYMBOL_GPL(k3_rproc_detach);
|
||||
|
||||
/*
|
||||
* This function implements the .get_loaded_rsc_table() callback and is used
|
||||
* to provide the resource table for a booted remote processor in IPC-only
|
||||
* mode. The remote processor firmwares follow a design-by-contract approach
|
||||
* and are expected to have the resource table at the base of the DDR region
|
||||
* reserved for firmware usage. This provides flexibility for the remote
|
||||
* processor to be booted by different bootloaders that may or may not have the
|
||||
* ability to publish the resource table address and size through a DT
|
||||
* property.
|
||||
*/
|
||||
struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
|
||||
size_t *rsc_table_sz)
|
||||
{
|
||||
struct k3_rproc *kproc = rproc->priv;
|
||||
struct device *dev = kproc->dev;
|
||||
|
||||
if (!kproc->rmem[0].cpu_addr) {
|
||||
dev_err(dev, "memory-region #1 does not exist, loaded rsc table can't be found");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: The resource table size is currently hard-coded to a maximum
|
||||
* of 256 bytes. The most common resource table usage for K3 firmwares
|
||||
* is to only have the vdev resource entry and an optional trace entry.
|
||||
* The exact size could be computed based on resource table address, but
|
||||
* the hard-coded value suffices to support the IPC-only mode.
|
||||
*/
|
||||
*rsc_table_sz = 256;
|
||||
return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(k3_get_loaded_rsc_table);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("TI K3 common Remoteproc code");
|
||||
|
|
|
|||
|
|
@ -104,4 +104,6 @@ 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);
|
||||
#endif /* REMOTEPROC_TI_K3_COMMON_H */
|
||||
|
|
|
|||
|
|
@ -58,38 +58,6 @@ static int k3_dsp_rproc_start(struct rproc *rproc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function implements the .get_loaded_rsc_table() callback and is used
|
||||
* to provide the resource table for a booted DSP in IPC-only mode. The K3 DSP
|
||||
* firmwares follow a design-by-contract approach and are expected to have the
|
||||
* resource table at the base of the DDR region reserved for firmware usage.
|
||||
* This provides flexibility for the remote processor to be booted by different
|
||||
* bootloaders that may or may not have the ability to publish the resource table
|
||||
* address and size through a DT property. This callback is invoked only in
|
||||
* IPC-only mode.
|
||||
*/
|
||||
static struct resource_table *k3_dsp_get_loaded_rsc_table(struct rproc *rproc,
|
||||
size_t *rsc_table_sz)
|
||||
{
|
||||
struct k3_rproc *kproc = rproc->priv;
|
||||
struct device *dev = kproc->dev;
|
||||
|
||||
if (!kproc->rmem[0].cpu_addr) {
|
||||
dev_err(dev, "memory-region #1 does not exist, loaded rsc table can't be found");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: The resource table size is currently hard-coded to a maximum
|
||||
* of 256 bytes. The most common resource table usage for K3 firmwares
|
||||
* is to only have the vdev resource entry and an optional trace entry.
|
||||
* The exact size could be computed based on resource table address, but
|
||||
* the hard-coded value suffices to support the IPC-only mode.
|
||||
*/
|
||||
*rsc_table_sz = 256;
|
||||
return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Custom function to translate a DSP device address (internal RAMs only) to a
|
||||
* kernel virtual address. The DSPs can access their RAMs at either an internal
|
||||
|
|
@ -156,7 +124,7 @@ static const struct rproc_ops k3_dsp_rproc_ops = {
|
|||
.detach = k3_rproc_detach,
|
||||
.kick = k3_rproc_kick,
|
||||
.da_to_va = k3_dsp_rproc_da_to_va,
|
||||
.get_loaded_rsc_table = k3_dsp_get_loaded_rsc_table,
|
||||
.get_loaded_rsc_table = k3_get_loaded_rsc_table,
|
||||
};
|
||||
|
||||
static int k3_dsp_rproc_of_get_memories(struct platform_device *pdev,
|
||||
|
|
|
|||
|
|
@ -21,38 +21,6 @@
|
|||
#include "ti_sci_proc.h"
|
||||
#include "ti_k3_common.h"
|
||||
|
||||
/*
|
||||
* This function implements the .get_loaded_rsc_table() callback and is used
|
||||
* to provide the resource table for a booted remote processor in IPC-only
|
||||
* mode. The remote processor firmwares follow a design-by-contract approach
|
||||
* and are expected to have the resource table at the base of the DDR region
|
||||
* reserved for firmware usage. This provides flexibility for the remote
|
||||
* processor to be booted by different bootloaders that may or may not have the
|
||||
* ability to publish the resource table address and size through a DT
|
||||
* property.
|
||||
*/
|
||||
static struct resource_table *k3_m4_get_loaded_rsc_table(struct rproc *rproc,
|
||||
size_t *rsc_table_sz)
|
||||
{
|
||||
struct k3_rproc *kproc = rproc->priv;
|
||||
struct device *dev = kproc->dev;
|
||||
|
||||
if (!kproc->rmem[0].cpu_addr) {
|
||||
dev_err(dev, "memory-region #1 does not exist, loaded rsc table can't be found");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: The resource table size is currently hard-coded to a maximum
|
||||
* of 256 bytes. The most common resource table usage for K3 firmwares
|
||||
* is to only have the vdev resource entry and an optional trace entry.
|
||||
* The exact size could be computed based on resource table address, but
|
||||
* the hard-coded value suffices to support the IPC-only mode.
|
||||
*/
|
||||
*rsc_table_sz = 256;
|
||||
return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Custom function to translate a remote processor device address (internal
|
||||
* RAMs only) to a kernel virtual address. The remote processors can access
|
||||
|
|
@ -253,7 +221,7 @@ static const struct rproc_ops k3_m4_rproc_ops = {
|
|||
.detach = k3_rproc_detach,
|
||||
.kick = k3_rproc_kick,
|
||||
.da_to_va = k3_m4_rproc_da_to_va,
|
||||
.get_loaded_rsc_table = k3_m4_get_loaded_rsc_table,
|
||||
.get_loaded_rsc_table = k3_get_loaded_rsc_table,
|
||||
};
|
||||
|
||||
static int k3_m4_rproc_probe(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -559,38 +559,6 @@ static int k3_r5_rproc_stop(struct rproc *rproc)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function implements the .get_loaded_rsc_table() callback and is used
|
||||
* to provide the resource table for the booted R5F in IPC-only mode. The K3 R5F
|
||||
* firmwares follow a design-by-contract approach and are expected to have the
|
||||
* resource table at the base of the DDR region reserved for firmware usage.
|
||||
* This provides flexibility for the remote processor to be booted by different
|
||||
* bootloaders that may or may not have the ability to publish the resource table
|
||||
* address and size through a DT property. This callback is invoked only in
|
||||
* IPC-only mode.
|
||||
*/
|
||||
static struct resource_table *k3_r5_get_loaded_rsc_table(struct rproc *rproc,
|
||||
size_t *rsc_table_sz)
|
||||
{
|
||||
struct k3_rproc *kproc = rproc->priv;
|
||||
struct device *dev = kproc->dev;
|
||||
|
||||
if (!kproc->rmem[0].cpu_addr) {
|
||||
dev_err(dev, "memory-region #1 does not exist, loaded rsc table can't be found");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: The resource table size is currently hard-coded to a maximum
|
||||
* of 256 bytes. The most common resource table usage for K3 firmwares
|
||||
* is to only have the vdev resource entry and an optional trace entry.
|
||||
* The exact size could be computed based on resource table address, but
|
||||
* the hard-coded value suffices to support the IPC-only mode.
|
||||
*/
|
||||
*rsc_table_sz = 256;
|
||||
return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal Memory translation helper
|
||||
*
|
||||
|
|
@ -1042,7 +1010,7 @@ static int k3_r5_rproc_configure_mode(struct k3_rproc *kproc)
|
|||
kproc->rproc->ops->attach = k3_rproc_attach;
|
||||
kproc->rproc->ops->detach = k3_rproc_detach;
|
||||
kproc->rproc->ops->get_loaded_rsc_table =
|
||||
k3_r5_get_loaded_rsc_table;
|
||||
k3_get_loaded_rsc_table;
|
||||
} else if (!c_state) {
|
||||
dev_info(cdev, "configured R5F for remoteproc mode\n");
|
||||
ret = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user