repository.c revision 6c7be7d385f4911895877e0f0697c598f600136f
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/ps3.h>
226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#include <asm/lv1call.h>
236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandenum ps3_vendor_id {
256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_VENDOR_ID_NONE = 0,
266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_VENDOR_ID_SONY = 0x8000000000000000UL,
276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand};
286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandenum ps3_lpar_id {
306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_LPAR_ID_CURRENT = 0,
316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	PS3_LPAR_ID_PME = 1,
326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand};
336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_field(_a, _b) _dump_field(_a, _b, __func__, __LINE__)
356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic void _dump_field(const char *hdr, u64 n, const char* func, int line)
366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#if defined(DEBUG)
386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	char s[16];
396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	const char *const in = (const char *)&n;
406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int i;
416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (i = 0; i < 8; i++)
436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		s[i] = (in[i] <= 126 && in[i] >= 32) ? in[i] : '.';
446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	s[i] = 0;
456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: %s%016lx : %s\n", func, line, hdr, n, s);
476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#endif
486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_node_name(_a, _b, _c, _d, _e) \
516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__)
526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic void _dump_node_name (unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 n4, const char* func, int line)
546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n1: ", n1, func, line);
576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n2: ", n2, func, line);
586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n3: ", n3, func, line);
596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n4: ", n4, func, line);
606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#define dump_node(_a, _b, _c, _d, _e, _f, _g) \
636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)
646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1, u64 v2, const char* func, int line)
666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n1: ", n1, func, line);
696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n2: ", n2, func, line);
706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n3: ", n3, func, line);
716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	_dump_field("n4: ", n4, func, line);
726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: v1: %016lx\n", func, line, v1);
736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: v2: %016lx\n", func, line, v2);
746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * make_first_field - Make the first field of a repository node name.
786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @text: Text portion of the field.
796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @index: Numeric index portion of the field.  Use zero for 'don't care'.
806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * This routine sets the vendor id to zero (non-vendor specific).
826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * Returns field value.
836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic u64 make_first_field(const char *text, u64 index)
866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 n;
886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	strncpy((char *)&n, text, 8);
906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return PS3_VENDOR_ID_NONE + (n >> 32) + index;
916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * make_field - Make subsequent fields of a repository node name.
956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @text: Text portion of the field.  Use "" for 'don't care'.
966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @index: Numeric index portion of the field.  Use zero for 'don't care'.
976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *
986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * Returns field value.
996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
1006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic u64 make_field(const char *text, u64 index)
1026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 n;
1046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	strncpy((char *)&n, text, 8);
1066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return n + index;
1076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
1106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * read_node - Read a repository node from raw fields.
1116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n1: First field of node name.
1126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n2: Second field of node name.  Use zero for 'don't care'.
1136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n3: Third field of node name.  Use zero for 'don't care'.
1146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @n4: Fourth field of node name.  Use zero for 'don't care'.
1156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @v1: First repository value (high word).
1166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @v2: Second repository value (low word).  Optional parameter, use zero
1176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand *      for 'don't care'.
1186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
1196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic int read_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
1216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 *_v1, u64 *_v2)
1226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
1256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v2;
1266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (lpar_id == PS3_LPAR_ID_CURRENT) {
1286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 id;
1296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		lv1_get_logical_partition_id(&id);
1306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		lpar_id = id;
1316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
1326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = lv1_get_repository_node_value(lpar_id, n1, n2, n3, n4, &v1,
1346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v2);
1356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
1376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d: lv1_get_repository_node_value failed: %s\n",
1386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, ps3_result(result));
1396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		dump_node_name(lpar_id, n1, n2, n3, n4);
1406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		return result;
1416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
1426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	dump_node(lpar_id, n1, n2, n3, n4, v1, v2);
1446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (_v1)
1466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		*_v1 = v1;
1476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (_v2)
1486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		*_v2 = v2;
1496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (v1 && !_v1)
1516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d: warning: discarding non-zero v1: %016lx\n",
1526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, v1);
1536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (v2 && !_v2)
1546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d: warning: discarding non-zero v2: %016lx\n",
1556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, v2);
1566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
1586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
1616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 *value)
1626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
1646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field(bus_str, 0),
1666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
1676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		value, 0);
1686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id)
1716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
1746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v2; /* unused */
1756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
1776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("id", 0),
1796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
1806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, &v2);
1816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*bus_id = v1;
1826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
1836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_type(unsigned int bus_index,
1866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_bus_type *bus_type)
1876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
1886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
1896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
1906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
1916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
1926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
1936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
1946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
1956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
1966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*bus_type = v1;
1976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
1986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_bus_num_dev(unsigned int bus_index,
2016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int *num_dev)
2026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
2056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("num_dev", 0),
2096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
2106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
2116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_dev = v1;
2126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_str(unsigned int bus_index,
2166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, const char *dev_str, u64 *value)
2176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
2196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field(dev_str, 0),
2226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
2236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		value, 0);
2246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
2276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int *dev_id)
2286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
2316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("id", 0),
2366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
2376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
2386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*dev_id = v1;
2396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_type(unsigned int bus_index,
2436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, enum ps3_dev_type *dev_type)
2446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
2476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
2526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
2536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
2546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*dev_type = v1;
2556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_intr(unsigned int bus_index,
2596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, unsigned int intr_index,
260eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_interrupt_type *intr_type, unsigned int* interrupt_id)
2616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
2646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v2;
2656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("intr", intr_index),
2706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
2716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, &v2);
2726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*intr_type = v1;
2736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*interrupt_id = v2;
2746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg_type(unsigned int bus_index,
278eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	unsigned int dev_index, unsigned int reg_index,
279eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type *reg_type)
2806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
2826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
2836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
2856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
2876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("reg", reg_index),
2886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("type", 0),
2896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
2906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*reg_type = v1;
2916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
2926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
2936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
2946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg_addr(unsigned int bus_index,
2956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index, unsigned int reg_index, u64 *bus_addr, u64 *len)
2966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
2976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
2986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bus", bus_index),
2996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("dev", dev_index),
3006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("reg", reg_index),
3016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("data", 0),
3026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		bus_addr, len);
3036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_dev_reg(unsigned int bus_index,
306eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	unsigned int dev_index, unsigned int reg_index,
307eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type *reg_type, u64 *bus_addr, u64 *len)
3086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
3096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = ps3_repository_read_dev_reg_type(bus_index, dev_index,
3106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		reg_index, reg_type);
3116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
3126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_dev_reg_addr(bus_index, dev_index,
3136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		reg_index, bus_addr, len);
3146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#if defined(DEBUG)
3176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_dump_resource_info(unsigned int bus_index,
3186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index)
3196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
3206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
3216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int res_index;
3226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" -> %s:%d: (%u:%u)\n", __func__, __LINE__,
3246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		bus_index, dev_index);
3256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
3276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_interrupt_type intr_type;
3286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int interrupt_id;
3296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_intr(bus_index, dev_index,
3316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			res_index, &intr_type, &interrupt_id);
3326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
3346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			if (result !=  LV1_NO_ENTRY)
3356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				pr_debug("%s:%d ps3_repository_read_dev_intr"
3366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand					" (%u:%u) failed\n", __func__, __LINE__,
3376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand					bus_index, dev_index);
3386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
3396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
3406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d (%u:%u) intr_type %u, interrupt_id %u\n",
3426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, bus_index, dev_index, intr_type,
3436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			interrupt_id);
3446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
3456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
347eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		enum ps3_reg_type reg_type;
3486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 bus_addr;
3496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 len;
3506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_reg(bus_index, dev_index,
3526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			res_index, &reg_type, &bus_addr, &len);
3536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
3556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			if (result !=  LV1_NO_ENTRY)
3566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				pr_debug("%s:%d ps3_repository_read_dev_reg"
3576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand					" (%u:%u) failed\n", __func__, __LINE__,
3586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand					bus_index, dev_index);
3596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
3606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
3616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d (%u:%u) reg_type %u, bus_addr %lxh, len %lxh\n",
3636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, bus_index, dev_index, reg_type,
3646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			bus_addr, len);
3656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
3666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" <- %s:%d\n", __func__, __LINE__);
3686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
3696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
3706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
3716c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenstatic int dump_stor_dev_info(unsigned int bus_index, unsigned int dev_index)
3726c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
3736c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result = 0;
3746c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int num_regions, region_index;
3756c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	u64 port, blk_size, num_blocks;
3766c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3776c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	pr_debug(" -> %s:%d: (%u:%u)\n", __func__, __LINE__,
3786c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		bus_index, dev_index);
3796c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3806c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_info(bus_index, dev_index, &port,
3816c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		&blk_size, &num_blocks, &num_regions);
3826c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result) {
3836c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		pr_debug("%s:%d ps3_repository_read_stor_dev_info"
3846c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			" (%u:%u) failed\n", __func__, __LINE__,
3856c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			bus_index, dev_index);
3866c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		goto out;
3876c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	}
3886c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3896c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	pr_debug("%s:%d  (%u:%u): port %lu, blk_size %lu, num_blocks "
3906c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		 "%lu, num_regions %u\n",
3916c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		 __func__, __LINE__, bus_index, dev_index, port,
3926c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		 blk_size, num_blocks, num_regions);
3936c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3946c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	for (region_index = 0; region_index < num_regions; region_index++) {
3956c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		unsigned int region_id;
3966c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		u64 region_start, region_size;
3976c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
3986c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		result = ps3_repository_read_stor_dev_region(bus_index,
3996c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			dev_index, region_index, &region_id, &region_start,
4006c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			&region_size);
4016c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		if (result) {
4026c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			 pr_debug("%s:%d ps3_repository_read_stor_dev_region"
4036c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven				  " (%u:%u) failed\n", __func__, __LINE__,
4046c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven				  bus_index, dev_index);
4056c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			break;
4066c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		}
4076c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
4086c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		pr_debug("%s:%d (%u:%u) region_id %u, start %lxh, size %lxh\n",
4096c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			 __func__, __LINE__, bus_index, dev_index, region_id,
4106c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			 region_start, region_size);
4116c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	}
4126c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
4136c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenout:
4146c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	pr_debug(" <- %s:%d\n", __func__, __LINE__);
4156c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
4166c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
4176c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
4186c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenstatic int dump_device_info(unsigned int bus_index, enum ps3_bus_type bus_type,
4196c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			    unsigned int num_dev)
4206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
4216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
4226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index;
4236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" -> %s:%d: bus_%u\n", __func__, __LINE__, bus_index);
4256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (dev_index = 0; dev_index < num_dev; dev_index++) {
4276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_dev_type dev_type;
4286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int dev_id;
4296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_type(bus_index, dev_index,
4316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			&dev_type);
4326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d ps3_repository_read_dev_type"
4356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				" (%u:%u) failed\n", __func__, __LINE__,
4366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				bus_index, dev_index);
4376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
4386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
4396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_id(bus_index, dev_index,
4416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			&dev_id);
4426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d ps3_repository_read_dev_id"
4456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				" (%u:%u) failed\n", __func__, __LINE__,
4466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				bus_index, dev_index);
4476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			continue;
4486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
4496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d  (%u:%u): dev_type %u, dev_id %u\n", __func__,
4516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__LINE__, bus_index, dev_index, dev_type, dev_id);
4526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		ps3_repository_dump_resource_info(bus_index, dev_index);
4546c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
4556c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		if (bus_type == PS3_BUS_TYPE_STORAGE)
4566c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven			dump_stor_dev_info(bus_index, dev_index);
4576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
4586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" <- %s:%d\n", __func__, __LINE__);
4606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
4616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
4626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_dump_bus_info(void)
4646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
4656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
4666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int bus_index;
4676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" -> %s:%d\n", __func__, __LINE__);
4696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (bus_index = 0; bus_index < 10; bus_index++) {
4716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_bus_type bus_type;
4726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int bus_id;
4736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int num_dev;
4746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_bus_type(bus_index, &bus_type);
4766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_bus_type(%u) failed\n",
4796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__, bus_index);
4806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
4816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
4826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_bus_id(bus_index, &bus_id);
4846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_bus_id(%u) failed\n",
4876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__, bus_index);
4886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			continue;
4896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
4906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (bus_index != bus_id)
4926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d bus_index != bus_id\n",
4936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
4946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_bus_num_dev(bus_index, &num_dev);
4966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
4976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
4986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_bus_num_dev(%u) failed\n",
4996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__, bus_index);
5006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			continue;
5016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d bus_%u: bus_type %u, bus_id %u, num_dev %u\n",
5046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__, bus_index, bus_type, bus_id,
5056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			num_dev);
5066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5076c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		dump_device_info(bus_index, bus_type, num_dev);
5086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug(" <- %s:%d\n", __func__, __LINE__);
5116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
5126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
5136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand#endif /* defined(DEBUG) */
5146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandstatic int find_device(unsigned int bus_index, unsigned int num_dev,
5166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int start_dev_index, enum ps3_dev_type dev_type,
5176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	struct ps3_repository_device *dev)
5186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
5196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
5206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int dev_index;
5216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: find dev_type %u\n", __func__, __LINE__, dev_type);
5236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	dev->dev_index = UINT_MAX;
5256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (dev_index = start_dev_index; dev_index < num_dev; dev_index++) {
5276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_dev_type x;
5286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_type(bus_index, dev_index,
5306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			&x);
5316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
5336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_dev_type failed\n",
5346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
5356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
5366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (x == dev_type)
5396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
5406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
542eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (dev_index == num_dev)
543eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -1;
5446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: found dev_type %u at dev_index %u\n",
5466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, dev_type, dev_index);
5476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_dev_id(bus_index, dev_index,
5496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&dev->did.dev_id);
5506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
5526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d read_dev_id failed\n",
5536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__);
5546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		return result;
5556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	dev->dev_index = dev_index;
5586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d found: dev_id %u\n", __func__, __LINE__,
5606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		dev->did.dev_id);
5616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
5636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
5646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_find_device (enum ps3_bus_type bus_type,
5666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_dev_type dev_type,
5676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	const struct ps3_repository_device *start_dev,
5686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	struct ps3_repository_device *dev)
5696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
5706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
5716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int bus_index;
5726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int num_dev;
5736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: find bus_type %u, dev_type %u\n", __func__, __LINE__,
5756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		bus_type, dev_type);
5766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
577eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	BUG_ON(start_dev && start_dev->bus_index > 10);
5786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (bus_index = start_dev ? start_dev->bus_index : 0; bus_index < 10;
5806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		bus_index++) {
5816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_bus_type x;
5826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_bus_type(bus_index, &x);
5846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
5866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_bus_type failed\n",
5876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
588eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand			dev->bus_index = UINT_MAX;
5896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
5906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
5916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (x == bus_type)
5926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
5936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
5946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
595eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (bus_index >= 10)
596eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -ENODEV;
5976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
5986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: found bus_type %u at bus_index %u\n",
5996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, bus_type, bus_index);
6006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_bus_num_dev(bus_index, &num_dev);
6026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
6046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d read_bus_num_dev failed\n",
6056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__);
6066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		return result;
6076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
6086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = find_device(bus_index, num_dev, start_dev
6106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		? start_dev->dev_index + 1 : 0, dev_type, dev);
6116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
6136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d get_did failed\n", __func__, __LINE__);
6146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		return result;
6156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
6166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_bus_id(bus_index, &dev->did.bus_id);
6186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	if (result) {
6206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		pr_debug("%s:%d read_bus_id failed\n",
6216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			__func__, __LINE__);
6226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		return result;
6236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
6246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	dev->bus_index = bus_index;
6266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d found: bus_id %u, dev_id %u\n",
6286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, dev->did.bus_id, dev->did.dev_id);
6296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
6316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
6326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_find_interrupt(const struct ps3_repository_device *dev,
6346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_interrupt_type intr_type, unsigned int *interrupt_id)
6356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
6366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
6376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int res_index;
6386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: find intr_type %u\n", __func__, __LINE__, intr_type);
6406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*interrupt_id = UINT_MAX;
6426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
6446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		enum ps3_interrupt_type t;
6456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		unsigned int id;
6466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_intr(dev->bus_index,
6486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			dev->dev_index, res_index, &t, &id);
6496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
6516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_dev_intr failed\n",
6526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
6536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
6546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
6556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (t == intr_type) {
6576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*interrupt_id = id;
6586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
6596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
6606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
6616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
662eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (res_index == 10)
663eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -ENODEV;
6646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: found intr_type %u at res_index %u\n",
6666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, intr_type, res_index);
6676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
6696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
6706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
671eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levandint ps3_repository_find_reg(const struct ps3_repository_device *dev,
672eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	enum ps3_reg_type reg_type, u64 *bus_addr, u64 *len)
6736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
6746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result = 0;
6756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	unsigned int res_index;
6766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: find reg_type %u\n", __func__, __LINE__, reg_type);
6786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*bus_addr = *len = 0;
6806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	for (res_index = 0; res_index < 10; res_index++) {
682eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		enum ps3_reg_type t;
6836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 a;
6846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		u64 l;
6856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		result = ps3_repository_read_dev_reg(dev->bus_index,
6876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			dev->dev_index, res_index, &t, &a, &l);
6886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (result) {
6906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			pr_debug("%s:%d read_dev_reg failed\n",
6916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand				__func__, __LINE__);
6926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			return result;
6936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
6946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
6956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		if (t == reg_type) {
6966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*bus_addr = a;
6976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			*len = l;
6986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand			break;
6996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		}
7006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	}
7016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
702eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand	if (res_index == 10)
703eebb81c13aa831a623e903bbae97a23fe9be93ebGeoff Levand		return -ENODEV;
7046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	pr_debug("%s:%d: found reg_type %u at res_index %u\n",
7066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		__func__, __LINE__, reg_type, res_index);
7076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
7096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
7106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
7116c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_port(unsigned int bus_index,
7126c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *port)
7136c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7146c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
7156c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
7166c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
7176c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("port", 0),
7186c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		0, port, 0);
7196c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7206c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7216c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
7226c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *blk_size)
7236c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7246c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
7256c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
7266c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
7276c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("blk_size", 0),
7286c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		0, blk_size, 0);
7296c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7306c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7316c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
7326c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *num_blocks)
7336c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7346c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
7356c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
7366c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
7376c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("n_blocks", 0),
7386c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		0, num_blocks, 0);
7396c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7406c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7416c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
7426c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int *num_regions)
7436c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7446c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
7456c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	u64 v1;
7466c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7476c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = read_node(PS3_LPAR_ID_PME,
7486c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_first_field("bus", bus_index),
7496c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("dev", dev_index),
7506c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		make_field("n_regs", 0),
7516c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		0, &v1, 0);
7526c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	*num_regions = v1;
7536c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
7546c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7556c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7566c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_id(unsigned int bus_index,
7576c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index,
7586c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int *region_id)
7596c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7606c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
7616c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	u64 v1;
7626c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7636c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = read_node(PS3_LPAR_ID_PME,
7646c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
7656c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
7666c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
7676c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("id", 0),
7686c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    &v1, 0);
7696c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	*region_id = v1;
7706c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
7716c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7726c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7736c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_size(unsigned int bus_index,
7746c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index,	unsigned int region_index, u64 *region_size)
7756c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7766c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
7776c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
7786c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
7796c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
7806c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("size", 0),
7816c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    region_size, 0);
7826c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7836c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7846c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
7856c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index, u64 *region_start)
7866c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7876c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return read_node(PS3_LPAR_ID_PME,
7886c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_first_field("bus", bus_index),
7896c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("dev", dev_index),
7906c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("region", region_index),
7916c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    make_field("start", 0),
7926c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    region_start, 0);
7936c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
7946c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
7956c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_info(unsigned int bus_index,
7966c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, u64 *port, u64 *blk_size,
7976c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	u64 *num_blocks, unsigned int *num_regions)
7986c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
7996c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
8006c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8016c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_port(bus_index, dev_index, port);
8026c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
8036c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
8046c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8056c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_blk_size(bus_index, dev_index,
8066c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		blk_size);
8076c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
8086c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
8096c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8106c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_num_blocks(bus_index, dev_index,
8116c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		num_blocks);
8126c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
8136c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
8146c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8156c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_num_regions(bus_index, dev_index,
8166c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		num_regions);
8176c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
8186c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
8196c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8206c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoevenint ps3_repository_read_stor_dev_region(unsigned int bus_index,
8216c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int dev_index, unsigned int region_index,
8226c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	unsigned int *region_id, u64 *region_start, u64 *region_size)
8236c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven{
8246c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	int result;
8256c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8266c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_id(bus_index, dev_index,
8276c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_id);
8286c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
8296c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
8306c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8316c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_start(bus_index, dev_index,
8326c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_start);
8336c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	if (result)
8346c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	    return result;
8356c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8366c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	result = ps3_repository_read_stor_dev_region_size(bus_index, dev_index,
8376c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven		region_index, region_size);
8386c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven	return result;
8396c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven}
8406c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven
8416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
8426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
8446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
8456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("pu", 0),
8466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		ppe_id,
8476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("rm_size", 0),
8486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		rm_size, 0);
8496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_region_total(u64 *region_total)
8526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
8546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
8556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("rgntotal", 0),
8566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
8576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		region_total, 0);
8586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
8616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_mm_info - Read mm info for single pu system.
8626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @rm_base: Real mode memory base address.
8636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @rm_size: Real mode memory size.
8646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @region_total: Maximum memory region size.
8656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
8666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_mm_info(u64 *rm_base, u64 *rm_size, u64 *region_total)
8686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
8706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 ppe_id;
8716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	lv1_get_logical_ppe_id(&ppe_id);
8736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*rm_base = 0;
8746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_rm_size(ppe_id, rm_size);
8756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
8766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_region_total(region_total);
8776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
8806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_num_spu_reserved - Number of physical spus reserved.
8816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @num_spu: Number of physical spus.
8826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
8836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_spu_reserved(unsigned int *num_spu_reserved)
8856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
8866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
8876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
8886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
8906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
8916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spun", 0),
8926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
8936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
8946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_spu_reserved = v1;
8956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
8966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
8976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
8986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
8996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_num_spu_resource_id - Number of spu resource reservations.
9006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @num_resource_id: Number of spu resource ids.
9016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
9026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_spu_resource_id(unsigned int *num_resource_id)
9046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
9076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
9096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spursvn", 0),
9116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0, 0,
9126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
9136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_resource_id = v1;
9146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
9186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * ps3_repository_read_spu_resource_id - spu resource reservation id value.
9196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @res_index: Resource reservation index.
9206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @resource_type: Resource reservation type.
9216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand * @resource_id: Resource reservation id.
9226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand */
9236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_spu_resource_id(unsigned int res_index,
9256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	enum ps3_spu_resource_type* resource_type, unsigned int *resource_id)
9266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9286e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
9296e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v2;
9306e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9316e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
9326e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9336e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("spursv", 0),
9346e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		res_index,
9356e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9366e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, &v2);
9376e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*resource_type = v1;
9386e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*resource_id = v2;
9396e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9406e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9416e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9426e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_boot_dat_address(u64 *address)
9436e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9446e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_CURRENT,
9456e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9466e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("boot_dat", 0),
9476e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("address", 0),
9486e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9496e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		address, 0);
9506e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9516e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9526e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_boot_dat_size(unsigned int *size)
9536e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9546e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9556e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
9566e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9576e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_CURRENT,
9586e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("bi", 0),
9596e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("boot_dat", 0),
9606e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("size", 0),
9616e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9626e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
9636e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*size = v1;
9646e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9656e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9666e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9676e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand/**
9686e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * ps3_repository_read_boot_dat_info - Get address and size of cell_ext_os_area.
9696e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * address: lpar address of cell_ext_os_area
9706e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  * @size: size of cell_ext_os_area
9716e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand  */
9726e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9736e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_boot_dat_info(u64 *lpar_addr, unsigned int *size)
9746e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9756e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9766e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9776e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*size = 0;
9786e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_boot_dat_address(lpar_addr);
9796e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
9806e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_boot_dat_size(size);
9816e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9826e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9836e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_num_be(unsigned int *num_be)
9846e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
9856e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
9866e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 v1;
9876e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9886e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = read_node(PS3_LPAR_ID_PME,
9896e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("ben", 0),
9906e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9916e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9926e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
9936e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		&v1, 0);
9946e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*num_be = v1;
9956e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result;
9966e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
9976e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
9986e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id)
9996e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10006e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
10016e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("be", be_index),
10026e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10036e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10046e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10056e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		node_id, 0);
10066e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
10076e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
10086e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq)
10096e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10106e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return read_node(PS3_LPAR_ID_PME,
10116e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_first_field("be", 0),
10126e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		node_id,
10136e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		make_field("clock", 0),
10146e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		0,
10156e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		tb_freq, 0);
10166e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
10176e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
10186e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levandint ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq)
10196e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand{
10206e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	int result;
10216e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	u64 node_id;
10226e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand
10236e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	*tb_freq = 0;
10246e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	result = ps3_repository_read_be_node_id(0, &node_id);
10256e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand	return result ? result
10266e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand		: ps3_repository_read_tb_freq(node_id, tb_freq);
10276e74b38a7ffa6b69f287ae629aae91e725916e6fGeoff Levand}
1028