/*
 * Support the inventory interface for IRIX binaries
 * This is invoked before the mm layer is working, so we do not
 * use the linked lists for the inventory yet.
 *
 * Miguel de Icaza, 1997.
 */
#include <linux/mm.h>
#include <asm/inventory.h>
#include <asm/uaccess.h>

#define MAX_INVENTORY 50
int inventory_items = 0;

static inventory_t inventory [MAX_INVENTORY];

void add_to_inventory(int class, int type, int controller, int unit, int state)
{
	inventory_t *ni = &inventory [inventory_items];

	if (inventory_items == MAX_INVENTORY)
		return;

	ni->inv_class      = class;
	ni->inv_type       = type;
	ni->inv_controller = controller;
	ni->inv_unit       = unit;
	ni->inv_state      = state;
	ni->inv_next       = ni;
	inventory_items++;
}

int dump_inventory_to_user(void __user *userbuf, int size)
{
	inventory_t *inv  = &inventory [0];
	inventory_t __user *user = userbuf;
	int v;

	if (!access_ok(VERIFY_WRITE, userbuf, size))
		return -EFAULT;

	for (v = 0; v < inventory_items; v++){
		inv = &inventory [v];
		if (copy_to_user (user, inv, sizeof (inventory_t)))
			return -EFAULT;
		user++;
	}
	return inventory_items * sizeof(inventory_t);
}

int __init init_inventory(void)
{
	/*
	 * gross hack while we put the right bits all over the kernel
	 * most likely this will not let just anyone run the X server
	 * until we put the right values all over the place
	 */
	add_to_inventory(10, 3, 0, 0, 16400);
	add_to_inventory(1, 1, 150, -1, 12);
	add_to_inventory(1, 3, 0, 0, 8976);
	add_to_inventory(1, 2, 0, 0, 8976);
	add_to_inventory(4, 8, 0, 0, 2);
	add_to_inventory(5, 5, 0, 0, 1);
	add_to_inventory(3, 3, 0, 0, 32768);
	add_to_inventory(3, 4, 0, 0, 32768);
	add_to_inventory(3, 8, 0, 0, 524288);
	add_to_inventory(3, 9, 0, 0, 64);
	add_to_inventory(3, 1, 0, 0, 67108864);
	add_to_inventory(12, 3, 0, 0, 16);
	add_to_inventory(8, 7, 17, 0, 16777472);
	add_to_inventory(8, 0, 0, 0, 1);
	add_to_inventory(2, 1, 0, 13, 2);
	add_to_inventory(2, 2, 0, 2, 0);
	add_to_inventory(2, 2, 0, 1, 0);
	add_to_inventory(7, 14, 0, 0, 6);

	return 0;
}
