162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/***********************************************************************/
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci    AudioScience HPI driver
662306a36Sopenharmony_ci    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci\file
1062306a36Sopenharmony_ciFunctions for reading DSP code to load into DSP
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci*/
1362306a36Sopenharmony_ci/***********************************************************************/
1462306a36Sopenharmony_ci#ifndef _HPIDSPCD_H_
1562306a36Sopenharmony_ci#define _HPIDSPCD_H_
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include "hpi_internal.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/** Header structure for dsp firmware file
2062306a36Sopenharmony_ci This structure must match that used in s2bin.c for generation of asidsp.bin
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci/*#ifndef DISABLE_PRAGMA_PACK1 */
2362306a36Sopenharmony_ci/*#pragma pack(push, 1) */
2462306a36Sopenharmony_ci/*#endif */
2562306a36Sopenharmony_cistruct code_header {
2662306a36Sopenharmony_ci	/** Size in bytes including header */
2762306a36Sopenharmony_ci	u32 size;
2862306a36Sopenharmony_ci	/** File type tag "CODE" == 0x45444F43 */
2962306a36Sopenharmony_ci	u32 type;
3062306a36Sopenharmony_ci	/** Adapter model number */
3162306a36Sopenharmony_ci	u32 adapter;
3262306a36Sopenharmony_ci	/** Firmware version*/
3362306a36Sopenharmony_ci	u32 version;
3462306a36Sopenharmony_ci	/** Data checksum */
3562306a36Sopenharmony_ci	u32 checksum;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci/*#ifndef DISABLE_PRAGMA_PACK1 */
3862306a36Sopenharmony_ci/*#pragma pack(pop) */
3962306a36Sopenharmony_ci/*#endif */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/*? Don't need the pragmas? */
4262306a36Sopenharmony_cicompile_time_assert((sizeof(struct code_header) == 20), code_header_size);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/** Descriptor for dspcode from firmware loader */
4562306a36Sopenharmony_cistruct dsp_code {
4662306a36Sopenharmony_ci	/** copy of  file header */
4762306a36Sopenharmony_ci	struct code_header header;
4862306a36Sopenharmony_ci	/** Expected number of words in the whole dsp code,INCL header */
4962306a36Sopenharmony_ci	u32 block_length;
5062306a36Sopenharmony_ci	/** Number of words read so far */
5162306a36Sopenharmony_ci	u32 word_count;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	/** internal state of DSP code reader */
5462306a36Sopenharmony_ci	struct dsp_code_private *pvt;
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/** Prepare *psDspCode to refer to the requested adapter's firmware.
5862306a36Sopenharmony_ciCode file name is obtained from HpiOs_GetDspCodePath
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci\return 0 for success, or error code if requested code is not available
6162306a36Sopenharmony_ci*/
6262306a36Sopenharmony_cishort hpi_dsp_code_open(
6362306a36Sopenharmony_ci	/** Code identifier, usually adapter family */
6462306a36Sopenharmony_ci	u32 adapter, void *pci_dev,
6562306a36Sopenharmony_ci	/** Pointer to DSP code control structure */
6662306a36Sopenharmony_ci	struct dsp_code *ps_dsp_code,
6762306a36Sopenharmony_ci	/** Pointer to dword to receive OS specific error code */
6862306a36Sopenharmony_ci	u32 *pos_error_code);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/** Close the DSP code file */
7162306a36Sopenharmony_civoid hpi_dsp_code_close(struct dsp_code *ps_dsp_code);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/** Rewind to the beginning of the DSP code file (for verify) */
7462306a36Sopenharmony_civoid hpi_dsp_code_rewind(struct dsp_code *ps_dsp_code);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/** Read one word from the dsp code file
7762306a36Sopenharmony_ci	\return 0 for success, or error code if eof, or block length exceeded
7862306a36Sopenharmony_ci*/
7962306a36Sopenharmony_cishort hpi_dsp_code_read_word(struct dsp_code *ps_dsp_code,
8062306a36Sopenharmony_ci				      /**< DSP code descriptor */
8162306a36Sopenharmony_ci	u32 *pword /**< Where to store the read word */
8262306a36Sopenharmony_ci	);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/** Get a block of dsp code into an internal buffer, and provide a pointer to
8562306a36Sopenharmony_cithat buffer. (If dsp code is already an array in memory, it is referenced,
8662306a36Sopenharmony_cinot copied.)
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci\return Error if requested number of words are not available
8962306a36Sopenharmony_ci*/
9062306a36Sopenharmony_cishort hpi_dsp_code_read_block(size_t words_requested,
9162306a36Sopenharmony_ci	struct dsp_code *ps_dsp_code,
9262306a36Sopenharmony_ci	/* Pointer to store (Pointer to code buffer) */
9362306a36Sopenharmony_ci	u32 **ppblock);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif
96