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