Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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");
}