/*
 * lasat.h
 *
 * Thomas Horsten <thh@lasat.com>
 * Copyright (C) 2000 LASAT Networks A/S.
 *
 *  This program is free software; you can distribute it and/or modify it
 *  under the terms of the GNU General Public License (Version 2) as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 *  for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 *
 * Configuration for LASAT boards, loads the appropriate include files.
 */
#ifndef _LASAT_H
#define _LASAT_H

#ifndef _LANGUAGE_ASSEMBLY

extern struct lasat_misc {
	volatile u32 *reset_reg;
	volatile u32 *flash_wp_reg;
	u32 flash_wp_bit;
} *lasat_misc;

enum lasat_mtdparts {
	LASAT_MTD_BOOTLOADER,
	LASAT_MTD_SERVICE,
	LASAT_MTD_NORMAL,
	LASAT_MTD_CONFIG,
	LASAT_MTD_FS,
	LASAT_MTD_LAST
};

/*
 * The format of the data record in the EEPROM.
 * See the LASAT Hardware Configuration field specification for a detailed
 * description of the config field.
 */
#include <linux/types.h>

#define LASAT_EEPROM_VERSION 7
struct lasat_eeprom_struct {
	unsigned int  version;
	unsigned int  cfg[3];
	unsigned char hwaddr[6];
	unsigned char print_partno[12];
	unsigned char term0;
	unsigned char print_serial[14];
	unsigned char term1;
	unsigned char prod_partno[12];
	unsigned char term2;
	unsigned char prod_serial[14];
	unsigned char term3;
	unsigned char passwd_hash[16];
	unsigned char pwdnull;
	unsigned char vendid;
	unsigned char ts_ref;
	unsigned char ts_signoff;
	unsigned char reserved[11];
	unsigned char debugaccess;
	unsigned short prid;
	unsigned int  serviceflag;
	unsigned int  ipaddr;
	unsigned int  netmask;
	unsigned int  crc32;
};

struct lasat_eeprom_struct_pre7 {
	unsigned int  version;
	unsigned int  flags[3];
	unsigned char hwaddr0[6];
	unsigned char hwaddr1[6];
	unsigned char print_partno[9];
	unsigned char term0;
	unsigned char print_serial[14];
	unsigned char term1;
	unsigned char prod_partno[9];
	unsigned char term2;
	unsigned char prod_serial[14];
	unsigned char term3;
	unsigned char passwd_hash[24];
	unsigned char pwdnull;
	unsigned char vendor;
	unsigned char ts_ref;
	unsigned char ts_signoff;
	unsigned char reserved[6];
	unsigned int  writecount;
	unsigned int  ipaddr;
	unsigned int  netmask;
	unsigned int  crc32;
};

/* Configuration descriptor encoding - see the doc for details */

#define LASAT_W0_DSCTYPE(v)		(((v))	       & 0xf)
#define LASAT_W0_BMID(v)		(((v) >> 0x04) & 0xf)
#define LASAT_W0_CPUTYPE(v)		(((v) >> 0x08) & 0xf)
#define LASAT_W0_BUSSPEED(v)		(((v) >> 0x0c) & 0xf)
#define LASAT_W0_CPUCLK(v)		(((v) >> 0x10) & 0xf)
#define LASAT_W0_SDRAMBANKSZ(v)		(((v) >> 0x14) & 0xf)
#define LASAT_W0_SDRAMBANKS(v)		(((v) >> 0x18) & 0xf)
#define LASAT_W0_L2CACHE(v)		(((v) >> 0x1c) & 0xf)

#define LASAT_W1_EDHAC(v)		(((v))	       & 0xf)
#define LASAT_W1_HIFN(v)		(((v) >> 0x04) & 0x1)
#define LASAT_W1_ISDN(v)		(((v) >> 0x05) & 0x1)
#define LASAT_W1_IDE(v)			(((v) >> 0x06) & 0x1)
#define LASAT_W1_HDLC(v)		(((v) >> 0x07) & 0x1)
#define LASAT_W1_USVERSION(v)		(((v) >> 0x08) & 0x1)
#define LASAT_W1_4MACS(v)		(((v) >> 0x09) & 0x1)
#define LASAT_W1_EXTSERIAL(v)		(((v) >> 0x0a) & 0x1)
#define LASAT_W1_FLASHSIZE(v)		(((v) >> 0x0c) & 0xf)
#define LASAT_W1_PCISLOTS(v)		(((v) >> 0x10) & 0xf)
#define LASAT_W1_PCI1OPT(v)		(((v) >> 0x14) & 0xf)
#define LASAT_W1_PCI2OPT(v)		(((v) >> 0x18) & 0xf)
#define LASAT_W1_PCI3OPT(v)		(((v) >> 0x1c) & 0xf)

/* Routines specific to LASAT boards */

#define LASAT_BMID_MASQUERADE2		0
#define LASAT_BMID_MASQUERADEPRO	1
#define LASAT_BMID_SAFEPIPE25		2
#define LASAT_BMID_SAFEPIPE50		3
#define LASAT_BMID_SAFEPIPE100		4
#define LASAT_BMID_SAFEPIPE5000		5
#define LASAT_BMID_SAFEPIPE7000		6
#define LASAT_BMID_SAFEPIPE1000		7
#if 0
#define LASAT_BMID_SAFEPIPE30		7
#define LASAT_BMID_SAFEPIPE5100		8
#define LASAT_BMID_SAFEPIPE7100		9
#endif
#define LASAT_BMID_UNKNOWN		0xf
#define LASAT_MAX_BMID_NAMES		9   /* no larger than 15! */

#define LASAT_HAS_EDHAC			(1 << 0)
#define LASAT_EDHAC_FAST		(1 << 1)
#define LASAT_HAS_EADI			(1 << 2)
#define LASAT_HAS_HIFN			(1 << 3)
#define LASAT_HAS_ISDN			(1 << 4)
#define LASAT_HAS_LEASEDLINE_IF		(1 << 5)
#define LASAT_HAS_HDC			(1 << 6)

#define LASAT_PRID_MASQUERADE2		0
#define LASAT_PRID_MASQUERADEPRO	1
#define LASAT_PRID_SAFEPIPE25		2
#define LASAT_PRID_SAFEPIPE50		3
#define LASAT_PRID_SAFEPIPE100		4
#define LASAT_PRID_SAFEPIPE5000		5
#define LASAT_PRID_SAFEPIPE7000		6
#define LASAT_PRID_SAFEPIPE30		7
#define LASAT_PRID_SAFEPIPE5100		8
#define LASAT_PRID_SAFEPIPE7100		9

#define LASAT_PRID_SAFEPIPE1110		10
#define LASAT_PRID_SAFEPIPE3020		11
#define LASAT_PRID_SAFEPIPE3030		12
#define LASAT_PRID_SAFEPIPE5020		13
#define LASAT_PRID_SAFEPIPE5030		14
#define LASAT_PRID_SAFEPIPE1120		15
#define LASAT_PRID_SAFEPIPE1130		16
#define LASAT_PRID_SAFEPIPE6010		17
#define LASAT_PRID_SAFEPIPE6110		18
#define LASAT_PRID_SAFEPIPE6210		19
#define LASAT_PRID_SAFEPIPE1020		20
#define LASAT_PRID_SAFEPIPE1040		21
#define LASAT_PRID_SAFEPIPE1060		22

struct lasat_info {
	unsigned int  li_cpu_hz;
	unsigned int  li_bus_hz;
	unsigned int  li_bmid;
	unsigned int  li_memsize;
	unsigned int  li_flash_size;
	unsigned int  li_prid;
	unsigned char li_bmstr[16];
	unsigned char li_namestr[32];
	unsigned char li_typestr[16];
	/* Info on the Flash layout */
	unsigned int  li_flash_base;
	unsigned long li_flashpart_base[LASAT_MTD_LAST];
	unsigned long li_flashpart_size[LASAT_MTD_LAST];
	struct lasat_eeprom_struct li_eeprom_info;
	unsigned int  li_eeprom_upgrade_version;
	unsigned int  li_debugaccess;
};

extern struct lasat_info lasat_board_info;

static inline unsigned long lasat_flash_partition_start(int partno)
{
	if (partno < 0 || partno >= LASAT_MTD_LAST)
		return 0;

	return lasat_board_info.li_flashpart_base[partno];
}

static inline unsigned long lasat_flash_partition_size(int partno)
{
	if (partno < 0 || partno >= LASAT_MTD_LAST)
		return 0;

	return lasat_board_info.li_flashpart_size[partno];
}

/* Called from setup() to initialize the global board_info struct */
extern int lasat_init_board_info(void);

/* Write the modified EEPROM info struct */
extern void lasat_write_eeprom_info(void);

#define N_MACHTYPES		2
/* for calibration of delays */

/* the lasat_ndelay function is necessary because it is used at an
 * early stage of the boot process where ndelay is not calibrated.
 * It is used for the bit-banging rtc and eeprom drivers */

#include <linux/delay.h>
#include <linux/smp.h>

/* calculating with the slowest board with 100 MHz clock */
#define LASAT_100_DIVIDER 20
/* All 200's run at 250 MHz clock */
#define LASAT_200_DIVIDER 8

extern unsigned int lasat_ndelay_divider;

static inline void lasat_ndelay(unsigned int ns)
{
	__delay(ns / lasat_ndelay_divider);
}

#define IS_LASAT_200()	   (current_cpu_data.cputype == CPU_R5000)

#endif /* !defined (_LANGUAGE_ASSEMBLY) */

#define LASAT_SERVICEMODE_MAGIC_1     0xdeadbeef
#define LASAT_SERVICEMODE_MAGIC_2     0xfedeabba

/* Lasat 100 boards */
#define LASAT_GT_BASE		(KSEG1ADDR(0x14000000))

/* Lasat 200 boards */
#define Vrc5074_PHYS_BASE	0x1fa00000
#define Vrc5074_BASE		(KSEG1ADDR(Vrc5074_PHYS_BASE))
#define PCI_WINDOW1		0x1a000000

#endif /* _LASAT_H */
