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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.