cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hpi6205.c (65464B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/******************************************************************************
      3
      4    AudioScience HPI driver
      5    Copyright (C) 1997-2014  AudioScience Inc. <support@audioscience.com>
      6
      7
      8 Hardware Programming Interface (HPI) for AudioScience
      9 ASI50xx, AS51xx, ASI6xxx, ASI87xx ASI89xx series adapters.
     10 These PCI and PCIe bus adapters are based on a
     11 TMS320C6205 PCI bus mastering DSP,
     12 and (except ASI50xx) TI TMS320C6xxx floating point DSP
     13
     14 Exported function:
     15 void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
     16
     17(C) Copyright AudioScience Inc. 1998-2010
     18*******************************************************************************/
     19#define SOURCEFILE_NAME "hpi6205.c"
     20
     21#include "hpi_internal.h"
     22#include "hpimsginit.h"
     23#include "hpidebug.h"
     24#include "hpi6205.h"
     25#include "hpidspcd.h"
     26#include "hpicmn.h"
     27
     28/*****************************************************************************/
     29/* HPI6205 specific error codes */
     30#define HPI6205_ERROR_BASE 1000	/* not actually used anywhere */
     31
     32/* operational/messaging errors */
     33#define HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT     1015
     34#define HPI6205_ERROR_MSG_RESP_TIMEOUT          1016
     35
     36/* initialization/bootload errors */
     37#define HPI6205_ERROR_6205_NO_IRQ       1002
     38#define HPI6205_ERROR_6205_INIT_FAILED  1003
     39#define HPI6205_ERROR_6205_REG          1006
     40#define HPI6205_ERROR_6205_DSPPAGE      1007
     41#define HPI6205_ERROR_C6713_HPIC        1009
     42#define HPI6205_ERROR_C6713_HPIA        1010
     43#define HPI6205_ERROR_C6713_PLL         1011
     44#define HPI6205_ERROR_DSP_INTMEM        1012
     45#define HPI6205_ERROR_DSP_EXTMEM        1013
     46#define HPI6205_ERROR_DSP_PLD           1014
     47#define HPI6205_ERROR_6205_EEPROM       1017
     48#define HPI6205_ERROR_DSP_EMIF1         1018
     49#define HPI6205_ERROR_DSP_EMIF2         1019
     50#define HPI6205_ERROR_DSP_EMIF3         1020
     51#define HPI6205_ERROR_DSP_EMIF4         1021
     52
     53/*****************************************************************************/
     54/* for C6205 PCI i/f */
     55/* Host Status Register (HSR) bitfields */
     56#define C6205_HSR_INTSRC        0x01
     57#define C6205_HSR_INTAVAL       0x02
     58#define C6205_HSR_INTAM         0x04
     59#define C6205_HSR_CFGERR        0x08
     60#define C6205_HSR_EEREAD        0x10
     61/* Host-to-DSP Control Register (HDCR) bitfields */
     62#define C6205_HDCR_WARMRESET    0x01
     63#define C6205_HDCR_DSPINT       0x02
     64#define C6205_HDCR_PCIBOOT      0x04
     65/* DSP Page Register (DSPP) bitfields, */
     66/* defines 4 Mbyte page that BAR0 points to */
     67#define C6205_DSPP_MAP1         0x400
     68
     69/* BAR0 maps to prefetchable 4 Mbyte memory block set by DSPP.
     70 * BAR1 maps to non-prefetchable 8 Mbyte memory block
     71 * of DSP memory mapped registers (starting at 0x01800000).
     72 * 0x01800000 is hardcoded in the PCI i/f, so that only the offset from this
     73 * needs to be added to the BAR1 base address set in the PCI config reg
     74 */
     75#define C6205_BAR1_PCI_IO_OFFSET (0x027FFF0L)
     76#define C6205_BAR1_HSR  (C6205_BAR1_PCI_IO_OFFSET)
     77#define C6205_BAR1_HDCR (C6205_BAR1_PCI_IO_OFFSET+4)
     78#define C6205_BAR1_DSPP (C6205_BAR1_PCI_IO_OFFSET+8)
     79
     80/* used to control LED (revA) and reset C6713 (revB) */
     81#define C6205_BAR0_TIMER1_CTL (0x01980000L)
     82
     83/* For first 6713 in CE1 space, using DA17,16,2 */
     84#define HPICL_ADDR      0x01400000L
     85#define HPICH_ADDR      0x01400004L
     86#define HPIAL_ADDR      0x01410000L
     87#define HPIAH_ADDR      0x01410004L
     88#define HPIDIL_ADDR     0x01420000L
     89#define HPIDIH_ADDR     0x01420004L
     90#define HPIDL_ADDR      0x01430000L
     91#define HPIDH_ADDR      0x01430004L
     92
     93#define C6713_EMIF_GCTL         0x01800000
     94#define C6713_EMIF_CE1          0x01800004
     95#define C6713_EMIF_CE0          0x01800008
     96#define C6713_EMIF_CE2          0x01800010
     97#define C6713_EMIF_CE3          0x01800014
     98#define C6713_EMIF_SDRAMCTL     0x01800018
     99#define C6713_EMIF_SDRAMTIMING  0x0180001C
    100#define C6713_EMIF_SDRAMEXT     0x01800020
    101
    102struct hpi_hw_obj {
    103	/* PCI registers */
    104	__iomem u32 *prHSR;
    105	__iomem u32 *prHDCR;
    106	__iomem u32 *prDSPP;
    107
    108	u32 dsp_page;
    109
    110	struct consistent_dma_area h_locked_mem;
    111	struct bus_master_interface *p_interface_buffer;
    112
    113	u16 flag_outstream_just_reset[HPI_MAX_STREAMS];
    114	/* a non-NULL handle means there is an HPI allocated buffer */
    115	struct consistent_dma_area instream_host_buffers[HPI_MAX_STREAMS];
    116	struct consistent_dma_area outstream_host_buffers[HPI_MAX_STREAMS];
    117	/* non-zero size means a buffer exists, may be external */
    118	u32 instream_host_buffer_size[HPI_MAX_STREAMS];
    119	u32 outstream_host_buffer_size[HPI_MAX_STREAMS];
    120
    121	struct consistent_dma_area h_control_cache;
    122	struct hpi_control_cache *p_cache;
    123};
    124
    125/*****************************************************************************/
    126/* local prototypes */
    127
    128#define check_before_bbm_copy(status, p_bbm_data, l_first_write, l_second_write)
    129
    130static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us);
    131
    132static void send_dsp_command(struct hpi_hw_obj *phw, int cmd);
    133
    134static u16 adapter_boot_load_dsp(struct hpi_adapter_obj *pao,
    135	u32 *pos_error_code);
    136
    137static u16 message_response_sequence(struct hpi_adapter_obj *pao,
    138	struct hpi_message *phm, struct hpi_response *phr);
    139
    140static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
    141	struct hpi_response *phr);
    142
    143#define HPI6205_TIMEOUT 1000000
    144
    145static void subsys_create_adapter(struct hpi_message *phm,
    146	struct hpi_response *phr);
    147static void adapter_delete(struct hpi_adapter_obj *pao,
    148	struct hpi_message *phm, struct hpi_response *phr);
    149
    150static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
    151	u32 *pos_error_code);
    152
    153static void delete_adapter_obj(struct hpi_adapter_obj *pao);
    154
    155static int adapter_irq_query_and_clear(struct hpi_adapter_obj *pao,
    156	u32 message);
    157
    158static void outstream_host_buffer_allocate(struct hpi_adapter_obj *pao,
    159	struct hpi_message *phm, struct hpi_response *phr);
    160
    161static void outstream_host_buffer_get_info(struct hpi_adapter_obj *pao,
    162	struct hpi_message *phm, struct hpi_response *phr);
    163
    164static void outstream_host_buffer_free(struct hpi_adapter_obj *pao,
    165	struct hpi_message *phm, struct hpi_response *phr);
    166static void outstream_write(struct hpi_adapter_obj *pao,
    167	struct hpi_message *phm, struct hpi_response *phr);
    168
    169static void outstream_get_info(struct hpi_adapter_obj *pao,
    170	struct hpi_message *phm, struct hpi_response *phr);
    171
    172static void outstream_start(struct hpi_adapter_obj *pao,
    173	struct hpi_message *phm, struct hpi_response *phr);
    174
    175static void outstream_open(struct hpi_adapter_obj *pao,
    176	struct hpi_message *phm, struct hpi_response *phr);
    177
    178static void outstream_reset(struct hpi_adapter_obj *pao,
    179	struct hpi_message *phm, struct hpi_response *phr);
    180
    181static void instream_host_buffer_allocate(struct hpi_adapter_obj *pao,
    182	struct hpi_message *phm, struct hpi_response *phr);
    183
    184static void instream_host_buffer_get_info(struct hpi_adapter_obj *pao,
    185	struct hpi_message *phm, struct hpi_response *phr);
    186
    187static void instream_host_buffer_free(struct hpi_adapter_obj *pao,
    188	struct hpi_message *phm, struct hpi_response *phr);
    189
    190static void instream_read(struct hpi_adapter_obj *pao,
    191	struct hpi_message *phm, struct hpi_response *phr);
    192
    193static void instream_get_info(struct hpi_adapter_obj *pao,
    194	struct hpi_message *phm, struct hpi_response *phr);
    195
    196static void instream_start(struct hpi_adapter_obj *pao,
    197	struct hpi_message *phm, struct hpi_response *phr);
    198
    199static u32 boot_loader_read_mem32(struct hpi_adapter_obj *pao, int dsp_index,
    200	u32 address);
    201
    202static void boot_loader_write_mem32(struct hpi_adapter_obj *pao,
    203	int dsp_index, u32 address, u32 data);
    204
    205static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao,
    206	int dsp_index);
    207
    208static u16 boot_loader_test_memory(struct hpi_adapter_obj *pao, int dsp_index,
    209	u32 address, u32 length);
    210
    211static u16 boot_loader_test_internal_memory(struct hpi_adapter_obj *pao,
    212	int dsp_index);
    213
    214static u16 boot_loader_test_external_memory(struct hpi_adapter_obj *pao,
    215	int dsp_index);
    216
    217static u16 boot_loader_test_pld(struct hpi_adapter_obj *pao, int dsp_index);
    218
    219/*****************************************************************************/
    220
    221static void subsys_message(struct hpi_adapter_obj *pao,
    222	struct hpi_message *phm, struct hpi_response *phr)
    223{
    224	switch (phm->function) {
    225	case HPI_SUBSYS_CREATE_ADAPTER:
    226		subsys_create_adapter(phm, phr);
    227		break;
    228	default:
    229		phr->error = HPI_ERROR_INVALID_FUNC;
    230		break;
    231	}
    232}
    233
    234static void control_message(struct hpi_adapter_obj *pao,
    235	struct hpi_message *phm, struct hpi_response *phr)
    236{
    237
    238	struct hpi_hw_obj *phw = pao->priv;
    239	u16 pending_cache_error = 0;
    240
    241	switch (phm->function) {
    242	case HPI_CONTROL_GET_STATE:
    243		if (pao->has_control_cache) {
    244			rmb();	/* make sure we see updates DMAed from DSP */
    245			if (hpi_check_control_cache(phw->p_cache, phm, phr)) {
    246				break;
    247			} else if (phm->u.c.attribute == HPI_METER_PEAK) {
    248				pending_cache_error =
    249					HPI_ERROR_CONTROL_CACHING;
    250			}
    251		}
    252		hw_message(pao, phm, phr);
    253		if (pending_cache_error && !phr->error)
    254			phr->error = pending_cache_error;
    255		break;
    256	case HPI_CONTROL_GET_INFO:
    257		hw_message(pao, phm, phr);
    258		break;
    259	case HPI_CONTROL_SET_STATE:
    260		hw_message(pao, phm, phr);
    261		if (pao->has_control_cache)
    262			hpi_cmn_control_cache_sync_to_msg(phw->p_cache, phm,
    263				phr);
    264		break;
    265	default:
    266		phr->error = HPI_ERROR_INVALID_FUNC;
    267		break;
    268	}
    269}
    270
    271static void adapter_message(struct hpi_adapter_obj *pao,
    272	struct hpi_message *phm, struct hpi_response *phr)
    273{
    274	switch (phm->function) {
    275	case HPI_ADAPTER_DELETE:
    276		adapter_delete(pao, phm, phr);
    277		break;
    278	default:
    279		hw_message(pao, phm, phr);
    280		break;
    281	}
    282}
    283
    284static void outstream_message(struct hpi_adapter_obj *pao,
    285	struct hpi_message *phm, struct hpi_response *phr)
    286{
    287
    288	if (phm->obj_index >= HPI_MAX_STREAMS) {
    289		phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
    290		HPI_DEBUG_LOG(WARNING,
    291			"Message referencing invalid stream %d "
    292			"on adapter index %d\n", phm->obj_index,
    293			phm->adapter_index);
    294		return;
    295	}
    296
    297	switch (phm->function) {
    298	case HPI_OSTREAM_WRITE:
    299		outstream_write(pao, phm, phr);
    300		break;
    301	case HPI_OSTREAM_GET_INFO:
    302		outstream_get_info(pao, phm, phr);
    303		break;
    304	case HPI_OSTREAM_HOSTBUFFER_ALLOC:
    305		outstream_host_buffer_allocate(pao, phm, phr);
    306		break;
    307	case HPI_OSTREAM_HOSTBUFFER_GET_INFO:
    308		outstream_host_buffer_get_info(pao, phm, phr);
    309		break;
    310	case HPI_OSTREAM_HOSTBUFFER_FREE:
    311		outstream_host_buffer_free(pao, phm, phr);
    312		break;
    313	case HPI_OSTREAM_START:
    314		outstream_start(pao, phm, phr);
    315		break;
    316	case HPI_OSTREAM_OPEN:
    317		outstream_open(pao, phm, phr);
    318		break;
    319	case HPI_OSTREAM_RESET:
    320		outstream_reset(pao, phm, phr);
    321		break;
    322	default:
    323		hw_message(pao, phm, phr);
    324		break;
    325	}
    326}
    327
    328static void instream_message(struct hpi_adapter_obj *pao,
    329	struct hpi_message *phm, struct hpi_response *phr)
    330{
    331
    332	if (phm->obj_index >= HPI_MAX_STREAMS) {
    333		phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
    334		HPI_DEBUG_LOG(WARNING,
    335			"Message referencing invalid stream %d "
    336			"on adapter index %d\n", phm->obj_index,
    337			phm->adapter_index);
    338		return;
    339	}
    340
    341	switch (phm->function) {
    342	case HPI_ISTREAM_READ:
    343		instream_read(pao, phm, phr);
    344		break;
    345	case HPI_ISTREAM_GET_INFO:
    346		instream_get_info(pao, phm, phr);
    347		break;
    348	case HPI_ISTREAM_HOSTBUFFER_ALLOC:
    349		instream_host_buffer_allocate(pao, phm, phr);
    350		break;
    351	case HPI_ISTREAM_HOSTBUFFER_GET_INFO:
    352		instream_host_buffer_get_info(pao, phm, phr);
    353		break;
    354	case HPI_ISTREAM_HOSTBUFFER_FREE:
    355		instream_host_buffer_free(pao, phm, phr);
    356		break;
    357	case HPI_ISTREAM_START:
    358		instream_start(pao, phm, phr);
    359		break;
    360	default:
    361		hw_message(pao, phm, phr);
    362		break;
    363	}
    364}
    365
    366/*****************************************************************************/
    367/** Entry point to this HPI backend
    368 * All calls to the HPI start here
    369 */
    370static
    371void _HPI_6205(struct hpi_adapter_obj *pao, struct hpi_message *phm,
    372	struct hpi_response *phr)
    373{
    374	if (pao && (pao->dsp_crashed >= 10)
    375		&& (phm->function != HPI_ADAPTER_DEBUG_READ)) {
    376		/* allow last resort debug read even after crash */
    377		hpi_init_response(phr, phm->object, phm->function,
    378			HPI_ERROR_DSP_HARDWARE);
    379		HPI_DEBUG_LOG(WARNING, " %d,%d dsp crashed.\n", phm->object,
    380			phm->function);
    381		return;
    382	}
    383
    384	/* Init default response  */
    385	if (phm->function != HPI_SUBSYS_CREATE_ADAPTER)
    386		phr->error = HPI_ERROR_PROCESSING_MESSAGE;
    387
    388	HPI_DEBUG_LOG(VERBOSE, "start of switch\n");
    389	switch (phm->type) {
    390	case HPI_TYPE_REQUEST:
    391		switch (phm->object) {
    392		case HPI_OBJ_SUBSYSTEM:
    393			subsys_message(pao, phm, phr);
    394			break;
    395
    396		case HPI_OBJ_ADAPTER:
    397			adapter_message(pao, phm, phr);
    398			break;
    399
    400		case HPI_OBJ_CONTROL:
    401			control_message(pao, phm, phr);
    402			break;
    403
    404		case HPI_OBJ_OSTREAM:
    405			outstream_message(pao, phm, phr);
    406			break;
    407
    408		case HPI_OBJ_ISTREAM:
    409			instream_message(pao, phm, phr);
    410			break;
    411
    412		default:
    413			hw_message(pao, phm, phr);
    414			break;
    415		}
    416		break;
    417
    418	default:
    419		phr->error = HPI_ERROR_INVALID_TYPE;
    420		break;
    421	}
    422}
    423
    424void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
    425{
    426	struct hpi_adapter_obj *pao = NULL;
    427
    428	if (phm->object != HPI_OBJ_SUBSYSTEM) {
    429		/* normal messages must have valid adapter index */
    430		pao = hpi_find_adapter(phm->adapter_index);
    431	} else {
    432		/* subsys messages don't address an adapter */
    433		_HPI_6205(NULL, phm, phr);
    434		return;
    435	}
    436
    437	if (pao)
    438		_HPI_6205(pao, phm, phr);
    439	else
    440		hpi_init_response(phr, phm->object, phm->function,
    441			HPI_ERROR_BAD_ADAPTER_NUMBER);
    442}
    443
    444/*****************************************************************************/
    445/* SUBSYSTEM */
    446
    447/** Create an adapter object and initialise it based on resource information
    448 * passed in in the message
    449 * *** NOTE - you cannot use this function AND the FindAdapters function at the
    450 * same time, the application must use only one of them to get the adapters ***
    451 */
    452static void subsys_create_adapter(struct hpi_message *phm,
    453	struct hpi_response *phr)
    454{
    455	/* create temp adapter obj, because we don't know what index yet */
    456	struct hpi_adapter_obj ao;
    457	u32 os_error_code;
    458	u16 err;
    459
    460	HPI_DEBUG_LOG(DEBUG, " subsys_create_adapter\n");
    461
    462	memset(&ao, 0, sizeof(ao));
    463
    464	ao.priv = kzalloc(sizeof(struct hpi_hw_obj), GFP_KERNEL);
    465	if (!ao.priv) {
    466		HPI_DEBUG_LOG(ERROR, "can't get mem for adapter object\n");
    467		phr->error = HPI_ERROR_MEMORY_ALLOC;
    468		return;
    469	}
    470
    471	ao.pci = *phm->u.s.resource.r.pci;
    472	err = create_adapter_obj(&ao, &os_error_code);
    473	if (err) {
    474		delete_adapter_obj(&ao);
    475		if (err >= HPI_ERROR_BACKEND_BASE) {
    476			phr->error = HPI_ERROR_DSP_BOOTLOAD;
    477			phr->specific_error = err;
    478		} else {
    479			phr->error = err;
    480		}
    481		phr->u.s.data = os_error_code;
    482		return;
    483	}
    484
    485	phr->u.s.adapter_type = ao.type;
    486	phr->u.s.adapter_index = ao.index;
    487	phr->error = 0;
    488}
    489
    490/** delete an adapter - required by WDM driver */
    491static void adapter_delete(struct hpi_adapter_obj *pao,
    492	struct hpi_message *phm, struct hpi_response *phr)
    493{
    494	struct hpi_hw_obj *phw;
    495
    496	if (!pao) {
    497		phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
    498		return;
    499	}
    500	phw = pao->priv;
    501	/* reset adapter h/w */
    502	/* Reset C6713 #1 */
    503	boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 0);
    504	/* reset C6205 */
    505	iowrite32(C6205_HDCR_WARMRESET, phw->prHDCR);
    506
    507	delete_adapter_obj(pao);
    508	hpi_delete_adapter(pao);
    509	phr->error = 0;
    510}
    511
    512/** Create adapter object
    513  allocate buffers, bootload DSPs, initialise control cache
    514*/
    515static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
    516	u32 *pos_error_code)
    517{
    518	struct hpi_hw_obj *phw = pao->priv;
    519	struct bus_master_interface *interface;
    520	u32 phys_addr;
    521	int i;
    522	u16 err;
    523
    524	/* init error reporting */
    525	pao->dsp_crashed = 0;
    526
    527	for (i = 0; i < HPI_MAX_STREAMS; i++)
    528		phw->flag_outstream_just_reset[i] = 1;
    529
    530	/* The C6205 memory area 1 is 8Mbyte window into DSP registers */
    531	phw->prHSR =
    532		pao->pci.ap_mem_base[1] +
    533		C6205_BAR1_HSR / sizeof(*pao->pci.ap_mem_base[1]);
    534	phw->prHDCR =
    535		pao->pci.ap_mem_base[1] +
    536		C6205_BAR1_HDCR / sizeof(*pao->pci.ap_mem_base[1]);
    537	phw->prDSPP =
    538		pao->pci.ap_mem_base[1] +
    539		C6205_BAR1_DSPP / sizeof(*pao->pci.ap_mem_base[1]);
    540
    541	pao->has_control_cache = 0;
    542
    543	if (hpios_locked_mem_alloc(&phw->h_locked_mem,
    544			sizeof(struct bus_master_interface),
    545			pao->pci.pci_dev))
    546		phw->p_interface_buffer = NULL;
    547	else if (hpios_locked_mem_get_virt_addr(&phw->h_locked_mem,
    548			(void *)&phw->p_interface_buffer))
    549		phw->p_interface_buffer = NULL;
    550
    551	HPI_DEBUG_LOG(DEBUG, "interface buffer address %p\n",
    552		phw->p_interface_buffer);
    553
    554	if (phw->p_interface_buffer) {
    555		memset((void *)phw->p_interface_buffer, 0,
    556			sizeof(struct bus_master_interface));
    557		phw->p_interface_buffer->dsp_ack = H620_HIF_UNKNOWN;
    558	}
    559
    560	err = adapter_boot_load_dsp(pao, pos_error_code);
    561	if (err) {
    562		HPI_DEBUG_LOG(ERROR, "DSP code load failed\n");
    563		/* no need to clean up as SubSysCreateAdapter */
    564		/* calls DeleteAdapter on error. */
    565		return err;
    566	}
    567	HPI_DEBUG_LOG(INFO, "load DSP code OK\n");
    568
    569	/* allow boot load even if mem alloc wont work */
    570	if (!phw->p_interface_buffer)
    571		return HPI_ERROR_MEMORY_ALLOC;
    572
    573	interface = phw->p_interface_buffer;
    574
    575	/* make sure the DSP has started ok */
    576	if (!wait_dsp_ack(phw, H620_HIF_RESET, HPI6205_TIMEOUT * 10)) {
    577		HPI_DEBUG_LOG(ERROR, "timed out waiting reset state \n");
    578		return HPI6205_ERROR_6205_INIT_FAILED;
    579	}
    580	/* Note that *pao, *phw are zeroed after allocation,
    581	 * so pointers and flags are NULL by default.
    582	 * Allocate bus mastering control cache buffer and tell the DSP about it
    583	 */
    584	if (interface->control_cache.number_of_controls) {
    585		u8 *p_control_cache_virtual;
    586
    587		err = hpios_locked_mem_alloc(&phw->h_control_cache,
    588			interface->control_cache.size_in_bytes,
    589			pao->pci.pci_dev);
    590		if (!err)
    591			err = hpios_locked_mem_get_virt_addr(&phw->
    592				h_control_cache,
    593				(void *)&p_control_cache_virtual);
    594		if (!err) {
    595			memset(p_control_cache_virtual, 0,
    596				interface->control_cache.size_in_bytes);
    597
    598			phw->p_cache =
    599				hpi_alloc_control_cache(interface->
    600				control_cache.number_of_controls,
    601				interface->control_cache.size_in_bytes,
    602				p_control_cache_virtual);
    603
    604			if (!phw->p_cache)
    605				err = HPI_ERROR_MEMORY_ALLOC;
    606		}
    607		if (!err) {
    608			err = hpios_locked_mem_get_phys_addr(&phw->
    609				h_control_cache, &phys_addr);
    610			interface->control_cache.physical_address32 =
    611				phys_addr;
    612		}
    613
    614		if (!err)
    615			pao->has_control_cache = 1;
    616		else {
    617			if (hpios_locked_mem_valid(&phw->h_control_cache))
    618				hpios_locked_mem_free(&phw->h_control_cache);
    619			pao->has_control_cache = 0;
    620		}
    621	}
    622	send_dsp_command(phw, H620_HIF_IDLE);
    623
    624	{
    625		struct hpi_message hm;
    626		struct hpi_response hr;
    627
    628		HPI_DEBUG_LOG(VERBOSE, "init ADAPTER_GET_INFO\n");
    629		memset(&hm, 0, sizeof(hm));
    630		/* wAdapterIndex == version == 0 */
    631		hm.type = HPI_TYPE_REQUEST;
    632		hm.size = sizeof(hm);
    633		hm.object = HPI_OBJ_ADAPTER;
    634		hm.function = HPI_ADAPTER_GET_INFO;
    635
    636		memset(&hr, 0, sizeof(hr));
    637		hr.size = sizeof(hr);
    638
    639		err = message_response_sequence(pao, &hm, &hr);
    640		if (err) {
    641			HPI_DEBUG_LOG(ERROR, "message transport error %d\n",
    642				err);
    643			return err;
    644		}
    645		if (hr.error)
    646			return hr.error;
    647
    648		pao->type = hr.u.ax.info.adapter_type;
    649		pao->index = hr.u.ax.info.adapter_index;
    650
    651		HPI_DEBUG_LOG(VERBOSE,
    652			"got adapter info type %x index %d serial %d\n",
    653			hr.u.ax.info.adapter_type, hr.u.ax.info.adapter_index,
    654			hr.u.ax.info.serial_number);
    655	}
    656
    657	if (phw->p_cache)
    658		phw->p_cache->adap_idx = pao->index;
    659
    660	HPI_DEBUG_LOG(INFO, "bootload DSP OK\n");
    661
    662	pao->irq_query_and_clear = adapter_irq_query_and_clear;
    663	pao->instream_host_buffer_status =
    664		phw->p_interface_buffer->instream_host_buffer_status;
    665	pao->outstream_host_buffer_status =
    666		phw->p_interface_buffer->outstream_host_buffer_status;
    667
    668	return hpi_add_adapter(pao);
    669}
    670
    671/** Free memory areas allocated by adapter
    672 * this routine is called from AdapterDelete,
    673  * and SubSysCreateAdapter if duplicate index
    674*/
    675static void delete_adapter_obj(struct hpi_adapter_obj *pao)
    676{
    677	struct hpi_hw_obj *phw = pao->priv;
    678	int i;
    679
    680	if (hpios_locked_mem_valid(&phw->h_control_cache)) {
    681		hpios_locked_mem_free(&phw->h_control_cache);
    682		hpi_free_control_cache(phw->p_cache);
    683	}
    684
    685	if (hpios_locked_mem_valid(&phw->h_locked_mem)) {
    686		hpios_locked_mem_free(&phw->h_locked_mem);
    687		phw->p_interface_buffer = NULL;
    688	}
    689
    690	for (i = 0; i < HPI_MAX_STREAMS; i++)
    691		if (hpios_locked_mem_valid(&phw->instream_host_buffers[i])) {
    692			hpios_locked_mem_free(&phw->instream_host_buffers[i]);
    693			/*?phw->InStreamHostBuffers[i] = NULL; */
    694			phw->instream_host_buffer_size[i] = 0;
    695		}
    696
    697	for (i = 0; i < HPI_MAX_STREAMS; i++)
    698		if (hpios_locked_mem_valid(&phw->outstream_host_buffers[i])) {
    699			hpios_locked_mem_free(&phw->outstream_host_buffers
    700				[i]);
    701			phw->outstream_host_buffer_size[i] = 0;
    702		}
    703	kfree(phw);
    704}
    705
    706/*****************************************************************************/
    707/* Adapter functions */
    708static int adapter_irq_query_and_clear(struct hpi_adapter_obj *pao,
    709	u32 message)
    710{
    711	struct hpi_hw_obj *phw = pao->priv;
    712	u32 hsr = 0;
    713
    714	hsr = ioread32(phw->prHSR);
    715	if (hsr & C6205_HSR_INTSRC) {
    716		/* reset the interrupt from the DSP */
    717		iowrite32(C6205_HSR_INTSRC, phw->prHSR);
    718		return HPI_IRQ_MIXER;
    719	}
    720
    721	return HPI_IRQ_NONE;
    722}
    723
    724/*****************************************************************************/
    725/* OutStream Host buffer functions */
    726
    727/** Allocate or attach buffer for busmastering
    728*/
    729static void outstream_host_buffer_allocate(struct hpi_adapter_obj *pao,
    730	struct hpi_message *phm, struct hpi_response *phr)
    731{
    732	u16 err = 0;
    733	u32 command = phm->u.d.u.buffer.command;
    734	struct hpi_hw_obj *phw = pao->priv;
    735	struct bus_master_interface *interface = phw->p_interface_buffer;
    736
    737	hpi_init_response(phr, phm->object, phm->function, 0);
    738
    739	if (command == HPI_BUFFER_CMD_EXTERNAL
    740		|| command == HPI_BUFFER_CMD_INTERNAL_ALLOC) {
    741		/* ALLOC phase, allocate a buffer with power of 2 size,
    742		   get its bus address for PCI bus mastering
    743		 */
    744		phm->u.d.u.buffer.buffer_size =
    745			roundup_pow_of_two(phm->u.d.u.buffer.buffer_size);
    746		/* return old size and allocated size,
    747		   so caller can detect change */
    748		phr->u.d.u.stream_info.data_available =
    749			phw->outstream_host_buffer_size[phm->obj_index];
    750		phr->u.d.u.stream_info.buffer_size =
    751			phm->u.d.u.buffer.buffer_size;
    752
    753		if (phw->outstream_host_buffer_size[phm->obj_index] ==
    754			phm->u.d.u.buffer.buffer_size) {
    755			/* Same size, no action required */
    756			return;
    757		}
    758
    759		if (hpios_locked_mem_valid(&phw->outstream_host_buffers[phm->
    760					obj_index]))
    761			hpios_locked_mem_free(&phw->outstream_host_buffers
    762				[phm->obj_index]);
    763
    764		err = hpios_locked_mem_alloc(&phw->outstream_host_buffers
    765			[phm->obj_index], phm->u.d.u.buffer.buffer_size,
    766			pao->pci.pci_dev);
    767
    768		if (err) {
    769			phr->error = HPI_ERROR_INVALID_DATASIZE;
    770			phw->outstream_host_buffer_size[phm->obj_index] = 0;
    771			return;
    772		}
    773
    774		err = hpios_locked_mem_get_phys_addr
    775			(&phw->outstream_host_buffers[phm->obj_index],
    776			&phm->u.d.u.buffer.pci_address);
    777		/* get the phys addr into msg for single call alloc caller
    778		 * needs to do this for split alloc (or use the same message)
    779		 * return the phy address for split alloc in the respose too
    780		 */
    781		phr->u.d.u.stream_info.auxiliary_data_available =
    782			phm->u.d.u.buffer.pci_address;
    783
    784		if (err) {
    785			hpios_locked_mem_free(&phw->outstream_host_buffers
    786				[phm->obj_index]);
    787			phw->outstream_host_buffer_size[phm->obj_index] = 0;
    788			phr->error = HPI_ERROR_MEMORY_ALLOC;
    789			return;
    790		}
    791	}
    792
    793	if (command == HPI_BUFFER_CMD_EXTERNAL
    794		|| command == HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER) {
    795		/* GRANT phase.  Set up the BBM status, tell the DSP about
    796		   the buffer so it can start using BBM.
    797		 */
    798		struct hpi_hostbuffer_status *status;
    799
    800		if (phm->u.d.u.buffer.buffer_size & (phm->u.d.u.buffer.
    801				buffer_size - 1)) {
    802			HPI_DEBUG_LOG(ERROR,
    803				"Buffer size must be 2^N not %d\n",
    804				phm->u.d.u.buffer.buffer_size);
    805			phr->error = HPI_ERROR_INVALID_DATASIZE;
    806			return;
    807		}
    808		phw->outstream_host_buffer_size[phm->obj_index] =
    809			phm->u.d.u.buffer.buffer_size;
    810		status = &interface->outstream_host_buffer_status[phm->
    811			obj_index];
    812		status->samples_processed = 0;
    813		status->stream_state = HPI_STATE_STOPPED;
    814		status->dsp_index = 0;
    815		status->host_index = status->dsp_index;
    816		status->size_in_bytes = phm->u.d.u.buffer.buffer_size;
    817		status->auxiliary_data_available = 0;
    818
    819		hw_message(pao, phm, phr);
    820
    821		if (phr->error
    822			&& hpios_locked_mem_valid(&phw->
    823				outstream_host_buffers[phm->obj_index])) {
    824			hpios_locked_mem_free(&phw->outstream_host_buffers
    825				[phm->obj_index]);
    826			phw->outstream_host_buffer_size[phm->obj_index] = 0;
    827		}
    828	}
    829}
    830
    831static void outstream_host_buffer_get_info(struct hpi_adapter_obj *pao,
    832	struct hpi_message *phm, struct hpi_response *phr)
    833{
    834	struct hpi_hw_obj *phw = pao->priv;
    835	struct bus_master_interface *interface = phw->p_interface_buffer;
    836	struct hpi_hostbuffer_status *status;
    837	u8 *p_bbm_data;
    838
    839	if (hpios_locked_mem_valid(&phw->outstream_host_buffers[phm->
    840				obj_index])) {
    841		if (hpios_locked_mem_get_virt_addr(&phw->
    842				outstream_host_buffers[phm->obj_index],
    843				(void *)&p_bbm_data)) {
    844			phr->error = HPI_ERROR_INVALID_OPERATION;
    845			return;
    846		}
    847		status = &interface->outstream_host_buffer_status[phm->
    848			obj_index];
    849		hpi_init_response(phr, HPI_OBJ_OSTREAM,
    850			HPI_OSTREAM_HOSTBUFFER_GET_INFO, 0);
    851		phr->u.d.u.hostbuffer_info.p_buffer = p_bbm_data;
    852		phr->u.d.u.hostbuffer_info.p_status = status;
    853	} else {
    854		hpi_init_response(phr, HPI_OBJ_OSTREAM,
    855			HPI_OSTREAM_HOSTBUFFER_GET_INFO,
    856			HPI_ERROR_INVALID_OPERATION);
    857	}
    858}
    859
    860static void outstream_host_buffer_free(struct hpi_adapter_obj *pao,
    861	struct hpi_message *phm, struct hpi_response *phr)
    862{
    863	struct hpi_hw_obj *phw = pao->priv;
    864	u32 command = phm->u.d.u.buffer.command;
    865
    866	if (phw->outstream_host_buffer_size[phm->obj_index]) {
    867		if (command == HPI_BUFFER_CMD_EXTERNAL
    868			|| command == HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER) {
    869			phw->outstream_host_buffer_size[phm->obj_index] = 0;
    870			hw_message(pao, phm, phr);
    871			/* Tell adapter to stop using the host buffer. */
    872		}
    873		if (command == HPI_BUFFER_CMD_EXTERNAL
    874			|| command == HPI_BUFFER_CMD_INTERNAL_FREE)
    875			hpios_locked_mem_free(&phw->outstream_host_buffers
    876				[phm->obj_index]);
    877	}
    878	/* Should HPI_ERROR_INVALID_OPERATION be returned
    879	   if no host buffer is allocated? */
    880	else
    881		hpi_init_response(phr, HPI_OBJ_OSTREAM,
    882			HPI_OSTREAM_HOSTBUFFER_FREE, 0);
    883
    884}
    885
    886static u32 outstream_get_space_available(struct hpi_hostbuffer_status *status)
    887{
    888	return status->size_in_bytes - (status->host_index -
    889		status->dsp_index);
    890}
    891
    892static void outstream_write(struct hpi_adapter_obj *pao,
    893	struct hpi_message *phm, struct hpi_response *phr)
    894{
    895	struct hpi_hw_obj *phw = pao->priv;
    896	struct bus_master_interface *interface = phw->p_interface_buffer;
    897	struct hpi_hostbuffer_status *status;
    898	u32 space_available;
    899
    900	if (!phw->outstream_host_buffer_size[phm->obj_index]) {
    901		/* there  is no BBM buffer, write via message */
    902		hw_message(pao, phm, phr);
    903		return;
    904	}
    905
    906	hpi_init_response(phr, phm->object, phm->function, 0);
    907	status = &interface->outstream_host_buffer_status[phm->obj_index];
    908
    909	space_available = outstream_get_space_available(status);
    910	if (space_available < phm->u.d.u.data.data_size) {
    911		phr->error = HPI_ERROR_INVALID_DATASIZE;
    912		return;
    913	}
    914
    915	/* HostBuffers is used to indicate host buffer is internally allocated.
    916	   otherwise, assumed external, data written externally */
    917	if (phm->u.d.u.data.pb_data
    918		&& hpios_locked_mem_valid(&phw->outstream_host_buffers[phm->
    919				obj_index])) {
    920		u8 *p_bbm_data;
    921		u32 l_first_write;
    922		u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data;
    923
    924		if (hpios_locked_mem_get_virt_addr(&phw->
    925				outstream_host_buffers[phm->obj_index],
    926				(void *)&p_bbm_data)) {
    927			phr->error = HPI_ERROR_INVALID_OPERATION;
    928			return;
    929		}
    930
    931		/* either all data,
    932		   or enough to fit from current to end of BBM buffer */
    933		l_first_write =
    934			min(phm->u.d.u.data.data_size,
    935			status->size_in_bytes -
    936			(status->host_index & (status->size_in_bytes - 1)));
    937
    938		memcpy(p_bbm_data +
    939			(status->host_index & (status->size_in_bytes - 1)),
    940			p_app_data, l_first_write);
    941		/* remaining data if any */
    942		memcpy(p_bbm_data, p_app_data + l_first_write,
    943			phm->u.d.u.data.data_size - l_first_write);
    944	}
    945
    946	/*
    947	 * This version relies on the DSP code triggering an OStream buffer
    948	 * update immediately following a SET_FORMAT call. The host has
    949	 * already written data into the BBM buffer, but the DSP won't know
    950	 * about it until dwHostIndex is adjusted.
    951	 */
    952	if (phw->flag_outstream_just_reset[phm->obj_index]) {
    953		/* Format can only change after reset. Must tell DSP. */
    954		u16 function = phm->function;
    955		phw->flag_outstream_just_reset[phm->obj_index] = 0;
    956		phm->function = HPI_OSTREAM_SET_FORMAT;
    957		hw_message(pao, phm, phr);	/* send the format to the DSP */
    958		phm->function = function;
    959		if (phr->error)
    960			return;
    961	}
    962
    963	status->host_index += phm->u.d.u.data.data_size;
    964}
    965
    966static void outstream_get_info(struct hpi_adapter_obj *pao,
    967	struct hpi_message *phm, struct hpi_response *phr)
    968{
    969	struct hpi_hw_obj *phw = pao->priv;
    970	struct bus_master_interface *interface = phw->p_interface_buffer;
    971	struct hpi_hostbuffer_status *status;
    972
    973	if (!phw->outstream_host_buffer_size[phm->obj_index]) {
    974		hw_message(pao, phm, phr);
    975		return;
    976	}
    977
    978	hpi_init_response(phr, phm->object, phm->function, 0);
    979
    980	status = &interface->outstream_host_buffer_status[phm->obj_index];
    981
    982	phr->u.d.u.stream_info.state = (u16)status->stream_state;
    983	phr->u.d.u.stream_info.samples_transferred =
    984		status->samples_processed;
    985	phr->u.d.u.stream_info.buffer_size = status->size_in_bytes;
    986	phr->u.d.u.stream_info.data_available =
    987		status->size_in_bytes - outstream_get_space_available(status);
    988	phr->u.d.u.stream_info.auxiliary_data_available =
    989		status->auxiliary_data_available;
    990}
    991
    992static void outstream_start(struct hpi_adapter_obj *pao,
    993	struct hpi_message *phm, struct hpi_response *phr)
    994{
    995	hw_message(pao, phm, phr);
    996}
    997
    998static void outstream_reset(struct hpi_adapter_obj *pao,
    999	struct hpi_message *phm, struct hpi_response *phr)
   1000{
   1001	struct hpi_hw_obj *phw = pao->priv;
   1002	phw->flag_outstream_just_reset[phm->obj_index] = 1;
   1003	hw_message(pao, phm, phr);
   1004}
   1005
   1006static void outstream_open(struct hpi_adapter_obj *pao,
   1007	struct hpi_message *phm, struct hpi_response *phr)
   1008{
   1009	outstream_reset(pao, phm, phr);
   1010}
   1011
   1012/*****************************************************************************/
   1013/* InStream Host buffer functions */
   1014
   1015static void instream_host_buffer_allocate(struct hpi_adapter_obj *pao,
   1016	struct hpi_message *phm, struct hpi_response *phr)
   1017{
   1018	u16 err = 0;
   1019	u32 command = phm->u.d.u.buffer.command;
   1020	struct hpi_hw_obj *phw = pao->priv;
   1021	struct bus_master_interface *interface = phw->p_interface_buffer;
   1022
   1023	hpi_init_response(phr, phm->object, phm->function, 0);
   1024
   1025	if (command == HPI_BUFFER_CMD_EXTERNAL
   1026		|| command == HPI_BUFFER_CMD_INTERNAL_ALLOC) {
   1027
   1028		phm->u.d.u.buffer.buffer_size =
   1029			roundup_pow_of_two(phm->u.d.u.buffer.buffer_size);
   1030		phr->u.d.u.stream_info.data_available =
   1031			phw->instream_host_buffer_size[phm->obj_index];
   1032		phr->u.d.u.stream_info.buffer_size =
   1033			phm->u.d.u.buffer.buffer_size;
   1034
   1035		if (phw->instream_host_buffer_size[phm->obj_index] ==
   1036			phm->u.d.u.buffer.buffer_size) {
   1037			/* Same size, no action required */
   1038			return;
   1039		}
   1040
   1041		if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm->
   1042					obj_index]))
   1043			hpios_locked_mem_free(&phw->instream_host_buffers
   1044				[phm->obj_index]);
   1045
   1046		err = hpios_locked_mem_alloc(&phw->instream_host_buffers[phm->
   1047				obj_index], phm->u.d.u.buffer.buffer_size,
   1048			pao->pci.pci_dev);
   1049
   1050		if (err) {
   1051			phr->error = HPI_ERROR_INVALID_DATASIZE;
   1052			phw->instream_host_buffer_size[phm->obj_index] = 0;
   1053			return;
   1054		}
   1055
   1056		err = hpios_locked_mem_get_phys_addr
   1057			(&phw->instream_host_buffers[phm->obj_index],
   1058			&phm->u.d.u.buffer.pci_address);
   1059		/* get the phys addr into msg for single call alloc. Caller
   1060		   needs to do this for split alloc so return the phy address */
   1061		phr->u.d.u.stream_info.auxiliary_data_available =
   1062			phm->u.d.u.buffer.pci_address;
   1063		if (err) {
   1064			hpios_locked_mem_free(&phw->instream_host_buffers
   1065				[phm->obj_index]);
   1066			phw->instream_host_buffer_size[phm->obj_index] = 0;
   1067			phr->error = HPI_ERROR_MEMORY_ALLOC;
   1068			return;
   1069		}
   1070	}
   1071
   1072	if (command == HPI_BUFFER_CMD_EXTERNAL
   1073		|| command == HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER) {
   1074		struct hpi_hostbuffer_status *status;
   1075
   1076		if (phm->u.d.u.buffer.buffer_size & (phm->u.d.u.buffer.
   1077				buffer_size - 1)) {
   1078			HPI_DEBUG_LOG(ERROR,
   1079				"Buffer size must be 2^N not %d\n",
   1080				phm->u.d.u.buffer.buffer_size);
   1081			phr->error = HPI_ERROR_INVALID_DATASIZE;
   1082			return;
   1083		}
   1084
   1085		phw->instream_host_buffer_size[phm->obj_index] =
   1086			phm->u.d.u.buffer.buffer_size;
   1087		status = &interface->instream_host_buffer_status[phm->
   1088			obj_index];
   1089		status->samples_processed = 0;
   1090		status->stream_state = HPI_STATE_STOPPED;
   1091		status->dsp_index = 0;
   1092		status->host_index = status->dsp_index;
   1093		status->size_in_bytes = phm->u.d.u.buffer.buffer_size;
   1094		status->auxiliary_data_available = 0;
   1095
   1096		hw_message(pao, phm, phr);
   1097
   1098		if (phr->error
   1099			&& hpios_locked_mem_valid(&phw->
   1100				instream_host_buffers[phm->obj_index])) {
   1101			hpios_locked_mem_free(&phw->instream_host_buffers
   1102				[phm->obj_index]);
   1103			phw->instream_host_buffer_size[phm->obj_index] = 0;
   1104		}
   1105	}
   1106}
   1107
   1108static void instream_host_buffer_get_info(struct hpi_adapter_obj *pao,
   1109	struct hpi_message *phm, struct hpi_response *phr)
   1110{
   1111	struct hpi_hw_obj *phw = pao->priv;
   1112	struct bus_master_interface *interface = phw->p_interface_buffer;
   1113	struct hpi_hostbuffer_status *status;
   1114	u8 *p_bbm_data;
   1115
   1116	if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm->
   1117				obj_index])) {
   1118		if (hpios_locked_mem_get_virt_addr(&phw->
   1119				instream_host_buffers[phm->obj_index],
   1120				(void *)&p_bbm_data)) {
   1121			phr->error = HPI_ERROR_INVALID_OPERATION;
   1122			return;
   1123		}
   1124		status = &interface->instream_host_buffer_status[phm->
   1125			obj_index];
   1126		hpi_init_response(phr, HPI_OBJ_ISTREAM,
   1127			HPI_ISTREAM_HOSTBUFFER_GET_INFO, 0);
   1128		phr->u.d.u.hostbuffer_info.p_buffer = p_bbm_data;
   1129		phr->u.d.u.hostbuffer_info.p_status = status;
   1130	} else {
   1131		hpi_init_response(phr, HPI_OBJ_ISTREAM,
   1132			HPI_ISTREAM_HOSTBUFFER_GET_INFO,
   1133			HPI_ERROR_INVALID_OPERATION);
   1134	}
   1135}
   1136
   1137static void instream_host_buffer_free(struct hpi_adapter_obj *pao,
   1138	struct hpi_message *phm, struct hpi_response *phr)
   1139{
   1140	struct hpi_hw_obj *phw = pao->priv;
   1141	u32 command = phm->u.d.u.buffer.command;
   1142
   1143	if (phw->instream_host_buffer_size[phm->obj_index]) {
   1144		if (command == HPI_BUFFER_CMD_EXTERNAL
   1145			|| command == HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER) {
   1146			phw->instream_host_buffer_size[phm->obj_index] = 0;
   1147			hw_message(pao, phm, phr);
   1148		}
   1149
   1150		if (command == HPI_BUFFER_CMD_EXTERNAL
   1151			|| command == HPI_BUFFER_CMD_INTERNAL_FREE)
   1152			hpios_locked_mem_free(&phw->instream_host_buffers
   1153				[phm->obj_index]);
   1154
   1155	} else {
   1156		/* Should HPI_ERROR_INVALID_OPERATION be returned
   1157		   if no host buffer is allocated? */
   1158		hpi_init_response(phr, HPI_OBJ_ISTREAM,
   1159			HPI_ISTREAM_HOSTBUFFER_FREE, 0);
   1160
   1161	}
   1162
   1163}
   1164
   1165static void instream_start(struct hpi_adapter_obj *pao,
   1166	struct hpi_message *phm, struct hpi_response *phr)
   1167{
   1168	hw_message(pao, phm, phr);
   1169}
   1170
   1171static u32 instream_get_bytes_available(struct hpi_hostbuffer_status *status)
   1172{
   1173	return status->dsp_index - status->host_index;
   1174}
   1175
   1176static void instream_read(struct hpi_adapter_obj *pao,
   1177	struct hpi_message *phm, struct hpi_response *phr)
   1178{
   1179	struct hpi_hw_obj *phw = pao->priv;
   1180	struct bus_master_interface *interface = phw->p_interface_buffer;
   1181	struct hpi_hostbuffer_status *status;
   1182	u32 data_available;
   1183	u8 *p_bbm_data;
   1184	u32 l_first_read;
   1185	u8 *p_app_data = (u8 *)phm->u.d.u.data.pb_data;
   1186
   1187	if (!phw->instream_host_buffer_size[phm->obj_index]) {
   1188		hw_message(pao, phm, phr);
   1189		return;
   1190	}
   1191	hpi_init_response(phr, phm->object, phm->function, 0);
   1192
   1193	status = &interface->instream_host_buffer_status[phm->obj_index];
   1194	data_available = instream_get_bytes_available(status);
   1195	if (data_available < phm->u.d.u.data.data_size) {
   1196		phr->error = HPI_ERROR_INVALID_DATASIZE;
   1197		return;
   1198	}
   1199
   1200	if (hpios_locked_mem_valid(&phw->instream_host_buffers[phm->
   1201				obj_index])) {
   1202		if (hpios_locked_mem_get_virt_addr(&phw->
   1203				instream_host_buffers[phm->obj_index],
   1204				(void *)&p_bbm_data)) {
   1205			phr->error = HPI_ERROR_INVALID_OPERATION;
   1206			return;
   1207		}
   1208
   1209		/* either all data,
   1210		   or enough to fit from current to end of BBM buffer */
   1211		l_first_read =
   1212			min(phm->u.d.u.data.data_size,
   1213			status->size_in_bytes -
   1214			(status->host_index & (status->size_in_bytes - 1)));
   1215
   1216		memcpy(p_app_data,
   1217			p_bbm_data +
   1218			(status->host_index & (status->size_in_bytes - 1)),
   1219			l_first_read);
   1220		/* remaining data if any */
   1221		memcpy(p_app_data + l_first_read, p_bbm_data,
   1222			phm->u.d.u.data.data_size - l_first_read);
   1223	}
   1224	status->host_index += phm->u.d.u.data.data_size;
   1225}
   1226
   1227static void instream_get_info(struct hpi_adapter_obj *pao,
   1228	struct hpi_message *phm, struct hpi_response *phr)
   1229{
   1230	struct hpi_hw_obj *phw = pao->priv;
   1231	struct bus_master_interface *interface = phw->p_interface_buffer;
   1232	struct hpi_hostbuffer_status *status;
   1233	if (!phw->instream_host_buffer_size[phm->obj_index]) {
   1234		hw_message(pao, phm, phr);
   1235		return;
   1236	}
   1237
   1238	status = &interface->instream_host_buffer_status[phm->obj_index];
   1239
   1240	hpi_init_response(phr, phm->object, phm->function, 0);
   1241
   1242	phr->u.d.u.stream_info.state = (u16)status->stream_state;
   1243	phr->u.d.u.stream_info.samples_transferred =
   1244		status->samples_processed;
   1245	phr->u.d.u.stream_info.buffer_size = status->size_in_bytes;
   1246	phr->u.d.u.stream_info.data_available =
   1247		instream_get_bytes_available(status);
   1248	phr->u.d.u.stream_info.auxiliary_data_available =
   1249		status->auxiliary_data_available;
   1250}
   1251
   1252/*****************************************************************************/
   1253/* LOW-LEVEL */
   1254#define HPI6205_MAX_FILES_TO_LOAD 2
   1255
   1256static u16 adapter_boot_load_dsp(struct hpi_adapter_obj *pao,
   1257	u32 *pos_error_code)
   1258{
   1259	struct hpi_hw_obj *phw = pao->priv;
   1260	struct dsp_code dsp_code;
   1261	u16 boot_code_id[HPI6205_MAX_FILES_TO_LOAD];
   1262	u32 temp;
   1263	int dsp = 0, i = 0;
   1264	u16 err = 0;
   1265
   1266	boot_code_id[0] = HPI_ADAPTER_ASI(0x6205);
   1267
   1268	boot_code_id[1] = pao->pci.pci_dev->subsystem_device;
   1269	boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(boot_code_id[1]);
   1270
   1271	/* fix up cases where bootcode id[1] != subsys id */
   1272	switch (boot_code_id[1]) {
   1273	case HPI_ADAPTER_FAMILY_ASI(0x5000):
   1274		boot_code_id[0] = boot_code_id[1];
   1275		boot_code_id[1] = 0;
   1276		break;
   1277	case HPI_ADAPTER_FAMILY_ASI(0x5300):
   1278	case HPI_ADAPTER_FAMILY_ASI(0x5400):
   1279	case HPI_ADAPTER_FAMILY_ASI(0x6300):
   1280		boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6400);
   1281		break;
   1282	case HPI_ADAPTER_FAMILY_ASI(0x5500):
   1283	case HPI_ADAPTER_FAMILY_ASI(0x5600):
   1284	case HPI_ADAPTER_FAMILY_ASI(0x6500):
   1285		boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6600);
   1286		break;
   1287	case HPI_ADAPTER_FAMILY_ASI(0x8800):
   1288		boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x8900);
   1289		break;
   1290	default:
   1291		break;
   1292	}
   1293
   1294	/* reset DSP by writing a 1 to the WARMRESET bit */
   1295	temp = C6205_HDCR_WARMRESET;
   1296	iowrite32(temp, phw->prHDCR);
   1297	hpios_delay_micro_seconds(1000);
   1298
   1299	/* check that PCI i/f was configured by EEPROM */
   1300	temp = ioread32(phw->prHSR);
   1301	if ((temp & (C6205_HSR_CFGERR | C6205_HSR_EEREAD)) !=
   1302		C6205_HSR_EEREAD)
   1303		return HPI6205_ERROR_6205_EEPROM;
   1304	temp |= 0x04;
   1305	/* disable PINTA interrupt */
   1306	iowrite32(temp, phw->prHSR);
   1307
   1308	/* check control register reports PCI boot mode */
   1309	temp = ioread32(phw->prHDCR);
   1310	if (!(temp & C6205_HDCR_PCIBOOT))
   1311		return HPI6205_ERROR_6205_REG;
   1312
   1313	/* try writing a few numbers to the DSP page register */
   1314	/* and reading them back. */
   1315	temp = 3;
   1316	iowrite32(temp, phw->prDSPP);
   1317	if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP))
   1318		return HPI6205_ERROR_6205_DSPPAGE;
   1319	temp = 2;
   1320	iowrite32(temp, phw->prDSPP);
   1321	if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP))
   1322		return HPI6205_ERROR_6205_DSPPAGE;
   1323	temp = 1;
   1324	iowrite32(temp, phw->prDSPP);
   1325	if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP))
   1326		return HPI6205_ERROR_6205_DSPPAGE;
   1327	/* reset DSP page to the correct number */
   1328	temp = 0;
   1329	iowrite32(temp, phw->prDSPP);
   1330	if ((temp | C6205_DSPP_MAP1) != ioread32(phw->prDSPP))
   1331		return HPI6205_ERROR_6205_DSPPAGE;
   1332	phw->dsp_page = 0;
   1333
   1334	/* release 6713 from reset before 6205 is bootloaded.
   1335	   This ensures that the EMIF is inactive,
   1336	   and the 6713 HPI gets the correct bootmode etc
   1337	 */
   1338	if (boot_code_id[1] != 0) {
   1339		/* DSP 1 is a C6713 */
   1340		/* CLKX0 <- '1' release the C6205 bootmode pulldowns */
   1341		boot_loader_write_mem32(pao, 0, 0x018C0024, 0x00002202);
   1342		hpios_delay_micro_seconds(100);
   1343		/* Reset the 6713 #1 - revB */
   1344		boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 0);
   1345		/* value of bit 3 is unknown after DSP reset, other bits shoudl be 0 */
   1346		if (0 != (boot_loader_read_mem32(pao, 0,
   1347					(C6205_BAR0_TIMER1_CTL)) & ~8))
   1348			return HPI6205_ERROR_6205_REG;
   1349		hpios_delay_micro_seconds(100);
   1350
   1351		/* Release C6713 from reset - revB */
   1352		boot_loader_write_mem32(pao, 0, C6205_BAR0_TIMER1_CTL, 4);
   1353		if (4 != (boot_loader_read_mem32(pao, 0,
   1354					(C6205_BAR0_TIMER1_CTL)) & ~8))
   1355			return HPI6205_ERROR_6205_REG;
   1356		hpios_delay_micro_seconds(100);
   1357	}
   1358
   1359	for (dsp = 0; dsp < HPI6205_MAX_FILES_TO_LOAD; dsp++) {
   1360		/* is there a DSP to load? */
   1361		if (boot_code_id[dsp] == 0)
   1362			continue;
   1363
   1364		err = boot_loader_config_emif(pao, dsp);
   1365		if (err)
   1366			return err;
   1367
   1368		err = boot_loader_test_internal_memory(pao, dsp);
   1369		if (err)
   1370			return err;
   1371
   1372		err = boot_loader_test_external_memory(pao, dsp);
   1373		if (err)
   1374			return err;
   1375
   1376		err = boot_loader_test_pld(pao, dsp);
   1377		if (err)
   1378			return err;
   1379
   1380		/* write the DSP code down into the DSPs memory */
   1381		err = hpi_dsp_code_open(boot_code_id[dsp], pao->pci.pci_dev,
   1382			&dsp_code, pos_error_code);
   1383		if (err)
   1384			return err;
   1385
   1386		while (1) {
   1387			u32 length;
   1388			u32 address;
   1389			u32 type;
   1390			u32 *pcode;
   1391
   1392			err = hpi_dsp_code_read_word(&dsp_code, &length);
   1393			if (err)
   1394				break;
   1395			if (length == 0xFFFFFFFF)
   1396				break;	/* end of code */
   1397
   1398			err = hpi_dsp_code_read_word(&dsp_code, &address);
   1399			if (err)
   1400				break;
   1401			err = hpi_dsp_code_read_word(&dsp_code, &type);
   1402			if (err)
   1403				break;
   1404			err = hpi_dsp_code_read_block(length, &dsp_code,
   1405				&pcode);
   1406			if (err)
   1407				break;
   1408			for (i = 0; i < (int)length; i++) {
   1409				boot_loader_write_mem32(pao, dsp, address,
   1410					*pcode);
   1411				/* dummy read every 4 words */
   1412				/* for 6205 advisory 1.4.4 */
   1413				if (i % 4 == 0)
   1414					boot_loader_read_mem32(pao, dsp,
   1415						address);
   1416				pcode++;
   1417				address += 4;
   1418			}
   1419
   1420		}
   1421		if (err) {
   1422			hpi_dsp_code_close(&dsp_code);
   1423			return err;
   1424		}
   1425
   1426		/* verify code */
   1427		hpi_dsp_code_rewind(&dsp_code);
   1428		while (1) {
   1429			u32 length = 0;
   1430			u32 address = 0;
   1431			u32 type = 0;
   1432			u32 *pcode = NULL;
   1433			u32 data = 0;
   1434
   1435			hpi_dsp_code_read_word(&dsp_code, &length);
   1436			if (length == 0xFFFFFFFF)
   1437				break;	/* end of code */
   1438
   1439			hpi_dsp_code_read_word(&dsp_code, &address);
   1440			hpi_dsp_code_read_word(&dsp_code, &type);
   1441			hpi_dsp_code_read_block(length, &dsp_code, &pcode);
   1442
   1443			for (i = 0; i < (int)length; i++) {
   1444				data = boot_loader_read_mem32(pao, dsp,
   1445					address);
   1446				if (data != *pcode) {
   1447					err = 0;
   1448					break;
   1449				}
   1450				pcode++;
   1451				address += 4;
   1452			}
   1453			if (err)
   1454				break;
   1455		}
   1456		hpi_dsp_code_close(&dsp_code);
   1457		if (err)
   1458			return err;
   1459	}
   1460
   1461	/* After bootloading all DSPs, start DSP0 running
   1462	 * The DSP0 code will handle starting and synchronizing with its slaves
   1463	 */
   1464	if (phw->p_interface_buffer) {
   1465		/* we need to tell the card the physical PCI address */
   1466		u32 physicalPC_iaddress;
   1467		struct bus_master_interface *interface =
   1468			phw->p_interface_buffer;
   1469		u32 host_mailbox_address_on_dsp;
   1470		u32 physicalPC_iaddress_verify = 0;
   1471		int time_out = 10;
   1472		/* set ack so we know when DSP is ready to go */
   1473		/* (dwDspAck will be changed to HIF_RESET) */
   1474		interface->dsp_ack = H620_HIF_UNKNOWN;
   1475		wmb();	/* ensure ack is written before dsp writes back */
   1476
   1477		err = hpios_locked_mem_get_phys_addr(&phw->h_locked_mem,
   1478			&physicalPC_iaddress);
   1479
   1480		/* locate the host mailbox on the DSP. */
   1481		host_mailbox_address_on_dsp = 0x80000000;
   1482		while ((physicalPC_iaddress != physicalPC_iaddress_verify)
   1483			&& time_out--) {
   1484			boot_loader_write_mem32(pao, 0,
   1485				host_mailbox_address_on_dsp,
   1486				physicalPC_iaddress);
   1487			physicalPC_iaddress_verify =
   1488				boot_loader_read_mem32(pao, 0,
   1489				host_mailbox_address_on_dsp);
   1490		}
   1491	}
   1492	HPI_DEBUG_LOG(DEBUG, "starting DS_ps running\n");
   1493	/* enable interrupts */
   1494	temp = ioread32(phw->prHSR);
   1495	temp &= ~(u32)C6205_HSR_INTAM;
   1496	iowrite32(temp, phw->prHSR);
   1497
   1498	/* start code running... */
   1499	temp = ioread32(phw->prHDCR);
   1500	temp |= (u32)C6205_HDCR_DSPINT;
   1501	iowrite32(temp, phw->prHDCR);
   1502
   1503	/* give the DSP 10ms to start up */
   1504	hpios_delay_micro_seconds(10000);
   1505	return err;
   1506
   1507}
   1508
   1509/*****************************************************************************/
   1510/* Bootloader utility functions */
   1511
   1512static u32 boot_loader_read_mem32(struct hpi_adapter_obj *pao, int dsp_index,
   1513	u32 address)
   1514{
   1515	struct hpi_hw_obj *phw = pao->priv;
   1516	u32 data = 0;
   1517	__iomem u32 *p_data;
   1518
   1519	if (dsp_index == 0) {
   1520		/* DSP 0 is always C6205 */
   1521		if ((address >= 0x01800000) & (address < 0x02000000)) {
   1522			/* BAR1 register access */
   1523			p_data = pao->pci.ap_mem_base[1] +
   1524				(address & 0x007fffff) /
   1525				sizeof(*pao->pci.ap_mem_base[1]);
   1526			/* HPI_DEBUG_LOG(WARNING,
   1527			   "BAR1 access %08x\n", dwAddress); */
   1528		} else {
   1529			u32 dw4M_page = address >> 22L;
   1530			if (dw4M_page != phw->dsp_page) {
   1531				phw->dsp_page = dw4M_page;
   1532				/* *INDENT OFF* */
   1533				iowrite32(phw->dsp_page, phw->prDSPP);
   1534				/* *INDENT-ON* */
   1535			}
   1536			address &= 0x3fffff;	/* address within 4M page */
   1537			/* BAR0 memory access */
   1538			p_data = pao->pci.ap_mem_base[0] +
   1539				address / sizeof(u32);
   1540		}
   1541		data = ioread32(p_data);
   1542	} else if (dsp_index == 1) {
   1543		/* DSP 1 is a C6713 */
   1544		u32 lsb;
   1545		boot_loader_write_mem32(pao, 0, HPIAL_ADDR, address);
   1546		boot_loader_write_mem32(pao, 0, HPIAH_ADDR, address >> 16);
   1547		lsb = boot_loader_read_mem32(pao, 0, HPIDL_ADDR);
   1548		data = boot_loader_read_mem32(pao, 0, HPIDH_ADDR);
   1549		data = (data << 16) | (lsb & 0xFFFF);
   1550	}
   1551	return data;
   1552}
   1553
   1554static void boot_loader_write_mem32(struct hpi_adapter_obj *pao,
   1555	int dsp_index, u32 address, u32 data)
   1556{
   1557	struct hpi_hw_obj *phw = pao->priv;
   1558	__iomem u32 *p_data;
   1559	/*      u32 dwVerifyData=0; */
   1560
   1561	if (dsp_index == 0) {
   1562		/* DSP 0 is always C6205 */
   1563		if ((address >= 0x01800000) & (address < 0x02000000)) {
   1564			/* BAR1 - DSP  register access using */
   1565			/* Non-prefetchable PCI access */
   1566			p_data = pao->pci.ap_mem_base[1] +
   1567				(address & 0x007fffff) /
   1568				sizeof(*pao->pci.ap_mem_base[1]);
   1569		} else {
   1570			/* BAR0 access - all of DSP memory using */
   1571			/* pre-fetchable PCI access */
   1572			u32 dw4M_page = address >> 22L;
   1573			if (dw4M_page != phw->dsp_page) {
   1574				phw->dsp_page = dw4M_page;
   1575				/* *INDENT-OFF* */
   1576				iowrite32(phw->dsp_page, phw->prDSPP);
   1577				/* *INDENT-ON* */
   1578			}
   1579			address &= 0x3fffff;	/* address within 4M page */
   1580			p_data = pao->pci.ap_mem_base[0] +
   1581				address / sizeof(u32);
   1582		}
   1583		iowrite32(data, p_data);
   1584	} else if (dsp_index == 1) {
   1585		/* DSP 1 is a C6713 */
   1586		boot_loader_write_mem32(pao, 0, HPIAL_ADDR, address);
   1587		boot_loader_write_mem32(pao, 0, HPIAH_ADDR, address >> 16);
   1588
   1589		/* dummy read every 4 words for 6205 advisory 1.4.4 */
   1590		boot_loader_read_mem32(pao, 0, 0);
   1591
   1592		boot_loader_write_mem32(pao, 0, HPIDL_ADDR, data);
   1593		boot_loader_write_mem32(pao, 0, HPIDH_ADDR, data >> 16);
   1594
   1595		/* dummy read every 4 words for 6205 advisory 1.4.4 */
   1596		boot_loader_read_mem32(pao, 0, 0);
   1597	}
   1598}
   1599
   1600static u16 boot_loader_config_emif(struct hpi_adapter_obj *pao, int dsp_index)
   1601{
   1602	if (dsp_index == 0) {
   1603		u32 setting;
   1604
   1605		/* DSP 0 is always C6205 */
   1606
   1607		/* Set the EMIF */
   1608		/* memory map of C6205 */
   1609		/* 00000000-0000FFFF    16Kx32 internal program */
   1610		/* 00400000-00BFFFFF    CE0     2Mx32 SDRAM running @ 100MHz */
   1611
   1612		/* EMIF config */
   1613		/*------------ */
   1614		/* Global EMIF control */
   1615		boot_loader_write_mem32(pao, dsp_index, 0x01800000, 0x3779);
   1616#define WS_OFS 28
   1617#define WST_OFS 22
   1618#define WH_OFS 20
   1619#define RS_OFS 16
   1620#define RST_OFS 8
   1621#define MTYPE_OFS 4
   1622#define RH_OFS 0
   1623
   1624		/* EMIF CE0 setup - 2Mx32 Sync DRAM on ASI5000 cards only */
   1625		setting = 0x00000030;
   1626		boot_loader_write_mem32(pao, dsp_index, 0x01800008, setting);
   1627		if (setting != boot_loader_read_mem32(pao, dsp_index,
   1628				0x01800008))
   1629			return HPI6205_ERROR_DSP_EMIF1;
   1630
   1631		/* EMIF CE1 setup - 32 bit async. This is 6713 #1 HPI, */
   1632		/* which occupies D15..0. 6713 starts at 27MHz, so need */
   1633		/* plenty of wait states. See dsn8701.rtf, and 6713 errata. */
   1634		/* WST should be 71, but 63  is max possible */
   1635		setting =
   1636			(1L << WS_OFS) | (63L << WST_OFS) | (1L << WH_OFS) |
   1637			(1L << RS_OFS) | (63L << RST_OFS) | (1L << RH_OFS) |
   1638			(2L << MTYPE_OFS);
   1639		boot_loader_write_mem32(pao, dsp_index, 0x01800004, setting);
   1640		if (setting != boot_loader_read_mem32(pao, dsp_index,
   1641				0x01800004))
   1642			return HPI6205_ERROR_DSP_EMIF2;
   1643
   1644		/* EMIF CE2 setup - 32 bit async. This is 6713 #2 HPI, */
   1645		/* which occupies D15..0. 6713 starts at 27MHz, so need */
   1646		/* plenty of wait states */
   1647		setting =
   1648			(1L << WS_OFS) | (28L << WST_OFS) | (1L << WH_OFS) |
   1649			(1L << RS_OFS) | (63L << RST_OFS) | (1L << RH_OFS) |
   1650			(2L << MTYPE_OFS);
   1651		boot_loader_write_mem32(pao, dsp_index, 0x01800010, setting);
   1652		if (setting != boot_loader_read_mem32(pao, dsp_index,
   1653				0x01800010))
   1654			return HPI6205_ERROR_DSP_EMIF3;
   1655
   1656		/* EMIF CE3 setup - 32 bit async. */
   1657		/* This is the PLD on the ASI5000 cards only */
   1658		setting =
   1659			(1L << WS_OFS) | (10L << WST_OFS) | (1L << WH_OFS) |
   1660			(1L << RS_OFS) | (10L << RST_OFS) | (1L << RH_OFS) |
   1661			(2L << MTYPE_OFS);
   1662		boot_loader_write_mem32(pao, dsp_index, 0x01800014, setting);
   1663		if (setting != boot_loader_read_mem32(pao, dsp_index,
   1664				0x01800014))
   1665			return HPI6205_ERROR_DSP_EMIF4;
   1666
   1667		/* set EMIF SDRAM control for 2Mx32 SDRAM (512x32x4 bank) */
   1668		/*  need to use this else DSP code crashes? */
   1669		boot_loader_write_mem32(pao, dsp_index, 0x01800018,
   1670			0x07117000);
   1671
   1672		/* EMIF SDRAM Refresh Timing */
   1673		/* EMIF SDRAM timing  (orig = 0x410, emulator = 0x61a) */
   1674		boot_loader_write_mem32(pao, dsp_index, 0x0180001C,
   1675			0x00000410);
   1676
   1677	} else if (dsp_index == 1) {
   1678		/* test access to the C6713s HPI registers */
   1679		u32 write_data = 0, read_data = 0, i = 0;
   1680
   1681		/* Set up HPIC for little endian, by setiing HPIC:HWOB=1 */
   1682		write_data = 1;
   1683		boot_loader_write_mem32(pao, 0, HPICL_ADDR, write_data);
   1684		boot_loader_write_mem32(pao, 0, HPICH_ADDR, write_data);
   1685		/* C67 HPI is on lower 16bits of 32bit EMIF */
   1686		read_data =
   1687			0xFFF7 & boot_loader_read_mem32(pao, 0, HPICL_ADDR);
   1688		if (write_data != read_data) {
   1689			HPI_DEBUG_LOG(ERROR, "HPICL %x %x\n", write_data,
   1690				read_data);
   1691			return HPI6205_ERROR_C6713_HPIC;
   1692		}
   1693		/* HPIA - walking ones test */
   1694		write_data = 1;
   1695		for (i = 0; i < 32; i++) {
   1696			boot_loader_write_mem32(pao, 0, HPIAL_ADDR,
   1697				write_data);
   1698			boot_loader_write_mem32(pao, 0, HPIAH_ADDR,
   1699				(write_data >> 16));
   1700			read_data =
   1701				0xFFFF & boot_loader_read_mem32(pao, 0,
   1702				HPIAL_ADDR);
   1703			read_data =
   1704				read_data | ((0xFFFF &
   1705					boot_loader_read_mem32(pao, 0,
   1706						HPIAH_ADDR))
   1707				<< 16);
   1708			if (read_data != write_data) {
   1709				HPI_DEBUG_LOG(ERROR, "HPIA %x %x\n",
   1710					write_data, read_data);
   1711				return HPI6205_ERROR_C6713_HPIA;
   1712			}
   1713			write_data = write_data << 1;
   1714		}
   1715
   1716		/* setup C67x PLL
   1717		 *  ** C6713 datasheet says we cannot program PLL from HPI,
   1718		 * and indeed if we try to set the PLL multiply from the HPI,
   1719		 * the PLL does not seem to lock, so we enable the PLL and
   1720		 * use the default multiply of x 7, which for a 27MHz clock
   1721		 * gives a DSP speed of 189MHz
   1722		 */
   1723		/* bypass PLL */
   1724		boot_loader_write_mem32(pao, dsp_index, 0x01B7C100, 0x0000);
   1725		hpios_delay_micro_seconds(1000);
   1726		/* EMIF = 189/3=63MHz */
   1727		boot_loader_write_mem32(pao, dsp_index, 0x01B7C120, 0x8002);
   1728		/* peri = 189/2 */
   1729		boot_loader_write_mem32(pao, dsp_index, 0x01B7C11C, 0x8001);
   1730		/* cpu  = 189/1 */
   1731		boot_loader_write_mem32(pao, dsp_index, 0x01B7C118, 0x8000);
   1732		hpios_delay_micro_seconds(1000);
   1733		/* ** SGT test to take GPO3 high when we start the PLL */
   1734		/* and low when the delay is completed */
   1735		/* FSX0 <- '1' (GPO3) */
   1736		boot_loader_write_mem32(pao, 0, (0x018C0024L), 0x00002A0A);
   1737		/* PLL not bypassed */
   1738		boot_loader_write_mem32(pao, dsp_index, 0x01B7C100, 0x0001);
   1739		hpios_delay_micro_seconds(1000);
   1740		/* FSX0 <- '0' (GPO3) */
   1741		boot_loader_write_mem32(pao, 0, (0x018C0024L), 0x00002A02);
   1742
   1743		/* 6205 EMIF CE1 resetup - 32 bit async. */
   1744		/* Now 6713 #1 is running at 189MHz can reduce waitstates */
   1745		boot_loader_write_mem32(pao, 0, 0x01800004,	/* CE1 */
   1746			(1L << WS_OFS) | (8L << WST_OFS) | (1L << WH_OFS) |
   1747			(1L << RS_OFS) | (12L << RST_OFS) | (1L << RH_OFS) |
   1748			(2L << MTYPE_OFS));
   1749
   1750		hpios_delay_micro_seconds(1000);
   1751
   1752		/* check that we can read one of the PLL registers */
   1753		/* PLL should not be bypassed! */
   1754		if ((boot_loader_read_mem32(pao, dsp_index, 0x01B7C100) & 0xF)
   1755			!= 0x0001) {
   1756			return HPI6205_ERROR_C6713_PLL;
   1757		}
   1758		/* setup C67x EMIF  (note this is the only use of
   1759		   BAR1 via BootLoader_WriteMem32) */
   1760		boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_GCTL,
   1761			0x000034A8);
   1762
   1763		/* EMIF CE0 setup - 2Mx32 Sync DRAM
   1764		   31..28       Wr setup
   1765		   27..22       Wr strobe
   1766		   21..20       Wr hold
   1767		   19..16       Rd setup
   1768		   15..14       -
   1769		   13..8        Rd strobe
   1770		   7..4         MTYPE   0011            Sync DRAM 32bits
   1771		   3            Wr hold MSB
   1772		   2..0         Rd hold
   1773		 */
   1774		boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_CE0,
   1775			0x00000030);
   1776
   1777		/* EMIF SDRAM Extension
   1778		   0x00
   1779		   31-21        0000b 0000b 000b
   1780		   20           WR2RD = 2cycles-1  = 1b
   1781
   1782		   19-18        WR2DEAC = 3cycle-1 = 10b
   1783		   17           WR2WR = 2cycle-1   = 1b
   1784		   16-15        R2WDQM = 4cycle-1  = 11b
   1785		   14-12        RD2WR = 6cycles-1  = 101b
   1786
   1787		   11-10        RD2DEAC = 4cycle-1 = 11b
   1788		   9            RD2RD = 2cycle-1   = 1b
   1789		   8-7          THZP = 3cycle-1    = 10b
   1790		   6-5          TWR  = 2cycle-1    = 01b (tWR = 17ns)
   1791		   4            TRRD = 2cycle      = 0b  (tRRD = 14ns)
   1792		   3-1          TRAS = 5cycle-1    = 100b (Tras=42ns)
   1793		   1            CAS latency = 3cyc = 1b
   1794		   (for Micron 2M32-7 operating at 100MHz)
   1795		 */
   1796		boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_SDRAMEXT,
   1797			0x001BDF29);
   1798
   1799		/* EMIF SDRAM control - set up for a 2Mx32 SDRAM (512x32x4 bank)
   1800		   31           -       0b       -
   1801		   30           SDBSZ   1b              4 bank
   1802		   29..28       SDRSZ   00b             11 row address pins
   1803
   1804		   27..26       SDCSZ   01b             8 column address pins
   1805		   25           RFEN    1b              refersh enabled
   1806		   24           INIT    1b              init SDRAM!
   1807
   1808		   23..20       TRCD    0001b                   (Trcd/Tcyc)-1 = (20/10)-1 = 1
   1809
   1810		   19..16       TRP     0001b                   (Trp/Tcyc)-1 = (20/10)-1 = 1
   1811
   1812		   15..12       TRC     0110b                   (Trc/Tcyc)-1 = (70/10)-1 = 6
   1813
   1814		   11..0        -       0000b 0000b 0000b
   1815		 */
   1816		boot_loader_write_mem32(pao, dsp_index, C6713_EMIF_SDRAMCTL,
   1817			0x47116000);
   1818
   1819		/* SDRAM refresh timing
   1820		   Need 4,096 refresh cycles every 64ms = 15.625us = 1562cycles of 100MHz = 0x61A
   1821		 */
   1822		boot_loader_write_mem32(pao, dsp_index,
   1823			C6713_EMIF_SDRAMTIMING, 0x00000410);
   1824
   1825		hpios_delay_micro_seconds(1000);
   1826	} else if (dsp_index == 2) {
   1827		/* DSP 2 is a C6713 */
   1828	}
   1829
   1830	return 0;
   1831}
   1832
   1833static u16 boot_loader_test_memory(struct hpi_adapter_obj *pao, int dsp_index,
   1834	u32 start_address, u32 length)
   1835{
   1836	u32 i = 0, j = 0;
   1837	u32 test_addr = 0;
   1838	u32 test_data = 0, data = 0;
   1839
   1840	length = 1000;
   1841
   1842	/* for 1st word, test each bit in the 32bit word, */
   1843	/* dwLength specifies number of 32bit words to test */
   1844	/*for(i=0; i<dwLength; i++) */
   1845	i = 0;
   1846	{
   1847		test_addr = start_address + i * 4;
   1848		test_data = 0x00000001;
   1849		for (j = 0; j < 32; j++) {
   1850			boot_loader_write_mem32(pao, dsp_index, test_addr,
   1851				test_data);
   1852			data = boot_loader_read_mem32(pao, dsp_index,
   1853				test_addr);
   1854			if (data != test_data) {
   1855				HPI_DEBUG_LOG(VERBOSE,
   1856					"Memtest error details  "
   1857					"%08x %08x %08x %i\n", test_addr,
   1858					test_data, data, dsp_index);
   1859				return 1;	/* error */
   1860			}
   1861			test_data = test_data << 1;
   1862		}	/* for(j) */
   1863	}	/* for(i) */
   1864
   1865	/* for the next 100 locations test each location, leaving it as zero */
   1866	/* write a zero to the next word in memory before we read */
   1867	/* the previous write to make sure every memory location is unique */
   1868	for (i = 0; i < 100; i++) {
   1869		test_addr = start_address + i * 4;
   1870		test_data = 0xA5A55A5A;
   1871		boot_loader_write_mem32(pao, dsp_index, test_addr, test_data);
   1872		boot_loader_write_mem32(pao, dsp_index, test_addr + 4, 0);
   1873		data = boot_loader_read_mem32(pao, dsp_index, test_addr);
   1874		if (data != test_data) {
   1875			HPI_DEBUG_LOG(VERBOSE,
   1876				"Memtest error details  "
   1877				"%08x %08x %08x %i\n", test_addr, test_data,
   1878				data, dsp_index);
   1879			return 1;	/* error */
   1880		}
   1881		/* leave location as zero */
   1882		boot_loader_write_mem32(pao, dsp_index, test_addr, 0x0);
   1883	}
   1884
   1885	/* zero out entire memory block */
   1886	for (i = 0; i < length; i++) {
   1887		test_addr = start_address + i * 4;
   1888		boot_loader_write_mem32(pao, dsp_index, test_addr, 0x0);
   1889	}
   1890	return 0;
   1891}
   1892
   1893static u16 boot_loader_test_internal_memory(struct hpi_adapter_obj *pao,
   1894	int dsp_index)
   1895{
   1896	int err = 0;
   1897	if (dsp_index == 0) {
   1898		/* DSP 0 is a C6205 */
   1899		/* 64K prog mem */
   1900		err = boot_loader_test_memory(pao, dsp_index, 0x00000000,
   1901			0x10000);
   1902		if (!err)
   1903			/* 64K data mem */
   1904			err = boot_loader_test_memory(pao, dsp_index,
   1905				0x80000000, 0x10000);
   1906	} else if (dsp_index == 1) {
   1907		/* DSP 1 is a C6713 */
   1908		/* 192K internal mem */
   1909		err = boot_loader_test_memory(pao, dsp_index, 0x00000000,
   1910			0x30000);
   1911		if (!err)
   1912			/* 64K internal mem / L2 cache */
   1913			err = boot_loader_test_memory(pao, dsp_index,
   1914				0x00030000, 0x10000);
   1915	}
   1916
   1917	if (err)
   1918		return HPI6205_ERROR_DSP_INTMEM;
   1919	else
   1920		return 0;
   1921}
   1922
   1923static u16 boot_loader_test_external_memory(struct hpi_adapter_obj *pao,
   1924	int dsp_index)
   1925{
   1926	u32 dRAM_start_address = 0;
   1927	u32 dRAM_size = 0;
   1928
   1929	if (dsp_index == 0) {
   1930		/* only test for SDRAM if an ASI5000 card */
   1931		if (pao->pci.pci_dev->subsystem_device == 0x5000) {
   1932			/* DSP 0 is always C6205 */
   1933			dRAM_start_address = 0x00400000;
   1934			dRAM_size = 0x200000;
   1935			/*dwDRAMinc=1024; */
   1936		} else
   1937			return 0;
   1938	} else if (dsp_index == 1) {
   1939		/* DSP 1 is a C6713 */
   1940		dRAM_start_address = 0x80000000;
   1941		dRAM_size = 0x200000;
   1942		/*dwDRAMinc=1024; */
   1943	}
   1944
   1945	if (boot_loader_test_memory(pao, dsp_index, dRAM_start_address,
   1946			dRAM_size))
   1947		return HPI6205_ERROR_DSP_EXTMEM;
   1948	return 0;
   1949}
   1950
   1951static u16 boot_loader_test_pld(struct hpi_adapter_obj *pao, int dsp_index)
   1952{
   1953	u32 data = 0;
   1954	if (dsp_index == 0) {
   1955		/* only test for DSP0 PLD on ASI5000 card */
   1956		if (pao->pci.pci_dev->subsystem_device == 0x5000) {
   1957			/* PLD is located at CE3=0x03000000 */
   1958			data = boot_loader_read_mem32(pao, dsp_index,
   1959				0x03000008);
   1960			if ((data & 0xF) != 0x5)
   1961				return HPI6205_ERROR_DSP_PLD;
   1962			data = boot_loader_read_mem32(pao, dsp_index,
   1963				0x0300000C);
   1964			if ((data & 0xF) != 0xA)
   1965				return HPI6205_ERROR_DSP_PLD;
   1966		}
   1967	} else if (dsp_index == 1) {
   1968		/* DSP 1 is a C6713 */
   1969		if (pao->pci.pci_dev->subsystem_device == 0x8700) {
   1970			/* PLD is located at CE1=0x90000000 */
   1971			data = boot_loader_read_mem32(pao, dsp_index,
   1972				0x90000010);
   1973			if ((data & 0xFF) != 0xAA)
   1974				return HPI6205_ERROR_DSP_PLD;
   1975			/* 8713 - LED on */
   1976			boot_loader_write_mem32(pao, dsp_index, 0x90000000,
   1977				0x02);
   1978		}
   1979	}
   1980	return 0;
   1981}
   1982
   1983/** Transfer data to or from DSP
   1984 nOperation = H620_H620_HIF_SEND_DATA or H620_HIF_GET_DATA
   1985*/
   1986static short hpi6205_transfer_data(struct hpi_adapter_obj *pao, u8 *p_data,
   1987	u32 data_size, int operation)
   1988{
   1989	struct hpi_hw_obj *phw = pao->priv;
   1990	u32 data_transferred = 0;
   1991	u16 err = 0;
   1992	u32 temp2;
   1993	struct bus_master_interface *interface = phw->p_interface_buffer;
   1994
   1995	if (!p_data)
   1996		return HPI_ERROR_INVALID_DATA_POINTER;
   1997
   1998	data_size &= ~3L;	/* round data_size down to nearest 4 bytes */
   1999
   2000	/* make sure state is IDLE */
   2001	if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT))
   2002		return HPI_ERROR_DSP_HARDWARE;
   2003
   2004	while (data_transferred < data_size) {
   2005		u32 this_copy = data_size - data_transferred;
   2006
   2007		if (this_copy > HPI6205_SIZEOF_DATA)
   2008			this_copy = HPI6205_SIZEOF_DATA;
   2009
   2010		if (operation == H620_HIF_SEND_DATA)
   2011			memcpy((void *)&interface->u.b_data[0],
   2012				&p_data[data_transferred], this_copy);
   2013
   2014		interface->transfer_size_in_bytes = this_copy;
   2015
   2016		/* DSP must change this back to nOperation */
   2017		interface->dsp_ack = H620_HIF_IDLE;
   2018		send_dsp_command(phw, operation);
   2019
   2020		temp2 = wait_dsp_ack(phw, operation, HPI6205_TIMEOUT);
   2021		HPI_DEBUG_LOG(DEBUG, "spun %d times for data xfer of %d\n",
   2022			HPI6205_TIMEOUT - temp2, this_copy);
   2023
   2024		if (!temp2) {
   2025			/* timed out */
   2026			HPI_DEBUG_LOG(ERROR,
   2027				"Timed out waiting for " "state %d got %d\n",
   2028				operation, interface->dsp_ack);
   2029
   2030			break;
   2031		}
   2032		if (operation == H620_HIF_GET_DATA)
   2033			memcpy(&p_data[data_transferred],
   2034				(void *)&interface->u.b_data[0], this_copy);
   2035
   2036		data_transferred += this_copy;
   2037	}
   2038	if (interface->dsp_ack != operation)
   2039		HPI_DEBUG_LOG(DEBUG, "interface->dsp_ack=%d, expected %d\n",
   2040			interface->dsp_ack, operation);
   2041	/*                      err=HPI_ERROR_DSP_HARDWARE; */
   2042
   2043	send_dsp_command(phw, H620_HIF_IDLE);
   2044
   2045	return err;
   2046}
   2047
   2048/* wait for up to timeout_us microseconds for the DSP
   2049   to signal state by DMA into dwDspAck
   2050*/
   2051static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us)
   2052{
   2053	struct bus_master_interface *interface = phw->p_interface_buffer;
   2054	int t = timeout_us / 4;
   2055
   2056	rmb();	/* ensure interface->dsp_ack is up to date */
   2057	while ((interface->dsp_ack != state) && --t) {
   2058		hpios_delay_micro_seconds(4);
   2059		rmb();	/* DSP changes dsp_ack by DMA */
   2060	}
   2061
   2062	/*HPI_DEBUG_LOG(VERBOSE, "Spun %d for %d\n", timeout_us/4-t, state); */
   2063	return t * 4;
   2064}
   2065
   2066/* set the busmaster interface to cmd, then interrupt the DSP */
   2067static void send_dsp_command(struct hpi_hw_obj *phw, int cmd)
   2068{
   2069	struct bus_master_interface *interface = phw->p_interface_buffer;
   2070	u32 r;
   2071
   2072	interface->host_cmd = cmd;
   2073	wmb();	/* DSP gets state by DMA, make sure it is written to memory */
   2074	/* before we interrupt the DSP */
   2075	r = ioread32(phw->prHDCR);
   2076	r |= (u32)C6205_HDCR_DSPINT;
   2077	iowrite32(r, phw->prHDCR);
   2078	r &= ~(u32)C6205_HDCR_DSPINT;
   2079	iowrite32(r, phw->prHDCR);
   2080}
   2081
   2082static unsigned int message_count;
   2083
   2084static u16 message_response_sequence(struct hpi_adapter_obj *pao,
   2085	struct hpi_message *phm, struct hpi_response *phr)
   2086{
   2087	u32 time_out, time_out2;
   2088	struct hpi_hw_obj *phw = pao->priv;
   2089	struct bus_master_interface *interface = phw->p_interface_buffer;
   2090	u16 err = 0;
   2091
   2092	message_count++;
   2093	if (phm->size > sizeof(interface->u.message_buffer)) {
   2094		phr->error = HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL;
   2095		phr->specific_error = sizeof(interface->u.message_buffer);
   2096		phr->size = sizeof(struct hpi_response_header);
   2097		HPI_DEBUG_LOG(ERROR,
   2098			"message len %d too big for buffer %zd \n", phm->size,
   2099			sizeof(interface->u.message_buffer));
   2100		return 0;
   2101	}
   2102
   2103	/* Assume buffer of type struct bus_master_interface_62
   2104	   is allocated "noncacheable" */
   2105
   2106	if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT)) {
   2107		HPI_DEBUG_LOG(DEBUG, "timeout waiting for idle\n");
   2108		return HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT;
   2109	}
   2110
   2111	memcpy(&interface->u.message_buffer, phm, phm->size);
   2112	/* signal we want a response */
   2113	send_dsp_command(phw, H620_HIF_GET_RESP);
   2114
   2115	time_out2 = wait_dsp_ack(phw, H620_HIF_GET_RESP, HPI6205_TIMEOUT);
   2116
   2117	if (!time_out2) {
   2118		HPI_DEBUG_LOG(ERROR,
   2119			"(%u) Timed out waiting for " "GET_RESP state [%x]\n",
   2120			message_count, interface->dsp_ack);
   2121	} else {
   2122		HPI_DEBUG_LOG(VERBOSE,
   2123			"(%u) transition to GET_RESP after %u\n",
   2124			message_count, HPI6205_TIMEOUT - time_out2);
   2125	}
   2126	/* spin waiting on HIF interrupt flag (end of msg process) */
   2127	time_out = HPI6205_TIMEOUT;
   2128
   2129	/* read the result */
   2130	if (time_out) {
   2131		if (interface->u.response_buffer.response.size <= phr->size)
   2132			memcpy(phr, &interface->u.response_buffer,
   2133				interface->u.response_buffer.response.size);
   2134		else {
   2135			HPI_DEBUG_LOG(ERROR,
   2136				"response len %d too big for buffer %d\n",
   2137				interface->u.response_buffer.response.size,
   2138				phr->size);
   2139			memcpy(phr, &interface->u.response_buffer,
   2140				sizeof(struct hpi_response_header));
   2141			phr->error = HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
   2142			phr->specific_error =
   2143				interface->u.response_buffer.response.size;
   2144			phr->size = sizeof(struct hpi_response_header);
   2145		}
   2146	}
   2147	/* set interface back to idle */
   2148	send_dsp_command(phw, H620_HIF_IDLE);
   2149
   2150	if (!time_out || !time_out2) {
   2151		HPI_DEBUG_LOG(DEBUG, "something timed out!\n");
   2152		return HPI6205_ERROR_MSG_RESP_TIMEOUT;
   2153	}
   2154	/* special case for adapter close - */
   2155	/* wait for the DSP to indicate it is idle */
   2156	if (phm->function == HPI_ADAPTER_CLOSE) {
   2157		if (!wait_dsp_ack(phw, H620_HIF_IDLE, HPI6205_TIMEOUT)) {
   2158			HPI_DEBUG_LOG(DEBUG,
   2159				"Timeout waiting for idle "
   2160				"(on adapter_close)\n");
   2161			return HPI6205_ERROR_MSG_RESP_IDLE_TIMEOUT;
   2162		}
   2163	}
   2164	err = hpi_validate_response(phm, phr);
   2165	return err;
   2166}
   2167
   2168static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
   2169	struct hpi_response *phr)
   2170{
   2171
   2172	u16 err = 0;
   2173
   2174	hpios_dsplock_lock(pao);
   2175
   2176	err = message_response_sequence(pao, phm, phr);
   2177
   2178	/* maybe an error response */
   2179	if (err) {
   2180		/* something failed in the HPI/DSP interface */
   2181		if (err >= HPI_ERROR_BACKEND_BASE) {
   2182			phr->error = HPI_ERROR_DSP_COMMUNICATION;
   2183			phr->specific_error = err;
   2184		} else {
   2185			phr->error = err;
   2186		}
   2187
   2188		pao->dsp_crashed++;
   2189
   2190		/* just the header of the response is valid */
   2191		phr->size = sizeof(struct hpi_response_header);
   2192		goto err;
   2193	} else
   2194		pao->dsp_crashed = 0;
   2195
   2196	if (phr->error != 0)	/* something failed in the DSP */
   2197		goto err;
   2198
   2199	switch (phm->function) {
   2200	case HPI_OSTREAM_WRITE:
   2201	case HPI_ISTREAM_ANC_WRITE:
   2202		err = hpi6205_transfer_data(pao, phm->u.d.u.data.pb_data,
   2203			phm->u.d.u.data.data_size, H620_HIF_SEND_DATA);
   2204		break;
   2205
   2206	case HPI_ISTREAM_READ:
   2207	case HPI_OSTREAM_ANC_READ:
   2208		err = hpi6205_transfer_data(pao, phm->u.d.u.data.pb_data,
   2209			phm->u.d.u.data.data_size, H620_HIF_GET_DATA);
   2210		break;
   2211
   2212	}
   2213	phr->error = err;
   2214
   2215err:
   2216	hpios_dsplock_unlock(pao);
   2217
   2218	return;
   2219}