7 #include <linux/module.h>
13 #define SPROC_FW_SIZE (50 * 4096)
14 #define SPROC_MAX_TOC_ENTRIES 32
15 #define SPROC_MAX_NOTIFY_ID 14
16 #define SPROC_RESOURCE_NAME "rsc-table"
17 #define SPROC_MODEM_NAME "ste-modem"
18 #define SPROC_MODEM_FIRMWARE SPROC_MODEM_NAME "-fw.bin"
20 #define sproc_dbg(sproc, fmt, ...) \
21 dev_dbg(&sproc->mdev->pdev.dev, fmt, ##__VA_ARGS__)
22 #define sproc_err(sproc, fmt, ...) \
23 dev_err(&sproc->mdev->pdev.dev, fmt, ##__VA_ARGS__)
75 toc = (
void *)fw->
data;
79 toc->
table[
i].start != 0xffffffff; i++) {
82 sizeof(toc->
table[i].name))) {
101 entry = sproc_find_rsc_entry(fw);
103 sproc_err(sproc,
"resource table not found in fw\n");
107 table = (
void *)(fw->
data + entry->
start);
115 sproc_err(sproc,
"bad size of fw or resource table\n");
120 if (table->
ver != 1) {
121 sproc_err(sproc,
"unsupported fw ver: %d\n", table->
ver);
127 sproc_err(sproc,
"non zero reserved bytes\n");
135 sproc_err(sproc,
"resource table incomplete\n");
140 if (SPROC_FW_SIZE < fw->
size) {
141 sproc_err(sproc,
"Insufficient space for fw (%d < %zd)\n",
147 *tablesz = entry->
size;
154 .load = sproc_load_segments,
155 .find_rsc_table = sproc_find_rsc_table,
159 static void sproc_kick(
struct rproc *rproc,
int vqid)
161 struct sproc *sproc = rproc->
priv;
163 sproc_dbg(sproc,
"kick vqid:%d\n", vqid);
175 struct sproc *sproc = mdev->
drv_data;
178 sproc_dbg(sproc,
"no message was found in vqid %d\n", vqid);
182 .kick = sproc_kick_callback,
186 static int sproc_start(
struct rproc *rproc)
188 struct sproc *sproc = rproc->
priv;
195 sproc_err(sproc,
"Notification IDs too high:%d\n",
202 err = sproc->
mdev->ops.kick_subscribe(sproc->
mdev, i);
205 "subscription of kicks failed:%d\n", err);
211 return sproc->
mdev->ops.power(sproc->
mdev,
true);
215 static int sproc_stop(
struct rproc *rproc)
217 struct sproc *sproc = rproc->
priv;
220 return sproc->
mdev->ops.power(sproc->
mdev,
false);
224 .start = sproc_start,
234 struct sproc *sproc = mdev->
drv_data;
261 if (!mdev->
ops.setup || !mdev->
ops.kick || !mdev->
ops.kick_subscribe ||
274 sproc->
rproc = rproc;
278 sproc->
mdev->ops.setup(sproc->
mdev, &sproc_dev_cb);
292 sproc_err(sproc,
"Cannot allocate memory for fw\n");
316 .probe = sproc_probe,
317 .remove = sproc_drv_remove,