Blame ld10k1/src/ld10k1_debug.c

Packit Service b98cfc
/*
Packit Service b98cfc
 *  EMU10k1 loader
Packit Service b98cfc
 *
Packit Service b98cfc
 *  Copyright (c) 2003,2004 by Peter Zubaj
Packit Service b98cfc
 *
Packit Service b98cfc
 *   This program is free software; you can redistribute it and/or modify
Packit Service b98cfc
 *   it under the terms of the GNU General Public License as published by
Packit Service b98cfc
 *   the Free Software Foundation; either version 2 of the License, or
Packit Service b98cfc
 *   (at your option) any later version.
Packit Service b98cfc
 *
Packit Service b98cfc
 *   This program is distributed in the hope that it will be useful,
Packit Service b98cfc
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b98cfc
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service b98cfc
 *   GNU General Public License for more details.
Packit Service b98cfc
 *
Packit Service b98cfc
 *   You should have received a copy of the GNU General Public License
Packit Service b98cfc
 *   along with this program; if not, write to the Free Software
Packit Service b98cfc
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service b98cfc
 *
Packit Service b98cfc
 */
Packit Service b98cfc
Packit Service b98cfc
#include <alsa/asoundlib.h>
Packit Service b98cfc
#include "ld10k1.h"
Packit Service b98cfc
#include "ld10k1_fnc.h"
Packit Service b98cfc
#include "ld10k1_fnc1.h"
Packit Service b98cfc
#include "ld10k1_debug.h"
Packit Service b98cfc
#include "ld10k1_error.h"
Packit Service b98cfc
#include "ld10k1_tram.h"
Packit Service b98cfc
#include <stdlib.h>
Packit Service b98cfc
#include <stdio.h>
Packit Service b98cfc
#include <string.h>
Packit Service b98cfc
Packit Service b98cfc
static char *usage_str[] = {
Packit Service b98cfc
	"NONE",
Packit Service b98cfc
	"NORMAL",
Packit Service b98cfc
	"CONST",
Packit Service b98cfc
	"DYNAMIC"
Packit Service b98cfc
};
Packit Service b98cfc
Packit Service b98cfc
char debug_line[1000];
Packit Service b98cfc
int send_debug_line(int data_conn)
Packit Service b98cfc
{
Packit Service b98cfc
	return send_response(data_conn, FNC_CONTINUE, 0, debug_line, strlen(debug_line) + 1);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_gpr_read_one(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr, unsigned int idx)
Packit Service b98cfc
{
Packit Service b98cfc
	int usage;
Packit Service b98cfc
	int value;
Packit Service b98cfc
	int ref_count;
Packit Service b98cfc
	int modified;
Packit Service b98cfc
Packit Service b98cfc
	modified = dsp_mgr->regs[idx].modified;
Packit Service b98cfc
	usage = dsp_mgr->regs[idx].gpr_usage;
Packit Service b98cfc
	value = dsp_mgr->regs[idx].val;
Packit Service b98cfc
	ref_count = dsp_mgr->regs[idx].ref;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "%c 0x%03x : %-12s  0x%08x  %3d\n",
Packit Service b98cfc
			modified ? '*' : ' ',
Packit Service b98cfc
			idx,
Packit Service b98cfc
			usage_str[usage],
Packit Service b98cfc
			value,
Packit Service b98cfc
			ref_count);
Packit Service b98cfc
	return send_debug_line(data_conn);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_gpr_read_hdr(int data_conn)
Packit Service b98cfc
{
Packit Service b98cfc
	sprintf(debug_line, "M Idx     Usage         Value         Ref\n");
Packit Service b98cfc
	return send_debug_line(data_conn);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_gpr_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "FX8010 GPR List\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	if ((err = ld10k1_debug_new_gpr_read_hdr(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->regs_max_count; i++)
Packit Service b98cfc
		if (dsp_mgr->regs[i].used)
Packit Service b98cfc
			if ((err = ld10k1_debug_new_gpr_read_one(data_conn, dsp_mgr, i)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_fx_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "FX8010 FX List\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->fx_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03x : %-20s\n",
Packit Service b98cfc
			i,
Packit Service b98cfc
			dsp_mgr->fxs[i].name ? dsp_mgr->fxs[i].name : "");
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_in_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "FX8010 IN List\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->in_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03x : %-20s\n",
Packit Service b98cfc
			i,
Packit Service b98cfc
			dsp_mgr->ins[i].name ? dsp_mgr->ins[i].name : "");
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_out_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "FX8010 OUT List\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->out_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03x : %-20s\n",
Packit Service b98cfc
			i,
Packit Service b98cfc
			dsp_mgr->outs[i].name ? dsp_mgr->outs[i].name : "");
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_const_read_one(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr, unsigned int idx)
Packit Service b98cfc
{
Packit Service b98cfc
	int hw;
Packit Service b98cfc
	int value;
Packit Service b98cfc
	int ref_count;
Packit Service b98cfc
Packit Service b98cfc
	hw = dsp_mgr->consts[idx].hw;
Packit Service b98cfc
	value = dsp_mgr->consts[idx].const_val;
Packit Service b98cfc
	ref_count = dsp_mgr->consts[idx].ref;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "0x%03x : 0x%08x  %c  %3d\n",
Packit Service b98cfc
			idx,
Packit Service b98cfc
			value,
Packit Service b98cfc
			hw ? '*' : ' ',
Packit Service b98cfc
			ref_count);
Packit Service b98cfc
	return send_debug_line(data_conn);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_const_read_hdr(int data_conn)
Packit Service b98cfc
{
Packit Service b98cfc
	sprintf(debug_line, "Idx     Value       HW   Ref\n");
Packit Service b98cfc
	return send_debug_line(data_conn);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_const_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "CONST List\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	if ((err = ld10k1_debug_new_const_read_hdr(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->consts_max_count; i++)
Packit Service b98cfc
		if (dsp_mgr->consts[i].used)
Packit Service b98cfc
			if ((err = ld10k1_debug_new_const_read_one(data_conn, dsp_mgr, i)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
char *instr_name[] = {
Packit Service b98cfc
	"MACS",
Packit Service b98cfc
	"MACS1",
Packit Service b98cfc
	"MACW",
Packit Service b98cfc
	"MACW1",
Packit Service b98cfc
	"MACINTS",
Packit Service b98cfc
	"MACINTW",
Packit Service b98cfc
	"ACC3",
Packit Service b98cfc
	"MACMV",
Packit Service b98cfc
	"ANDXOR",
Packit Service b98cfc
	"TSTNEG",
Packit Service b98cfc
	"LIMIT",
Packit Service b98cfc
	"LIMIT1",
Packit Service b98cfc
	"LOG",
Packit Service b98cfc
	"EXP",
Packit Service b98cfc
	"INTERP",
Packit Service b98cfc
	"SKIP",
Packit Service b98cfc
};
Packit Service b98cfc
Packit Service b98cfc
static void ld10k1_debug_decode_preg_idx(char *type, unsigned int reg)
Packit Service b98cfc
{
Packit Service b98cfc
	switch ((reg & EMU10K1_PREG_TYPE_MASK) >> 28) {
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_IN:
Packit Service b98cfc
			sprintf(type, "IN(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_OUT:
Packit Service b98cfc
			sprintf(type, "OUT(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_CONST:
Packit Service b98cfc
			sprintf(type, "CON(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_STA:
Packit Service b98cfc
			sprintf(type, "STA(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_DYN:
Packit Service b98cfc
			sprintf(type, "DYN(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_HW:
Packit Service b98cfc
			sprintf(type, "HW(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_CTL:
Packit Service b98cfc
			sprintf(type, "CTL(%03d, %03d)", (reg & ~EMU10K1_PREG_TYPE_MASK) >> 8, reg & ~EMU10K1_PREG_TYPE_MASK & 0xFF);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_TRAM_DATA:
Packit Service b98cfc
			sprintf(type, "TD(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		case EMU10K1_PREG_TYPE_TRAM_ADDR:
Packit Service b98cfc
			sprintf(type, "TA(%03d)", reg & ~EMU10K1_PREG_TYPE_MASK);
Packit Service b98cfc
			break;
Packit Service b98cfc
		default:
Packit Service b98cfc
			sprintf(type, "??? 0x%08x", reg);
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_code_read_one(int data_conn, int preg, ld10k1_instr_t *instr, unsigned int idx)
Packit Service b98cfc
{
Packit Service b98cfc
	char type1[100];
Packit Service b98cfc
	char type2[100];
Packit Service b98cfc
	char type3[100];
Packit Service b98cfc
	char type4[100];
Packit Service b98cfc
Packit Service b98cfc
	if (instr->used) {
Packit Service b98cfc
		if (preg) {
Packit Service b98cfc
			ld10k1_debug_decode_preg_idx(type1, instr->arg[0]);
Packit Service b98cfc
			ld10k1_debug_decode_preg_idx(type2, instr->arg[1]);
Packit Service b98cfc
			ld10k1_debug_decode_preg_idx(type3, instr->arg[2]);
Packit Service b98cfc
			ld10k1_debug_decode_preg_idx(type4, instr->arg[3]);
Packit Service b98cfc
Packit Service b98cfc
			sprintf(debug_line, "%c 0x%03x : %-10s %s, %s, %s, %s\n",
Packit Service b98cfc
				instr->modified ? '*' : ' ',
Packit Service b98cfc
				idx,
Packit Service b98cfc
				instr_name[instr->op_code],
Packit Service b98cfc
				type1,
Packit Service b98cfc
				type2,
Packit Service b98cfc
				type3,
Packit Service b98cfc
				type4);
Packit Service b98cfc
		} else {
Packit Service b98cfc
			sprintf(debug_line, "%c 0x%03x : %-10s 0x%03x, 0x%03x, 0x%03x, 0x%03x\n",
Packit Service b98cfc
				instr->modified ? '*' : ' ',
Packit Service b98cfc
				idx,
Packit Service b98cfc
				instr_name[instr->op_code],
Packit Service b98cfc
				instr->arg[0],
Packit Service b98cfc
				instr->arg[1],
Packit Service b98cfc
				instr->arg[2],
Packit Service b98cfc
				instr->arg[3]);
Packit Service b98cfc
		}
Packit Service b98cfc
Packit Service b98cfc
		return send_debug_line(data_conn);
Packit Service b98cfc
	} else {
Packit Service b98cfc
		sprintf(debug_line, "%c 0x%03x : NOT USED\n",
Packit Service b98cfc
			instr->modified ? '*' : ' ',
Packit Service b98cfc
			idx);
Packit Service b98cfc
		return send_debug_line(data_conn);
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_code_read_hdr(int data_conn)
Packit Service b98cfc
{
Packit Service b98cfc
	sprintf(debug_line, "M Idx     OPCODE\n");
Packit Service b98cfc
	return send_debug_line(data_conn);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_code_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int err;
Packit Service b98cfc
	ld10k1_instr_t *instr;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "FX8010 Code\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	if ((err = ld10k1_debug_new_code_read_hdr(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->instr_count; i++) {
Packit Service b98cfc
  		instr = &(dsp_mgr->instr[i]);
Packit Service b98cfc
		if (instr->used)
Packit Service b98cfc
			if ((err = ld10k1_debug_new_code_read_one(data_conn, 0, instr, i)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_tram_info_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i, j;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	char *req_pos_str;
Packit Service b98cfc
	char *pos_str;
Packit Service b98cfc
Packit Service b98cfc
	ld10k1_tram_acc_t *tram_acc;
Packit Service b98cfc
	unsigned int data, addr;
Packit Service b98cfc
Packit Service b98cfc
	int ifree = dsp_mgr->i_tram.size;
Packit Service b98cfc
	int efree = dsp_mgr->e_tram.size;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "TRAM\n\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "Internal tram size: 0x%08x\n", dsp_mgr->i_tram.size);
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	sprintf(debug_line, "External tram size: 0x%08x\n", dsp_mgr->e_tram.size);
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "\nTram groups:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->max_tram_grp; i++) {
Packit Service b98cfc
		if (dsp_mgr->tram_grp[i].used) {
Packit Service b98cfc
			sprintf(debug_line, "%03d  %10s  ", i, dsp_mgr->tram_grp[i].type == TRAM_GRP_DELAY ? "DELAY" : "TABLE");
Packit Service b98cfc
			if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
Packit Service b98cfc
			req_pos_str = "NONE";
Packit Service b98cfc
			if (dsp_mgr->tram_grp[i].req_pos == TRAM_POS_AUTO)
Packit Service b98cfc
				req_pos_str = "AUTO";
Packit Service b98cfc
			else if (dsp_mgr->tram_grp[i].req_pos == TRAM_POS_INTERNAL)
Packit Service b98cfc
				req_pos_str = "INTERNAL";
Packit Service b98cfc
			else if (dsp_mgr->tram_grp[i].req_pos == TRAM_POS_EXTERNAL)
Packit Service b98cfc
				req_pos_str = "EXTERNAL";
Packit Service b98cfc
Packit Service b98cfc
			pos_str = "NONE";
Packit Service b98cfc
			if (dsp_mgr->tram_grp[i].pos == TRAM_POS_INTERNAL) {
Packit Service b98cfc
				pos_str = "INTERNAL";
Packit Service b98cfc
				ifree -= dsp_mgr->tram_grp[i].size;
Packit Service b98cfc
			} else if (dsp_mgr->tram_grp[i].pos == TRAM_POS_EXTERNAL) {
Packit Service b98cfc
				pos_str = "EXTERNAL";
Packit Service b98cfc
				efree -= dsp_mgr->tram_grp[i].size;
Packit Service b98cfc
			}
Packit Service b98cfc
Packit Service b98cfc
			sprintf(debug_line, "%10s  %10s   %08x  %08x  %03d\n", req_pos_str, pos_str,
Packit Service b98cfc
				dsp_mgr->tram_grp[i].size, dsp_mgr->tram_grp[i].offset, dsp_mgr->tram_grp[i].acc_count);
Packit Service b98cfc
			if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
Packit Service b98cfc
			for (j = 0; j < dsp_mgr->max_tram_acc; j++) {
Packit Service b98cfc
				tram_acc = &(dsp_mgr->tram_acc[j]);
Packit Service b98cfc
Packit Service b98cfc
				ld10k1_tram_get_hwacc(dsp_mgr, tram_acc->hwacc, &addr, &data);
Packit Service b98cfc
				if ((tram_acc->used) && (tram_acc->grp == i)) {
Packit Service b98cfc
					sprintf(debug_line, "  %c%c%c  Off:0x%08x  HWacc:%03d  ADDR:0x%08x   DATA:0x%08x\n",
Packit Service b98cfc
						(tram_acc->type & TRAM_ACC_READ) ? 'R' : '-',
Packit Service b98cfc
						(tram_acc->type & TRAM_ACC_WRITE) ? 'W' : '-',
Packit Service b98cfc
						(tram_acc->type & TRAM_ACC_ZERO) ? 'Z' : '-',
Packit Service b98cfc
						tram_acc->offset,
Packit Service b98cfc
						tram_acc->hwacc,
Packit Service b98cfc
						addr,
Packit Service b98cfc
						data);
Packit Service b98cfc
					if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
						return err;
Packit Service b98cfc
				}
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_debug_new_patch_read1(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch)
Packit Service b98cfc
{
Packit Service b98cfc
	int i, j;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	ld10k1_conn_point_t *point;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "Patch name: %s\n\n", patch->patch_name);
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	/* in list */
Packit Service b98cfc
	sprintf(debug_line, "IN registers:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->in_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   %s  ->  0x%08x\n", i,
Packit Service b98cfc
			patch->ins[i].name ? patch->ins[i].name : "",
Packit Service b98cfc
			patch->ins[i].point ? patch->ins[i].point->con_gpr_idx : 0);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
Packit Service b98cfc
		point = patch->ins[i].point;
Packit Service b98cfc
		if (point != NULL)
Packit Service b98cfc
			for (j = 0; j < MAX_CONN_PER_POINT; j++) {
Packit Service b98cfc
				if (point->out_gpr_idx[j] != 0) {
Packit Service b98cfc
					sprintf(debug_line, "   +0x%08x\n", point->out_gpr_idx[j]);
Packit Service b98cfc
					if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
						return err;
Packit Service b98cfc
				}
Packit Service b98cfc
			}
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* out list */
Packit Service b98cfc
	sprintf(debug_line, "OUT registers:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->out_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   %s  ->  0x%08x\n", i,
Packit Service b98cfc
			patch->outs[i].name ? patch->outs[i].name : "",
Packit Service b98cfc
			patch->outs[i].point ? patch->outs[i].point->con_gpr_idx : 0);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* const list */
Packit Service b98cfc
	sprintf(debug_line, "CONST registers:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->const_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   0x%08x  ->  0x%08x\n", i,
Packit Service b98cfc
			patch->consts[i].const_val,
Packit Service b98cfc
			patch->consts[i].gpr_idx);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* sta list */
Packit Service b98cfc
	sprintf(debug_line, "STA registers:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->sta_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   0x%08x  ->  0x%08x\n", i,
Packit Service b98cfc
			patch->stas[i].const_val,
Packit Service b98cfc
			patch->stas[i].gpr_idx);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* hw list */
Packit Service b98cfc
	sprintf(debug_line, "HW registers:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->hw_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   0x%08x  ->  0x%08x\n", i,
Packit Service b98cfc
			patch->hws[i].reg_idx,
Packit Service b98cfc
			patch->hws[i].gpr_idx);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* tram list */
Packit Service b98cfc
	sprintf(debug_line, "\nUsed tram groups:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->tram_count; i++)	{
Packit Service b98cfc
		sprintf(debug_line, "%03d  0x%01x 0x%08x 0x%01x ->  %03d\n", i,
Packit Service b98cfc
			patch->tram_grp[i].grp_type,
Packit Service b98cfc
			patch->tram_grp[i].grp_size,
Packit Service b98cfc
			patch->tram_grp[i].grp_pos,
Packit Service b98cfc
			patch->tram_grp[i].grp_idx);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* tram acc list */
Packit Service b98cfc
	sprintf(debug_line, "\nUsed tram acc:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->tram_acc_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d   0x%01x  0x%08x  0x%03x ->  0x%03x\n", i,
Packit Service b98cfc
			patch->tram_acc[i].acc_type,
Packit Service b98cfc
			patch->tram_acc[i].acc_offset,
Packit Service b98cfc
			patch->tram_acc[i].grp,
Packit Service b98cfc
			patch->tram_acc[i].acc_idx);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* cotrol list */
Packit Service b98cfc
	sprintf(debug_line, "\nUsed controls:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->ctl_count; i++) {
Packit Service b98cfc
		sprintf(debug_line, "%03d\n", i);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		sprintf(debug_line, "  Name:%s\n", patch->ctl[i].name);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		sprintf(debug_line, "  Min: 0x%08x\n", patch->ctl[i].min);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		sprintf(debug_line, "  Max: 0x%08x\n", patch->ctl[i].max);
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		sprintf(debug_line, "  GPRS:\n");
Packit Service b98cfc
		if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		for (j = 0; j < patch->ctl[i].count; j++) {
Packit Service b98cfc
			sprintf(debug_line, "    %03d  0x%08x ->  0x%08x  %c\n", j,
Packit Service b98cfc
				patch->ctl[i].value[j],
Packit Service b98cfc
				patch->ctl[i].gpr_idx[j],
Packit Service b98cfc
				j < patch->ctl[i].vcount ? 'v' : ' ');
Packit Service b98cfc
			if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	/* instruction list */
Packit Service b98cfc
	sprintf(debug_line, "\nCode:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	if ((err = ld10k1_debug_new_code_read_hdr(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < patch->instr_count; i++) {
Packit Service b98cfc
		ld10k1_instr_t *instr;
Packit Service b98cfc
Packit Service b98cfc
		instr = &(patch->instr[i]);
Packit Service b98cfc
		if ((err = ld10k1_debug_new_code_read_one(data_conn, 1, instr, i)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_patch_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr, int idx)
Packit Service b98cfc
{
Packit Service b98cfc
	ld10k1_patch_t *patch;
Packit Service b98cfc
	patch = dsp_mgr->patch_ptr[idx];
Packit Service b98cfc
	if (!patch)
Packit Service b98cfc
		return LD10K1_ERR_UNKNOWN_PATCH_NUM;
Packit Service b98cfc
Packit Service b98cfc
	return ld10k1_debug_new_patch_read1(data_conn, dsp_mgr, patch);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_patch_list_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	ld10k1_patch_t *patch;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "\nPatch List:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < EMU10K1_PATCH_MAX; i++) {
Packit Service b98cfc
		patch = dsp_mgr->patch_ptr[i];
Packit Service b98cfc
		if (patch) {
Packit Service b98cfc
			sprintf(debug_line, "%03d  %s\n\n", i, patch->patch_name);
Packit Service b98cfc
			if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
static int ld10k1_debug_new_patch_order_read(int data_conn, ld10k1_dsp_mgr_t *dsp_mgr)
Packit Service b98cfc
{
Packit Service b98cfc
	int i, idx;
Packit Service b98cfc
	ld10k1_patch_t *patch;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	sprintf(debug_line, "\nPatch order:\n");
Packit Service b98cfc
	if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
		return err;
Packit Service b98cfc
	for (i = 0; i < dsp_mgr->patch_count; i++) {
Packit Service b98cfc
		idx = dsp_mgr->patch_order[i];
Packit Service b98cfc
		patch = dsp_mgr->patch_ptr[idx];
Packit Service b98cfc
		if (patch) {
Packit Service b98cfc
			sprintf(debug_line, "%03d   %03d %s\n\n", i, idx, patch->patch_name);
Packit Service b98cfc
			if ((err = send_debug_line(data_conn)) < 0)
Packit Service b98cfc
				return err;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int ld10k1_fnc_debug(int data_conn, int op, int size)
Packit Service b98cfc
{
Packit Service b98cfc
	ld10k1_fnc_debug_t debug_info;
Packit Service b98cfc
	int err;
Packit Service b98cfc
Packit Service b98cfc
	if (size != sizeof(ld10k1_fnc_debug_t))
Packit Service b98cfc
		return LD10K1_ERR_PROTOCOL;
Packit Service b98cfc
Packit Service b98cfc
	if ((err = receive_msg_data(data_conn, &debug_info, sizeof(ld10k1_fnc_debug_t))))
Packit Service b98cfc
		return err;
Packit Service b98cfc
Packit Service b98cfc
	if (debug_info.what >= 100 && debug_info.what <= 100 + EMU10K1_PATCH_MAX) {
Packit Service b98cfc
		if ((err = ld10k1_debug_new_patch_read(data_conn, &dsp_mgr, debug_info.what - 100)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 1) {
Packit Service b98cfc
		/* registers */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_gpr_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 2) {
Packit Service b98cfc
		/* registers */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_const_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 3) {
Packit Service b98cfc
		/* instruction */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_code_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 4) {
Packit Service b98cfc
		/* tram */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_tram_info_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 5) {
Packit Service b98cfc
		if ((err = ld10k1_debug_new_patch_list_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 6) {
Packit Service b98cfc
		if ((err = ld10k1_debug_new_patch_order_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 7) {
Packit Service b98cfc
		/* fx */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_fx_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 8) {
Packit Service b98cfc
		/* in */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_in_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else if (debug_info.what == 9) {
Packit Service b98cfc
		/* out */
Packit Service b98cfc
		if ((err = ld10k1_debug_new_out_read(data_conn, &dsp_mgr)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
	} else
Packit Service b98cfc
		if ((err = send_response_ok(data_conn)) < 0)
Packit Service b98cfc
			return err;
Packit Service b98cfc
Packit Service b98cfc
	return 0;
Packit Service b98cfc
}