/*
 * Derived from include/asm-i386/mach-summit/mach_mpparse.h
 *          and include/asm-i386/mach-default/bios_ebda.h
 *
 * Author: Laurent Vivier <Laurent.Vivier@bull.net>
 */

#ifndef __ASM_RIO_H
#define __ASM_RIO_H

#define RIO_TABLE_VERSION	3

struct rio_table_hdr {
	u8 version;      /* Version number of this data structure  */
	u8 num_scal_dev; /* # of Scalability devices               */
	u8 num_rio_dev;  /* # of RIO I/O devices                   */
} __attribute__((packed));

struct scal_detail {
	u8 node_id;      /* Scalability Node ID                    */
	u32 CBAR;        /* Address of 1MB register space          */
	u8 port0node;    /* Node ID port connected to: 0xFF=None   */
	u8 port0port;    /* Port num port connected to: 0,1,2, or  */
	                 /* 0xFF=None                              */
	u8 port1node;    /* Node ID port connected to: 0xFF = None */
	u8 port1port;    /* Port num port connected to: 0,1,2, or  */
	                 /* 0xFF=None                              */
	u8 port2node;    /* Node ID port connected to: 0xFF = None */
	u8 port2port;    /* Port num port connected to: 0,1,2, or  */
	                 /* 0xFF=None                              */
	u8 chassis_num;  /* 1 based Chassis number (1 = boot node) */
} __attribute__((packed));

struct rio_detail {
	u8 node_id;      /* RIO Node ID                            */
	u32 BBAR;        /* Address of 1MB register space          */
	u8 type;         /* Type of device                         */
	u8 owner_id;     /* Node ID of Hurricane that owns this    */
	                 /* node                                   */
	u8 port0node;    /* Node ID port connected to: 0xFF=None   */
	u8 port0port;    /* Port num port connected to: 0,1,2, or  */
	                 /* 0xFF=None                              */
	u8 port1node;    /* Node ID port connected to: 0xFF=None   */
	u8 port1port;    /* Port num port connected to: 0,1,2, or  */
	                 /* 0xFF=None                              */
	u8 first_slot;   /* Lowest slot number below this Calgary  */
	u8 status;       /* Bit 0 = 1 : the XAPIC is used          */
	                 /*       = 0 : the XAPIC is not used, ie: */
	                 /*            ints fwded to another XAPIC */
	                 /*           Bits1:7 Reserved             */
	u8 WP_index;     /* instance index - lower ones have       */
	                 /*     lower slot numbers/PCI bus numbers */
	u8 chassis_num;  /* 1 based Chassis number                 */
} __attribute__((packed));

enum {
	HURR_SCALABILTY	= 0,  /* Hurricane Scalability info */
	HURR_RIOIB	= 2,  /* Hurricane RIOIB info       */
	COMPAT_CALGARY	= 4,  /* Compatibility Calgary      */
	ALT_CALGARY	= 5,  /* Second Planar Calgary      */
};

/*
 * there is a real-mode segmented pointer pointing to the
 * 4K EBDA area at 0x40E.
 */
static inline unsigned long get_bios_ebda(void)
{
	unsigned long address = *(unsigned short *)phys_to_virt(0x40EUL);
	address <<= 4;
	return address;
}

#endif /* __ASM_RIO_H */
