2008-12-20 00:33:10 +00:00
|
|
|
#-
|
|
|
|
# Copyright (c) 2008 Nathan Whitehorn
|
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions
|
|
|
|
# are met:
|
|
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer.
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
|
|
# documentation and/or other materials provided with the distribution.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
# SUCH DAMAGE.
|
|
|
|
#
|
|
|
|
# $FreeBSD$
|
|
|
|
#
|
|
|
|
|
|
|
|
#include <dev/ofw/openfirm.h>
|
|
|
|
#include <dev/ofw/ofwvar.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @defgroup OFW ofw - KObj methods for Open Firmware RTAS implementations
|
|
|
|
* @brief A set of methods to implement the Open Firmware client side interface.
|
2009-06-14 00:05:38 +00:00
|
|
|
* @{
|
2008-12-20 00:33:10 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
INTERFACE ofw;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Initialize OFW client interface
|
|
|
|
*
|
|
|
|
* @param _cookie A handle to the client interface, generally the OF
|
|
|
|
* callback routine.
|
|
|
|
*/
|
2010-05-28 10:43:56 +00:00
|
|
|
METHOD int init {
|
2008-12-20 00:33:10 +00:00
|
|
|
ofw_t _ofw;
|
|
|
|
void *_cookie;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return next sibling of node.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
*/
|
|
|
|
METHOD phandle_t peer {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return parent of node.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
*/
|
|
|
|
METHOD phandle_t parent {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return first child of node.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
*/
|
|
|
|
METHOD phandle_t child {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return package corresponding to instance.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _handle Selected instance
|
|
|
|
*/
|
|
|
|
METHOD phandle_t instance_to_package {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
ihandle_t _handle;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return length of node property.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
* @param _prop Property name
|
|
|
|
*/
|
|
|
|
METHOD ssize_t getproplen {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
|
|
|
const char *_prop;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Read node property.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
* @param _prop Property name
|
|
|
|
* @param _buf Pointer to buffer
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t getprop {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
2008-12-20 00:33:10 +00:00
|
|
|
const char *_prop;
|
|
|
|
void *_buf;
|
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Get next property name.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
* @param _prop Current property name
|
|
|
|
* @param _buf Buffer for next property name
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD int nextprop {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
2008-12-20 00:33:10 +00:00
|
|
|
const char *_prop;
|
2009-06-14 00:05:38 +00:00
|
|
|
char *_buf;
|
2008-12-20 00:33:10 +00:00
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Set property.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Selected node
|
|
|
|
* @param _prop Property name
|
|
|
|
* @param _buf Value to set
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD int setprop {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
phandle_t _node;
|
|
|
|
const char *_prop;
|
2008-12-20 00:33:10 +00:00
|
|
|
const void *_buf;
|
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Canonicalize path.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _path Path to canonicalize
|
|
|
|
* @param _buf Buffer for canonicalized path
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t canon {
|
|
|
|
ofw_t _ofw;
|
|
|
|
const char *_path;
|
|
|
|
char *_buf;
|
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return phandle for named device.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _path Device path
|
|
|
|
*/
|
|
|
|
METHOD phandle_t finddevice {
|
|
|
|
ofw_t _ofw;
|
2009-06-14 00:05:38 +00:00
|
|
|
const char *_path;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return path for node instance.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _handle Instance handle
|
|
|
|
* @param _path Buffer for path
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t instance_to_path {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _handle;
|
2009-06-14 00:05:38 +00:00
|
|
|
char *_path;
|
2008-12-20 00:33:10 +00:00
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Return path for node.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _node Package node
|
|
|
|
* @param _path Buffer for path
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t package_to_path {
|
|
|
|
ofw_t _ofw;
|
|
|
|
phandle_t _node;
|
2009-06-14 00:05:38 +00:00
|
|
|
char *_path;
|
2008-12-20 00:33:10 +00:00
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
# Methods for OF method calls (optional)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Test to see if a service exists.
|
|
|
|
*
|
|
|
|
* @param _name name of the service
|
|
|
|
*/
|
|
|
|
METHOD int test {
|
|
|
|
ofw_t _ofw;
|
|
|
|
const char *_name;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Call method belonging to an instance handle.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _instance Instance handle
|
|
|
|
* @param _method Method name
|
|
|
|
* @param _nargs Number of arguments
|
|
|
|
* @param _nreturns Number of return values
|
|
|
|
* @param _args_and_returns Values for arguments, followed by returns
|
|
|
|
*/
|
|
|
|
|
|
|
|
METHOD int call_method {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _instance;
|
|
|
|
const char *_method;
|
|
|
|
int _nargs;
|
2009-06-14 00:05:38 +00:00
|
|
|
int _nreturns;
|
2008-12-20 00:33:10 +00:00
|
|
|
|
2010-07-08 14:29:23 +00:00
|
|
|
cell_t *_args_and_returns;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Interpret a forth command.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _cmd Command
|
|
|
|
* @param _nreturns Number of return values
|
|
|
|
* @param _returns Values for returns
|
|
|
|
*/
|
|
|
|
|
|
|
|
METHOD int interpret {
|
|
|
|
ofw_t _ofw;
|
|
|
|
const char *_cmd;
|
2009-06-14 00:05:38 +00:00
|
|
|
int _nreturns;
|
2010-09-11 18:55:00 +00:00
|
|
|
cell_t *_returns;
|
2008-12-20 00:33:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
# Device I/O Functions (optional)
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Open node, returning instance handle.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _path Path to node
|
|
|
|
*/
|
|
|
|
METHOD ihandle_t open {
|
|
|
|
ofw_t _ofw;
|
|
|
|
const char *_path;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Close node instance.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _instance Instance to close
|
|
|
|
*/
|
|
|
|
METHOD void close {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Read from device.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _instance Device instance
|
|
|
|
* @param _buf Buffer to read to
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t read {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _instance;
|
|
|
|
void *_buf;
|
|
|
|
size_t size;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Write to device.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _instance Device instance
|
|
|
|
* @param _buf Buffer to write from
|
|
|
|
* @param _size Size of buffer
|
|
|
|
*/
|
|
|
|
METHOD ssize_t write {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _instance;
|
|
|
|
const void *_buf;
|
|
|
|
size_t size;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Seek device.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _instance Device instance
|
|
|
|
* @param _off Offset to which to seek
|
|
|
|
*/
|
|
|
|
METHOD int seek {
|
|
|
|
ofw_t _ofw;
|
|
|
|
ihandle_t _instance;
|
|
|
|
uint64_t _off;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Open Firmware memory management
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Claim virtual memory.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _addr Requested memory location (NULL for first available)
|
|
|
|
* @param _size Requested size in bytes
|
|
|
|
* @param _align Requested alignment
|
|
|
|
*/
|
|
|
|
METHOD caddr_t claim {
|
|
|
|
ofw_t _ofw;
|
|
|
|
void *_addr;
|
|
|
|
size_t _size;
|
|
|
|
u_int _align;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Release virtual memory.
|
2008-12-20 00:33:10 +00:00
|
|
|
*
|
|
|
|
* @param _addr Memory location
|
|
|
|
* @param _size Size in bytes
|
|
|
|
*/
|
|
|
|
METHOD void release {
|
|
|
|
ofw_t _ofw;
|
|
|
|
void *_addr;
|
|
|
|
size_t _size;
|
|
|
|
};
|
|
|
|
|
|
|
|
# Commands for returning control to the firmware
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Temporarily return control to firmware.
|
2008-12-20 00:33:10 +00:00
|
|
|
*/
|
|
|
|
METHOD void enter {
|
|
|
|
ofw_t _ofw;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2009-06-14 00:05:38 +00:00
|
|
|
* @brief Halt and return control to firmware.
|
2008-12-20 00:33:10 +00:00
|
|
|
*/
|
|
|
|
METHOD void exit {
|
|
|
|
ofw_t _ofw;
|
|
|
|
};
|