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		phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
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}
2220