|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* EMU10k1 loader
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (c) 2003,2004 by Peter Zubaj
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
427e91 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
427e91 |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
427e91 |
* (at your option) any later version.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
427e91 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
427e91 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
427e91 |
* GNU General Public License for more details.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
427e91 |
* along with this program; if not, write to the Free Software
|
|
Packit |
427e91 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <malloc.h>
|
|
Packit |
427e91 |
#include <stdlib.h>
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
427e91 |
#include "config.h"
|
|
Packit |
427e91 |
#endif
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <alsa/asoundlib.h>
|
|
Packit |
427e91 |
#include <alsa/sound/emu10k1.h>
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include "ld10k1.h"
|
|
Packit |
427e91 |
#include "ld10k1_fnc.h"
|
|
Packit |
427e91 |
#include "ld10k1_fnc_int.h"
|
|
Packit |
427e91 |
#include "ld10k1_driver.h"
|
|
Packit |
427e91 |
#include "ld10k1_tram.h"
|
|
Packit |
427e91 |
#include "ld10k1_error.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *ld10k1_dsp_mgr_name_new(char **where, const char *from);
|
|
Packit |
427e91 |
int ld10k1_add_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl);
|
|
Packit |
427e91 |
void ld10k1_del_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl);
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_patch_unload(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, unsigned int idx);
|
|
Packit |
427e91 |
int ld10k1_get_used_index_for_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl, int **idxs, int *cnt);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int ld10k1_resolve_named_reg(ld10k1_dsp_mgr_t *dsp_mgr, unsigned int reg);
|
|
Packit |
427e91 |
unsigned int ld10k1_gpr_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_count, int *res_count, int *res,
|
|
Packit |
427e91 |
unsigned int usage, unsigned int val);
|
|
Packit |
427e91 |
unsigned int ld10k1_gpr_dyn_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_count, int *res_count, int *res);
|
|
Packit |
427e91 |
unsigned int ld10k1_const_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_const_count, int *res_const_count, int *res_const,
|
|
Packit |
427e91 |
int max_res_count, int *res_count, int *res, int const_val);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_const_alloc(ld10k1_dsp_mgr_t *dsp_mgr, int reg);
|
|
Packit |
427e91 |
void ld10k1_const_free(ld10k1_dsp_mgr_t *dsp_mgr, int reg);
|
|
Packit |
427e91 |
void ld10k1_gpr_alloc(ld10k1_dsp_mgr_t *dsp_mgr, int reg);
|
|
Packit |
427e91 |
void ld10k1_gpr_free(ld10k1_dsp_mgr_t *dsp_mgr, int reg);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_t *ld10k1_conn_point_alloc(int simple);
|
|
Packit |
427e91 |
void ld10k1_conn_point_free(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point);
|
|
Packit |
427e91 |
int ld10k1_conn_point_set_to(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, int io);
|
|
Packit |
427e91 |
void ld10k1_conn_point_unset(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point);
|
|
Packit |
427e91 |
int ld10k1_conn_point_add(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io);
|
|
Packit |
427e91 |
int ld10k1_conn_point_del(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_conn_point_get_reg(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_conn_point_add_to_list(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point);
|
|
Packit |
427e91 |
void ld10k1_conn_point_del_from_list(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point);
|
|
Packit |
427e91 |
int ld10k1_gen_patch_id(ld10k1_dsp_mgr_t *dsp_mgr, int pnum);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* Tables
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int hw_const[22 * 2] =
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
0x00000000, EMU10K1_REG_HW(0),
|
|
Packit |
427e91 |
0x00000001, EMU10K1_REG_HW(1),
|
|
Packit |
427e91 |
0x00000002, EMU10K1_REG_HW(2),
|
|
Packit |
427e91 |
0x00000003, EMU10K1_REG_HW(3),
|
|
Packit |
427e91 |
0x00000004, EMU10K1_REG_HW(4),
|
|
Packit |
427e91 |
0x00000008, EMU10K1_REG_HW(5),
|
|
Packit |
427e91 |
0x00000010, EMU10K1_REG_HW(6),
|
|
Packit |
427e91 |
0x00000020, EMU10K1_REG_HW(7),
|
|
Packit |
427e91 |
0x00000100, EMU10K1_REG_HW(8),
|
|
Packit |
427e91 |
0x00010000, EMU10K1_REG_HW(9),
|
|
Packit |
427e91 |
0x10000000, EMU10K1_REG_HW(11),
|
|
Packit |
427e91 |
0x20000000, EMU10K1_REG_HW(12),
|
|
Packit |
427e91 |
0x40000000, EMU10K1_REG_HW(13),
|
|
Packit |
427e91 |
0x80000000, EMU10K1_REG_HW(14),
|
|
Packit |
427e91 |
0x7fffffff, EMU10K1_REG_HW(15),
|
|
Packit |
427e91 |
0xffffffff, EMU10K1_REG_HW(16),
|
|
Packit |
427e91 |
0xfffffffe, EMU10K1_REG_HW(17),
|
|
Packit |
427e91 |
0xc0000000, EMU10K1_REG_HW(18),
|
|
Packit |
427e91 |
0x4f1bbcde, EMU10K1_REG_HW(19),
|
|
Packit |
427e91 |
0x5a7ef9db, EMU10K1_REG_HW(20),
|
|
Packit |
427e91 |
0x00100000, EMU10K1_REG_HW(21)
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_init(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int tmp_gpr_count = 0;
|
|
Packit |
427e91 |
int tmp_a_gpr_count = 0;
|
|
Packit |
427e91 |
int tmp_itram_count = 0;
|
|
Packit |
427e91 |
int tmp_etram_count = 0;
|
|
Packit |
427e91 |
int tmp_op_count = 0;
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->add_ctl_list = NULL;
|
|
Packit |
427e91 |
dsp_mgr->add_list_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->del_ctl_list = NULL;
|
|
Packit |
427e91 |
dsp_mgr->del_list_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->ctl_list = NULL;
|
|
Packit |
427e91 |
dsp_mgr->ctl_list_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->point_list = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
tmp_itram_count = 0xC0;
|
|
Packit |
427e91 |
tmp_etram_count = 0x100 - 0xC0;
|
|
Packit |
427e91 |
tmp_op_count = 0x400;
|
|
Packit |
427e91 |
tmp_a_gpr_count = 0x200;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
tmp_itram_count = 0x80;
|
|
Packit |
427e91 |
tmp_etram_count = 0xA0 - 0x80;
|
|
Packit |
427e91 |
tmp_op_count = 0x200;
|
|
Packit |
427e91 |
tmp_gpr_count = 0x100;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->instr_count = tmp_op_count;
|
|
Packit |
427e91 |
dsp_mgr->instr_free = tmp_op_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < tmp_op_count; i++) {
|
|
Packit |
427e91 |
dsp_mgr->instr[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->instr[i].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->instr[i].op_code = 0;
|
|
Packit |
427e91 |
for (j = 0; j < 4; j++)
|
|
Packit |
427e91 |
dsp_mgr->instr[i].arg[j] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* fx */
|
|
Packit |
427e91 |
for (i = 0; i < (dsp_mgr->audigy ? 0x40 : 0x10); i++) {
|
|
Packit |
427e91 |
dsp_mgr->fxs[i].name = NULL;
|
|
Packit |
427e91 |
dsp_mgr->fxs[i].point = NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
dsp_mgr->fx_count = dsp_mgr->audigy ? 0x40 : 0x10;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* input */
|
|
Packit |
427e91 |
for (i = 0; i < (dsp_mgr->audigy ? 0x20 : 0x10); i++) {
|
|
Packit |
427e91 |
dsp_mgr->ins[i].name = NULL;
|
|
Packit |
427e91 |
dsp_mgr->ins[i].point = NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->in_count = dsp_mgr->audigy ? 0x20 : 0x10;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* output */
|
|
Packit |
427e91 |
for (i = 0; i < (dsp_mgr->audigy ? 0x40 : 0x20); i++) {
|
|
Packit |
427e91 |
dsp_mgr->outs[i].name = NULL;
|
|
Packit |
427e91 |
dsp_mgr->outs[i].point = NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->out_count = dsp_mgr->audigy ? 0x40 : 0x20;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x00].name), "FX_PCM_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x01].name), "FX_PCM_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x02].name), "FX_PCM_Surr_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x03].name), "FX_PCM_Surr_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x04].name), "FX_MIDI_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x05].name), "FX_MIDI_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x06].name), "FX_Center");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x07].name), "FX_LFE");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x0c].name), "FX_MIDI_Reverb");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x0d].name), "FX_MIDI_Chorus");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x08].name), "FX_PCM_Front_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x09].name), "FX_PCM_Front_Right");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x14].name), "FX_Passthrough_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->fxs[0x15].name), "FX_Passthrough_Right");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x00].name), "IN_AC97_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x01].name), "IN_AC97_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x02].name), "IN_Audigy_CD_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x03].name), "IN_Audigy_CD_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x04].name), "IN_Opt_IEC958_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x05].name), "IN_Opt_IEC958_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x08].name), "IN_Line_Mic_2_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x09].name), "IN_Line_Mic_2_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0a].name), "IN_ADC_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0b].name), "IN_ADC_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0c].name), "IN_Aux2_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0d].name), "IN_Aux2_Right");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x00].name), "OUT_Dig_Front_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x01].name), "OUT_Dig_Front_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x02].name), "OUT_Dig_Center");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x03].name), "OUT_Dig_LEF");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x04].name), "OUT_Headphone_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x05].name), "OUT_Headphone_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x06].name), "OUT_Dig_Rear_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x07].name), "OUT_Dig_Rear_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x08].name), "OUT_Front_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x09].name), "OUT_Front_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0a].name), "OUT_Center");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0b].name), "OUT_LFE");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0e].name), "OUT_Rear_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0f].name), "OUT_Rear_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x10].name), "OUT_AC97_Front_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x11].name), "OUT_AC97_Front_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x16].name), "OUT_ADC_Capture_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x17].name), "OUT_ADC_Capture_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x18].name), "OUT_Mic_Capture");
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x00].name), "IN_AC97_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x01].name), "IN_AC97_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x02].name), "IN_TTL_IEC958_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x03].name), "IN_TTL_IEC958_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x04].name), "IN_Zoom_Video_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x05].name), "IN_Zoom_Video_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x06].name), "IN_Optical_IEC958_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x07].name), "IN_Optical_IEC958_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x08].name), "IN_Line_Mic_1_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x09].name), "IN_Line_Mic_1_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0a].name), "IN_Coax_IEC958_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0b].name), "IN_Coax_IEC958_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0c].name), "IN_Line_Mic_2_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->ins[0x0d].name), "IN_Line_Mic_2_Right");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x00].name), "OUT_AC97_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x01].name), "OUT_AC97_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x02].name), "OUT_Opt_IEC958_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x03].name), "OUT_Opt_IEC958_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x04].name), "OUT_Center");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x05].name), "OUT_LFE");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x06].name), "OUT_Headphone_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x07].name), "OUT_Headphone_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x08].name), "OUT_Analog_Surr_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x09].name), "OUT_Analog_Surr_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0a].name), "OUT_PCM_Capture_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0b].name), "OUT_PCM_Capture_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0c].name), "OUT_MIC_Capture");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0d].name), "OUT_AC97_Surr_Left");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x0e].name), "OUT_AC97_Surr_Right");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x11].name), "OUT_AC97_Center");
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_name_new(&(dsp_mgr->outs[0x12].name), "OUT_AC97_LFE");
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->regs_max_count = dsp_mgr->audigy ? tmp_a_gpr_count : tmp_gpr_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* constants */
|
|
Packit |
427e91 |
for (i = 0; i < 21; i++) {
|
|
Packit |
427e91 |
dsp_mgr->consts[i].const_val = hw_const[i * 2];
|
|
Packit |
427e91 |
dsp_mgr->consts[i].gpr_idx = hw_const[i * 2 + 1];
|
|
Packit |
427e91 |
dsp_mgr->consts[i].hw = 1;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].ref = 1;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].used = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->consts[21].const_val = dsp_mgr->audigy ? 0x00000800 : 0x00080000;
|
|
Packit |
427e91 |
dsp_mgr->consts[21].gpr_idx = EMU10K1_REG_HW(10);
|
|
Packit |
427e91 |
dsp_mgr->consts[21].hw = 1;
|
|
Packit |
427e91 |
dsp_mgr->consts[21].used = 1;
|
|
Packit |
427e91 |
dsp_mgr->consts[21].ref = 1;
|
|
Packit |
427e91 |
dsp_mgr->consts_max_count = 22 + dsp_mgr->regs_max_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* gprs */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->regs_max_count; i++) {
|
|
Packit |
427e91 |
dsp_mgr->regs[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].gpr_usage = GPR_USAGE_NONE;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].val = 0;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].ref = 0;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].modified = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->patch_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < 0x100; i++) {
|
|
Packit |
427e91 |
dsp_mgr->tram_acc[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_acc[i].type = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_acc[i].offset = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_acc[i].hwacc = 0xFFFFFFFF;
|
|
Packit |
427e91 |
dsp_mgr->tram_acc[i].grp = 0xFFFFFFFF;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].type = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].size = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].offset = 0;
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].req_pos = TRAM_POS_NONE;
|
|
Packit |
427e91 |
dsp_mgr->tram_grp[i].pos = TRAM_POS_NONE;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < 0x40; i++) {
|
|
Packit |
427e91 |
dsp_mgr->etram_hwacc[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->etram_hwacc[i].op = 0;
|
|
Packit |
427e91 |
dsp_mgr->etram_hwacc[i].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->etram_hwacc[i].data_val = 0;
|
|
Packit |
427e91 |
dsp_mgr->etram_hwacc[i].addr_val = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < 0xC0; i++) {
|
|
Packit |
427e91 |
dsp_mgr->itram_hwacc[i].used = 0;
|
|
Packit |
427e91 |
dsp_mgr->itram_hwacc[i].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->itram_hwacc[i].data_val = 0;
|
|
Packit |
427e91 |
dsp_mgr->itram_hwacc[i].addr_val = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->max_tram_grp = dsp_mgr->max_tram_acc = tmp_itram_count + tmp_etram_count;
|
|
Packit |
427e91 |
dsp_mgr->max_itram_hwacc = tmp_itram_count;
|
|
Packit |
427e91 |
dsp_mgr->max_etram_hwacc = tmp_etram_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->i_tram.size = 0;
|
|
Packit |
427e91 |
dsp_mgr->i_tram.max_hwacc = tmp_itram_count;
|
|
Packit |
427e91 |
dsp_mgr->i_tram.hwacc = dsp_mgr->itram_hwacc;
|
|
Packit |
427e91 |
dsp_mgr->i_tram.used_hwacc = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->e_tram.size = 0;
|
|
Packit |
427e91 |
dsp_mgr->e_tram.max_hwacc = tmp_etram_count;
|
|
Packit |
427e91 |
dsp_mgr->e_tram.hwacc = dsp_mgr->etram_hwacc;
|
|
Packit |
427e91 |
dsp_mgr->e_tram.used_hwacc = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->patch_count = 0;
|
|
Packit |
427e91 |
for (i = 0; i < EMU10K1_PATCH_MAX; i++) {
|
|
Packit |
427e91 |
dsp_mgr->patch_ptr[i] = NULL;
|
|
Packit |
427e91 |
dsp_mgr->patch_order[i] = 0xFFFFFFFF;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_dsp_mgr_init_id_gen(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < EMU10K1_PATCH_MAX; i++)
|
|
Packit |
427e91 |
dsp_mgr->patch_id_gens[i] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_dsp_mgr_free(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < EMU10K1_PATCH_MAX; i++) {
|
|
Packit |
427e91 |
if (dsp_mgr->patch_ptr[i])
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_patch_unload(dsp_mgr, dsp_mgr->patch_ptr[i], i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_del_all_controls_from_list(&(dsp_mgr->del_ctl_list), &dsp_mgr->del_list_count);
|
|
Packit |
427e91 |
ld10k1_del_all_controls_from_list(&(dsp_mgr->add_ctl_list), &dsp_mgr->add_list_count);
|
|
Packit |
427e91 |
ld10k1_del_all_controls_from_list(&(dsp_mgr->ctl_list), &dsp_mgr->ctl_list_count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* FIXME - uvolnovanie point - asi netreba - su uvolnovane pri patch */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->fx_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->fxs[i].name)
|
|
Packit |
427e91 |
free(dsp_mgr->fxs[i].name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->in_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->ins[i].name)
|
|
Packit |
427e91 |
free(dsp_mgr->ins[i].name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->out_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->outs[i].name)
|
|
Packit |
427e91 |
free(dsp_mgr->outs[i].name);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_patch_t *ld10k1_dsp_mgr_patch_new(void)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_patch_t *np;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np = (ld10k1_patch_t *)malloc(sizeof(ld10k1_patch_t));
|
|
Packit |
427e91 |
if (!np)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->patch_name = NULL;
|
|
Packit |
427e91 |
np->id = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->in_count = 0;
|
|
Packit |
427e91 |
np->ins = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->out_count = 0;
|
|
Packit |
427e91 |
np->outs = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->const_count = 0;
|
|
Packit |
427e91 |
np->consts = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->sta_count = 0;
|
|
Packit |
427e91 |
np->stas = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->dyn_count = 0;
|
|
Packit |
427e91 |
np->dyns = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->hw_count = 0;
|
|
Packit |
427e91 |
np->hws = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->tram_count = 0;
|
|
Packit |
427e91 |
np->tram_grp = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->tram_acc_count = 0;
|
|
Packit |
427e91 |
np->tram_acc = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->ctl_count = 0;
|
|
Packit |
427e91 |
np->ctl = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
np->instr_count = 0;
|
|
Packit |
427e91 |
np->instr_offset = 0;
|
|
Packit |
427e91 |
np->instr = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return np;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_dsp_mgr_patch_free(ld10k1_patch_t *patch)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->patch_name)
|
|
Packit |
427e91 |
free(patch->patch_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < patch->in_count; i++)
|
|
Packit |
427e91 |
if (patch->ins[i].name)
|
|
Packit |
427e91 |
free(patch->ins[i].name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < patch->out_count; i++)
|
|
Packit |
427e91 |
if (patch->outs[i].name)
|
|
Packit |
427e91 |
free(patch->outs[i].name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->ins)
|
|
Packit |
427e91 |
free(patch->ins);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->outs)
|
|
Packit |
427e91 |
free(patch->outs);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->consts)
|
|
Packit |
427e91 |
free(patch->consts);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->stas)
|
|
Packit |
427e91 |
free(patch->stas);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->dyns)
|
|
Packit |
427e91 |
free(patch->dyns);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->hws)
|
|
Packit |
427e91 |
free(patch->hws);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->tram_grp)
|
|
Packit |
427e91 |
free(patch->tram_grp);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->tram_acc)
|
|
Packit |
427e91 |
free(patch->tram_acc);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->ctl)
|
|
Packit |
427e91 |
free(patch->ctl);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->instr)
|
|
Packit |
427e91 |
free(patch->instr);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free(patch);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_in_out_t *ld10k1_dsp_mgr_patch_in_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_in_out_t *ins;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ins = (ld10k1_p_in_out_t *)malloc(sizeof(ld10k1_p_in_out_t) * count);
|
|
Packit |
427e91 |
if (!ins)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->ins)
|
|
Packit |
427e91 |
free(patch->ins);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(ins, 0, sizeof(ld10k1_p_in_out_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->ins = ins;
|
|
Packit |
427e91 |
patch->in_count = count;
|
|
Packit |
427e91 |
return ins;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_in_out_t *ld10k1_dsp_mgr_patch_out_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_in_out_t *outs;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
outs = (ld10k1_p_in_out_t *)malloc(sizeof(ld10k1_p_in_out_t) * count);
|
|
Packit |
427e91 |
if (!outs)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->outs)
|
|
Packit |
427e91 |
free(patch->outs);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(outs, 0, sizeof(ld10k1_p_in_out_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->outs = outs;
|
|
Packit |
427e91 |
patch->out_count = count;
|
|
Packit |
427e91 |
return outs;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_const_sta_t *ld10k1_dsp_mgr_patch_const_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_const_sta_t *consts;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
consts = (ld10k1_p_const_sta_t *)malloc(sizeof(ld10k1_p_const_sta_t) * count);
|
|
Packit |
427e91 |
if (!consts)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->consts)
|
|
Packit |
427e91 |
free(patch->consts);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(consts, 0, sizeof(ld10k1_p_const_sta_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->consts = consts;
|
|
Packit |
427e91 |
patch->const_count = count;
|
|
Packit |
427e91 |
return consts;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_const_sta_t *ld10k1_dsp_mgr_patch_sta_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_const_sta_t *stas;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
stas = (ld10k1_p_const_sta_t *)malloc(sizeof(ld10k1_p_const_sta_t) * count);
|
|
Packit |
427e91 |
if (!stas)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->stas)
|
|
Packit |
427e91 |
free(patch->stas);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(stas, 0, sizeof(ld10k1_p_const_sta_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->stas = stas;
|
|
Packit |
427e91 |
patch->sta_count = count;
|
|
Packit |
427e91 |
return stas;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_dyn_t *ld10k1_dsp_mgr_patch_dyn_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_dyn_t *dyns;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dyns = (ld10k1_p_dyn_t *)malloc(sizeof(ld10k1_p_dyn_t) * count);
|
|
Packit |
427e91 |
if (!dyns)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->dyns)
|
|
Packit |
427e91 |
free(patch->dyns);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(dyns, 0, sizeof(ld10k1_p_dyn_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->dyns = dyns;
|
|
Packit |
427e91 |
patch->dyn_count = count;
|
|
Packit |
427e91 |
return dyns;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_hw_t *ld10k1_dsp_mgr_patch_hw_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_hw_t *hws;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
hws = (ld10k1_p_hw_t *)malloc(sizeof(ld10k1_p_hw_t) * count);
|
|
Packit |
427e91 |
if (!hws)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->hws)
|
|
Packit |
427e91 |
free(patch->hws);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(hws, 0, sizeof(ld10k1_p_hw_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->hws = hws;
|
|
Packit |
427e91 |
patch->hw_count = count;
|
|
Packit |
427e91 |
return hws;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_tram_grp_t *ld10k1_dsp_mgr_patch_tram_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_tram_grp_t *tram;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tram = (ld10k1_p_tram_grp_t *)malloc(sizeof(ld10k1_p_tram_grp_t) * count);
|
|
Packit |
427e91 |
if (!tram)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->tram_grp)
|
|
Packit |
427e91 |
free(patch->tram_grp);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(tram, 0, sizeof(ld10k1_p_tram_grp_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->tram_grp = tram;
|
|
Packit |
427e91 |
patch->tram_count = count;
|
|
Packit |
427e91 |
return tram;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_p_tram_acc_t *ld10k1_dsp_mgr_patch_tram_acc_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_p_tram_acc_t *tram_acc;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tram_acc = (ld10k1_p_tram_acc_t *)malloc(sizeof(ld10k1_p_tram_acc_t) * count);
|
|
Packit |
427e91 |
if (!tram_acc)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->tram_acc)
|
|
Packit |
427e91 |
free(patch->tram_acc);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(tram_acc, 0, sizeof(ld10k1_p_tram_acc_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->tram_acc = tram_acc;
|
|
Packit |
427e91 |
patch->tram_acc_count = count;
|
|
Packit |
427e91 |
return tram_acc;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_instr_t *ld10k1_dsp_mgr_patch_instr_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_instr_t *instr;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
instr = (ld10k1_instr_t *)malloc(sizeof(ld10k1_instr_t) * count);
|
|
Packit |
427e91 |
if (!instr)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->instr)
|
|
Packit |
427e91 |
free(patch->instr);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(instr, 0, sizeof(ld10k1_instr_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->instr = instr;
|
|
Packit |
427e91 |
patch->instr_count = count;
|
|
Packit |
427e91 |
return instr;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_ctl_t *ld10k1_dsp_mgr_patch_ctl_new(ld10k1_patch_t *patch, unsigned int count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_ctl_t *ctl;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctl = (ld10k1_ctl_t *)malloc(sizeof(ld10k1_ctl_t) * count);
|
|
Packit |
427e91 |
if (!ctl)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->ctl)
|
|
Packit |
427e91 |
free(patch->ctl);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(ctl, 0, sizeof(ld10k1_ctl_t) * count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->ctl = ctl;
|
|
Packit |
427e91 |
patch->ctl_count = count;
|
|
Packit |
427e91 |
return ctl;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *ld10k1_dsp_mgr_name_new(char **where, const char *from)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char *ns;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ns = (char *)malloc(strlen(from) + 1);
|
|
Packit |
427e91 |
if (!ns)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*where)
|
|
Packit |
427e91 |
free(*where);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*where = ns;
|
|
Packit |
427e91 |
strcpy(ns, from);
|
|
Packit |
427e91 |
return ns;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_dsp_mgr_op(ld10k1_instr_t *instr, unsigned int op, unsigned int arg1, unsigned int arg2, unsigned int arg3, unsigned int arg4)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
instr->used = 1;
|
|
Packit |
427e91 |
instr->modified = 1;
|
|
Packit |
427e91 |
instr->op_code = op;
|
|
Packit |
427e91 |
instr->arg[0] = arg1;
|
|
Packit |
427e91 |
instr->arg[1] = arg2;
|
|
Packit |
427e91 |
instr->arg[2] = arg3;
|
|
Packit |
427e91 |
instr->arg[3] = arg4;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_get_phys_reg(ld10k1_dsp_mgr_t *dsp_mgr, unsigned int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int idx = reg & 0xFFFFFFF;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch(EMU10K1_REG_TYPE_B(reg)) {
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_FX:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0x3F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0x0F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_INPUT:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0x1F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x40;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0x0F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x10;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_OUTPUT:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0x3F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x60;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0x1F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x20;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_HW:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0x1F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0xC0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0x1F)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x40;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_TRAM_CTL:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0xFF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x10;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_TRAM_DATA:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0xFF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x200;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0xBF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x200;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_TRAM_ADDR:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0xFF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x300;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0xBF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x300;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_NORMAL:
|
|
Packit |
427e91 |
if (dsp_mgr->audigy) {
|
|
Packit |
427e91 |
if (idx > 0x1FF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x400;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (idx > 0xFF)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return idx + 0x100;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_CONST:
|
|
Packit |
427e91 |
if (idx > MAX_CONST_COUNT)
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return ld10k1_dsp_mgr_get_phys_reg(dsp_mgr, dsp_mgr->consts[idx].gpr_idx);
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_get_phys_reg_for_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, unsigned int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned int ind_reg = 0;
|
|
Packit |
427e91 |
unsigned int acc_idx = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_t *point;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (EMU10K1_PREG_TYPE_B(reg)) {
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_IN:
|
|
Packit |
427e91 |
/*if (patch->ins[reg & 0xFFFFFFF].point)
|
|
Packit |
427e91 |
ind_reg = patch->ins[reg & 0xFFFFFFF].point->con_gpr_idx;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
ind_reg = EMU10K1_REG_HW(0);
|
|
Packit |
427e91 |
break;*/
|
|
Packit |
427e91 |
if (patch->ins[reg & 0xFFFFFFF].point) {
|
|
Packit |
427e91 |
point = patch->ins[reg & 0xFFFFFFF].point;
|
|
Packit |
427e91 |
ind_reg = ld10k1_conn_point_get_reg(dsp_mgr, point, CON_IO_PIN, patch, reg & 0xFFFFFFF);
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
ind_reg = EMU10K1_REG_HW(0);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_OUT:
|
|
Packit |
427e91 |
if (patch->outs[reg & 0xFFFFFFF].point) {
|
|
Packit |
427e91 |
point = patch->outs[reg & 0xFFFFFFF].point;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ind_reg = ld10k1_conn_point_get_reg(dsp_mgr, point, CON_IO_POUT, patch, reg & 0xFFFFFFF);
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
ind_reg = EMU10K1_REG_HW(0); /* const 0 */
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_CONST:
|
|
Packit |
427e91 |
ind_reg = patch->consts[reg & 0xFFFFFFF].gpr_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_STA:
|
|
Packit |
427e91 |
ind_reg = patch->stas[reg & 0xFFFFFFF].gpr_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_DYN:
|
|
Packit |
427e91 |
ind_reg = patch->dyns[reg & 0xFFFFFFF].gpr_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_HW:
|
|
Packit |
427e91 |
ind_reg = patch->hws[reg & 0xFFFFFFF].gpr_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_CTL:
|
|
Packit |
427e91 |
ind_reg = patch->ctl[(reg & 0xFF00) >> 8].gpr_idx[reg & 0xFF];
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_TRAM_DATA:
|
|
Packit |
427e91 |
acc_idx = patch->tram_acc[reg & 0xFFFFFFF].acc_idx;
|
|
Packit |
427e91 |
ind_reg = EMU10K1_REG_TRAM_DATA(dsp_mgr->tram_acc[acc_idx].hwacc);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_TRAM_ADDR:
|
|
Packit |
427e91 |
acc_idx = patch->tram_acc[reg & 0xFFFFFFF].acc_idx;
|
|
Packit |
427e91 |
ind_reg = EMU10K1_REG_TRAM_ADDR(dsp_mgr->tram_acc[acc_idx].hwacc);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (ind_reg)
|
|
Packit |
427e91 |
return ld10k1_dsp_mgr_get_phys_reg(dsp_mgr, ind_reg);
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_actualize_instr(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned int i, j, k, l, m, z;
|
|
Packit |
427e91 |
unsigned int instr_offset;
|
|
Packit |
427e91 |
ld10k1_patch_t *tmpp;
|
|
Packit |
427e91 |
ld10k1_instr_t *instr;
|
|
Packit |
427e91 |
ld10k1_conn_point_t *tmp_point;
|
|
Packit |
427e91 |
int allmodified = 0;
|
|
Packit |
427e91 |
int found;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
instr_offset = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* intruction actualization */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->patch_count; i++) {
|
|
Packit |
427e91 |
tmpp = dsp_mgr->patch_ptr[dsp_mgr->patch_order[i]];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (m = 0; m < 3; m++) {
|
|
Packit |
427e91 |
if (m == 0 || m == 2) {
|
|
Packit |
427e91 |
/* get all owned points */
|
|
Packit |
427e91 |
for (j = 0; j < (m == 0 ? tmpp->in_count : tmpp->out_count); j++) {
|
|
Packit |
427e91 |
allmodified = 0;
|
|
Packit |
427e91 |
if (m == 0)
|
|
Packit |
427e91 |
tmp_point = tmpp->ins[j].point;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
tmp_point = tmpp->outs[j].point;
|
|
Packit |
427e91 |
if (tmp_point && tmp_point->owner == tmpp &&
|
|
Packit |
427e91 |
((m == 0 && tmp_point->position == INSERT_BEFORE_OWNER) ||
|
|
Packit |
427e91 |
(m == 2 && tmp_point->position == INSERT_AFTER_OWNER)))
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* check if not generated before */
|
|
Packit |
427e91 |
found = 0;
|
|
Packit |
427e91 |
for (z = 0; z < j; z++)
|
|
Packit |
427e91 |
if ((m == 0 && tmpp->ins[z].point == tmp_point) ||
|
|
Packit |
427e91 |
(m == 2 && tmpp->outs[z].point == tmp_point)) {
|
|
Packit |
427e91 |
found = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* if generated - continue */
|
|
Packit |
427e91 |
if (found)
|
|
Packit |
427e91 |
continue;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (tmp_point->reserved_instr > 0 && tmp_point->out_instr_offset != instr_offset)
|
|
Packit |
427e91 |
allmodified = 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_point->out_instr_offset = instr_offset;
|
|
Packit |
427e91 |
/* copy instructions */
|
|
Packit |
427e91 |
for (k = 0; k < tmp_point->reserved_instr; k++)
|
|
Packit |
427e91 |
if (allmodified || tmp_point->out_instr[k].modified) {
|
|
Packit |
427e91 |
instr = &(dsp_mgr->instr[k + tmp_point->out_instr_offset]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
instr->used = 1;
|
|
Packit |
427e91 |
instr->modified = 1;
|
|
Packit |
427e91 |
instr->op_code = tmp_point->out_instr[k].op_code;
|
|
Packit |
427e91 |
for (l = 0; l < 4; l++)
|
|
Packit |
427e91 |
instr->arg[l] = ld10k1_dsp_mgr_get_phys_reg(dsp_mgr, tmp_point->out_instr[k].arg[l]);
|
|
Packit |
427e91 |
tmp_point->out_instr[k].modified = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
instr_offset += tmp_point->reserved_instr;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* patch*/
|
|
Packit |
427e91 |
allmodified = 0;
|
|
Packit |
427e91 |
if (tmpp->instr_offset != instr_offset)
|
|
Packit |
427e91 |
allmodified = 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmpp->instr_offset = instr_offset;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (j = 0; j < tmpp->instr_count; j++)
|
|
Packit |
427e91 |
if (allmodified || tmpp->instr[j].modified) {
|
|
Packit |
427e91 |
instr = &(dsp_mgr->instr[j + tmpp->instr_offset]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
instr->used = 1;
|
|
Packit |
427e91 |
instr->modified = 1;
|
|
Packit |
427e91 |
instr->op_code = tmpp->instr[j].op_code;
|
|
Packit |
427e91 |
for (k = 0; k < 4; k++)
|
|
Packit |
427e91 |
instr->arg[k] = ld10k1_dsp_mgr_get_phys_reg_for_patch(dsp_mgr, tmpp, tmpp->instr[j].arg[k]);
|
|
Packit |
427e91 |
tmpp->instr[j].modified = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
instr_offset += tmpp->instr_count;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (j = instr_offset; j < dsp_mgr->instr_count; j++) {
|
|
Packit |
427e91 |
if (dsp_mgr->instr[j].used) {
|
|
Packit |
427e91 |
dsp_mgr->instr[j].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->instr[j].used = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return ld10k1_update_driver(dsp_mgr);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_actualize_instr_for_reg(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, unsigned int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int j, k;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (j = 0; j < patch->instr_count; j++)
|
|
Packit |
427e91 |
for (k = 0; k < 4; k++)
|
|
Packit |
427e91 |
if (patch->instr[j].arg[k] == reg) {
|
|
Packit |
427e91 |
patch->instr[j].modified = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_dsp_mgr_actualize_order(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->patch_count; i++)
|
|
Packit |
427e91 |
dsp_mgr->patch_ptr[dsp_mgr->patch_order[i]]->order = i;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_patch_load(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, int before, int *loaded)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* check if i can add patch */
|
|
Packit |
427e91 |
int pp, i, j;
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int res[MAX_GPR_COUNT];
|
|
Packit |
427e91 |
int res_count = 0;
|
|
Packit |
427e91 |
int max_res_count = MAX_GPR_COUNT;
|
|
Packit |
427e91 |
int const_res[MAX_CONST_COUNT];
|
|
Packit |
427e91 |
int const_res_count = 0;
|
|
Packit |
427e91 |
int max_const_res_count = MAX_CONST_COUNT;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int reserved;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_ctl_t tmp_ctl;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_tram_resolve_t tram_res;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_patch_t *tpatch;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (dsp_mgr->patch_count >= EMU10K1_PATCH_MAX)
|
|
Packit |
427e91 |
return LD10K1_ERR_MAX_PATCH_COUNT;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* get patch number */
|
|
Packit |
427e91 |
for (i = 0, pp = -1; i < dsp_mgr->patch_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->patch_ptr[i] == NULL)
|
|
Packit |
427e91 |
pp = i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (pp < 0)
|
|
Packit |
427e91 |
pp = dsp_mgr->patch_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (before > dsp_mgr->patch_count)
|
|
Packit |
427e91 |
before = dsp_mgr->patch_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* static */
|
|
Packit |
427e91 |
for (i = 0; i < patch->sta_count; i++) {
|
|
Packit |
427e91 |
reserved = ld10k1_gpr_reserve(dsp_mgr, max_res_count, &res_count, res, GPR_USAGE_NORMAL, patch->stas[i].const_val);
|
|
Packit |
427e91 |
if (!reserved)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
patch->stas[i].gpr_idx = reserved;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* constant */
|
|
Packit |
427e91 |
for (i = 0; i < patch->const_count; i++) {
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* try allocate */
|
|
Packit |
427e91 |
reserved = ld10k1_const_reserve(dsp_mgr, max_const_res_count, &const_res_count, const_res,
|
|
Packit |
427e91 |
max_res_count, &res_count, res, patch->consts[i].const_val);
|
|
Packit |
427e91 |
if (reserved == 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
patch->consts[i].gpr_idx = reserved;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* dynamic */
|
|
Packit |
427e91 |
for (i = 0; i < patch->dyn_count; i++) {
|
|
Packit |
427e91 |
reserved = ld10k1_gpr_dyn_reserve(dsp_mgr, max_res_count, &res_count, res);
|
|
Packit |
427e91 |
if (!reserved)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
patch->dyns[i].gpr_idx = reserved;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* hw */
|
|
Packit |
427e91 |
for (i = 0; i < patch->hw_count; i++)
|
|
Packit |
427e91 |
patch->hws[i].gpr_idx = ld10k1_resolve_named_reg(dsp_mgr, patch->hws[i].reg_idx);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* ctl regs */
|
|
Packit |
427e91 |
for (i = 0; i < patch->ctl_count; i++) {
|
|
Packit |
427e91 |
for (j = 0; j < patch->ctl[i].count; j++) {
|
|
Packit |
427e91 |
reserved = ld10k1_gpr_reserve(dsp_mgr, max_res_count, &res_count, res,
|
|
Packit |
427e91 |
GPR_USAGE_NORMAL, patch->ctl[i].value[j]);
|
|
Packit |
427e91 |
if (!reserved)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
patch->ctl[i].gpr_idx[j] = reserved;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (dsp_mgr->instr_free < patch->instr_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_INSTR;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* tram */
|
|
Packit |
427e91 |
if (patch->tram_count > 0)
|
|
Packit |
427e91 |
if ((err = ld10k1_tram_reserve_for_patch(dsp_mgr, patch, &tram_res)) < 0)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < patch->ctl_count; i++) {
|
|
Packit |
427e91 |
memcpy(&tmp_ctl, &(patch->ctl[i]), sizeof(ld10k1_ctl_t));
|
|
Packit |
427e91 |
/* resolve gpr_idx */
|
|
Packit |
427e91 |
for (j = 0; j < tmp_ctl.count; j++)
|
|
Packit |
427e91 |
tmp_ctl.gpr_idx[j] = tmp_ctl.gpr_idx[j] & ~EMU10K1_REG_TYPE_MASK;
|
|
Packit |
427e91 |
if ((err = ld10k1_add_control(dsp_mgr, &tmp_ctl)) < 0) {
|
|
Packit |
427e91 |
for (j = 0; j < i - 1; j++)
|
|
Packit |
427e91 |
ld10k1_del_control(dsp_mgr, &(patch->ctl[j]));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* copy index back */
|
|
Packit |
427e91 |
patch->ctl[i].index = tmp_ctl.index;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch->tram_count > 0)
|
|
Packit |
427e91 |
if ((err = ld10k1_tram_alloc_for_patch(dsp_mgr, patch, &tram_res)) < 0)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = dsp_mgr->patch_count - 1; i >= before ; i--)
|
|
Packit |
427e91 |
dsp_mgr->patch_order[i + 1] = dsp_mgr->patch_order[i];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->patch_order[before] = pp;
|
|
Packit |
427e91 |
dsp_mgr->patch_count++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->patch_ptr[pp] = patch;
|
|
Packit |
427e91 |
loaded[0] = pp;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch->id = ld10k1_gen_patch_id(dsp_mgr, pp);
|
|
Packit |
427e91 |
loaded[1] = patch->id;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* allocate registers */
|
|
Packit |
427e91 |
for (i = 0; i < const_res_count; i++)
|
|
Packit |
427e91 |
ld10k1_const_alloc(dsp_mgr, const_res[i]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < res_count; i++)
|
|
Packit |
427e91 |
ld10k1_gpr_alloc(dsp_mgr, res[i]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* actualize tram */
|
|
Packit |
427e91 |
if (patch->tram_count > 0)
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->patch_count; i++) {
|
|
Packit |
427e91 |
tpatch = dsp_mgr->patch_ptr[dsp_mgr->patch_order[i]];
|
|
Packit |
427e91 |
if (tpatch->tram_count)
|
|
Packit |
427e91 |
ld10k1_tram_actualize_tram_for_patch(dsp_mgr, tpatch);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->instr_free -= patch->instr_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_order(dsp_mgr);
|
|
Packit |
427e91 |
return ld10k1_dsp_mgr_actualize_instr(dsp_mgr);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_dsp_mgr_patch_unload(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, unsigned int idx)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned int i,j ;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free in registers */
|
|
Packit |
427e91 |
for (i = 0; i < patch->in_count; i++)
|
|
Packit |
427e91 |
if (patch->ins[i].point)
|
|
Packit |
427e91 |
ld10k1_conn_point_del(dsp_mgr, patch->ins[i].point, CON_IO_PIN, patch, i);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free out registers */
|
|
Packit |
427e91 |
for (i = 0; i < patch->out_count; i++)
|
|
Packit |
427e91 |
if (patch->outs[i].point)
|
|
Packit |
427e91 |
ld10k1_conn_point_del(dsp_mgr, patch->outs[i].point, CON_IO_POUT, patch, i);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free dyn registers */
|
|
Packit |
427e91 |
for (i = 0; i < patch->dyn_count; i++)
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, patch->dyns[i].gpr_idx);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free sta registers */
|
|
Packit |
427e91 |
for (i = 0; i < patch->sta_count; i++)
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, patch->stas[i].gpr_idx);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free const registers */
|
|
Packit |
427e91 |
for (i = 0; i < patch->const_count; i++)
|
|
Packit |
427e91 |
ld10k1_const_free(dsp_mgr, patch->consts[i].gpr_idx);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free ctl regs */
|
|
Packit |
427e91 |
for (i = 0; i < patch->ctl_count; i++) {
|
|
Packit |
427e91 |
for (j = 0; j < patch->ctl[i].count; j++) {
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, patch->ctl[i].gpr_idx[j]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free controls */
|
|
Packit |
427e91 |
for (i = 0; i < patch->ctl_count; i++)
|
|
Packit |
427e91 |
ld10k1_del_control(dsp_mgr, &(patch->ctl[i]));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free tram */
|
|
Packit |
427e91 |
if (patch->tram_count > 0)
|
|
Packit |
427e91 |
ld10k1_tram_free_tram_for_patch(dsp_mgr, patch);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free from registers */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->patch_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->patch_order[i] == idx)
|
|
Packit |
427e91 |
for (;i < dsp_mgr->patch_count; i++)
|
|
Packit |
427e91 |
dsp_mgr->patch_order[i] = dsp_mgr->patch_order[i + 1];
|
|
Packit |
427e91 |
dsp_mgr->patch_ptr[idx] = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* free from mem */
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_patch_free(patch);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* decrement patch count */
|
|
Packit |
427e91 |
dsp_mgr->patch_count--;
|
|
Packit |
427e91 |
dsp_mgr->instr_free += patch->instr_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_order(dsp_mgr);
|
|
Packit |
427e91 |
/* actualize instructons */
|
|
Packit |
427e91 |
return ld10k1_dsp_mgr_actualize_instr(dsp_mgr);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_patch_fnc_check_patch(ld10k1_dsp_mgr_t *dsp_mgr,
|
|
Packit |
427e91 |
ld10k1_patch_t *new_patch)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j, k;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check hw registers */
|
|
Packit |
427e91 |
for (i = 0; i < new_patch->hw_count; i++) {
|
|
Packit |
427e91 |
if (!ld10k1_resolve_named_reg(dsp_mgr, new_patch->hws[i].reg_idx))
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_REG_HW_INDEX;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* tram check */
|
|
Packit |
427e91 |
for (i = 0; i < new_patch->tram_count; i++) {
|
|
Packit |
427e91 |
if (new_patch->tram_grp[i].grp_type != TRAM_GRP_DELAY && new_patch->tram_grp[i].grp_type != TRAM_GRP_TABLE)
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_TRAM_TYPE;
|
|
Packit |
427e91 |
if (new_patch->tram_grp[i].grp_size < 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_TRAM_SIZE;
|
|
Packit |
427e91 |
if (new_patch->tram_grp[i].grp_pos != TRAM_POS_AUTO &&
|
|
Packit |
427e91 |
new_patch->tram_grp[i].grp_pos != TRAM_POS_INTERNAL &&
|
|
Packit |
427e91 |
new_patch->tram_grp[i].grp_pos != TRAM_POS_EXTERNAL)
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_TRAM_POS;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* tram access check */
|
|
Packit |
427e91 |
for (i = 0; i < new_patch->tram_acc_count; i++) {
|
|
Packit |
427e91 |
/* type */
|
|
Packit |
427e91 |
if ((new_patch->tram_acc[i].acc_type & ~(TRAM_ACC_READ | TRAM_ACC_WRITE | TRAM_ACC_ZERO)) != 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_TRAM_ACC_TYPE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (((new_patch->tram_acc[i].acc_type & (TRAM_ACC_READ | TRAM_ACC_WRITE)) != TRAM_ACC_READ) &&
|
|
Packit |
427e91 |
((new_patch->tram_acc[i].acc_type & (TRAM_ACC_READ | TRAM_ACC_WRITE)) != TRAM_ACC_WRITE))
|
|
Packit |
427e91 |
return LD10K1_ERR_WRONG_TRAM_ACC_TYPE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_patch->tram_acc[i].grp < 0 && new_patch->tram_acc[i].grp >= new_patch->tram_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_TRAM_GRP_OUT_OF_RANGE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_patch->tram_acc[i].acc_offset < 0 || new_patch->tram_acc[i].acc_offset >= new_patch->tram_grp[new_patch->tram_acc[i].grp].grp_size)
|
|
Packit |
427e91 |
return LD10K1_ERR_TRAM_ACC_OUT_OF_RANGE;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* control check */
|
|
Packit |
427e91 |
for (i = 0; i < new_patch->ctl_count; i++) {
|
|
Packit |
427e91 |
new_patch->ctl[i].name[43] = '\0';
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_patch->ctl[i].vcount > new_patch->ctl[i].count)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_VCOUNT_OUT_OF_RANGE;
|
|
Packit |
427e91 |
if (new_patch->ctl[i].count > MAX_CTL_GPR_COUNT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_COUNT_OUT_OF_RANGE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_patch->ctl[i].min > new_patch->ctl[i].max)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_MIN_MAX_RANGE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_patch->ctl[i].translation < 0 || new_patch->ctl[i].translation > EMU10K1_GPR_TRANSLATION_LAST)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_TRANLSLATION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for(j = 0; j < new_patch->ctl[i].count; j++) {
|
|
Packit |
427e91 |
if (new_patch->ctl[i].value[j] < new_patch->ctl[i].min || new_patch->ctl[i].value[j] > new_patch->ctl[i].max)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_REG_VALUE;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* instruction check */
|
|
Packit |
427e91 |
for (i = 0; i < new_patch->instr_count; i++) {
|
|
Packit |
427e91 |
if (new_patch->instr[i].op_code < 0 || new_patch->instr[i].op_code > iSKIP)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_OPCODE;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (k = 0; k < 4; k++) {
|
|
Packit |
427e91 |
int arg = new_patch->instr[i].arg[k];
|
|
Packit |
427e91 |
switch (EMU10K1_PREG_TYPE_B(arg)) {
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_IN:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->in_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_OUT:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->out_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_CONST:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->const_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_STA:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->sta_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_DYN:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->dyn_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_HW:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->hw_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_CTL:
|
|
Packit |
427e91 |
if ((((arg & 0xFF00) >> 8) >= new_patch->ctl_count) ||
|
|
Packit |
427e91 |
((arg & 0xFF) >= new_patch->ctl[(arg & 0xFF00) >> 8].count))
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_TRAM_DATA:
|
|
Packit |
427e91 |
case EMU10K1_PREG_TYPE_TRAM_ADDR:
|
|
Packit |
427e91 |
if ((arg & 0xFFFFFFF) >= new_patch->tram_acc_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
return LD10K1_ERR_INSTR_ARG_INDEX;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_patch_fnc_del(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_fnc_patch_del_t *patch_fnc)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch_fnc->where >= 0 && patch_fnc->where < EMU10K1_PATCH_MAX) {
|
|
Packit |
427e91 |
if (dsp_mgr->patch_ptr[patch_fnc->where]) {
|
|
Packit |
427e91 |
if ((err = ld10k1_dsp_mgr_patch_unload(dsp_mgr,
|
|
Packit |
427e91 |
dsp_mgr->patch_ptr[patch_fnc->where],
|
|
Packit |
427e91 |
patch_fnc->where)) < 0)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_connection_fnc(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_fnc_connection_t *connection_fnc, int *conn_id)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_patch_t *from_patch = NULL;
|
|
Packit |
427e91 |
ld10k1_patch_t *to_patch = NULL;
|
|
Packit |
427e91 |
ld10k1_conn_point_t *from_point = NULL;
|
|
Packit |
427e91 |
ld10k1_conn_point_t *to_point = NULL;
|
|
Packit |
427e91 |
ld10k1_conn_point_t *tmp_point = NULL;
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->what == FNC_CONNECTION_ADD) {
|
|
Packit |
427e91 |
if (connection_fnc->from_type != CON_IO_PIN &&
|
|
Packit |
427e91 |
connection_fnc->from_type != CON_IO_POUT &&
|
|
Packit |
427e91 |
connection_fnc->from_type != CON_IO_FX &&
|
|
Packit |
427e91 |
connection_fnc->from_type != CON_IO_IN &&
|
|
Packit |
427e91 |
connection_fnc->from_type != CON_IO_OUT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
if (connection_fnc->to_type != CON_IO_PIN &&
|
|
Packit |
427e91 |
connection_fnc->to_type != CON_IO_POUT &&
|
|
Packit |
427e91 |
connection_fnc->to_type != CON_IO_FX &&
|
|
Packit |
427e91 |
connection_fnc->to_type != CON_IO_IN &&
|
|
Packit |
427e91 |
connection_fnc->to_type != CON_IO_OUT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* first must be patch */
|
|
Packit |
427e91 |
if (connection_fnc->from_type != CON_IO_PIN && connection_fnc->from_type != CON_IO_POUT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->from_type == CON_IO_PIN &&
|
|
Packit |
427e91 |
connection_fnc->to_type == CON_IO_OUT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
if (connection_fnc->from_type == CON_IO_POUT &&
|
|
Packit |
427e91 |
(connection_fnc->to_type == CON_IO_FX ||
|
|
Packit |
427e91 |
connection_fnc->to_type == CON_IO_IN))
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->from_patch < 0 || connection_fnc->from_patch >= EMU10K1_PATCH_MAX)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
from_patch = dsp_mgr->patch_ptr[connection_fnc->from_patch];
|
|
Packit |
427e91 |
if (!from_patch)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->to_type == CON_IO_PIN ||
|
|
Packit |
427e91 |
connection_fnc->to_type == CON_IO_POUT) {
|
|
Packit |
427e91 |
if (connection_fnc->to_patch < 0 || connection_fnc->to_patch >= EMU10K1_PATCH_MAX)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
to_patch = dsp_mgr->patch_ptr[connection_fnc->to_patch];
|
|
Packit |
427e91 |
if (!to_patch)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
to_patch = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (from_patch == to_patch)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->to_io < 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
if (connection_fnc->from_io < 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
if (connection_fnc->from_type == CON_IO_PIN) {
|
|
Packit |
427e91 |
if (connection_fnc->from_io >= from_patch->in_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
from_point = from_patch->ins[connection_fnc->from_io].point;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (connection_fnc->from_io >= from_patch->out_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
from_point = from_patch->outs[connection_fnc->from_io].point;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (connection_fnc->to_type) {
|
|
Packit |
427e91 |
case CON_IO_FX:
|
|
Packit |
427e91 |
if (connection_fnc->to_io >= dsp_mgr->fx_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
to_point = dsp_mgr->fxs[connection_fnc->to_io].point;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_IN:
|
|
Packit |
427e91 |
if (connection_fnc->to_io >= dsp_mgr->in_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
to_point = dsp_mgr->ins[connection_fnc->to_io].point;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_OUT:
|
|
Packit |
427e91 |
if (connection_fnc->to_io >= dsp_mgr->out_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
to_point = dsp_mgr->outs[connection_fnc->to_io].point;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_PIN:
|
|
Packit |
427e91 |
if (connection_fnc->to_io >= to_patch->in_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
to_point = to_patch->ins[connection_fnc->to_io].point;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_POUT:
|
|
Packit |
427e91 |
if (connection_fnc->to_io >= to_patch->out_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
to_point = to_patch->outs[connection_fnc->to_io].point;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (from_patch && to_patch) {
|
|
Packit |
427e91 |
if (from_point == to_point)
|
|
Packit |
427e91 |
if (from_point)
|
|
Packit |
427e91 |
if (connection_fnc->multi || from_point->con_count == 2)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
if (!connection_fnc->multi || !to_point) {
|
|
Packit |
427e91 |
if (!(tmp_point = ld10k1_conn_point_alloc(connection_fnc->simple)))
|
|
Packit |
427e91 |
return LD10K1_ERR_NO_MEM;
|
|
Packit |
427e91 |
if ((err = ld10k1_conn_point_set_to(dsp_mgr, tmp_point, 0, -1)) < 0) {
|
|
Packit |
427e91 |
ld10k1_conn_point_free(dsp_mgr, tmp_point);
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* reconnect to patch */
|
|
Packit |
427e91 |
if ((err = ld10k1_conn_point_add(dsp_mgr, tmp_point, connection_fnc->to_type, to_patch, connection_fnc->to_io)) < 0) {
|
|
Packit |
427e91 |
ld10k1_conn_point_free(dsp_mgr, tmp_point);
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
tmp_point = to_point;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* reconnect from patch */
|
|
Packit |
427e91 |
if ((err = ld10k1_conn_point_add(dsp_mgr, tmp_point, connection_fnc->from_type, from_patch, connection_fnc->from_io)) < 0) {
|
|
Packit |
427e91 |
/* if point is allocated now this call can't fail */
|
|
Packit |
427e91 |
/* ld10k1_conn_point_free(dsp_mgr, tmp_point); */
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (from_point == to_point && from_point)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
if (!to_point) {
|
|
Packit |
427e91 |
if (!(tmp_point = ld10k1_conn_point_alloc(0)))
|
|
Packit |
427e91 |
return LD10K1_ERR_NO_MEM;
|
|
Packit |
427e91 |
if ((err = ld10k1_conn_point_set_to(dsp_mgr, tmp_point, connection_fnc->to_type, connection_fnc->to_io)) < 0) {
|
|
Packit |
427e91 |
ld10k1_conn_point_free(dsp_mgr, tmp_point);
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
tmp_point = to_point;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* reconnect from patch */
|
|
Packit |
427e91 |
if ((err = ld10k1_conn_point_add(dsp_mgr, tmp_point, connection_fnc->from_type, from_patch, connection_fnc->from_io)) < 0) {
|
|
Packit |
427e91 |
/* if point is allocated now this call can't fail */
|
|
Packit |
427e91 |
/* ld10k1_conn_point_free(dsp_mgr, tmp_point); */
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (tmp_point->id <= 0)
|
|
Packit |
427e91 |
tmp_point->id = ld10k1_gen_patch_id(dsp_mgr, connection_fnc->from_patch);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*conn_id = tmp_point->id;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr(dsp_mgr);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
} if (connection_fnc->what == FNC_CONNECTION_DEL) {
|
|
Packit |
427e91 |
if (connection_fnc->from_type != CON_IO_PIN &&
|
|
Packit |
427e91 |
connection_fnc->from_type != CON_IO_POUT)
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->from_patch < 0 || connection_fnc->from_patch >= EMU10K1_PATCH_MAX)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
from_patch = dsp_mgr->patch_ptr[connection_fnc->from_patch];
|
|
Packit |
427e91 |
if (!from_patch)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->from_io < 0)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (connection_fnc->from_type == CON_IO_PIN) {
|
|
Packit |
427e91 |
if (connection_fnc->from_io >= from_patch->in_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
from_point = from_patch->ins[connection_fnc->from_io].point;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (connection_fnc->from_io >= from_patch->out_count)
|
|
Packit |
427e91 |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit |
427e91 |
from_point = from_patch->outs[connection_fnc->from_io].point;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*conn_id = -1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!from_point)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((EMU10K1_REG_TYPE_B(from_point->con_gpr_idx) == EMU10K1_REG_TYPE_NORMAL && from_point->con_count > 1) ||
|
|
Packit |
427e91 |
from_point->con_count > 0)
|
|
Packit |
427e91 |
*conn_id = from_point->id;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_del(dsp_mgr, from_point, connection_fnc->from_type, from_patch, connection_fnc->from_io);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr(dsp_mgr);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
return LD10K1_ERR_CONNECTION_FNC;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *ld10k1_look_control_from_list(ld10k1_ctl_list_item_t *list, ld10k1_ctl_t *gctl)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (item = list; item != NULL; item = item->next)
|
|
Packit |
427e91 |
if (strcmp(item->ctl.name, gctl->name) == 0 && item->ctl.index == gctl->index)
|
|
Packit |
427e91 |
return item;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_add_control_to_list(ld10k1_ctl_list_item_t **list, int *count, ld10k1_ctl_t *gctl)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
item = ld10k1_look_control_from_list(*list, gctl);
|
|
Packit |
427e91 |
if (!item) {
|
|
Packit |
427e91 |
item = (ld10k1_ctl_list_item_t *)malloc(sizeof(ld10k1_ctl_list_item_t));
|
|
Packit |
427e91 |
if (!item)
|
|
Packit |
427e91 |
return LD10K1_ERR_NO_MEM;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
item->next = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!*list)
|
|
Packit |
427e91 |
/* empty */
|
|
Packit |
427e91 |
*list = item;
|
|
Packit |
427e91 |
else {
|
|
Packit |
427e91 |
/* add to begining */
|
|
Packit |
427e91 |
item->next = *list;
|
|
Packit |
427e91 |
*list = item;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
(*count)++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memcpy(&(item->ctl), gctl, sizeof(*gctl));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_del_control_from_list(ld10k1_ctl_list_item_t **list, int *count, ld10k1_ctl_t *gctl)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item;
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!*list)
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
item = ld10k1_look_control_from_list(*list, gctl);
|
|
Packit |
427e91 |
if (!item)
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*list == item) {
|
|
Packit |
427e91 |
*list = item->next;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
for (item1 = *list; item1->next != NULL; item1 = item1->next)
|
|
Packit |
427e91 |
if (item1->next == item) {
|
|
Packit |
427e91 |
item1->next = item->next;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free(item);
|
|
Packit |
427e91 |
(*count)--;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_del_all_controls_from_list(ld10k1_ctl_list_item_t **list, int *count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item;
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (item = *list; item != NULL;) {
|
|
Packit |
427e91 |
item1 = item->next;
|
|
Packit |
427e91 |
free(item);
|
|
Packit |
427e91 |
item = item1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*count = 0;
|
|
Packit |
427e91 |
*list = NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_get_used_index_for_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl, int **idxs, int *cnt)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
ld10k1_ctl_list_item_t *item;
|
|
Packit |
427e91 |
ld10k1_reserved_ctl_list_item_t *itemr;
|
|
Packit |
427e91 |
int count;
|
|
Packit |
427e91 |
int *index_list;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
count = 0;
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* first get count */
|
|
Packit |
427e91 |
for (item = dsp_mgr->ctl_list; item != NULL; item = item->next)
|
|
Packit |
427e91 |
if (strcmp(item->ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
count++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (item = dsp_mgr->add_ctl_list; item != NULL; item = item->next)
|
|
Packit |
427e91 |
if (strcmp(item->ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
count++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (itemr = dsp_mgr->reserved_ctl_list; itemr != NULL; itemr = itemr->next)
|
|
Packit |
427e91 |
if (strcmp(itemr->res_ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
count++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!count) {
|
|
Packit |
427e91 |
*idxs = NULL;
|
|
Packit |
427e91 |
*cnt = 0;
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* second get array */
|
|
Packit |
427e91 |
index_list = (int *)malloc(sizeof(int) * count);
|
|
Packit |
427e91 |
if (!index_list)
|
|
Packit |
427e91 |
return LD10K1_ERR_NO_MEM;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (item = dsp_mgr->ctl_list; item != NULL; item = item->next)
|
|
Packit |
427e91 |
if (strcmp(item->ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
index_list[i++] = item->ctl.index;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (item = dsp_mgr->add_ctl_list; item != NULL; item = item->next)
|
|
Packit |
427e91 |
if (strcmp(item->ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
index_list[i++] = item->ctl.index;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (itemr = dsp_mgr->reserved_ctl_list; itemr != NULL; itemr = itemr->next)
|
|
Packit |
427e91 |
if (strcmp(itemr->res_ctl.name, gctl->name) == 0)
|
|
Packit |
427e91 |
index_list[i++] = itemr->res_ctl.index;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*idxs = index_list;
|
|
Packit |
427e91 |
*cnt = count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_add_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
int *idxs;
|
|
Packit |
427e91 |
int cnt;
|
|
Packit |
427e91 |
int new_idx;
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
int found;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
new_idx = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check index */
|
|
Packit |
427e91 |
if (gctl->want_index < 0) {
|
|
Packit |
427e91 |
/* find free index */
|
|
Packit |
427e91 |
if ((err = ld10k1_get_used_index_for_control(dsp_mgr, gctl, &idxs, &cnt)) < 0)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (new_idx < 1000) {
|
|
Packit |
427e91 |
found = 0;
|
|
Packit |
427e91 |
for (i = 0; i < cnt; i++) {
|
|
Packit |
427e91 |
if (new_idx == idxs[i]) {
|
|
Packit |
427e91 |
new_idx++;
|
|
Packit |
427e91 |
found = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!found) {
|
|
Packit |
427e91 |
gctl->index = new_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (idxs)
|
|
Packit |
427e91 |
free(idxs);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (new_idx >= 1000)
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_EXISTS;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
gctl->index = gctl->want_index;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* is there control ??? */
|
|
Packit |
427e91 |
if (ld10k1_look_control_from_list(dsp_mgr->ctl_list, gctl))
|
|
Packit |
427e91 |
return LD10K1_ERR_CTL_EXISTS;
|
|
Packit |
427e91 |
/* is for add ??? */
|
|
Packit |
427e91 |
if (ld10k1_look_control_from_list(dsp_mgr->add_ctl_list, gctl))
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* add */
|
|
Packit |
427e91 |
return ld10k1_add_control_to_list(&(dsp_mgr->add_ctl_list), &(dsp_mgr->add_list_count), gctl);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_del_control(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_ctl_t *gctl)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* is for add ??? */
|
|
Packit |
427e91 |
if (ld10k1_look_control_from_list(dsp_mgr->add_ctl_list, gctl)) {
|
|
Packit |
427e91 |
ld10k1_del_control_from_list(&(dsp_mgr->add_ctl_list), &(dsp_mgr->add_list_count), gctl);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* is for del ??? */
|
|
Packit |
427e91 |
if (ld10k1_look_control_from_list(dsp_mgr->del_ctl_list, gctl))
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* delete ??? */
|
|
Packit |
427e91 |
if (ld10k1_look_control_from_list(dsp_mgr->ctl_list, gctl)) {
|
|
Packit |
427e91 |
ld10k1_add_control_to_list(&(dsp_mgr->del_ctl_list), &(dsp_mgr->del_list_count), gctl);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* this will by usefull with modified as10k1 */
|
|
Packit |
427e91 |
unsigned int named_to_standard[] =
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* FX buses */
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_LEFT, EMU10K1_REG_FX(0x00), EMU10K1_REG_FX(0x00),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_RIGHT, EMU10K1_REG_FX(0x01), EMU10K1_REG_FX(0x01),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_FRONT_LEFT, EMU10K1_REG_FX(0x08), EMU10K1_REG_FX(0x08),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_FRONT_RIGHT, EMU10K1_REG_FX(0x09), EMU10K1_REG_FX(0x09),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_REAR_LEFT, EMU10K1_REG_FX(0x02), EMU10K1_REG_FX(0x02),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_REAR_RIGHT, EMU10K1_REG_FX(0x03), EMU10K1_REG_FX(0x03),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_CENTER, EMU10K1_REG_FX(0x06), EMU10K1_REG_FX(0x06),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_PCM_LFE, EMU10K1_REG_FX(0x07), EMU10K1_REG_FX(0x07),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_MIDI_LEFT, EMU10K1_REG_FX(0x04), EMU10K1_REG_FX(0x04),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_MIDI_RIGHT, EMU10K1_REG_FX(0x05), EMU10K1_REG_FX(0x05),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_MIDI_REVERB, EMU10K1_REG_FX(0x0C), EMU10K1_REG_FX(0x0C),
|
|
Packit |
427e91 |
EMU10K1_NREG_FXBUS_MIDI_CHORUS, EMU10K1_REG_FX(0x0D), EMU10K1_REG_FX(0x0D),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_A_NREG_FXBUS_PT_LEFT, 0, EMU10K1_REG_FX(0x14),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_FXBUS_PT_RIGHT, 0, EMU10K1_REG_FX(0x15),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* inputs */
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_AC97_LEFT, EMU10K1_REG_IN(0x00), EMU10K1_REG_IN(0x00),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_AC97_RIGHT, EMU10K1_REG_IN(0x01), EMU10K1_REG_IN(0x01),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_SPDIF_CD_LEFT, EMU10K1_REG_IN(0x02), EMU10K1_REG_IN(0x02),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_SPDIF_CD_RIGHT, EMU10K1_REG_IN(0x03), EMU10K1_REG_IN(0x03),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_SPDIF_OPT_LEFT, EMU10K1_REG_IN(0x06), EMU10K1_REG_IN(0x04),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_SPDIF_OPT_RIGHT, EMU10K1_REG_IN(0x07), EMU10K1_REG_IN(0x05),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_I2S_1_LEFT, EMU10K1_REG_IN(0x08), EMU10K1_REG_IN(0x08),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_I2S_1_RIGHT, EMU10K1_REG_IN(0x09), EMU10K1_REG_IN(0x09),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_I2S_2_LEFT, EMU10K1_REG_IN(0x0C), EMU10K1_REG_IN(0x0C),
|
|
Packit |
427e91 |
EMU10K1_NREG_IN_I2S_2_RIGHT, EMU10K1_REG_IN(0x0D), EMU10K1_REG_IN(0x0D),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_SPDIF_COAX_LEFT, EMU10K1_REG_IN(0x0A), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_SPDIF_COAX_RIGHT, EMU10K1_REG_IN(0x0B), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_ZOOM_LEFT, EMU10K1_REG_IN(0x04), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_ZOOM_RIGHT, EMU10K1_REG_IN(0x05), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_LINE_1_LEFT, EMU10K1_REG_IN(0x08), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_LINE_1_RIGHT, EMU10K1_REG_IN(0x09), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_LINE_2_LEFT, EMU10K1_REG_IN(0x0C), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_IN_LINE_2_RIGHT, EMU10K1_REG_IN(0x0D), 0,
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_1_LEFT, 0, EMU10K1_REG_IN(0x0A),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_1_RIGHT, 0, EMU10K1_REG_IN(0x0B),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_2_LEFT, 0, EMU10K1_REG_IN(0x08),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_2_RIGHT, 0, EMU10K1_REG_IN(0x09),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_3_LEFT, 0, EMU10K1_REG_IN(0x0C),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_IN_LINE_3_RIGHT, 0, EMU10K1_REG_IN(0x0D),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* outputs */
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_FRONT_LEFT, EMU10K1_REG_OUT(0x00), EMU10K1_REG_OUT(0x08),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_FRONT_RIGHT, EMU10K1_REG_OUT(0x01), EMU10K1_REG_OUT(0x09),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_REAR_LEFT, EMU10K1_REG_OUT(0x08), EMU10K1_REG_OUT(0x0E),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_REAR_RIGHT, EMU10K1_REG_OUT(0x09), EMU10K1_REG_OUT(0x0F),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_CENTER, EMU10K1_REG_OUT(0x04), EMU10K1_REG_OUT(0x0A),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_LFE, EMU10K1_REG_OUT(0x05), EMU10K1_REG_OUT(0x0B),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_AC97_LEFT, EMU10K1_REG_OUT(0x00), EMU10K1_REG_OUT(0x10),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_AC97_RIGHT, EMU10K1_REG_OUT(0x01), EMU10K1_REG_OUT(0x11),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_ADC_LEFT, EMU10K1_REG_OUT(0x0A), EMU10K1_REG_OUT(0x16),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_ADC_RIGHT, EMU10K1_REG_OUT(0x0B), EMU10K1_REG_OUT(0x17),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_MIC, EMU10K1_REG_OUT(0x0C), EMU10K1_REG_OUT(0x18),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_HEADPHONE_LEFT, EMU10K1_REG_OUT(0x06), EMU10K1_REG_OUT(0x04),
|
|
Packit |
427e91 |
EMU10K1_NREG_OUT_HEADPHONE_RIGHT, EMU10K1_REG_OUT(0x07), EMU10K1_REG_OUT(0x05),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_L_NREG_OUT_OPT_LEFT, EMU10K1_REG_OUT(0x02), 0,
|
|
Packit |
427e91 |
EMU10K1_L_NREG_OUT_OPT_RIGHT, EMU10K1_REG_OUT(0x03), 0,
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_FRONT_LEFT, 0, EMU10K1_REG_OUT(0x00),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_FRONT_RIGHT, 0, EMU10K1_REG_OUT(0x01),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_REAR_LEFT, 0, EMU10K1_REG_OUT(0x06),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_REAR_RIGHT, 0, EMU10K1_REG_OUT(0x07),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_CENTER, 0, EMU10K1_REG_OUT(0x02),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_OUT_D_LFE, 0, EMU10K1_REG_OUT(0x03),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* hardware */
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000000, EMU10K1_REG_HW(0x00), EMU10K1_REG_HW(0x00),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000001, EMU10K1_REG_HW(0x01), EMU10K1_REG_HW(0x01),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000002, EMU10K1_REG_HW(0x02), EMU10K1_REG_HW(0x02),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000003, EMU10K1_REG_HW(0x03), EMU10K1_REG_HW(0x03),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000004, EMU10K1_REG_HW(0x04), EMU10K1_REG_HW(0x04),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000008, EMU10K1_REG_HW(0x05), EMU10K1_REG_HW(0x05),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000010, EMU10K1_REG_HW(0x06), EMU10K1_REG_HW(0x06),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000020, EMU10K1_REG_HW(0x07), EMU10K1_REG_HW(0x07),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00000100, EMU10K1_REG_HW(0x08), EMU10K1_REG_HW(0x08),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00010000, EMU10K1_REG_HW(0x09), EMU10K1_REG_HW(0x09),
|
|
Packit |
427e91 |
EMU10K1_L_NREG_CONST_00080000, EMU10K1_REG_HW(0x0A), 0,
|
|
Packit |
427e91 |
EMU10K1_A_NREG_CONST_00000800, 0, EMU10K1_REG_HW(0x0A),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_10000000, EMU10K1_REG_HW(0x0B), EMU10K1_REG_HW(0x0B),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_20000000, EMU10K1_REG_HW(0x0C), EMU10K1_REG_HW(0x0C),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_40000000, EMU10K1_REG_HW(0x0D), EMU10K1_REG_HW(0x0D),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_80000000, EMU10K1_REG_HW(0x0E), EMU10K1_REG_HW(0x0E),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_7FFFFFFF, EMU10K1_REG_HW(0x0F), EMU10K1_REG_HW(0x0F),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_FFFFFFFF, EMU10K1_REG_HW(0x10), EMU10K1_REG_HW(0x10),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_FFFFFFFE, EMU10K1_REG_HW(0x11), EMU10K1_REG_HW(0x11),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_C0000000, EMU10K1_REG_HW(0x12), EMU10K1_REG_HW(0x12),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_4F1BBCDC, EMU10K1_REG_HW(0x13), EMU10K1_REG_HW(0x13),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_5A7EF9DB, EMU10K1_REG_HW(0x14), EMU10K1_REG_HW(0x14),
|
|
Packit |
427e91 |
EMU10K1_NREG_CONST_00100000, EMU10K1_REG_HW(0x15), EMU10K1_REG_HW(0x15),
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_ACCUM, EMU10K1_REG_HW(0x16), EMU10K1_REG_HW(0x16),
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_CCR, EMU10K1_REG_HW(0x17), EMU10K1_REG_HW(0x17),
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_NOISE1, EMU10K1_REG_HW(0x18), EMU10K1_REG_HW(0x18),
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_NOISE2, EMU10K1_REG_HW(0x19), EMU10K1_REG_HW(0x19),
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_IRQ, EMU10K1_REG_HW(0x1A), EMU10K1_REG_HW(0x1A),
|
|
Packit |
427e91 |
EMU10K1_NREG_HW_DBAC, EMU10K1_REG_HW(0x1B), EMU10K1_REG_HW(0x1B),
|
|
Packit |
427e91 |
EMU10K1_A_NREG_HW_DBACE, 0, EMU10K1_REG_HW(0x1D),
|
|
Packit |
427e91 |
0
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int ld10k1_resolve_named_reg(ld10k1_dsp_mgr_t *dsp_mgr, unsigned int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* find named - better will be use of binary search */
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
while (named_to_standard[i]) {
|
|
Packit |
427e91 |
if (named_to_standard[i] == reg)
|
|
Packit |
427e91 |
return dsp_mgr->audigy ? named_to_standard[i + 2] : named_to_standard[i + 1];
|
|
Packit |
427e91 |
i += 3;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int ld10k1_gpr_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_count, int *res_count, int *res,
|
|
Packit |
427e91 |
unsigned int usage, unsigned int val)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
if (*res_count >= max_res_count)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->regs_max_count; i++) {
|
|
Packit |
427e91 |
if (!dsp_mgr->regs[i].used) {
|
|
Packit |
427e91 |
/* check in reserved */
|
|
Packit |
427e91 |
for (j = 0; j < *res_count; j++) {
|
|
Packit |
427e91 |
if (res[j] == i)
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (j >= *res_count) {
|
|
Packit |
427e91 |
res[*res_count] = i;
|
|
Packit |
427e91 |
(*res_count)++;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].gpr_usage = usage;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].val = val;
|
|
Packit |
427e91 |
return EMU10K1_REG_NORMAL(i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int ld10k1_gpr_dyn_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_count, int *res_count, int *res)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
if (*res_count >= max_res_count)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* try find other dyn not reserved */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->regs_max_count; i++) {
|
|
Packit |
427e91 |
if (dsp_mgr->regs[i].used && dsp_mgr->regs[i].gpr_usage == GPR_USAGE_DYNAMIC) {
|
|
Packit |
427e91 |
/* check in reserved */
|
|
Packit |
427e91 |
for (j = 0; j < *res_count; j++) {
|
|
Packit |
427e91 |
if (res[j] == i)
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (j >= *res_count) {
|
|
Packit |
427e91 |
res[*res_count] = i;
|
|
Packit |
427e91 |
(*res_count)++;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].gpr_usage = GPR_USAGE_DYNAMIC;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].val = 0;
|
|
Packit |
427e91 |
return EMU10K1_REG_NORMAL(i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* not found - try normal */
|
|
Packit |
427e91 |
return ld10k1_gpr_reserve(dsp_mgr, max_res_count, res_count, res, GPR_USAGE_DYNAMIC, 0);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_gpr_alloc(ld10k1_dsp_mgr_t *dsp_mgr, int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i = reg & 0x0FFFFFFF;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].ref++;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].used = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_gpr_free(ld10k1_dsp_mgr_t *dsp_mgr, int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i = reg & 0x0FFFFFFF;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].gpr_usage = GPR_USAGE_NONE;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].val = 0;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].ref--;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].modified = 1;
|
|
Packit |
427e91 |
dsp_mgr->regs[i].used = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int ld10k1_const_reserve(ld10k1_dsp_mgr_t *dsp_mgr, int max_res_const_count, int *res_const_count, int *res_const,
|
|
Packit |
427e91 |
int max_res_count, int *res_count, int *res, int const_val)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
int free_gpr;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*res_const_count >= max_res_const_count)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check in reserved */
|
|
Packit |
427e91 |
for (i = 0; i < *res_const_count; i++) {
|
|
Packit |
427e91 |
if (dsp_mgr->consts[res_const[i]].const_val == const_val)
|
|
Packit |
427e91 |
return EMU10K1_REG_CONST(res_const[i]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check in all constants */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->consts_max_count; i++)
|
|
Packit |
427e91 |
if (dsp_mgr->consts[i].used && dsp_mgr->consts[i].const_val == const_val) {
|
|
Packit |
427e91 |
/* add to reserved */
|
|
Packit |
427e91 |
res_const[*res_const_count] = i;
|
|
Packit |
427e91 |
(*res_const_count)++;
|
|
Packit |
427e91 |
return EMU10K1_REG_CONST(i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* try find other dyn not reserved */
|
|
Packit |
427e91 |
for (i = 0; i < dsp_mgr->consts_max_count; i++) {
|
|
Packit |
427e91 |
if (!dsp_mgr->consts[i].used) {
|
|
Packit |
427e91 |
/* there is free room */
|
|
Packit |
427e91 |
/* if in reserved continue */
|
|
Packit |
427e91 |
for (j = 0; j < *res_const_count; j++) {
|
|
Packit |
427e91 |
if (res_const[j] == i)
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (j < *res_const_count)
|
|
Packit |
427e91 |
continue;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free_gpr = ld10k1_gpr_reserve(dsp_mgr, max_res_count, res_count, res, GPR_USAGE_CONST, const_val);
|
|
Packit |
427e91 |
if (!free_gpr)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
res_const[*res_const_count] = i;
|
|
Packit |
427e91 |
(*res_const_count)++;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].gpr_idx = free_gpr;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].const_val = const_val;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].hw = 0;
|
|
Packit |
427e91 |
return EMU10K1_REG_CONST(i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_const_alloc(ld10k1_dsp_mgr_t *dsp_mgr, int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i = reg & 0x0FFFFFFF;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].ref++;
|
|
Packit |
427e91 |
if (!dsp_mgr->consts[i].used) {
|
|
Packit |
427e91 |
/*ld10k1_gpr_free(dsp_mgr, dsp_mgr->consts[i].gpr_idx);*/
|
|
Packit |
427e91 |
dsp_mgr->consts[i].used = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_const_free(ld10k1_dsp_mgr_t *dsp_mgr, int reg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i = reg & 0x0FFFFFFF;
|
|
Packit |
427e91 |
dsp_mgr->consts[i].ref--;
|
|
Packit |
427e91 |
if (dsp_mgr->consts[i].ref == 0) {
|
|
Packit |
427e91 |
if (!dsp_mgr->consts[i].hw)
|
|
Packit |
427e91 |
dsp_mgr->consts[i].used = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_t *ld10k1_conn_point_alloc(int simple)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_conn_point_t *tmp = (ld10k1_conn_point_t *)malloc(sizeof(ld10k1_conn_point_t));
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!tmp)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp->simple = simple;
|
|
Packit |
427e91 |
tmp->id = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp->next = NULL;
|
|
Packit |
427e91 |
tmp->con_count = 0;
|
|
Packit |
427e91 |
tmp->con_gpr_idx = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp->reserved_gpr = 0;
|
|
Packit |
427e91 |
tmp->reserved_instr = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp->out_instr_offset = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++) {
|
|
Packit |
427e91 |
tmp->type[i] = 0;
|
|
Packit |
427e91 |
tmp->patch[i] = NULL;
|
|
Packit |
427e91 |
tmp->io[i] = -1;
|
|
Packit |
427e91 |
tmp->out_gpr_idx[i] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp->owner = NULL;
|
|
Packit |
427e91 |
tmp->position = INSERT_BEFORE_OWNER;
|
|
Packit |
427e91 |
return tmp;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_conn_point_free(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
point->owner = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] != 0) {
|
|
Packit |
427e91 |
if (point->out_gpr_idx[i]) {
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, point->out_gpr_idx[i]);
|
|
Packit |
427e91 |
point->out_gpr_idx[i] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (point->type[i] == CON_IO_PIN) {
|
|
Packit |
427e91 |
point->patch[i]->ins[point->io[i]].point = NULL;
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, point->patch[i], EMU10K1_PREG_IN(point->io[i]));
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
point->patch[i]->outs[point->io[i]].point = NULL;
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, point->patch[i], EMU10K1_PREG_OUT(point->io[i]));
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
point->con_count--;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
point->type[i] = 0;
|
|
Packit |
427e91 |
point->patch[i] = NULL;
|
|
Packit |
427e91 |
point->io[i] = -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->instr_free += point->reserved_instr;
|
|
Packit |
427e91 |
point->reserved_instr = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_unset(dsp_mgr, point);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_point_actualize_owner(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* instructions should be alocated */
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
int icount, iarg, iout;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_patch_t *tmp_owner = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (point->simple)
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (point->reserved_gpr > 0) {
|
|
Packit |
427e91 |
if (EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_NORMAL) {
|
|
Packit |
427e91 |
/* patch reg */
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == CON_IO_PIN) {
|
|
Packit |
427e91 |
if (!tmp_owner)
|
|
Packit |
427e91 |
tmp_owner = point->patch[i];
|
|
Packit |
427e91 |
else {
|
|
Packit |
427e91 |
if (tmp_owner->order > point->patch[i]->order)
|
|
Packit |
427e91 |
tmp_owner = point->patch[i];
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
point->owner = tmp_owner;
|
|
Packit |
427e91 |
point->position = INSERT_BEFORE_OWNER;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == CON_IO_POUT) {
|
|
Packit |
427e91 |
if (!tmp_owner)
|
|
Packit |
427e91 |
tmp_owner = point->patch[i];
|
|
Packit |
427e91 |
else {
|
|
Packit |
427e91 |
if (tmp_owner->order < point->patch[i]->order)
|
|
Packit |
427e91 |
tmp_owner = point->patch[i];
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
point->owner = tmp_owner;
|
|
Packit |
427e91 |
point->position = INSERT_AFTER_OWNER;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
icount = 0;
|
|
Packit |
427e91 |
iarg = 0;
|
|
Packit |
427e91 |
iout = 0;
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++) {
|
|
Packit |
427e91 |
if (point->out_gpr_idx[i] != 0) {
|
|
Packit |
427e91 |
if (iarg == 0) {
|
|
Packit |
427e91 |
point->out_instr[icount].used = 1;
|
|
Packit |
427e91 |
point->out_instr[icount].modified = 1;
|
|
Packit |
427e91 |
point->out_instr[icount].op_code = iACC3;
|
|
Packit |
427e91 |
point->out_instr[icount].arg[0] = point->con_gpr_idx;
|
|
Packit |
427e91 |
iarg++;
|
|
Packit |
427e91 |
if (iout >= 3) {
|
|
Packit |
427e91 |
point->out_instr[icount].arg[1] = point->con_gpr_idx;
|
|
Packit |
427e91 |
iarg++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
point->out_instr[icount].arg[iarg++] = point->out_gpr_idx[i];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
iout++;
|
|
Packit |
427e91 |
if (iarg > 3) {
|
|
Packit |
427e91 |
icount++;
|
|
Packit |
427e91 |
iarg = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (iarg > 0/* && iarg <= 3*/)
|
|
Packit |
427e91 |
for (i = iarg; i < 4; i++)
|
|
Packit |
427e91 |
point->out_instr[icount].arg[i] = EMU10K1_REG_HW(0);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
point->owner = NULL;
|
|
Packit |
427e91 |
point->position = INSERT_BEFORE_OWNER;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_conn_point_set_to(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, int io)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int reserved_tmp;
|
|
Packit |
427e91 |
int reserved_tmp_count = 0;
|
|
Packit |
427e91 |
unsigned int reserved;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (type) {
|
|
Packit |
427e91 |
case CON_IO_FX:
|
|
Packit |
427e91 |
dsp_mgr->fxs[io].point = point;
|
|
Packit |
427e91 |
point->con_gpr_idx = EMU10K1_REG_FX(io);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_IN:
|
|
Packit |
427e91 |
dsp_mgr->ins[io].point = point;
|
|
Packit |
427e91 |
point->con_gpr_idx = EMU10K1_REG_IN(io);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case CON_IO_OUT:
|
|
Packit |
427e91 |
dsp_mgr->outs[io].point = point;
|
|
Packit |
427e91 |
point->con_gpr_idx = EMU10K1_REG_OUT(io);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
reserved = ld10k1_gpr_reserve(dsp_mgr, 1, &reserved_tmp_count, &reserved_tmp, GPR_USAGE_NORMAL, 0);
|
|
Packit |
427e91 |
if (!reserved)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
ld10k1_gpr_alloc(dsp_mgr, reserved);
|
|
Packit |
427e91 |
point->con_gpr_idx = reserved;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* FIXME - aktualizacia instrukcii */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_add_to_list(dsp_mgr, point);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_conn_point_unset(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int index = point->con_gpr_idx & ~EMU10K1_REG_TYPE_MASK;
|
|
Packit |
427e91 |
switch (EMU10K1_REG_TYPE_B(point->con_gpr_idx)) {
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_FX:
|
|
Packit |
427e91 |
dsp_mgr->fxs[index].point = NULL;
|
|
Packit |
427e91 |
point->con_gpr_idx = 0;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_INPUT:
|
|
Packit |
427e91 |
dsp_mgr->ins[index].point = NULL;
|
|
Packit |
427e91 |
point->con_gpr_idx = 0;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case EMU10K1_REG_TYPE_OUTPUT:
|
|
Packit |
427e91 |
dsp_mgr->outs[index].point = NULL;
|
|
Packit |
427e91 |
point->con_gpr_idx = 0;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, point->con_gpr_idx);
|
|
Packit |
427e91 |
point->con_gpr_idx = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ld10k1_conn_point_del_from_list(dsp_mgr, point);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* FIXME - aktualizacia instrukcii */
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_conn_point_add(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
int poutcount;
|
|
Packit |
427e91 |
int allocgprcount = 0;
|
|
Packit |
427e91 |
int allocinstrcount = 0;
|
|
Packit |
427e91 |
unsigned int reserved[2];
|
|
Packit |
427e91 |
unsigned int res[2];
|
|
Packit |
427e91 |
int reservedcount = 0;
|
|
Packit |
427e91 |
int usedreserved = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (point->con_count >= MAX_CONN_PER_POINT)
|
|
Packit |
427e91 |
return LD10K1_ERR_MAX_CON_PER_POINT;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check pout count */
|
|
Packit |
427e91 |
if (!point->simple && type == CON_IO_POUT) {
|
|
Packit |
427e91 |
poutcount = 0;
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == CON_IO_POUT)
|
|
Packit |
427e91 |
poutcount++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (poutcount > 0) {
|
|
Packit |
427e91 |
if (poutcount < 2) {
|
|
Packit |
427e91 |
allocgprcount = 2;
|
|
Packit |
427e91 |
allocinstrcount = 1;
|
|
Packit |
427e91 |
} else if (poutcount >= 2) {
|
|
Packit |
427e91 |
allocgprcount = 1;
|
|
Packit |
427e91 |
if ((poutcount - 3) % 2 == 0) {
|
|
Packit |
427e91 |
allocinstrcount = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* allocate instr */
|
|
Packit |
427e91 |
if (dsp_mgr->instr_free < allocinstrcount)
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_INSTR;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* allocate gpr */
|
|
Packit |
427e91 |
for (i = 0; i < allocgprcount; i++) {
|
|
Packit |
427e91 |
reserved[i] = ld10k1_gpr_reserve(dsp_mgr, 2, &reservedcount, res, GPR_USAGE_NORMAL, 0);
|
|
Packit |
427e91 |
if (!reserved[i])
|
|
Packit |
427e91 |
return LD10K1_ERR_NOT_FREE_REG;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < allocgprcount; i++)
|
|
Packit |
427e91 |
ld10k1_gpr_alloc(dsp_mgr, reserved[i]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == 0) {
|
|
Packit |
427e91 |
point->type[i] = type;
|
|
Packit |
427e91 |
point->patch[i] = patch;
|
|
Packit |
427e91 |
point->io[i] = io;
|
|
Packit |
427e91 |
point->out_gpr_idx[i] = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (type == CON_IO_PIN) {
|
|
Packit |
427e91 |
if (patch->ins[io].point)
|
|
Packit |
427e91 |
ld10k1_conn_point_del(dsp_mgr, patch->ins[io].point, CON_IO_PIN, patch, io);
|
|
Packit |
427e91 |
patch->ins[io].point = point;
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, patch, EMU10K1_PREG_IN(io));
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (patch->outs[io].point)
|
|
Packit |
427e91 |
ld10k1_conn_point_del(dsp_mgr, patch->outs[io].point, CON_IO_POUT, patch, io);
|
|
Packit |
427e91 |
patch->outs[io].point = point;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (point->simple)
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, patch, EMU10K1_PREG_OUT(io));
|
|
Packit |
427e91 |
else {
|
|
Packit |
427e91 |
/* i is not used anymore */
|
|
Packit |
427e91 |
/* for all CON_IO_POUT where isn't reg add reserved */
|
|
Packit |
427e91 |
if (reservedcount > 0) {
|
|
Packit |
427e91 |
for (j = 0; j < MAX_CONN_PER_POINT; j++) {
|
|
Packit |
427e91 |
if (point->type[j] == CON_IO_POUT && point->out_gpr_idx[j] == 0) {
|
|
Packit |
427e91 |
point->out_gpr_idx[j] = reserved[usedreserved++];
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, point->patch[j], EMU10K1_PREG_OUT(point->io[j]));
|
|
Packit |
427e91 |
if (usedreserved >= reservedcount)
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, patch, EMU10K1_PREG_OUT(io));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dsp_mgr->instr_free -= allocinstrcount;
|
|
Packit |
427e91 |
point->reserved_gpr += reservedcount;
|
|
Packit |
427e91 |
point->reserved_instr += allocinstrcount;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (reservedcount > 0)
|
|
Packit |
427e91 |
ld10k1_point_actualize_owner(dsp_mgr, point);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
point->con_count++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return LD10K1_ERR_MAX_CON_PER_POINT;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_conn_point_del(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
int poutcount;
|
|
Packit |
427e91 |
int inc, outc;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == type && point->patch[i] == patch && point->io[i] == io) {
|
|
Packit |
427e91 |
point->type[i] = 0;
|
|
Packit |
427e91 |
point->patch[i] = NULL;
|
|
Packit |
427e91 |
point->io[i] = -1;
|
|
Packit |
427e91 |
if (type == CON_IO_PIN) {
|
|
Packit |
427e91 |
patch->ins[io].point = NULL;
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, patch, EMU10K1_PREG_IN(io));
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
patch->outs[io].point = NULL;
|
|
Packit |
427e91 |
if (!point->simple && point->out_gpr_idx[i]) {
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, point->out_gpr_idx[i]);
|
|
Packit |
427e91 |
point->reserved_gpr--;
|
|
Packit |
427e91 |
point->out_gpr_idx[i] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, patch, EMU10K1_PREG_OUT(io));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!point->simple) {
|
|
Packit |
427e91 |
/* get pout count */
|
|
Packit |
427e91 |
poutcount = 0;
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++)
|
|
Packit |
427e91 |
if (point->type[i] == CON_IO_POUT)
|
|
Packit |
427e91 |
poutcount++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (poutcount > 0) {
|
|
Packit |
427e91 |
if (poutcount < 2) {
|
|
Packit |
427e91 |
/* free all gpr and instr */
|
|
Packit |
427e91 |
for (j = 0; j < MAX_CONN_PER_POINT; j++)
|
|
Packit |
427e91 |
if (point->type[j] == CON_IO_POUT && point->out_gpr_idx[j]) {
|
|
Packit |
427e91 |
ld10k1_dsp_mgr_actualize_instr_for_reg(dsp_mgr, point->patch[j], EMU10K1_PREG_OUT(point->io[j]));
|
|
Packit |
427e91 |
ld10k1_gpr_free(dsp_mgr, point->out_gpr_idx[j]);
|
|
Packit |
427e91 |
point->reserved_gpr--;
|
|
Packit |
427e91 |
point->out_gpr_idx[j] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
dsp_mgr->instr_free += point->reserved_instr;
|
|
Packit |
427e91 |
point->reserved_instr -= point->reserved_instr;
|
|
Packit |
427e91 |
} else if ((poutcount - 3) % 2 == 0) {
|
|
Packit |
427e91 |
/* free 1 instruction */
|
|
Packit |
427e91 |
dsp_mgr->instr_free += 1;
|
|
Packit |
427e91 |
point->reserved_instr -= 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ld10k1_point_actualize_owner(dsp_mgr, point);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
point->con_count--;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check in out count */
|
|
Packit |
427e91 |
outc = 0;
|
|
Packit |
427e91 |
inc = 0;
|
|
Packit |
427e91 |
for (j = 0; j < MAX_CONN_PER_POINT; j++) {
|
|
Packit |
427e91 |
if (point->type[j] == CON_IO_POUT)
|
|
Packit |
427e91 |
outc++;
|
|
Packit |
427e91 |
else if (point->type[j] == CON_IO_PIN)
|
|
Packit |
427e91 |
inc++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_NORMAL && point->con_count <= 1) ||
|
|
Packit |
427e91 |
point->con_count <= 0 ||
|
|
Packit |
427e91 |
((outc <= 0 || inc <= 0) && EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_NORMAL))
|
|
Packit |
427e91 |
ld10k1_conn_point_free(dsp_mgr, point);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_conn_point_get_reg(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point, int type, ld10k1_patch_t *patch, int io)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned int reg = 0;
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < MAX_CONN_PER_POINT; i++) {
|
|
Packit |
427e91 |
if (point->patch[i] == patch &&
|
|
Packit |
427e91 |
point->type[i] == type &&
|
|
Packit |
427e91 |
point->io[i] == io) {
|
|
Packit |
427e91 |
reg = point->out_gpr_idx[i];
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (reg == 0)
|
|
Packit |
427e91 |
reg = point->con_gpr_idx;
|
|
Packit |
427e91 |
return reg;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ld10k1_gen_patch_id(ld10k1_dsp_mgr_t *dsp_mgr, int pnum)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int nid = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
nid = dsp_mgr->patch_id_gens[pnum]++ | pnum << 16;
|
|
Packit |
427e91 |
return nid;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_conn_point_add_to_list(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
if (dsp_mgr->point_list)
|
|
Packit |
427e91 |
point->next = dsp_mgr->point_list;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
point->next = NULL;
|
|
Packit |
427e91 |
dsp_mgr->point_list = point;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void ld10k1_conn_point_del_from_list(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
ld10k1_conn_point_t *tmp = dsp_mgr->point_list;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (tmp == point) {
|
|
Packit |
427e91 |
dsp_mgr->point_list = point->next;
|
|
Packit |
427e91 |
point->next = NULL;
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (tmp) {
|
|
Packit |
427e91 |
if (tmp->next == point) {
|
|
Packit |
427e91 |
tmp->next = point->next;
|
|
Packit |
427e91 |
point->next = NULL;
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
tmp = tmp->next;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|