linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] acpi, nfit: treat volatile virtual CD region as pmem
@ 2016-06-27  6:46 Lee, Chun-Yi
  2016-06-27 17:34 ` Dan Williams
  0 siblings, 1 reply; 3+ messages in thread
From: Lee, Chun-Yi @ 2016-06-27  6:46 UTC (permalink / raw)
  To: Ross Zwisler, Dan Williams, Rafael J. Wysocki, Linda Knippers
  Cc: linux-nvdimm, linux-acpi, linux-kernel, Lee, Chun-Yi, Gary Lin

This patch adds logic to treat volatile virtual CD region as pmem
region, then /dev/pmem* device can be mounted with iso9660.

It's useful to work with the httpboot in EFI firmware to pull a remote
ISO file to the local memory region for booting and installation.

Wiki page of UEFI HTTPBoot with OVMF:
	https://en.opensuse.org/UEFI_HTTPBoot_with_OVMF

The ramdisk function in EDK2/OVMF generates a ACPI0012 root device that
it contains empty _STA but without _DSM:

DefinitionBlock ("ssdt2.aml", "SSDT", 2, "INTEL ", "RamDisk ", 0x00001000)
{
    Scope (\_SB)
    {
        Device (NVDR)
        {
            Name (_HID, "ACPI0012")  // _HID: Hardware ID
            Name (_STR, Unicode ("NVDIMM Root Device"))  // _STR: Description String
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                Return (0x0F)
            }
        }
    }
}

In section 5.2.25.2 of ACPI 6.1 spec, it mentions that the "SPA Range
Structure Index" of VCD SPA shall be set to zero. That means VCD SPA
will not be associated by any NVDIMM region mapping.

The VCD's SPA Range Structure in NFIT is similar to virtual disk region
as following:

[028h 0040   2]                Subtable Type : 0000 [System Physical Address Range]
[02Ah 0042   2]                       Length : 0038

[02Ch 0044   2]                  Range Index : 0000
[02Eh 0046   2]        Flags (decoded below) : 0000
                   Add/Online Operation Only : 0
                      Proximity Domain Valid : 0
[030h 0048   4]                     Reserved : 00000000
[034h 0052   4]             Proximity Domain : 00000000
[038h 0056  16]           Address Range GUID : 77AB535A-45FC-624B-5560-F7B281D1F96E
[048h 0072   8]           Address Range Base : 00000000B6ABD018
[050h 0080   8]         Address Range Length : 0000000005500000
[058h 0088   8]         Memory Map Attribute : 0000000000000000

The way to not associate a SPA range is to never reference it from a "flush hint",
"interleave", or "control region" table.

After testing on OVMF, pmem driver can support the region that it doesn't
assoicate to any NVDIMM mapping. So, treat VCD like pmem is a idea to get
a pmem block device that it contains iso. 

v3:
To simplify patch, removed VCD region in libnvdimm.
 
v2:
Removed the code for setting VCD to a read-only region.

Cc: Gary Lin <GLin@suse.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Linda Knippers <linda.knippers@hpe.com>
Signed-off-by: Lee, Chun-Yi <jlee@suse.com>
---
 drivers/acpi/nfit.c          |  8 +++++++-
 drivers/nvdimm/region_devs.c | 26 +++++++++++++++++++++++++-
 include/linux/libnvdimm.h    |  2 ++
 3 files changed, 34 insertions(+), 2 deletions(-)

Index: linux/drivers/acpi/nfit.c
===================================================================
--- linux.orig/drivers/acpi/nfit.c
+++ linux/drivers/acpi/nfit.c
@@ -1995,7 +1995,7 @@ static int acpi_nfit_register_region(str
 	if (nfit_spa->nd_region)
 		return 0;
 
-	if (spa->range_index == 0) {
+	if (spa->range_index == 0 && nfit_spa_type(spa) != NFIT_SPA_VCD) {
 		dev_dbg(acpi_desc->dev, "%s: detected invalid spa index\n",
 				__func__);
 		return 0;
@@ -2059,6 +2059,11 @@ static int acpi_nfit_register_region(str
 				ndr_desc);
 		if (!nfit_spa->nd_region)
 			rc = -ENOMEM;
+	} else if (nfit_spa_type(spa) == NFIT_SPA_VCD) {
+		nfit_spa->nd_region = nvdimm_pmem_region_create(nvdimm_bus,
+				ndr_desc);
+		if (!nfit_spa->nd_region)
+			rc = -ENOMEM;
 	}
 
  out:

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] acpi, nfit: treat volatile virtual CD region as pmem
  2016-06-27  6:46 [PATCH v3] acpi, nfit: treat volatile virtual CD region as pmem Lee, Chun-Yi
@ 2016-06-27 17:34 ` Dan Williams
  2016-06-27 23:09   ` joeyli
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Williams @ 2016-06-27 17:34 UTC (permalink / raw)
  To: Lee, Chun-Yi
  Cc: Ross Zwisler, Rafael J. Wysocki, Linda Knippers,
	linux-nvdimm@lists.01.org, Linux ACPI, linux-kernel, Lee,
	Chun-Yi, Gary Lin

On Sun, Jun 26, 2016 at 11:46 PM, Lee, Chun-Yi <joeyli.kernel@gmail.com> wrote:
> This patch adds logic to treat volatile virtual CD region as pmem
> region, then /dev/pmem* device can be mounted with iso9660.
>
> It's useful to work with the httpboot in EFI firmware to pull a remote
> ISO file to the local memory region for booting and installation.
>
> Wiki page of UEFI HTTPBoot with OVMF:
>         https://en.opensuse.org/UEFI_HTTPBoot_with_OVMF
>
> The ramdisk function in EDK2/OVMF generates a ACPI0012 root device that
> it contains empty _STA but without _DSM:
>
> DefinitionBlock ("ssdt2.aml", "SSDT", 2, "INTEL ", "RamDisk ", 0x00001000)
> {
>     Scope (\_SB)
>     {
>         Device (NVDR)
>         {
>             Name (_HID, "ACPI0012")  // _HID: Hardware ID
>             Name (_STR, Unicode ("NVDIMM Root Device"))  // _STR: Description String
>             Method (_STA, 0, NotSerialized)  // _STA: Status
>             {
>                 Return (0x0F)
>             }
>         }
>     }
> }
>
> In section 5.2.25.2 of ACPI 6.1 spec, it mentions that the "SPA Range
> Structure Index" of VCD SPA shall be set to zero. That means VCD SPA
> will not be associated by any NVDIMM region mapping.
>
> The VCD's SPA Range Structure in NFIT is similar to virtual disk region
> as following:
>
> [028h 0040   2]                Subtable Type : 0000 [System Physical Address Range]
> [02Ah 0042   2]                       Length : 0038
>
> [02Ch 0044   2]                  Range Index : 0000
> [02Eh 0046   2]        Flags (decoded below) : 0000
>                    Add/Online Operation Only : 0
>                       Proximity Domain Valid : 0
> [030h 0048   4]                     Reserved : 00000000
> [034h 0052   4]             Proximity Domain : 00000000
> [038h 0056  16]           Address Range GUID : 77AB535A-45FC-624B-5560-F7B281D1F96E
> [048h 0072   8]           Address Range Base : 00000000B6ABD018
> [050h 0080   8]         Address Range Length : 0000000005500000
> [058h 0088   8]         Memory Map Attribute : 0000000000000000
>
> The way to not associate a SPA range is to never reference it from a "flush hint",
> "interleave", or "control region" table.
>
> After testing on OVMF, pmem driver can support the region that it doesn't
> assoicate to any NVDIMM mapping. So, treat VCD like pmem is a idea to get
> a pmem block device that it contains iso.
>
> v3:
> To simplify patch, removed VCD region in libnvdimm.
>
> v2:
> Removed the code for setting VCD to a read-only region.
>
> Cc: Gary Lin <GLin@suse.com>
> Cc: Dan Williams <dan.j.williams@intel.com>
> Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
> Cc: Linda Knippers <linda.knippers@hpe.com>
> Signed-off-by: Lee, Chun-Yi <jlee@suse.com>
> ---
>  drivers/acpi/nfit.c          |  8 +++++++-
>  drivers/nvdimm/region_devs.c | 26 +++++++++++++++++++++++++-
>  include/linux/libnvdimm.h    |  2 ++
>  3 files changed, 34 insertions(+), 2 deletions(-)
>
> Index: linux/drivers/acpi/nfit.c
> ===================================================================
> --- linux.orig/drivers/acpi/nfit.c
> +++ linux/drivers/acpi/nfit.c
> @@ -1995,7 +1995,7 @@ static int acpi_nfit_register_region(str
>         if (nfit_spa->nd_region)
>                 return 0;
>
> -       if (spa->range_index == 0) {
> +       if (spa->range_index == 0 && nfit_spa_type(spa) != NFIT_SPA_VCD) {
>                 dev_dbg(acpi_desc->dev, "%s: detected invalid spa index\n",
>                                 __func__);

If we're adding the special casing might as well add it for all
"virtual spa" tables.  I.e. introduce nfit_spa_is_virtual() and have
it check for: NFIT_SPA_VDISK, NFIT_SPA_VCD, NFIT_SPA_PDISK, and
NFIT_SPA_PCD.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] acpi, nfit: treat volatile virtual CD region as pmem
  2016-06-27 17:34 ` Dan Williams
@ 2016-06-27 23:09   ` joeyli
  0 siblings, 0 replies; 3+ messages in thread
From: joeyli @ 2016-06-27 23:09 UTC (permalink / raw)
  To: Dan Williams
  Cc: Lee, Chun-Yi, Ross Zwisler, Rafael J. Wysocki, Linda Knippers,
	linux-nvdimm@lists.01.org, Linux ACPI, linux-kernel, Gary Lin

On Mon, Jun 27, 2016 at 10:34:32AM -0700, Dan Williams wrote:
> On Sun, Jun 26, 2016 at 11:46 PM, Lee, Chun-Yi <joeyli.kernel@gmail.com> wrote:
> > This patch adds logic to treat volatile virtual CD region as pmem
> > region, then /dev/pmem* device can be mounted with iso9660.
> >
> > It's useful to work with the httpboot in EFI firmware to pull a remote
> > ISO file to the local memory region for booting and installation.
> >
> > Wiki page of UEFI HTTPBoot with OVMF:
> >         https://en.opensuse.org/UEFI_HTTPBoot_with_OVMF
> >
> > The ramdisk function in EDK2/OVMF generates a ACPI0012 root device that
> > it contains empty _STA but without _DSM:
> >
> > DefinitionBlock ("ssdt2.aml", "SSDT", 2, "INTEL ", "RamDisk ", 0x00001000)
> > {
> >     Scope (\_SB)
> >     {
> >         Device (NVDR)
> >         {
> >             Name (_HID, "ACPI0012")  // _HID: Hardware ID
> >             Name (_STR, Unicode ("NVDIMM Root Device"))  // _STR: Description String
> >             Method (_STA, 0, NotSerialized)  // _STA: Status
> >             {
> >                 Return (0x0F)
> >             }
> >         }
> >     }
> > }
> >
> > In section 5.2.25.2 of ACPI 6.1 spec, it mentions that the "SPA Range
> > Structure Index" of VCD SPA shall be set to zero. That means VCD SPA
> > will not be associated by any NVDIMM region mapping.
> >
> > The VCD's SPA Range Structure in NFIT is similar to virtual disk region
> > as following:
> >
> > [028h 0040   2]                Subtable Type : 0000 [System Physical Address Range]
> > [02Ah 0042   2]                       Length : 0038
> >
> > [02Ch 0044   2]                  Range Index : 0000
> > [02Eh 0046   2]        Flags (decoded below) : 0000
> >                    Add/Online Operation Only : 0
> >                       Proximity Domain Valid : 0
> > [030h 0048   4]                     Reserved : 00000000
> > [034h 0052   4]             Proximity Domain : 00000000
> > [038h 0056  16]           Address Range GUID : 77AB535A-45FC-624B-5560-F7B281D1F96E
> > [048h 0072   8]           Address Range Base : 00000000B6ABD018
> > [050h 0080   8]         Address Range Length : 0000000005500000
> > [058h 0088   8]         Memory Map Attribute : 0000000000000000
> >
> > The way to not associate a SPA range is to never reference it from a "flush hint",
> > "interleave", or "control region" table.
> >
> > After testing on OVMF, pmem driver can support the region that it doesn't
> > assoicate to any NVDIMM mapping. So, treat VCD like pmem is a idea to get
> > a pmem block device that it contains iso.
> >
> > v3:
> > To simplify patch, removed VCD region in libnvdimm.
> >
> > v2:
> > Removed the code for setting VCD to a read-only region.
> >
> > Cc: Gary Lin <GLin@suse.com>
> > Cc: Dan Williams <dan.j.williams@intel.com>
> > Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
> > Cc: Linda Knippers <linda.knippers@hpe.com>
> > Signed-off-by: Lee, Chun-Yi <jlee@suse.com>
> > ---
> >  drivers/acpi/nfit.c          |  8 +++++++-
> >  drivers/nvdimm/region_devs.c | 26 +++++++++++++++++++++++++-
> >  include/linux/libnvdimm.h    |  2 ++
> >  3 files changed, 34 insertions(+), 2 deletions(-)
> >
> > Index: linux/drivers/acpi/nfit.c
> > ===================================================================
> > --- linux.orig/drivers/acpi/nfit.c
> > +++ linux/drivers/acpi/nfit.c
> > @@ -1995,7 +1995,7 @@ static int acpi_nfit_register_region(str
> >         if (nfit_spa->nd_region)
> >                 return 0;
> >
> > -       if (spa->range_index == 0) {
> > +       if (spa->range_index == 0 && nfit_spa_type(spa) != NFIT_SPA_VCD) {
> >                 dev_dbg(acpi_desc->dev, "%s: detected invalid spa index\n",
> >                                 __func__);
> 
> If we're adding the special casing might as well add it for all
> "virtual spa" tables.  I.e. introduce nfit_spa_is_virtual() and have
> it check for: NFIT_SPA_VDISK, NFIT_SPA_VCD, NFIT_SPA_PDISK, and
> NFIT_SPA_PCD.

Thanks for your suggestion. I will update and send version four.

Joey Lee

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-06-27 23:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-27  6:46 [PATCH v3] acpi, nfit: treat volatile virtual CD region as pmem Lee, Chun-Yi
2016-06-27 17:34 ` Dan Williams
2016-06-27 23:09   ` joeyli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).