#!/bin/sh
#
# Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

#@edma_dump
#@example : edma_dump [miami|alder] [general|txdesc|txcmpl|rxdesc|rxfill|full] [ring_num] [cache]

load_miami() {
	RXDESC_WORD=8
	RXFILL_WORD=4
	TXDESC_WORD=8
	TXCMPL_WORD=4
	RXDESC_NUM_RNG=16
	RXFILL_NUM_RNG=8
	TXDESC_NUM_RNG=24
	TXCMPL_NUM_RNG=24
	RXDESC_CACHE_BA=0x3AB5E000
	RXDESC_CACHE_DEPTH=0x280
	TXDESC_CACHE_BA=0x3AB68000
	TXDESC_CACHE_DEPTH=0x200
	RXFILL_CACHE_BA=0x3AB5C000
	RXFILL_CACHE_DEPTH=0x100
	TXCMPL_CACHE_BA=0x3AB5B000
	TXCMPL_CACHE_DEPTH=0x440
}

load_alder() {
	RXDESC_WORD=8
	RXFILL_WORD=4
	TXDESC_WORD=8
	TXCMPL_WORD=4
	RXDESC_NUM_RNG=24
	RXFILL_NUM_RNG=8
	TXDESC_NUM_RNG=32
	TXCMPL_NUM_RNG=32
	RXDESC_CACHE_BA=0x3ABE8000
	RXDESC_CACHE_DEPTH=0x3C0
	TXDESC_CACHE_BA=0x3ABD0000
	TXDESC_CACHE_DEPTH=0x200
	RXFILL_CACHE_BA=0x3ABBF000
	RXFILL_CACHE_DEPTH=0x100
	TXCMPL_CACHE_BA=0x3ABE0000
	TXCMPL_CACHE_DEPTH=0x440
}

general_dump() {
	echo "NSS_PPE_EDMA_MAS_CTRL_REG 0x3AB00000 : " `devmem 0x3AB00000`
	echo "NSS_PPE_EDMA_PORT_CTRL_REG 0x3AB00004 : " `devmem 0x3AB00004`
	echo "NSS_PPE_EDMA_VLAN_CTRL_REG 0x3AB00008 : " `devmem 0x3AB00008`
	echo "NSS_PPE_EDMA_RXDESC2FILL_MAP_REG_0 0x3AB00014 : " `devmem 0x3AB00014`
	echo "NSS_PPE_EDMA_RXDESC2FILL_MAP_REG_1 0x3AB00018 : " `devmem 0x3AB00018`
	echo "NSS_PPE_EDMA_TXQ_CTRL_REG 0x3AB00020 : " `devmem 0x3AB00020`
	echo "NSS_PPE_EDMA_TXQ_CTRL_REG2 0x3AB00024 : " `devmem 0x3AB00024`
	echo "NSS_PPE_EDMA_TXQ_FC_REG0 0x3AB00028 : " `devmem 0x3AB00028`
	echo "NSS_PPE_EDMA_TXQ_FC_REG1 0x3AB00030 : " `devmem 0x3AB00030`
	echo "NSS_PPE_EDMA_TXQ_FC_REG2 0x3AB00034 : " `devmem 0x3AB00034`
	echo "NSS_PPE_EDMA_TXQ_FC_REG3 0x3AB00038 : " `devmem 0x3AB00038`
	echo "NSS_PPE_EDMA_RXQ_CTRL_REG 0x3AB0003C : " `devmem 0x3AB0003C`
	echo "NSS_PPE_EDMA_MISC_ERR_QID_REG1 0x3AB00040 : " `devmem 0x3AB00040`
	echo "NSS_PPE_EDMA_RXQ_FC_THRE_REG 0x3AB00044 : " `devmem 0x3AB00044`
	echo "NSS_PPE_EDMA_DMAR_CTRL_REG 0x3AB00048 : " `devmem 0x3AB00048`
	echo "NSS_PPE_EDMA_AXIR_CTRL_REG 0x3AB0004C : " `devmem 0x3AB0004C`
	echo "NSS_PPE_EDMA_AXIW_CTRL_REG 0x3AB00050 : " `devmem 0x3AB00050`
	echo "NSS_PPE_EDMA_MIN_MSS_REG 0x3AB00054 : " `devmem 0x3AB00054`
	echo "NSS_PPE_EDMA_LOOPBACK_CTRL_REG 0x3AB00058 : " `devmem 0x3AB00058`
	echo "NSS_PPE_EDMA_MISC_INT_STAT_REG 0x3AB0005C : " `devmem 0x3AB0005C`
	echo "NSS_PPE_EDMA_MISC_INT_MASK_REG 0x3AB00060 : " `devmem 0x3AB00060`
	echo "NSS_PPE_EDMA_DBG_CTRL_REG 0x3AB00064 : " `devmem 0x3AB00064`
	echo "NSS_PPE_EDMA_DBG_DATA_REG 0x3AB00068 : " `devmem 0x3AB00068`
	echo "NSS_PPE_EDMA_TX_TIMEOUT_THRES 0x3AB0006C : " `devmem 0x3AB0006C`
	echo "NSS_PPE_EDMA_REQ0_FIFO_THRES 0x3AB00080 : " `devmem 0x3AB00080`
	echo "NSS_PPE_EDMA_WB_OS_THRES 0x3AB00084 : " `devmem 0x3AB00084`
	echo "NSS_PPE_EDMA_MISC_ERR_QID_REG2 0x3AB00088 : " `devmem 0x3AB00088`
	echo "NSS_PPE_EDMA_TXDESC2CMPL_MAP_REG_0 0x3AB0008C : " `devmem 0x3AB0008C`
	echo "NSS_PPE_EDMA_TXDESC2CMPL_MAP_REG_1 0x3AB00090 : " `devmem 0x3AB00090`
	echo "NSS_PPE_EDMA_TXDESC2CMPL_MAP_REG_2 0x3AB00094 : " `devmem 0x3AB00094`
	echo "NSS_PPE_EDMA_TXDESC2CMPL_MAP_REG_3 0x3AB00098 : " `devmem 0x3AB00098`
	echo "NSS_PPE_EDMA_MDIO_SLV_PASUE_MAP_REG_0 0x3AB000A4 : " `devmem 0x3AB000A4`
	echo "NSS_PPE_EDMA_MDIO_SLV_PASUE_MAP_REG_1 0x3AB000A8 : " `devmem 0x3AB000A8`
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB01000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_BA_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB01004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_PROD_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB01008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_CONS_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB0100C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_RING_SIZE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB01010 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_CTRL_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB01014 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXDESC_BA2_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_BA_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_PROD_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_CONS_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB2900C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_RING_BUFFER0_SIZE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29010 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_BUFFER1_SIZE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29014 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_FC_THRE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29018 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_UGT_THRE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB2901C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_RING_EN_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29020 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_DISABLE_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB29024 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_DISABLE_DONE_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB31000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_INT_STAT_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		reg=$((0x3AB31004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXFILL_INT_MASK_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_BA_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_PROD_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_CONS_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB3900c + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_RING_SIZE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39010 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_THRE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39014 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_UGT_THRE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39018 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_CTRL_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB3901C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_BPC_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39020 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_DISABLE_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39024 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_DISABLE_DONE_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB39028 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_PH_BA_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB59000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_INT_STAT_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB59004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RXDESC_INT_MASK_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB59008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RX_MOD_TIMER_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		reg=$((0x3AB5900C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_RX_INT_CTRL_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_BA_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_PROD_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_CONS_IDX_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB7900C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_RING_SIZE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79010 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_UGT_THRE_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79014 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_CTRL_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB79018 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TXCMPL_BPC_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB99000 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TX_INT_STAT_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB99004 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TX_INT_MASK_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB99008 + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TX_MOD_TIMER_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		reg=$((0x3AB9900C + (0x1000*$i)))
		echo "NSS_PPE_EDMA_TX_INT_CTRL_REG_$i 0x$(printf "%x" $reg): " `devmem $reg`
	done
}

rxdesc_dump() {
	ring_n=$1

	echo "RXDESC DUMP: Ring: $ring_n"

	#producer index
	rxdesc_prod=$((0x3AB39004 + (0x1000*$ring_n)))
	echo "rxdesc_prod[$ring_n] addr: 0x$(printf "%x" $rxdesc_prod) index: " `devmem $rxdesc_prod`

	#consumer index
	rxdesc_cons=$((0x3AB39008 + (0x1000*$ring_n)))
	echo "rxdesc_cons[$ring_n] addr: 0x$(printf "%x" $rxdesc_cons) index: " `devmem $rxdesc_cons`

	#base address
	rxdesc_ba=$((0x3AB39000 + (0x1000*$ring_n)))
	echo "rxdesc_ba[$ring_n] addr: 0x$(printf "%x" $rxdesc_ba) index: " `devmem $rxdesc_ba`

	#ring size
	rxdesc_sz=$((0x3AB3900C + (0x1000*$ring_n)))
	count=`devmem $rxdesc_sz`
	MAX=$(($count - 1))

	reg=`devmem $rxdesc_ba`
	for i in $(seq 0 $MAX)
	do
		echo "desc: $i"
		for j in $(seq 1 $RXDESC_WORD)
		do
			echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
			reg=$(($reg + 4))
		done
	done

	if [ $2 -eq 1 ];then
		echo "dumping cached descriptors"
		NUM_CACHE_DESC_PER_RNG=$(($RXDESC_CACHE_DEPTH/$RXDESC_NUM_RNG))
		RXDESC_SZ=$(($RXDESC_WORD*4))
		RXDESC_CACHE_SZ=$(($NUM_CACHE_DESC_PER_RNG*$RXDESC_SZ))
		reg=$(($RXDESC_CACHE_BA + $(($ring_n*$RXDESC_CACHE_SZ))))
		for i in $(seq 0 $(($NUM_CACHE_DESC_PER_RNG - 1)))
		do
			echo "desc: $i"
			for j in $(seq 1 $RXDESC_WORD)
			do
				echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
				reg=$(($reg + 4))
			done
		done
	fi
}

txdesc_dump() {
	ring_n=$1

	echo "TXDESC DUMP: Ring: $ring_n"

	#producer index
	txdesc_prod=$((0x3AB01004 + (0x1000*$ring_n)))
	echo "txdesc_prod[$ring_n] addr: 0x$(printf "%x" $txdesc_prod) index: " `devmem $txdesc_prod`

	#consumer index
	txdesc_cons=$((0x3AB01008 + (0x1000*$ring_n)))
	echo "txdesc_cons[$ring_n] addr: 0x$(printf "%x" $txdesc_cons) index: " `devmem $txdesc_cons`

	#base address
	txdesc_ba=$((0x3AB01000 + (0x1000*$ring_n)))
	echo "txdesc_ba[$ring_n] addr: 0x$(printf "%x" $txdesc_ba) index: " `devmem $txdesc_ba`

	#ring size
	txdesc_sz=$((0x3AB0100C + (0x1000*$ring_n)))
	count=`devmem $txdesc_sz`
	MAX=$(($count - 1))

	reg=`devmem $txdesc_ba`
	for i in $(seq 0 $MAX)
	do
		echo "desc: $i"
		for j in $(seq 1 $TXDESC_WORD)
		do
			echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
			reg=$(($reg + 4))
		done
	done

	if [ $2 -eq 1 ];then
		echo "dumping cache descriptors"
		NUM_CACHE_DESC_PER_RNG=$(($TXDESC_CACHE_DEPTH/$TXDESC_NUM_RNG))
		TXDESC_SZ=$(($TXDESC_WORD*4))
		TXDESC_CACHE_SZ=$(($NUM_CACHE_DESC_PER_RNG*$TXDESC_SZ))
		reg=$(($TXDESC_CACHE_BA + $(($ring_n*$TXDESC_CACHE_SZ))))
		for i in $(seq 0 $(($NUM_CACHE_DESC_PER_RNG - 1)))
		do
			echo "desc: $i"
			for j in $(seq 1 $TXDESC_WORD)
			do
				echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
				reg=$(($reg + 4))
			done
		done
	fi
}

rxfill_dump() {
	ring_n=$1

	echo "RXFILL DUMP: Ring: $ring_n"

	#producer index
	rxfill_prod=$((0x3AB29004 + (0x1000*$ring_n)))
	echo "rxfill_prod[$ring_n] addr: 0x$(printf "%x" $rxfill_prod) index: " `devmem $rxfill_prod`

	#consumer index
	rxfill_cons=$((0x3AB29008 + (0x1000*$ring_n)))
	echo "rxfill_cons[$ring_n] addr: 0x$(printf "%x" $rxfill_cons) index: " `devmem $rxfill_cons`

	#base address
	rxfill_ba=$((0x3AB29000 + (0x1000*$ring_n)))
	echo "rxfill_ba[$ring_n] addr: 0xi$(printf "%x" $rxfill_ba)ndex: " `devmem $rxfill_ba`

	#ring size
	rxfill_sz=$((0x3AB2900C + (0x1000*$ring_n)))
	count=`devmem $rxfill_sz`
	MAX=$(($count - 1))

	reg=`devmem $rxfill_ba`
	for i in $(seq 0 $MAX)
	do
		echo "desc: $i"
		for j in $(seq 1 $RXFILL_WORD)
		do
			echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
			reg=$(($reg + 4))
		done
	done

	if [ $2 -eq 1 ];then
		echo "dumping cache descriptors"
		NUM_CACHE_DESC_PER_RNG=$(($RXFILL_CACHE_DEPTH/$RXFILL_NUM_RNG))
		RXFILL_SZ=$(($RXFILL_WORD*4))
		RXFILL_CACHE_SZ=$(($NUM_CACHE_DESC_PER_RNG*$RXFILL_SZ))
		reg=$(($RXFILL_CACHE_BA + $(($ring_n*$RXFILL_CACHE_SZ))))
		for i in $(seq 0 $(($NUM_CACHE_DESC_PER_RNG - 1)))
		do
			echo "desc: $i"
			for j in $(seq 1 $RXFILL_WORD)
			do
				echo "addr_$j:0x $(printf "%x" $reg) val_$j:" `devmem $reg`
				reg=$(($reg + 4))
			done
		done
	fi
}

txcmpl_dump() {
	ring_n=$1

	echo "TXCMPL DUMP: Ring: $ring_n"

	#producer index
	txcmpl_prod=$((0x3AB79004 + (0x1000*$ring_n)))
	echo "txcmpl_prod[$ring_n] addr: 0x$(printf "%x" $txcmpl_prod) index: " `devmem $txcmpl_prod`

	#consumer index
	txcmpl_cons=$((0x3AB79008 + (0x1000*$ring_n)))
	echo "txcmpl_cons[$ring_n] addr: 0x$(printf "%x" $txcmpl_cons) index: " `devmem $txcmpl_cons`

	#base address
	txcmpl_ba=$((0x3AB79000 + (0x1000*$ring_n)))
	echo "txcmpl_ba[$ring_n] addr: 0x$(printf "%x" $txcmpl_ba) index: " `devmem $txcmpl_ba`

	#ring size
	txcmpl_sz=$((0x3AB7900C + (0x1000*$ring_n)))
	count=`devmem $txcmpl_sz`
	MAX=$(($count - 1))

	reg=`devmem $txcmpl_ba`
	for i in $(seq 0 $MAX)
	do
		echo "desc: $i"
		for j in $(seq 1 $TXCMPL_WORD)
		do
			echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
			reg=$(($reg + 4))
		done
	done

	if [ $2 -eq 1 ];then
		echo "dumping cache descriptors"
		NUM_CACHE_DESC_PER_RNG=$(($TXCMPL_CACHE_DEPTH/$TXCMPL_NUM_RNG))
		TXCMPL_SZ=$(($TXCMPL_WORD*4))
		TXCMPL_CACHE_SZ=$(($NUM_CACHE_DESC_PER_RNG*$TXCMPL_SZ))
		reg=$(($TXCMPL_CACHE_BA + $(($ring_n*$TXCMPL_CACHE_SZ))))
		for i in $(seq 0 $(($NUM_CACHE_DESC_PER_RNG - 1)))
		do
			echo "desc: $i"
			for j in $(seq 1 $TXCMPL_WORD)
			do
				echo "addr_$j:0x$(printf "%x" $reg) val_$j:" `devmem $reg`
				reg=$(($reg + 4))
			done
		done
	fi
}

full_dump() {
	#general dump
	general_dump

	#rxdesc dump
	for i in $(seq 0 $(($RXDESC_NUM_RNG - 1)))
	do
		rxdesc_dump $i $1
	done

	#rxfill dump
	for i in $(seq 0 $(($RXFILL_NUM_RNG - 1)))
	do
		rxfill_dump $i $1
	done

	#txdesc dump
	for i in $(seq 0 $(($TXDESC_NUM_RNG - 1)))
	do
		txdesc_dump $i $1
	done

	#txcmpl dump
	for i in $(seq 0 $(($TXCMPL_NUM_RNG - 1)))
	do
		txcmpl_dump $i $1
	done
}

case $4 in
cache)
	cache_dump=1;
	;;
*)
	cache_dump=0;
	;;
esac

case $1 in
miami)
	load_miami
	;;
alder)
	load_alder
	;;
*)
	echo 'sh edma_dump.sh [miami|alder] [general|txdesc|txcmpl|rxdesc|rxfill|full] [ring_num] [cache]'
	exit 1
	;;
esac

case $2 in
general)
	echo "general dump"
	general_dump
	;;
txdesc)
	echo "tx desc ring dump for ring: $3"
	txdesc_dump $3 $cache_dump
	;;
txcmpl)
	echo "tx complete ring dump for ring: $3"
	txcmpl_dump $3 $cache_dump
	;;
rxdesc)
	echo "rx desc ring dump for ring: $3"
	rxdesc_dump $3 $cache_dump
	;;
rxfill)
	echo "rx fill ring dump for ring: $3"
	rxfill_dump $3 $cache_dump
	;;
full)
	echo "complete dump"
	full_dump $cache_dump
	;;
*)
	echo 'edma_dump [miami|alder] [general|txdesc|txcmpl|rxdesc|rxfill|full] [ring_num] [cache]'
	exit 1
esac
