[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <HK0PR03MB3170E6D5D62D14B02F39FAE089200@HK0PR03MB3170.apcprd03.prod.outlook.com>
Date: Mon, 6 Aug 2018 07:15:16 +0000
From: Ocean HY1 He <hehy1@...ovo.com>
To: "Verma, Vishal L" <vishal.l.verma@...el.com>,
"Williams, Dan J" <dan.j.williams@...el.com>,
"ross.zwisler@...ux.intel.com" <ross.zwisler@...ux.intel.com>,
"oceanhehy@...il.com" <oceanhehy@...il.com>,
"Jiang, Dave" <dave.jiang@...el.com>,
"lenb@...nel.org" <lenb@...nel.org>,
"rjw@...ysocki.net" <rjw@...ysocki.net>
CC: "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"linux-nvdimm@...ts.01.org" <linux-nvdimm@...ts.01.org>,
"linux-acpi@...r.kernel.org" <linux-acpi@...r.kernel.org>
Subject: RE: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to
find NFIT at startup
> -----Original Message-----
> From: Verma, Vishal L <vishal.l.verma@...el.com>
> Sent: Saturday, August 04, 2018 1:12 AM
> To: Williams, Dan J <dan.j.williams@...el.com>; ross.zwisler@...ux.intel.com;
> oceanhehy@...il.com; Jiang, Dave <dave.jiang@...el.com>; lenb@...nel.org;
> rjw@...ysocki.net
> Cc: linux-kernel@...r.kernel.org; linux-nvdimm@...ts.01.org; linux-
> acpi@...r.kernel.org; Ocean HY1 He <hehy1@...ovo.com>
> Subject: [External] Re: [PATCH] ACPI: nfit: return -ENODEV if fail to find NFIT at
> startup
>
>
> On Fri, 2018-08-03 at 05:39 -0400, Ocean He wrote:
> > From: Ocean He <hehy1@...ovo.com>
> >
> > In the beginning of acpi_nfit_add, if fail to find NFIT table then
> > should
> > return -ENODEV, instead of 0.
> >
> > Signed-off-by: Ocean He <hehy1@...ovo.com>
> > ---
> > drivers/acpi/nfit/core.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> > index 7c47900..1790d7c 100644
> > --- a/drivers/acpi/nfit/core.c
> > +++ b/drivers/acpi/nfit/core.c
> > @@ -3355,7 +3355,7 @@ static int acpi_nfit_add(struct acpi_device
> > *adev)
> > if (ACPI_FAILURE(status)) {
> > /* This is ok, we could have an nvdimm hotplugged
> > later */
> > dev_dbg(dev, "failed to find NFIT at startup\n");
> > - return 0;
> > + return -ENODEV;
>
> Hm, the comment directly above this says this is ok..
> Has this caused any problems in practice?
>
Thanks for your comments. After going through related codes and some test, I am
now thinking it's right to keep "return 0" if NFIT not found at boot time.
Per chapter 9.20.2 NVDIMM Root Device in ACPI 6.2 spec:
The NVDIMM root device is represented by an ACPI namespace device with a _HID
of "ACPI0012". This device allows the OS to trigger enumeration of NVDIMMs
through NFIT at boot time and re-enumeration at root level via the _FIT method
during runtime.
The acpi_nfit_driver is registered to ACPI bus to support "ACPI0012".
The acpi_nfit_driver.acpi_nfit_add is used to enumerate NVDIMMs through NFIT
at boot time; The acpi_nfit_driver.acpi_nfit_notify is used to enumerate
NVDIMMs during runtime.
In my Lenovo ThinkSystem SR630 which support NVDIMMs, If I remove
all NVDIMMs, the NFIT table is gone after system boot up. If keep "return 0"
in acpi_nfit_add, then acpi_nfit_driver would still be attached to "ACPI0012".
Once a NVDIMM is hotplugged into system during runtime, then
acpi_nfit_driver.acpi_nfit_notify can be called to enumerate NVDIMMs (I could
not do hotplug test because firmware doesn't support).
Otherwise, "return -ENODEV" would block NVDIMM enumeration during runtime.
How do you think to adjust annotation as following?
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 7c47900..1673161 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -3353,7 +3353,13 @@ static int acpi_nfit_add(struct acpi_device *adev)
status = acpi_get_table(ACPI_SIG_NFIT, 0, &tbl);
if (ACPI_FAILURE(status)) {
- /* This is ok, we could have an nvdimm hotplugged later */
+ /* The NVDIMM root device allows OS to trigger enumeration of
+ * NVDIMMs through NFIT at boot time and re-enumeration at
+ * root level via the _FIT method during runtime.
+ * This is ok to return 0 here, we could have an nvdimm
+ * hotplugged later and evaluate _FIT method which returns
+ * data in the format of a series of NFIT Structures.
+ */
dev_dbg(dev, "failed to find NFIT at startup\n");
return 0;
}
Ocean.
> > }
> >
> > rc = devm_add_action_or_reset(dev, acpi_nfit_put_table,
> > tbl);
Powered by blists - more mailing lists