|
@@ -74,23 +74,10 @@ ssize_t qcom_mdt_get_size(const struct firmware *fw)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(qcom_mdt_get_size);
|
|
|
|
|
|
-/**
|
|
|
- * qcom_mdt_load() - load the firmware which header is loaded as fw
|
|
|
- * @dev: device handle to associate resources with
|
|
|
- * @fw: firmware object for the mdt file
|
|
|
- * @firmware: name of the firmware, for construction of segment file names
|
|
|
- * @pas_id: PAS identifier
|
|
|
- * @mem_region: allocated memory region to load firmware into
|
|
|
- * @mem_phys: physical address of allocated memory region
|
|
|
- * @mem_size: size of the allocated memory region
|
|
|
- * @reloc_base: adjusted physical address after relocation
|
|
|
- *
|
|
|
- * Returns 0 on success, negative errno otherwise.
|
|
|
- */
|
|
|
-int qcom_mdt_load(struct device *dev, const struct firmware *fw,
|
|
|
- const char *firmware, int pas_id, void *mem_region,
|
|
|
- phys_addr_t mem_phys, size_t mem_size,
|
|
|
- phys_addr_t *reloc_base)
|
|
|
+static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,
|
|
|
+ const char *firmware, int pas_id, void *mem_region,
|
|
|
+ phys_addr_t mem_phys, size_t mem_size,
|
|
|
+ phys_addr_t *reloc_base, bool pas_init)
|
|
|
{
|
|
|
const struct elf32_phdr *phdrs;
|
|
|
const struct elf32_phdr *phdr;
|
|
@@ -121,10 +108,12 @@ int qcom_mdt_load(struct device *dev, const struct firmware *fw,
|
|
|
if (!fw_name)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- ret = qcom_scm_pas_init_image(pas_id, fw->data, fw->size);
|
|
|
- if (ret) {
|
|
|
- dev_err(dev, "invalid firmware metadata\n");
|
|
|
- goto out;
|
|
|
+ if (pas_init) {
|
|
|
+ ret = qcom_scm_pas_init_image(pas_id, fw->data, fw->size);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "invalid firmware metadata\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < ehdr->e_phnum; i++) {
|
|
@@ -144,10 +133,13 @@ int qcom_mdt_load(struct device *dev, const struct firmware *fw,
|
|
|
}
|
|
|
|
|
|
if (relocate) {
|
|
|
- ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
|
|
|
- if (ret) {
|
|
|
- dev_err(dev, "unable to setup relocation\n");
|
|
|
- goto out;
|
|
|
+ if (pas_init) {
|
|
|
+ ret = qcom_scm_pas_mem_setup(pas_id, mem_phys,
|
|
|
+ max_addr - min_addr);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "unable to setup relocation\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -202,7 +194,52 @@ out:
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * qcom_mdt_load() - load the firmware which header is loaded as fw
|
|
|
+ * @dev: device handle to associate resources with
|
|
|
+ * @fw: firmware object for the mdt file
|
|
|
+ * @firmware: name of the firmware, for construction of segment file names
|
|
|
+ * @pas_id: PAS identifier
|
|
|
+ * @mem_region: allocated memory region to load firmware into
|
|
|
+ * @mem_phys: physical address of allocated memory region
|
|
|
+ * @mem_size: size of the allocated memory region
|
|
|
+ * @reloc_base: adjusted physical address after relocation
|
|
|
+ *
|
|
|
+ * Returns 0 on success, negative errno otherwise.
|
|
|
+ */
|
|
|
+int qcom_mdt_load(struct device *dev, const struct firmware *fw,
|
|
|
+ const char *firmware, int pas_id, void *mem_region,
|
|
|
+ phys_addr_t mem_phys, size_t mem_size,
|
|
|
+ phys_addr_t *reloc_base)
|
|
|
+{
|
|
|
+ return __qcom_mdt_load(dev, fw, firmware, pas_id, mem_region, mem_phys,
|
|
|
+ mem_size, reloc_base, true);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(qcom_mdt_load);
|
|
|
|
|
|
+/**
|
|
|
+ * qcom_mdt_load_no_init() - load the firmware which header is loaded as fw
|
|
|
+ * @dev: device handle to associate resources with
|
|
|
+ * @fw: firmware object for the mdt file
|
|
|
+ * @firmware: name of the firmware, for construction of segment file names
|
|
|
+ * @pas_id: PAS identifier
|
|
|
+ * @mem_region: allocated memory region to load firmware into
|
|
|
+ * @mem_phys: physical address of allocated memory region
|
|
|
+ * @mem_size: size of the allocated memory region
|
|
|
+ * @reloc_base: adjusted physical address after relocation
|
|
|
+ *
|
|
|
+ * Returns 0 on success, negative errno otherwise.
|
|
|
+ */
|
|
|
+int qcom_mdt_load_no_init(struct device *dev, const struct firmware *fw,
|
|
|
+ const char *firmware, int pas_id,
|
|
|
+ void *mem_region, phys_addr_t mem_phys,
|
|
|
+ size_t mem_size, phys_addr_t *reloc_base)
|
|
|
+{
|
|
|
+ return __qcom_mdt_load(dev, fw, firmware, pas_id, mem_region, mem_phys,
|
|
|
+ mem_size, reloc_base, false);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(qcom_mdt_load_no_init);
|
|
|
+
|
|
|
MODULE_DESCRIPTION("Firmware parser for Qualcomm MDT format");
|
|
|
MODULE_LICENSE("GPL v2");
|