16e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/*
26e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  PS3 repository routines.
36e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
46e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  Copyright (C) 2006 Sony Computer Entertainment Inc.
56e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  Copyright 2006 Sony Corp.
66e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
76e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  This program is free software; you can redistribute it and/or modify
86e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  it under the terms of the GNU General Public License as published by
96e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  the Free Software Foundation; version 2 of the License.
106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  This program is distributed in the hope that it will be useful,
126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  but WITHOUT ANY WARRANTY; without even the implied warranty of
136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  GNU General Public License for more details.
156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  You should have received a copy of the GNU General Public License
176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  along with this program; if not, write to the Free Software
186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#include <asm/lv1call.h>
226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
232a08ea69a3e448a5cc94e5da9eccc40cf13f9532Geoff Levand#include "platform.h"
242a08ea69a3e448a5cc94e5da9eccc40cf13f9532Geoff Levand
256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandenum ps3_vendor_id {
266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_VENDOR_ID_NONE = 0,
276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_VENDOR_ID_SONY = 0x8000000000000000UL,
286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand};
296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandenum ps3_lpar_id {
316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_LPAR_ID_CURRENT = 0,
326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_LPAR_ID_PME = 1,
336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand};
346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_field(_a, _b) _dump_field(_a, _b, __func__, __LINE__)
36720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoevenstatic void _dump_field(const char *hdr, u64 n, const char *func, int line)
376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#if defined(DEBUG)
396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	char s[16];
406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	const char *const in = (const char *)&n;
416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int i;
426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (i = 0; i < 8; i++)
446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		s[i] = (in[i] <= 126 && in[i] >= 32) ? in[i] : '.';
456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	s[i] = 0;
466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
474bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: %s%016llx : %s\n", func, line, hdr, n, s);
486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#endif
496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_node_name(_a, _b, _c, _d, _e) \
526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__)
53720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoevenstatic void _dump_node_name(unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
54720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	u64 n4, const char *func, int line)
556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
564bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: lpar: %u\n", func, line, lpar_id);
576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n1: ", n1, func, line);
586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n2: ", n2, func, line);
596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n3: ", n3, func, line);
606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n4: ", n4, func, line);
616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_node(_a, _b, _c, _d, _e, _f, _g) \
646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)
656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
66720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	u64 v1, u64 v2, const char *func, int line)
676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
684bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: lpar: %u\n", func, line, lpar_id);
696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n1: ", n1, func, line);
706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n2: ", n2, func, line);
716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n3: ", n3, func, line);
726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n4: ", n4, func, line);
734bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: v1: %016llx\n", func, line, v1);
744bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: v2: %016llx\n", func, line, v2);
756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * make_first_field - Make the first field of a repository node name.
796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @text: Text portion of the field.
806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @index: Numeric index portion of the field.  Use zero for 'don't care'.
816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * This routine sets the vendor id to zero (non-vendor specific).
836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * Returns field value.
846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic u64 make_first_field(const char *text, u64 index)
876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 n;
896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	strncpy((char *)&n, text, 8);
916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return PS3_VENDOR_ID_NONE + (n >> 32) + index;
926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * make_field - Make subsequent fields of a repository node name.
966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @text: Text portion of the field.  Use "" for 'don't care'.
976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @index: Numeric index portion of the field.  Use zero for 'don't care'.
986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * Returns field value.
1006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
1016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic u64 make_field(const char *text, u64 index)
1036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 n;
1056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	strncpy((char *)&n, text, 8);
1076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return n + index;
1086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
1116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * read_node - Read a repository node from raw fields.
1126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n1: First field of node name.
1136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n2: Second field of node name.  Use zero for 'don't care'.
1146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n3: Third field of node name.  Use zero for 'don't care'.
1156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n4: Fourth field of node name.  Use zero for 'don't care'.
1166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @v1: First repository value (high word).
1176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @v2: Second repository value (low word).  Optional parameter, use zero
1186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *      for 'don't care'.
1196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
1206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic int read_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
1226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 *_v1, u64 *_v2)
1236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
1266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v2;
1276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (lpar_id == PS3_LPAR_ID_CURRENT) {
1296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 id;
1306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		lv1_get_logical_partition_id(&id);
1316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		lpar_id = id;
1326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
1336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1347f8cd3523078f59f0da4561ee725d05008b0a80cGeoff Levand	result = lv1_read_repository_node(lpar_id, n1, n2, n3, n4, &v1,
1356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v2);
1366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
1384bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_warn("%s:%d: lv1_read_repository_node failed: %s\n",
1396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, ps3_result(result));
1406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		dump_node_name(lpar_id, n1, n2, n3, n4);
141a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		return -ENOENT;
1426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
1436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	dump_node(lpar_id, n1, n2, n3, n4, v1, v2);
1456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (_v1)
1476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		*_v1 = v1;
1486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (_v2)
1496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		*_v2 = v2;
1506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (v1 && !_v1)
1524bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d: warning: discarding non-zero v1: %016llx\n",
1536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, v1);
1546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (v2 && !_v2)
1554bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d: warning: discarding non-zero v2: %016llx\n",
1566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, v2);
1576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
158a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return 0;
1596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
1626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 *value)
1636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
1656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field(bus_str, 0),
1676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
168720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		value, NULL);
1696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
171034e0ab54bfe57bc980452f991d3ab443f1b085aGeert Uytterhoevenint ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id)
1726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
1766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("id", 0),
1786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
179034e0ab54bfe57bc980452f991d3ab443f1b085aGeert Uytterhoeven		bus_id, NULL);
1806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
1816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_type(unsigned int bus_index,
1846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_bus_type *bus_type)
1856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1875233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
1886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
1906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
1926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
193720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
1946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*bus_type = v1;
1956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
1966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_num_dev(unsigned int bus_index,
1996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int *num_dev)
2006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2025233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
2036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("num_dev", 0),
2076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
208720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
2096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_dev = v1;
2106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_str(unsigned int bus_index,
2146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, const char *dev_str, u64 *value)
2156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
2176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field(dev_str, 0),
2206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
221720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		value, NULL);
2226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
225034e0ab54bfe57bc980452f991d3ab443f1b085aGeert Uytterhoeven	u64 *dev_id)
2266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("id", 0),
2336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
234720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		dev_id, NULL);
2356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_type(unsigned int bus_index,
2396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, enum ps3_dev_type *dev_type)
2406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2425233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
2436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
2486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
249720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
2506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*dev_type = v1;
2516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_intr(unsigned int bus_index,
2556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, unsigned int intr_index,
256720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id)
2576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2595233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
2605233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v2 = 0;
2616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("intr", intr_index),
2666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
2676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, &v2);
2686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*intr_type = v1;
2696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*interrupt_id = v2;
2706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg_type(unsigned int bus_index,
274eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	unsigned int dev_index, unsigned int reg_index,
275eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type *reg_type)
2766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2785233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
2796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("reg", reg_index),
2846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
285720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
2866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*reg_type = v1;
2876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg_addr(unsigned int bus_index,
2916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, unsigned int reg_index, u64 *bus_addr, u64 *len)
2926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
2946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("reg", reg_index),
2976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("data", 0),
2986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		bus_addr, len);
2996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg(unsigned int bus_index,
302eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	unsigned int dev_index, unsigned int reg_index,
303eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type *reg_type, u64 *bus_addr, u64 *len)
3046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
3056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = ps3_repository_read_dev_reg_type(bus_index, dev_index,
3066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		reg_index, reg_type);
3076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
3086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_dev_reg_addr(bus_index, dev_index,
3096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		reg_index, bus_addr, len);
3106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
314a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_find_device(struct ps3_repository_device *repo)
315a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
316a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result;
317a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	struct ps3_repository_device tmp = *repo;
318a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int num_dev;
3196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
320a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	BUG_ON(repo->bus_index > 10);
321a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	BUG_ON(repo->dev_index > 10);
3226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
323a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = ps3_repository_read_bus_num_dev(tmp.bus_index, &num_dev);
3246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
325a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	if (result) {
3264bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d read_bus_num_dev failed\n", __func__, __LINE__);
327a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		return result;
3286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
3296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3304bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: bus_type %u, bus_index %u, bus_id %llu, num_dev %u\n",
331a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		__func__, __LINE__, tmp.bus_type, tmp.bus_index, tmp.bus_id,
332a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		num_dev);
3336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
334a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	if (tmp.dev_index >= num_dev) {
3354bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d: no device found\n", __func__, __LINE__);
336a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		return -ENODEV;
3376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
3386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
339a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = ps3_repository_read_dev_type(tmp.bus_index, tmp.dev_index,
340a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		&tmp.dev_type);
3416c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3426c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result) {
3434bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d read_dev_type failed\n", __func__, __LINE__);
344a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		return result;
3456c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	}
3466c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
347a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
348a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		&tmp.dev_id);
3496c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
350a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	if (result) {
3514bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d ps3_repository_read_dev_id failed\n", __func__,
352a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		__LINE__);
353a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		return result;
3546c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	}
3556c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3564bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: found: dev_type %u, dev_index %u, dev_id %llu\n",
357a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		__func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
3586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
359a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	*repo = tmp;
360a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return 0;
3616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
363e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoevenint ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
364e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven				     u64 bus_id, u64 dev_id)
365e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven{
366e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	int result = -ENODEV;
367e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	struct ps3_repository_device tmp;
368e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	unsigned int num_dev;
369e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
3704bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%u: find device by id %llu:%llu\n", __func__, __LINE__,
371e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		 bus_id, dev_id);
372e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
373e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	for (tmp.bus_index = 0; tmp.bus_index < 10; tmp.bus_index++) {
374e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		result = ps3_repository_read_bus_id(tmp.bus_index,
375e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven						    &tmp.bus_id);
376e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		if (result) {
3774bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%u read_bus_id(%u) failed\n", __func__,
378e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven				 __LINE__, tmp.bus_index);
379e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			return result;
380e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		}
381e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
382e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		if (tmp.bus_id == bus_id)
383e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			goto found_bus;
384e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
3854bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%u: skip, bus_id %llu\n", __func__, __LINE__,
386e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			 tmp.bus_id);
387e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	}
3884bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%u: bus not found\n", __func__, __LINE__);
389e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	return result;
390e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
391e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoevenfound_bus:
392e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	result = ps3_repository_read_bus_type(tmp.bus_index, &tmp.bus_type);
393e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	if (result) {
3944bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%u read_bus_type(%u) failed\n", __func__,
395e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			 __LINE__, tmp.bus_index);
396e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		return result;
397e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	}
398e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
399e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	result = ps3_repository_read_bus_num_dev(tmp.bus_index, &num_dev);
400e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	if (result) {
4014bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%u read_bus_num_dev failed\n", __func__,
402e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			 __LINE__);
403e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		return result;
404e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	}
405e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
406e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	for (tmp.dev_index = 0; tmp.dev_index < num_dev; tmp.dev_index++) {
407e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		result = ps3_repository_read_dev_id(tmp.bus_index,
408e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven						    tmp.dev_index,
409e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven						    &tmp.dev_id);
410e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		if (result) {
4114bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%u read_dev_id(%u:%u) failed\n", __func__,
412e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven				 __LINE__, tmp.bus_index, tmp.dev_index);
413e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			return result;
414e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		}
415e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
416e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		if (tmp.dev_id == dev_id)
417e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			goto found_dev;
418e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
4194bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%u: skip, dev_id %llu\n", __func__, __LINE__,
420e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven			 tmp.dev_id);
421e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	}
4224bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%u: dev not found\n", __func__, __LINE__);
423e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	return result;
424e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
425e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoevenfound_dev:
426e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	result = ps3_repository_read_dev_type(tmp.bus_index, tmp.dev_index,
427e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven					      &tmp.dev_type);
428e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	if (result) {
4294bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%u read_dev_type failed\n", __func__, __LINE__);
430e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		return result;
431e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	}
432e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
4334bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%u: found: type (%u:%u) index (%u:%u) id (%llu:%llu)\n",
434e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		 __func__, __LINE__, tmp.bus_type, tmp.dev_type, tmp.bus_index,
435e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven		 tmp.dev_index, tmp.bus_id, tmp.dev_id);
436e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	*repo = tmp;
437e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven	return 0;
438e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven}
439e06bcf3cc3a6c45a16e9ffeb0401380aebfdea02Geert Uytterhoeven
440cad5cef62a5a0c525d39118d2e94b6e2034d5e05Greg Kroah-Hartmanint ps3_repository_find_devices(enum ps3_bus_type bus_type,
441a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int (*callback)(const struct ps3_repository_device *repo))
4426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
4436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
444a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	struct ps3_repository_device repo;
4456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4464bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%d: find bus_type %u\n", __func__, __LINE__, bus_type);
4476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
448ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	repo.bus_type = bus_type;
449ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index);
450ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	if (result) {
4514bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel(" <- %s:%u: bus not found\n", __func__, __LINE__);
452ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		return result;
453ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	}
4546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
455ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id);
456ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	if (result) {
4574bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d read_bus_id(%u) failed\n", __func__, __LINE__,
458ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven			 repo.bus_index);
459ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		return result;
460ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	}
4616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
462ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven	for (repo.dev_index = 0; ; repo.dev_index++) {
463ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		result = ps3_repository_find_device(&repo);
464ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		if (result == -ENODEV) {
465ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven			result = 0;
466ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven			break;
467ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		} else if (result)
4686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
4696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
470ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven		result = callback(&repo);
4716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4724bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d: abort at callback\n", __func__,
473ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven				__LINE__);
474ad7d8193e49c5534f76f87b22a6fd80e39be96ccGeert Uytterhoeven			break;
4756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
4766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
4776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4784bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%d\n", __func__, __LINE__);
4796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
4806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
4816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
482a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_find_bus(enum ps3_bus_type bus_type, unsigned int from,
483a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int *bus_index)
4846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
485a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int i;
486a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	enum ps3_bus_type type;
487a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int error;
4886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
489a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (i = from; i < 10; i++) {
490a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		error = ps3_repository_read_bus_type(i, &type);
491a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (error) {
4924bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_bus_type failed\n",
4936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
494a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			*bus_index = UINT_MAX;
495a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			return error;
496a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
497a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (type == bus_type) {
498a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			*bus_index = i;
499a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			return 0;
5006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
502a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	*bus_index = UINT_MAX;
503a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return -ENODEV;
5046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
5056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
506a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_find_interrupt(const struct ps3_repository_device *repo,
5076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_interrupt_type intr_type, unsigned int *interrupt_id)
5086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
5096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
5106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int res_index;
5116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5124bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: find intr_type %u\n", __func__, __LINE__, intr_type);
5136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*interrupt_id = UINT_MAX;
5156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
5176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_interrupt_type t;
5186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int id;
5196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
520a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_intr(repo->bus_index,
521a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, res_index, &t, &id);
5226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
5244bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_dev_intr failed\n",
5256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
5266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
5276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (t == intr_type) {
5306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*interrupt_id = id;
5316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
5326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
535eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (res_index == 10)
536eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -ENODEV;
5376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5384bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: found intr_type %u at res_index %u\n",
5396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, intr_type, res_index);
5406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
5426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
5436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
544a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_find_reg(const struct ps3_repository_device *repo,
545eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type reg_type, u64 *bus_addr, u64 *len)
5466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
5476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
5486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int res_index;
5496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5504bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: find reg_type %u\n", __func__, __LINE__, reg_type);
5516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*bus_addr = *len = 0;
5536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
555eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		enum ps3_reg_type t;
5566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 a;
5576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 l;
5586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
559a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_reg(repo->bus_index,
560a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, res_index, &t, &a, &l);
5616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
5634bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_dev_reg failed\n",
5646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
5656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
5666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (t == reg_type) {
5696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*bus_addr = a;
5706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*len = l;
5716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
5726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
575eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (res_index == 10)
576eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -ENODEV;
5776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5784bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d: found reg_type %u at res_index %u\n",
5796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, reg_type, res_index);
5806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
5826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
5836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5846c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_port(unsigned int bus_index,
5856c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *port)
5866c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
5876c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
5886c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
5896c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
5906c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("port", 0),
591720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		0, port, NULL);
5926c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
5936c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
5946c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
5956c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *blk_size)
5966c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
5976c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
5986c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
5996c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
6006c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("blk_size", 0),
601720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		0, blk_size, NULL);
6026c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6036c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6046c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
6056c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *num_blocks)
6066c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6076c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
6086c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
6096c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
6106c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("n_blocks", 0),
611720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		0, num_blocks, NULL);
6126c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6136c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6146c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
6156c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int *num_regions)
6166c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6176c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
6185233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
6196c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6206c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = read_node(PS3_LPAR_ID_PME,
6216c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
6226c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
6236c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("n_regs", 0),
624720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		0, &v1, NULL);
6256c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	*num_regions = v1;
6266c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
6276c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6286c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6296c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_id(unsigned int bus_index,
6306c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index,
6316c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int *region_id)
6326c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6336c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
6345233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
6356c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6366c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = read_node(PS3_LPAR_ID_PME,
6376c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
6386c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
6396c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
6406c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("id", 0),
641720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	    &v1, NULL);
6426c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	*region_id = v1;
6436c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
6446c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6456c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6466c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_size(unsigned int bus_index,
6476c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index,	unsigned int region_index, u64 *region_size)
6486c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6496c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
6506c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
6516c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
6526c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
6536c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("size", 0),
654720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	    region_size, NULL);
6556c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6566c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6576c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
6586c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index, u64 *region_start)
6596c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6606c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
6616c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
6626c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
6636c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
6646c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("start", 0),
665720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	    region_start, NULL);
6666c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6676c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6686c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_info(unsigned int bus_index,
6696c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *port, u64 *blk_size,
6706c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	u64 *num_blocks, unsigned int *num_regions)
6716c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6726c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
6736c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6746c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_port(bus_index, dev_index, port);
6756c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
6766c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
6776c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6786c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_blk_size(bus_index, dev_index,
6796c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		blk_size);
6806c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
6816c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
6826c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6836c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_num_blocks(bus_index, dev_index,
6846c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		num_blocks);
6856c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
6866c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
6876c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6886c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_num_regions(bus_index, dev_index,
6896c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		num_regions);
6906c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
6916c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
6926c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6936c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region(unsigned int bus_index,
6946c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index,
6956c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int *region_id, u64 *region_start, u64 *region_size)
6966c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
6976c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
6986c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
6996c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_id(bus_index, dev_index,
7006c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_id);
7016c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
7026c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
7036c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7046c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_start(bus_index, dev_index,
7056c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_start);
7066c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
7076c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
7086c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7096c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_size(bus_index, dev_index,
7106c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_size);
7116c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
7126c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7136c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
714c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto/**
715c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * ps3_repository_read_num_pu - Number of logical PU processors for this lpar.
716c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto */
717c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
718c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamotoint ps3_repository_read_num_pu(u64 *num_pu)
719c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto{
720c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	*num_pu = 0;
721c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	return read_node(PS3_LPAR_ID_CURRENT,
722c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			   make_first_field("bi", 0),
723c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			   make_field("pun", 0),
724c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			   0, 0,
725c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			   num_pu, NULL);
726c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto}
727c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
728c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto/**
729c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * ps3_repository_read_pu_id - Read the logical PU id.
730c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @pu_index: Zero based index.
731c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @pu_id: The logical PU id.
732c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto */
733c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
734c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamotoint ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id)
735c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto{
736c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	return read_node(PS3_LPAR_ID_CURRENT,
737c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		make_first_field("bi", 0),
738c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		make_field("pu", pu_index),
739c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		0, 0,
740c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		pu_id, NULL);
741c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto}
742c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
7436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
7446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
7456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
7466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
7476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("pu", 0),
7486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		ppe_id,
7496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("rm_size", 0),
750720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		rm_size, NULL);
7516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
7526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_region_total(u64 *region_total)
7546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
7556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
7566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
7576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("rgntotal", 0),
7586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
759720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		region_total, NULL);
7606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
7616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
7636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_mm_info - Read mm info for single pu system.
7646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @rm_base: Real mode memory base address.
7656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @rm_size: Real mode memory size.
7666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @region_total: Maximum memory region size.
7676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
7686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_mm_info(u64 *rm_base, u64 *rm_size, u64 *region_total)
7706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
7716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
7726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 ppe_id;
7736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	lv1_get_logical_ppe_id(&ppe_id);
7756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*rm_base = 0;
7766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_rm_size(ppe_id, rm_size);
7776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
7786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_region_total(region_total);
7796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
7806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
7826750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * ps3_repository_read_highmem_region_count - Read the number of highmem regions
7836750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider *
7846750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * Bootloaders must arrange the repository nodes such that regions are indexed
7856750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * with a region_index from 0 to region_count-1.
7866750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider */
7876750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
7886750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heiderint ps3_repository_read_highmem_region_count(unsigned int *region_count)
7896750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider{
7906750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	int result;
7916750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	u64 v1 = 0;
7926750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
7936750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	result = read_node(PS3_LPAR_ID_CURRENT,
7946750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_first_field("highmem", 0),
7956750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("region", 0),
7966750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("count", 0),
7976750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		0,
7986750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		&v1, NULL);
7996750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	*region_count = v1;
8006750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	return result;
8016750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider}
8026750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8036750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8046750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heiderint ps3_repository_read_highmem_base(unsigned int region_index,
8056750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	u64 *highmem_base)
8066750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider{
8076750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	return read_node(PS3_LPAR_ID_CURRENT,
8086750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_first_field("highmem", 0),
8096750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("region", region_index),
8106750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("base", 0),
8116750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		0,
8126750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		highmem_base, NULL);
8136750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider}
8146750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8156750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heiderint ps3_repository_read_highmem_size(unsigned int region_index,
8166750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	u64 *highmem_size)
8176750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider{
8186750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	return read_node(PS3_LPAR_ID_CURRENT,
8196750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_first_field("highmem", 0),
8206750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("region", region_index),
8216750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		make_field("size", 0),
8226750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		0,
8236750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		highmem_size, NULL);
8246750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider}
8256750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8266750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider/**
8276750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * ps3_repository_read_highmem_info - Read high memory region info
8286750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * @region_index: Region index, {0,..,region_count-1}.
8296750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * @highmem_base: High memory base address.
8306750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * @highmem_size: High memory size.
8316750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider *
8326750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * Bootloaders that preallocate highmem regions must place the
8336750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider * region info into the repository at these well known nodes.
8346750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider */
8356750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8366750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heiderint ps3_repository_read_highmem_info(unsigned int region_index,
8376750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	u64 *highmem_base, u64 *highmem_size)
8386750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider{
8396750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	int result;
8406750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8416750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	*highmem_base = 0;
8426750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	result = ps3_repository_read_highmem_base(region_index, highmem_base);
8436750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider	return result ? result
8446750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider		: ps3_repository_read_highmem_size(region_index, highmem_size);
8456750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider}
8466750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider
8476750edbd8d6d1d72365e29e58b05f164bc23755aAndre Heider/**
8486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_num_spu_reserved - Number of physical spus reserved.
8496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @num_spu: Number of physical spus.
8506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
8516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_spu_reserved(unsigned int *num_spu_reserved)
8536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
8555233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
8566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
8586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
8596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spun", 0),
8606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
861720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
8626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_spu_reserved = v1;
8636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
8646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
8676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_num_spu_resource_id - Number of spu resource reservations.
8686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @num_resource_id: Number of spu resource ids.
8696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
8706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_spu_resource_id(unsigned int *num_resource_id)
8726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
8745233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
8756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
8776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
8786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spursvn", 0),
8796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
880720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
8816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_resource_id = v1;
8826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
8836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
8866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_spu_resource_id - spu resource reservation id value.
8876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @res_index: Resource reservation index.
8886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @resource_type: Resource reservation type.
8896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @resource_id: Resource reservation id.
8906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
8916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_spu_resource_id(unsigned int res_index,
893720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven	enum ps3_spu_resource_type *resource_type, unsigned int *resource_id)
8946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
8965233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
8975233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v2 = 0;
8986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
9006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spursv", 0),
9026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		res_index,
9036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, &v2);
9056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*resource_type = v1;
9066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*resource_id = v2;
9076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
910720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoevenstatic int ps3_repository_read_boot_dat_address(u64 *address)
9116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
9136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("boot_dat", 0),
9156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("address", 0),
9166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
917720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		address, NULL);
9186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_boot_dat_size(unsigned int *size)
9216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9235233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
9246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
9266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("boot_dat", 0),
9286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("size", 0),
9296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
930720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
9316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*size = v1;
9326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
935a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_read_vuart_av_port(unsigned int *port)
936a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
937a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result;
9385233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
939a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
940a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
941a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_first_field("bi", 0),
942a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("vir_uart", 0),
943a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("port", 0),
944a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("avset", 0),
945720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
946a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	*port = v1;
947a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
948a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
949a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
950a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_read_vuart_sysmgr_port(unsigned int *port)
951a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
952a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result;
9535233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
954a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
955a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
956a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_first_field("bi", 0),
957a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("vir_uart", 0),
958a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("port", 0),
959a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		make_field("sysmgr", 0),
960720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
961a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	*port = v1;
962a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
963a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
964a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
9656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
9666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * ps3_repository_read_boot_dat_info - Get address and size of cell_ext_os_area.
9676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * address: lpar address of cell_ext_os_area
9686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * @size: size of cell_ext_os_area
9696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  */
9706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_boot_dat_info(u64 *lpar_addr, unsigned int *size)
9726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*size = 0;
9766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_boot_dat_address(lpar_addr);
9776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
9786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_boot_dat_size(size);
9796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
981c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto/**
982c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * ps3_repository_read_num_be - Number of physical BE processors in the system.
983c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto */
984c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
9856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_be(unsigned int *num_be)
9866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9885233e26ebb90242e3691c185ddda02dc83649e7dGeoff Levand	u64 v1 = 0;
9896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
9916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("ben", 0),
9926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
995720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		&v1, NULL);
9966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_be = v1;
9976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1000c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto/**
1001c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * ps3_repository_read_be_node_id - Read the physical BE processor node id.
1002c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @be_index: Zero based index.
1003c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @node_id: The BE processor node id.
1004c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto */
1005c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
10066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id)
10076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
10096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("be", be_index),
10106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
1013720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		node_id, NULL);
10146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
10156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1016c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto/**
1017c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * ps3_repository_read_be_id - Read the physical BE processor id.
1018c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @node_id: The BE processor node id.
1019c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto * @be_id: The BE processor id.
1020c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto */
1021c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
1022c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamotoint ps3_repository_read_be_id(u64 node_id, u64 *be_id)
1023c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto{
1024c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	return read_node(PS3_LPAR_ID_PME,
1025c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		make_first_field("be", 0),
1026c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		node_id,
1027c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		0,
1028c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		0,
1029c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		be_id, NULL);
1030c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto}
1031c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
10326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq)
10336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
10356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("be", 0),
10366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		node_id,
10376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("clock", 0),
10386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
1039720c9133ff108998c5fb910d165146de5bc4705aGeert Uytterhoeven		tb_freq, NULL);
10406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
10416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
10426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq)
10436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
10456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 node_id;
10466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
10476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*tb_freq = 0;
1048c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	result = ps3_repository_read_be_node_id(be_index, &node_id);
10496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
10506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_tb_freq(node_id, tb_freq);
10516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1052a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1053c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamotoint ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
1054c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	u64 *rights)
1055c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto{
1056c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	int result;
1057c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	u64 node_id;
1058c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
1059c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	*lpar = 0;
1060c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	*rights = 0;
1061c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	result = ps3_repository_read_be_node_id(be_index, &node_id);
1062c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto	return result ? result
1063c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto		: read_node(PS3_LPAR_ID_PME,
1064c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			    make_first_field("be", 0),
1065c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			    node_id,
1066c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			    make_field("lpm", 0),
1067c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			    make_field("priv", 0),
1068c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto			    lpar, rights);
1069c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto}
1070c2b16e1c1050b3cb3a63943eafc99ae86b8f51c3Takashi Yamamoto
107107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand#if defined(CONFIG_PS3_REPOSITORY_WRITE)
107207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
107307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levandstatic int create_node(u64 n1, u64 n2, u64 n3, u64 n4, u64 v1, u64 v2)
107407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand{
107507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	int result;
107607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
107707c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	dump_node(0, n1, n2, n3, n4, v1, v2);
107807c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
107907c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	result = lv1_create_repository_node(n1, n2, n3, n4, v1, v2);
108007c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
108107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	if (result) {
108207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		pr_devel("%s:%d: lv1_create_repository_node failed: %s\n",
108307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand			__func__, __LINE__, ps3_result(result));
108407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		return -ENOENT;
108507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	}
108607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
108707c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	return 0;
108807c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand}
108907c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
109007c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levandstatic int delete_node(u64 n1, u64 n2, u64 n3, u64 n4)
109107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand{
109207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	int result;
109307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
109407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	dump_node(0, n1, n2, n3, n4, 0, 0);
109507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
109607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	result = lv1_delete_repository_node(n1, n2, n3, n4);
109707c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
109807c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	if (result) {
109907c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		pr_devel("%s:%d: lv1_delete_repository_node failed: %s\n",
110007c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand			__func__, __LINE__, ps3_result(result));
110107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		return -ENOENT;
110207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	}
110307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
110407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	return 0;
110507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand}
110607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
110707c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levandstatic int write_node(u64 n1, u64 n2, u64 n3, u64 n4, u64 v1, u64 v2)
110807c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand{
110907c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	int result;
111007c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
111107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	result = create_node(n1, n2, n3, n4, v1, v2);
111207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
111307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	if (!result)
111407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		return 0;
111507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
111607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	result = lv1_write_repository_node(n1, n2, n3, n4, v1, v2);
111707c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
111807c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	if (result) {
111907c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		pr_devel("%s:%d: lv1_write_repository_node failed: %s\n",
112007c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand			__func__, __LINE__, ps3_result(result));
112107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand		return -ENOENT;
112207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	}
112307c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
112407c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand	return 0;
112507c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand}
112607c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
112779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandint ps3_repository_write_highmem_region_count(unsigned int region_count)
112879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
112979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	int result;
113079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	u64 v1 = (u64)region_count;
113179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
113279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	result = write_node(
113379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_first_field("highmem", 0),
113479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("region", 0),
113579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("count", 0),
113679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		0,
113779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		v1, 0);
113879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return result;
113979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
114079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
114179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandint ps3_repository_write_highmem_base(unsigned int region_index,
114279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	u64 highmem_base)
114379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
114479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return write_node(
114579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_first_field("highmem", 0),
114679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("region", region_index),
114779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("base", 0),
114879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		0,
114979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		highmem_base, 0);
115079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
115179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
115279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandint ps3_repository_write_highmem_size(unsigned int region_index,
115379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	u64 highmem_size)
115479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
115579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return write_node(
115679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_first_field("highmem", 0),
115779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("region", region_index),
115879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("size", 0),
115979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		0,
116079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		highmem_size, 0);
116179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
116279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
116379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandint ps3_repository_write_highmem_info(unsigned int region_index,
116479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	u64 highmem_base, u64 highmem_size)
116579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
116679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	int result;
116779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
116879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	result = ps3_repository_write_highmem_base(region_index, highmem_base);
116979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return result ? result
117079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		: ps3_repository_write_highmem_size(region_index, highmem_size);
117179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
117279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
117379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandstatic int ps3_repository_delete_highmem_base(unsigned int region_index)
117479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
117579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return delete_node(
117679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_first_field("highmem", 0),
117779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("region", region_index),
117879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("base", 0),
117979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		0);
118079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
118179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
118279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandstatic int ps3_repository_delete_highmem_size(unsigned int region_index)
118379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
118479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return delete_node(
118579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_first_field("highmem", 0),
118679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("region", region_index),
118779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		make_field("size", 0),
118879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand		0);
118979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
119079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
119179f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levandint ps3_repository_delete_highmem_info(unsigned int region_index)
119279f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand{
119379f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	int result;
119479f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
119579f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	result = ps3_repository_delete_highmem_base(region_index);
119679f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	result += ps3_repository_delete_highmem_size(region_index);
119779f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
119879f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand	return result ? -1 : 0;
119979f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand}
120079f2a81bf117ffea757b0f298467333cf4e835a8Geoff Levand
120107c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand#endif /* defined(CONFIG_PS3_WRITE_REPOSITORY) */
120207c044c86e05818c2d5e99b8ff881e2e4543c6adGeoff Levand
1203a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand#if defined(DEBUG)
1204a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1205a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_dump_resource_info(const struct ps3_repository_device *repo)
1206a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
1207a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result = 0;
1208a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int res_index;
1209a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12104bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%d: (%u:%u)\n", __func__, __LINE__,
1211a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		repo->bus_index, repo->dev_index);
1212a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1213a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (res_index = 0; res_index < 10; res_index++) {
1214a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		enum ps3_interrupt_type intr_type;
1215a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		unsigned int interrupt_id;
1216a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1217a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_intr(repo->bus_index,
1218a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, res_index, &intr_type, &interrupt_id);
1219a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1220a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
1221a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			if (result !=  LV1_NO_ENTRY)
12224bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand				pr_devel("%s:%d ps3_repository_read_dev_intr"
1223a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand					" (%u:%u) failed\n", __func__, __LINE__,
1224a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand					repo->bus_index, repo->dev_index);
1225a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			break;
1226a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1227a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12284bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d (%u:%u) intr_type %u, interrupt_id %u\n",
1229a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			__func__, __LINE__, repo->bus_index, repo->dev_index,
1230a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			intr_type, interrupt_id);
1231a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1232a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1233a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (res_index = 0; res_index < 10; res_index++) {
1234a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		enum ps3_reg_type reg_type;
1235a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		u64 bus_addr;
1236a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		u64 len;
1237a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1238a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_reg(repo->bus_index,
1239a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, res_index, &reg_type, &bus_addr, &len);
1240a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1241a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
1242a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			if (result !=  LV1_NO_ENTRY)
12434bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand				pr_devel("%s:%d ps3_repository_read_dev_reg"
1244a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand					" (%u:%u) failed\n", __func__, __LINE__,
1245a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand					repo->bus_index, repo->dev_index);
1246a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			break;
1247a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1248a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12494bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d (%u:%u) reg_type %u, bus_addr %llxh, len %llxh\n",
1250a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			__func__, __LINE__, repo->bus_index, repo->dev_index,
1251a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			reg_type, bus_addr, len);
1252a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1253a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12544bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%d\n", __func__, __LINE__);
1255a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
1256a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
1257a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1258a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandstatic int dump_stor_dev_info(struct ps3_repository_device *repo)
1259a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
1260a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result = 0;
1261a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int num_regions, region_index;
1262a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	u64 port, blk_size, num_blocks;
1263a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12644bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%d: (%u:%u)\n", __func__, __LINE__,
1265a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		repo->bus_index, repo->dev_index);
1266a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1267a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	result = ps3_repository_read_stor_dev_info(repo->bus_index,
1268a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		repo->dev_index, &port, &blk_size, &num_blocks, &num_regions);
1269a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	if (result) {
12704bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d ps3_repository_read_stor_dev_info"
1271a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			" (%u:%u) failed\n", __func__, __LINE__,
1272a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->bus_index, repo->dev_index);
1273a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		goto out;
1274a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1275a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12764bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel("%s:%d  (%u:%u): port %llu, blk_size %llu, num_blocks "
12774bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		 "%llu, num_regions %u\n",
12784bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		 __func__, __LINE__, repo->bus_index, repo->dev_index,
12794bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		port, blk_size, num_blocks, num_regions);
1280a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1281a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (region_index = 0; region_index < num_regions; region_index++) {
1282a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		unsigned int region_id;
1283a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		u64 region_start, region_size;
1284a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1285a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_stor_dev_region(repo->bus_index,
1286a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, region_index, &region_id,
1287a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			&region_start, &region_size);
1288a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
12894bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			 pr_devel("%s:%d ps3_repository_read_stor_dev_region"
1290a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				  " (%u:%u) failed\n", __func__, __LINE__,
1291a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				  repo->bus_index, repo->dev_index);
1292a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			break;
1293a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1294a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
12954bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d (%u:%u) region_id %u, start %lxh, size %lxh\n",
1296a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			__func__, __LINE__, repo->bus_index, repo->dev_index,
12974bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			region_id, (unsigned long)region_start,
12984bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			(unsigned long)region_size);
1299a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1300a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1301a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandout:
13024bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%d\n", __func__, __LINE__);
1303a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
1304a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
1305a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1306a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandstatic int dump_device_info(struct ps3_repository_device *repo,
1307a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	unsigned int num_dev)
1308a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
1309a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result = 0;
1310a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
13114bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%d: bus_%u\n", __func__, __LINE__, repo->bus_index);
1312a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1313a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (repo->dev_index = 0; repo->dev_index < num_dev;
1314a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		repo->dev_index++) {
1315a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1316a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_type(repo->bus_index,
1317a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, &repo->dev_type);
1318a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1319a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
13204bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d ps3_repository_read_dev_type"
1321a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				" (%u:%u) failed\n", __func__, __LINE__,
1322a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				repo->bus_index, repo->dev_index);
1323a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			break;
1324a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1325a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1326a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_dev_id(repo->bus_index,
1327a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			repo->dev_index, &repo->dev_id);
1328a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1329a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
13304bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d ps3_repository_read_dev_id"
1331a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				" (%u:%u) failed\n", __func__, __LINE__,
1332a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				repo->bus_index, repo->dev_index);
1333a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			continue;
1334a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1335a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
13364bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d  (%u:%u): dev_type %u, dev_id %lu\n", __func__,
1337a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			__LINE__, repo->bus_index, repo->dev_index,
13384bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			repo->dev_type, (unsigned long)repo->dev_id);
1339a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1340a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		ps3_repository_dump_resource_info(repo);
1341a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1342a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (repo->bus_type == PS3_BUS_TYPE_STORAGE)
1343a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			dump_stor_dev_info(repo);
1344a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1345a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
13464bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%d\n", __func__, __LINE__);
1347a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
1348a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
1349a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1350a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levandint ps3_repository_dump_bus_info(void)
1351a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand{
1352a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	int result = 0;
1353a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	struct ps3_repository_device repo;
1354a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
13554bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" -> %s:%d\n", __func__, __LINE__);
1356a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1357a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	memset(&repo, 0, sizeof(repo));
1358a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1359a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	for (repo.bus_index = 0; repo.bus_index < 10; repo.bus_index++) {
1360a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		unsigned int num_dev;
1361a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1362a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_bus_type(repo.bus_index,
1363a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			&repo.bus_type);
1364a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1365a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
13664bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_bus_type(%u) failed\n",
1367a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				__func__, __LINE__, repo.bus_index);
1368a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			break;
1369a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1370a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1371a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_bus_id(repo.bus_index,
1372a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			&repo.bus_id);
1373a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1374a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
13754bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_bus_id(%u) failed\n",
1376a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				__func__, __LINE__, repo.bus_index);
1377a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			continue;
1378a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1379a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1380a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (repo.bus_index != repo.bus_id)
13814bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d bus_index != bus_id\n",
1382a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				__func__, __LINE__);
1383a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1384a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		result = ps3_repository_read_bus_num_dev(repo.bus_index,
1385a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			&num_dev);
1386a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1387a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		if (result) {
13884bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			pr_devel("%s:%d read_bus_num_dev(%u) failed\n",
1389a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand				__func__, __LINE__, repo.bus_index);
1390a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			continue;
1391a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		}
1392a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
13934bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand		pr_devel("%s:%d bus_%u: bus_type %u, bus_id %lu, num_dev %u\n",
1394a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand			__func__, __LINE__, repo.bus_index, repo.bus_type,
13954bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand			(unsigned long)repo.bus_id, num_dev);
1396a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1397a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand		dump_device_info(&repo, num_dev);
1398a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	}
1399a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
14004bf94ae39c5bfab234ab1bd8b2b44d1f0d2dd5abGeoff Levand	pr_devel(" <- %s:%d\n", __func__, __LINE__);
1401a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand	return result;
1402a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand}
1403a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand
1404a3323d1a52ec5b70821590e4beaaf13c466fd396Geoff Levand#endif /* defined(DEBUG) */
1405