On Fri, Apr 03, 2015 at 04:03:20PM -0700, Bjorn Andersson wrote: <snip> > +static int qcom_smem_alloc_private(struct qcom_smem *smem, > + unsigned host, > + unsigned item, > + size_t size) > +{ <snip> > + alloc_size = sizeof(*hdr) + ALIGN(size, 8); > + if (p + alloc_size >= (void *)phdr + phdr->offset_free_uncached) { > + dev_err(smem->dev, "Out of memory\n"); > + return -ENOSPC; > + } This check always fails due to the fact that we always get a ptr that points to something beyond the free_uncached area. We ought to use: alloc_size > phdr->offset_free_cached - phdr->offset_free_uncached > + > + hdr = p; > + hdr->canary = SMEM_PRIVATE_CANARY; > + hdr->item = item; > + hdr->size = ALIGN(size, 8); > + hdr->padding_data = hdr->size - size; > + hdr->padding_hdr = 0; > + <snip> > +static int qcom_smem_probe(struct platform_device *pdev) > +{ <snip> > + ret = of_address_to_resource(np, 0, &r); > + of_node_put(np); > + if (ret) > + return ret; > + > + smem->regions[0].aux_base = (u32)r.start; > + smem->regions[0].size = resource_size(&r); > + smem->regions[0].virt_base = devm_ioremap(&pdev->dev, > + r.start, > + resource_size(&r)); Need to use devm_ioremap_nocache() instead. We need uncached accesses. > + if (!smem->regions[0].virt_base) > + return -ENOMEM; > + > + for (i = 1; i < num_regions; i++) { > + res = platform_get_resource(pdev, IORESOURCE_MEM, i - 1); > + > + smem->regions[i].aux_base = (u32)res->start; > + smem->regions[i].size = resource_size(res); > + smem->regions[i].virt_base = devm_ioremap(&pdev->dev, > + res->start, > + resource_size(res)); Same thing here. > + if (!smem->regions[i].virt_base) > + return -ENOMEM; > + } > + <snip> > diff --git a/include/linux/soc/qcom/smem.h b/include/linux/soc/qcom/smem.h > new file mode 100644 > index 0000000..294070de > --- /dev/null > +++ b/include/linux/soc/qcom/smem.h > @@ -0,0 +1,14 @@ > +#ifndef __QCOM_SMEM_H__ > +#define __QCOM_SMEM_H__ > + > +struct device_node; > +struct qcom_smem; > + > +#define QCOM_SMEM_HOST_ANY -1 Would it make sense to throw in the remote processor enumeration? Same with the fixed/dynamic item list? > + > +int qcom_smem_alloc(unsigned host, unsigned item, size_t size); > +int qcom_smem_get(unsigned host, unsigned item, void **ptr, size_t *size); > + > +int qcom_smem_get_free_space(unsigned host); -- Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html