1 /******************************************************************************
2 * Copyright (c) 2004, 2008 IBM Corporation
4 * This program and the accompanying materials
5 * are made available under the terms of the BSD License
6 * which accompanies this distribution, and is available at
7 * http://www.opensource.org/licenses/bsd-license.php
10 * IBM Corporation - initial implementation
11 *****************************************************************************/
15 #include "rtas_board.h"
17 #include <rtas_i2c_bmc.h>
18 #include <rtas_ipmi_bmc.h>
23 short reg_get_flashside(void);
32 volatile slave_t rtas_slave_interface;
35 rtas_slave_loop(volatile slave_t * pIface)
37 uint64_t mask = pIface->id;
39 while (pIface->id != mask); {
44 asm volatile (" mr 3,%0 ; mtctr %1 ; bctr "
45 ::"r"(pIface->r3), "r"(pIface->addr));
49 rtas_fetch_slaves(rtas_args_t * pArgs)
53 uint32_t mask = pArgs->args[0] & 0xFFFFFFFE;
54 uint64_t *rtas_slave_loop_ptr = (uint64_t *)rtas_slave_loop;
57 rtas_slave_interface.id = idx | 0x100;
58 *(int *) 0x3fc0 = (int)(unsigned long) &rtas_slave_interface; // r3
59 *(int *) 0x3f80 = *rtas_slave_loop_ptr; // addr
60 *(int *) 0x3fa0 = idx | 0x100; // pid
61 while (rtas_slave_interface.id);
66 pArgs->args[pArgs->nargs] = retVal;
70 rtas_start_cpu(rtas_args_t * pArgs)
73 int idx = pArgs->args[0]; // pid
74 rtas_slave_interface.r3 = pArgs->args[2]; // r3
75 rtas_slave_interface.addr = pArgs->args[1]; // addr
77 rtas_slave_interface.id = idx | 0x100; // pid
78 while (rtas_slave_interface.id);
79 pArgs->args[pArgs->nargs] = retVal;
83 rtas_read_vpd(rtas_args_t * pArgs)
85 pArgs->args[pArgs->nargs] =
86 bmc_read_vpd((uint8_t *) (uint64_t) pArgs->args[2], pArgs->args[1],
91 rtas_write_vpd(rtas_args_t * pArgs)
93 pArgs->args[pArgs->nargs] =
94 bmc_write_vpd((uint8_t *) (uint64_t) pArgs->args[2], pArgs->args[1],
99 rtas_set_indicator(rtas_args_t * pArgs)
101 pArgs->args[pArgs->nargs] = -1;
105 rtas_event_scan(rtas_args_t * pArgs)
107 pArgs->args[pArgs->nargs] = -1;
111 rtas_stop_bootwatchdog(rtas_args_t * pArgs)
113 pArgs->args[pArgs->nargs] = bmc_stop_bootwatchdog();
117 rtas_set_bootwatchdog(rtas_args_t * pArgs)
119 pArgs->args[pArgs->nargs] = bmc_set_bootwatchdog(pArgs->args[0]);
123 rtas_set_flashside(rtas_args_t * pArgs)
125 pArgs->args[pArgs->nargs] = bmc_set_flashside(pArgs->args[0]);
129 rtas_get_flashside(rtas_args_t * pArgs)
131 int retVal = bmc_get_flashside();
132 pArgs->args[pArgs->nargs] = retVal;
136 rtas_flash_test(rtas_args_t * pArgs)
138 pArgs->args[pArgs->nargs] = -1;
142 rtas_system_reboot(rtas_args_t * pArgs)
145 pArgs->args[pArgs->nargs] = -1;
149 rtas_power_off(rtas_args_t * pArgs)
152 pArgs->args[pArgs->nargs] = -1;
156 rtas_get_blade_descr(rtas_args_t * pArgs)
158 uint8_t *buffer = (uint8_t *) (uint64_t) pArgs->args[0];
159 uint32_t maxlen = pArgs->args[1];
161 uint32_t retval = bmc_get_blade_descr(buffer, maxlen, &retlen);
162 pArgs->args[pArgs->nargs] = retlen;
163 pArgs->args[pArgs->nargs + 1] = retval;
166 // for JS20 cannot read blade descr
168 dummy_get_blade_descr(uint8_t *dst, uint32_t maxlen, uint32_t *len)
170 // to not have a warning we need to do _something_ with *dst and maxlen...
177 /* read flashside from register */
179 reg_get_flashside(void)
182 uint8_t val = load8_ci(0xf4003fe3);
198 bmc_system_reboot = ipmi_system_reboot;
199 bmc_power_off = ipmi_power_off;
200 bmc_set_flashside = ipmi_set_flashside;
201 bmc_get_flashside = reg_get_flashside;
202 bmc_stop_bootwatchdog = ipmi_oem_stop_bootwatchdog;
203 bmc_set_bootwatchdog = ipmi_oem_set_bootwatchdog;
204 bmc_read_vpd = ipmi_oem_read_vpd;
205 bmc_write_vpd = ipmi_oem_write_vpd;
206 bmc_get_blade_descr = ipmi_oem_get_blade_descr;
208 bmc_system_reboot = i2c_system_reboot;
209 bmc_power_off = i2c_power_off;
210 bmc_set_flashside = i2c_set_flashside;
211 bmc_get_flashside = i2c_get_flashside;
212 bmc_stop_bootwatchdog = i2c_stop_bootwatchdog;
213 bmc_set_bootwatchdog = i2c_set_bootwatchdog;
214 bmc_read_vpd = i2c_read_vpd;
215 bmc_write_vpd = i2c_write_vpd;
216 bmc_get_blade_descr = dummy_get_blade_descr;