1/***********************************************************************/
2/**
3
4    AudioScience HPI driver
5    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com>
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of version 2 of the GNU General Public License as
9    published by the Free Software Foundation;
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20\file
21Functions for reading DSP code to load into DSP
22
23*/
24/***********************************************************************/
25#ifndef _HPIDSPCD_H_
26#define _HPIDSPCD_H_
27
28#include "hpi_internal.h"
29
30/** Header structure for dsp firmware file
31 This structure must match that used in s2bin.c for generation of asidsp.bin
32 */
33/*#ifndef DISABLE_PRAGMA_PACK1 */
34/*#pragma pack(push, 1) */
35/*#endif */
36struct code_header {
37	/** Size in bytes including header */
38	u32 size;
39	/** File type tag "CODE" == 0x45444F43 */
40	u32 type;
41	/** Adapter model number */
42	u32 adapter;
43	/** Firmware version*/
44	u32 version;
45	/** Data checksum */
46	u32 checksum;
47};
48/*#ifndef DISABLE_PRAGMA_PACK1 */
49/*#pragma pack(pop) */
50/*#endif */
51
52/*? Don't need the pragmas? */
53compile_time_assert((sizeof(struct code_header) == 20), code_header_size);
54
55/** Descriptor for dspcode from firmware loader */
56struct dsp_code {
57	/** copy of  file header */
58	struct code_header header;
59	/** Expected number of words in the whole dsp code,INCL header */
60	u32 block_length;
61	/** Number of words read so far */
62	u32 word_count;
63
64	/** internal state of DSP code reader */
65	struct dsp_code_private *pvt;
66};
67
68/** Prepare *psDspCode to refer to the requested adapter's firmware.
69Code file name is obtained from HpiOs_GetDspCodePath
70
71\return 0 for success, or error code if requested code is not available
72*/
73short hpi_dsp_code_open(
74	/** Code identifier, usually adapter family */
75	u32 adapter, void *pci_dev,
76	/** Pointer to DSP code control structure */
77	struct dsp_code *ps_dsp_code,
78	/** Pointer to dword to receive OS specific error code */
79	u32 *pos_error_code);
80
81/** Close the DSP code file */
82void hpi_dsp_code_close(struct dsp_code *ps_dsp_code);
83
84/** Rewind to the beginning of the DSP code file (for verify) */
85void hpi_dsp_code_rewind(struct dsp_code *ps_dsp_code);
86
87/** Read one word from the dsp code file
88	\return 0 for success, or error code if eof, or block length exceeded
89*/
90short hpi_dsp_code_read_word(struct dsp_code *ps_dsp_code,
91				      /**< DSP code descriptor */
92	u32 *pword /**< Where to store the read word */
93	);
94
95/** Get a block of dsp code into an internal buffer, and provide a pointer to
96that buffer. (If dsp code is already an array in memory, it is referenced,
97not copied.)
98
99\return Error if requested number of words are not available
100*/
101short hpi_dsp_code_read_block(size_t words_requested,
102	struct dsp_code *ps_dsp_code,
103	/* Pointer to store (Pointer to code buffer) */
104	u32 **ppblock);
105
106#endif
107