From: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
To: keith <kmannth-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Cc: len.brown-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
naveen.b.s-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
acpi-devel
<acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>,
external hotplug mem list
<lhms-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Subject: Re: [Lhms-devel] [PATCH 1/1] patch to fix acpi_memhotplug.c
Date: Tue, 15 Nov 2005 18:29:42 +0900 [thread overview]
Message-ID: <4379AA86.5040901@jp.fujitsu.com> (raw)
In-Reply-To: <1132033003.3798.21.camel@knk>
[-- Attachment #1: Type: text/plain, Size: 4842 bytes --]
keith wrote:
> Hello,
>
> I am submitting this patch for inclusion in the acpi development tree.
> I have not received any feedback of my beta patch or emails over the
> past week. I cleaned my previous patch up and made the error handling
> match the rest of the driver. I need this patch to support my hardware
> (IBM x460/x366/x445) acpi hot-add memory events.
>
Sorry, I missed your previous e-mail.
> In general acpi_bus_get_device fails for my event.
> acpi_bus-0072 [04] bus_get_device : No context for object [ffff81007ff397f0]
> The current driver relies on acpi_bus_get_device to create the acpi
> memory_device but these call fails for my hardware.
>
I think the case in which a device is not onlined at boot time and
not -scaned- is not correctly managed. Could you try attached patch ?
-- Kame <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
==
Fix acpi_memory_get_device().
A case of "memory object is not onlined at boot time but hot-added" is managed.
Signed-Off-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
Index: linux-2.6.14-mm1/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-2.6.14-mm1.orig/drivers/acpi/acpi_memhotplug.c
+++ linux-2.6.14-mm1/drivers/acpi/acpi_memhotplug.c
@@ -77,6 +77,24 @@ struct acpi_memory_device {
u64 end_addr; /* Memory Range end physical addr */
};
+/* Maybe the same function in acpi_contaiener.c should be exported ..*/
+#define ACPI_STA_PRESENT (0x00000001)
+static int is_memory_device_present(acpi_handle handle)
+{
+ acpi_status status;
+ unsigned long sta;
+ acpi_handle temp;
+ ACPI_FUNCTION_TRACE("is_memory_device_present");
+ status = acpi_get_handle(handle, "_STA", &temp);
+ if (ACPI_FAILURE(status))
+ return_VALUE(1); /* _STA not found, assume present */
+ status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
+ if (ACPI_FAILURE(status))
+ return_VALUE(0);
+ return_VALUE((sta & ACPI_STA_PRESENT) == ACPI_STA_PRESENT);
+}
+
+
static int
acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
{
@@ -112,18 +130,14 @@ acpi_memory_get_device_resources(struct
static int
acpi_memory_get_device(acpi_handle handle,
- struct acpi_memory_device **mem_device)
+ struct acpi_device **device)
{
acpi_status status;
acpi_handle phandle;
- struct acpi_device *device = NULL;
struct acpi_device *pdevice = NULL;
ACPI_FUNCTION_TRACE("acpi_memory_get_device");
- if (!acpi_bus_get_device(handle, &device) && device)
- goto end;
-
status = acpi_get_parent(handle, &phandle);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error in acpi_get_parent\n"));
@@ -138,23 +152,12 @@ acpi_memory_get_device(acpi_handle handl
return_VALUE(-EINVAL);
}
- /*
- * Now add the notified device. This creates the acpi_device
- * and invokes .add function
- */
- status = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
+ status = acpi_bus_add(device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error in acpi_bus_add\n"));
return_VALUE(-EINVAL);
}
- end:
- *mem_device = acpi_driver_data(device);
- if (!(*mem_device)) {
- printk(KERN_ERR "\n driver data not found");
- return_VALUE(-ENODEV);
- }
-
return_VALUE(0);
}
@@ -282,9 +285,11 @@ static void acpi_memory_device_notify(ac
{
struct acpi_memory_device *mem_device;
struct acpi_device *device;
+ acpi_status status;
+ int present;
ACPI_FUNCTION_TRACE("acpi_memory_device_notify");
-
+ present = is_memory_device_present(handle);
switch (event) {
case ACPI_NOTIFY_BUS_CHECK:
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@ -294,12 +299,26 @@ static void acpi_memory_device_notify(ac
if (event == ACPI_NOTIFY_DEVICE_CHECK)
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"\nReceived DEVICE CHECK notification for device\n"));
- if (acpi_memory_get_device(handle, &mem_device)) {
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ status = acpi_bus_get_device(handle, &device);
+ if (ACPI_FAILURE(status) || !device) {
+ if (present) {
+ status = acpi_memory_get_device(handle, &device);
+ if (ACPI_FAILURE(status) || !device) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Error in finding driver data\n"));
+ return_VOID;
+ }
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ "notified handle seems not present"));
+ return_VOID;
+ }
+ }
+ mem_device = acpi_driver_data(device);
+ if (!mem_device) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "error acpi_memhotplug: device has no mem_device"));
return_VOID;
}
-
if (!acpi_memory_check_device(mem_device)) {
if (acpi_memory_enable_device(mem_device))
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
[-- Attachment #2: acpi_memhotplug_fix.patch --]
[-- Type: text/x-patch, Size: 3912 bytes --]
Fix acpi_memory_get_device().
A case of "memory object is not onlined at boot time but hot-added" is managed.
Signed-Off-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
Index: linux-2.6.14-mm1/drivers/acpi/acpi_memhotplug.c
===================================================================
--- linux-2.6.14-mm1.orig/drivers/acpi/acpi_memhotplug.c
+++ linux-2.6.14-mm1/drivers/acpi/acpi_memhotplug.c
@@ -77,6 +77,24 @@ struct acpi_memory_device {
u64 end_addr; /* Memory Range end physical addr */
};
+/* Maybe the same function in acpi_contaiener.c should be exported ..*/
+#define ACPI_STA_PRESENT (0x00000001)
+static int is_memory_device_present(acpi_handle handle)
+{
+ acpi_status status;
+ unsigned long sta;
+ acpi_handle temp;
+ ACPI_FUNCTION_TRACE("is_memory_device_present");
+ status = acpi_get_handle(handle, "_STA", &temp);
+ if (ACPI_FAILURE(status))
+ return_VALUE(1); /* _STA not found, assume present */
+ status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
+ if (ACPI_FAILURE(status))
+ return_VALUE(0);
+ return_VALUE((sta & ACPI_STA_PRESENT) == ACPI_STA_PRESENT);
+}
+
+
static int
acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
{
@@ -112,18 +130,14 @@ acpi_memory_get_device_resources(struct
static int
acpi_memory_get_device(acpi_handle handle,
- struct acpi_memory_device **mem_device)
+ struct acpi_device **device)
{
acpi_status status;
acpi_handle phandle;
- struct acpi_device *device = NULL;
struct acpi_device *pdevice = NULL;
ACPI_FUNCTION_TRACE("acpi_memory_get_device");
- if (!acpi_bus_get_device(handle, &device) && device)
- goto end;
-
status = acpi_get_parent(handle, &phandle);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error in acpi_get_parent\n"));
@@ -138,23 +152,12 @@ acpi_memory_get_device(acpi_handle handl
return_VALUE(-EINVAL);
}
- /*
- * Now add the notified device. This creates the acpi_device
- * and invokes .add function
- */
- status = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
+ status = acpi_bus_add(device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error in acpi_bus_add\n"));
return_VALUE(-EINVAL);
}
- end:
- *mem_device = acpi_driver_data(device);
- if (!(*mem_device)) {
- printk(KERN_ERR "\n driver data not found");
- return_VALUE(-ENODEV);
- }
-
return_VALUE(0);
}
@@ -282,9 +285,11 @@ static void acpi_memory_device_notify(ac
{
struct acpi_memory_device *mem_device;
struct acpi_device *device;
+ acpi_status status;
+ int present;
ACPI_FUNCTION_TRACE("acpi_memory_device_notify");
-
+ present = is_memory_device_present(handle);
switch (event) {
case ACPI_NOTIFY_BUS_CHECK:
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@ -294,12 +299,26 @@ static void acpi_memory_device_notify(ac
if (event == ACPI_NOTIFY_DEVICE_CHECK)
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"\nReceived DEVICE CHECK notification for device\n"));
- if (acpi_memory_get_device(handle, &mem_device)) {
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ status = acpi_bus_get_device(handle, &device);
+ if (ACPI_FAILURE(status) || !device) {
+ if (present) {
+ status = acpi_memory_get_device(handle, &device);
+ if (ACPI_FAILURE(status) || !device) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Error in finding driver data\n"));
+ return_VOID;
+ }
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ "notified handle seems not present"));
+ return_VOID;
+ }
+ }
+ mem_device = acpi_driver_data(device);
+ if (!mem_device) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "error acpi_memhotplug: device has no mem_device"));
return_VOID;
}
-
if (!acpi_memory_check_device(mem_device)) {
if (acpi_memory_enable_device(mem_device))
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
next prev parent reply other threads:[~2005-11-15 9:29 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-07 21:44 acpi_memhotplug driver is not working for me. Any ideas? keith
2005-11-11 2:45 ` keith
2005-11-12 5:03 ` [RFC][PATCH] patch to fix acpi_memhotplug.c for my hardware keith
2005-11-15 5:36 ` [PATCH 1/1] patch to fix acpi_memhotplug.c keith
2005-11-15 9:29 ` KAMEZAWA Hiroyuki [this message]
[not found] ` <4379AA86.5040901-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2005-11-15 9:33 ` [Lhms-devel] " KAMEZAWA Hiroyuki
2005-11-16 2:49 ` keith
2005-11-16 3:26 ` KAMEZAWA Hiroyuki
2005-11-15 10:20 ` Yasunori Goto
[not found] ` <20051115171221.7E99.Y-GOTO-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2005-11-17 4:18 ` keith
2005-11-17 6:08 ` KAMEZAWA Hiroyuki
[not found] ` <437C1E6C.6000404-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2005-11-18 2:22 ` keith
2005-11-18 2:56 ` KAMEZAWA Hiroyuki
[not found] ` <437D42F1.6080407-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2005-11-18 18:54 ` keith
2005-11-17 7:01 ` Yasunori Goto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4379AA86.5040901@jp.fujitsu.com \
--to=kamezawa.hiroyu-+cum20s59erqfuhtdcdx3a@public.gmane.org \
--cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=kmannth-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
--cc=len.brown-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=lhms-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=naveen.b.s-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox