From patchwork Thu Oct 5 03:11:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 114826 Delivered-To: patch@linaro.org Received: by 10.140.22.163 with SMTP id 32csp119149qgn; Wed, 4 Oct 2017 20:11:52 -0700 (PDT) X-Received: by 10.101.74.4 with SMTP id s4mr4733971pgq.259.1507173112616; Wed, 04 Oct 2017 20:11:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507173112; cv=none; d=google.com; s=arc-20160816; b=BS9qSzRkCEOZ4GMOyCjcpb78E3AbRK74gjDgnaSUSNlacAB1poLb+tfQt3IfjJvw28 NxXCucD61S1qrJON3+kdz/UbY/e4bEmG6McU5sUwWfkQX+viTD46Tew1tBX7OHEsAZbx 2nLscR6UYWEZ6EkRXbwFeS6pGXbYkP0RhK0KfU+Sl+1qWuaNKrv+CSAvMealwQzT+bpV IoPN9TEKyKgFKf8lqCBMOYAAd+sCDcpzm+1DNSuR5ZIOcou0klz2TdttPiEx9Ovhzzbj MzDgrrcuhhOy+pfgqRemDuK/+pT4EDhRgf9GFOVi8XUiVf3UF1xa1sk3e6CgX6U1QTFX bNwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=099HmhZ0hEYYpjtrzSS0frSL3NWdbxPHjcW4nmrAHnM=; b=zf4lugeSRxOfESHZ4X1iXCbdDsXRdR13SmFyuJtt2iG+l5OudO8Ud0ZH403aYMCh1P 34P80S0eNUTTU1roAuzzuHpIWpdoLs2j5hhz/gjggxtKWmyOIgUSWXwFcNjbcDWxyLsc 3RZ1kWNHoUfNI15vh61EgtjTl1zUMcdi0ObtFH6QSRJ7GujettsayLnD/6Ku8P+Ll0ph avwBZABPo5kpw8IimL6bGYtRyspobf8/JiS/kV78Udbf6LXiRXz+uopEpFD/k1D6hSLS 4f8iEei22syb30PYLt1VGDrDj+x8YcNkp/njdOomh2xuXPUPKOwCSLZu8ej1i+h8WRp+ wPEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kY/5OPEi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i6si4165505plt.334.2017.10.04.20.11.52; Wed, 04 Oct 2017 20:11:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kY/5OPEi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751474AbdJEDLu (ORCPT + 26 others); Wed, 4 Oct 2017 23:11:50 -0400 Received: from mail-pg0-f41.google.com ([74.125.83.41]:47480 "EHLO mail-pg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751398AbdJEDLf (ORCPT ); Wed, 4 Oct 2017 23:11:35 -0400 Received: by mail-pg0-f41.google.com with SMTP id r25so5186586pgn.4 for ; Wed, 04 Oct 2017 20:11:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=099HmhZ0hEYYpjtrzSS0frSL3NWdbxPHjcW4nmrAHnM=; b=kY/5OPEiC8uMH+K9HwbRzHzwYQljzQvwcKKPIBkupK+oo+knktHp+/3/7Pzy9793EU utZNwvsMpQpZP6CQjHF4sFzjR1JLnJikbNT6djH3K1QPgZJvS6FSAJJHijKvxRagyuBw JuoGZawFirbgkjGghDDWUMYRv4+JckgG4+Ma0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=099HmhZ0hEYYpjtrzSS0frSL3NWdbxPHjcW4nmrAHnM=; b=UObY625+jRPK9dBXZrvTvIpUKeu4unAsQv/nf1ui6xszK/mkPGly24IyX0rHfs3AuF k9L2BPrHyA47JBa9muC3MnFt6QzpCkAQGlLW8YhHW4E1QwAM3AKoyvjcR3/oIMqgdyBU gYQZ4Kf+oAyLoH7RGtN87d7bLykSeWcymiAZt/D1PL2octGFlEXoSXf70ISF7osQUddW AtIncNKDoemum5Zya3GNRoHdRa3OqeQN1PL+5tGRvcD4rg7g0OIg3A1R1Icn+MUIFpEX ofNUAoAwnk8oai4wScI1JZHJarM23U8HOdPbi+mBFynOypV215TbLcPUVphh2iGT4kUz 2NiA== X-Gm-Message-State: AHPjjUjdL+hIVsweNJ5M0cnXHd2xg+oGDC0AsRFKd7igSYgX86F6oALk ppAjLV+QHWr9TdHMn1XgwPXsbg== X-Google-Smtp-Source: AOwi7QBMY1/SiPdxJKaZU4WKdJAX33/mwbCBme/67SG/igoYdeyDojL0ee9hfow1/66g1YbWIKqpqQ== X-Received: by 10.84.130.67 with SMTP id 61mr22110875plc.131.1507173094579; Wed, 04 Oct 2017 20:11:34 -0700 (PDT) Received: from localhost.localdomain (ip68-111-217-79.sd.sd.cox.net. [68.111.217.79]) by smtp.gmail.com with ESMTPSA id 11sm10514877pfs.187.2017.10.04.20.11.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Oct 2017 20:11:33 -0700 (PDT) From: Bjorn Andersson To: Andy Gross , David Brown Cc: Stephen Boyd , Arun Kumar Neelakantam , linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/2] soc: qcom: smem: Support getting cached entries Date: Wed, 4 Oct 2017 20:11:28 -0700 Message-Id: <20171005031128.11658-3-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20171005031128.11658-1-bjorn.andersson@linaro.org> References: <20171005031128.11658-1-bjorn.andersson@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On msm8996 cached SMEM items are used for storing the GLINK FIFOs, so for items not found in the uncached list we need to also search the cased list for these items. Signed-off-by: Bjorn Andersson --- Changes since v2: - None Changes since v1: - phdr_to_first_cached_entry() endian conversion - e->size is a le32, not le16 drivers/soc/qcom/smem.c | 69 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 8 deletions(-) -- 2.12.0 Reviewed-by: Stephen Boyd diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c index b451dbc4aa39..c28275be0038 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c @@ -52,7 +52,8 @@ * * Items in the non-cached region are allocated from the start of the partition * while items in the cached region are allocated from the end. The free area - * is hence the region between the cached and non-cached offsets. + * is hence the region between the cached and non-cached offsets. The header of + * cached items comes after the data. * * * To synchronize allocations in the shared memory heaps a remote spinlock must @@ -140,6 +141,7 @@ struct smem_header { * @flags: flags for the partition (currently unused) * @host0: first processor/host with access to this partition * @host1: second processor/host with access to this partition + * @cacheline: alignment for "cached" entries * @reserved: reserved entries for later use */ struct smem_ptable_entry { @@ -148,7 +150,8 @@ struct smem_ptable_entry { __le32 flags; __le16 host0; __le16 host1; - __le32 reserved[8]; + __le32 cacheline; + __le32 reserved[7]; }; /** @@ -230,6 +233,7 @@ struct smem_region { * @hwlock: reference to a hwspinlock * @partitions: list of pointers to partitions affecting the current * processor/host + * @cacheline: list of cacheline sizes for each host * @num_regions: number of @regions * @regions: list of the memory regions defining the shared memory */ @@ -239,6 +243,7 @@ struct qcom_smem { struct hwspinlock *hwlock; struct smem_partition_header *partitions[SMEM_HOST_COUNT]; + size_t cacheline[SMEM_HOST_COUNT]; unsigned num_regions; struct smem_region regions[0]; @@ -252,6 +257,14 @@ phdr_to_last_uncached_entry(struct smem_partition_header *phdr) return p + le32_to_cpu(phdr->offset_free_uncached); } +static void *phdr_to_first_cached_entry(struct smem_partition_header *phdr, + size_t cacheline) +{ + void *p = phdr; + + return p + le32_to_cpu(phdr->size) - ALIGN(sizeof(*phdr), cacheline); +} + static void *phdr_to_last_cached_entry(struct smem_partition_header *phdr) { void *p = phdr; @@ -276,6 +289,14 @@ uncached_entry_next(struct smem_private_entry *e) le32_to_cpu(e->size); } +static struct smem_private_entry * +cached_entry_next(struct smem_private_entry *e, size_t cacheline) +{ + void *p = e; + + return p - le32_to_cpu(e->size) - ALIGN(sizeof(*e), cacheline); +} + static void *uncached_entry_to_item(struct smem_private_entry *e) { void *p = e; @@ -283,6 +304,13 @@ static void *uncached_entry_to_item(struct smem_private_entry *e) return p + sizeof(*e) + le16_to_cpu(e->padding_hdr); } +static void *cached_entry_to_item(struct smem_private_entry *e) +{ + void *p = e; + + return p - le32_to_cpu(e->size); +} + /* Pointer to the one and only smem handle */ static struct qcom_smem *__smem; @@ -458,18 +486,17 @@ static void *qcom_smem_get_private(struct qcom_smem *smem, { struct smem_partition_header *phdr; struct smem_private_entry *e, *end; + size_t cacheline; phdr = smem->partitions[host]; + cacheline = smem->cacheline[host]; + e = phdr_to_first_uncached_entry(phdr); end = phdr_to_last_uncached_entry(phdr); while (e < end) { - if (e->canary != SMEM_PRIVATE_CANARY) { - dev_err(smem->dev, - "Found invalid canary in host %d partition\n", - host); - return ERR_PTR(-EINVAL); - } + if (e->canary != SMEM_PRIVATE_CANARY) + goto invalid_canary; if (le16_to_cpu(e->item) == item) { if (size != NULL) @@ -482,7 +509,32 @@ static void *qcom_smem_get_private(struct qcom_smem *smem, e = uncached_entry_next(e); } + /* Item was not found in the uncached list, search the cached list */ + + e = phdr_to_first_cached_entry(phdr, cacheline); + end = phdr_to_last_cached_entry(phdr); + + while (e > end) { + if (e->canary != SMEM_PRIVATE_CANARY) + goto invalid_canary; + + if (le16_to_cpu(e->item) == item) { + if (size != NULL) + *size = le32_to_cpu(e->size) - + le16_to_cpu(e->padding_data); + + return cached_entry_to_item(e); + } + + e = cached_entry_next(e, cacheline); + } + return ERR_PTR(-ENOENT); + +invalid_canary: + dev_err(smem->dev, "Found invalid canary in host %d partition\n", host); + + return ERR_PTR(-EINVAL); } /** @@ -659,6 +711,7 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem, } smem->partitions[remote_host] = header; + smem->cacheline[remote_host] = le32_to_cpu(entry->cacheline); } return 0;