[{"id":3674794,"web_url":"http://patchwork.ozlabs.org/comment/3674794/","msgid":"<e3bf5a0c-25dd-4920-bb00-7557989e043f@nvidia.com>","list_archive_url":null,"date":"2026-04-08T14:08:18","subject":"Re: [PATCH 2/2] ASoC: tegra210_amx: simplify byte map get/put logic","submitter":{"id":87986,"url":"http://patchwork.ozlabs.org/api/people/87986/","name":"Sheetal","email":"sheetal@nvidia.com"},"content":"On 07-04-2026 22:33, Piyush Patle wrote:\n> External email: Use caution opening links or attachments\n> \n> \n> The byte-map controls (\"Byte Map N\") already expose a value range of\n> [0, 256] to userspace via SOC_SINGLE_EXT(), where 256 is the\n> \"disabled\" sentinel. The driver stored this state as a byte-packed\n> u32 map[] array plus a separate byte_mask[] bitmap tracking which\n> slots were enabled, because 256 does not fit in a byte. As a result\n> get_byte_map() had to consult byte_mask[] to decide whether to\n> report the stored byte or 256, and put_byte_map() had to keep the\n> two arrays in sync on every write.\n> \n> Store each slot as a u16 holding the control value directly\n> (0..255 enabled, 256 disabled). This is the native representation\n> for what userspace already sees, so get_byte_map() becomes a direct\n> return and put_byte_map() becomes a compare-and-store. The\n> hardware-facing packed RAM word and the OUT_BYTE_EN mask are now\n> derived on the fly inside tegra210_amx_write_map_ram() from the\n> slot array, which is the only place that needs to know about the\n> hardware layout. This also lets us drop the byte_mask field from\n> struct tegra210_amx.\n> \n> Slots are initialised to 256 in probe() so the default reported\n> value stays \"disabled\", matching previous behaviour. Values written\n> from userspace that fall outside [0, 255] are clamped to 256\n> (\"disabled\") exactly as before -- no userspace-visible change.\n> \n> As a side effect this also fixes a latent bug in the previous\n> put_byte_map(): because it compared the enable mask rather than the\n> stored byte, changing a slot from one enabled value to another\n> enabled value (e.g. 42 -> 99) would early-return without persisting\n> the new value.\n> \n> Also fix a potential undefined behavior when constructing the packed\n> RAM word by ensuring the shift operates on a u32 value.\n> \n> Addresses TODO left in tegra210_amx_get_byte_map().\n> \n> Signed-off-by: Piyush Patle <piyushpatle228@gmail.com>\n> ---\n>   sound/soc/tegra/tegra210_amx.c | 77 ++++++++++++++++------------------\n>   sound/soc/tegra/tegra210_amx.h |  5 ++-\n>   2 files changed, 38 insertions(+), 44 deletions(-)\n> \n> diff --git a/sound/soc/tegra/tegra210_amx.c b/sound/soc/tegra/tegra210_amx.c\n> index bfda82505298..4dd158e6e974 100644\n> --- a/sound/soc/tegra/tegra210_amx.c\n> +++ b/sound/soc/tegra/tegra210_amx.c\n> @@ -60,6 +60,7 @@ static const struct reg_default tegra264_amx_reg_defaults[] = {\n> \n>   static void tegra210_amx_write_map_ram(struct tegra210_amx *amx)\n>   {\n> +       unsigned int byte_mask[TEGRA264_AMX_BYTE_MASK_COUNT] = { 0 };\n\n\nbyte_mask[] is sized to the chip-specific TEGRA264_AMX_BYTE_MASK_COUNT,\nbut the map array in probe() is already dynamically sized from\nsoc_data. Since soc_data->byte_mask_size is available here, kcalloc() \nwould be consistent and avoid coupling to a specific SoC variant's constant.\n\n\n>          int i;\n> \n>          regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_CTRL + amx->soc_data->reg_offset,\n> @@ -67,14 +68,28 @@ static void tegra210_amx_write_map_ram(struct tegra210_amx *amx)\n>                       TEGRA210_AMX_CFG_RAM_CTRL_ADDR_INIT_EN |\n>                       TEGRA210_AMX_CFG_RAM_CTRL_RW_WRITE);\n> \n> -       for (i = 0; i < amx->soc_data->ram_depth; i++)\n> +       for (i = 0; i < amx->soc_data->ram_depth; i++) {\n> +               u32 word = 0;\n> +               int b;\n> +\n> +               for (b = 0; b < 4; b++) {\n> +                       unsigned int slot = i * 4 + b;\n> +                       u16 val = amx->map[slot];\n> +\n> +                       if (val >= 256)\n> +                               continue;\n> +\n> +                       word |= (u32)val << (b * 8);\n\n\nThe literal '4' (bytes per RAM word) and '8' (bits per byte) are magic\nnumbers scattered through the code here and in probe function. Please \nconsider defining:\n   #define TEGRA_AMX_SLOTS_PER_WORD    4\nand using BITS_PER_BYTE from <linux/bits.h> for the shift.\n\n\n> +                       byte_mask[slot / 32] |= 1U << (slot % 32);\n> +               }\n>                  regmap_write(amx->regmap, TEGRA210_AMX_CFG_RAM_DATA + amx->soc_data->reg_offset,\n> -                            amx->map[i]);\n> +                            word);\n> +       }\n> \n>          for (i = 0; i < amx->soc_data->byte_mask_size; i++)\n>                  regmap_write(amx->regmap,\n>                               TEGRA210_AMX_OUT_BYTE_EN0 + (i * TEGRA210_AMX_AUDIOCIF_CH_STRIDE),\n> -                            amx->byte_mask[i]);\n> +                            byte_mask[i]);\n>   }\n> \n>   static int tegra210_amx_startup(struct snd_pcm_substream *substream,\n> @@ -212,26 +227,8 @@ static int tegra210_amx_get_byte_map(struct snd_kcontrol *kcontrol,\n>          struct soc_mixer_control *mc =\n>                  (struct soc_mixer_control *)kcontrol->private_value;\n>          struct tegra210_amx *amx = snd_soc_component_get_drvdata(cmpnt);\n> -       unsigned char *bytes_map = (unsigned char *)amx->map;\n> -       int reg = mc->reg;\n> -       int enabled;\n> \n> -       enabled = amx->byte_mask[reg / 32] & (1 << (reg % 32));\n> -\n> -       /*\n> -        * TODO: Simplify this logic to just return from bytes_map[]\n> -        *\n> -        * Presently below is required since bytes_map[] is\n> -        * tightly packed and cannot store the control value of 256.\n> -        * Byte mask state is used to know if 256 needs to be returned.\n> -        * Note that for control value of 256, the put() call stores 0\n> -        * in the bytes_map[] and disables the corresponding bit in\n> -        * byte_mask[].\n> -        */\n> -       if (enabled)\n> -               ucontrol->value.integer.value[0] = bytes_map[reg];\n> -       else\n> -               ucontrol->value.integer.value[0] = 256;\n> +       ucontrol->value.integer.value[0] = amx->map[mc->reg];\n> \n>          return 0;\n>   }\n> @@ -243,22 +240,20 @@ static int tegra210_amx_put_byte_map(struct snd_kcontrol *kcontrol,\n>                  (struct soc_mixer_control *)kcontrol->private_value;\n>          struct snd_soc_component *cmpnt = snd_kcontrol_chip(kcontrol);\n>          struct tegra210_amx *amx = snd_soc_component_get_drvdata(cmpnt);\n> -       unsigned char *bytes_map = (unsigned char *)amx->map;\n> -       int reg = mc->reg;\n> -       int value = ucontrol->value.integer.value[0];\n> -       unsigned int mask_val = amx->byte_mask[reg / 32];\n> +       unsigned int value = ucontrol->value.integer.value[0];\n> \n> -       if (value >= 0 && value <= 255)\n> -               mask_val |= (1 << (reg % 32));\n> -       else\n> -               mask_val &= ~(1 << (reg % 32));\n> +       /*\n> +        * Match the previous behaviour: any value outside [0, 255] is\n> +        * treated as the \"disabled\" sentinel (256). Negative values from\n> +        * userspace fold in through the unsigned cast and are caught here.\n> +        */\n> +       if (value > 255)\n> +               value = 256;\n> \n> -       if (mask_val == amx->byte_mask[reg / 32])\n> +       if (amx->map[mc->reg] == value)\n>                  return 0;\n> \n> -       /* Update byte map and slot */\n> -       bytes_map[reg] = value % 256;\n> -       amx->byte_mask[reg / 32] = mask_val;\n> +       amx->map[mc->reg] = value;\n> \n>          return 1;\n>   }\n> @@ -727,7 +722,7 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)\n>          struct device *dev = &pdev->dev;\n>          struct tegra210_amx *amx;\n>          void __iomem *regs;\n> -       int err;\n> +       int err, i;\n> \n>          amx = devm_kzalloc(dev, sizeof(*amx), GFP_KERNEL);\n>          if (!amx)\n> @@ -750,16 +745,14 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)\n> \n>          regcache_cache_only(amx->regmap, true);\n> \n> -       amx->map = devm_kzalloc(dev, amx->soc_data->ram_depth * sizeof(*amx->map),\n> -                               GFP_KERNEL);\n> +       amx->map = devm_kcalloc(dev, amx->soc_data->ram_depth * 4,\n> +                               sizeof(*amx->map), GFP_KERNEL);\n>          if (!amx->map)\n>                  return -ENOMEM;\n> \n> -       amx->byte_mask = devm_kzalloc(dev,\n> -                                     amx->soc_data->byte_mask_size * sizeof(*amx->byte_mask),\n> -                                     GFP_KERNEL);\n> -       if (!amx->byte_mask)\n> -               return -ENOMEM;\n> +       /* Initialize all byte map slots as disabled (value 256). */\n> +       for (i = 0; i < amx->soc_data->ram_depth * 4; i++)\n> +               amx->map[i] = 256;\n> \n>          tegra210_amx_dais[TEGRA_AMX_OUT_DAI_ID].capture.channels_max =\n>                          amx->soc_data->max_ch;\n> diff --git a/sound/soc/tegra/tegra210_amx.h b/sound/soc/tegra/tegra210_amx.h\n> index 50a237b197ba..6df9ab0fe220 100644\n> --- a/sound/soc/tegra/tegra210_amx.h\n> +++ b/sound/soc/tegra/tegra210_amx.h\n> @@ -8,6 +8,8 @@\n>   #ifndef __TEGRA210_AMX_H__\n>   #define __TEGRA210_AMX_H__\n> \n> +#include <linux/types.h>\n> +\n>   /* Register offsets from TEGRA210_AMX*_BASE */\n>   #define TEGRA210_AMX_RX_STATUS                 0x0c\n>   #define TEGRA210_AMX_RX_INT_STATUS             0x10\n> @@ -105,8 +107,7 @@ struct tegra210_amx_soc_data {\n> \n>   struct tegra210_amx {\n>          const struct tegra210_amx_soc_data *soc_data;\n> -       unsigned int *map;\n> -       unsigned int *byte_mask;\n> +       u16 *map;\n>          struct regmap *regmap;\n>   };\n> \n> --\n> 2.34.1\n> \n\n\nSame comments apply to the ADX patch (patch 1/2) as well.\n\nThanks,\nSheetal","headers":{"Return-Path":"\n <linux-tegra+bounces-13610-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-tegra@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256\n header.s=selector2 header.b=Nez0Ugm2;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-tegra+bounces-13610-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=\"Nez0Ugm2\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.62.9","smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com","smtp.subspace.kernel.org;\n spf=fail smtp.mailfrom=nvidia.com","dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=nvidia.com;"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frQ662mrnz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 00:13:50 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 4FD87306C86D\n\tfor <incoming@patchwork.ozlabs.org>; Wed,  8 Apr 2026 14:08:38 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 2C6033D170B;\n\tWed,  8 Apr 2026 14:08:38 +0000 (UTC)","from DM5PR21CU001.outbound.protection.outlook.com\n (mail-centralusazon11011009.outbound.protection.outlook.com [52.101.62.9])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id B5A883D171B;\n\tWed,  8 Apr 2026 14:08:35 +0000 (UTC)","from DSSPR12MB999212.namprd12.prod.outlook.com (2603:10b6:8:376::11)\n by IA0PR12MB7627.namprd12.prod.outlook.com (2603:10b6:208:437::12) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.18; Wed, 8 Apr\n 2026 14:08:28 +0000","from DSSPR12MB999212.namprd12.prod.outlook.com\n ([fe80::5e39:8f96:935a:87ba]) by DSSPR12MB999212.namprd12.prod.outlook.com\n ([fe80::5e39:8f96:935a:87ba%3]) with mapi id 15.20.9769.015; Wed, 8 Apr 2026\n 14:08:28 +0000"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775657317; cv=fail;\n b=NDhL14VkYJR1wMovO7NZrva40an7ebMrQJTQRP0EGKg0ctmt/DOBJOua4kdNBpdnqdBBQWcRu/0pYUHaoxDkr32+wPpJNN4qaFtxrP8RaYbX0IU/vJn+a4osC5FiUaMeRpPE6PWkhyt9RiDWmVrPiMLeIIf4RVX0vH4R3ADARmI=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=XG0snVFftXilu9jfg+/sW5mgnrbQY1okVIjjr2KC421ZObAd0BPi+nWUnyNj/YTrprUTsxZ9bhehA4B8S/vWt09Ej39pFjpV9JB7WgNz+472iYqHon+ZvZe9FbtSNFTPKJjjiMRPcRqews0rthCDUqbRfWEu7e9ncHVpuq1lBVDwL7HTI5xq+A3+TG+uG0+LyTsaWifOmmJOqVe9JMgkdcIoxUnJmepksRmx9ZilarkKLnQ6QQAxfFokqjmY63nru1kEhtAlrvisdMWAf6omvtGTGjRNzS3+t2Ru2/jyrVBmP22rl6U55I9qn3BS9RxAhdbnzbowmf1HmQfukdeK9Q=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775657317; c=relaxed/simple;\n\tbh=49aiw3v80l6WyZL/DQHUolefx+4KnepQsjetQ6htcpw=;\n\th=Message-ID:Date:Subject:To:Cc:References:From:In-Reply-To:\n\t Content-Type:MIME-Version;\n b=jUGwFzZTKw80z4b8GAJJTFGKlRc/itoWe9fYZvv+FJvHHrVOlcqWldmBVoZWl41u3rYIWbBrwSkneMxcrbRq/ir9gk7KsnkdBIHFuECrXZ5DHFnwCs2NmkC7ySJ2uKCMdTQINWJ/ZUkYSjFgo8ymvvtkOV2WpmGCc7Aa2iQnYPs=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=frd3buDo5GZY9CsQyNzjc9m4ia4Ih18f+W+WQ0q9erU=;\n b=CmoHIh0zhjwKTpZtTs8XsQiBeGd+x1ZLEepOQf1BhW3nucWl0u8xZlCnOYYHN+fEvRAdomkEvrugtu37bh5I7DNYO3SZS2Pcg1Tj9MV37jAM/78ac5CFJW+q9ItTGTu/6G1WNKgyYmXEfktMB9N9erkIQ4MHt97gBBJ4HMbniOg3bfYwNyGp01LYoLMB0NBnKVdXvlaTAEOcrmWX0+NzLieM4WX8EUtSLQUHcYLJPwxKuDHIgGy1HC6wQNb4OHVutd+Pzw36v/DzyoIbAQEZcOa+sZ4AL+xSkhZKzsQpF/56Y7Rgcwl/wYqwGjmhrp2D+r4mlO/HT39fQqHT7WfLyw=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com;\n spf=fail smtp.mailfrom=nvidia.com;\n dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=Nez0Ugm2; arc=fail smtp.client-ip=52.101.62.9","i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com;\n dkim=pass header.d=nvidia.com; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=frd3buDo5GZY9CsQyNzjc9m4ia4Ih18f+W+WQ0q9erU=;\n b=Nez0Ugm2WmUyEZLlfVxDkDhugYuNbSQlQgJ5kP3CxTFzjvZSrvyAoOfkisBcoQsXUUfxJiYL8EyWVJij7L3Pm1iFkzM6hOdztctNQj9DxepIA14IDW5xSjeJL+jpn/zFzE5GBwIj2aM9JrhnVyxTQd8LjRclNcEaQnuR4K0Baw5l4v8iO5eBaF1vqohwG++2CpevtFjOj5gedsKfNig7Ueg5HDwNwwIlXTAMGT8G/ZndtFW/e7N1XwVrQmNmEYQeu8cRCblt8H7AenGJv8cIiG4QV9/RalfreMXXLRaytY7EV2SmB9KDZHXLHNu9qs+BaQ69bETFbrzOTzBNanzCOQ==","Message-ID":"<e3bf5a0c-25dd-4920-bb00-7557989e043f@nvidia.com>","Date":"Wed, 8 Apr 2026 19:38:18 +0530","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] ASoC: tegra210_amx: simplify byte map get/put logic","To":"Piyush Patle <piyushpatle228@gmail.com>, Mark Brown <broonie@kernel.org>","Cc":"Liam Girdwood <lgirdwood@gmail.com>, Jaroslav Kysela <perex@perex.cz>,\n Takashi Iwai <tiwai@suse.com>, Thierry Reding <thierry.reding@gmail.com>,\n Jonathan Hunter <jonathanh@nvidia.com>,\n Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,\n linux-sound@vger.kernel.org, linux-tegra@vger.kernel.org,\n linux-kernel@vger.kernel.org","References":"<20260407170308.100238-1-piyushpatle228@gmail.com>\n <20260407170308.100238-3-piyushpatle228@gmail.com>","Content-Language":"en-US","From":"\"Sheetal .\" <sheetal@nvidia.com>","In-Reply-To":"<20260407170308.100238-3-piyushpatle228@gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-ClientProxiedBy":"MA5PR01CA0156.INDPRD01.PROD.OUTLOOK.COM\n (2603:1096:a01:1ac::6) To DSSPR12MB999212.namprd12.prod.outlook.com\n (2603:10b6:8:376::11)","Precedence":"bulk","X-Mailing-List":"linux-tegra@vger.kernel.org","List-Id":"<linux-tegra.vger.kernel.org>","List-Subscribe":"<mailto:linux-tegra+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-tegra+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"DSSPR12MB999212:EE_|IA0PR12MB7627:EE_","X-MS-Office365-Filtering-Correlation-Id":"7c78cff4-1ded-43ea-a7b7-08de95784e9f","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"\n\tBCL:0;ARA:13230040|376014|7416014|366016|1800799024|22082099003|56012099003|18002099003;","X-Microsoft-Antispam-Message-Info":"\n\taGnTtjGvewqX8KeQ1J6hw9AduLQtSVYus0Imt9qdZxqYCd/oXiLojE+RHlyuiRPdxOBiUEOzPxxVZdpGCH04mjnXA0erf/j1vOULEY6AcgeQgr5dW2xTkbGdfn2sqste0VluT1BvI5ctljJaKftqdlt/0DlXQIkfLXjiHRVvG6xe/6craO2O4nmR8985rhsmPWl2U4nBQObS/y8MXjau6PGlFMME8xGM819OBABNIP9F2M89p3cmkkPQyrKfj5m2E6GMvAZT1aQsoMx3GXVMLi613i9/ajNTQ76JyerrU/b/veuAsmyMFRgoDRDk10Uti8SEFT+bWqOpSBbTkSfdFMp3zTZYZFhN5jgZZEgFZx2lAKLfPYBXWEKF75UJbiKn5F7IY7vsgAXio0Q5Kmu4KRXBGGXa04BpATC7g8Vfeg3usRAO0T+gWnjDFnrk3GFMie4VelJuaPSKc5+wbo3VDLSKe3LSL7llLAtHgT2SxOshxWAk0I+jd0vUqN6O///j1zXzC69ykiALQ3OaZx1+T6a6H8+QQZ9q7PUUsYRVRIP8FDF0Nr5fX7F7VRKUfyefQVQzks+C57HB7bqTM76a+5XdY9oZ6evB4TJnQzJNveAdmzF5PS8XGAfoiRiyPDuAhQdRwZ436VNmBDhfI+NKgk0ddp6GF/vd2eUlCH8vEol1zZAS/7Bp7tsN74/1sMqrcbJhaDIDGu0W4S6krwF9Ul7ENqYxf+eehuQH/xgVxbA=","X-Forefront-Antispam-Report":"\n\tCIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DSSPR12MB999212.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(22082099003)(56012099003)(18002099003);DIR:OUT;SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"=?utf-8?q?589yBf0bBDkbu26YfR8YA1iCBSiT?=\n\t=?utf-8?q?qTRBOsAL2LS2rIf3tH8eJeF3H09544PrV3tpQY67q2W7cr8Tj2M9DKYc/YiN/R+mK?=\n\t=?utf-8?q?O3XR59Bq53RRP6fu/rdy60TPo+XIDQEwwiNNcDHeZzPXWuAgITD2KXO1ErXHlP4F5?=\n\t=?utf-8?q?hTN6me5PfLX7WdfnNPrOOZzAgiRlVSuwKZn4xxuOzxCbwq7GfUte1PmhfcVWijVVR?=\n\t=?utf-8?q?jnlRMiQvcoW2CVP3Gaf5rTkTpmKF6A0Ns9R/J2RbVfI4v1q9JbUC0VeJAhEiYRyBN?=\n\t=?utf-8?q?LkLgWg5Hb+OF/IpoZkGU7O9ABSqh0xaRtgdzRyou6E1hSLrluRY3NiyKCt5Xe1Y9N?=\n\t=?utf-8?q?hznO0obH1kDeBU4+r2FN66z6gNVgyiupUqAG5K/rorur89GYmjuE7twMqNP1zo15B?=\n\t=?utf-8?q?KH9+KOLu2D2a+E9GBZDuT0+kZZKWyIDAdYCGjFsc80HoHFRNh+0eh8Za4KoegNPE6?=\n\t=?utf-8?q?Ev9WNQ57AoWPKbBYYV8jxj3m6TpiE4997L0/7UTvzlqsFsjR1s+Vrh0GjrW4sQ+Bz?=\n\t=?utf-8?q?BLfGCa0xGAbOSt5XuJF/aUnObwu6MT/IKsHTI46OXIBMclgtm00WTlVmEIqKUqZl/?=\n\t=?utf-8?q?/g1aTtsvaUjewBx9+dIvVUD01t0+zWYF9Lb7ncgw2Zwc6qqqiczFlQyelGjCGWJlr?=\n\t=?utf-8?q?Oq7gMJqrUllDWz40AFjW6S2XHHWLZJqxD9Rar8Af6jy1an6Tu6/Lf0yqLmi13GfaF?=\n\t=?utf-8?q?UYxCFmH6kR/Ih8nXcdyWB4YCMYwk8rL2MNL1UV7uloxvJT2CZjNqOA3gVlc6rt3uu?=\n\t=?utf-8?q?Kzb7YHAbkWFmFJ8GTbNuAigHIN0qfP22svHvPK+wzqGm13TWCBGxo1ybVduBCAruk?=\n\t=?utf-8?q?jKIFKvGfR2hOGAjz9ezuOfRpK0y3b9FG8aqftzFSGQsGrDhyrbZlBVo0o//VKr6xp?=\n\t=?utf-8?q?W8Veg51Axp4mNS47zhOmAUgOzWKSecdEUpIhr9Aop+DGmUzSXrM7EatVsCs+oIovD?=\n\t=?utf-8?q?S3bsz8B0MDIJMadteNbje5igxKrv9eOdUF6IZI2dt/ZZCY1099Mt3AzhbBalrBQni?=\n\t=?utf-8?q?BTEgYLm8fP15oBZ1XWeIK5hs6Av7Luh2xYn/NaVsjjHbRyToHZTSDQlkgnsiFKFjx?=\n\t=?utf-8?q?V75H7/tdVhkOjlWN8GlhAOedDzNyPGy0mIw3+C+H5Pz4hQJLvibjiVRZ81jek9MTA?=\n\t=?utf-8?q?R4Mnxi5BIl+6OXpd2e6CTREElucJnBqMASOYmEeCICIQmHAAeEsjF31Dpv0EOfoOi?=\n\t=?utf-8?q?CFMW0YlnfV3AhdMwyPXg6lxi77HiNhSNawXvxYe/Dy9GMC/JMjWRSMnS1rXCeDDol?=\n\t=?utf-8?q?u8/29f3WJO+5yp+lI/M/k+kO27ZO4Cvwh/lPPUR/0EA39B9UgVBauDzg1jpvN7cT4?=\n\t=?utf-8?q?2DwKXu7gvWq5nwJ/c7EQXKHLMZH+p9N6udvQHUqf3TV8lIgtjwXssGh6W8w1771sp?=\n\t=?utf-8?q?wG7Jlw3Zlwzv7mTp9iRTxEy+12KtH1yzUYaSbKoY7NpGHDjaU3WKcrG8Y6QW1J9SA?=\n\t=?utf-8?q?fnVG/jDAFCtCXQv1AfcuRkaLqTGJ52tPS8AapqWTNnO82KF3vRgI+ZEjrg7bN2g/W?=\n\t=?utf-8?q?OIjmxpH+OBVOr3t4MqW6e56BhzL6NsJuQyjtSCsCehNT91V+MP1sRkqOD+imziawO?=\n\t=?utf-8?q?lTcZk70YfCiJVEMVZ3unhgMY3lEKAw/o9JnhTYJxin8nhP7EmjmHLp0IDX1yU49Rq?=\n\t=?utf-8?q?tyoOPP7Ti62dkHi9y2MrjgY9+jaIjoOw=3D=3D?=","X-OriginatorOrg":"Nvidia.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 7c78cff4-1ded-43ea-a7b7-08de95784e9f","X-MS-Exchange-CrossTenant-AuthSource":"\n DSSPR12MB999212.namprd12.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"08 Apr 2026 14:08:28.1576\n (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"43083d15-7273-40c1-b7db-39efd9ccc17a","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"\n dWfkdlw+OSvjeBVCZJgPXK/vKQG3HNFnZo9GAvtCQJaJRhKlbVGOCpVYMlGngg/aa2vwgFXZWTbmQJQ6NkTnWg==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"IA0PR12MB7627"}}]