1224106Snwhitehorn/*- 2224106Snwhitehorn * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru) 3224106Snwhitehorn * All rights reserved. 4224106Snwhitehorn * 5224106Snwhitehorn * Redistribution and use in source and binary forms, with or without 6224106Snwhitehorn * modification, are permitted provided that the following conditions 7224106Snwhitehorn * are met: 8224106Snwhitehorn * 1. Redistributions of source code must retain the above copyright 9224106Snwhitehorn * notice, this list of conditions and the following disclaimer. 10224106Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 11224106Snwhitehorn * notice, this list of conditions and the following disclaimer in the 12224106Snwhitehorn * documentation and/or other materials provided with the distribution. 13224106Snwhitehorn * 14224106Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15224106Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16224106Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17224106Snwhitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18224106Snwhitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19224106Snwhitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20224106Snwhitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21224106Snwhitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22224106Snwhitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23224106Snwhitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24224106Snwhitehorn * 25224106Snwhitehorn * $FreeBSD$ 26224106Snwhitehorn */ 27224106Snwhitehorn 28224106Snwhitehorn#include <stand.h> 29224106Snwhitehorn 30224106Snwhitehorn#include "lv1call.h" 31224106Snwhitehorn#include "ps3.h" 32224106Snwhitehorn#include "ps3repo.h" 33224106Snwhitehorn 34224106Snwhitehornstatic uint64_t make_n1(const char *text, unsigned int index) 35224106Snwhitehorn{ 36224106Snwhitehorn uint64_t n1; 37224106Snwhitehorn 38224106Snwhitehorn n1 = 0; 39224106Snwhitehorn strncpy((char *) &n1, text, sizeof(n1)); 40224106Snwhitehorn n1 = (n1 >> 32) + index; 41224106Snwhitehorn 42224106Snwhitehorn return n1; 43224106Snwhitehorn} 44224106Snwhitehorn 45224106Snwhitehornstatic uint64_t make_n(const char *text, unsigned int index) 46224106Snwhitehorn{ 47224106Snwhitehorn uint64_t n; 48224106Snwhitehorn 49224106Snwhitehorn n = 0; 50224106Snwhitehorn strncpy((char *) &n, text, sizeof(n)); 51224106Snwhitehorn n = n + index; 52224106Snwhitehorn 53224106Snwhitehorn return n; 54224106Snwhitehorn} 55224106Snwhitehorn 56224106Snwhitehornint ps3repo_read_bus_type(unsigned int bus_index, uint64_t *bus_type) 57224106Snwhitehorn{ 58224106Snwhitehorn uint64_t v1, v2; 59224106Snwhitehorn int err; 60224106Snwhitehorn 61224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 62224106Snwhitehorn make_n("type", 0), 0, 0, &v1, &v2); 63224106Snwhitehorn 64224106Snwhitehorn *bus_type = v1; 65224106Snwhitehorn 66224106Snwhitehorn return err; 67224106Snwhitehorn} 68224106Snwhitehorn 69224106Snwhitehornint ps3repo_read_bus_id(unsigned int bus_index, uint64_t *bus_id) 70224106Snwhitehorn{ 71224106Snwhitehorn uint64_t v1, v2; 72224106Snwhitehorn int err; 73224106Snwhitehorn 74224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 75224106Snwhitehorn make_n("id", 0), 0, 0, &v1, &v2); 76224106Snwhitehorn 77224106Snwhitehorn *bus_id = v1; 78224106Snwhitehorn 79224106Snwhitehorn return err; 80224106Snwhitehorn} 81224106Snwhitehorn 82224106Snwhitehornint ps3repo_read_bus_num_dev(unsigned int bus_index, uint64_t *num_dev) 83224106Snwhitehorn{ 84224106Snwhitehorn uint64_t v1, v2; 85224106Snwhitehorn int err; 86224106Snwhitehorn 87224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 88224106Snwhitehorn make_n("num_dev", 0), 0, 0, &v1, &v2); 89224106Snwhitehorn 90224106Snwhitehorn *num_dev = v1; 91224106Snwhitehorn 92224106Snwhitehorn return err; 93224106Snwhitehorn} 94224106Snwhitehorn 95224106Snwhitehornint ps3repo_read_bus_dev_type(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_type) 96224106Snwhitehorn{ 97224106Snwhitehorn uint64_t v1, v2; 98224106Snwhitehorn int err; 99224106Snwhitehorn 100224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 101224106Snwhitehorn make_n("dev", dev_index), make_n("type", 0), 0, &v1, &v2); 102224106Snwhitehorn 103224106Snwhitehorn *dev_type = v1; 104224106Snwhitehorn 105224106Snwhitehorn return err; 106224106Snwhitehorn} 107224106Snwhitehorn 108224106Snwhitehornint ps3repo_read_bus_dev_id(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_id) 109224106Snwhitehorn{ 110224106Snwhitehorn uint64_t v1, v2; 111224106Snwhitehorn int err; 112224106Snwhitehorn 113224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 114224106Snwhitehorn make_n("dev", dev_index), make_n("id", 0), 0, &v1, &v2); 115224106Snwhitehorn 116224106Snwhitehorn *dev_id = v1; 117224106Snwhitehorn 118224106Snwhitehorn return err; 119224106Snwhitehorn} 120224106Snwhitehorn 121224106Snwhitehornint ps3repo_read_bus_dev_blk_size(unsigned int bus_index, unsigned int dev_index, uint64_t *blk_size) 122224106Snwhitehorn{ 123224106Snwhitehorn uint64_t v1, v2; 124224106Snwhitehorn int err; 125224106Snwhitehorn 126224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 127224106Snwhitehorn make_n("dev", dev_index), make_n("blk_size", 0), 0, &v1, &v2); 128224106Snwhitehorn 129224106Snwhitehorn *blk_size = v1; 130224106Snwhitehorn 131224106Snwhitehorn return err; 132224106Snwhitehorn} 133224106Snwhitehorn 134224106Snwhitehornint ps3repo_read_bus_dev_nblocks(unsigned int bus_index, unsigned int dev_index, uint64_t *nblocks) 135224106Snwhitehorn{ 136224106Snwhitehorn uint64_t v1, v2; 137224106Snwhitehorn int err; 138224106Snwhitehorn 139224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 140224106Snwhitehorn make_n("dev", dev_index), make_n("n_blocks", 0), 0, &v1, &v2); 141224106Snwhitehorn 142224106Snwhitehorn *nblocks = v1; 143224106Snwhitehorn 144224106Snwhitehorn return err; 145224106Snwhitehorn} 146224106Snwhitehorn 147224106Snwhitehornint ps3repo_read_bus_dev_nregs(unsigned int bus_index, unsigned int dev_index, uint64_t *nregs) 148224106Snwhitehorn{ 149224106Snwhitehorn uint64_t v1, v2; 150224106Snwhitehorn int err; 151224106Snwhitehorn 152224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 153224106Snwhitehorn make_n("dev", dev_index), make_n("n_regs", 0), 0, &v1, &v2); 154224106Snwhitehorn 155224106Snwhitehorn *nregs = v1; 156224106Snwhitehorn 157224106Snwhitehorn return err; 158224106Snwhitehorn} 159224106Snwhitehorn 160224106Snwhitehornint ps3repo_read_bus_dev_reg_id(unsigned int bus_index, unsigned int dev_index, 161224106Snwhitehorn unsigned int reg_index, uint64_t *reg_id) 162224106Snwhitehorn{ 163224106Snwhitehorn uint64_t v1, v2; 164224106Snwhitehorn int err; 165224106Snwhitehorn 166224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 167224106Snwhitehorn make_n("dev", dev_index), make_n("region", reg_index), make_n("id", 0), &v1, &v2); 168224106Snwhitehorn 169224106Snwhitehorn *reg_id = v1; 170224106Snwhitehorn 171224106Snwhitehorn return err; 172224106Snwhitehorn} 173224106Snwhitehorn 174224106Snwhitehornint ps3repo_read_bus_dev_reg_start(unsigned int bus_index, unsigned int dev_index, 175224106Snwhitehorn unsigned int reg_index, uint64_t *reg_start) 176224106Snwhitehorn{ 177224106Snwhitehorn uint64_t v1, v2; 178224106Snwhitehorn int err; 179224106Snwhitehorn 180224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 181224106Snwhitehorn make_n("dev", dev_index), make_n("region", reg_index), make_n("start", 0), &v1, &v2); 182224106Snwhitehorn 183224106Snwhitehorn *reg_start = v1; 184224106Snwhitehorn 185224106Snwhitehorn return err; 186224106Snwhitehorn} 187224106Snwhitehorn 188224106Snwhitehornint ps3repo_read_bus_dev_reg_size(unsigned int bus_index, unsigned int dev_index, 189224106Snwhitehorn unsigned int reg_index, uint64_t *reg_size) 190224106Snwhitehorn{ 191224106Snwhitehorn uint64_t v1, v2; 192224106Snwhitehorn int err; 193224106Snwhitehorn 194224106Snwhitehorn err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index), 195224106Snwhitehorn make_n("dev", dev_index), make_n("region", reg_index), make_n("size", 0), &v1, &v2); 196224106Snwhitehorn 197224106Snwhitehorn *reg_size = v1; 198224106Snwhitehorn 199224106Snwhitehorn return err; 200224106Snwhitehorn} 201224106Snwhitehorn 202224106Snwhitehornint ps3repo_find_bus_by_type(uint64_t bus_type, unsigned int *bus_index) 203224106Snwhitehorn{ 204224106Snwhitehorn unsigned int i; 205224106Snwhitehorn uint64_t type; 206224106Snwhitehorn int err; 207224106Snwhitehorn 208224106Snwhitehorn for (i = 0; i < 10; i++) { 209224106Snwhitehorn err = ps3repo_read_bus_type(i, &type); 210224106Snwhitehorn if (err) { 211224106Snwhitehorn *bus_index = (unsigned int) -1; 212224106Snwhitehorn return err; 213224106Snwhitehorn } 214224106Snwhitehorn 215224106Snwhitehorn if (type == bus_type) { 216224106Snwhitehorn *bus_index = i; 217224106Snwhitehorn return 0; 218224106Snwhitehorn } 219224106Snwhitehorn } 220224106Snwhitehorn 221224106Snwhitehorn *bus_index = (unsigned int) -1; 222224106Snwhitehorn 223224106Snwhitehorn return ENODEV; 224224106Snwhitehorn} 225224106Snwhitehorn 226224106Snwhitehornint ps3repo_find_bus_dev_by_type(unsigned int bus_index, uint64_t dev_type, 227224106Snwhitehorn unsigned int *dev_index) 228224106Snwhitehorn{ 229224106Snwhitehorn unsigned int i; 230224106Snwhitehorn uint64_t type; 231224106Snwhitehorn int err; 232224106Snwhitehorn 233224106Snwhitehorn for (i = 0; i < 10; i++) { 234224106Snwhitehorn err = ps3repo_read_bus_dev_type(bus_index, i, &type); 235224106Snwhitehorn if (err) { 236224106Snwhitehorn *dev_index = (unsigned int) -1; 237224106Snwhitehorn return err; 238224106Snwhitehorn } 239224106Snwhitehorn 240224106Snwhitehorn if (type == dev_type) { 241224106Snwhitehorn *dev_index = i; 242224106Snwhitehorn return 0; 243224106Snwhitehorn } 244224106Snwhitehorn } 245224106Snwhitehorn 246224106Snwhitehorn *dev_index = (unsigned int) -1; 247224106Snwhitehorn 248224106Snwhitehorn return ENODEV; 249224106Snwhitehorn} 250