From nobody Sat Jul 25 18:01:40 2026 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C5B9D335066 for ; Wed, 15 Jul 2026 08:19:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784103550; cv=none; b=ZcXtcknolDFfgOhejeaofFUVEtiuQPRp7ZcUV8wUCrV5RYNkkcxAUpZlL0AXw4+48M9lnsGotkdvWpLL0eK9leL3P4q7dNbgj8zdQSSMoz9Mvklpz8mWLT+UTTqdtAytjYrQNnq1KB6aqoKL+/xZPlM6zZkaLMbzC+LrtfM3QZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784103550; c=relaxed/simple; bh=SM7CqIMWZmeLpG6+z3IDypHl+OE7u8+3EDxVd0/iUpI=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=C0jZtV9cYN2ttcT+BWchmmJPM9ChEuDcEU/9jH7j2TUWKhxi9KFhjB8Rwjeg3q/gjuAZrrWGKEj4pNByVdy/dSN1VbRpCBU6fTdzf0rFRACmlxGI85rlQBOSWD5YDTZJ2xZhvPHk0mK4W8pteg8lUu/EEUQegJLWmK5SUMsXY24= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--songguo.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YXQuDx/H; arc=none smtp.client-ip=209.85.221.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--songguo.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YXQuDx/H" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-472bdd6f529so3164235f8f.1 for ; Wed, 15 Jul 2026 01:19:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784103547; x=1784708347; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:mime-version:date:from :to:cc:subject:date:message-id:reply-to:content-type; bh=1lIyzFIt33t2p9Sao7pz+T1elfG+gt4xS1Vbn70gKJM=; b=YXQuDx/HHXDLtJO576L6AVgPG3uHHXk9ZlDNeRraUwrdJmupQhjRQgrFrX6HARopFZ 1uGCk8815/b9nlvKgkMAsN8REdQNz1Qs/UErkHAEf1xU+PM4OR1Ds/Wij69TJ+N2Cx6o NolYPGrx8klZjrCJ3qAYS75QvQQX5KttCPgbCabdUhjRkBma5Bh8JojSKIpUJba2MkY1 bCndIEVMICaL9CQsoDm6SQUgNqTyosCy4CLp2qdbP7fryHLPcXbJJ+m5Mi/DcvVr0Gj/ VIoYB3Y76Far0gh++49o1V/C+0tuPxDP78jdXco2IzM6qVQvmuUmAHy0f/fKlz3X2fpQ sHtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784103547; x=1784708347; h=content-type:cc:to:from:subject:message-id:mime-version:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=1lIyzFIt33t2p9Sao7pz+T1elfG+gt4xS1Vbn70gKJM=; b=r4s+ZVikfwzCovdhVFO7f2HDMsnYmT1WYBat7H2ualgZqpO3bPFvZ3BvUWN0vYqmP4 vZWSxE3TCod7Y3KYDNxkrwdkihp84/TXhDiKNoZ/ena+m+PVk6kUKbBF1XmiATyvX4+X na2DBus/VLXqQDv8KQZlmIlg411pKQxwvU4PZxVamMPXDrsJlwg3Ylr4O/tAmEuGrZJH 6MIFR8HF+doBzqQt4rze9RtxhhTwoRdLRDXVw1xdX/13DyUgCcmTWFdvsqPSEFwJbayh zg/OnVmumKzwmfMrfQw2kXnxf9Y02oW17wl8QiDT933NiaJXSNe7MsI2uIz2jSS7rkmT Z6Jg== X-Forwarded-Encrypted: i=1; AHgh+RrkVzTQ0QCGhtkzmhui50Zq6NfdexR1iLkOjrtd3G0BfL4FdWV2uEl6dOLR0oYIML2goYHXNEFiuk8EEp8=@vger.kernel.org X-Gm-Message-State: AOJu0YysCw1+7zYmY2NpcGr/JB2pydGEZyPN13nKPn6o3Zy0FqnrFUN2 ocb0N5hkdDM3jyyD+8CNq6Lzjqh7GZjZ3sE2BeiRa1APQee/qIT9nUnVAgM+SNxNf2W33LhPeMA ylYeeW2Ar7g== X-Received: from wrbdy7.prod.google.com ([2002:a05:6000:e47:b0:47f:51bf:11c1]) (user=songguo job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1867:b0:47e:f3d:2b3 with SMTP id ffacd0b85a97d-47f488b3045mr6347704f8f.39.1784103546514; Wed, 15 Jul 2026 01:19:06 -0700 (PDT) Date: Wed, 15 Jul 2026 08:18:20 +0000 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260715081821.3932123-1-songguo@google.com> Subject: [PATCH] misc: open-dice: add ACPI device discovery support From: Song Guo To: Arnd Bergmann , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Cc: Song Guo Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" OpenDICE can also used on x86 platforms for attestation, one of the usecase is Android's protected VM. The OpenDICE device driver only supports device tree, adding ACPI support so it can also be used on x86 environments easily. The patch is verified using crosvm, with the following ACPI table passed using --acpi-table, with --file-backed-mapping for the corresponding memory region. DefinitionBlock ( "opendice.aml", "SSDT", 2, "GOOGLE", "OpenDICE", 0x00000001 ) { Scope (\_SB) { Device (DICE) { Name (_HID, "PRP0001") Name (_DSD, Package () { ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "compatible", Package () { "google,open-dice" } } } }) Name (_CRS, ResourceTemplate () { Memory32Fixed (ReadOnly, 0x9D1C3000, 0x00001000) }) } } } Signed-off-by: Song Guo --- drivers/misc/open-dice.c | 51 +++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/drivers/misc/open-dice.c b/drivers/misc/open-dice.c index 45060fb4ea27..303b35b03cb4 100644 --- a/drivers/misc/open-dice.c +++ b/drivers/misc/open-dice.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2021 - Google LLC * Author: David Brazdil + * Author: Song Guo * * Driver for Open Profile for DICE. * @@ -19,6 +20,7 @@ * close(fd); */ =20 +#include #include #include #include @@ -31,7 +33,8 @@ struct open_dice_drvdata { struct mutex lock; char name[16]; - struct reserved_mem *rmem; + phys_addr_t mem_base; + resource_size_t mem_size; struct miscdevice misc; }; =20 @@ -45,14 +48,14 @@ static int open_dice_wipe(struct open_dice_drvdata *drv= data) void *kaddr; =20 mutex_lock(&drvdata->lock); - kaddr =3D devm_memremap(drvdata->misc.this_device, drvdata->rmem->base, - drvdata->rmem->size, MEMREMAP_WC); + kaddr =3D devm_memremap(drvdata->misc.this_device, drvdata->mem_base, + drvdata->mem_size, MEMREMAP_WC); if (IS_ERR(kaddr)) { mutex_unlock(&drvdata->lock); return PTR_ERR(kaddr); } =20 - memset(kaddr, 0, drvdata->rmem->size); + memset(kaddr, 0, drvdata->mem_size); devm_memunmap(drvdata->misc.this_device, kaddr); mutex_unlock(&drvdata->lock); return 0; @@ -64,7 +67,7 @@ static int open_dice_wipe(struct open_dice_drvdata *drvda= ta) static ssize_t open_dice_read(struct file *filp, char __user *ptr, size_t = len, loff_t *off) { - unsigned long val =3D to_open_dice_drvdata(filp)->rmem->size; + unsigned long val =3D to_open_dice_drvdata(filp)->mem_size; =20 return simple_read_from_buffer(ptr, len, off, &val, sizeof(val)); } @@ -102,8 +105,8 @@ static int open_dice_mmap_prepare(struct vm_area_desc *= desc) /* Create write-combine mapping so all clients observe a wipe. */ desc->page_prot =3D pgprot_writecombine(desc->page_prot); vma_desc_set_flags(desc, VMA_DONTCOPY_BIT, VMA_DONTDUMP_BIT); - mmap_action_simple_ioremap(desc, drvdata->rmem->base, - drvdata->rmem->size); + mmap_action_simple_ioremap(desc, drvdata->mem_base, + drvdata->mem_size); return 0; } =20 @@ -118,22 +121,40 @@ static int __init open_dice_probe(struct platform_dev= ice *pdev) { static unsigned int dev_idx; struct device *dev =3D &pdev->dev; - struct reserved_mem *rmem; struct open_dice_drvdata *drvdata; + phys_addr_t mem_base; + resource_size_t mem_size; int ret; =20 - rmem =3D of_reserved_mem_lookup(dev->of_node); - if (!rmem) { - dev_err(dev, "failed to lookup reserved memory\n"); + if (dev->of_node) { + struct reserved_mem *rmem =3D of_reserved_mem_lookup(dev->of_node); + + if (!rmem) { + dev_err(dev, "failed to lookup reserved memory\n"); + return -EINVAL; + } + mem_base =3D rmem->base; + mem_size =3D rmem->size; + } else if (is_acpi_node(dev->fwnode)) { + struct resource *res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); + + if (!res) { + dev_err(dev, "failed to get MMIO resource\n"); + return -EINVAL; + } + mem_base =3D res->start; + mem_size =3D resource_size(res); + } else { + dev_err(dev, "device not supported (no DT or ACPI node)\n"); return -EINVAL; } =20 - if (!rmem->size || (rmem->size > ULONG_MAX)) { + if (!mem_size || (mem_size > ULONG_MAX)) { dev_err(dev, "invalid memory region size\n"); return -EINVAL; } =20 - if (!PAGE_ALIGNED(rmem->base) || !PAGE_ALIGNED(rmem->size)) { + if (!PAGE_ALIGNED(mem_base) || !PAGE_ALIGNED(mem_size)) { dev_err(dev, "memory region must be page-aligned\n"); return -EINVAL; } @@ -143,7 +164,8 @@ static int __init open_dice_probe(struct platform_devic= e *pdev) return -ENOMEM; =20 *drvdata =3D (struct open_dice_drvdata){ - .rmem =3D rmem, + .mem_base =3D mem_base, + .mem_size =3D mem_size, .misc =3D (struct miscdevice){ .parent =3D dev, .name =3D drvdata->name, @@ -207,3 +229,4 @@ module_exit(open_dice_exit); MODULE_DESCRIPTION("Driver for Open Profile for DICE."); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("David Brazdil "); +MODULE_AUTHOR("Song Guo "); --=20 2.55.0.141.g00534a21ce-goog