PS3 logical performance monitor patches for 2.6.25
Subsystems (2)
cover PS3 logical performance monitor patches for 2.6.25
Paul,
This is a small set of patches that adds support for the PS3's logical performance monitor.
The logical performance monitor is a hypervisor abstraction that provides access to the Cell processor's performance monitoring features needed by profilers such as oprofile and perfmon.
Please apply for 2.6.25.
[1/3] PS3: Add logical performance monitor repository routines [2/3] PS3: Add logical performance monitor device support [3/3] PS3: Add logical performance monitor driver support
-Geoff
PATCH v2 2/4 PS3: Add logical performance monitor repository routines
From: Takashi Yamamoto <[email protected]>
Add repository routines for the PS3 Logical Performance Monitor (lpm).
---
v2: correct Yamamoto-san's mail addr.
arch/powerpc/platforms/ps3/platform.h | 7 ++++ arch/powerpc/platforms/ps3/repository.c | 48 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-)
arch/powerpc/platforms/ps3/platform.h +6 -1
@@ -189,7 +189,7 @@ int ps3_repository_read_stor_dev_region(/* repository pu and memory info */ int ps3_repository_read_num_pu (unsigned int *num_pu); -int ps3_repository_read_ppe_id (unsigned int *pu_index,unsigned int *ppe_id); +int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id);int ps3_repository_read_rm_base (unsigned int ppe_id,u64 *rm_base);int ps3_repository_read_rm_size (unsigned int ppe_id,u64 *rm_size);int ps3_repository_read_region_total (u64 *region_total);
@@ -203,6 +203,11 @@ int ps3_repository_read_be_node_id(unsigint ps3_repository_read_tb_freq (u64 node_id,u64 *tb_freq);int ps3_repository_read_be_tb_freq (unsigned int be_index,u64 *tb_freq); +/* repository performance monitor info */ + +int ps3_repository_read_lpm_privileges (unsigned int be_index,u64 *lpar, +u64 *rights); +/* repository 'Other OS' area */ int ps3_repository_read_boot_dat_addr (u64 *lpar_addr);
arch/powerpc/platforms/ps3/repository.c +48 -0
54 lines not on this page · raw message
Re: [patch 2/4 v2] PS3: Add logical performance monitor repository routines
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 934
Quoted 13 lines · On Tue, 08 Jan 2008 22:35:36 -0800 Geoff Levand <[email protected]>…
arch/powerpc/platforms/ps3/repository.c +12
-0+int ps3_repository_read_num_pu (unsigned int *num_pu) +{ +int result; +u64 v1; + + v1 =0 ; + result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pun" ,0 ), +0 ,0 , + &v1,NULL ); + *num_pu = v1;
Why not just pass "num_pu" instead of &v1 to read_node()?
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 949
Quoted 12 lines
arch/powerpc/platforms/ps3/repository.c +12
-0+int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id) +{ +int result; +u64 v1; + + v1 =0 ; + result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pu" , pu_index), +0 ,0 , + &v1,NULL ); + *pu_id = v1;
Similarly with "pu_id"?
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
Re: [patch 2/4 v2] PS3: Add logical performance monitor repository routines
Quoted 16 lines · Stephen Rothwell
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 934
Quoted 13 lines · On Tue, 08 Jan 2008 22:35:36 -0800 Geoff Levand <[email protected]>…
arch/powerpc/platforms/ps3/repository.c +12
-0+int ps3_repository_read_num_pu (unsigned int *num_pu) +{ +int result; +u64 v1; + + v1 =0 ; + result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pun" ,0 ), +0 ,0 , + &v1,NULL ); + *num_pu = v1;Why not just pass "
num_pu" instead of &v1 toread_node()?
We need a temporary because num_pu and v1 differ in size. The alternative is to make num_pu u64.
Quoted 6 lines
Quoted 6 lines
arch/powerpc/platforms/ps3/repository.c +6
-0+int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id) +{ +int result; +u64 v1; + + v1 =0 ;
Quoted 8 lines
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 949
Quoted 6 lines
arch/powerpc/platforms/ps3/repository.c +6
-0+ result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pu" , pu_index), +0 ,0 , + &v1,NULL ); + *pu_id = v1;Similarly with "
pu_id"?
Yep, here we don't need the temporary.
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
Re: [patch 2/4 v2] PS3: Add logical performance monitor repository routines
Quoted 19 lines · On Wed, 9 Jan 2008 11:01:38 +0100 (CET) Geert Uytterhoeven…
Quoted 16 lines · Stephen Rothwell
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 934
Quoted 13 lines · On Tue, 08 Jan 2008 22:35:36 -0800 Geoff Levand <[email protected]>…
arch/powerpc/platforms/ps3/repository.c +12
-0+int ps3_repository_read_num_pu (unsigned int *num_pu) +{ +int result; +u64 v1; + + v1 =0 ; + result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pun" ,0 ), +0 ,0 , + &v1,NULL ); + *num_pu = v1;Why not just pass "
num_pu" instead of &v1 toread_node()?
Quoted 2 lines
We need a temporary because
num_puand v1 differ in size. The alternative is to makenum_puu64.
Ooops, sorry. I read the second one first and didn't look hard enough when I came back to this one.
Quoted 15 lines
Quoted 6 lines
Quoted 6 lines
arch/powerpc/platforms/ps3/repository.c +6
-0+int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id) +{ +int result; +u64 v1; + + v1 =0 ;Quoted 8 lines
arch/powerpc/platforms/ps3/repository.c int ps3_repository_read_be_tb_freq(unsig · line 949
Quoted 6 lines
arch/powerpc/platforms/ps3/repository.c +6
-0+ result =read_node (PS3_LPAR_ID_CURRENT , +make_first_field ("bi" ,0 ), +make_field ("pu" , pu_index), +0 ,0 , + &v1,NULL ); + *pu_id = v1;Similarly with "
pu_id"?
Quoted 1 line
Yep, here we don't need the temporary.
Which, of course means that the "result" temporary isn't needed either.
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
PATCH v3 2/4 PS3: Add logical performance monitor repository routines
In reply to Geoff LevandFrom: Takashi Yamamoto <[email protected]>
Add repository routines for the PS3 logical performance monitor.
---
v2: o Correct Yamamoto-san's mail addr.
v3: o Change num_pu and pu_id to type u64.
o Add comments to describe some symbol names.
arch/powerpc/platforms/ps3/platform.h | 12 +++-- arch/powerpc/platforms/ps3/repository.c | 75 +++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-)
arch/powerpc/platforms/ps3/platform.h +9 -3
@@ -186,10 +186,10 @@ int ps3_repository_read_stor_dev_region( unsigned int dev_index, unsigned int region_index, unsigned int *region_id, u64 *region_start, u64 *region_size); -/* repository pu and memory info */ +/* repository logical pu and memory info */ -int ps3_repository_read_num_pu (unsigned int *num_pu); -int ps3_repository_read_ppe_id (unsigned int *pu_index,unsigned int *ppe_id); +int ps3_repository_read_num_pu (u64 *num_pu); +int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id);int ps3_repository_read_rm_base (unsigned int ppe_id,u64 *rm_base);int ps3_repository_read_rm_size (unsigned int ppe_id,u64 *rm_size);int ps3_repository_read_region_total (u64 *region_total);
@@ -200,9 +200,15 @@ int ps3_repository_read_mm_info(u64 *rm_int ps3_repository_read_num_be (unsigned int *num_be);int ps3_repository_read_be_node_id (unsigned int be_index,u64 *node_id); +int ps3_repository_read_be_id (u64 node_id,u64 *be_id);int ps3_repository_read_tb_freq (u64 node_id,u64 *tb_freq);int ps3_repository_read_be_tb_freq (unsigned int be_index,u64 *tb_freq); +/* repository performance monitor info */ + +int ps3_repository_read_lpm_privileges (unsigned int be_index,u64 *lpar, +u64 *rights); +/* repository 'Other OS' area */ int ps3_repository_read_boot_dat_addr (u64 *lpar_addr);
arch/powerpc/platforms/ps3/repository.c +74 -1
109 lines not on this page · raw message
PATCH 1/4 POWERPC: Add Cell SPRN bookmark register
In reply to Geoff LevandAdd a definition for the Cell SPRN bookmark register to asm-powerpc/regs.h
---
Needed for PS3's lpm driver.
include/asm-powerpc/reg.h | 1 + 1 file changed, 1 insertion(+)
include/asm-powerpc/reg.h +1 -0
@@ -553,6 +553,7 @@#define SPRN_PA6T_BTCR 978/* Breakpoint and Tagging Control Register */ #define SPRN_PA6T_IMAAT 979/* Instruction Match Array Action Table */ #define SPRN_PA6T_PCCR 1019/* Power Counter Control Register */ +#define SPRN_BKMK 1020/* Cell Bookmark Register */ #define SPRN_PA6T_RPCCR 1021/* Retire PC Trace Control Register */
Re: [patch 1/4] POWERPC: Add Cell SPRN bookmark register
Quoted 4 lines · Geoff Levand
Add a definition for the Cell SPRN bookmark register to
asm-powerpc/regs.hSigned-off-by Geoff Levand <[email protected]>
PATCH v2 3/4 PS3: Add logical performance monitor device support
In reply to Geoff LevandAdd PS3 logical performance monitor device support to the PS3 system-bus and platform device registration routines.
---
v2: o Add enum ps3_lpm_tb_type.
o Remove redundant enclosing structure and return proper error codes from ps3_register_lpm_devices().
arch/powerpc/platforms/ps3/device-init.c | 91 +++++++++++++++++++++++++++++++ arch/powerpc/platforms/ps3/system-bus.c | 5 + include/asm-powerpc/ps3.h | 7 ++ 3 files changed, 103 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/lpm.c
arch/powerpc/platforms/ps3/device-init.c +91 -0
@@ -30,6 +30,95 @@#include "platform.h" +static int __init ps3_register_lpm_devices (void ) +{ +int result; +unsigned int pu_count; +u64 tmp1; +u64 tmp2; +struct ps3_system_bus_device *dev; + +pr_debug (" -> %s:%d\n" , __func__, __LINE__); + + dev =kzalloc (sizeof (*dev),GFP_KERNEL ); +if (!dev) +return -ENOMEM ; + + dev->match_id =PS3_MATCH_ID_LPM ; + dev->dev_type =PS3_DEVICE_TYPE_LPM ; + + result =ps3_repository_read_num_pu (&pu_count); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_num_pu failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + +/* The current lpm driver only supports a single BE processor. */ + +if (pu_count >1 ) { +pr_info ("%s:%d: found %u BE processors, only one supported\n" , + __func__, __LINE__, pu_count); + } + + result =ps3_repository_read_pu_id (0 , &dev->lpm.pu_id); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_pu_id failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + + result =ps3_repository_read_lpm_privileges (0 , &tmp1, + &dev->lpm.rights); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_lpm_privleges failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + +lv1_get_logical_partition_id (&tmp2); + +if (tmp1 != tmp2) { +pr_debug ("%s:%d: wrong lpar\n" , + __func__, __LINE__); + result = -ENODEV ; + goto fail_rights; + } + +if (!(dev->lpm.rights &PS3_LPM_RIGHTS_USE_LPM )) { +pr_debug ("%s:%d: don't have rights to use lpm\n" , + __func__, __LINE__); + result = -EPERM ; + goto fail_rights; + } + +pr_debug ("%s:%d: pu_id %lu, rights %lu(%lxh)\n" , + __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights, + dev->lpm.rights); + + result =ps3_system_bus_device_register (dev); + +if (result) { +pr_debug ("%s:%d ps3_system_bus_device_register failed\n" , + __func__, __LINE__); + goto fail_register; + } + +pr_debug (" <- %s:%d\n" , __func__, __LINE__); +return 0 ; + + +fail_register: +fail_rights: +fail_read_repo: +kfree (dev); +pr_debug (" <- %s:%d: failed\n" , __func__, __LINE__); +return result; +} +/** * ps3_setup_gelic_device - Setup and register a gelic device instance. *
@@ -787,6 +876,8 @@ static int __init ps3_register_devices(vps3_register_sound_devices (); +ps3_register_lpm_devices (); +pr_debug (" <- %s:%d\n" , __func__, __LINE__);return 0 ; }
arch/powerpc/platforms/ps3/system-bus.c +5 -0
@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(strucstatic unsigned int dev_ioc0_count;static unsigned int dev_sb_count;static unsigned int dev_vuart_count; +static unsigned int dev_lpm_count;if (!dev->core.parent) dev->core.parent = &ps3_system_bus;
@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(strucsnprintf (dev->core.bus_id,sizeof (dev->core.bus_id),"vuart_%02x" , ++dev_vuart_count);break ; +case PS3_DEVICE_TYPE_LPM : +snprintf (dev->core.bus_id,sizeof (dev->core.bus_id), +"lpm_%02x" , ++dev_lpm_count); +break ;default :BUG (); };
include/asm-powerpc/ps3.h +7 -0
@@ -317,6 +317,7 @@ enum ps3_match_id {PS3_MATCH_ID_STOR_FLASH =8 ,PS3_MATCH_ID_SOUND =9 ,PS3_MATCH_ID_GRAPHICS =10 , + PS3_MATCH_ID_LPM = 11, };#define PS3_MODULE_ALIAS_EHCI "ps3:1"
@@ -329,11 +330,13 @@ enum ps3_match_id {#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"#define PS3_MODULE_ALIAS_SOUND "ps3:9"#define PS3_MODULE_ALIAS_GRAPHICS "ps3:10" +#define PS3_MODULE_ALIAS_LPM "ps3:11"enum ps3_system_bus_device_type {PS3_DEVICE_TYPE_IOC0 =1 ,PS3_DEVICE_TYPE_SB ,PS3_DEVICE_TYPE_VUART , +PS3_DEVICE_TYPE_LPM , };/**
@@ -350,6 +353,10 @@ struct ps3_system_bus_device {struct ps3_dma_region *d_region;/* SB, IOC0 */ struct ps3_mmio_region *m_region;/* SB, IOC0*/ unsigned int port_number;/* VUART */ +struct {/* LPM */ +u64 pu_id; +u64 rights; + } lpm;/* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */ struct device core;
PATCH v3 3/4 PS3: Add logical performance monitor device support
Add PS3 logical performance monitor device support to the PS3 system-bus and platform device registration routines.
---
v2: o Add enum ps3_lpm_tb_type.
o Remove redundant enclosing structure and return proper error codes from ps3_register_lpm_devices().
v3: o Add lpm.node_id to struct ps3_system_bus_device.
o Cleanup repository discovery logic.
arch/powerpc/platforms/ps3/device-init.c | 85 +++++++++++++++++++++++++++++++ arch/powerpc/platforms/ps3/system-bus.c | 5 + include/asm-powerpc/ps3.h | 8 ++ 3 files changed, 98 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/lpm.c
arch/powerpc/platforms/ps3/device-init.c +85 -0
@@ -30,6 +30,89 @@#include "platform.h" +static int __init ps3_register_lpm_devices (void ) +{ +int result; +u64 tmp1; +u64 tmp2; +struct ps3_system_bus_device *dev; + +pr_debug (" -> %s:%d\n" , __func__, __LINE__); + + dev =kzalloc (sizeof (*dev),GFP_KERNEL ); +if (!dev) +return -ENOMEM ; + + dev->match_id =PS3_MATCH_ID_LPM ; + dev->dev_type =PS3_DEVICE_TYPE_LPM ; + +/* The current lpm driver only supports a single BE processor. */ + + result =ps3_repository_read_be_node_id (0 , &dev->lpm.node_id); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_be_node_id failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + + result =ps3_repository_read_lpm_privileges (dev->lpm.node_id, &tmp1, + &dev->lpm.rights); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_lpm_privleges failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + +lv1_get_logical_partition_id (&tmp2); + +if (tmp1 != tmp2) { +pr_debug ("%s:%d: wrong lpar\n" , + __func__, __LINE__); + result = -ENODEV ; + goto fail_rights; + } + +if (!(dev->lpm.rights &PS3_LPM_RIGHTS_USE_LPM )) { +pr_debug ("%s:%d: don't have rights to use lpm\n" , + __func__, __LINE__); + result = -EPERM ; + goto fail_rights; + } + +pr_debug ("%s:%d: pu_id %lu, rights %lu(%lxh)\n" , + __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights, + dev->lpm.rights); + + result =ps3_repository_read_pu_id (0 , &dev->lpm.pu_id); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_pu_id failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + + result =ps3_system_bus_device_register (dev); + +if (result) { +pr_debug ("%s:%d ps3_system_bus_device_register failed\n" , + __func__, __LINE__); + goto fail_register; + } + +pr_debug (" <- %s:%d\n" , __func__, __LINE__); +return 0 ; + + +fail_register: +fail_rights: +fail_read_repo: +kfree (dev); +pr_debug (" <- %s:%d: failed\n" , __func__, __LINE__); +return result; +} +/** * ps3_setup_gelic_device - Setup and register a gelic device instance. *
@@ -787,6 +870,8 @@ static int __init ps3_register_devices(vps3_register_sound_devices (); +ps3_register_lpm_devices (); +pr_debug (" <- %s:%d\n" , __func__, __LINE__);return 0 ; }
arch/powerpc/platforms/ps3/system-bus.c +5 -0
@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(strucstatic unsigned int dev_ioc0_count;static unsigned int dev_sb_count;static unsigned int dev_vuart_count; +static unsigned int dev_lpm_count;if (!dev->core.parent) dev->core.parent = &ps3_system_bus;
@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(strucsnprintf (dev->core.bus_id,sizeof (dev->core.bus_id),"vuart_%02x" , ++dev_vuart_count);break ; +case PS3_DEVICE_TYPE_LPM : +snprintf (dev->core.bus_id,sizeof (dev->core.bus_id), +"lpm_%02x" , ++dev_lpm_count); +break ;default :BUG (); };
include/asm-powerpc/ps3.h +8 -0
@@ -317,6 +317,7 @@ enum ps3_match_id {PS3_MATCH_ID_STOR_FLASH =8 ,PS3_MATCH_ID_SOUND =9 ,PS3_MATCH_ID_GRAPHICS =10 , + PS3_MATCH_ID_LPM = 11, };#define PS3_MODULE_ALIAS_EHCI "ps3:1"
@@ -329,11 +330,13 @@ enum ps3_match_id {#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"#define PS3_MODULE_ALIAS_SOUND "ps3:9"#define PS3_MODULE_ALIAS_GRAPHICS "ps3:10" +#define PS3_MODULE_ALIAS_LPM "ps3:11"enum ps3_system_bus_device_type {PS3_DEVICE_TYPE_IOC0 =1 ,PS3_DEVICE_TYPE_SB ,PS3_DEVICE_TYPE_VUART , +PS3_DEVICE_TYPE_LPM , };/**
@@ -350,6 +353,11 @@ struct ps3_system_bus_device {struct ps3_dma_region *d_region;/* SB, IOC0 */ struct ps3_mmio_region *m_region;/* SB, IOC0*/ unsigned int port_number;/* VUART */ +struct {/* LPM */ +u64 node_id; +u64 pu_id; +u64 rights; + } lpm;/* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */ struct device core;
PATCH v2 4/4 PS3: Add logical performance monitor driver support
In reply to Geoff LevandFrom: Takashi Yamamoto <[email protected]>
Add PS3 logical performance monitor (lpm) device driver.
The PS3's LV1 hypervisor provides a Logical Performance Monitor that abstarcts the Cell processor's performance monitor features for use by guest operating systems.
---
v2: o Correct Yamamoto-san's mail addr.
o Text cleanups.
o Added more comments explaining lpm operation.
o Split SRPN_BKMK into separate patch.
o Use get_hard_smp_processor_id() in ps3_get_hw_thread_id().
o Split ps3_copy_trace_buffer() into ps3_lpm_copy_tb() and ps3_lpm_copy_tb_to_user().
o Replace mutex with atomic_t in ps3_lpm_open()/ps3_lpm_close().
o General cleanup of ps3_lpm_open()/ps3_lpm_close().
arch/powerpc/platforms/ps3/Kconfig | 13 drivers/ps3/Makefile | 1 drivers/ps3/ps3-lpm.c | 1242 +++++++++++++++++++++++++++++++++++++ include/asm-powerpc/ps3.h | 62 + 4 files changed, 1318 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/ps3-lpm.c
arch/powerpc/platforms/ps3/Kconfig +13 -0
@@ -138,4 +138,17 @@ config PS3_FLASH be disabled on the kernel command line using "ps3flash=off", to not allocate this fixed buffer. +config PS3_LPM + tristate "PS3 Logical Performance Monitor support" + depends on PPC_PS3 + help + Include support for the PS3 Logical Performance Monitor. + + This support is required to use the logical performance monitor + of the PS3's LV1 hypervisor. + + If you intend to use the advanced performance monitoring and + profiling support of the Cell processor with programs like + oprofile and perfmon2, then say Y or M, otherwise say N. + endmenu
drivers/ps3/Makefile +1 -0
@@ -4,3 +4,4 @@ ps3av_mod-objs += ps3av.o ps3av_cmd.o obj-$(CONFIG_PPC_PS3) += sys-manager-core.o obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o +obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
drivers/ps3/ps3-lpm.c new file +1242 -0
1,242 lines not on this page · raw message
include/asm-powerpc/ps3.h +62 -0
73 lines not on this page · raw message
Re: [patch 4/4 v2] PS3: Add logical performance monitor driver support
drivers/ps3/ps3-lpm.c line 175
Quoted 5 lines · Geoff Levand
drivers/ps3/ps3-lpm.c new file +2
-0+/* +* As per the PPE book IV, to avoid bookmark lost there must
^^^^ loss?
drivers/ps3/ps3-lpm.c line 179
Quoted 4 lines
drivers/ps3/ps3-lpm.c new file +4
-0+* not be a traced branch within 10 cycles of setting the +* SPRN_BKMK register. The actual text is unclear if 'within' +* includes cycles before the call. +*/
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
RE: [patch 4/4 v2] PS3: Add logical performance monitor driver support
In reply to Geoff LevandHello,
I found a bug in our patch.
Quoted 38 lines
drivers/ps3/ps3-lpm.c new file +38
-0+/** +* ps3_lpm_open - Open the logical performance monitor device. +* @tb_type: Specifies the type of trace buffer lv1 sould use for this lpm +* instance, specified by one of enum ps3_lpm_tb_type. +* @tb_cache: Optional user supplied buffer to use as the trace buffer cache. +* If NULL, the driver will allocate and manage an internal buffer. +* Unused when when @tb_type is PS3_LPM_TB_TYPE_NONE. +* @tb_cache_size: The size in bytes of the user supplied @tb_cache buffer. +* Unused when @tb_cache is NULL or @tb_type is PS3_LPM_TB_TYPE_NONE. +*/ + +int ps3_lpm_open (enum ps3_lpm_tb_type tb_type,void *tb_cache, +u64 tb_cache_size) +{ +int result; +u64 tb_size; + +BUG_ON (!lpm_priv); +BUG_ON (tb_type !=PS3_LPM_TB_TYPE_NONE + && tb_type !=PS3_LPM_TB_TYPE_INTERNAL ); + +if (tb_type ==PS3_LPM_TB_TYPE_NONE && tb_cache) +dev_dbg (sbd_core (),"%s:%u: bad in vals\n" , __func__, __LINE__); + +if (!atomic_add_unless (&lpm_priv->open,1 ,1 )) { +dev_dbg (sbd_core (),"%s:%u: busy\n" , __func__, __LINE__); +return -EBUSY ; + } + +if (tb_type ==PS3_LPM_TB_TYPE_NONE ) { + lpm_priv->tb_cache_internal =NULL ; + lpm_priv->tb_cache_size =0 ; + lpm_priv->tb_cache =NULL ; + }else if (tb_cache) { +if (tb_cache != (void *)_ALIGN_UP ((unsigned long )tb_cache,128 ) + || tb_cache_size !=_ALIGN_UP (tb_cache_size,128 )) { +dev_err (sbd_core (),"%s:%u: unaligned tb_cache\n" , + __func__, __LINE__);
drivers/ps3/ps3-lpm.c line 1112
Quoted 10 lines
drivers/ps3/ps3-lpm.c new file +10
-0+ result = -EINVAL ; + goto fail_align; + } + lpm_priv->tb_cache_internal =NULL ; + lpm_priv->tb_cache_size = tb_cache_size; + lpm_priv->tb_cache = tb_cache; + }else { +/* tb_cache needs 128 byte alignment. */ + lpm_priv->tb_cache_size =PS3_LPM_DEFAULT_TB_CACHE_SIZE ; + lpm_priv->tb_cache_internal = kzalloc(tb_cache_size + 127,
The first parameter of kzalloc() is wrong.
lpm_priv->tb_cache_internal = kzalloc(lpm_priv->tb_cache_size + 127,
^^^^^^^^^^Quoted 34 lines
drivers/ps3/ps3-lpm.c new file +34
-0+ GFP_KERNEL); +if (!lpm_priv->tb_cache_internal) { +dev_err (sbd_core (),"%s:%u: alloc internal tb_cache " +"failed\n" , __func__, __LINE__); + result = -ENOMEM ; + goto fail_malloc; + } + lpm_priv->tb_cache = (void *)_ALIGN_UP ( + (unsigned long )lpm_priv->tb_cache_internal,128 ); + } + + result =lv1_construct_lpm (0 , tb_type,0 ,0 , +ps3_mm_phys_to_lpar (__pa (lpm_priv->tb_cache)), + lpm_priv->tb_cache_size, &lpm_priv->lpm_id, + &lpm_priv->outlet_id, &tb_size); + +if (result) { +dev_err (sbd_core (),"%s:%u: lv1_construct_lpm failed: %s\n" , + __func__, __LINE__,ps3_result (result)); + result = -EINVAL ; + goto fail_construct; + } + + lpm_priv->shadow.pm_control =PS3_LPM_SHADOW_REG_INIT ; + lpm_priv->shadow.pm_start_stop =PS3_LPM_SHADOW_REG_INIT ; + lpm_priv->shadow.pm_interval =PS3_LPM_SHADOW_REG_INIT ; + lpm_priv->shadow.group_control =PS3_LPM_SHADOW_REG_INIT ; + lpm_priv->shadow.debug_bus_control =PS3_LPM_SHADOW_REG_INIT ; + +dev_dbg (sbd_core (),"%s:%u: lpm_id 0x%lx, outlet_id 0x%lx, " +"tb_size 0x%lx\n" , __func__, __LINE__, lpm_priv->lpm_id, + lpm_priv->outlet_id, tb_size); + +return 0 ;
drivers/ps3/ps3-lpm.c line 1156
Quoted 10 lines
drivers/ps3/ps3-lpm.c new file +10
-0+ +fail_construct: +kfree (lpm_priv->tb_cache_internal); + lpm_priv->tb_cache_internal =NULL ; +fail_malloc: +fail_align: +atomic_dec (&lpm_priv->open); +return result; +} +EXPORT_SYMBOL_GPL (ps3_lpm_open);
Thanks.
Takashi Yamamoto.
PATCH v3 4/4 PS3: Add logical performance monitor driver support
In reply to Geoff LevandFrom: Takashi Yamamoto <[email protected]>
Add PS3 logical performance monitor (lpm) device driver.
The PS3's LV1 hypervisor provides a Logical Performance Monitor that abstracts the Cell processor's performance monitor features for use by guest operating systems.
---
v2: o Correct Yamamoto-san's mail addr.
o Text cleanups.
o Added more comments explaining lpm operation.
o Split SRPN_BKMK into separate patch.
o Use get_hard_smp_processor_id() in ps3_get_hw_thread_id().
o Split ps3_copy_trace_buffer() into ps3_lpm_copy_tb() and ps3_lpm_copy_tb_to_user().
o Replace mutex with atomic_t in ps3_lpm_open()/ps3_lpm_close().
o General cleanup of ps3_lpm_open()/ps3_lpm_close().
v3:
o Add BE node_id to struct lpm_priv.
o Change some dev_err() to dev_dbg().
o Fix kzalloc() bug.
o Text fix 'lost' -> 'loss'.
o Use lpm_priv->node_id with lv1_construct_lpm().
arch/powerpc/platforms/ps3/Kconfig | 13 drivers/ps3/Makefile | 1 drivers/ps3/ps3-lpm.c | 1248 +++++++++++++++++++++++++++++++++++++ include/asm-powerpc/ps3.h | 62 + 4 files changed, 1324 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/ps3-lpm.c
arch/powerpc/platforms/ps3/Kconfig +13 -0
@@ -138,4 +138,17 @@ config PS3_FLASH be disabled on the kernel command line using "ps3flash=off", to not allocate this fixed buffer. +config PS3_LPM + tristate "PS3 Logical Performance Monitor support" + depends on PPC_PS3 + help + Include support for the PS3 Logical Performance Monitor. + + This support is required to use the logical performance monitor + of the PS3's LV1 hypervisor. + + If you intend to use the advanced performance monitoring and + profiling support of the Cell processor with programs like + oprofile and perfmon2, then say Y or M, otherwise say N. + endmenu
drivers/ps3/Makefile +1 -0
@@ -4,3 +4,4 @@ ps3av_mod-objs += ps3av.o ps3av_cmd.o obj-$(CONFIG_PPC_PS3) += sys-manager-core.o obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o +obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
drivers/ps3/ps3-lpm.c new file +1248 -0
1,248 lines not on this page · raw message
include/asm-powerpc/ps3.h +62 -0
73 lines not on this page · raw message
Re: [patch 4/4 v3] PS3: Add logical performance monitor driver support
drivers/ps3/ps3-lpm.c
Quoted 4 lines · Geoff Levand
drivers/ps3/ps3-lpm.c new file +1
-0+* @node_id: The node id of a BE prosessor whos performance monitor this
^^^^ whose
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 v4 4/4 PS3: Add logical performance monitor driver support
In reply to Geoff LevandFrom: Takashi Yamamoto <[email protected]>
Add PS3 logical performance monitor (lpm) device driver.
The PS3's LV1 hypervisor provides a Logical Performance Monitor that abstracts the Cell processor's performance monitor features for use by guest operating systems.
---
v2: o Correct Yamamoto-san's mail addr.
o Text cleanups.
o Added more comments explaining lpm operation.
o Split SRPN_BKMK into separate patch.
o Use get_hard_smp_processor_id() in ps3_get_hw_thread_id().
o Split ps3_copy_trace_buffer() into ps3_lpm_copy_tb() and ps3_lpm_copy_tb_to_user().
o Replace mutex with atomic_t in ps3_lpm_open()/ps3_lpm_close().
o General cleanup of ps3_lpm_open()/ps3_lpm_close().
v3: o Add BE node_id to struct lpm_priv.
o Change some dev_err() to dev_dbg().
o Fix kzalloc() bug.
o Text fix s/lost/loss/.
o Use lpm_priv->node_id with lv1_construct_lpm().
v4: o Text fix s/whos/whose/.
arch/powerpc/platforms/ps3/Kconfig | 13 drivers/ps3/Makefile | 1 drivers/ps3/ps3-lpm.c | 1248 +++++++++++++++++++++++++++++++++++++ include/asm-powerpc/ps3.h | 62 + 4 files changed, 1324 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/ps3-lpm.c
arch/powerpc/platforms/ps3/Kconfig +13 -0
@@ -138,4 +138,17 @@ config PS3_FLASH be disabled on the kernel command line using "ps3flash=off", to not allocate this fixed buffer. +config PS3_LPM + tristate "PS3 Logical Performance Monitor support" + depends on PPC_PS3 + help + Include support for the PS3 Logical Performance Monitor. + + This support is required to use the logical performance monitor + of the PS3's LV1 hypervisor. + + If you intend to use the advanced performance monitoring and + profiling support of the Cell processor with programs like + oprofile and perfmon2, then say Y or M, otherwise say N. + endmenu
drivers/ps3/Makefile +1 -0
@@ -4,3 +4,4 @@ ps3av_mod-objs += ps3av.o ps3av_cmd.o obj-$(CONFIG_PPC_PS3) += sys-manager-core.o obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o +obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
drivers/ps3/ps3-lpm.c new file +1248 -0
1,248 lines not on this page · raw message
include/asm-powerpc/ps3.h +62 -0
73 lines not on this page · raw message