Commit ed757002 authored by Geoff Levand's avatar Geoff Levand Committed by Paul Mackerras

[POWERPC] PS3: Add logical performance monitor device support

Add PS3 logical performance monitor device support to the
PS3 system-bus and platform device registration routines.
Signed-off-by: default avatarGeoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent c2b16e1c
...@@ -31,6 +31,89 @@ ...@@ -31,6 +31,89 @@
#include "platform.h" #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. * ps3_setup_gelic_device - Setup and register a gelic device instance.
* *
...@@ -827,6 +910,8 @@ static int __init ps3_register_devices(void) ...@@ -827,6 +910,8 @@ static int __init ps3_register_devices(void)
ps3_register_sound_devices(); ps3_register_sound_devices();
ps3_register_lpm_devices();
pr_debug(" <- %s:%d\n", __func__, __LINE__); pr_debug(" <- %s:%d\n", __func__, __LINE__);
return 0; return 0;
} }
......
...@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(struct ps3_system_bus_device *dev) ...@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(struct ps3_system_bus_device *dev)
static unsigned int dev_ioc0_count; static unsigned int dev_ioc0_count;
static unsigned int dev_sb_count; static unsigned int dev_sb_count;
static unsigned int dev_vuart_count; static unsigned int dev_vuart_count;
static unsigned int dev_lpm_count;
if (!dev->core.parent) if (!dev->core.parent)
dev->core.parent = &ps3_system_bus; dev->core.parent = &ps3_system_bus;
...@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(struct ps3_system_bus_device *dev) ...@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(struct ps3_system_bus_device *dev)
snprintf(dev->core.bus_id, sizeof(dev->core.bus_id), snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
"vuart_%02x", ++dev_vuart_count); "vuart_%02x", ++dev_vuart_count);
break; break;
case PS3_DEVICE_TYPE_LPM:
snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
"lpm_%02x", ++dev_lpm_count);
break;
default: default:
BUG(); BUG();
}; };
......
...@@ -317,6 +317,7 @@ enum ps3_match_id { ...@@ -317,6 +317,7 @@ enum ps3_match_id {
PS3_MATCH_ID_STOR_FLASH = 8, PS3_MATCH_ID_STOR_FLASH = 8,
PS3_MATCH_ID_SOUND = 9, PS3_MATCH_ID_SOUND = 9,
PS3_MATCH_ID_GRAPHICS = 10, PS3_MATCH_ID_GRAPHICS = 10,
PS3_MATCH_ID_LPM = 11,
}; };
#define PS3_MODULE_ALIAS_EHCI "ps3:1" #define PS3_MODULE_ALIAS_EHCI "ps3:1"
...@@ -329,11 +330,13 @@ enum ps3_match_id { ...@@ -329,11 +330,13 @@ enum ps3_match_id {
#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8" #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"
#define PS3_MODULE_ALIAS_SOUND "ps3:9" #define PS3_MODULE_ALIAS_SOUND "ps3:9"
#define PS3_MODULE_ALIAS_GRAPHICS "ps3:10" #define PS3_MODULE_ALIAS_GRAPHICS "ps3:10"
#define PS3_MODULE_ALIAS_LPM "ps3:11"
enum ps3_system_bus_device_type { enum ps3_system_bus_device_type {
PS3_DEVICE_TYPE_IOC0 = 1, PS3_DEVICE_TYPE_IOC0 = 1,
PS3_DEVICE_TYPE_SB, PS3_DEVICE_TYPE_SB,
PS3_DEVICE_TYPE_VUART, PS3_DEVICE_TYPE_VUART,
PS3_DEVICE_TYPE_LPM,
}; };
/** /**
...@@ -350,6 +353,11 @@ struct ps3_system_bus_device { ...@@ -350,6 +353,11 @@ struct ps3_system_bus_device {
struct ps3_dma_region *d_region; /* SB, IOC0 */ struct ps3_dma_region *d_region; /* SB, IOC0 */
struct ps3_mmio_region *m_region; /* SB, IOC0*/ struct ps3_mmio_region *m_region; /* SB, IOC0*/
unsigned int port_number; /* VUART */ 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 iommu_table *iommu_table; -- waiting for BenH's cleanups */
struct device core; struct device core;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment