From patchwork Sun May 21 15:10:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: maddy X-Patchwork-Id: 765120 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wW4zX53mXz9s78 for ; Mon, 22 May 2017 01:12:56 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3wW4zX4GY9zDqgX for ; Mon, 22 May 2017 01:12:56 +1000 (AEST) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3wW4yH5Rj8zDqNs for ; Mon, 22 May 2017 01:11:51 +1000 (AEST) Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v4LF8RYw126058 for ; Sun, 21 May 2017 11:11:43 -0400 Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) by mx0a-001b2d01.pphosted.com with ESMTP id 2ak6gp43nu-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Sun, 21 May 2017 11:11:42 -0400 Received: from localhost by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 22 May 2017 01:11:39 +1000 Received: from d23relay06.au.ibm.com (202.81.31.225) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 22 May 2017 01:11:37 +1000 Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay06.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v4LFBS3x7078180 for ; Mon, 22 May 2017 01:11:36 +1000 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id v4LFAvEm026924 for ; Mon, 22 May 2017 01:10:57 +1000 Received: from SrihariSrinidhi.in.ibm.com ([9.79.185.160]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id v4LFALQF026069; Mon, 22 May 2017 01:10:54 +1000 From: Madhavan Srinivasan To: stewart@linux.vnet.ibm.com Date: Sun, 21 May 2017 20:40:06 +0530 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495379407-6658-1-git-send-email-maddy@linux.vnet.ibm.com> References: <1495379407-6658-1-git-send-email-maddy@linux.vnet.ibm.com> X-TM-AS-MML: disable x-cbid: 17052115-0008-0000-0000-0000012EF8DE X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17052115-0009-0000-0000-0000095DC1CC Message-Id: <1495379407-6658-10-git-send-email-maddy@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-05-21_13:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1705210093 Subject: [Skiboot] [PATCH v12 09/10] skiboot: Add core IMC related counter configuration X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: skiboot@lists.ozlabs.org MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" From: Anju T Sudhakar Add support to start, stop and initialize the core IMC counters. To initialize the core IMC counters, it takes a physical address per core as an input and writes that address to PDBAR[14:50] bits. It initializes the htm_mode and event_mask, where it selects the time interval at which the counter values must be posted to the given memory location and enables the counters to start running by setting the appropriate bits. To disable the core IMC counters (only stop counting), writes into appropriate bits of htm_mode to disable the counters. To enable the core IMC counters (only resume counting), writes into appropriate bits of the htm_mode to enable the counters. Signed-off-by: Hemant Kumar Signed-off-by: Anju T Sudhakar Signed-off-by: Madhavan Srinivasan --- hw/imc.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++--- include/imc.h | 10 ++++ include/opal-api.h | 1 + 3 files changed, 143 insertions(+), 6 deletions(-) diff --git a/hw/imc.c b/hw/imc.c index d56b3eb251b2..923a8fe48b5f 100644 --- a/hw/imc.c +++ b/hw/imc.c @@ -83,6 +83,26 @@ size_t imc_catalog_size; const char **imc_prop_to_fix(struct dt_node *node); const char *prop_to_fix[] = {"events", NULL}; + +/* + * A Quad contains 4 cores in Power 9, and there are 4 addresses for + * the CHTM attached to each core. + * So, for core index 0 to core index 3, we have a sequential range of + * SCOM port addresses in the arrays below, each for PDBAR and HTM mode. + */ +unsigned int pdbar_scom_index[] = { + 0x1001220B, + 0x1001230B, + 0x1001260B, + 0x1001270B +}; +unsigned int htm_scom_index[] = { + 0x10012200, + 0x10012300, + 0x10012600, + 0x10012700 +}; + static struct imc_chip_cb *get_imc_cb(void) { uint64_t cb_loc; @@ -341,19 +361,83 @@ err: * opal_imc_counters_init : This call initialize the IMC engine. * * For Nest IMC, this is no-op and returns OPAL_SUCCESS at this point. + * For Core IMC, this initializes core IMC Engine, by initializing + * these scoms "PDBAR", "HTM_MODE" and the "EVENT_MASK" in a given cpu. */ -static int64_t opal_imc_counters_init(uint32_t type) +static int64_t opal_imc_counters_init(uint32_t type, uint64_t addr, uint64_t cpu_pir) { - return OPAL_SUCCESS; + struct cpu_thread *c = find_cpu_by_pir(cpu_pir); + struct proc_chip *chip; + int core_id, phys_core_id, ret = OPAL_SUCCESS; + + switch (type) { + case OPAL_IMC_COUNTERS_NEST: + break; + case OPAL_IMC_COUNTERS_CORE: + assert(c); + chip = get_chip(c->chip_id); + assert(chip); + phys_core_id = cpu_get_core_index(c); + core_id = phys_core_id % 4; + + /* + * Core IMC hardware mandate initing of three scoms + * to enbale or disable of the Core IMC engine. + * + * PDBAR: Scom contains the real address to store per-core + * counter data in memory along with other bits. + * + * EventMask: Scom contain bits to denote event to multiplex + * at different MSR[HV PR] values, along with bits for + * sampling duration. + * + * HTM Scom: scom to enable counter data movement to memory. + */ + ret = xscom_write(chip->id, + XSCOM_ADDR_P9_EP(phys_core_id, + pdbar_scom_index[core_id]), + (u64)(CORE_IMC_PDBAR_MASK & addr)); + if (ret < 0) { + prerror("IMC: error in xscom_write for pdbar\n"); + goto hw_err; + } + + ret = xscom_write(chip->id, + XSCOM_ADDR_P9_EC(phys_core_id, + CORE_IMC_EVENT_MASK_ADDR), + (u64)CORE_IMC_EVENT_MASK); + if (ret < 0) { + prerror("IMC: error in xscom_write for event mask\n"); + goto hw_err; + } + + ret = xscom_write(chip->id, + XSCOM_ADDR_P9_EP(phys_core_id, + htm_scom_index[core_id]), + (u64)CORE_IMC_HTM_MODE_DISABLE); + if (ret < 0) { + prerror("IMC: error in xscom_write for htm mode\n"); + goto hw_err; + } + break; + default: + prerror("IMC: Unknown Domain int _INIT\n"); + return OPAL_PARAMETER; + } + + return ret; +hw_err: + return OPAL_HARDWARE; } -opal_call(OPAL_IMC_COUNTERS_INIT, opal_imc_counters_init, 1); +opal_call(OPAL_IMC_COUNTERS_INIT, opal_imc_counters_init, 3); -/* opal_imc_counters_control_start: This call starts the nest imc engine. */ +/* opal_imc_counters_control_start: This call starts the nest/core imc engine. */ static int64_t opal_imc_counters_start(uint32_t type) { u64 op, status; struct imc_chip_cb *cb; - int ret = OPAL_SUCCESS; + struct proc_chip *chip; + int core_id, phys_core_id, ret = OPAL_SUCCESS; switch (type) { case OPAL_IMC_COUNTERS_NEST: @@ -372,6 +456,28 @@ static int64_t opal_imc_counters_start(uint32_t type) cb->imc_chip_command = op; break; + case OPAL_IMC_COUNTERS_CORE: + /* + * Enables the core imc engine by appropriately setting + * bits 4-9 of the HTM_MODE scom port. No initialization + * is done in this call. This just enables the the counters + * to count with the previous initialization. + */ + chip = get_chip(this_cpu()->chip_id); + phys_core_id = cpu_get_core_index(this_cpu()); + core_id = phys_core_id % 4; + + ret = xscom_write(chip->id, + XSCOM_ADDR_P9_EP(phys_core_id, + htm_scom_index[core_id]), + (u64) CORE_IMC_HTM_MODE_ENABLE); + + if (ret < 0) { + prerror("IMC: error in xscom_write for htm_mode\n"); + return OPAL_HARDWARE; + } + + break; default: prerror("IMC: Unknown Domain in _START\n"); return OPAL_PARAMETER; @@ -386,7 +492,8 @@ static int64_t opal_imc_counters_stop(uint32_t type) { u64 op, status; struct imc_chip_cb *cb; - int ret = OPAL_SUCCESS; + struct proc_chip *chip; + int core_id, phys_core_id, ret = OPAL_SUCCESS; switch (type) { case OPAL_IMC_COUNTERS_NEST: @@ -405,6 +512,25 @@ static int64_t opal_imc_counters_stop(uint32_t type) cb->imc_chip_command = op; break; + case OPAL_IMC_COUNTERS_CORE: + /* + * Disables the core imc engine by clearing + * bits 4-9 of the HTM_MODE scom port. + */ + chip = get_chip(this_cpu()->chip_id); + phys_core_id = cpu_get_core_index(this_cpu()); + core_id = phys_core_id % 4; + + ret = xscom_write(chip->id, + XSCOM_ADDR_P9_EP(phys_core_id, + htm_scom_index[core_id]), + (u64) CORE_IMC_HTM_MODE_DISABLE); + if (ret < 0) { + prerror("IMC: error in xscom_write for htm_mode\n"); + return OPAL_HARDWARE; + } + + break; default: prerror("IMC: Unknown Domain in _STOP\n"); return OPAL_PARAMETER; diff --git a/include/imc.h b/include/imc.h index c7ad5fa933b7..5a3d53c22ca1 100644 --- a/include/imc.h +++ b/include/imc.h @@ -116,6 +116,16 @@ struct imc_chip_cb #define MAX_NEST_UNITS 48 +/* + * Core IMC SCOMs + */ +#define CORE_IMC_EVENT_MASK_ADDR 0x20010AA8ull +#define CORE_IMC_EVENT_MASK 0x0001020000000000ull +#define CORE_IMC_PDBAR_MASK 0x0003ffffffffe000ull +#define CORE_IMC_NCU_MODE 0x0800000000000000ull +#define CORE_IMC_HTM_MODE_ENABLE 0xE800000000000000ull +#define CORE_IMC_HTM_MODE_DISABLE 0xE000000000000000ull + void imc_init(void); void imc_catalog_preload(void); #endif /* __IMC_H */ diff --git a/include/opal-api.h b/include/opal-api.h index 02927356d033..5dbae2d57fde 100644 --- a/include/opal-api.h +++ b/include/opal-api.h @@ -1232,6 +1232,7 @@ enum { /* Operation argument to IMC Microcode */ enum { OPAL_IMC_COUNTERS_NEST = 1, + OPAL_IMC_COUNTERS_CORE = 2, };