|
Packit Service |
b98cfc |
/*
|
|
Packit Service |
b98cfc |
* EMU10k1 loader
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* Copyright (c) 2003,2004 by Peter Zubaj
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
b98cfc |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
b98cfc |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit Service |
b98cfc |
* (at your option) any later version.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
b98cfc |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
b98cfc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
b98cfc |
* GNU General Public License for more details.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
b98cfc |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
b98cfc |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
*/
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#include "ld10k1.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_fnc.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_tram.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_error.h"
|
|
Packit Service |
b98cfc |
#include <stdlib.h>
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_res_alloc_hwacc(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res);
|
|
Packit Service |
b98cfc |
int ld10k1_tram_realloc_space(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_init_res(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
res->isize = dsp_mgr->i_tram.size;
|
|
Packit Service |
b98cfc |
res->ifree = dsp_mgr->i_tram.size;
|
|
Packit Service |
b98cfc |
res->iacc_count = dsp_mgr->i_tram.max_hwacc;
|
|
Packit Service |
b98cfc |
res->iacc_free_count = dsp_mgr->i_tram.max_hwacc;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
res->esize = dsp_mgr->e_tram.size;
|
|
Packit Service |
b98cfc |
res->efree = dsp_mgr->e_tram.size;
|
|
Packit Service |
b98cfc |
res->eacc_count = dsp_mgr->e_tram.max_hwacc;
|
|
Packit Service |
b98cfc |
res->eacc_free_count = dsp_mgr->e_tram.max_hwacc;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
res->grp_free = res->iacc_free_count + res->eacc_free_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
res->item_count = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_init_res_from_dsp_mgr(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
/* throught all groups */
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_tram_grp; i++) {
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_grp[i].used) {
|
|
Packit Service |
b98cfc |
/* get position */
|
|
Packit Service |
b98cfc |
res->grp_free--;
|
|
Packit Service |
b98cfc |
switch (dsp_mgr->tram_grp[i].req_pos) {
|
|
Packit Service |
b98cfc |
case TRAM_POS_NONE:
|
|
Packit Service |
b98cfc |
case TRAM_POS_AUTO:
|
|
Packit Service |
b98cfc |
/* add to res */
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_idx = i;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_size = dsp_mgr->tram_grp[i].size;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_acc_count = dsp_mgr->tram_grp[i].acc_count;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].res_value = 0;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].pos = TRAM_POS_NONE;
|
|
Packit Service |
b98cfc |
res->item_count++;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case TRAM_POS_INTERNAL:
|
|
Packit Service |
b98cfc |
/* decrease resources */
|
|
Packit Service |
b98cfc |
res->ifree -= dsp_mgr->tram_grp[i].size;
|
|
Packit Service |
b98cfc |
res->iacc_free_count -= dsp_mgr->tram_grp[i].acc_count;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case TRAM_POS_EXTERNAL:
|
|
Packit Service |
b98cfc |
res->efree -= dsp_mgr->tram_grp[i].size;
|
|
Packit Service |
b98cfc |
res->eacc_free_count -= dsp_mgr->tram_grp[i].acc_count;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_acc_count_from_patch(ld10k1_patch_t *patch, int grp)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (count = 0, i = 0; i < patch->tram_acc_count; i++)
|
|
Packit Service |
b98cfc |
if (patch->tram_acc[i].grp == grp)
|
|
Packit Service |
b98cfc |
count++;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return count;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_init_res_from_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int acc_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* through all groups */
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
if (res->grp_free <= 0)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_TRAM_FULL_GRP;
|
|
Packit Service |
b98cfc |
/* get acc count */
|
|
Packit Service |
b98cfc |
acc_count = ld10k1_tram_acc_count_from_patch(patch, i);
|
|
Packit Service |
b98cfc |
if (acc_count <= 0)
|
|
Packit Service |
b98cfc |
continue;
|
|
Packit Service |
b98cfc |
/* get position */
|
|
Packit Service |
b98cfc |
switch (patch->tram_grp[i].grp_pos) {
|
|
Packit Service |
b98cfc |
case TRAM_POS_NONE:
|
|
Packit Service |
b98cfc |
case TRAM_POS_AUTO:
|
|
Packit Service |
b98cfc |
/* add to res */
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_idx = -i - 1;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_size = patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_acc_count = acc_count;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].res_value = 0;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].pos = TRAM_POS_NONE;
|
|
Packit Service |
b98cfc |
res->item_count++;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case TRAM_POS_INTERNAL:
|
|
Packit Service |
b98cfc |
/* decrease resources */
|
|
Packit Service |
b98cfc |
if (res->ifree < patch->tram_grp[i].grp_size)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_ITRAM_FULL;
|
|
Packit Service |
b98cfc |
if (res->iacc_free_count < acc_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_ITRAM_FULL_ACC;
|
|
Packit Service |
b98cfc |
res->ifree -= patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
res->iacc_free_count -= acc_count;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case TRAM_POS_EXTERNAL:
|
|
Packit Service |
b98cfc |
/* decrease resources */
|
|
Packit Service |
b98cfc |
if (res->efree < patch->tram_grp[i].grp_size)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_ETRAM_FULL;
|
|
Packit Service |
b98cfc |
if (res->eacc_free_count < acc_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_ETRAM_FULL_ACC;
|
|
Packit Service |
b98cfc |
res->efree -= patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
res->eacc_free_count -= acc_count;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_init_res_from_patch_copy(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
/* throught all groups */
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int acc_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
/* get acc count */
|
|
Packit Service |
b98cfc |
acc_count = ld10k1_tram_acc_count_from_patch(patch, i);
|
|
Packit Service |
b98cfc |
/* get position */
|
|
Packit Service |
b98cfc |
if (patch->tram_grp[i].grp_pos == TRAM_POS_INTERNAL ||
|
|
Packit Service |
b98cfc |
patch->tram_grp[i].grp_pos == TRAM_POS_EXTERNAL) {
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_idx = -i - 1;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_size = patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].grp_acc_count = acc_count;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].pos = patch->tram_grp[i].grp_pos;
|
|
Packit Service |
b98cfc |
res->items[res->item_count].res_value = 0;
|
|
Packit Service |
b98cfc |
res->item_count++;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_calc_res_value(ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
/* res_value is calculated as grp_size / acc_count */
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < res->item_count; i++)
|
|
Packit Service |
b98cfc |
res->items[i].res_value = res->items[i].grp_size / res->items[i].grp_acc_count;
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
static int ld10k1_tram_sort_res_compare(const void *item1, const void *item2)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_resolve_item_t *i1 = (ld10k1_dsp_tram_resolve_item_t *)item1;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_resolve_item_t *i2 = (ld10k1_dsp_tram_resolve_item_t *)item2;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (i1->res_value == i2->res_value)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
else if (i1->res_value > i2->res_value)
|
|
Packit Service |
b98cfc |
return 1;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_sort_res(ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
qsort(res->items, res->item_count, sizeof(ld10k1_dsp_tram_resolve_item_t), ld10k1_tram_sort_res_compare);
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_resolve_res(ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < res->item_count; i++) {
|
|
Packit Service |
b98cfc |
/* first try internal tram then external tram */
|
|
Packit Service |
b98cfc |
if (res->items[i].grp_size <= res->ifree &&
|
|
Packit Service |
b98cfc |
res->items[i].grp_acc_count <= res->iacc_free_count) {
|
|
Packit Service |
b98cfc |
/* put it into itram */
|
|
Packit Service |
b98cfc |
res->ifree -= res->items[i].grp_size;
|
|
Packit Service |
b98cfc |
res->iacc_free_count -= res->items[i].grp_acc_count;
|
|
Packit Service |
b98cfc |
res->items[i].pos = TRAM_POS_INTERNAL;
|
|
Packit Service |
b98cfc |
} else if (res->items[i].grp_size <= res->efree &&
|
|
Packit Service |
b98cfc |
res->items[i].grp_acc_count <= res->eacc_free_count) {
|
|
Packit Service |
b98cfc |
/* put it into etram */
|
|
Packit Service |
b98cfc |
res->efree -= res->items[i].grp_size;
|
|
Packit Service |
b98cfc |
res->eacc_free_count -= res->items[i].grp_acc_count;
|
|
Packit Service |
b98cfc |
res->items[i].pos = TRAM_POS_EXTERNAL;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_TRAM_FULL;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_grp_alloc(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_tram_grp; i++) {
|
|
Packit Service |
b98cfc |
if (!dsp_mgr->tram_grp[i].used) {
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[i].used = 1;
|
|
Packit Service |
b98cfc |
return i;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_TRAM_FULL_GRP;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_grp_free(ld10k1_dsp_mgr_t *dsp_mgr, int grp)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp].used = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_acc_alloc(ld10k1_dsp_mgr_t *dsp_mgr)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_tram_acc; i++) {
|
|
Packit Service |
b98cfc |
if (!dsp_mgr->tram_acc[i].used) {
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[i].used = 1;
|
|
Packit Service |
b98cfc |
return i;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_TRAM_FULL_ACC;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_acc_free(ld10k1_dsp_mgr_t *dsp_mgr, int acc)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[acc].used = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_reserve_for_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_tram_init_res(dsp_mgr, res);
|
|
Packit Service |
b98cfc |
ld10k1_tram_init_res_from_dsp_mgr(dsp_mgr, res);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_tram_init_res_from_patch(dsp_mgr, res, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_tram_calc_res_value(res);
|
|
Packit Service |
b98cfc |
ld10k1_tram_sort_res(res);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_tram_resolve_res(res)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_tram_init_res_from_patch_copy(dsp_mgr, res, patch);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_alloc_for_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int grp;
|
|
Packit Service |
b98cfc |
int acc;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* allocate tram grp and acc for patch */
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
grp = ld10k1_tram_grp_alloc(dsp_mgr);
|
|
Packit Service |
b98cfc |
patch->tram_grp[i].grp_idx = grp;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp].type = patch->tram_grp[i].grp_type;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp].size = patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < res->item_count; i++) {
|
|
Packit Service |
b98cfc |
if (res->items[i].grp_idx < 0) {
|
|
Packit Service |
b98cfc |
res->items[i].grp_idx = patch->tram_grp[-(res->items[i].grp_idx + 1)].grp_idx;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[res->items[i].grp_idx].pos = TRAM_POS_NONE;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[res->items[i].grp_idx].acc_count = res->items[i].grp_acc_count;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_acc_count; i++) {
|
|
Packit Service |
b98cfc |
acc = ld10k1_tram_acc_alloc(dsp_mgr);
|
|
Packit Service |
b98cfc |
patch->tram_acc[i].acc_idx = acc;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[acc].type = patch->tram_acc[i].acc_type;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[acc].offset = patch->tram_acc[i].acc_offset;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[acc].grp = patch->tram_grp[patch->tram_acc[i].grp].grp_idx;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_tram_res_alloc_hwacc(dsp_mgr, res);
|
|
Packit Service |
b98cfc |
ld10k1_tram_realloc_space(dsp_mgr, res);
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_hwacc_alloc(ld10k1_dsp_mgr_t *dsp_mgr, int external)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!external) {
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_itram_hwacc; i++) {
|
|
Packit Service |
b98cfc |
if (!dsp_mgr->itram_hwacc[i].used) {
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[i].used = 1;
|
|
Packit Service |
b98cfc |
dsp_mgr->i_tram.used_hwacc++;
|
|
Packit Service |
b98cfc |
return i;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_etram_hwacc; i++) {
|
|
Packit Service |
b98cfc |
if (!dsp_mgr->etram_hwacc[i].used) {
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[i].used = 1;
|
|
Packit Service |
b98cfc |
dsp_mgr->e_tram.used_hwacc++;
|
|
Packit Service |
b98cfc |
return i + dsp_mgr->max_itram_hwacc;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_TRAM_FULL_ACC;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_hwacc_free(ld10k1_dsp_mgr_t *dsp_mgr, int acc)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
if (acc < dsp_mgr->max_itram_hwacc) {
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].used = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].addr_val = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].data_val = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].modified = 1;
|
|
Packit Service |
b98cfc |
dsp_mgr->i_tram.used_hwacc--;
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
int nacc = acc - dsp_mgr->max_itram_hwacc;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].used = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].used = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].addr_val = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].data_val = 0;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].modified = 1;
|
|
Packit Service |
b98cfc |
dsp_mgr->e_tram.used_hwacc--;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_actualize_hwacc(ld10k1_dsp_mgr_t *dsp_mgr, int acc, unsigned int op, unsigned int addr, unsigned int data)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
if (acc < dsp_mgr->max_itram_hwacc) {
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].op = op;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].addr_val = addr;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].data_val = data;
|
|
Packit Service |
b98cfc |
dsp_mgr->itram_hwacc[acc].modified = 1;
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
int nacc = acc - dsp_mgr->max_itram_hwacc;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].op = op;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].addr_val = addr;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].data_val = data;
|
|
Packit Service |
b98cfc |
dsp_mgr->etram_hwacc[nacc].modified = 1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_tram_get_hwacc(ld10k1_dsp_mgr_t *dsp_mgr, int acc, unsigned int *addr, unsigned int *data)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int nacc;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (acc < dsp_mgr->max_itram_hwacc) {
|
|
Packit Service |
b98cfc |
*addr = dsp_mgr->itram_hwacc[acc].addr_val;
|
|
Packit Service |
b98cfc |
*data = dsp_mgr->itram_hwacc[acc].data_val;
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
nacc = acc - dsp_mgr->max_itram_hwacc;
|
|
Packit Service |
b98cfc |
*addr = dsp_mgr->etram_hwacc[nacc].addr_val;
|
|
Packit Service |
b98cfc |
*data = dsp_mgr->etram_hwacc[nacc].data_val;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_res_alloc_hwacc(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, j;
|
|
Packit Service |
b98cfc |
int grp_idx;
|
|
Packit Service |
b98cfc |
int hwacc;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* free hw acc - where pos changed */
|
|
Packit Service |
b98cfc |
for (i = 0; i < res->item_count; i++) {
|
|
Packit Service |
b98cfc |
grp_idx = res->items[i].grp_idx;
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_grp[grp_idx].pos != TRAM_POS_NONE &&
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp_idx].pos != res->items[i].pos) {
|
|
Packit Service |
b98cfc |
for (j = 0; j < dsp_mgr->max_tram_acc; j++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_acc[j].used &&
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[j].grp == grp_idx)
|
|
Packit Service |
b98cfc |
ld10k1_tram_hwacc_free(dsp_mgr, dsp_mgr->tram_acc[j].hwacc);
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp_idx].pos = TRAM_POS_NONE;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* now allocate */
|
|
Packit Service |
b98cfc |
for (i = 0; i < res->item_count; i++) {
|
|
Packit Service |
b98cfc |
grp_idx = res->items[i].grp_idx;
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_grp[grp_idx].pos == TRAM_POS_NONE &&
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp_idx].pos != res->items[i].pos) {
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[grp_idx].pos = res->items[i].pos;
|
|
Packit Service |
b98cfc |
for (j = 0; j < dsp_mgr->max_tram_acc; j++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_acc[j].used &&
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[j].grp == grp_idx) {
|
|
Packit Service |
b98cfc |
hwacc = ld10k1_tram_hwacc_alloc(dsp_mgr, res->items[i].pos == TRAM_POS_EXTERNAL ? 1 : 0);
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_acc[j].hwacc = hwacc;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_realloc_space(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_dsp_tram_resolve_t *res)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int itram_size = res->isize;
|
|
Packit Service |
b98cfc |
int etram_size = res->esize;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* allocate from end */
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr->max_tram_grp; i++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_grp[i].used) {
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_grp[i].pos == TRAM_POS_INTERNAL) {
|
|
Packit Service |
b98cfc |
itram_size -= dsp_mgr->tram_grp[i].size;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[i].offset = itram_size;
|
|
Packit Service |
b98cfc |
} else if (dsp_mgr->tram_grp[i].pos == TRAM_POS_EXTERNAL) {
|
|
Packit Service |
b98cfc |
etram_size -= dsp_mgr->tram_grp[i].size;
|
|
Packit Service |
b98cfc |
dsp_mgr->tram_grp[i].offset = etram_size;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_actualize_tram_for_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int grp_idx;
|
|
Packit Service |
b98cfc |
int acc_idx;
|
|
Packit Service |
b98cfc |
int tram_op;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* for all patch accs */
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_acc_count; i++) {
|
|
Packit Service |
b98cfc |
grp_idx = patch->tram_grp[patch->tram_acc[i].grp].grp_idx;
|
|
Packit Service |
b98cfc |
acc_idx = patch->tram_acc[i].acc_idx;
|
|
Packit Service |
b98cfc |
tram_op = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (dsp_mgr->tram_acc[acc_idx].type == TRAM_ACC_WRITE)
|
|
Packit Service |
b98cfc |
tram_op = TRAM_OP_WRITE;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
tram_op = TRAM_OP_READ;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_tram_actualize_hwacc(dsp_mgr, dsp_mgr->tram_acc[acc_idx].hwacc,
|
|
Packit Service |
b98cfc |
tram_op, dsp_mgr->tram_grp[grp_idx].offset + patch->tram_acc[i].acc_offset, 0);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_tram_free_tram_for_patch(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int acc_idx;
|
|
Packit Service |
b98cfc |
int grp_idx;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* free all patch accs */
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_acc_count; i++) {
|
|
Packit Service |
b98cfc |
acc_idx = patch->tram_acc[i].acc_idx;
|
|
Packit Service |
b98cfc |
ld10k1_tram_hwacc_free(dsp_mgr, dsp_mgr->tram_acc[acc_idx].hwacc);
|
|
Packit Service |
b98cfc |
ld10k1_tram_acc_free(dsp_mgr, acc_idx);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* free all patch grps */
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
grp_idx = patch->tram_grp[i].grp_idx;
|
|
Packit Service |
b98cfc |
ld10k1_tram_grp_free(dsp_mgr, grp_idx);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|