/*	$NetBSD: aml_obj.h,v 1.1 2007/01/14 04:36:13 christos Exp $	*/

/*-
 * Copyright (c) 1999 Takanori Watanabe
 * Copyright (c) 1999, 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
 * 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.
 *
 *	Id: aml_obj.h,v 1.15 2000/08/09 14:47:43 iwasaki Exp 
 *	$FreeBSD: src/usr.sbin/acpi/amldb/aml/aml_obj.h,v 1.1 2000/08/24 09:33:08 takawata Exp $
 */

#ifndef _AML_OBJ_H_
#define _AML_OBJ_H_

#include <sys/queue.h>

struct aml_environ;
enum aml_objtype {
	aml_t_namestr = -3,
	aml_t_regfield,
	aml_t_objref,
	aml_t_null = 0,
	aml_t_num,
	aml_t_string,
	aml_t_buffer,
	aml_t_package,
	aml_t_device,
	aml_t_field,
	aml_t_event,
	aml_t_method,
	aml_t_mutex,
	aml_t_opregion,
	aml_t_powerres,
	aml_t_processor,
	aml_t_therm,
	aml_t_bufferfield,
	aml_t_ddbhandle,
	aml_t_debug
};

struct	aml_namestr {
	enum	aml_objtype type;	/* =aml_t_namestr */
	u_int8_t	*dp;
};

struct	aml_opregion {
	enum	aml_objtype type;
	int	space;
	int	offset;
	int	length;
};

struct	aml_num {
	enum	aml_objtype type;	/* =aml_t_num */
	int	number;
	int	constant;
};

struct	aml_package {
	enum	aml_objtype type;
	int	elements;
	union	aml_object **objects;
};

struct	aml_string {
	enum	aml_objtype type;	/* =aml_t_string */
	int	needfree;
	u_int8_t	*string;
};

struct	aml_buffer {
	enum	aml_objtype type;	/* =aml_t_buffer */
	int	size;
	u_int8_t	*data;		/* This should be free when 
					 * this object is free.
					 */
};

enum	fieldtype {
	f_t_field,
	f_t_index,
	f_t_bank
};

struct	nfieldd {
	enum	fieldtype ftype;	/* f_t_field */
	u_int8_t	*regname;	/* Namestring */
};

struct	ifieldd {
	enum	fieldtype ftype;	/* f_t_index */
	u_int8_t	*indexname;
	u_int8_t	*dataname;
};

struct	bfieldd {
	enum	fieldtype ftype;	/* f_t_bank */
	u_int8_t	*regname;
	u_int8_t	*bankname;
	u_int32_t	bankvalue;
};

struct	aml_field {
	enum	aml_objtype type;
	u_int32_t	flags;
	int	bitoffset;		/* Not Byte offset but bitoffset */
	int	bitlen;
	union {
		enum	fieldtype ftype;
		struct	nfieldd fld;
		struct	ifieldd ifld;
		struct	bfieldd bfld;
	}     f;
};

struct	aml_bufferfield {
	enum	aml_objtype type;	/* aml_t_bufferfield */
	int	bitoffset;
	int	bitlen;
	u_int8_t	*origin;	/* This should not be free
					 * when this object is free
					 * (Within Buffer object)
					 */
};

struct	aml_method {
	enum	aml_objtype type;
	int	argnum;		/* Not argnum but argnum|frag */
	u_int8_t	*from;
	u_int8_t	*to;
};

struct aml_powerres {
	enum	aml_objtype type;
	int	level;
	int	order;
};

struct	aml_processor {
	enum	aml_objtype type;
	int	id;
	int	addr;
	int	len;
};

struct	aml_mutex_queue {
	STAILQ_ENTRY(aml_mutex_queue) entry;
};

struct	aml_mutex {
	enum	aml_objtype type;
	int	level;
	volatile	void *cookie;	/* In kernel, struct proc? */
	STAILQ_HEAD(, aml_mutex_queue) queue;
};

struct	aml_objref {
	enum	aml_objtype type;
	struct	aml_name *nameref;
	union	aml_object *ref;
	int	offset;		/* of aml_buffer.data or aml_package.objects. */
	/* if negative value, not ready to dereference for element access. */
	unsigned	deref;	/* indicates whether dereffenced or not */
	unsigned	alias;	/* true if this is an alias object reference */
};

struct	aml_regfield {
	enum	aml_objtype type;
	int	space;
	u_int32_t	flags;
	int	offset;
	int	bitoffset;
	int	bitlen;
};

struct	aml_event {
	enum	aml_objtype type;	/* aml_t_event */
	int	inuse;
};

union	aml_object {
	enum	aml_objtype type;
	struct	aml_num num;
	struct	aml_processor proc;
	struct	aml_powerres pres;
	struct	aml_opregion opregion;
	struct	aml_method meth;
	struct	aml_field field;
	struct	aml_mutex mutex;
	struct	aml_namestr nstr;
	struct	aml_buffer buffer;
	struct	aml_bufferfield bfld;
	struct	aml_package package;
	struct	aml_string str;
	struct	aml_objref objref;
	struct	aml_event event;
	struct	aml_regfield regfield;
};

union aml_object	*aml_copy_object(struct aml_environ *,
					  union aml_object *);
union aml_object	*aml_alloc_object(enum aml_objtype,
					   union aml_object *);
void			 aml_free_objectcontent(union aml_object *);
void			 aml_free_object(union aml_object **);
void			 aml_realloc_object(union aml_object *, int);

#endif /* !_AML_OBJ_H_ */
