From patchwork Tue Mar 8 06:33:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chunyan Zhang X-Patchwork-Id: 8529931 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 94253C0553 for ; Tue, 8 Mar 2016 06:38:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9314B20155 for ; Tue, 8 Mar 2016 06:38:06 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 99C8E2014A for ; Tue, 8 Mar 2016 06:38:05 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1adBFr-0004eQ-PU; Tue, 08 Mar 2016 06:36:27 +0000 Received: from mail-pa0-x22b.google.com ([2607:f8b0:400e:c03::22b]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1adBFp-0004WF-1J for linux-arm-kernel@lists.infradead.org; Tue, 08 Mar 2016 06:36:26 +0000 Received: by mail-pa0-x22b.google.com with SMTP id tt10so5823878pab.3 for ; Mon, 07 Mar 2016 22:36:04 -0800 (PST) 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=GpKpmPWQae9gS6WhbldZix2OTytBimIacqnCtVJAshE=; b=buAKJPPAy1DwkRMmyxku696S5wnxDQqEszYldiEIgJrOAnzANf0BtZAThW/Fk36WIX 9yNhKJq9uU6CJjrGX56t7B2rBktZL7RMJnQ8F5lfpPsz76OQs7LrFw5osR8vUy9vBJWZ dOsDi34M9F0mv7Ydt1A6B3p5bPlXJ6LY16UIE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GpKpmPWQae9gS6WhbldZix2OTytBimIacqnCtVJAshE=; b=fr386Gzaw7TDmyHTA9VQJhLw0s2Gr3HUq6IkZdSOhTzGcMPOca80jVwjrEuHaxsLp0 g08z/Q5lni/CPuTpLh6filvFvOKTS/SaPedObmq8LyHDJQKfz/JOUwR3k87ZbltgQeeO OrofjxYulYzeclUMByH8yBmPGaTE6udR068HBojIns45r/kL2xxP9SSfY/7U3e6Ga1cX JlSpXYnLObFfEd1jaK2nXB6i4it7IAzWb/Da4DPR0vHyWmDE/bjrA+fLw35Dh3PO+pp9 Eecz8N/TVKE65U0N5la78YSW95Tq5qabCKMhbuQPvdyPXpRv2fClyQR9msJY8VMffH8M xi6w== X-Gm-Message-State: AD7BkJKWlX2gzSSvENEU3j2Fc6DCRN6H0c17tFSxxxS7Ls1ECWE43aWnHTy9CCuBL/VX32wz X-Received: by 10.67.12.175 with SMTP id er15mr39024595pad.70.1457418964229; Mon, 07 Mar 2016 22:36:04 -0800 (PST) Received: from zcy-ubuntu.spreadtrum.com ([175.111.195.49]) by smtp.gmail.com with ESMTPSA id fn3sm1986372pab.20.2016.03.07.22.35.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 Mar 2016 22:36:02 -0800 (PST) From: Chunyan Zhang To: mathieu.poirier@linaro.org, alexander.shishkin@linux.intel.com Subject: [RESEND PATCH V4 1/4] stm class: provision for statically assigned masterIDs Date: Tue, 8 Mar 2016 14:33:52 +0800 Message-Id: <1457418835-31417-2-git-send-email-zhang.chunyan@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1457418835-31417-1-git-send-email-zhang.chunyan@linaro.org> References: <1457418835-31417-1-git-send-email-zhang.chunyan@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160307_223625_155523_60B20685 X-CRM114-Status: GOOD ( 18.56 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: al.grant@arm.com, Michael.Williams@arm.com, linux-doc@vger.kernel.org, zhang.lyra@gmail.com, linux-kernel@vger.kernel.org, tor@ti.com, mike.leach@arm.com, linux-api@vger.kernel.org, pratikp@codeaurora.org, nicolas.guion@st.com, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Mathieu Poirier Some architecture like ARM assign masterIDs at the HW design phase. Those are therefore unreachable to users, making masterID management in the generic STM core irrelevant. In this kind of configuration channels are shared between masters rather than being allocated on a per master basis. This patch adds a new 'mshared' flag to struct stm_data that tells the core that this specific STM device doesn't need explicit masterID management. In the core sw_start/end of masterID are set to '1', i.e there is only one masterID to deal with. Also this patch depends on [1], so that the number of masterID is '1' too. Finally the lower and upper bound for masterIDs as presented in ($SYSFS)/class/stm/XYZ.stm/masters and ($SYSFS)/../stp-policy/XYZ.stm.my_policy/some_device/masters are set to '-1'. That way users can't confuse them with architecture where masterID management is required (where any other value would be valid). [1] https://lkml.org/lkml/2015/12/22/348 Signed-off-by: Mathieu Poirier Signed-off-by: Chunyan Zhang --- drivers/hwtracing/stm/core.c | 17 +++++++++++++++-- drivers/hwtracing/stm/policy.c | 18 ++++++++++++++++-- include/linux/stm.h | 8 ++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c index 66cec56..0d7f1c5 100644 --- a/drivers/hwtracing/stm/core.c +++ b/drivers/hwtracing/stm/core.c @@ -44,9 +44,15 @@ static ssize_t masters_show(struct device *dev, char *buf) { struct stm_device *stm = to_stm_device(dev); - int ret; + int ret, sw_start, sw_end; + + sw_start = stm->data->sw_start; + sw_end = stm->data->sw_end; + + if (stm->data->mshared) + sw_start = sw_end = STM_SHARED_MASTERID; - ret = sprintf(buf, "%u %u\n", stm->data->sw_start, stm->data->sw_end); + ret = sprintf(buf, "%d %d\n", sw_start, sw_end); return ret; } @@ -618,6 +624,13 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data, if (!stm_data->packet || !stm_data->sw_nchannels) return -EINVAL; + /* + * MasterIDs are assigned at HW design phase. As such the core is + * using a single master for interaction with this device. + */ + if (stm_data->mshared) + stm_data->sw_start = stm_data->sw_end = 1; + nmasters = stm_data->sw_end - stm_data->sw_start + 1; stm = kzalloc(sizeof(*stm) + nmasters * sizeof(void *), GFP_KERNEL); if (!stm) diff --git a/drivers/hwtracing/stm/policy.c b/drivers/hwtracing/stm/policy.c index 17a1416..19455db 100644 --- a/drivers/hwtracing/stm/policy.c +++ b/drivers/hwtracing/stm/policy.c @@ -80,10 +80,17 @@ static ssize_t stp_policy_node_masters_show(struct config_item *item, char *page) { struct stp_policy_node *policy_node = to_stp_policy_node(item); + struct stm_device *stm = policy_node->policy->stm; + int first_master, last_master; ssize_t count; - count = sprintf(page, "%u %u\n", policy_node->first_master, - policy_node->last_master); + first_master = policy_node->first_master; + last_master = policy_node->last_master; + + if (stm && stm->data->mshared) + first_master = last_master = STM_SHARED_MASTERID; + + count = sprintf(page, "%d %d\n", first_master, last_master); return count; } @@ -106,6 +113,13 @@ stp_policy_node_masters_store(struct config_item *item, const char *page, if (!stm) goto unlock; + /* + * masterIDs are allocated in HW, no point in trying to + * change their values. + */ + if (stm->data->mshared) + goto unlock; + /* must be within [sw_start..sw_end], which is an inclusive range */ if (first > INT_MAX || last > INT_MAX || first > last || first < stm->data->sw_start || diff --git a/include/linux/stm.h b/include/linux/stm.h index 9d0083d..6fac8b1 100644 --- a/include/linux/stm.h +++ b/include/linux/stm.h @@ -18,6 +18,11 @@ #include /** + * The masterIDs are set in hardware and can't be queried + */ +#define STM_SHARED_MASTERID -1 + +/** * enum stp_packet_type - STP packets that an STM driver sends */ enum stp_packet_type { @@ -46,6 +51,8 @@ struct stm_device; * struct stm_data - STM device description and callbacks * @name: device name * @stm: internal structure, only used by stm class code + * @mshared: true if masterIDs are assigned in HW. If so @sw_start + * and @sw_end are set to '1' by the core. * @sw_start: first STP master available to software * @sw_end: last STP master available to software * @sw_nchannels: number of STP channels per master @@ -71,6 +78,7 @@ struct stm_device; struct stm_data { const char *name; struct stm_device *stm; + bool mshared; unsigned int sw_start; unsigned int sw_end; unsigned int sw_nchannels;