|
@@ -268,42 +268,49 @@ find_table(struct device *dev, struct elf32_hdr *ehdr, size_t fw_size)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * rproc_elf_find_rsc_table() - find the resource table
|
|
|
+ * rproc_elf_load_rsc_table() - load the resource table
|
|
|
* @rproc: the rproc handle
|
|
|
* @fw: the ELF firmware image
|
|
|
- * @tablesz: place holder for providing back the table size
|
|
|
*
|
|
|
* This function finds the resource table inside the remote processor's
|
|
|
- * firmware. It is used both upon the registration of @rproc (in order
|
|
|
- * to look for and register the supported virito devices), and when the
|
|
|
- * @rproc is booted.
|
|
|
+ * firmware, load it into the @cached_table and update @table_ptr.
|
|
|
*
|
|
|
- * Returns the pointer to the resource table if it is found, and write its
|
|
|
- * size into @tablesz. If a valid table isn't found, NULL is returned
|
|
|
- * (and @tablesz isn't set).
|
|
|
+ * Return: 0 on success, negative errno on failure.
|
|
|
*/
|
|
|
-struct resource_table *rproc_elf_find_rsc_table(struct rproc *rproc,
|
|
|
- const struct firmware *fw,
|
|
|
- int *tablesz)
|
|
|
+int rproc_elf_load_rsc_table(struct rproc *rproc, const struct firmware *fw)
|
|
|
{
|
|
|
struct elf32_hdr *ehdr;
|
|
|
struct elf32_shdr *shdr;
|
|
|
struct device *dev = &rproc->dev;
|
|
|
struct resource_table *table = NULL;
|
|
|
const u8 *elf_data = fw->data;
|
|
|
+ size_t tablesz;
|
|
|
|
|
|
ehdr = (struct elf32_hdr *)elf_data;
|
|
|
|
|
|
shdr = find_table(dev, ehdr, fw->size);
|
|
|
if (!shdr)
|
|
|
- return NULL;
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
table = (struct resource_table *)(elf_data + shdr->sh_offset);
|
|
|
- *tablesz = shdr->sh_size;
|
|
|
+ tablesz = shdr->sh_size;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Create a copy of the resource table. When a virtio device starts
|
|
|
+ * and calls vring_new_virtqueue() the address of the allocated vring
|
|
|
+ * will be stored in the cached_table. Before the device is started,
|
|
|
+ * cached_table will be copied into device memory.
|
|
|
+ */
|
|
|
+ rproc->cached_table = kmemdup(table, tablesz, GFP_KERNEL);
|
|
|
+ if (!rproc->cached_table)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- return table;
|
|
|
+ rproc->table_ptr = rproc->cached_table;
|
|
|
+ rproc->table_sz = tablesz;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(rproc_elf_find_rsc_table);
|
|
|
+EXPORT_SYMBOL(rproc_elf_load_rsc_table);
|
|
|
|
|
|
/**
|
|
|
* rproc_elf_find_loaded_rsc_table() - find the loaded resource table
|