Lines Matching defs:smem

16 #include <linux/soc/qcom/smem.h>
38 * (@smem_ptable), that is found 4kB from the end of the main smem region. The
55 * region with partition type (SMEM_GLOBAL_HOST) and the max smem item count is
65 * The version member of the smem header contains an array of versions for the
104 * struct smem_global_entry - entry to reference smem items on the heap
120 * struct smem_header - header found in beginning of primary smem region
123 * @initialized: boolean to indicate that smem is initialized
124 * @free_offset: index of the first unallocated byte in smem
200 * struct smem_partition - describes smem partition
218 * @item: identifying number of the smem item
235 * struct smem_info - smem region info located after the table of contents
237 * @size: size of the smem region
238 * @base_addr: base address of the smem region
253 * struct smem_region - representation of a chunk of memory used for smem
265 * struct qcom_smem - device data for the smem device
356 /* Pointer to the one and only smem handle */
373 static int qcom_smem_alloc_private(struct qcom_smem *smem,
409 dev_err(smem->dev, "Out of memory\n");
429 dev_err(smem->dev, "Found invalid canary in hosts %hu:%hu partition\n",
435 static int qcom_smem_alloc_global(struct qcom_smem *smem,
442 header = smem->regions[0].virt_base;
469 * qcom_smem_alloc() - allocate space for a smem item
471 * @item: smem item handle
474 * Allocate space for a given smem item of size @size, given that the item is
517 static void *qcom_smem_get_global(struct qcom_smem *smem,
529 header = smem->regions[0].virt_base;
536 for (i = 0; i < smem->num_regions; i++) {
537 region = &smem->regions[i];
556 static void *qcom_smem_get_private(struct qcom_smem *smem,
640 dev_err(smem->dev, "Found invalid canary in hosts %hu:%hu partition\n",
647 * qcom_smem_get() - resolve ptr of size of a smem item
649 * @item: smem item handle
652 * Looks up smem item and returns pointer to it. Size of smem
695 * To be used by smem clients as a quick way to determine if any new
743 * with an smem item pointer (previously returned by qcom_smem_get()
746 * Returns 0 if the pointer provided is not within any smem region.
809 static int qcom_smem_get_sbl_version(struct qcom_smem *smem)
814 header = smem->regions[0].virt_base;
820 static struct smem_ptable *qcom_smem_get_ptable(struct qcom_smem *smem)
825 ptable = smem->ptable;
831 dev_err(smem->dev,
838 static u32 qcom_smem_get_item_count(struct qcom_smem *smem)
843 ptable = qcom_smem_get_ptable(smem);
860 qcom_smem_partition_header(struct qcom_smem *smem,
867 phys_addr = smem->regions[0].aux_base + le32_to_cpu(entry->offset);
868 header = devm_ioremap_wc(smem->dev, phys_addr, le32_to_cpu(entry->size));
874 dev_err(smem->dev, "bad partition magic %4ph\n", header->magic);
879 dev_err(smem->dev, "bad host0 (%hu != %hu)\n",
884 dev_err(smem->dev, "bad host1 (%hu != %hu)\n",
891 dev_err(smem->dev, "bad partition size (%u != %u)\n",
897 dev_err(smem->dev, "bad partition free uncached (%u > %u)\n",
905 static int qcom_smem_set_global_partition(struct qcom_smem *smem)
913 if (smem->global_partition.virt_base) {
914 dev_err(smem->dev, "Already found the global partition\n");
918 ptable = qcom_smem_get_ptable(smem);
939 dev_err(smem->dev, "Missing entry for global partition\n");
943 header = qcom_smem_partition_header(smem, entry,
948 smem->global_partition.virt_base = (void __iomem *)header;
949 smem->global_partition.phys_base = smem->regions[0].aux_base +
951 smem->global_partition.size = le32_to_cpu(entry->size);
952 smem->global_partition.cacheline = le32_to_cpu(entry->cacheline);
958 qcom_smem_enumerate_partitions(struct qcom_smem *smem, u16 local_host)
967 ptable = qcom_smem_get_ptable(smem);
988 dev_err(smem->dev, "bad host %u\n", remote_host);
992 if (smem->partitions[remote_host].virt_base) {
993 dev_err(smem->dev, "duplicate host %u\n", remote_host);
997 header = qcom_smem_partition_header(smem, entry, host0, host1);
1001 smem->partitions[remote_host].virt_base = (void __iomem *)header;
1002 smem->partitions[remote_host].phys_base = smem->regions[0].aux_base +
1004 smem->partitions[remote_host].size = le32_to_cpu(entry->size);
1005 smem->partitions[remote_host].cacheline = le32_to_cpu(entry->cacheline);
1011 static int qcom_smem_map_toc(struct qcom_smem *smem, struct smem_region *region)
1015 /* map starting 4K for smem header */
1016 region->virt_base = devm_ioremap_wc(smem->dev, region->aux_base, SZ_4K);
1019 smem->ptable = devm_ioremap_wc(smem->dev, ptable_start, SZ_4K);
1021 if (!region->virt_base || !smem->ptable)
1027 static int qcom_smem_map_global(struct qcom_smem *smem, u32 size)
1031 phys_addr = smem->regions[0].aux_base;
1033 smem->regions[0].size = size;
1034 smem->regions[0].virt_base = devm_ioremap_wc(smem->dev, phys_addr, size);
1036 if (!smem->regions[0].virt_base)
1042 static int qcom_smem_resolve_mem(struct qcom_smem *smem, const char *name,
1045 struct device *dev = smem->dev;
1071 struct qcom_smem *smem;
1084 smem = devm_kzalloc(&pdev->dev, struct_size(smem, regions, num_regions),
1086 if (!smem)
1089 smem->dev = &pdev->dev;
1090 smem->num_regions = num_regions;
1094 smem->regions[0].aux_base = rmem->base;
1095 smem->regions[0].size = rmem->size;
1101 ret = qcom_smem_resolve_mem(smem, "memory-region", &smem->regions[0]);
1107 ret = qcom_smem_resolve_mem(smem, "qcom,rpm-msg-ram", &smem->regions[1]);
1113 ret = qcom_smem_map_toc(smem, &smem->regions[0]);
1118 smem->regions[i].virt_base = devm_ioremap_wc(&pdev->dev,
1119 smem->regions[i].aux_base,
1120 smem->regions[i].size);
1121 if (!smem->regions[i].virt_base) {
1122 dev_err(&pdev->dev, "failed to remap %pa\n", &smem->regions[i].aux_base);
1127 header = smem->regions[0].virt_base;
1141 smem->hwlock = hwspin_lock_request_specific(hwlock_id);
1142 if (!smem->hwlock)
1145 ret = hwspin_lock_timeout_irqsave(smem->hwlock, HWSPINLOCK_TIMEOUT, &flags);
1149 hwspin_unlock_irqrestore(smem->hwlock, &flags);
1151 version = qcom_smem_get_sbl_version(smem);
1153 * smem header mapping is required only in heap version scheme, so unmap
1157 devm_iounmap(smem->dev, smem->regions[0].virt_base);
1160 ret = qcom_smem_set_global_partition(smem);
1163 smem->item_count = qcom_smem_get_item_count(smem);
1166 qcom_smem_map_global(smem, size);
1167 smem->item_count = SMEM_ITEM_COUNT;
1175 ret = qcom_smem_enumerate_partitions(smem, SMEM_HOST_APPS);
1179 __smem = smem;
1181 smem->socinfo = platform_device_register_data(&pdev->dev, "qcom-socinfo",
1184 if (IS_ERR(smem->socinfo))
1201 { .compatible = "qcom,smem" },
1210 .name = "qcom-smem",