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