/*
 * 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 */
