diff options
author | eb | 2008-03-24 06:09:29 +0000 |
---|---|---|
committer | eb | 2008-03-24 06:09:29 +0000 |
commit | 28361a1bfc8f155a7b1367a234c9256b7b69da38 (patch) | |
tree | d75e71d0e87a56a542f905256688475662eee075 /gcell/src/lib/runtime/spu/gcell_qa.c | |
parent | a3ee0a2d8557477c873fb0bb43a34455944f7f58 (diff) | |
download | gnuradio-28361a1bfc8f155a7b1367a234c9256b7b69da38.tar.gz gnuradio-28361a1bfc8f155a7b1367a234c9256b7b69da38.tar.bz2 gnuradio-28361a1bfc8f155a7b1367a234c9256b7b69da38.zip |
Merged gcell, the Cell SPE scheduler and RPC mechanism into the trunk.
(eb/trunk-with-gcell r8037:8085). Expect additional tweaks, but
currently works and passes distcheck.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@8086 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gcell/src/lib/runtime/spu/gcell_qa.c')
-rw-r--r-- | gcell/src/lib/runtime/spu/gcell_qa.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/gcell/src/lib/runtime/spu/gcell_qa.c b/gcell/src/lib/runtime/spu/gcell_qa.c new file mode 100644 index 000000000..51bf38a6a --- /dev/null +++ b/gcell/src/lib/runtime/spu/gcell_qa.c @@ -0,0 +1,109 @@ +/* -*- c++ -*- */ +/* + * Copyright 2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <gc_delay.h> +#include <gc_declare_proc.h> +#include <string.h> + + +#define _UNUSED __attribute__((unused)) + +// FIXME move these out of here; only for QA usage + +static void +qa_nop(const gc_job_direct_args_t *input _UNUSED, + gc_job_direct_args_t *output _UNUSED, + const gc_job_ea_args_t *eaa _UNUSED) +{ +} + +GC_DECLARE_PROC(qa_nop, "qa_nop"); + +static int +sum_shorts(short *p, int nshorts) +{ + int total = 0; + for (int i = 0; i < nshorts; i++) + total += p[i]; + + return total; +} + +static void +qa_sum_shorts(const gc_job_direct_args_t *input _UNUSED, + gc_job_direct_args_t *output, + const gc_job_ea_args_t *eaa) +{ + for (unsigned int i = 0; i < eaa->nargs; i++){ + short *p = eaa->arg[i].ls_addr; + int n = eaa->arg[i].get_size / sizeof(short); + output->arg[i].s32 = sum_shorts(p, n); + //printf("qa_sum_shorts(%p, %d) = %d\n", p, n, output->arg[i].s32); + } +} + +GC_DECLARE_PROC(qa_sum_shorts, "qa_sum_shorts"); + +static void +write_seq(unsigned char *p, int nbytes, int counter) +{ + for (int i = 0; i < nbytes; i++) + p[i] = counter++; +} + +static void +qa_put_seq(const gc_job_direct_args_t *input, + gc_job_direct_args_t *output _UNUSED, + const gc_job_ea_args_t *eaa) +{ + int counter = input->arg[0].s32; + + for (unsigned int i = 0; i < eaa->nargs; i++){ + unsigned char *p = eaa->arg[i].ls_addr; + int n = eaa->arg[i].put_size; + write_seq(p, n, counter); + counter += n; + } +} + +GC_DECLARE_PROC(qa_put_seq, "qa_put_seq"); + +static void +qa_copy(const gc_job_direct_args_t *input _UNUSED, + gc_job_direct_args_t *output, + const gc_job_ea_args_t *eaa) +{ + if (eaa->nargs != 2 + || eaa->arg[0].direction != GCJD_DMA_PUT + || eaa->arg[1].direction != GCJD_DMA_GET){ + output->arg[0].s32 = -1; + return; + } + + output->arg[0].s32 = 0; + unsigned n = eaa->arg[0].put_size; + if (eaa->arg[1].get_size < n) + n = eaa->arg[1].get_size; + + memcpy(eaa->arg[0].ls_addr, eaa->arg[1].ls_addr, n); +} + +GC_DECLARE_PROC(qa_copy, "qa_copy"); |