All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Christian Krafft <krafft@de.ibm.com>
Cc: linuxppc-dev@ozlabs.org, cbe-oss-dev@ozlabs.org, arnd@arndb.de,
	Christian Krafft <krafft@linux.ibm.com>
Subject: Re: [Cbe-oss-dev] [patch 02/02] powerpc/cell: add support for power button of future IBM cell blades
Date: Wed, 09 Jul 2008 13:35:30 +1000	[thread overview]
Message-ID: <1215574530.8970.306.camel@pasglop> (raw)
In-Reply-To: <20080707185644.0d6c9757@de.ibm.com>

On Mon, 2008-07-07 at 18:56 +0200, Christian Krafft wrote:
> From: Christian Krafft <krafft@de.ibm.com>
> 
> This patch adds support for the power button on future IBM cell blades.
> It actually doesn't shut down the machine. Instead it exposes an
> input device /dev/input/event0 to userspace which sends KEY_POWER
> if power button has been pressed.
> haldaemon actually recognizes the button, so a plattform independent acpid
> replacement should handle it correctly.
> 
> Signed-off-by: Christian Krafft <krafft@de.ibm.com>

Sorry Christian, i'm still not too happy with this one.

There are two issues at hand here:

 - The use of SELECT, that will be frowned on unfortunately.

 - I'm not too sure it's very safe the way you do it. If I understand
correctly, you can get called for that sysreset at -any- time, including
when interrupts are off right ?

That means potentially, code that has interrupts off will be interrupted
by input_report/input_sync, which is really bad (may corrupt the input
layer internal list management for example).

You could solve both things with a little trick: Have the platform code
just basically set a global flag when the button was pressed and have a
module that depends on INPUT & INPUT_DEV poll for it (slowly pls) and do
the input report.

Ben.

> Index: linux.git/arch/powerpc/platforms/cell/Kconfig
> ===================================================================
> --- linux.git.orig/arch/powerpc/platforms/cell/Kconfig
> +++ linux.git/arch/powerpc/platforms/cell/Kconfig
> @@ -87,9 +87,12 @@ config PPC_IBM_CELL_BLADE_BUTTONS
>  	bool "IBM Cell Blade Buttons"
>  	depends on CBE_RAS && PPC_IBM_CELL_BLADE
>  	default y
> +	select INPUT
> +	select INPUT_EVDEV
>  	help
>  	  Support Buttons on IBM Cell blades. This adds a method to
> -	  trigger system reset via front panel pinhole button.
> +	  trigger system reset via front panel pinhole button and
> +	  an input device for the power button.
>  
>  config CBE_THERM
>  	tristate "CBE thermal support"
> Index: linux.git/arch/powerpc/platforms/cell/ras.c
> ===================================================================
> --- linux.git.orig/arch/powerpc/platforms/cell/ras.c
> +++ linux.git/arch/powerpc/platforms/cell/ras.c
> @@ -14,6 +14,11 @@
>  #include <linux/smp.h>
>  #include <linux/reboot.h>
>  
> +#ifdef CONFIG_PPC_IBM_CELL_BLADE_BUTTONS
> +#include <linux/input.h>
> +#include <linux/platform_device.h>
> +#endif /* CONFIG_PPC_IBM_CELL_BLADE_BUTTONS */
> +
>  #include <asm/reg.h>
>  #include <asm/io.h>
>  #include <asm/prom.h>
> @@ -232,31 +237,76 @@ static struct notifier_block cbe_ptcal_r
>  
>  #ifdef CONFIG_PPC_IBM_CELL_BLADE_BUTTONS
>  static int sysreset_hack;
> +static struct input_dev *button_dev;
> +static struct platform_device *button_pdev;
>  
>  static int __init cbe_sysreset_init(void)
>  {
> +	int ret = 0;
> +	struct input_dev *dev;
>  	struct cbe_pmd_regs __iomem *regs;
>  
>  	sysreset_hack = machine_is_compatible("IBM,CBPLUS-1.0");
>  	if (!sysreset_hack)
> -		return 0;
> +		goto out;
>  
>  	regs = cbe_get_cpu_pmd_regs(0);
>  	if (!regs)
> -		return 0;
> +		goto out;
>  
>  	/* Enable JTAG system-reset hack */
>  	out_be32(&regs->fir_mode_reg,
>  		in_be32(&regs->fir_mode_reg) |
>  		CBE_PMD_FIR_MODE_M8);
>  
> -	return 0;
> +	dev = input_allocate_device();
> +	if (!dev) {
> +		ret = -ENOMEM;
> +		printk(KERN_ERR "%s: Not enough memory\n", __func__);
> +		goto out;
> +	}
> +
> +	set_bit(EV_KEY, dev->evbit);
> +	set_bit(KEY_POWER, dev->keybit);
> +
> +	dev->name = "Power Button";
> +	dev->id.bustype = BUS_HOST;
> +
> +	/* this makes the button look like an acpi power button
> +	 * no clue whether anyone relies on that though */
> +	dev->id.product = 0x02;
> +	dev->phys = "LNXPWRBN/button/input0";
> +
> +	button_pdev = platform_device_register_simple("power_button", 0, NULL, 0);
> +	if (IS_ERR(button_pdev)) {
> +		ret = PTR_ERR(button_pdev);
> +		goto out_free_input;
> +	}
> +
> +	dev->dev.parent = &button_pdev->dev;
> + 	ret = input_register_device(dev);
> +
> +	if (ret) {
> +		printk(KERN_ERR "%s: Failed to register device\n", __func__);
> +		goto out_free_pdev;
> +	}
> +
> +	button_dev = dev;
> +	goto out;
> +
> +out_free_pdev:
> +	platform_device_unregister(button_pdev);
> +out_free_input:
> +	input_free_device(dev);
> +out:
> +	return ret;
>  }
>  device_initcall(cbe_sysreset_init);
>  
>  int cbe_sysreset_hack(void)
>  {
>  	struct cbe_pmd_regs __iomem *regs;
> +	u64 status;
>  
>  	/*
>  	 * The BMC can inject user triggered system reset exceptions,
> @@ -267,10 +317,20 @@ int cbe_sysreset_hack(void)
>  		regs = cbe_get_cpu_pmd_regs(0);
>  		if (!regs)
>  			return 0;
> -		if (in_be64(&regs->ras_esc_0) & 0x0000ffff) {
> +		status = in_be64(&regs->ras_esc_0);
> +		if (status & 0x0000ffff) {
>  			out_be64(&regs->ras_esc_0, 0);
>  			return 0;
>  		}
> +		if (status & 0x00010000) {
> +			out_be64(&regs->ras_esc_0, 0);
> +			if (!button_dev)
> +				return 0;
> +			input_report_key(button_dev, KEY_POWER, 1);
> +			input_sync(button_dev);
> +			input_report_key(button_dev, KEY_POWER, 0);
> +			input_sync(button_dev);
> +		}
>  	}
>  	return 1;
>  }
> 

  reply	other threads:[~2008-07-09  3:35 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-04 19:05 [patch 00/11] Cell patches for 2.6.27 arnd
2008-07-04 19:05 ` [patch 01/11] powerpc/cell: add support for power button of future IBM cell blades arnd
2008-07-07  5:12   ` Benjamin Herrenschmidt
2008-07-07  9:23     ` Christian Krafft
     [not found]       ` <20080707184756.16e52677@linux.ibm.com>
2008-07-07 16:54         ` [Cbe-oss-dev] [patch 01/02] powerpc/cell: cleanup sysreset_hack for " Christian Krafft
2008-07-07 16:56         ` [Cbe-oss-dev] [patch 02/02] powerpc/cell: add support for power button of future " Christian Krafft
2008-07-09  3:35           ` Benjamin Herrenschmidt [this message]
2008-07-09 13:15             ` Arnd Bergmann
2008-07-09 20:45               ` Benjamin Herrenschmidt
2008-07-10 14:34                 ` Arnd Bergmann
2008-07-07  5:24   ` [patch 01/11] " Stephen Rothwell
2008-07-07  8:40     ` [Cbe-oss-dev] " Arnd Bergmann
2008-07-04 19:05 ` [patch 02/11] powerpc/axonram: use only one block device major number arnd
2008-07-04 19:05 ` [patch 03/11] powerpc/axonram: enable partitioning of the Axons DDR2 DIMMs arnd
2008-07-04 19:05 ` [patch 04/11] powerpc/spufs: add atomic busy_spus counter to struct cbe_spu_info arnd
2008-07-07  5:19   ` Benjamin Herrenschmidt
2008-07-07  5:30     ` Stephen Rothwell
2008-07-07  8:50       ` [Cbe-oss-dev] " Arnd Bergmann
2008-07-04 19:05 ` [patch 05/11] powerpc/cell: add spu aware cpufreq governor arnd
2008-07-07  5:21   ` Benjamin Herrenschmidt
2008-07-07  5:32     ` Stephen Rothwell
2008-07-07  9:01     ` [Cbe-oss-dev] " Arnd Bergmann
2008-07-07  6:24   ` Stephen Rothwell
2008-07-07  8:58     ` [Cbe-oss-dev] " Arnd Bergmann
2008-07-07 14:59     ` Arnd Bergmann
2008-07-07 15:35       ` Josh Boyer
2008-07-07 21:15         ` Arnd Bergmann
2008-07-07 21:17           ` Josh Boyer
2008-07-08  2:40             ` Stephen Rothwell
2008-07-07 19:56   ` Geoff Levand
2008-07-04 19:05 ` [patch 06/11] powerpc: Add struct iommu_table argument to iommu_map_sg() arnd
2008-07-04 19:05 ` [patch 07/11] powerpc/dma: implement new dma_*map*_attrs() interfaces arnd
2008-07-07  5:27   ` Benjamin Herrenschmidt
2008-07-07 19:15     ` Geoff Levand
2008-07-04 19:05 ` [patch 08/11] powerpc/dma: use the struct dma_attrs in iommu code arnd
2008-07-04 19:05 ` [patch 09/11] powerpc/cell: cell_dma_dev_setup_iommu() return the iommu table arnd
2008-07-04 19:05 ` [patch 10/11] powerpc: move device_to_mask() to dma-mapping.h arnd
2008-07-04 19:05 ` [patch 11/11] powerpc/cell: Add DMA_ATTR_STRONG_ORDERING dma attribute and use in IOMMU code arnd
2008-07-05  5:43   ` [Cbe-oss-dev] " Michael Ellerman
2008-07-05  6:28     ` Benjamin Herrenschmidt
2008-07-05 21:51       ` Arnd Bergmann
2008-07-05 22:20         ` Benjamin Herrenschmidt
2008-07-06 15:15           ` Arnd Bergmann
2008-07-07  0:00         ` Michael Ellerman
2008-07-07  9:01           ` Arnd Bergmann

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=1215574530.8970.306.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=arnd@arndb.de \
    --cc=cbe-oss-dev@ozlabs.org \
    --cc=krafft@de.ibm.com \
    --cc=krafft@linux.ibm.com \
    --cc=linuxppc-dev@ozlabs.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.