Message ID | 20250312225949.969716-7-michal.winiarski@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show
Return-Path: <dri-devel-bounces@lists.freedesktop.org> X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CEF42C28B28 for <dri-devel@archiver.kernel.org>; Wed, 12 Mar 2025 23:01:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 40EDC10E7DA; Wed, 12 Mar 2025 23:01:16 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="FRLmUANv"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.19]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1EDCB10E7D9; Wed, 12 Mar 2025 23:01:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1741820474; x=1773356474; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=BisXOnZ5cEvZI+ssx95p+8hjk5ouP7x3ssYTV+BBEos=; b=FRLmUANvArsCv8tsC/SfVkHVqe8Pgla8DMBJLiYTdRHvQhz7/ZbaCpZp fjDFKdotIwwI7ue7YqJT0NpcwByD6pAgSKhv/TdenZvwvnJnk05kxr2Is Iu8FNKpyRNbZdMJQMuJgHodEEjGIG6fKH5A4WPDvnpmHIIG0CkTGQaHLz 969cy28nXS/7p3fPJGt7yYyDnON0CFChm58AKlyM+WRoMKwnYolw/Kx/K qcybsvV6M29GyZlUKZm6cpVCKsskx4tgtXqdAJxZtriLINme0sc8lURZQ DoapToJQ2NAEYbSYNuVLA7BZD1/oQ9tkzICsru+aO5rJsTLo2zBPQKWTN g==; X-CSE-ConnectionGUID: jv8Mf0dvS0SfHY1gQsSmVg== X-CSE-MsgGUID: mw3pE1s3R3yQob21qWyTiw== X-IronPort-AV: E=McAfee;i="6700,10204,11371"; a="42088710" X-IronPort-AV: E=Sophos;i="6.14,243,1736841600"; d="scan'208";a="42088710" Received: from fmviesa008.fm.intel.com ([10.60.135.148]) by fmvoesa113.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Mar 2025 16:01:13 -0700 X-CSE-ConnectionGUID: 5Wr/6eFKTWuBVLOipHRLDw== X-CSE-MsgGUID: Ubc7HvXHSBOOmvKfazc20Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.14,243,1736841600"; d="scan'208";a="121006911" Received: from orsmsx902.amr.corp.intel.com ([10.22.229.24]) by fmviesa008.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Mar 2025 16:01:13 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Wed, 12 Mar 2025 16:01:12 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14 via Frontend Transport; Wed, 12 Mar 2025 16:01:12 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.175) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.44; Wed, 12 Mar 2025 16:01:11 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eYHVXrABm3fEWjKMWhwTCnI1Mb1rQlcZpaxSK/Mj97O9pF74EZLJ3niG1+awlay3n8EqPsvfaVGKrrPwKfLIipzeC3ktalzAmRCrIpp7hlTOgliM5tZ5Ntua4WBojha8mq1WY3XvDuPY4HgGgc6w1zmFLeaQfkW08dWrCp3c4roQ02vFBev0TqzIioe1qvYtALaGUHxy94Zcy0eIdIU7T6GooK4LvbLiqdsvrMcOVaPBPDbZnBXCwy+GLLNlze6GT/jqtYUSIJTh3+GwMFPRGn8NQQwuq6ltHvEuxtA9uqzYYhan+/Ok+I+ScaqBoOA3jjaBHFb9Ch+wG1YVmRC60g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=U0OxEcu+K2ART199oOw5i/HpMIa5ejIljMcmNngQLbA=; b=ELM101RQe2DYokK9J530ZKuciAy8YynworeRV1skQAe88D9q9RgfaAc+lTJY8shky0xRJHbtDv+xNJzqGfK3JsJ/mU4te25urMuk8BJvCDpNWWxNXCXzUj5i7T0AQ3u4/AawjP4bPu+MfmtQAMZVMejRgRA1t1oUgsHQM3Nvs/HX+mZ15iyxB8n+sWqZccli5CwtE+XFww8OImF/SqsOP+6L3iKNlf662d5D1NWmJ4gOJ7HiGUUxWRNnq1bA7yM1BzUzxwO0xyKQ3Ol/6U6JZhHSsK3XvLJE8xYbEUkOLTW3BRjsCbG0C49ZIOhOUoo+DZ7HP8ICtTzjfnKUXojUXw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from DM4PR11MB5373.namprd11.prod.outlook.com (2603:10b6:5:394::7) by SA1PR11MB6735.namprd11.prod.outlook.com (2603:10b6:806:25e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8511.27; Wed, 12 Mar 2025 23:00:57 +0000 Received: from DM4PR11MB5373.namprd11.prod.outlook.com ([fe80::927a:9c08:26f7:5b39]) by DM4PR11MB5373.namprd11.prod.outlook.com ([fe80::927a:9c08:26f7:5b39%6]) with mapi id 15.20.8511.026; Wed, 12 Mar 2025 23:00:57 +0000 From: =?utf-8?q?Micha=C5=82_Winiarski?= <michal.winiarski@intel.com> To: <linux-pci@vger.kernel.org>, <intel-xe@lists.freedesktop.org>, <dri-devel@lists.freedesktop.org>, <linux-kernel@vger.kernel.org>, "Bjorn Helgaas" <bhelgaas@google.com>, =?utf-8?q?Christian_K=C3=B6nig?= <christian.koenig@amd.com>, =?utf-8?q?Krzy?= =?utf-8?q?sztof_Wilczy=C5=84ski?= <kw@linux.com>, =?utf-8?q?Ilpo_J=C3=A4rvi?= =?utf-8?q?nen?= <ilpo.jarvinen@linux.intel.com> CC: Rodrigo Vivi <rodrigo.vivi@intel.com>, Michal Wajdeczko <michal.wajdeczko@intel.com>, Lucas De Marchi <lucas.demarchi@intel.com>, =?utf-8?q?Thomas_Hellstr=C3=B6m?= <thomas.hellstrom@linux.intel.com>, Maarten Lankhorst <maarten.lankhorst@linux.intel.com>, Maxime Ripard <mripard@kernel.org>, Thomas Zimmermann <tzimmermann@suse.de>, David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>, Matt Roper <matthew.d.roper@intel.com>, =?utf-8?q?Micha=C5=82_Winiarski?= <michal.winiarski@intel.com> Subject: [PATCH v5 6/6] drm/xe/pf: Set VF LMEM BAR size Date: Wed, 12 Mar 2025 23:59:49 +0100 Message-ID: <20250312225949.969716-7-michal.winiarski@intel.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250312225949.969716-1-michal.winiarski@intel.com> References: <20250312225949.969716-1-michal.winiarski@intel.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-ClientProxiedBy: MI2P293CA0014.ITAP293.PROD.OUTLOOK.COM (2603:10a6:290:45::13) To DM4PR11MB5373.namprd11.prod.outlook.com (2603:10b6:5:394::7) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR11MB5373:EE_|SA1PR11MB6735:EE_ X-MS-Office365-Filtering-Correlation-Id: 50750f3f-792b-40d9-f8bb-08dd61b9bfca X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?Eyt1csQlah3tVJ7+6rMG42URsnWnpHO?= =?utf-8?q?4CeH3n4LRae2dFNAB06fV7HZHDNdUwsWHsdyymkYPfcjUbKonagVzYlrp+JZu3kre?= =?utf-8?q?O2Q/GAAQHQd5/uiX8ETHoe6RWGkl3KQ+pbWKIWmLhQRM1Pg5o3qxU2UDMz8xbfPR1?= =?utf-8?q?q61x4L0js1xrtXXpQTWUQ2Gyfss8/Fs2qFJm9zvD0cKVerCnr0SJR2SNFchbAFki9?= =?utf-8?q?DzS/6L3aejOtyPNp7Ei5G+YcOzR7BKAhZQGulH++oRnKnKnCL96WOX0rs3qwxPnTL?= =?utf-8?q?2c2lMDqkz7rfTcg63008/mGP4jplpv2LpOguyTYNXw01QVXHadB0xesb3uKjSsNzk?= =?utf-8?q?mhnqifUWjI2OEvMay3bDKq8Oj+uQTS8GSUfrmtDuRmPRQ6U2AkJZ8ZZVTinxYeYF9?= =?utf-8?q?OcGt6IfcgI1JRLxZkJlOvrQ0tSHt7DNQ77qTGZ2TswnIJL+BCJd/7XCAxOISzb/aD?= =?utf-8?q?ySxPMvbRUEWVGUoZncwQVHanupWgPCZVQc+UD1mGlMOKmAXq9Na5NhLoPNDmsZqaS?= =?utf-8?q?VYwvOb++P3CfnVYQHBVMx32/g/+Z0F5kCj7XEZGNmpsyculuCiTmIyNFp9L8kmKwX?= =?utf-8?q?AbXAsOwMvyHWGK2+/bDxpH3vAVrrMgXHGi3UmNv5buMjfFWzbKRjw37wU/vGJNkZU?= =?utf-8?q?olqqjW8BVesLff8/PCynjKXAX5tvAel9PNN7iT4i6xIvrmts3+OIqo5yDooXoRjN4?= =?utf-8?q?Bk+h9UEON1C4oOfFc74cVMd5vP0mgqMh/bFDu3gcsDyTMB0kc4DSZCuXn4fBl6dHW?= =?utf-8?q?y1tGnrMAn6D9WsWTZp4AwbYNMmQfmnAGs8BpqdVwp8bHNL+4Im61UjjTg8ZiAEsBi?= =?utf-8?q?vNV3sLJDBmteguCcoBxYnGmGJx29TBjh2ggE0/Fw/49dzpd1oG+pazbrfsA3Cr8k8?= =?utf-8?q?xgH4HfK71yuFnF2DsdM+XuctlTOpar2DSXrzitPG8haf7wnOEXhCLwS38hZEXOeYK?= =?utf-8?q?pSKN8oiWxSH9Khj+aGT9krraJjFVDpp7tnfsv4WyRLRJmz/rPrGTB2iMi8hkq6eWj?= =?utf-8?q?GNiRwKZhmeLL1nV55mqywgC5pi8KeCteObI90wj22snFzUw3WCOoIBciUIB7NT7KT?= =?utf-8?q?+YcW9cA6Ss0bu9+uB1DjwYDLijCk2D4rFn1sdq0umCPljpGZ0PKwqaI0JpzVEMkNo?= =?utf-8?q?kNTSvRcvVHfqdVvo7rh5rOh9qYaptGK3XD89Fer+XLfEIw/29Ae5ys4PEdzb3wUQl?= =?utf-8?q?sNQyAtEe/u/ewsHv+eDj2L+AffR4BU+0JQ/p+MEjivSLErhlcQ7Dxg/vrKOelXGc4?= =?utf-8?q?AxU8Uj4BBH/cK5rxrnRbd8iwY3ozTGfQv/NOMpM1WV24LN/Jo9+t17FrNPneIQK3M?= =?utf-8?q?n0hgwXpEDKXx?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM4PR11MB5373.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(1800799024)(376014)(7416014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?lqLOWcyh68iismY+fhAYhn45Rq4L?= =?utf-8?q?F9BkKsBU1kvndHrN2sUNKmDi3uKowQWpWX3VM3C6UEVFTB0ydHr5AUPkWsYIuoBgF?= =?utf-8?q?XSlG8Wv1MLO2ZGaZPS0kNEdXMuf54vnRWpFMalqBhPMy8gG4pvd4X745Ee/FHCVV8?= =?utf-8?q?m+chVGI7s20dV2MxxKX8JvYQHGPJnE8lMpbCTHK4VKvdEy8hzIPKareNHD6/QfTXT?= =?utf-8?q?TWoX2tl0KudA6pUKOvv5eEQIYENAMLJSf1SwiZuUh4A1RBvFOPzjTBW4TO/8s7n3j?= =?utf-8?q?AfkZoKP9vPUWR+863uut9e270mLwH2BF/5MmwXIz7MwZpYrfrweKf/Z9rJ+1i2S6R?= =?utf-8?q?lqIRDTKR9gWGFQTAOAxDxSeRptpq0F6rNiM2ZW1xJ+LTcN8VHTFPr0tZgnKOHpg/r?= =?utf-8?q?/3UDLLN29/Sb9WRSLrxUt9BMhTbt0Kw+NQM5StoW79ZtxfvbzNNDOv91pi3vQ7wfU?= =?utf-8?q?d5R3aEF+gXtyQ8cxvsa+qr6OOybBkFDkVWUomp/fYdIR6RyoOn6ylZZPQADiL805d?= =?utf-8?q?73vHHEpmAh7K2Yau/TQ4+4H2DspG3QfzGMm8eCtXF4U+uEWoo1ihjye0rWoNBM8G9?= =?utf-8?q?of496UM/QdpVMh4eqAwGSB7Gljb0r7DKSeM1PY5XcoKDVKYTTENXCTEluF/Wyq1LP?= =?utf-8?q?BHNMSA0eitxrkt7HlRpO4Mx4pmvMRciJD8FSOTfRH3tMiNUQaRyITMi3V+j50jFmR?= =?utf-8?q?BSdKFjenwq4cS0yOU+bipnYluWqMkrgKu39wXIFHatc6vkCdlSLCq3mmlscwUAMnK?= =?utf-8?q?1tSrH/w7ou/ZARUYRmjqs6w6Zbz3f1zXp5xl5qBI2TFkPmqyIAaF7fZ4uWOzOQoch?= =?utf-8?q?blGkJetXoBCK1oop8LW5M+R62BYOjB4UQe5C3z5dgTz3S742G7Slio4fbrjbdUVK7?= =?utf-8?q?WV71UdKWFaVU6gT5EIrac6f2gFv/Zil842Mjd98km0FTOxtuFieaX44ghq05YrECm?= =?utf-8?q?eqJdqeFEkibY7nigqkCwG+QbWej9G/KPaTqS8Fnh8iZg3lXbMWynlfoTwfkywqm87?= =?utf-8?q?YPYu/yVnWGsAfAkS3ZajGF65uGqU52VkEBNL/3ueFPCybi314zUpCMmijAzhYPIJ8?= =?utf-8?q?BrO7MWujkg1/whcgd5hn1QTHjZY7cNtqqvpaHLmHcjgnbHkpCZl/uZ6+12K6SwRL3?= =?utf-8?q?AkQw2Di+7//PPee2VvAZmkYrxXRQQTAffDmCH8vZdhWLSpURfexpfn+SX97s80QuX?= =?utf-8?q?enmv+O9gWpvwFzTiZUggmQp7u5ueDYA4vKWMi6OeypMGNIsRb52vfGPMKBApSaVfb?= =?utf-8?q?c4hzs/bBGaTv51lSCWy2d03NbcoRH64eF+QpI7oycLH3SCTYWCFgIU03Cz2RWOUQN?= =?utf-8?q?FbPP1++458MxJ8mleYji9GppZbmSQUuZt/WHjOO3bUSBBUAWwfUp0dpbHS2r9ATZp?= =?utf-8?q?wGBT0fMFZi/K+/ZCQLNLmtUKtATd1FlZwKBbbzEHlqqgL6Ri7mkSVzmdG1LT5GeNL?= =?utf-8?q?Ag2Pz+jM/EQ5pM2G2ml8yHhG6vfB5d+c2QHOXGQVZQSnLHeGmXitFm5A9QX/Th1fg?= =?utf-8?q?NmaVPxSAHqPrKdWjWIcJvTLl4vXfkzY//g=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 50750f3f-792b-40d9-f8bb-08dd61b9bfca X-MS-Exchange-CrossTenant-AuthSource: DM4PR11MB5373.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Mar 2025 23:00:57.2471 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4BoS0Jhgo86TTXMdSX/W/vsIKg+2+nFYeiryfHk86C44w3NMAEpmtIf/o8hgtDJ2dzRhIPrVvWnfTXyA48EEPAeVzZs1WhaWK9xyj4/ARyA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR11MB6735 X-OriginatorOrg: intel.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development <dri-devel.lists.freedesktop.org> List-Unsubscribe: <https://lists.freedesktop.org/mailman/options/dri-devel>, <mailto:dri-devel-request@lists.freedesktop.org?subject=unsubscribe> List-Archive: <https://lists.freedesktop.org/archives/dri-devel> List-Post: <mailto:dri-devel@lists.freedesktop.org> List-Help: <mailto:dri-devel-request@lists.freedesktop.org?subject=help> List-Subscribe: <https://lists.freedesktop.org/mailman/listinfo/dri-devel>, <mailto:dri-devel-request@lists.freedesktop.org?subject=subscribe> Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" <dri-devel-bounces@lists.freedesktop.org> |
Series |
PCI: VF resizable BAR
|
expand
|
diff --git a/drivers/gpu/drm/xe/regs/xe_bars.h b/drivers/gpu/drm/xe/regs/xe_bars.h index ce05b6ae832f1..880140d6ccdca 100644 --- a/drivers/gpu/drm/xe/regs/xe_bars.h +++ b/drivers/gpu/drm/xe/regs/xe_bars.h @@ -7,5 +7,6 @@ #define GTTMMADR_BAR 0 /* MMIO + GTT */ #define LMEM_BAR 2 /* VRAM */ +#define VF_LMEM_BAR 9 /* VF VRAM */ #endif diff --git a/drivers/gpu/drm/xe/xe_pci_sriov.c b/drivers/gpu/drm/xe/xe_pci_sriov.c index aaceee748287e..57cdeb41ef1d9 100644 --- a/drivers/gpu/drm/xe/xe_pci_sriov.c +++ b/drivers/gpu/drm/xe/xe_pci_sriov.c @@ -3,6 +3,10 @@ * Copyright © 2023-2024 Intel Corporation */ +#include <linux/bitops.h> +#include <linux/pci.h> + +#include "regs/xe_bars.h" #include "xe_assert.h" #include "xe_device.h" #include "xe_gt_sriov_pf_config.h" @@ -62,6 +66,18 @@ static void pf_reset_vfs(struct xe_device *xe, unsigned int num_vfs) xe_gt_sriov_pf_control_trigger_flr(gt, n); } +static int resize_vf_vram_bar(struct xe_device *xe, int num_vfs) +{ + struct pci_dev *pdev = to_pci_dev(xe->drm.dev); + u32 sizes; + + sizes = pci_iov_vf_bar_get_sizes(pdev, VF_LMEM_BAR, num_vfs); + if (!sizes) + return 0; + + return pci_iov_vf_bar_set_size(pdev, VF_LMEM_BAR, __fls(sizes)); +} + static int pf_enable_vfs(struct xe_device *xe, int num_vfs) { struct pci_dev *pdev = to_pci_dev(xe->drm.dev); @@ -88,6 +104,12 @@ static int pf_enable_vfs(struct xe_device *xe, int num_vfs) if (err < 0) goto failed; + if (IS_DGFX(xe)) { + err = resize_vf_vram_bar(xe, num_vfs); + if (err) + xe_sriov_info(xe, "Failed to set VF LMEM BAR size: %d\n", err); + } + err = pci_enable_sriov(pdev, num_vfs); if (err < 0) goto failed;
LMEM is partitioned between multiple VFs and we expect that the more VFs we have, the less LMEM is assigned to each VF. This means that we can achieve full LMEM BAR access without the need to attempt full VF LMEM BAR resize via pci_resize_resource(). Always set the largest possible BAR size that allows to fit the number of enabled VFs. Signed-off-by: Michał Winiarski <michal.winiarski@intel.com> --- drivers/gpu/drm/xe/regs/xe_bars.h | 1 + drivers/gpu/drm/xe/xe_pci_sriov.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+)