PS3: Fix unlikely typo in ps3_get_irq
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/6 PS3: Fix unlikely typo in ps3_get_irq
From: Roel Kluin <[email protected]>
Fix a typo bug 'unlikely(x) == y' and add an unlikely() call to an unlikely code path in the PS3 interrupt routine ps3_get_irq().
--- arch/powerpc/platforms/ps3/interrupt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/ps3/interrupt.c +1 -1
@@ -709,7 +709,7 @@ static unsigned int ps3_get_irq(void) asmvolatile ("cntlzd %0,%1" :"=r" (plug) :"r" (x)); plug &=0x3f ; -if (unlikely (plug) ==NO_IRQ ) { +if (unlikely (plug ==NO_IRQ )) {pr_debug ("%s:%d: no plug found: thread_id %lu\n" , __func__, __LINE__, pd->thread_id);dump_bmp (&per_cpu (ps3_private,0 ));
PATCH 2/6 PS3: Add ps3_get_speid routine
In reply to a message not in the archiveFrom: Takashi Yamamoto <[email protected]>
Add a new routine ps3_get_speid() which returns the logical SPE ID. This ID is needed for profiling support.
--- arch/powerpc/platforms/ps3/spu.c | 7 +++++++ 1 file changed, 7 insertions(+)
arch/powerpc/platforms/ps3/spu.c +7 -0
@@ -27,6 +27,7 @@#include <asm/spu.h> #include <asm/spu_priv1.h> #include <asm/lv1call.h> +#include <asm/ps3.h> #include "../cell/spufs/spufs.h" #include "platform.h"
@@ -140,6 +141,12 @@ static void _dump_areas(unsigned int spepr_debug ("%s:%d: shadow: %lxh\n" , func, line, shadow); } +inline u64 ps3_get_spe_id (void *arg) +{ +return spu_pdata (arg)->spe_id; +} +EXPORT_SYMBOL_GPL (ps3_get_spe_id); +static unsigned long get_vas_id (void ) {unsigned long id;
PATCH 3/6 PS3: Bootwrapper improvements
In reply to a message not in the archiveImprove the debuging support of the PS3 bootwraper code:
o Increase the size of the PS3 bootwrapper overlay from 256 to 512 bytes to allow for more debugging code in the overlay.
o Use the dot symbol to set the size of __system_reset_overlay. The asembler will then emit an error if the overlay code is too big.
o Remove some unused instructions.
o Update the text describing the PS3 bootwrapper overlay.
o Add a check for null pointer writes.
o Change hcall return value from s64.
--- arch/powerpc/boot/ps3-head.S | 25 ++++++++++++++++--------- arch/powerpc/boot/ps3.c | 21 +++++++++++++-------- arch/powerpc/boot/wrapper | 21 +++++++++++---------- 3 files changed, 40 insertions(+), 27 deletions(-)
arch/powerpc/boot/ps3-head.S +16 -9
@@ -27,8 +27,9 @@ /* * __system_reset_overlay - The PS3 first stage entry. * - * The bootwraper build script copies the 0x100 bytes at symbol - * __system_reset_overlay to offset 0x100 of the rom image. + * The bootwraper build script copies the 512 bytes at symbol + * __system_reset_overlay to offset 0x100 of the rom image. This symbol + * must occupy 512 or less bytes. * * The PS3 has a single processor with two threads. */
@@ -47,8 +48,6 @@ __system_reset_overlay: mfspr r3, 0x88 cntlzw. r3, r3 - li r4, 0 - li r5, 0 beq 1f /* Secondary goes to __secondary_hold in kernel. */
@@ -57,8 +56,14 @@ __system_reset_overlay: mtctr r4 bctr - /* Primary delays then goes to _zimage_start in wrapper. */ 1: + /* Save the value at addr zero for a null pointer write check later. */ + + li r4, 0 + lwz r3, 0(r4) + + /* Primary delays then goes to _zimage_start in wrapper. */ + or 31, 31, 31 /* db16cyc */ or 31, 31, 31 /* db16cyc */
@@ -67,16 +72,18 @@ __system_reset_overlay: mtctr r4 bctr + . = __system_reset_overlay + 512 + /* * __system_reset_kernel - Place holder for the kernel reset vector. * - * The bootwrapper build script copies 0x100 bytes from offset 0x100 + * The bootwrapper build script copies 512 bytes from offset 0x100 * of the rom image to the symbol __system_reset_kernel. At runtime - * the bootwrapper program copies the 0x100 bytes at __system_reset_kernel - * to ram address 0x100. This symbol must occupy 0x100 bytes. + * the bootwrapper program copies the 512 bytes at __system_reset_kernel + * to ram address 0x100. This symbol must occupy 512 bytes. */ .globl __system_reset_kernel __system_reset_kernel: - . = __system_reset_kernel + 0x100 + . = __system_reset_kernel + 512
arch/powerpc/boot/ps3.c +13 -8
@@ -27,10 +27,10 @@#include "page.h" #include "ops.h" -extern s64 lv1_panic (u64 in_1); -extern s64 lv1_get_logical_partition_id (u64 *out_1); -extern s64 lv1_get_logical_ppe_id (u64 *out_1); -extern s64 lv1_get_repository_node_value (u64 in_1,u64 in_2,u64 in_3, +extern int lv1_panic (u64 in_1); +extern int lv1_get_logical_partition_id (u64 *out_1); +extern int lv1_get_logical_ppe_id (u64 *out_1); +extern int lv1_get_repository_node_value (u64 in_1,u64 in_2,u64 in_3,u64 in_4,u64 in_5,u64 *out_1,u64 *out_2);#ifdef DEBUG
@@ -46,6 +46,7 @@ BSS_STACK(4096);* edit the command line passed to vmlinux (by setting /chosen/bootargs). * The buffer is put in it's own section so that tools may locate it easier. */ + static char cmdline[COMMAND_LINE_SIZE] __attribute__((__section__("__builtin_cmdline")));
@@ -75,7 +76,7 @@ static void ps3_exit(void)static int ps3_repository_read_rm_size (u64 *rm_size) { -s64 result; +int result;u64 lpar_id;u64 ppe_id;u64 v2;
@@ -114,11 +115,11 @@ void ps3_copy_vectors(void) {extern char __system_reset_kernel[]; -memcpy ((void *)0x100 , __system_reset_kernel,0x100 ); -flush_cache ((void *)0x100 ,0x100 ); +memcpy ((void *)0x100 , __system_reset_kernel,512 ); +flush_cache ((void *)0x100 ,512 ); } -void platform_init (void ) +void platform_init (unsigned long null_check) {const u32 heapsize =0x1000000 - (u32 )_end;/* 16MiB */ void *chosen;
@@ -151,6 +152,10 @@ void platform_init(void)printf (" flat tree at 0x%lx\n\r" , ft_addr); +if (*(unsigned long *)0 != null_check) +printf ("null check failed: %lx != %lx\n\r" , *(unsigned long *)0 , + (unsigned long )null_check); + ((kernel_entry_t )0 )(ft_addr,0 ,NULL );ps3_exit ();
arch/powerpc/boot/wrapper +11 -10
@@ -298,15 +298,16 @@ treeboot*) exit 0 ;; ps3) - # The ps3's loader supports loading gzipped binary images from flash - # rom to addr zero. The loader enters the image at addr 0x100. A - # bootwrapper overlay is use to arrange for the kernel to be loaded - # to addr zero and to have a suitable bootwrapper entry at 0x100. - # To construct the rom image, 0x100 bytes from offset 0x100 in the - # kernel is copied to the bootwrapper symbol __system_reset_kernel. - # The 0x100 bytes at the bootwrapper symbol __system_reset_overlay is - # then copied to offset 0x100. At runtime the bootwrapper program - # copies the 0x100 bytes at __system_reset_kernel to addr 0x100. + # The ps3's loader supports loading a gzipped binary image from flash + # rom to ram addr zero. The loader then enters the system reset + # vector at addr 0x100. A bootwrapper overlay is used to arrange for + # a binary image of the kernel to be at addr zero, and yet have a + # suitable bootwrapper entry at 0x100. To construct the final rom + # image 512 bytes from offset 0x100 is copied to the bootwrapper + # place holder at symbol __system_reset_kernel. The 512 bytes of the + # bootwrapper entry code at symbol __system_reset_overlay is then + # copied to offset 0x100. At runtime the bootwrapper program copies + # the data at __system_reset_kernel back to addr 0x100. system_reset_overlay=0x`${CROSS}nm "$ofile" \ | grep ' __system_reset_overlay$' \
@@ -317,7 +318,7 @@ ps3) | cut -d' ' -f1` system_reset_kernel=`printf "%d" $system_reset_kernel` overlay_dest="256" - overlay_size="256" + overlay_size="512" ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
Re: [patch 3/6] PS3: Bootwrapper improvements
arch/powerpc/boot/ps3.c void ps3_copy_vectors(void) · line 122
Quoted 6 lines · Geoff Levand
arch/powerpc/boot/ps3.c +1
-1} -void platform_init (void ) +void platform_init (unsigned long null_check)
^^^^^^^^^^^^^^^^^^^^^^^^
arch/powerpc/boot/ps3.c void platform_init(void) · line 157
Quoted 10 lines
{
arch/powerpc/boot/ps3.c +3
-0const u32 heapsize =0x1000000 - (u32 )_end;/* 16MiB */ void *chosen;@@ -151,6 +152,10 @@ void platform_init(void)printf (" flat tree at 0x%lx\n\r" , ft_addr); +if (*(unsigned long *)0 != null_check) +printf ("null check failed: %lx != %lx\n\r" , *(unsigned long *)0 , + (unsigned long )null_check);
^^^^^^^^^^^^^^^
This cast is not needed, as null_check has the correct type.
BTW, what about writing it like
unsigned long val;
val = *(unsigned long *)0;
if (val != null_check)
printf("null check failed: %lx != %lx\n\r", val, null_check);to kill a duplicate cast and avoid splitting the printf() line?
With kind regards,
Geert Uytterhoeven
Software Architect
Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
Phone: +32 (0)2 700 8453 Fax: +32 (0)2 700 8622 E-mail: [email protected] Internet: http://www.sony-europe.com/
Sony Network and Software Technology Center Europe
A division of Sony Service Centre (Europe) N.V. Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium VAT BE 0413.825.160 · RPR Brussels
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619
PATCH v2 3/6 PS3: Bootwrapper improvements
In reply to Geoff LevandImprove the debugging support of the PS3 bootwraper code:
o Increase the size of the PS3 bootwrapper overlay from 256 to 512 bytes to allow for more debugging code in the overlay.
o Use the dot symbol to set the size of __system_reset_overlay. The assembler will then emit an error if the overlay code is too big.
o Remove some unused instructions.
o Update the text describing the PS3 bootwrapper overlay.
o Add a check for null pointer writes.
o Change hcall return value from s64.
---
v2:
o Cleanup null check code.
arch/powerpc/boot/ps3-head.S | 25 ++++++++++++++++--------- arch/powerpc/boot/ps3.c | 23 +++++++++++++++-------- arch/powerpc/boot/wrapper | 21 +++++++++++---------- 3 files changed, 42 insertions(+), 27 deletions(-)
arch/powerpc/boot/ps3-head.S +16 -9
@@ -27,8 +27,9 @@ /* * __system_reset_overlay - The PS3 first stage entry. * - * The bootwraper build script copies the 0x100 bytes at symbol - * __system_reset_overlay to offset 0x100 of the rom image. + * The bootwraper build script copies the 512 bytes at symbol + * __system_reset_overlay to offset 0x100 of the rom image. This symbol + * must occupy 512 or less bytes. * * The PS3 has a single processor with two threads. */
@@ -47,8 +48,6 @@ __system_reset_overlay: mfspr r3, 0x88 cntlzw. r3, r3 - li r4, 0 - li r5, 0 beq 1f /* Secondary goes to __secondary_hold in kernel. */
@@ -57,8 +56,14 @@ __system_reset_overlay: mtctr r4 bctr - /* Primary delays then goes to _zimage_start in wrapper. */ 1: + /* Save the value at addr zero for a null pointer write check later. */ + + li r4, 0 + lwz r3, 0(r4) + + /* Primary delays then goes to _zimage_start in wrapper. */ + or 31, 31, 31 /* db16cyc */ or 31, 31, 31 /* db16cyc */
@@ -67,16 +72,18 @@ __system_reset_overlay: mtctr r4 bctr + . = __system_reset_overlay + 512 + /* * __system_reset_kernel - Place holder for the kernel reset vector. * - * The bootwrapper build script copies 0x100 bytes from offset 0x100 + * The bootwrapper build script copies 512 bytes from offset 0x100 * of the rom image to the symbol __system_reset_kernel. At runtime - * the bootwrapper program copies the 0x100 bytes at __system_reset_kernel - * to ram address 0x100. This symbol must occupy 0x100 bytes. + * the bootwrapper program copies the 512 bytes at __system_reset_kernel + * to ram address 0x100. This symbol must occupy 512 bytes. */ .globl __system_reset_kernel __system_reset_kernel: - . = __system_reset_kernel + 0x100 + . = __system_reset_kernel + 512
arch/powerpc/boot/ps3.c +15 -8
@@ -27,10 +27,10 @@#include "page.h" #include "ops.h" -extern s64 lv1_panic (u64 in_1); -extern s64 lv1_get_logical_partition_id (u64 *out_1); -extern s64 lv1_get_logical_ppe_id (u64 *out_1); -extern s64 lv1_get_repository_node_value (u64 in_1,u64 in_2,u64 in_3, +extern int lv1_panic (u64 in_1); +extern int lv1_get_logical_partition_id (u64 *out_1); +extern int lv1_get_logical_ppe_id (u64 *out_1); +extern int lv1_get_repository_node_value (u64 in_1,u64 in_2,u64 in_3,u64 in_4,u64 in_5,u64 *out_1,u64 *out_2);#ifdef DEBUG
@@ -46,6 +46,7 @@ BSS_STACK(4096);* edit the command line passed to vmlinux (by setting /chosen/bootargs). * The buffer is put in it's own section so that tools may locate it easier. */ + static char cmdline[COMMAND_LINE_SIZE] __attribute__((__section__("__builtin_cmdline")));
@@ -75,7 +76,7 @@ static void ps3_exit(void)static int ps3_repository_read_rm_size (u64 *rm_size) { -s64 result; +int result;u64 lpar_id;u64 ppe_id;u64 v2;
@@ -114,16 +115,17 @@ void ps3_copy_vectors(void) {extern char __system_reset_kernel[]; -memcpy ((void *)0x100 , __system_reset_kernel,0x100 ); -flush_cache ((void *)0x100 ,0x100 ); +memcpy ((void *)0x100 , __system_reset_kernel,512 ); +flush_cache ((void *)0x100 ,512 ); } -void platform_init (void ) +void platform_init (unsigned long null_check) {const u32 heapsize =0x1000000 - (u32 )_end;/* 16MiB */ void *chosen;unsigned long ft_addr;u64 rm_size; +unsigned long val; console_ops.write = ps3_console_write; platform_ops.exit = ps3_exit;
@@ -151,6 +153,11 @@ void platform_init(void)printf (" flat tree at 0x%lx\n\r" , ft_addr); + val = *(unsigned long *)0 ; + +if (val != null_check) +printf ("null check failed: %lx != %lx\n\r" , val, null_check); + ((kernel_entry_t )0 )(ft_addr,0 ,NULL );ps3_exit ();
arch/powerpc/boot/wrapper +11 -10
@@ -298,15 +298,16 @@ treeboot*) exit 0 ;; ps3) - # The ps3's loader supports loading gzipped binary images from flash - # rom to addr zero. The loader enters the image at addr 0x100. A - # bootwrapper overlay is use to arrange for the kernel to be loaded - # to addr zero and to have a suitable bootwrapper entry at 0x100. - # To construct the rom image, 0x100 bytes from offset 0x100 in the - # kernel is copied to the bootwrapper symbol __system_reset_kernel. - # The 0x100 bytes at the bootwrapper symbol __system_reset_overlay is - # then copied to offset 0x100. At runtime the bootwrapper program - # copies the 0x100 bytes at __system_reset_kernel to addr 0x100. + # The ps3's loader supports loading a gzipped binary image from flash + # rom to ram addr zero. The loader then enters the system reset + # vector at addr 0x100. A bootwrapper overlay is used to arrange for + # a binary image of the kernel to be at addr zero, and yet have a + # suitable bootwrapper entry at 0x100. To construct the final rom + # image 512 bytes from offset 0x100 is copied to the bootwrapper + # place holder at symbol __system_reset_kernel. The 512 bytes of the + # bootwrapper entry code at symbol __system_reset_overlay is then + # copied to offset 0x100. At runtime the bootwrapper program copies + # the data at __system_reset_kernel back to addr 0x100. system_reset_overlay=0x`${CROSS}nm "$ofile" \ | grep ' __system_reset_overlay$' \
@@ -317,7 +318,7 @@ ps3) | cut -d' ' -f1` system_reset_kernel=`printf "%d" $system_reset_kernel` overlay_dest="256" - overlay_size="256" + overlay_size="512" ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
PATCH 4/6 PS3: Save power in busy loops on halt
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
PS3 save power on halt:
- Replace infinite busy loops by smarter loops calling lv1_pause() to save power.
- Add ps3_halt() and ps3_sys_manager_halt().
- Add __noreturn annotations.
--- arch/powerpc/platforms/ps3/setup.c | 12 +++++++++++- drivers/ps3/ps3-sys-manager.c | 30 ++++++++++++++++++++---------- drivers/ps3/sys-manager-core.c | 16 ++++++++++------ include/asm-powerpc/ps3.h | 5 +++-- 4 files changed, 44 insertions(+), 19 deletions(-)
arch/powerpc/platforms/ps3/setup.c +11 -1
@@ -95,6 +95,14 @@ static void ps3_power_off(void)ps3_sys_manager_power_off ();/* never returns */ } +static void ps3_halt (void ) +{ +DBG ("%s:%d\n" , __func__, __LINE__); + +smp_send_stop (); +ps3_sys_manager_halt ();/* never returns */ +} +static void ps3_panic (char *str) {DBG ("%s:%d %s\n" , __func__, __LINE__, str);
@@ -105,7 +113,8 @@ static void ps3_panic(char *str)printk (" Please press POWER button.\n" );printk ("\n" ); -while (1 ); +while (1 ) +lv1_pause (1 ); } #if defined(CONFIG_FB_PS3) || defined(CONFIG_FB_PS3_MODULE) || \
@@ -266,6 +275,7 @@ define_machine(ps3) { .progress = ps3_progress, .restart = ps3_restart, .power_off = ps3_power_off, + .halt = ps3_halt,#if defined(CONFIG_KEXEC ) .kexec_cpu_down = ps3_kexec_cpu_down, .machine_kexec = default_machine_kexec,
drivers/ps3/ps3-sys-manager.c +20 -10
@@ -24,6 +24,7 @@#include <linux/reboot.h> #include <asm/firmware.h> +#include <asm/lv1call.h> #include <asm/ps3.h> #include "vuart.h"
@@ -581,6 +582,23 @@ fail_id:return -EIO ; } +static void ps3_sys_manager_fin (struct ps3_system_bus_device *dev) +{ +ps3_sys_manager_send_request_shutdown (dev); + +pr_emerg ("System Halted, OK to turn off power\n" ); + +while (ps3_sys_manager_handle_msg (dev)) { +/* pause until next DEC interrupt */ +lv1_pause (0 ); + } + +while (1 ) { +/* pause, ignoring DEC interrupt */ +lv1_pause (1 ); + } +} +/** * ps3_sys_manager_final_power_off - The final platform machine_power_off routine. *
@@ -602,12 +620,8 @@ static void ps3_sys_manager_final_power_ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_SHUTDOWN ,PS3_SM_WAKE_DEFAULT ); -ps3_sys_manager_send_request_shutdown (dev); - -pr_emerg ("System Halted, OK to turn off power\n" ); -while (1 ) -ps3_sys_manager_handle_msg (dev); +ps3_sys_manager_fin (dev); }/**
@@ -639,12 +653,8 @@ static void ps3_sys_manager_final_restarps3_sys_manager_send_attr (dev,0 );ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_REBOOT ,PS3_SM_WAKE_DEFAULT ); -ps3_sys_manager_send_request_shutdown (dev); - -pr_emerg ("System Halted, OK to turn off power\n" ); -while (1 ) -ps3_sys_manager_handle_msg (dev); +ps3_sys_manager_fin (dev); }/**
drivers/ps3/sys-manager-core.c +10 -6
@@ -19,6 +19,7 @@*/ #include <linux/kernel.h> +#include <asm/lv1call.h> #include <asm/ps3.h> /**
@@ -50,10 +51,7 @@ void ps3_sys_manager_power_off(void)if (ps3_sys_manager_ops.power_off) ps3_sys_manager_ops.power_off (ps3_sys_manager_ops.dev); -printk (KERN_EMERG "System Halted, OK to turn off power\n" ); -local_irq_disable (); -while (1 ) - (void )0 ; +ps3_sys_manager_halt (); }void ps3_sys_manager_restart (void )
@@ -61,8 +59,14 @@ void ps3_sys_manager_restart(void)if (ps3_sys_manager_ops.restart) ps3_sys_manager_ops.restart (ps3_sys_manager_ops.dev); -printk (KERN_EMERG "System Halted, OK to turn off power\n" ); +ps3_sys_manager_halt (); +} + +void ps3_sys_manager_halt (void ) +{ +pr_emerg ("System Halted, OK to turn off power\n" );local_irq_disable ();while (1 ) - (void )0 ; +lv1_pause (1 ); } +
include/asm-powerpc/ps3.h +3 -2
@@ -434,8 +434,9 @@ struct ps3_sys_manager_ops { };void ps3_sys_manager_register_ops (const struct ps3_sys_manager_ops *ops); -void ps3_sys_manager_power_off (void ); -void ps3_sys_manager_restart (void ); +void __noreturn ps3_sys_manager_power_off (void ); +void __noreturn ps3_sys_manager_restart (void ); +void __noreturn ps3_sys_manager_halt (void );struct ps3_prealloc {const char *name;
PATCH 5/6 PS3: Sys-manager Wake-on-LAN support
In reply to a message not in the archiveAdd Wake-on-LAN support to the PS3 system-manager. Other OS WOL support was introduced in PS3 system firmware 2.20.
--- drivers/ps3/ps3-sys-manager.c | 46 ++++++++++++++++++++++++++++++++++++++++-- include/asm-powerpc/ps3.h | 2 + 2 files changed, 46 insertions(+), 2 deletions(-)
drivers/ps3/ps3-sys-manager.c +44 -2
@@ -188,6 +188,7 @@ enum ps3_sys_manager_next_op {* controller, and bluetooth controller. * @PS3_SM_WAKE_RTC: * @PS3_SM_WAKE_RTC_ERROR: +* @PS3_SM_WAKE_W_O_L: Ether or wireless LAN. * @PS3_SM_WAKE_P_O_R: Power on reset. * * Additional wakeup sources when specifying PS3_SM_NEXT_OP_SYS_SHUTDOWN.
@@ -201,10 +202,19 @@ enum ps3_sys_manager_wake_source {PS3_SM_WAKE_DEFAULT =0 ,PS3_SM_WAKE_RTC =0x00000040 ,PS3_SM_WAKE_RTC_ERROR =0x00000080 , +PS3_SM_WAKE_W_O_L =0x00000400 , PS3_SM_WAKE_P_O_R = 0x80000000, };/** +* user_wake_sources - User specified wakeup sources. +* +* Logical OR of enum ps3_sys_manager_wake_source types. +*/ + +static u32 user_wake_sources =PS3_SM_WAKE_DEFAULT ; + +/** * enum ps3_sys_manager_cmd - Command from system manager to guest. * * The guest completes the actions needed, then acks or naks the command via
@@ -619,7 +629,7 @@ static void ps3_sys_manager_final_power_ps3_vuart_cancel_async (dev);ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_SHUTDOWN , -PS3_SM_WAKE_DEFAULT ); + user_wake_sources);ps3_sys_manager_fin (dev); }
@@ -652,12 +662,44 @@ static void ps3_sys_manager_final_restarps3_sys_manager_send_attr (dev,0 );ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_REBOOT , -PS3_SM_WAKE_DEFAULT ); + user_wake_sources);ps3_sys_manager_fin (dev); }/** +* ps3_sys_manager_get_wol - Get wake-on-lan setting. +*/ + +int ps3_sys_manager_get_wol (void ) +{ +pr_debug ("%s:%d\n" , __func__, __LINE__); + +return (user_wake_sources &PS3_SM_WAKE_W_O_L ) !=0 ; +} +EXPORT_SYMBOL_GPL (ps3_sys_manager_get_wol); + +/** +* ps3_sys_manager_set_wol - Set wake-on-lan setting. +*/ + +void ps3_sys_manager_set_wol (int state) +{ +static DEFINE_MUTEX (mutex); + +mutex_lock (&mutex); + +pr_debug ("%s:%d: %d\n" , __func__, __LINE__, state); + +if (state) + user_wake_sources |=PS3_SM_WAKE_W_O_L ; +else + user_wake_sources &= ~PS3_SM_WAKE_W_O_L ; +mutex_unlock (&mutex); +} +EXPORT_SYMBOL_GPL (ps3_sys_manager_set_wol); + +/** * ps3_sys_manager_work - Asynchronous read handler. * * Signaled when PS3_SM_RX_MSG_LEN_MIN bytes arrive at the vuart port.
include/asm-powerpc/ps3.h +2 -0
@@ -437,6 +437,8 @@ void ps3_sys_manager_register_ops(constvoid __noreturn ps3_sys_manager_power_off (void );void __noreturn ps3_sys_manager_restart (void );void __noreturn ps3_sys_manager_halt (void ); +int ps3_sys_manager_get_wol (void ); +void ps3_sys_manager_set_wol (int state);struct ps3_prealloc {const char *name;
Re: [patch 5/6] PS3: Sys-manager Wake-on-LAN support
Quoted 2 lines · Geoff Levand
Add Wake-on-LAN support to the PS3 system-manager. Other OS WOL support was introduced in PS3 system firmware 2.20.
There is no sleep in the first place tho :-) Or does this power it up / boot it using WoL packets ?
Cheers,
Ben.
Quoted 103 lines
Signed-off-by Geoff Levand <[email protected]>--- drivers/ps3/ps3-sys-manager.c | 46 ++++++++++++++++++++++++++++++++++++++++-- include/asm-powerpc/ps3.h | 2 + 2 files changed, 46 insertions(+), 2 deletions(-)drivers/ps3/ps3-sys-manager.c +44
-2@@ -188,6 +188,7 @@ enum ps3_sys_manager_next_op {* controller, and bluetooth controller. * @PS3_SM_WAKE_RTC: * @PS3_SM_WAKE_RTC_ERROR: +* @PS3_SM_WAKE_W_O_L: Ether or wireless LAN. * @PS3_SM_WAKE_P_O_R: Power on reset. * * Additional wakeup sources when specifying PS3_SM_NEXT_OP_SYS_SHUTDOWN. @@ -201,10 +202,19 @@ enum ps3_sys_manager_wake_source {PS3_SM_WAKE_DEFAULT =0 ,PS3_SM_WAKE_RTC =0x00000040 ,PS3_SM_WAKE_RTC_ERROR =0x00000080 , +PS3_SM_WAKE_W_O_L =0x00000400 , PS3_SM_WAKE_P_O_R = 0x80000000, };/** +* user_wake_sources - User specified wakeup sources. +* +* Logical OR of enum ps3_sys_manager_wake_source types. +*/ + +static u32 user_wake_sources =PS3_SM_WAKE_DEFAULT ; + +/** * enum ps3_sys_manager_cmd - Command from system manager to guest. * * The guest completes the actions needed, then acks or naks the command via @@ -619,7 +629,7 @@ static void ps3_sys_manager_final_power_ps3_vuart_cancel_async (dev);ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_SHUTDOWN , -PS3_SM_WAKE_DEFAULT ); + user_wake_sources);ps3_sys_manager_fin (dev); }@@ -652,12 +662,44 @@ static void ps3_sys_manager_final_restarps3_sys_manager_send_attr (dev,0 );ps3_sys_manager_send_next_op (dev,PS3_SM_NEXT_OP_SYS_REBOOT , -PS3_SM_WAKE_DEFAULT ); + user_wake_sources);ps3_sys_manager_fin (dev); }/** +* ps3_sys_manager_get_wol - Get wake-on-lan setting. +*/ + +int ps3_sys_manager_get_wol (void ) +{ +pr_debug ("%s:%d\n" , __func__, __LINE__); + +return (user_wake_sources &PS3_SM_WAKE_W_O_L ) !=0 ; +} +EXPORT_SYMBOL_GPL (ps3_sys_manager_get_wol); + +/** +* ps3_sys_manager_set_wol - Set wake-on-lan setting. +*/ + +void ps3_sys_manager_set_wol (int state) +{ +static DEFINE_MUTEX (mutex); + +mutex_lock (&mutex); + +pr_debug ("%s:%d: %d\n" , __func__, __LINE__, state); + +if (state) + user_wake_sources |=PS3_SM_WAKE_W_O_L ; +else + user_wake_sources &= ~PS3_SM_WAKE_W_O_L ; +mutex_unlock (&mutex); +} +EXPORT_SYMBOL_GPL (ps3_sys_manager_set_wol); + +/** * ps3_sys_manager_work - Asynchronous read handler. * * Signaled when PS3_SM_RX_MSG_LEN_MIN bytes arrive at the vuart port. include/asm-powerpc/ps3.h +2
-0@@ -437,6 +437,8 @@ void ps3_sys_manager_register_ops(constvoid __noreturn ps3_sys_manager_power_off (void );void __noreturn ps3_sys_manager_restart (void );void __noreturn ps3_sys_manager_halt (void ); +int ps3_sys_manager_get_wol (void ); +void ps3_sys_manager_set_wol (int state);struct ps3_prealloc {const char *name;
Re: [patch 5/6] PS3: Sys-manager Wake-on-LAN support
Hi,
Quoted 6 lines · Benjamin Herrenschmidt
Quoted 2 lines · Geoff Levand
Add Wake-on-LAN support to the PS3 system-manager. Other OS WOL support was introduced in PS3 system firmware 2.20.
There is no sleep in the first place tho :-) Or does this power it up / boot it using WoL packets ?
Whenever that red light in ON in the front, the system is in 'stand by' mode. If you setup WOL before entering standby mode (by using linux poweroff command, pressing the power button, etc.), you can wake it up:
On ps3
# ethtool -s eth0 wol g # shutdown -h now
by remote host (eth1 is connected to the subnet which PS3 resides in)
# etherwake -i eth1 aa:bb:cc:dd:ee:ff
I plan to send out a how-to to the ceb-oss-dev ML in the next day or so.
-Geoff
PATCH 6/6 PS3: Gelic network driver Wake-on-LAN support
In reply to a message not in the archiveFrom: Masakazu Mokuno <[email protected]>
Add Wake-on-LAN support to the PS3 Gelic network driver. Other OS WOL support was introduced in PS3 system firmware 2.20.
--- drivers/net/ps3_gelic_net.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ drivers/net/ps3_gelic_net.h | 20 ++++++++++ 2 files changed, 101 insertions(+)
drivers/net/ps3_gelic_net.c +81 -0
@@ -1266,6 +1266,85 @@ int gelic_net_set_rx_csum(struct net_devreturn 0 ; } +static void gelic_net_get_wol (struct net_device *netdev, +struct ethtool_wolinfo *wol) +{ +if (0 <=ps3_compare_firmware_version (2 ,2 ,0 )) + wol->supported =WAKE_MAGIC ; +else + wol->supported =0 ; + + wol->wolopts =ps3_sys_manager_get_wol () ? wol->supported :0 ; +memset (&wol->sopass,0 ,sizeof (wol->sopass)); +} +static int gelic_net_set_wol (struct net_device *netdev, +struct ethtool_wolinfo *wol) +{ +int status; +struct gelic_card *card; +u64 v1, v2; + +if (ps3_compare_firmware_version (2 ,2 ,0 ) <0 || + !capable (CAP_NET_ADMIN )) +return -EPERM ; + +if (wol->wolopts & ~WAKE_MAGIC ) +return -EINVAL ; + + card =netdev_card (netdev); +if (wol->wolopts &WAKE_MAGIC ) { + status =lv1_net_control (bus_id (card),dev_id (card), +GELIC_LV1_SET_WOL , +GELIC_LV1_WOL_MAGIC_PACKET , +0 ,GELIC_LV1_WOL_MP_ENABLE , + &v1, &v2); +if (status) { +pr_info ("%s: enabling WOL failed %d\n" , __func__, + status); + status = -EIO ; + goto done; + } + status =lv1_net_control (bus_id (card),dev_id (card), +GELIC_LV1_SET_WOL , +GELIC_LV1_WOL_ADD_MATCH_ADDR , +0 ,GELIC_LV1_WOL_MATCH_ALL , + &v1, &v2); +if (!status) +ps3_sys_manager_set_wol (1 ); +else { +pr_info ("%s: enabling WOL filter failed %d\n" , + __func__, status); + status = -EIO ; + } + }else { + status =lv1_net_control (bus_id (card),dev_id (card), +GELIC_LV1_SET_WOL , +GELIC_LV1_WOL_MAGIC_PACKET , +0 ,GELIC_LV1_WOL_MP_DISABLE , + &v1, &v2); +if (status) { +pr_info ("%s: disabling WOL failed %d\n" , __func__, + status); + status = -EIO ; + goto done; + } + status =lv1_net_control (bus_id (card),dev_id (card), +GELIC_LV1_SET_WOL , +GELIC_LV1_WOL_DELETE_MATCH_ADDR , +0 ,GELIC_LV1_WOL_MATCH_ALL , + &v1, &v2); +if (!status) +ps3_sys_manager_set_wol (0 ); +else { +pr_info ("%s: removing WOL filter failed %d\n" , + __func__, status); + status = -EIO ; + } + } +done: +return status; +} +static struct ethtool_ops gelic_ether_ethtool_ops = { .get_drvinfo = gelic_net_get_drvinfo, .get_settings = gelic_ether_get_settings,
@@ -1274,6 +1353,8 @@ static struct ethtool_ops gelic_ether_et .set_tx_csum = ethtool_op_set_tx_csum, .get_rx_csum = gelic_net_get_rx_csum, .set_rx_csum = gelic_net_set_rx_csum, + .get_wol = gelic_net_get_wol, + .set_wol = gelic_net_set_wol, };/**
drivers/net/ps3_gelic_net.h +20 -0
@@ -182,12 +182,32 @@ enum gelic_lv1_net_control_code {GELIC_LV1_GET_ETH_PORT_STATUS =2 ,GELIC_LV1_SET_NEGOTIATION_MODE =3 ,GELIC_LV1_GET_VLAN_ID =4 , +GELIC_LV1_SET_WOL =5 ,GELIC_LV1_GET_CHANNEL =6 ,GELIC_LV1_POST_WLAN_CMD =9 ,GELIC_LV1_GET_WLAN_CMD_RESULT =10 ,GELIC_LV1_GET_WLAN_EVENT =11 }; +/* for GELIC_LV1_SET_WOL */ +enum gelic_lv1_wol_command { +GELIC_LV1_WOL_MAGIC_PACKET =1 , +GELIC_LV1_WOL_ADD_MATCH_ADDR =6 , +GELIC_LV1_WOL_DELETE_MATCH_ADDR =7 , +}; + +/* for GELIC_LV1_WOL_MAGIC_PACKET */ +enum gelic_lv1_wol_mp_arg { +GELIC_LV1_WOL_MP_DISABLE =0 , +GELIC_LV1_WOL_MP_ENABLE =1 , +}; + +/* for GELIC_LV1_WOL_{ADD,DELETE}_MATCH_ADDR */ +enum gelic_lv1_wol_match_arg { +GELIC_LV1_WOL_MATCH_INDIVIDUAL =0 , +GELIC_LV1_WOL_MATCH_ALL =1 , +}; +/* status returened from GET_ETH_PORT_STATUS */ enum gelic_lv1_ether_port_status { GELIC_LV1_ETHER_LINK_UP = 0x0000000000000001L,
Re: [patch 6/6] PS3: Gelic network driver Wake-on-LAN support
Quoted 6 lines · Geoff Levand
From: Masakazu Mokuno <[email protected]>
Add Wake-on-LAN support to the PS3 Gelic network driver. Other OS WOL support was introduced in PS3 system firmware 2.20.
Quoted 6 lines
Signed-off-by Masakazu Mokuno <[email protected]>Signed-off-by Geoff Levand <[email protected]>--- drivers/net/ps3_gelic_net.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ drivers/net/ps3_gelic_net.h | 20 ++++++++++ 2 files changed, 101 insertions(+)
ACK