int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq) { int result; u64 node_id; *tb_freq = 0; result = ps3_repository_read_be_node_id(be_index, &node_id); return result ? result : ps3_repository_read_tb_freq(node_id, tb_freq); }
int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar, u64 *rights) { int result; u64 node_id; *lpar = 0; *rights = 0; result = ps3_repository_read_be_node_id(be_index, &node_id); return result ? result : read_node(PS3_LPAR_ID_PME, make_first_field("be", 0), node_id, make_field("lpm", 0), make_field("priv", 0), lpar, rights); }
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 %llu, rights %llu(%llxh)\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; }