[{"id":3687761,"web_url":"http://patchwork.ozlabs.org/comment/3687761/","msgid":"<2e1c9a71-46e7-4036-91ac-86453564b223@de.bosch.com>","list_archive_url":null,"date":"2026-05-07T12:14:36","subject":"Re: [PATCH v2 00/25] rust: device: Higher-Ranked Lifetime Types for\n device drivers","submitter":{"id":10121,"url":"http://patchwork.ozlabs.org/api/people/10121/","name":"Dirk Behme","email":"dirk.behme@de.bosch.com"},"content":"On 06.05.2026 23:50, Danilo Krummrich wrote:\n> Currently, Rust device drivers access device resources such as PCI BAR mappings\n> and I/O memory regions through Devres<T>.\n> \n> Devres::access() provides zero-overhead access by taking a &Device<Bound>\n> reference as proof that the device is still bound. Since a &Device<Bound> is\n> available in almost all contexts by design, Devres is mostly a type-system level\n> proof that the resource is valid, but it can also be used from scopes without\n> this guarantee through its try_access() accessor.\n> \n> This works well in general, but has a few limitations:\n> \n>    - Every access to a device resource goes through Devres::access(), which\n>      despite zero cost, adds boilerplate to every access site.\n> \n>    - Destructors do not receive a &Device<Bound>, so they must use try_access(),\n>      which can fail. In practice the access succeeds if teardown ordering is\n>      correct, but the type system can't express this, forcing drivers to handle a\n>      failure path that should never be taken.\n> \n>    - Sharing a resource across components (e.g. passing a BAR to a sub-component)\n>      requires Arc<Devres<T>>.\n> \n>    - Device references must be stored as ARef<Device> rather than plain &Device\n>      borrows.\n> \n> These limitations stem from the driver's bus device private data being 'static\n> -- the driver struct cannot borrow from the device reference it receives in\n> probe(), even though it structurally cannot outlive the device binding.\n> \n> This series introduces Higher-Ranked Lifetime Types (HRT) for Rust device\n> drivers. An HRT is a type that is generic over a lifetime -- it does not have a\n> fixed lifetime, but can be instantiated with any lifetime chosen by the caller.\n> \n> Rust does not directly support types that are generic over a lifetime as type\n> parameters; the ForLt trait (contributed by Gary Guo) encodes this internally.\n> \n> The module_*_driver! macros handle the wrapping, so driver authors just write\n> struct MyDriver<'a> and impl Driver<'a>.\n> \n> With HRT, driver structs carry a lifetime parameter tied to the device binding\n> scope -- the interval of a bus device being bound to a driver. Device resources\n> like pci::Bar<'a> and IoMem<'a> are handed out with this lifetime, so the\n> compiler enforces at build time that they do not escape the binding scope.\n> \n> Before:\n> \n> \tstruct MyDriver {\n> \t    pdev: ARef<pci::Device>,\n> \t    bar: Devres<pci::Bar<BAR_SIZE>>,\n> \t}\n> \n> \tlet io = self.bar.access(dev)?;\n> \tio.read32(OFFSET);\n> \n> After:\n> \n> \tstruct MyDriver<'a> {\n> \t    pdev: &'a pci::Device,\n> \t    bar: pci::Bar<'a, BAR_SIZE>,\n> \t}\n> \n> \tself.bar.read32(OFFSET);\n> \n> Lifetime-parameterized device resources can be put into a Devres at any point\n> via Bar::into_devres() / IoMem::into_devres(), providing the exact same\n> semantics as before. This is useful for resources shared across subsystem\n> boundaries where revocation is needed.\n> \n> This also synergizes with the upcoming self-referential initialization support\n> in pin-init, which allows one field of the driver struct to borrow another\n> during initialization without unsafe code.\n> \n> The same pattern is applied to auxiliary device registration data as a first\n> example beyond bus device private data. Registration<F: ForLt> can hold\n> lifetime-parameterized data tied to the parent driver's binding scope. Since the\n> auxiliary bus guarantees that the parent remains bound while the auxiliary\n> device is registered, the registration data can safely borrow the parent's\n> device resources.\n> \n> More generally, binding resource lifetimes to a registration scope applies to\n> every registration that is scoped to a driver binding -- auxiliary devices,\n> class devices, IRQ handlers, workqueues.\n> \n> A follow-up series extends this to class device registrations, starting with\n> DRM, so that class device callbacks (IOCTLs, etc.) can safely access device\n> resources through the separate registration data bound to the registration's\n> lifetime without Devres indirection.\n> \n> The series contains a few driver patches for reference, indicated by the REF\n> suffix.\n> \n> Thanks to Gary for coming up with the ForLt implementation; thanks to Alice for\n> the early discussions around lifetime-parameterized private data that helped\n> shape the direction of this work.\n> \n> This series depends on [1].\n> \n> [1] https://lore.kernel.org/driver-core/20260505152400.3905096-1-dakr@kernel.org/\n\n\nI have applied this series together with [1] on top of 7.1.0-rc1. I made \nsome adaptions to local changes (e.g. my ARM64 TMU interrupt test) and \nboot tested it. Several parts this patch series touches (e.g. PCI, \nauxiliary, gpu) I might not use or even don't have it enabled. So I \ndon't know if this is worth mentioning\n\nTested-by: Dirk Behme <dirk.behme@de.bosch.com>\n\nPlease feel free to ignore this, then.\n\nThanks\n\nDirk\n\n\n> Changes in v2:\n>    - Add 'a bound to ForLt::Of<'a> and WithLt::Of, making the lifetime bound\n>      inherent to the trait; remove all F::Of<'static>: 'static where clauses\n>    - Drop \"rust: devres: add ForLt support to Devres\"; Devres itself stays\n>      unchanged -- ForLt-aware access is introduced later through DevresLt in a\n>      separate series\n>    - Use 'bound instead of 'a; add patches to consistently use 'bound for\n>      pre-existing 'a\n> \n> Danilo Krummrich (24):\n>    rust: driver core: drop drvdata before devres release\n>    rust: device: generalize drvdata methods over ForLt\n>    rust: driver: make Adapter trait lifetime-parameterized\n>    rust: pci: implement Sync for Device<Bound>\n>    rust: platform: implement Sync for Device<Bound>\n>    rust: auxiliary: implement Sync for Device<Bound>\n>    rust: usb: implement Sync for Device<Bound>\n>    rust: device: implement Sync for Device<Bound>\n>    rust: pci: make Driver trait lifetime-parameterized\n>    rust: platform: make Driver trait lifetime-parameterized\n>    rust: auxiliary: make Driver trait lifetime-parameterized\n>    rust: auxiliary: generalize Registration over ForLt\n>    samples: rust: rust_driver_auxiliary: showcase lifetime-bound\n>      registration data\n>    rust: usb: make Driver trait lifetime-parameterized\n>    rust: i2c: make Driver trait lifetime-parameterized\n>    rust: pci: make Bar lifetime-parameterized\n>    rust: io: make IoMem and ExclusiveIoMem lifetime-parameterized\n>    samples: rust: rust_driver_pci: use HRT lifetime for Bar\n>    rust: driver-core: rename 'a lifetime to 'bound\n>    gpu: nova-core: rename 'a lifetime to 'bound\n>    gpu: nova-core: use HRT lifetime for Bar\n>    gpu: nova-core: unregister sysmem flush page from Drop\n>    gpu: nova-core: replace ARef<Device> with &'bound Device in\n>      SysmemFlush\n>    gpu: drm: tyr: use HRT lifetime for IoMem\n> \n> Gary Guo (1):\n>    rust: types: add `ForLt` trait for higher-ranked lifetime support\n> \n>   drivers/base/dd.c                        |   2 +-\n>   drivers/cpufreq/rcpufreq_dt.rs           |  10 +-\n>   drivers/gpu/drm/nova/driver.rs           |   9 +-\n>   drivers/gpu/drm/tyr/driver.rs            |  24 ++-\n>   drivers/gpu/drm/tyr/gpu.rs               |  62 +++---\n>   drivers/gpu/drm/tyr/regs.rs              |  21 +-\n>   drivers/gpu/nova-core/driver.rs          |  48 ++---\n>   drivers/gpu/nova-core/fb.rs              |  31 ++-\n>   drivers/gpu/nova-core/firmware/gsp.rs    |   8 +-\n>   drivers/gpu/nova-core/gpu.rs             |  38 ++--\n>   drivers/gpu/nova-core/gsp/commands.rs    |  10 +-\n>   drivers/gpu/nova-core/gsp/fw/commands.rs |   4 +-\n>   drivers/gpu/nova-core/nova_core.rs       |   4 +-\n>   drivers/pwm/pwm_th1520.rs                |  14 +-\n>   include/linux/device/driver.h            |   4 +-\n>   rust/Makefile                            |   1 +\n>   rust/kernel/auxiliary.rs                 | 132 +++++++++----\n>   rust/kernel/cpufreq.rs                   |   8 +-\n>   rust/kernel/device.rs                    |  79 +++++---\n>   rust/kernel/devres.rs                    |  16 +-\n>   rust/kernel/driver.rs                    |  44 +++--\n>   rust/kernel/i2c.rs                       | 130 +++++++-----\n>   rust/kernel/io/mem.rs                    | 131 ++++++------\n>   rust/kernel/pci.rs                       |  89 ++++++---\n>   rust/kernel/pci/io.rs                    |  68 ++++---\n>   rust/kernel/pci/irq.rs                   |  38 ++--\n>   rust/kernel/platform.rs                  | 120 +++++++----\n>   rust/kernel/types.rs                     |   4 +\n>   rust/kernel/types/for_lt.rs              | 117 +++++++++++\n>   rust/kernel/usb.rs                       |  94 +++++----\n>   rust/macros/for_lt.rs                    | 242 +++++++++++++++++++++++\n>   rust/macros/lib.rs                       |  12 ++\n>   samples/rust/rust_debugfs.rs             |  10 +-\n>   samples/rust/rust_dma.rs                 |   9 +-\n>   samples/rust/rust_driver_auxiliary.rs    |  53 +++--\n>   samples/rust/rust_driver_i2c.rs          |  18 +-\n>   samples/rust/rust_driver_pci.rs          |  93 ++++-----\n>   samples/rust/rust_driver_platform.rs     |  12 +-\n>   samples/rust/rust_driver_usb.rs          |  14 +-\n>   samples/rust/rust_i2c_client.rs          |  12 +-\n>   samples/rust/rust_soc.rs                 |  12 +-\n>   41 files changed, 1220 insertions(+), 627 deletions(-)\n>   create mode 100644 rust/kernel/types/for_lt.rs\n>   create mode 100644 rust/macros/for_lt.rs\n>","headers":{"Return-Path":"\n <linux-pci+bounces-54070-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@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=de.bosch.com header.i=@de.bosch.com header.a=rsa-sha256\n header.s=selector2 header.b=IZHa5p9P;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-pci+bounces-54070-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=de.bosch.com header.i=@de.bosch.com\n header.b=\"IZHa5p9P\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=40.107.130.20","smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=de.bosch.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=de.bosch.com"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gBB684P5mz1y04\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 07 May 2026 22:15:28 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 33644301EC65\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  7 May 2026 12:15:20 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 35C263EE1DC;\n\tThu,  7 May 2026 12:15:13 +0000 (UTC)","from MRWPR03CU001.outbound.protection.outlook.com\n (mail-francesouthazon11011020.outbound.protection.outlook.com\n [40.107.130.20])\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 A5EEF3EF666;\n\tThu,  7 May 2026 12:15:02 +0000 (UTC)","from CW1P123CA0022.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:292::13)\n by PA1PR10MB8919.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:442::22) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.17; Thu, 7 May\n 2026 12:14:54 +0000","from AMS0EPF000001A3.eurprd05.prod.outlook.com\n (2603:10a6:400:292:cafe::ca) by CW1P123CA0022.outlook.office365.com\n (2603:10a6:400:292::13) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9891.17 via Frontend Transport; Thu,\n 7 May 2026 12:14:54 +0000","from eop.bosch-org.com (139.15.153.206) by\n AMS0EPF000001A3.mail.protection.outlook.com (10.167.16.228) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9891.9 via Frontend Transport; Thu, 7 May 2026 12:14:53 +0000","from RNGMBX3003.de.bosch.com (10.124.11.208) by eop.bosch-org.com\n (139.15.153.206) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Thu, 7 May\n 2026 14:14:43 +0200","from [10.34.218.123] (10.34.218.123) by smtp.app.bosch.com\n (10.124.11.208) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Thu, 7 May\n 2026 14:14:42 +0200"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1778156111; cv=fail;\n b=bGViZ9OSbfZS/rwMXib3RwKx13PF9Yq3bbgWt7NUMqce1ET3soeJJ5FCenro+K42bAQMQ2uEo7qVXxXRDTJVOMS3atKFXadnusna9zRZXZ5wuZ/7ILqOaNaK/RYJYLq/mGmqn1skqvmJrZgPMmZY2XIo55S3zygXFF4iDdL0CQ4=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=MBjoEXy/7C1zMRICaV47h6Q3Yof9SsyOvLSGIVXOfhvrho1N/Pzm2DJd+NQajoiCz25REUmkbSRnUxPZwBxxS6c5GsawjKHFFAu1dnJ2u+ZEz8aJ/nAwIHVhBqcUZEiRkOQe9AZ1V4iJbxpL7HccaL8ivuY284EkXFkbkM1VgIC07gXnKzYpL3zDCB85WCdBkTa+0WrGw5PpmyhKe46S6MEjM3rKks7qx3J1/fpQsP8r/KgTm983eNl4R4HA/X9Tx3gEhQrJIOCo/qAluFfInDY5mWWUoI5k6RJQtDO1jZPZwK0EbAXTVWAG1B+HEoejk4k5i7KyYrP23aefwGaJNQ=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1778156111; c=relaxed/simple;\n\tbh=Ensyd5Eykp10ujbn/jvUrprwoJxLrAJwDGJqD88IH4s=;\n\th=Message-ID:Date:MIME-Version:From:Subject:To:CC:References:\n\t In-Reply-To:Content-Type;\n b=ZgT8vss/+FJLZG2bd190b+x9lwM5lkkCMXu6VBqP0i9PObre1SrRLIO2gW02p0ftYnwWO3yqwtjJNeKjxywCjW7/zS/rbuz3nLnRHy9VJtPl3zMbGbLl16A54HIc4KcMacrQhNHNKFwInKmhJ/q2HOxnwOkYKRhI+rVZwKYqoPU=","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=or9DUWWTDQ4vXa8LIf8MW/Y9uKYVWRibHd0IulGbVvQ=;\n b=xHgFsZ4tLxlfGniRjiG/hicK/qU315CK+1X2KUTdH5XJbcpXOGa4gq7PzXWQf0v0pP5rllHd5FyMDCnNh+ZpAheYhJIfqnC8ZqdwKVehXBjHu5zRLsQXnV8iGc0OCQxaorKPXSplxdBx18dd3lKy1QWyE/S7prxc48i7cAbiAk8pj2bNgT/OHkLH/qznHC79Xsc9iCi/3mBPmejtp1FakG9N+WGQr5No49OId7wH8i0codkL9RGdGIE7XLMwHuavbnNa5eOYqZ0tjKNrWLWqePviYQHx6vRZWG+zrovWq53U+WanncLqUQdLQt+8ZBwKHrkfPCgvx9gqzWo8mlqdeQ=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=de.bosch.com;\n spf=pass smtp.mailfrom=de.bosch.com;\n dkim=pass (2048-bit key) header.d=de.bosch.com header.i=@de.bosch.com\n header.b=IZHa5p9P; arc=fail smtp.client-ip=40.107.130.20","i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 139.15.153.206) smtp.rcpttodomain=kernel.org smtp.mailfrom=de.bosch.com;\n dmarc=pass (p=reject sp=none pct=100) action=none header.from=de.bosch.com;\n dkim=none (message not signed); arc=none (0)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=de.bosch.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=or9DUWWTDQ4vXa8LIf8MW/Y9uKYVWRibHd0IulGbVvQ=;\n b=IZHa5p9PrKlc6pgWd8wmFkicTPaViAIGDy+Z2VPIaWDpBThhvzwmi8f0kzaW7hU3LQ3y9QnOuVLqL6MUqkijCiVxB4og7Zv2ussTYSMilR2/dwXqJsezS8kVtLSlqSswNNeRsKzswgezgH8FoBot1ewQuI7Ag+RX/w96ks9lDf9jYoAQFrF9qZwRt2x4Ms1sm2TLdSmp2J/71rbJw3gb16mhITAK/DFMVIiOy7OmECsCzWVA0Lhr4jD7kjAvoj7165J2u26aBFrD6df8LSb6GQo9+mxvbalSXTEX9jmWRcoHGy2B9Jnp7zVuC/A/jAF8Wcr9IO2dCdZvs9E8SGnioQ==","X-MS-Exchange-Authentication-Results":"spf=pass (sender IP is 139.15.153.206)\n smtp.mailfrom=de.bosch.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=de.bosch.com;","Received-SPF":"Pass (protection.outlook.com: domain of de.bosch.com designates\n 139.15.153.206 as permitted sender) receiver=protection.outlook.com;\n client-ip=139.15.153.206; helo=eop.bosch-org.com; pr=C","Message-ID":"<2e1c9a71-46e7-4036-91ac-86453564b223@de.bosch.com>","Date":"Thu, 7 May 2026 14:14:36 +0200","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"Dirk Behme <dirk.behme@de.bosch.com>","Subject":"Re: [PATCH v2 00/25] rust: device: Higher-Ranked Lifetime Types for\n device drivers","To":"Danilo Krummrich <dakr@kernel.org>, <gregkh@linuxfoundation.org>,\n\t<rafael@kernel.org>, <acourbot@nvidia.com>, <aliceryhl@google.com>,\n\t<david.m.ertman@intel.com>, <ira.weiny@intel.com>, <leon@kernel.org>,\n\t<viresh.kumar@linaro.org>, <m.wilczynski@samsung.com>, <ukleinek@kernel.org>,\n\t<bhelgaas@google.com>, <kwilczynski@kernel.org>, <abdiel.janulgue@gmail.com>,\n\t<robin.murphy@arm.com>, <markus.probst@posteo.de>, <ojeda@kernel.org>,\n\t<boqun@kernel.org>, <gary@garyguo.net>, <bjorn3_gh@protonmail.com>,\n\t<lossin@kernel.org>, <a.hindborg@kernel.org>, <tmgross@umich.edu>,\n\t<igor.korotin@linux.dev>, <daniel.almeida@collabora.com>","CC":"<driver-core@lists.linux.dev>, <linux-kernel@vger.kernel.org>,\n\t<nova-gpu@lists.linux.dev>, <dri-devel@lists.freedesktop.org>,\n\t<linux-pm@vger.kernel.org>, <linux-pwm@vger.kernel.org>,\n\t<linux-pci@vger.kernel.org>, <rust-for-linux@vger.kernel.org>","References":"<20260506215113.851360-1-dakr@kernel.org>","Content-Language":"en-GB","In-Reply-To":"<20260506215113.851360-1-dakr@kernel.org>","Content-Type":"text/plain; charset=\"UTF-8\"; format=flowed","Content-Transfer-Encoding":"7bit","X-EOPAttributedMessage":"0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"AMS0EPF000001A3:EE_|PA1PR10MB8919:EE_","X-MS-Office365-Filtering-Correlation-Id":"3589e9f4-1aa4-49de-5f6d-08deac323ef0","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"\n\tBCL:0;ARA:13230040|1800799024|82310400026|30052699003|36860700016|376014|7416014|921020|22082099003|3023799003|56012099003|18002099003;","X-Microsoft-Antispam-Message-Info":"\n\tSs2n2D0GmthDcq3MB7nqhgHdKXbgwQefwLsKh3lFPZA0LCcbiAsrhr+uAEC9OTXK9iAwvR0JaXFtqDaTc3/A+zLESDK7PBOVYdyTCuPyBhd8xG5nj2wt5WODcTQwd94yikOdtvV8HtNRzEr0R8iSx5wwwU3aucWrM/IKQ+tFMHy9QhEfUuVMTYqyJG9m2sbHKAoYvlDzkOnVWH4TnP6SsgExkTlUjOzJDi0IHJuCGMVT2pFBv5uZooozEU2uw8HbUUQbmsImAZsGzbOpzlA9MlzI9aCAFqbyX5g9x+JSdbmrh1K9XrZVKBecaz//wKXOIGFjq00rirNduMOs5tS6n+yo/wxJuUkPBce7OG08MV1WI6nbAesIrYUHyaZYBwXpyMFK6bCy5Jp3TtDSoGvm33WoeFsKZnZeIxGzIO4/3rqbV5zNzpgxI/bmzljvnFrwKEUx2eGJ6AOiK0dR0UlxaYQBJTShuyRaqiZW1OApogn4BHvf8mzhkZNVR638CaoNIXpK5tyklkrCqaFVCHsJIMQC8oLHl/3FtEaMr9xDj4O4Es4nQ+79UcuDAqlUK/sMOtBUmvPe6hojnZ2umae+KJgeyR02aTdsLMrC5a5tk6RoTNYE4QktA4ujyEO6HkVUkGUUlTiqSeuyHnSxbLT95HHFpgEhsFTjgwf8kcULCS7oLT7qXwpKdWGHOJrnz4MEQilOGufSCyujop9/mNt9mKTc1oDY7FH2mKRavedVLH8az1YOp9LXFNlrxhENHdbB9yFkgJgvOMUBfyg2Mhp8u6mfoIV9WX/fIEZAZUa7q2Y=","X-Forefront-Antispam-Report":"\n\tCIP:139.15.153.206;CTRY:DE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:eop.bosch-org.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(30052699003)(36860700016)(376014)(7416014)(921020)(22082099003)(3023799003)(56012099003)(18002099003);DIR:OUT;SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n\tPRsQUcVnYgh/AsFc1a1FXMOZLRjZbMQAorEyMcU2coHj9WIHRDQvnPsHKRr/tpDvXsBCEzTQKlpwJ3BXkk0pNGGiejiu4wrjC9hugkZxw4JjvXElUhWOHI5fwojJ0sdat1YLIJytnKACAlaWqHyt9Z78t2xv0JrO+qM38PQ87nFBie917ggAXSsJUaIwDlCVblxjXrq0FTqXqHlZa4kIJj9PYcpOs4RF7UGKc/p/oYX7BQ+T8X86vqK/nNnE7DenugJMwkZMpZ5EywJWgdt4hoGsCx4TWMqkh1TciGmeuM+JmMsBarPehqJE1YEN+44lJ8Q5XIu2jl84nNnuL1wsNSMMUowJL3FL6PXH7jy/FLIvNmUv2TOeT7g9mpXZmQ6hbcE8im7WOFUAFSzVzec3zdlpxZfCDiOdA9glp7nT3PWx34QfoBchk0s16tDUDIpF","X-OriginatorOrg":"de.bosch.com","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"07 May 2026 12:14:53.7088\n (UTC)","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 3589e9f4-1aa4-49de-5f6d-08deac323ef0","X-MS-Exchange-CrossTenant-Id":"0ae51e19-07c8-4e4b-bb6d-648ee58410f4","X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp":"\n TenantId=0ae51e19-07c8-4e4b-bb6d-648ee58410f4;Ip=[139.15.153.206];Helo=[eop.bosch-org.com]","X-MS-Exchange-CrossTenant-AuthSource":"\n\tAMS0EPF000001A3.eurprd05.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Anonymous","X-MS-Exchange-CrossTenant-FromEntityHeader":"HybridOnPrem","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"PA1PR10MB8919"}}]