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

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

#define AMB_CONFIG_SPACE_SIZE 0x20000

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

static uint32_t amb_read_config32(volatile void *base, int fn, int reg)
{
	return read32(base + AMB_ADDR(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 read16(base + AMB_ADDR(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 read8(base + AMB_ADDR(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 = ((uint64_t)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);
		pci_free_dev(dev16);
		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;
}
