/*
 * inteltool - dump all registers on an Intel CPU + chipset based system.
 *
 * Copyright (C) 2012 Sven Schnelle <svens@stackframe.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include "inteltool.h"

#define AMB_CONFIG_SPACE_SIZE 0x20000

#define AMB_ADDR(base, fn, reg) (base | ((fn & 7) << 8) | ((reg & 0xff)))

static uint32_t amb_read_config32(volatile void *base, int fn, int reg)
{
	return *(uint32_t *)(AMB_ADDR((intptr_t)base, fn, reg));
}

static void amb_printreg32(volatile void *base, int fn, int reg,
			   const char *name, int printzero)
{
	uint32_t val = amb_read_config32(base, fn, reg);
	if (!val && !printzero)
		return;
	printf("%d:%2.2x %-16.16s: 0x%08x\n", fn, reg, name, val);
}

static uint16_t amb_read_config16(volatile void *base, int fn, int reg)
{
	return *(uint16_t *)(AMB_ADDR((intptr_t)base, fn, reg));
}

static void amb_printreg16(volatile void *base, int fn, int reg,
			   const char *name, int printzero)
{
	uint16_t val = amb_read_config16(base, fn, reg);
	if (!val && !printzero)
		return;
	printf("%d:%2.2x %-16.16s: 0x%04x\n", fn, reg, name, val);

}

static uint8_t amb_read_config8(volatile void *base, int fn, int reg)
{
	return *(uint8_t *)(AMB_ADDR((intptr_t)base, fn, reg));
}

static void amb_printreg8(volatile void *base, int fn, int reg,
			  const char *name, int printzero)
{
	uint8_t val = amb_read_config8(base, fn, reg);
	if (!val && !printzero)
		return;
	printf("%d:%2.2x %-16.16s: 0x%02x\n", fn, reg, name, val);

}

static void amb_printreg24(volatile void *base, int fn, int reg,
			   const char *name, int printzero)
{
	uint32_t val;

	if (reg & 1) {
		val = amb_read_config8(base, fn, reg) |
			(amb_read_config16(base, fn, reg + 1) << 8);
	} else {
		val = amb_read_config16(base, fn, reg) |
			(amb_read_config8(base, fn, reg + 2) << 16);
	}

	if (!val && !printzero)
		return;

	printf("%d:%2.2x %-16.16s: 0x%06x\n", fn, reg, name, val);
}


struct amb_register {
	int fn;
	int offset;
	const char *name;
	void (*printfunc)(volatile void *, int, int, const char *, int);
	int width;
} amb_registers[] = {
	{ 0, 0x00, "VID", NULL, 2 },
	{ 0, 0x02, "DID", NULL, 2 },
	{ 0, 0x08, "RID", NULL, 1 },
	{ 0, 0x09, "CCR", NULL, 3 },
	{ 0, 0x0e, "HDR", NULL, 1 },
	{ 1, 0x40, "FBDS0", NULL, 1 },
	{ 1, 0x41, "FBDS1", NULL, 1 },
	{ 1, 0x42, "FBDS2", NULL, 1 },
	{ 1, 0x43, "FBDS3", NULL, 1 },
	{ 1, 0x50, "FBDSBCFGCUR", NULL, 1 },
	{ 1, 0x51, "FBDNBCFGCUR", NULL, 1 },
	{ 1, 0x52, "LINKPARCUR", NULL, 2 },
	{ 1, 0x54, "FBDSBCFGNXT", NULL, 1 },
	{ 1, 0x55, "FBDNBCFGNXT", NULL, 1 },
	{ 1, 0x56, "LINKPARNXT", NULL, 2 },
	{ 1, 0x5a, "SBRXMAR", NULL, 1 },
	{ 1, 0x5b, "NBRXMAR", NULL, 1 },
	{ 1, 0x5c, "MODES", NULL, 1 },
	{ 1, 0x60, "FEATURES", NULL, 2 },
	{ 1, 0x64, "FBDLIS", NULL, 3 },
	{ 1, 0x68, "FBDLOCKTO", NULL, 2 },
	{ 1, 0x6c, "FBDHAC", NULL, 1 },
	{ 1, 0x6e, "FBDLS", NULL, 1 },
	{ 1, 0x70, "RECALDUR", NULL, 1 },
	{ 1, 0x74, "LOSDUR", NULL, 1 },
	{ 1, 0x78, "SYNCTRAININT", NULL, 1 },
	{ 1, 0x7c, "SBCALSTATUS", NULL, 2 },
	{ 1, 0x7e, "NBCALSTATUS", NULL, 2 },
	{ 1, 0x88, "CBC", NULL, 1 },
	{ 1, 0x8c, "EMASK", NULL, 1 },
	{ 1, 0x90, "FERR", NULL, 1 },
	{ 1, 0x94, "NERR", NULL, 1 },
	{ 1, 0x98, "RECCFG", NULL, 2 },
	{ 1, 0x9c, "RECFBD0", NULL, 2 },
	{ 1, 0x9e, "RECFBD1", NULL, 2 },
	{ 1, 0xa0, "RECFBD2", NULL, 2 },
	{ 1, 0xa2, "RECFBD3", NULL, 2 },
	{ 1, 0xa4, "RECFBD4", NULL, 2 },
	{ 1, 0xa6, "RECFBD5", NULL, 2 },
	{ 1, 0xa8, "RECFBD6", NULL, 2 },
	{ 1, 0xaa, "RECFBD7", NULL, 2 },
	{ 1, 0xac, "RECFBD8", NULL, 2 },
	{ 1, 0xae, "RECFBD9", NULL, 2 },
	{ 1, 0xb0, "PERSBYTE0NXT", NULL, 1 },
	{ 1, 0xb1, "PERSBYTE1NXT", NULL, 1 },
	{ 1, 0xb2, "PERSBYTE2NXT", NULL, 1 },
	{ 1, 0xb3, "PERSBYTE3NXT", NULL, 1 },
	{ 1, 0xb4, "PERSBYTE4NXT", NULL, 1 },
	{ 1, 0xb5, "PERSBYTE5NXT", NULL, 1 },
	{ 1, 0xb6, "PERSBYTE6NXT", NULL, 1 },
	{ 1, 0xb7, "PERSBYTE7NXT", NULL, 1 },
	{ 1, 0xb8, "PERSBYTE8NXT", NULL, 1 },
	{ 1, 0xb9, "PERSBYTE9NXT", NULL, 1 },
	{ 1, 0xba, "PERSBYTE10NXT", NULL, 1 },
	{ 1, 0xbb, "PERSBYTE11NXT", NULL, 1 },
	{ 1, 0xbc, "PERSBYTE12NXT", NULL, 1 },
	{ 1, 0xbd, "PERSBYTE13NXT", NULL, 1 },
	{ 1, 0xc0, "PERSBYTE0CUR", NULL, 1 },
	{ 1, 0xc1, "PERSBYTE1CUR", NULL, 1 },
	{ 1, 0xc2, "PERSBYTE2CUR", NULL, 1 },
	{ 1, 0xc3, "PERSBYTE3CUR", NULL, 1 },
	{ 1, 0xc4, "PERSBYTE4CUR", NULL, 1 },
	{ 1, 0xc5, "PERSBYTE5CUR", NULL, 1 },
	{ 1, 0xc6, "PERSBYTE6CUR", NULL, 1 },
	{ 1, 0xc7, "PERSBYTE7CUR", NULL, 1 },
	{ 1, 0xc8, "PERSBYTE8CUR", NULL, 1 },
	{ 1, 0xc9, "PERSBYTE9CUR", NULL, 1 },
	{ 1, 0xca, "PERSBYTE10CUR", NULL, 1 },
	{ 1, 0xcb, "PERSBYTE11CUR", NULL, 1 },
	{ 1, 0xcc, "PERSBYTE12CUR", NULL, 1 },
	{ 1, 0xcd, "PERSBYTE13CUR", NULL, 1 },
	{ 1, 0xe8, "CMD2DATANXT", NULL, 1 },
	{ 1, 0xe9, "CMD2DATACUR", NULL, 1 },
	{ 1, 0xea, "C2DINCRNXT", NULL, 1 },
	{ 1, 0xeb, "C2DINCRCUR", NULL, 1 },
	{ 1, 0xec, "C2DDECRNXT", NULL, 1 },
	{ 1, 0xed, "C2DDECRCUR", NULL, 1 },
	{ 2, 0x40, "SBDRVCFG", NULL, 1 },
	{ 2, 0x41, "NBDRVCFG", NULL, 1 },
	{ 2, 0x42, "FBDPDCFG", NULL, 1 },
	{ 2, 0x44, "RTERMCFG", NULL, 3 },
	{ 2, 0x47, "IDTCTRLCFG", NULL, 1 },
	{ 2, 0x48, "FBDBUFCFG", NULL, 1 },
	{ 2, 0x50, "SBRQOFFS0", NULL, 1 },
	{ 2, 0x51, "SBRQOFFS1", NULL, 1 },
	{ 2, 0x52, "SBRQOFFS2", NULL, 1 },
	{ 2, 0x53, "SBRQOFFS3", NULL, 1 },
	{ 2, 0x54, "SBRQOFFS4", NULL, 1 },
	{ 2, 0x55, "SBRQOFFS5", NULL, 1 },
	{ 2, 0x56, "SBRQOFFS6", NULL, 1 },
	{ 2, 0x57, "SBRQOFFS7", NULL, 1 },
	{ 2, 0x58, "SBRQOFFS8", NULL, 1 },
	{ 2, 0x59, "SBRQOFFS9", NULL, 1 },

	{ 2, 0x60, "NBRQOFFS0", NULL, 1 },
	{ 2, 0x61, "NBRQOFFS1", NULL, 1 },
	{ 2, 0x62, "NBRQOFFS2", NULL, 1 },
	{ 2, 0x63, "NBRQOFFS3", NULL, 1 },
	{ 2, 0x64, "NBRQOFFS4", NULL, 1 },
	{ 2, 0x65, "NBRQOFFS5", NULL, 1 },
	{ 2, 0x66, "NBRQOFFS6", NULL, 1 },
	{ 2, 0x67, "NBRQOFFS7", NULL, 1 },
	{ 2, 0x68, "NBRQOFFS8", NULL, 1 },
	{ 2, 0x69, "NBRQOFFS9", NULL, 1 },
	{ 2, 0x6a, "NBRQOFFS10", NULL, 1 },
	{ 2, 0x6b, "NBRQOFFS11", NULL, 1 },
	{ 2, 0x6c, "NBRQOFFS12", NULL, 1 },
	{ 2, 0x6d, "NBRQOFFS13", NULL, 1 },
	{ 2, 0x90, "TESTCFG", NULL, 1 },
	{ 2, 0x94, "SBTXENCFG", NULL, 2 },
	{ 2, 0x96, "NBTXENCFG", NULL, 2 },
	{ 2, 0x98, "IDLEDETCFG", NULL, 2 },
	{ 2, 0xa4, "SBRXSTATUS", NULL, 4 },
	{ 2, 0xa8, "SBRXSTATUS", NULL, 1 },
	{ 3, 0x3c, "MBIDT", NULL, 1 },
	{ 3, 0x40, "MBCSR", NULL, 4 },
	{ 3, 0x44, "MBADDR", NULL, 4 },
	{ 3, 0x40, "MBDATA0", NULL, 4 },
	{ 3, 0x41, "MBDATA1", NULL, 4 },
	{ 3, 0x42, "MBDATA2", NULL, 4 },
	{ 3, 0x43, "MBDATA3", NULL, 4 },
	{ 3, 0x44, "MBDATA4", NULL, 4 },
	{ 3, 0x45, "MBDATA5", NULL, 4 },
	{ 3, 0x46, "MBDATA6", NULL, 4 },
	{ 3, 0x47, "MBDATA7", NULL, 4 },
	{ 3, 0x48, "MBDATA8", NULL, 4 },
	{ 3, 0x49, "MBDATA9", NULL, 4 },
	{ 3, 0x70, "DAREFTC", NULL, 4 },
	{ 3, 0x74, "DSREFTC", NULL, 3 },
	{ 3, 0x77, "MTR", NULL, 1 },
	{ 3, 0x78, "DRT", NULL, 4 },
	{ 3, 0x7c, "DRC", NULL, 4 },
	{ 3, 0x80, "TEMPLO", NULL, 1 },
	{ 3, 0x81, "TEMPMID", NULL, 1 },
	{ 3, 0x82, "TEMPHI", NULL, 1 },
	{ 3, 0x83, "UPDATED", NULL, 1 },
	{ 3, 0x84, "TEMPSTAT", NULL, 1 },
	{ 3, 0x85, "TEMP", NULL, 1 },
	{ 3, 0x86, "TEMPOFFSET", NULL, 1 },
	{ 3, 0x9c, "MB_START_ADDR", NULL, 4 },
	{ 3, 0xa0, "MB_END_ADDR", NULL, 4 },
	{ 3, 0xa4, "MBLFSRSEED", NULL, 4 },
	{ 3, 0xa8, "MBFADDRPTR", NULL, 4 },
	{ 3, 0xb0, "MB_ERR_DATA00", NULL, 4 },
	{ 3, 0xb4, "MB_ERR_DATA01", NULL, 4 },
	{ 3, 0xb8, "MB_ERR_DATA02", NULL, 4 },
	{ 3, 0xbc, "MB_ERR_DATA03", NULL, 4 },
	{ 3, 0xc0, "MB_ERR_DATA04", NULL, 2 },
	{ 3, 0xc4, "MB_ERR_DATA10", NULL, 4 },
	{ 3, 0xc8, "MB_ERR_DATA11", NULL, 4 },
	{ 3, 0xcc, "MB_ERR_DATA12", NULL, 4 },
	{ 3, 0xd0, "MB_ERR_DATA13", NULL, 4 },
	{ 3, 0xd4, "MB_ERR_DATA14", NULL, 2 },

	{ 4, 0x40, "DCALCSR", NULL, 4 },
	{ 4, 0x44, "DCALADDR", NULL, 4 },
	{ 4, 0x98, "DSRETC", NULL, 4 },
	{ 4, 0xa4, "S3RESTORE0", NULL, 4 },
	{ 4, 0xa8, "S3RESTORE1", NULL, 4 },
	{ 4, 0xac, "S3RESTORE2", NULL, 4 },
	{ 4, 0xb0, "S3RESTORE3", NULL, 4 },
	{ 4, 0xb4, "S3RESTORE4", NULL, 4 },
	{ 4, 0xb8, "S3RESTORE5", NULL, 4 },
	{ 4, 0xbc, "S3RESTORE6", NULL, 4 },
	{ 4, 0xc0, "S3RESTORE7", NULL, 4 },
	{ 4, 0xc4, "S3RESTORE8", NULL, 4 },
	{ 4, 0xc8, "S3RESTORE9", NULL, 4 },
	{ 4, 0xcc, "S3RESTORE10", NULL, 4 },
	{ 4, 0xe8, "FIVESREG", NULL, 4 },
	{ 4, 0xea, "AAAAREG", NULL, 4 },

	{ 5, 0x3c, "TRANSCFG", NULL, 4 },
	{ 5, 0x40, "TRANDERR0", NULL, 2 },
	{ 5, 0x42, "TRANDERR1", NULL, 2 },
	{ 5, 0x44, "TRANDERR2", NULL, 2 },
	{ 5, 0x46, "TRANDERR3", NULL, 2 },
	{ 5, 0x48, "TRANDERR4", NULL, 2 },
	{ 5, 0x4a, "TRANDERR5", NULL, 2 },
	{ 5, 0x4c, "TRANDERR6", NULL, 2 },
	{ 5, 0x4e, "TRANDERR7", NULL, 2 },
	{ 5, 0x50, "TRANDERR8", NULL, 2 },
	{ 5, 0x80, "TRANSCTRL", NULL, 1 },
	{ 5, 0xbc, "SBMATCHU", NULL, 3 },
	{ 5, 0xc0, "SBMATCHL0", NULL, 4 },
	{ 5, 0xcc, "SBMASKU", NULL, 3 },
	{ 5, 0xd0, "SBMASKL0", NULL, 4 },
	{ 5, 0xe0, "EVENTSEL0", NULL, 3 },
	{ 5, 0xfc, "EICNTL", NULL, 1 },
	{ 5, 0xfe, "STUCKL", NULL, 1 },

	{ 6, 0x50, "NBRXSTATUS", NULL, 4 },
	{ 6, 0x7c, "SPAD0", NULL, 4 },
	{ 6, 0x80, "SBFIBPORTCTL", NULL, 4 },
	{ 6, 0x84, "SBFIBPGCTL", NULL, 4 },
	{ 6, 0x88, "SBFIBPATTBUF1", NULL, 3 },
	{ 6, 0x8c, "SBFIBTXMSK", NULL, 2 },
	{ 6, 0x90, "SBFIBRXMSK", NULL, 2 },
	{ 6, 0x94, "SBFIBTXSHFT", NULL, 2 },
	{ 6, 0x98, "SBFIBRXSHFT", NULL, 2 },
	{ 6, 0x9c, "SBFIBRXLNERR", NULL, 2 },
	{ 6, 0xa0, "SBFIBPATTBUF2", NULL, 3 },
	{ 6, 0xa4, "SBFIBPATT2EN", NULL, 2 },
	{ 6, 0xb0, "SBFIBINIT", NULL, 4 },
	{ 6, 0xb4, "SBIBISTMISC", NULL, 3 },
	{ 6, 0xc0, "NBFIBPORTCTL", NULL, 4 },
	{ 6, 0xc4, "NBFIBPGCTL", NULL, 4 },
	{ 6, 0xc8, "NBFIBPATTBUF1", NULL, 3 },
	{ 6, 0xcc, "NBFIBTXMSK", NULL, 2 },
	{ 6, 0xd0, "NBFIBRXMSK", NULL, 2 },
	{ 6, 0xd4, "NBFIBTXSHFT", NULL, 2 },
	{ 6, 0xd8, "NBFIBRXSHFT", NULL, 2 },
	{ 6, 0xdc, "NBFIBRXLNERR", NULL, 2 },
	{ 6, 0xe0, "NBFIBPATTBUF2", NULL, 3 },
	{ 6, 0xe4, "NBFIBPATT2EN", NULL, 2 },
	{ 6, 0xf0, "NBFIBINIT", NULL, 4 },
	{ 6, 0xf4, "NBIBISTMISC", NULL, 3 },

	{ 7, 0x40, "ODRV_ADJ_ADDR_A", NULL, 3 },
	{ 7, 0x43, "ODRV_ADJ_CAS_A", NULL, 3 },
	{ 7, 0x46, "ODRV_ADJ_CKE_A", NULL, 3 },
	{ 7, 0x49, "ODRV_ADJ_ODT_A", NULL, 3 },
	{ 7, 0x4c, "ODRV_ADJ_ADDR_B", NULL, 3 },
	{ 7, 0x4f, "ODRV_ADJ_CAS_B", NULL, 3 },
	{ 7, 0x52, "ODRV_ADJ_CKE_B", NULL, 3 },
	{ 7, 0x55, "ODRV_ADJ_ODT_B", NULL, 3 },
	{ 7, 0x58, "ODRV_ADJ_CLK0", NULL, 3 },
	{ 7, 0x5b, "ODRV_ADJ_CLK1", NULL, 3 },
	{ 7, 0x5e, "ODRV_ADJ_CLK2", NULL, 3 },
	{ 7, 0x61, "ODRV_ADJ_CLK3", NULL, 3 },
	{ 7, 0x64, "ODRV_ADJ_DQ_DQS", NULL, 3 },
	{ 7, 0x67, "DDR_ODTCTL", NULL, 1 },
	{ 7, 0x69, "DDR_ZCAL", NULL, 2 },
	{ 7, 0x6c, "DDR_ZCTL", NULL, 4 },
	{ 7, 0x78, "VHOSTCNTL", NULL, 1 },
	{ 7, 0x79, "DQSDLY_SMBUSCTL", NULL, 1 },
	{ 7, 0x7c, "SPAD1", NULL, 4 },
	{ 7, 0x80, "CTL_ADDR_A", NULL, 1 },
	{ 7, 0x81, "CTL_CAS_A", NULL, 1 },
	{ 7, 0x82, "CTL_CKE_A", NULL, 1 },
	{ 7, 0x83, "CTL_ODT_A", NULL, 1 },
	{ 7, 0x84, "CTL_ADDR_B", NULL, 1 },
	{ 7, 0x85, "CTL_CAS_B", NULL, 1 },
	{ 7, 0x86, "CTL_CKE_B", NULL, 1 },
	{ 7, 0x87, "CTL_ODT_B", NULL, 1 },
	{ 7, 0x88, "CTL_CLK0", NULL, 1 },
	{ 7, 0x89, "CTL_CLK1", NULL, 1 },
	{ 7, 0x8a, "CTL_CLK2", NULL, 1 },
	{ 7, 0x8b, "CTL_CLK3", NULL, 1 },
	{ 7, 0x8c, "CTL_DQ", NULL, 1 },
	{ 7, 0x8d, "CTL_DQS", NULL, 1 },
	{ 0, 0x00, NULL, NULL, 0 },
};

static void dump_amb(volatile void *ambconfig, int branch, int channel, int amb)
{
	struct amb_register *reg;
	static int lastreg, lastfn;
	int bytes;

	volatile void *base = ambconfig + \
		((branch << 16) | (channel << 15) | (amb << 11));

	if ((amb_read_config32(base, 0, 0) == 0xffffffff) |
	    (amb_read_config32(base, 0, 0) == 0x00000000))
		return;

	printf("AMB %d, branch %d, channel %d register dump:\n"
	       "============================================\n",
	       amb, branch, channel);

	for(reg = amb_registers; reg->name; reg++) {
		if (reg->fn == lastfn && reg->offset > 0 && reg->offset - lastreg) {
			bytes = reg->offset - lastreg;

			do {
				if (!(lastreg & 3) && bytes >= 4) {
					amb_printreg32(base, reg->fn, lastreg, "RESERVED", 0);
					bytes -= 4;
					lastreg += 4;
				} else if (!(lastreg & 1) && bytes >= 2) {
					amb_printreg16(base, reg->fn, lastreg, "RESERVED", 0);
					bytes -= 2;
					lastreg += 2;
				} else {
					amb_printreg8(base, reg->fn, lastreg, "RESERVED", 0);
					bytes -= 1;
					lastreg += 1;
				}
			} while(bytes > 0);
		}

		switch(reg->width) {
		case 1:
			amb_printreg8(base, reg->fn, reg->offset, reg->name, 1);
			break;
		case 2:
			amb_printreg16(base, reg->fn, reg->offset, reg->name, 1);
			break;

		case 3:
			amb_printreg24(base, reg->fn, reg->offset, reg->name, 1);
			break;

		case 4:
			amb_printreg32(base, reg->fn, reg->offset, reg->name, 1);
			break;

		default:
			break;
		}

		if (reg->printfunc)
			reg->printfunc(base, reg->fn, reg->offset, reg->name, 1);
		lastreg = reg->offset + reg->width;
		lastfn = reg->fn;
	}
	printf("\n\n");
}

int print_ambs(struct pci_dev *dev, struct pci_access *pacc)
{
	struct pci_dev *dev16;
	int branch, channel, amb;
	int max_branch, max_channel, max_amb;
	volatile void *ambconfig;
	uint64_t ambconfig_phys;

	printf("\n============= AMBs ============\n\n");

	switch (dev->device_id) {
	case PCI_DEVICE_ID_INTEL_I5000P:
	case PCI_DEVICE_ID_INTEL_I5000X:
	case PCI_DEVICE_ID_INTEL_I5000Z:

		max_branch = 2;

		if (!(dev16 = pci_get_dev(pacc, 0, 0, 0x10, 0))) {
			perror("Error: no device 0:16.0\n");
			return 1;
		}

		ambconfig_phys = ((u64)pci_read_long(dev16, 0x4c) << 32) |
			pci_read_long(dev16, 0x48);

		max_channel = pci_read_byte(dev16, 0x56)/max_branch;
		max_amb = pci_read_byte(dev16, 0x57);
		break;

	default:
		fprintf(stderr, "Error: Dumping AMBs on this MCH is not (yet) supported.\n");
		return 1;
	}

	if (!(ambconfig = map_physical(ambconfig_phys, AMB_CONFIG_SPACE_SIZE))) {
		fprintf(stderr, "Error mapping AMB config space\n");
		return 1;
	}

	for(branch = 0; branch < max_branch; branch++) {
		for(channel = 0; channel < max_channel; channel++) {
			for(amb = 0; amb < max_amb; amb++) {
				dump_amb(ambconfig, branch, channel, amb);
			}
		}
	}
	unmap_physical((void *)ambconfig, AMB_CONFIG_SPACE_SIZE);
	return 0;
}


