int query_lpar_address(void) { u64 lpar_addr, start_address, size, access_right, max_page_size, flags; u64 entries[3][7]; u64 *ptr; int i, result; MM_LOAD_BASE(ptr, QUERY_LPAR_ADDR_OFFSET); lpar_addr = 0x0000000000000000ULL; result = lv1_query_logical_partition_address_region_info(lpar_addr, &start_address, &size, &access_right, &max_page_size, &flags); i = 0; entries[i][0] = result; entries[i][1] = lpar_addr; entries[i][2] = start_address; entries[i][3] = size; entries[i][4] = access_right; entries[i][5] = max_page_size; entries[i][6] = flags; lpar_addr = *((u64 *) (*(u64 *) (*(u64 *) ptr)) + 0x11); result = lv1_query_logical_partition_address_region_info(lpar_addr, &start_address, &size, &access_right, &max_page_size, &flags); i++; entries[i][0] = result; entries[i][1] = lpar_addr; entries[i][2] = start_address; entries[i][3] = size; entries[i][4] = access_right; entries[i][5] = max_page_size; entries[i][6] = flags; lpar_addr = *((u64 *) (*(u64 *) (*(u64 *) ptr)) + 0x13); result = lv1_query_logical_partition_address_region_info(lpar_addr, &start_address, &size, &access_right, &max_page_size, &flags); i++; entries[i][0] = result; entries[i][1] = lpar_addr; entries[i][2] = start_address; entries[i][3] = size; entries[i][4] = access_right; entries[i][5] = max_page_size; entries[i][6] = flags; result = gelic_xmit_data(gelic_bcast_mac_addr, 0xCAFE, entries, sizeof(entries)); if (result < 0) return result; return 0; }
void __init ps3_mm_vas_create(unsigned long* htab_size) { int result; u64 start_address; u64 size; u64 access_right; u64 max_page_size; u64 flags; result = lv1_query_logical_partition_address_region_info(0, &start_address, &size, &access_right, &max_page_size, &flags); if (result) { DBG("%s:%d: lv1_query_logical_partition_address_region_info " "failed: %s\n", __func__, __LINE__, ps3_result(result)); goto fail; } if (max_page_size < PAGE_SHIFT_16M) { DBG("%s:%d: bad max_page_size %llxh\n", __func__, __LINE__, max_page_size); goto fail; } BUILD_BUG_ON(CONFIG_PS3_HTAB_SIZE > HTAB_SIZE_MAX); BUILD_BUG_ON(CONFIG_PS3_HTAB_SIZE < HTAB_SIZE_MIN); result = lv1_construct_virtual_address_space(CONFIG_PS3_HTAB_SIZE, 2, make_page_sizes(PAGE_SHIFT_16M, PAGE_SHIFT_64K), &map.vas_id, &map.htab_size); if (result) { DBG("%s:%d: lv1_construct_virtual_address_space failed: %s\n", __func__, __LINE__, ps3_result(result)); goto fail; } result = lv1_select_virtual_address_space(map.vas_id); if (result) { DBG("%s:%d: lv1_select_virtual_address_space failed: %s\n", __func__, __LINE__, ps3_result(result)); goto fail; } *htab_size = map.htab_size; debug_dump_map(&map); return; fail: panic("ps3_mm_vas_create failed"); }