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, ®_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, ®ion_id, ®ion_start, 4006c7be7d385f4911895877e0f0697c598f600136fGeert Uytterhoeven ®ion_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