18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/***********************************************************************/
38c2ecf20Sopenharmony_ci/**
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci    AudioScience HPI driver
68c2ecf20Sopenharmony_ci    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci\file
108c2ecf20Sopenharmony_ciFunctions for reading DSP code to load into DSP
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci*/
138c2ecf20Sopenharmony_ci/***********************************************************************/
148c2ecf20Sopenharmony_ci#ifndef _HPIDSPCD_H_
158c2ecf20Sopenharmony_ci#define _HPIDSPCD_H_
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include "hpi_internal.h"
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/** Header structure for dsp firmware file
208c2ecf20Sopenharmony_ci This structure must match that used in s2bin.c for generation of asidsp.bin
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_ci/*#ifndef DISABLE_PRAGMA_PACK1 */
238c2ecf20Sopenharmony_ci/*#pragma pack(push, 1) */
248c2ecf20Sopenharmony_ci/*#endif */
258c2ecf20Sopenharmony_cistruct code_header {
268c2ecf20Sopenharmony_ci	/** Size in bytes including header */
278c2ecf20Sopenharmony_ci	u32 size;
288c2ecf20Sopenharmony_ci	/** File type tag "CODE" == 0x45444F43 */
298c2ecf20Sopenharmony_ci	u32 type;
308c2ecf20Sopenharmony_ci	/** Adapter model number */
318c2ecf20Sopenharmony_ci	u32 adapter;
328c2ecf20Sopenharmony_ci	/** Firmware version*/
338c2ecf20Sopenharmony_ci	u32 version;
348c2ecf20Sopenharmony_ci	/** Data checksum */
358c2ecf20Sopenharmony_ci	u32 checksum;
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci/*#ifndef DISABLE_PRAGMA_PACK1 */
388c2ecf20Sopenharmony_ci/*#pragma pack(pop) */
398c2ecf20Sopenharmony_ci/*#endif */
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci/*? Don't need the pragmas? */
428c2ecf20Sopenharmony_cicompile_time_assert((sizeof(struct code_header) == 20), code_header_size);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/** Descriptor for dspcode from firmware loader */
458c2ecf20Sopenharmony_cistruct dsp_code {
468c2ecf20Sopenharmony_ci	/** copy of  file header */
478c2ecf20Sopenharmony_ci	struct code_header header;
488c2ecf20Sopenharmony_ci	/** Expected number of words in the whole dsp code,INCL header */
498c2ecf20Sopenharmony_ci	u32 block_length;
508c2ecf20Sopenharmony_ci	/** Number of words read so far */
518c2ecf20Sopenharmony_ci	u32 word_count;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	/** internal state of DSP code reader */
548c2ecf20Sopenharmony_ci	struct dsp_code_private *pvt;
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci/** Prepare *psDspCode to refer to the requested adapter's firmware.
588c2ecf20Sopenharmony_ciCode file name is obtained from HpiOs_GetDspCodePath
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci\return 0 for success, or error code if requested code is not available
618c2ecf20Sopenharmony_ci*/
628c2ecf20Sopenharmony_cishort hpi_dsp_code_open(
638c2ecf20Sopenharmony_ci	/** Code identifier, usually adapter family */
648c2ecf20Sopenharmony_ci	u32 adapter, void *pci_dev,
658c2ecf20Sopenharmony_ci	/** Pointer to DSP code control structure */
668c2ecf20Sopenharmony_ci	struct dsp_code *ps_dsp_code,
678c2ecf20Sopenharmony_ci	/** Pointer to dword to receive OS specific error code */
688c2ecf20Sopenharmony_ci	u32 *pos_error_code);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/** Close the DSP code file */
718c2ecf20Sopenharmony_civoid hpi_dsp_code_close(struct dsp_code *ps_dsp_code);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci/** Rewind to the beginning of the DSP code file (for verify) */
748c2ecf20Sopenharmony_civoid hpi_dsp_code_rewind(struct dsp_code *ps_dsp_code);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci/** Read one word from the dsp code file
778c2ecf20Sopenharmony_ci	\return 0 for success, or error code if eof, or block length exceeded
788c2ecf20Sopenharmony_ci*/
798c2ecf20Sopenharmony_cishort hpi_dsp_code_read_word(struct dsp_code *ps_dsp_code,
808c2ecf20Sopenharmony_ci				      /**< DSP code descriptor */
818c2ecf20Sopenharmony_ci	u32 *pword /**< Where to store the read word */
828c2ecf20Sopenharmony_ci	);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci/** Get a block of dsp code into an internal buffer, and provide a pointer to
858c2ecf20Sopenharmony_cithat buffer. (If dsp code is already an array in memory, it is referenced,
868c2ecf20Sopenharmony_cinot copied.)
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci\return Error if requested number of words are not available
898c2ecf20Sopenharmony_ci*/
908c2ecf20Sopenharmony_cishort hpi_dsp_code_read_block(size_t words_requested,
918c2ecf20Sopenharmony_ci	struct dsp_code *ps_dsp_code,
928c2ecf20Sopenharmony_ci	/* Pointer to store (Pointer to code buffer) */
938c2ecf20Sopenharmony_ci	u32 **ppblock);
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci#endif
96