Linux Audio

Check our new training course

Loading...
v5.9
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Intel SST Firmware Loader
   4 *
   5 * Copyright (C) 2013, Intel Corporation. All rights reserved.
 
 
 
 
 
 
 
 
 
 
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/slab.h>
  10#include <linux/sched.h>
  11#include <linux/firmware.h>
  12#include <linux/export.h>
  13#include <linux/module.h>
  14#include <linux/platform_device.h>
  15#include <linux/dma-mapping.h>
  16#include <linux/dmaengine.h>
  17#include <linux/pci.h>
  18#include <linux/acpi.h>
  19#include <linux/pgtable.h>
  20
  21/* supported DMA engine drivers */
  22#include <linux/dma/dw.h>
  23
  24#include <asm/page.h>
 
  25
  26#include "sst-dsp.h"
  27#include "sst-dsp-priv.h"
  28
  29#define SST_DMA_RESOURCES	2
  30#define SST_DSP_DMA_MAX_BURST	0x3
  31#define SST_HSW_BLOCK_ANY	0xffffffff
  32
  33#define SST_HSW_MASK_DMA_ADDR_DSP 0xfff00000
  34
  35struct sst_dma {
  36	struct sst_dsp *sst;
  37
  38	struct dw_dma_chip *chip;
  39
  40	struct dma_async_tx_descriptor *desc;
  41	struct dma_chan *ch;
  42};
  43
  44static inline void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
  45{
  46	u32 tmp = 0;
  47	int i, m, n;
  48	const u8 *src_byte = src;
  49
  50	m = bytes / 4;
  51	n = bytes % 4;
  52
  53	/* __iowrite32_copy use 32bit size values so divide by 4 */
  54	__iowrite32_copy((void *)dest, src, m);
  55
  56	if (n) {
  57		for (i = 0; i < n; i++)
  58			tmp |= (u32)*(src_byte + m * 4 + i) << (i * 8);
  59		__iowrite32_copy((void *)(dest + m * 4), &tmp, 1);
  60	}
  61
  62}
  63
  64static void sst_dma_transfer_complete(void *arg)
  65{
  66	struct sst_dsp *sst = (struct sst_dsp *)arg;
  67
  68	dev_dbg(sst->dev, "DMA: callback\n");
  69}
  70
  71static int sst_dsp_dma_copy(struct sst_dsp *sst, dma_addr_t dest_addr,
  72	dma_addr_t src_addr, size_t size)
  73{
  74	struct dma_async_tx_descriptor *desc;
  75	struct sst_dma *dma = sst->dma;
  76
  77	if (dma->ch == NULL) {
  78		dev_err(sst->dev, "error: no DMA channel\n");
  79		return -ENODEV;
  80	}
  81
  82	dev_dbg(sst->dev, "DMA: src: 0x%lx dest 0x%lx size %zu\n",
  83		(unsigned long)src_addr, (unsigned long)dest_addr, size);
  84
  85	desc = dma->ch->device->device_prep_dma_memcpy(dma->ch, dest_addr,
  86		src_addr, size, DMA_CTRL_ACK);
  87	if (!desc){
  88		dev_err(sst->dev, "error: dma prep memcpy failed\n");
  89		return -EINVAL;
  90	}
  91
  92	desc->callback = sst_dma_transfer_complete;
  93	desc->callback_param = sst;
  94
  95	desc->tx_submit(desc);
  96	dma_wait_for_async_tx(desc);
  97
  98	return 0;
  99}
 100
 101/* copy to DSP */
 102int sst_dsp_dma_copyto(struct sst_dsp *sst, dma_addr_t dest_addr,
 103	dma_addr_t src_addr, size_t size)
 104{
 105	return sst_dsp_dma_copy(sst, dest_addr | SST_HSW_MASK_DMA_ADDR_DSP,
 106			src_addr, size);
 107}
 108EXPORT_SYMBOL_GPL(sst_dsp_dma_copyto);
 109
 110/* copy from DSP */
 111int sst_dsp_dma_copyfrom(struct sst_dsp *sst, dma_addr_t dest_addr,
 112	dma_addr_t src_addr, size_t size)
 113{
 114	return sst_dsp_dma_copy(sst, dest_addr,
 115		src_addr | SST_HSW_MASK_DMA_ADDR_DSP, size);
 116}
 117EXPORT_SYMBOL_GPL(sst_dsp_dma_copyfrom);
 118
 119/* remove module from memory - callers hold locks */
 120static void block_list_remove(struct sst_dsp *dsp,
 121	struct list_head *block_list)
 122{
 123	struct sst_mem_block *block, *tmp;
 124	int err;
 125
 126	/* disable each block  */
 127	list_for_each_entry(block, block_list, module_list) {
 128
 129		if (block->ops && block->ops->disable) {
 130			err = block->ops->disable(block);
 131			if (err < 0)
 132				dev_err(dsp->dev,
 133					"error: cant disable block %d:%d\n",
 134					block->type, block->index);
 135		}
 136	}
 137
 138	/* mark each block as free */
 139	list_for_each_entry_safe(block, tmp, block_list, module_list) {
 140		list_del(&block->module_list);
 141		list_move(&block->list, &dsp->free_block_list);
 142		dev_dbg(dsp->dev, "block freed %d:%d at offset 0x%x\n",
 143			block->type, block->index, block->offset);
 144	}
 145}
 146
 147/* prepare the memory block to receive data from host - callers hold locks */
 148static int block_list_prepare(struct sst_dsp *dsp,
 149	struct list_head *block_list)
 150{
 151	struct sst_mem_block *block;
 152	int ret = 0;
 153
 154	/* enable each block so that's it'e ready for data */
 155	list_for_each_entry(block, block_list, module_list) {
 156
 157		if (block->ops && block->ops->enable && !block->users) {
 158			ret = block->ops->enable(block);
 159			if (ret < 0) {
 160				dev_err(dsp->dev,
 161					"error: cant disable block %d:%d\n",
 162					block->type, block->index);
 163				goto err;
 164			}
 165		}
 166	}
 167	return ret;
 168
 169err:
 170	list_for_each_entry(block, block_list, module_list) {
 171		if (block->ops && block->ops->disable)
 172			block->ops->disable(block);
 173	}
 174	return ret;
 175}
 176
 177static struct dw_dma_chip *dw_probe(struct device *dev, struct resource *mem,
 178	int irq)
 179{
 180	struct dw_dma_chip *chip;
 181	int err;
 182
 183	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
 184	if (!chip)
 185		return ERR_PTR(-ENOMEM);
 186
 187	chip->irq = irq;
 188	chip->regs = devm_ioremap_resource(dev, mem);
 189	if (IS_ERR(chip->regs))
 190		return ERR_CAST(chip->regs);
 191
 192	err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(31));
 193	if (err)
 194		return ERR_PTR(err);
 195
 196	chip->dev = dev;
 197
 198	err = dw_dma_probe(chip);
 199	if (err)
 200		return ERR_PTR(err);
 201
 202	return chip;
 203}
 204
 205static void dw_remove(struct dw_dma_chip *chip)
 206{
 207	dw_dma_remove(chip);
 208}
 209
 210static bool dma_chan_filter(struct dma_chan *chan, void *param)
 211{
 212	struct sst_dsp *dsp = (struct sst_dsp *)param;
 213
 214	return chan->device->dev == dsp->dma_dev;
 215}
 216
 217int sst_dsp_dma_get_channel(struct sst_dsp *dsp, int chan_id)
 218{
 219	struct sst_dma *dma = dsp->dma;
 220	struct dma_slave_config slave;
 221	dma_cap_mask_t mask;
 222	int ret;
 223
 224	dma_cap_zero(mask);
 225	dma_cap_set(DMA_SLAVE, mask);
 226	dma_cap_set(DMA_MEMCPY, mask);
 227
 228	dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);
 229	if (dma->ch == NULL) {
 230		dev_err(dsp->dev, "error: DMA request channel failed\n");
 231		return -EIO;
 232	}
 233
 234	memset(&slave, 0, sizeof(slave));
 235	slave.direction = DMA_MEM_TO_DEV;
 236	slave.src_addr_width =
 237		slave.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 238	slave.src_maxburst = slave.dst_maxburst = SST_DSP_DMA_MAX_BURST;
 239
 240	ret = dmaengine_slave_config(dma->ch, &slave);
 241	if (ret) {
 242		dev_err(dsp->dev, "error: unable to set DMA slave config %d\n",
 243			ret);
 244		dma_release_channel(dma->ch);
 245		dma->ch = NULL;
 246	}
 247
 248	return ret;
 249}
 250EXPORT_SYMBOL_GPL(sst_dsp_dma_get_channel);
 251
 252void sst_dsp_dma_put_channel(struct sst_dsp *dsp)
 253{
 254	struct sst_dma *dma = dsp->dma;
 255
 256	if (!dma->ch)
 257		return;
 258
 259	dma_release_channel(dma->ch);
 260	dma->ch = NULL;
 261}
 262EXPORT_SYMBOL_GPL(sst_dsp_dma_put_channel);
 263
 264static int sst_dma_new(struct sst_dsp *sst)
 265{
 266	struct sst_pdata *sst_pdata = sst->pdata;
 267	struct sst_dma *dma;
 268	struct resource mem;
 
 269	int ret = 0;
 270
 271	if (sst->pdata->resindex_dma_base == -1)
 272		/* DMA is not used, return and squelsh error messages */
 273		return 0;
 274
 275	/* configure the correct platform data for whatever DMA engine
 276	* is attached to the ADSP IP. */
 277	switch (sst->pdata->dma_engine) {
 278	case SST_DMA_TYPE_DW:
 
 279		break;
 280	default:
 281		dev_err(sst->dev, "error: invalid DMA engine %d\n",
 282			sst->pdata->dma_engine);
 283		return -EINVAL;
 284	}
 285
 286	dma = devm_kzalloc(sst->dev, sizeof(struct sst_dma), GFP_KERNEL);
 287	if (!dma)
 288		return -ENOMEM;
 289
 290	dma->sst = sst;
 291
 292	memset(&mem, 0, sizeof(mem));
 293
 294	mem.start = sst->addr.lpe_base + sst_pdata->dma_base;
 295	mem.end   = sst->addr.lpe_base + sst_pdata->dma_base + sst_pdata->dma_size - 1;
 296	mem.flags = IORESOURCE_MEM;
 297
 298	/* now register DMA engine device */
 299	dma->chip = dw_probe(sst->dma_dev, &mem, sst_pdata->irq);
 300	if (IS_ERR(dma->chip)) {
 301		dev_err(sst->dev, "error: DMA device register failed\n");
 302		ret = PTR_ERR(dma->chip);
 303		goto err_dma_dev;
 304	}
 305
 306	sst->dma = dma;
 307	sst->fw_use_dma = true;
 308	return 0;
 309
 310err_dma_dev:
 311	devm_kfree(sst->dev, dma);
 312	return ret;
 313}
 
 314
 315static void sst_dma_free(struct sst_dma *dma)
 316{
 317
 318	if (dma == NULL)
 319		return;
 320
 321	if (dma->ch)
 322		dma_release_channel(dma->ch);
 323
 324	if (dma->chip)
 325		dw_remove(dma->chip);
 326
 327}
 
 328
 329/* create new generic firmware object */
 330struct sst_fw *sst_fw_new(struct sst_dsp *dsp, 
 331	const struct firmware *fw, void *private)
 332{
 333	struct sst_fw *sst_fw;
 334	int err;
 335
 336	if (!dsp->ops->parse_fw)
 337		return NULL;
 338
 339	sst_fw = kzalloc(sizeof(*sst_fw), GFP_KERNEL);
 340	if (sst_fw == NULL)
 341		return NULL;
 342
 343	sst_fw->dsp = dsp;
 344	sst_fw->private = private;
 345	sst_fw->size = fw->size;
 346
 347	/* allocate DMA buffer to store FW data */
 348	sst_fw->dma_buf = dma_alloc_coherent(dsp->dma_dev, sst_fw->size,
 349				&sst_fw->dmable_fw_paddr, GFP_KERNEL);
 350	if (!sst_fw->dma_buf) {
 351		dev_err(dsp->dev, "error: DMA alloc failed\n");
 352		kfree(sst_fw);
 353		return NULL;
 354	}
 355
 356	/* copy FW data to DMA-able memory */
 357	memcpy((void *)sst_fw->dma_buf, (void *)fw->data, fw->size);
 358
 359	if (dsp->fw_use_dma) {
 360		err = sst_dsp_dma_get_channel(dsp, 0);
 361		if (err < 0)
 362			goto chan_err;
 363	}
 364
 365	/* call core specific FW paser to load FW data into DSP */
 366	err = dsp->ops->parse_fw(sst_fw);
 367	if (err < 0) {
 368		dev_err(dsp->dev, "error: parse fw failed %d\n", err);
 369		goto parse_err;
 370	}
 371
 372	if (dsp->fw_use_dma)
 373		sst_dsp_dma_put_channel(dsp);
 374
 375	mutex_lock(&dsp->mutex);
 376	list_add(&sst_fw->list, &dsp->fw_list);
 377	mutex_unlock(&dsp->mutex);
 378
 379	return sst_fw;
 380
 381parse_err:
 382	if (dsp->fw_use_dma)
 383		sst_dsp_dma_put_channel(dsp);
 384chan_err:
 385	dma_free_coherent(dsp->dma_dev, sst_fw->size,
 386				sst_fw->dma_buf,
 387				sst_fw->dmable_fw_paddr);
 388	sst_fw->dma_buf = NULL;
 389	kfree(sst_fw);
 390	return NULL;
 391}
 392EXPORT_SYMBOL_GPL(sst_fw_new);
 393
 394int sst_fw_reload(struct sst_fw *sst_fw)
 395{
 396	struct sst_dsp *dsp = sst_fw->dsp;
 397	int ret;
 398
 399	dev_dbg(dsp->dev, "reloading firmware\n");
 400
 401	/* call core specific FW paser to load FW data into DSP */
 402	ret = dsp->ops->parse_fw(sst_fw);
 403	if (ret < 0)
 404		dev_err(dsp->dev, "error: parse fw failed %d\n", ret);
 405
 406	return ret;
 407}
 408EXPORT_SYMBOL_GPL(sst_fw_reload);
 409
 410void sst_fw_unload(struct sst_fw *sst_fw)
 411{
 412	struct sst_dsp *dsp = sst_fw->dsp;
 413	struct sst_module *module, *mtmp;
 414	struct sst_module_runtime *runtime, *rtmp;
 415
 416	dev_dbg(dsp->dev, "unloading firmware\n");
 417
 418	mutex_lock(&dsp->mutex);
 419
 420	/* check module by module */
 421	list_for_each_entry_safe(module, mtmp, &dsp->module_list, list) {
 422		if (module->sst_fw == sst_fw) {
 423
 424			/* remove runtime modules */
 425			list_for_each_entry_safe(runtime, rtmp, &module->runtime_list, list) {
 426
 427				block_list_remove(dsp, &runtime->block_list);
 428				list_del(&runtime->list);
 429				kfree(runtime);
 430			}
 431
 432			/* now remove the module */
 433			block_list_remove(dsp, &module->block_list);
 434			list_del(&module->list);
 435			kfree(module);
 436		}
 437	}
 438
 439	/* remove all scratch blocks */
 440	block_list_remove(dsp, &dsp->scratch_block_list);
 441
 442	mutex_unlock(&dsp->mutex);
 443}
 444EXPORT_SYMBOL_GPL(sst_fw_unload);
 445
 446/* free single firmware object */
 447void sst_fw_free(struct sst_fw *sst_fw)
 448{
 449	struct sst_dsp *dsp = sst_fw->dsp;
 450
 451	mutex_lock(&dsp->mutex);
 452	list_del(&sst_fw->list);
 453	mutex_unlock(&dsp->mutex);
 454
 455	if (sst_fw->dma_buf)
 456		dma_free_coherent(dsp->dma_dev, sst_fw->size, sst_fw->dma_buf,
 457			sst_fw->dmable_fw_paddr);
 458	kfree(sst_fw);
 459}
 460EXPORT_SYMBOL_GPL(sst_fw_free);
 461
 462/* free all firmware objects */
 463void sst_fw_free_all(struct sst_dsp *dsp)
 464{
 465	struct sst_fw *sst_fw, *t;
 466
 467	mutex_lock(&dsp->mutex);
 468	list_for_each_entry_safe(sst_fw, t, &dsp->fw_list, list) {
 469
 470		list_del(&sst_fw->list);
 471		dma_free_coherent(dsp->dev, sst_fw->size, sst_fw->dma_buf,
 472			sst_fw->dmable_fw_paddr);
 473		kfree(sst_fw);
 474	}
 475	mutex_unlock(&dsp->mutex);
 476}
 477EXPORT_SYMBOL_GPL(sst_fw_free_all);
 478
 479/* create a new SST generic module from FW template */
 480struct sst_module *sst_module_new(struct sst_fw *sst_fw,
 481	struct sst_module_template *template, void *private)
 482{
 483	struct sst_dsp *dsp = sst_fw->dsp;
 484	struct sst_module *sst_module;
 485
 486	sst_module = kzalloc(sizeof(*sst_module), GFP_KERNEL);
 487	if (sst_module == NULL)
 488		return NULL;
 489
 490	sst_module->id = template->id;
 491	sst_module->dsp = dsp;
 492	sst_module->sst_fw = sst_fw;
 493	sst_module->scratch_size = template->scratch_size;
 494	sst_module->persistent_size = template->persistent_size;
 495	sst_module->entry = template->entry;
 496	sst_module->state = SST_MODULE_STATE_UNLOADED;
 497
 498	INIT_LIST_HEAD(&sst_module->block_list);
 499	INIT_LIST_HEAD(&sst_module->runtime_list);
 500
 501	mutex_lock(&dsp->mutex);
 502	list_add(&sst_module->list, &dsp->module_list);
 503	mutex_unlock(&dsp->mutex);
 504
 505	return sst_module;
 506}
 507EXPORT_SYMBOL_GPL(sst_module_new);
 508
 509/* free firmware module and remove from available list */
 510void sst_module_free(struct sst_module *sst_module)
 511{
 512	struct sst_dsp *dsp = sst_module->dsp;
 513
 514	mutex_lock(&dsp->mutex);
 515	list_del(&sst_module->list);
 516	mutex_unlock(&dsp->mutex);
 517
 518	kfree(sst_module);
 519}
 520EXPORT_SYMBOL_GPL(sst_module_free);
 521
 522struct sst_module_runtime *sst_module_runtime_new(struct sst_module *module,
 523	int id, void *private)
 524{
 525	struct sst_dsp *dsp = module->dsp;
 526	struct sst_module_runtime *runtime;
 527
 528	runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
 529	if (runtime == NULL)
 530		return NULL;
 531
 532	runtime->id = id;
 533	runtime->dsp = dsp;
 534	runtime->module = module;
 535	INIT_LIST_HEAD(&runtime->block_list);
 536
 537	mutex_lock(&dsp->mutex);
 538	list_add(&runtime->list, &module->runtime_list);
 539	mutex_unlock(&dsp->mutex);
 540
 541	return runtime;
 542}
 543EXPORT_SYMBOL_GPL(sst_module_runtime_new);
 544
 545void sst_module_runtime_free(struct sst_module_runtime *runtime)
 546{
 547	struct sst_dsp *dsp = runtime->dsp;
 548
 549	mutex_lock(&dsp->mutex);
 550	list_del(&runtime->list);
 551	mutex_unlock(&dsp->mutex);
 552
 553	kfree(runtime);
 554}
 555EXPORT_SYMBOL_GPL(sst_module_runtime_free);
 556
 557static struct sst_mem_block *find_block(struct sst_dsp *dsp,
 558	struct sst_block_allocator *ba)
 559{
 560	struct sst_mem_block *block;
 561
 562	list_for_each_entry(block, &dsp->free_block_list, list) {
 563		if (block->type == ba->type && block->offset == ba->offset)
 564			return block;
 565	}
 566
 567	return NULL;
 568}
 569
 570/* Block allocator must be on block boundary */
 571static int block_alloc_contiguous(struct sst_dsp *dsp,
 572	struct sst_block_allocator *ba, struct list_head *block_list)
 573{
 574	struct list_head tmp = LIST_HEAD_INIT(tmp);
 575	struct sst_mem_block *block;
 576	u32 block_start = SST_HSW_BLOCK_ANY;
 577	int size = ba->size, offset = ba->offset;
 578
 579	while (ba->size > 0) {
 580
 581		block = find_block(dsp, ba);
 582		if (!block) {
 583			list_splice(&tmp, &dsp->free_block_list);
 584
 585			ba->size = size;
 586			ba->offset = offset;
 587			return -ENOMEM;
 588		}
 589
 590		list_move_tail(&block->list, &tmp);
 591		ba->offset += block->size;
 592		ba->size -= block->size;
 593	}
 594	ba->size = size;
 595	ba->offset = offset;
 596
 597	list_for_each_entry(block, &tmp, list) {
 598
 599		if (block->offset < block_start)
 600			block_start = block->offset;
 601
 602		list_add(&block->module_list, block_list);
 603
 604		dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 605			block->type, block->index, block->offset);
 606	}
 607
 608	list_splice(&tmp, &dsp->used_block_list);
 609	return 0;
 610}
 611
 612/* allocate first free DSP blocks for data - callers hold locks */
 613static int block_alloc(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 614	struct list_head *block_list)
 615{
 616	struct sst_mem_block *block, *tmp;
 617	int ret = 0;
 618
 619	if (ba->size == 0)
 620		return 0;
 621
 622	/* find first free whole blocks that can hold module */
 623	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 624
 625		/* ignore blocks with wrong type */
 626		if (block->type != ba->type)
 627			continue;
 628
 629		if (ba->size > block->size)
 630			continue;
 631
 632		ba->offset = block->offset;
 633		block->bytes_used = ba->size % block->size;
 634		list_add(&block->module_list, block_list);
 635		list_move(&block->list, &dsp->used_block_list);
 636		dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 637			block->type, block->index, block->offset);
 638		return 0;
 639	}
 640
 641	/* then find free multiple blocks that can hold module */
 642	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 643
 644		/* ignore blocks with wrong type */
 645		if (block->type != ba->type)
 646			continue;
 647
 648		/* do we span > 1 blocks */
 649		if (ba->size > block->size) {
 650
 651			/* align ba to block boundary */
 652			ba->offset = block->offset;
 653
 654			ret = block_alloc_contiguous(dsp, ba, block_list);
 655			if (ret == 0)
 656				return ret;
 657
 658		}
 659	}
 660
 661	/* not enough free block space */
 662	return -ENOMEM;
 663}
 664
 665int sst_alloc_blocks(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 666	struct list_head *block_list)
 667{
 668	int ret;
 669
 670	dev_dbg(dsp->dev, "block request 0x%x bytes at offset 0x%x type %d\n",
 671		ba->size, ba->offset, ba->type);
 672
 673	mutex_lock(&dsp->mutex);
 674
 675	ret = block_alloc(dsp, ba, block_list);
 676	if (ret < 0) {
 677		dev_err(dsp->dev, "error: can't alloc blocks %d\n", ret);
 678		goto out;
 679	}
 680
 681	/* prepare DSP blocks for module usage */
 682	ret = block_list_prepare(dsp, block_list);
 683	if (ret < 0)
 684		dev_err(dsp->dev, "error: prepare failed\n");
 685
 686out:
 687	mutex_unlock(&dsp->mutex);
 688	return ret;
 689}
 690EXPORT_SYMBOL_GPL(sst_alloc_blocks);
 691
 692int sst_free_blocks(struct sst_dsp *dsp, struct list_head *block_list)
 693{
 694	mutex_lock(&dsp->mutex);
 695	block_list_remove(dsp, block_list);
 696	mutex_unlock(&dsp->mutex);
 697	return 0;
 698}
 699EXPORT_SYMBOL_GPL(sst_free_blocks);
 700
 701/* allocate memory blocks for static module addresses - callers hold locks */
 702static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 703	struct list_head *block_list)
 704{
 705	struct sst_mem_block *block, *tmp;
 706	struct sst_block_allocator ba_tmp = *ba;
 707	u32 end = ba->offset + ba->size, block_end;
 708	int err;
 709
 710	/* only IRAM/DRAM blocks are managed */
 711	if (ba->type != SST_MEM_IRAM && ba->type != SST_MEM_DRAM)
 712		return 0;
 713
 714	/* are blocks already attached to this module */
 715	list_for_each_entry_safe(block, tmp, block_list, module_list) {
 716
 717		/* ignore blocks with wrong type */
 718		if (block->type != ba->type)
 719			continue;
 720
 721		block_end = block->offset + block->size;
 722
 723		/* find block that holds section */
 724		if (ba->offset >= block->offset && end <= block_end)
 725			return 0;
 726
 727		/* does block span more than 1 section */
 728		if (ba->offset >= block->offset && ba->offset < block_end) {
 729
 730			/* align ba to block boundary */
 731			ba_tmp.size -= block_end - ba->offset;
 732			ba_tmp.offset = block_end;
 733			err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
 734			if (err < 0)
 735				return -ENOMEM;
 736
 737			/* module already owns blocks */
 738			return 0;
 739		}
 740	}
 741
 742	/* find first free blocks that can hold section in free list */
 743	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 744		block_end = block->offset + block->size;
 745
 746		/* ignore blocks with wrong type */
 747		if (block->type != ba->type)
 748			continue;
 749
 750		/* find block that holds section */
 751		if (ba->offset >= block->offset && end <= block_end) {
 752
 753			/* add block */
 754			list_move(&block->list, &dsp->used_block_list);
 755			list_add(&block->module_list, block_list);
 756			dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 757				block->type, block->index, block->offset);
 758			return 0;
 759		}
 760
 761		/* does block span more than 1 section */
 762		if (ba->offset >= block->offset && ba->offset < block_end) {
 763
 764			/* add block */
 765			list_move(&block->list, &dsp->used_block_list);
 766			list_add(&block->module_list, block_list);
 767			/* align ba to block boundary */
 768			ba_tmp.size -= block_end - ba->offset;
 769			ba_tmp.offset = block_end;
 770
 771			err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
 772			if (err < 0)
 773				return -ENOMEM;
 774
 775			return 0;
 776		}
 777	}
 778
 779	return -ENOMEM;
 780}
 781
 782/* Load fixed module data into DSP memory blocks */
 783int sst_module_alloc_blocks(struct sst_module *module)
 784{
 785	struct sst_dsp *dsp = module->dsp;
 786	struct sst_fw *sst_fw = module->sst_fw;
 787	struct sst_block_allocator ba;
 788	int ret;
 789
 790	memset(&ba, 0, sizeof(ba));
 791	ba.size = module->size;
 792	ba.type = module->type;
 793	ba.offset = module->offset;
 794
 795	dev_dbg(dsp->dev, "block request 0x%x bytes at offset 0x%x type %d\n",
 796		ba.size, ba.offset, ba.type);
 797
 798	mutex_lock(&dsp->mutex);
 799
 800	/* alloc blocks that includes this section */
 801	ret = block_alloc_fixed(dsp, &ba, &module->block_list);
 802	if (ret < 0) {
 803		dev_err(dsp->dev,
 804			"error: no free blocks for section at offset 0x%x size 0x%x\n",
 805			module->offset, module->size);
 806		mutex_unlock(&dsp->mutex);
 807		return -ENOMEM;
 808	}
 809
 810	/* prepare DSP blocks for module copy */
 811	ret = block_list_prepare(dsp, &module->block_list);
 812	if (ret < 0) {
 813		dev_err(dsp->dev, "error: fw module prepare failed\n");
 814		goto err;
 815	}
 816
 817	/* copy partial module data to blocks */
 818	if (dsp->fw_use_dma) {
 819		ret = sst_dsp_dma_copyto(dsp,
 820			dsp->addr.lpe_base + module->offset,
 821			sst_fw->dmable_fw_paddr + module->data_offset,
 822			module->size);
 823		if (ret < 0) {
 824			dev_err(dsp->dev, "error: module copy failed\n");
 825			goto err;
 826		}
 827	} else
 828		sst_memcpy32(dsp->addr.lpe + module->offset, module->data,
 829			module->size);
 830
 831	mutex_unlock(&dsp->mutex);
 832	return ret;
 833
 834err:
 835	block_list_remove(dsp, &module->block_list);
 836	mutex_unlock(&dsp->mutex);
 837	return ret;
 838}
 839EXPORT_SYMBOL_GPL(sst_module_alloc_blocks);
 840
 841/* Unload entire module from DSP memory */
 842int sst_module_free_blocks(struct sst_module *module)
 843{
 844	struct sst_dsp *dsp = module->dsp;
 845
 846	mutex_lock(&dsp->mutex);
 847	block_list_remove(dsp, &module->block_list);
 848	mutex_unlock(&dsp->mutex);
 849	return 0;
 850}
 851EXPORT_SYMBOL_GPL(sst_module_free_blocks);
 852
 853int sst_module_runtime_alloc_blocks(struct sst_module_runtime *runtime,
 854	int offset)
 855{
 856	struct sst_dsp *dsp = runtime->dsp;
 857	struct sst_module *module = runtime->module;
 858	struct sst_block_allocator ba;
 859	int ret;
 860
 861	if (module->persistent_size == 0)
 862		return 0;
 863
 864	memset(&ba, 0, sizeof(ba));
 865	ba.size = module->persistent_size;
 866	ba.type = SST_MEM_DRAM;
 867
 868	mutex_lock(&dsp->mutex);
 869
 870	/* do we need to allocate at a fixed address ? */
 871	if (offset != 0) {
 872
 873		ba.offset = offset;
 874
 875		dev_dbg(dsp->dev, "persistent fixed block request 0x%x bytes type %d offset 0x%x\n",
 876			ba.size, ba.type, ba.offset);
 877
 878		/* alloc blocks that includes this section */
 879		ret = block_alloc_fixed(dsp, &ba, &runtime->block_list);
 880
 881	} else {
 882		dev_dbg(dsp->dev, "persistent block request 0x%x bytes type %d\n",
 883			ba.size, ba.type);
 884
 885		/* alloc blocks that includes this section */
 886		ret = block_alloc(dsp, &ba, &runtime->block_list);
 887	}
 888	if (ret < 0) {
 889		dev_err(dsp->dev,
 890		"error: no free blocks for runtime module size 0x%x\n",
 891			module->persistent_size);
 892		mutex_unlock(&dsp->mutex);
 893		return -ENOMEM;
 894	}
 895	runtime->persistent_offset = ba.offset;
 896
 897	/* prepare DSP blocks for module copy */
 898	ret = block_list_prepare(dsp, &runtime->block_list);
 899	if (ret < 0) {
 900		dev_err(dsp->dev, "error: runtime block prepare failed\n");
 901		goto err;
 902	}
 903
 904	mutex_unlock(&dsp->mutex);
 905	return ret;
 906
 907err:
 908	block_list_remove(dsp, &module->block_list);
 909	mutex_unlock(&dsp->mutex);
 910	return ret;
 911}
 912EXPORT_SYMBOL_GPL(sst_module_runtime_alloc_blocks);
 913
 914int sst_module_runtime_free_blocks(struct sst_module_runtime *runtime)
 915{
 916	struct sst_dsp *dsp = runtime->dsp;
 917
 918	mutex_lock(&dsp->mutex);
 919	block_list_remove(dsp, &runtime->block_list);
 920	mutex_unlock(&dsp->mutex);
 921	return 0;
 922}
 923EXPORT_SYMBOL_GPL(sst_module_runtime_free_blocks);
 924
 925int sst_module_runtime_save(struct sst_module_runtime *runtime,
 926	struct sst_module_runtime_context *context)
 927{
 928	struct sst_dsp *dsp = runtime->dsp;
 929	struct sst_module *module = runtime->module;
 930	int ret = 0;
 931
 932	dev_dbg(dsp->dev, "saving runtime %d memory at 0x%x size 0x%x\n",
 933		runtime->id, runtime->persistent_offset,
 934		module->persistent_size);
 935
 936	context->buffer = dma_alloc_coherent(dsp->dma_dev,
 937		module->persistent_size,
 938		&context->dma_buffer, GFP_DMA | GFP_KERNEL);
 939	if (!context->buffer) {
 940		dev_err(dsp->dev, "error: DMA context alloc failed\n");
 941		return -ENOMEM;
 942	}
 943
 944	mutex_lock(&dsp->mutex);
 945
 946	if (dsp->fw_use_dma) {
 947
 948		ret = sst_dsp_dma_get_channel(dsp, 0);
 949		if (ret < 0)
 950			goto err;
 951
 952		ret = sst_dsp_dma_copyfrom(dsp, context->dma_buffer,
 953			dsp->addr.lpe_base + runtime->persistent_offset,
 954			module->persistent_size);
 955		sst_dsp_dma_put_channel(dsp);
 956		if (ret < 0) {
 957			dev_err(dsp->dev, "error: context copy failed\n");
 958			goto err;
 959		}
 960	} else
 961		sst_memcpy32(context->buffer, dsp->addr.lpe +
 962			runtime->persistent_offset,
 963			module->persistent_size);
 964
 965err:
 966	mutex_unlock(&dsp->mutex);
 967	return ret;
 968}
 969EXPORT_SYMBOL_GPL(sst_module_runtime_save);
 970
 971int sst_module_runtime_restore(struct sst_module_runtime *runtime,
 972	struct sst_module_runtime_context *context)
 973{
 974	struct sst_dsp *dsp = runtime->dsp;
 975	struct sst_module *module = runtime->module;
 976	int ret = 0;
 977
 978	dev_dbg(dsp->dev, "restoring runtime %d memory at 0x%x size 0x%x\n",
 979		runtime->id, runtime->persistent_offset,
 980		module->persistent_size);
 981
 982	mutex_lock(&dsp->mutex);
 983
 984	if (!context->buffer) {
 985		dev_info(dsp->dev, "no context buffer need to restore!\n");
 986		goto err;
 987	}
 988
 989	if (dsp->fw_use_dma) {
 990
 991		ret = sst_dsp_dma_get_channel(dsp, 0);
 992		if (ret < 0)
 993			goto err;
 994
 995		ret = sst_dsp_dma_copyto(dsp,
 996			dsp->addr.lpe_base + runtime->persistent_offset,
 997			context->dma_buffer, module->persistent_size);
 998		sst_dsp_dma_put_channel(dsp);
 999		if (ret < 0) {
1000			dev_err(dsp->dev, "error: module copy failed\n");
1001			goto err;
1002		}
1003	} else
1004		sst_memcpy32(dsp->addr.lpe + runtime->persistent_offset,
1005			context->buffer, module->persistent_size);
1006
1007	dma_free_coherent(dsp->dma_dev, module->persistent_size,
1008				context->buffer, context->dma_buffer);
1009	context->buffer = NULL;
1010
1011err:
1012	mutex_unlock(&dsp->mutex);
1013	return ret;
1014}
1015EXPORT_SYMBOL_GPL(sst_module_runtime_restore);
1016
1017/* register a DSP memory block for use with FW based modules */
1018struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset,
1019	u32 size, enum sst_mem_type type, const struct sst_block_ops *ops,
1020	u32 index, void *private)
1021{
1022	struct sst_mem_block *block;
1023
1024	block = kzalloc(sizeof(*block), GFP_KERNEL);
1025	if (block == NULL)
1026		return NULL;
1027
1028	block->offset = offset;
1029	block->size = size;
1030	block->index = index;
1031	block->type = type;
1032	block->dsp = dsp;
1033	block->private = private;
1034	block->ops = ops;
1035
1036	mutex_lock(&dsp->mutex);
1037	list_add(&block->list, &dsp->free_block_list);
1038	mutex_unlock(&dsp->mutex);
1039
1040	return block;
1041}
1042EXPORT_SYMBOL_GPL(sst_mem_block_register);
1043
1044/* unregister all DSP memory blocks */
1045void sst_mem_block_unregister_all(struct sst_dsp *dsp)
1046{
1047	struct sst_mem_block *block, *tmp;
1048
1049	mutex_lock(&dsp->mutex);
1050
1051	/* unregister used blocks */
1052	list_for_each_entry_safe(block, tmp, &dsp->used_block_list, list) {
1053		list_del(&block->list);
1054		kfree(block);
1055	}
1056
1057	/* unregister free blocks */
1058	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
1059		list_del(&block->list);
1060		kfree(block);
1061	}
1062
1063	mutex_unlock(&dsp->mutex);
1064}
1065EXPORT_SYMBOL_GPL(sst_mem_block_unregister_all);
1066
1067/* allocate scratch buffer blocks */
1068int sst_block_alloc_scratch(struct sst_dsp *dsp)
1069{
1070	struct sst_module *module;
1071	struct sst_block_allocator ba;
1072	int ret;
1073
1074	mutex_lock(&dsp->mutex);
1075
1076	/* calculate required scratch size */
1077	dsp->scratch_size = 0;
1078	list_for_each_entry(module, &dsp->module_list, list) {
1079		dev_dbg(dsp->dev, "module %d scratch req 0x%x bytes\n",
1080			module->id, module->scratch_size);
1081		if (dsp->scratch_size < module->scratch_size)
1082			dsp->scratch_size = module->scratch_size;
1083	}
1084
1085	dev_dbg(dsp->dev, "scratch buffer required is 0x%x bytes\n",
1086		dsp->scratch_size);
1087
1088	if (dsp->scratch_size == 0) {
1089		dev_info(dsp->dev, "no modules need scratch buffer\n");
1090		mutex_unlock(&dsp->mutex);
1091		return 0;
1092	}
1093
1094	/* allocate blocks for module scratch buffers */
1095	dev_dbg(dsp->dev, "allocating scratch blocks\n");
1096
1097	ba.size = dsp->scratch_size;
1098	ba.type = SST_MEM_DRAM;
1099
1100	/* do we need to allocate at fixed offset */
1101	if (dsp->scratch_offset != 0) {
1102
1103		dev_dbg(dsp->dev, "block request 0x%x bytes type %d at 0x%x\n",
1104			ba.size, ba.type, ba.offset);
1105
1106		ba.offset = dsp->scratch_offset;
1107
1108		/* alloc blocks that includes this section */
1109		ret = block_alloc_fixed(dsp, &ba, &dsp->scratch_block_list);
1110
1111	} else {
1112		dev_dbg(dsp->dev, "block request 0x%x bytes type %d\n",
1113			ba.size, ba.type);
1114
1115		ba.offset = 0;
1116		ret = block_alloc(dsp, &ba, &dsp->scratch_block_list);
1117	}
1118	if (ret < 0) {
1119		dev_err(dsp->dev, "error: can't alloc scratch blocks\n");
1120		mutex_unlock(&dsp->mutex);
1121		return ret;
1122	}
1123
1124	ret = block_list_prepare(dsp, &dsp->scratch_block_list);
1125	if (ret < 0) {
1126		dev_err(dsp->dev, "error: scratch block prepare failed\n");
1127		mutex_unlock(&dsp->mutex);
1128		return ret;
1129	}
1130
1131	/* assign the same offset of scratch to each module */
1132	dsp->scratch_offset = ba.offset;
1133	mutex_unlock(&dsp->mutex);
1134	return dsp->scratch_size;
1135}
1136EXPORT_SYMBOL_GPL(sst_block_alloc_scratch);
1137
1138/* free all scratch blocks */
1139void sst_block_free_scratch(struct sst_dsp *dsp)
1140{
1141	mutex_lock(&dsp->mutex);
1142	block_list_remove(dsp, &dsp->scratch_block_list);
1143	mutex_unlock(&dsp->mutex);
1144}
1145EXPORT_SYMBOL_GPL(sst_block_free_scratch);
1146
1147/* get a module from it's unique ID */
1148struct sst_module *sst_module_get_from_id(struct sst_dsp *dsp, u32 id)
1149{
1150	struct sst_module *module;
1151
1152	mutex_lock(&dsp->mutex);
1153
1154	list_for_each_entry(module, &dsp->module_list, list) {
1155		if (module->id == id) {
1156			mutex_unlock(&dsp->mutex);
1157			return module;
1158		}
1159	}
1160
1161	mutex_unlock(&dsp->mutex);
1162	return NULL;
1163}
1164EXPORT_SYMBOL_GPL(sst_module_get_from_id);
1165
1166struct sst_module_runtime *sst_module_runtime_get_from_id(
1167	struct sst_module *module, u32 id)
1168{
1169	struct sst_module_runtime *runtime;
1170	struct sst_dsp *dsp = module->dsp;
1171
1172	mutex_lock(&dsp->mutex);
1173
1174	list_for_each_entry(runtime, &module->runtime_list, list) {
1175		if (runtime->id == id) {
1176			mutex_unlock(&dsp->mutex);
1177			return runtime;
1178		}
1179	}
1180
1181	mutex_unlock(&dsp->mutex);
1182	return NULL;
1183}
1184EXPORT_SYMBOL_GPL(sst_module_runtime_get_from_id);
1185
1186/* returns block address in DSP address space */
1187u32 sst_dsp_get_offset(struct sst_dsp *dsp, u32 offset,
1188	enum sst_mem_type type)
1189{
1190	switch (type) {
1191	case SST_MEM_IRAM:
1192		return offset - dsp->addr.iram_offset +
1193			dsp->addr.dsp_iram_offset;
1194	case SST_MEM_DRAM:
1195		return offset - dsp->addr.dram_offset +
1196			dsp->addr.dsp_dram_offset;
1197	default:
1198		return 0;
1199	}
1200}
1201EXPORT_SYMBOL_GPL(sst_dsp_get_offset);
1202
1203struct sst_dsp *sst_dsp_new(struct device *dev,
1204	struct sst_dsp_device *sst_dev, struct sst_pdata *pdata)
1205{
1206	struct sst_dsp *sst;
1207	int err;
1208
1209	dev_dbg(dev, "initialising audio DSP id 0x%x\n", pdata->id);
1210
1211	sst = devm_kzalloc(dev, sizeof(*sst), GFP_KERNEL);
1212	if (sst == NULL)
1213		return NULL;
1214
1215	spin_lock_init(&sst->spinlock);
1216	mutex_init(&sst->mutex);
1217	sst->dev = dev;
1218	sst->dma_dev = pdata->dma_dev;
1219	sst->thread_context = sst_dev->thread_context;
1220	sst->sst_dev = sst_dev;
1221	sst->id = pdata->id;
1222	sst->irq = pdata->irq;
1223	sst->ops = sst_dev->ops;
1224	sst->pdata = pdata;
1225	INIT_LIST_HEAD(&sst->used_block_list);
1226	INIT_LIST_HEAD(&sst->free_block_list);
1227	INIT_LIST_HEAD(&sst->module_list);
1228	INIT_LIST_HEAD(&sst->fw_list);
1229	INIT_LIST_HEAD(&sst->scratch_block_list);
1230
1231	/* Initialise SST Audio DSP */
1232	if (sst->ops->init) {
1233		err = sst->ops->init(sst, pdata);
1234		if (err < 0)
1235			return NULL;
1236	}
1237
1238	/* Register the ISR */
1239	err = request_threaded_irq(sst->irq, sst->ops->irq_handler,
1240		sst_dev->thread, IRQF_SHARED, "AudioDSP", sst);
1241	if (err)
1242		goto irq_err;
1243
1244	err = sst_dma_new(sst);
1245	if (err)  {
1246		dev_err(dev, "sst_dma_new failed %d\n", err);
1247		goto dma_err;
1248	}
1249
1250	return sst;
1251
1252dma_err:
1253	free_irq(sst->irq, sst);
1254irq_err:
1255	if (sst->ops->free)
1256		sst->ops->free(sst);
1257
1258	return NULL;
1259}
1260EXPORT_SYMBOL_GPL(sst_dsp_new);
1261
1262void sst_dsp_free(struct sst_dsp *sst)
1263{
1264	free_irq(sst->irq, sst);
1265	if (sst->ops->free)
1266		sst->ops->free(sst);
1267
1268	sst_dma_free(sst->dma);
1269}
1270EXPORT_SYMBOL_GPL(sst_dsp_free);
1271
1272MODULE_DESCRIPTION("Intel SST Firmware Loader");
1273MODULE_LICENSE("GPL v2");
v4.10.11
 
   1/*
   2 * Intel SST Firmware Loader
   3 *
   4 * Copyright (C) 2013, Intel Corporation. All rights reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License version
   8 * 2 as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 */
  16
  17#include <linux/kernel.h>
  18#include <linux/slab.h>
  19#include <linux/sched.h>
  20#include <linux/firmware.h>
  21#include <linux/export.h>
 
  22#include <linux/platform_device.h>
  23#include <linux/dma-mapping.h>
  24#include <linux/dmaengine.h>
  25#include <linux/pci.h>
  26#include <linux/acpi.h>
 
  27
  28/* supported DMA engine drivers */
  29#include <linux/dma/dw.h>
  30
  31#include <asm/page.h>
  32#include <asm/pgtable.h>
  33
  34#include "sst-dsp.h"
  35#include "sst-dsp-priv.h"
  36
  37#define SST_DMA_RESOURCES	2
  38#define SST_DSP_DMA_MAX_BURST	0x3
  39#define SST_HSW_BLOCK_ANY	0xffffffff
  40
  41#define SST_HSW_MASK_DMA_ADDR_DSP 0xfff00000
  42
  43struct sst_dma {
  44	struct sst_dsp *sst;
  45
  46	struct dw_dma_chip *chip;
  47
  48	struct dma_async_tx_descriptor *desc;
  49	struct dma_chan *ch;
  50};
  51
  52static inline void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
  53{
  54	u32 tmp = 0;
  55	int i, m, n;
  56	const u8 *src_byte = src;
  57
  58	m = bytes / 4;
  59	n = bytes % 4;
  60
  61	/* __iowrite32_copy use 32bit size values so divide by 4 */
  62	__iowrite32_copy((void *)dest, src, m);
  63
  64	if (n) {
  65		for (i = 0; i < n; i++)
  66			tmp |= (u32)*(src_byte + m * 4 + i) << (i * 8);
  67		__iowrite32_copy((void *)(dest + m * 4), &tmp, 1);
  68	}
  69
  70}
  71
  72static void sst_dma_transfer_complete(void *arg)
  73{
  74	struct sst_dsp *sst = (struct sst_dsp *)arg;
  75
  76	dev_dbg(sst->dev, "DMA: callback\n");
  77}
  78
  79static int sst_dsp_dma_copy(struct sst_dsp *sst, dma_addr_t dest_addr,
  80	dma_addr_t src_addr, size_t size)
  81{
  82	struct dma_async_tx_descriptor *desc;
  83	struct sst_dma *dma = sst->dma;
  84
  85	if (dma->ch == NULL) {
  86		dev_err(sst->dev, "error: no DMA channel\n");
  87		return -ENODEV;
  88	}
  89
  90	dev_dbg(sst->dev, "DMA: src: 0x%lx dest 0x%lx size %zu\n",
  91		(unsigned long)src_addr, (unsigned long)dest_addr, size);
  92
  93	desc = dma->ch->device->device_prep_dma_memcpy(dma->ch, dest_addr,
  94		src_addr, size, DMA_CTRL_ACK);
  95	if (!desc){
  96		dev_err(sst->dev, "error: dma prep memcpy failed\n");
  97		return -EINVAL;
  98	}
  99
 100	desc->callback = sst_dma_transfer_complete;
 101	desc->callback_param = sst;
 102
 103	desc->tx_submit(desc);
 104	dma_wait_for_async_tx(desc);
 105
 106	return 0;
 107}
 108
 109/* copy to DSP */
 110int sst_dsp_dma_copyto(struct sst_dsp *sst, dma_addr_t dest_addr,
 111	dma_addr_t src_addr, size_t size)
 112{
 113	return sst_dsp_dma_copy(sst, dest_addr | SST_HSW_MASK_DMA_ADDR_DSP,
 114			src_addr, size);
 115}
 116EXPORT_SYMBOL_GPL(sst_dsp_dma_copyto);
 117
 118/* copy from DSP */
 119int sst_dsp_dma_copyfrom(struct sst_dsp *sst, dma_addr_t dest_addr,
 120	dma_addr_t src_addr, size_t size)
 121{
 122	return sst_dsp_dma_copy(sst, dest_addr,
 123		src_addr | SST_HSW_MASK_DMA_ADDR_DSP, size);
 124}
 125EXPORT_SYMBOL_GPL(sst_dsp_dma_copyfrom);
 126
 127/* remove module from memory - callers hold locks */
 128static void block_list_remove(struct sst_dsp *dsp,
 129	struct list_head *block_list)
 130{
 131	struct sst_mem_block *block, *tmp;
 132	int err;
 133
 134	/* disable each block  */
 135	list_for_each_entry(block, block_list, module_list) {
 136
 137		if (block->ops && block->ops->disable) {
 138			err = block->ops->disable(block);
 139			if (err < 0)
 140				dev_err(dsp->dev,
 141					"error: cant disable block %d:%d\n",
 142					block->type, block->index);
 143		}
 144	}
 145
 146	/* mark each block as free */
 147	list_for_each_entry_safe(block, tmp, block_list, module_list) {
 148		list_del(&block->module_list);
 149		list_move(&block->list, &dsp->free_block_list);
 150		dev_dbg(dsp->dev, "block freed %d:%d at offset 0x%x\n",
 151			block->type, block->index, block->offset);
 152	}
 153}
 154
 155/* prepare the memory block to receive data from host - callers hold locks */
 156static int block_list_prepare(struct sst_dsp *dsp,
 157	struct list_head *block_list)
 158{
 159	struct sst_mem_block *block;
 160	int ret = 0;
 161
 162	/* enable each block so that's it'e ready for data */
 163	list_for_each_entry(block, block_list, module_list) {
 164
 165		if (block->ops && block->ops->enable && !block->users) {
 166			ret = block->ops->enable(block);
 167			if (ret < 0) {
 168				dev_err(dsp->dev,
 169					"error: cant disable block %d:%d\n",
 170					block->type, block->index);
 171				goto err;
 172			}
 173		}
 174	}
 175	return ret;
 176
 177err:
 178	list_for_each_entry(block, block_list, module_list) {
 179		if (block->ops && block->ops->disable)
 180			block->ops->disable(block);
 181	}
 182	return ret;
 183}
 184
 185static struct dw_dma_chip *dw_probe(struct device *dev, struct resource *mem,
 186	int irq)
 187{
 188	struct dw_dma_chip *chip;
 189	int err;
 190
 191	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
 192	if (!chip)
 193		return ERR_PTR(-ENOMEM);
 194
 195	chip->irq = irq;
 196	chip->regs = devm_ioremap_resource(dev, mem);
 197	if (IS_ERR(chip->regs))
 198		return ERR_CAST(chip->regs);
 199
 200	err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(31));
 201	if (err)
 202		return ERR_PTR(err);
 203
 204	chip->dev = dev;
 205
 206	err = dw_dma_probe(chip);
 207	if (err)
 208		return ERR_PTR(err);
 209
 210	return chip;
 211}
 212
 213static void dw_remove(struct dw_dma_chip *chip)
 214{
 215	dw_dma_remove(chip);
 216}
 217
 218static bool dma_chan_filter(struct dma_chan *chan, void *param)
 219{
 220	struct sst_dsp *dsp = (struct sst_dsp *)param;
 221
 222	return chan->device->dev == dsp->dma_dev;
 223}
 224
 225int sst_dsp_dma_get_channel(struct sst_dsp *dsp, int chan_id)
 226{
 227	struct sst_dma *dma = dsp->dma;
 228	struct dma_slave_config slave;
 229	dma_cap_mask_t mask;
 230	int ret;
 231
 232	dma_cap_zero(mask);
 233	dma_cap_set(DMA_SLAVE, mask);
 234	dma_cap_set(DMA_MEMCPY, mask);
 235
 236	dma->ch = dma_request_channel(mask, dma_chan_filter, dsp);
 237	if (dma->ch == NULL) {
 238		dev_err(dsp->dev, "error: DMA request channel failed\n");
 239		return -EIO;
 240	}
 241
 242	memset(&slave, 0, sizeof(slave));
 243	slave.direction = DMA_MEM_TO_DEV;
 244	slave.src_addr_width =
 245		slave.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 246	slave.src_maxburst = slave.dst_maxburst = SST_DSP_DMA_MAX_BURST;
 247
 248	ret = dmaengine_slave_config(dma->ch, &slave);
 249	if (ret) {
 250		dev_err(dsp->dev, "error: unable to set DMA slave config %d\n",
 251			ret);
 252		dma_release_channel(dma->ch);
 253		dma->ch = NULL;
 254	}
 255
 256	return ret;
 257}
 258EXPORT_SYMBOL_GPL(sst_dsp_dma_get_channel);
 259
 260void sst_dsp_dma_put_channel(struct sst_dsp *dsp)
 261{
 262	struct sst_dma *dma = dsp->dma;
 263
 264	if (!dma->ch)
 265		return;
 266
 267	dma_release_channel(dma->ch);
 268	dma->ch = NULL;
 269}
 270EXPORT_SYMBOL_GPL(sst_dsp_dma_put_channel);
 271
 272int sst_dma_new(struct sst_dsp *sst)
 273{
 274	struct sst_pdata *sst_pdata = sst->pdata;
 275	struct sst_dma *dma;
 276	struct resource mem;
 277	const char *dma_dev_name;
 278	int ret = 0;
 279
 280	if (sst->pdata->resindex_dma_base == -1)
 281		/* DMA is not used, return and squelsh error messages */
 282		return 0;
 283
 284	/* configure the correct platform data for whatever DMA engine
 285	* is attached to the ADSP IP. */
 286	switch (sst->pdata->dma_engine) {
 287	case SST_DMA_TYPE_DW:
 288		dma_dev_name = "dw_dmac";
 289		break;
 290	default:
 291		dev_err(sst->dev, "error: invalid DMA engine %d\n",
 292			sst->pdata->dma_engine);
 293		return -EINVAL;
 294	}
 295
 296	dma = devm_kzalloc(sst->dev, sizeof(struct sst_dma), GFP_KERNEL);
 297	if (!dma)
 298		return -ENOMEM;
 299
 300	dma->sst = sst;
 301
 302	memset(&mem, 0, sizeof(mem));
 303
 304	mem.start = sst->addr.lpe_base + sst_pdata->dma_base;
 305	mem.end   = sst->addr.lpe_base + sst_pdata->dma_base + sst_pdata->dma_size - 1;
 306	mem.flags = IORESOURCE_MEM;
 307
 308	/* now register DMA engine device */
 309	dma->chip = dw_probe(sst->dma_dev, &mem, sst_pdata->irq);
 310	if (IS_ERR(dma->chip)) {
 311		dev_err(sst->dev, "error: DMA device register failed\n");
 312		ret = PTR_ERR(dma->chip);
 313		goto err_dma_dev;
 314	}
 315
 316	sst->dma = dma;
 317	sst->fw_use_dma = true;
 318	return 0;
 319
 320err_dma_dev:
 321	devm_kfree(sst->dev, dma);
 322	return ret;
 323}
 324EXPORT_SYMBOL(sst_dma_new);
 325
 326void sst_dma_free(struct sst_dma *dma)
 327{
 328
 329	if (dma == NULL)
 330		return;
 331
 332	if (dma->ch)
 333		dma_release_channel(dma->ch);
 334
 335	if (dma->chip)
 336		dw_remove(dma->chip);
 337
 338}
 339EXPORT_SYMBOL(sst_dma_free);
 340
 341/* create new generic firmware object */
 342struct sst_fw *sst_fw_new(struct sst_dsp *dsp, 
 343	const struct firmware *fw, void *private)
 344{
 345	struct sst_fw *sst_fw;
 346	int err;
 347
 348	if (!dsp->ops->parse_fw)
 349		return NULL;
 350
 351	sst_fw = kzalloc(sizeof(*sst_fw), GFP_KERNEL);
 352	if (sst_fw == NULL)
 353		return NULL;
 354
 355	sst_fw->dsp = dsp;
 356	sst_fw->private = private;
 357	sst_fw->size = fw->size;
 358
 359	/* allocate DMA buffer to store FW data */
 360	sst_fw->dma_buf = dma_alloc_coherent(dsp->dma_dev, sst_fw->size,
 361				&sst_fw->dmable_fw_paddr, GFP_DMA | GFP_KERNEL);
 362	if (!sst_fw->dma_buf) {
 363		dev_err(dsp->dev, "error: DMA alloc failed\n");
 364		kfree(sst_fw);
 365		return NULL;
 366	}
 367
 368	/* copy FW data to DMA-able memory */
 369	memcpy((void *)sst_fw->dma_buf, (void *)fw->data, fw->size);
 370
 371	if (dsp->fw_use_dma) {
 372		err = sst_dsp_dma_get_channel(dsp, 0);
 373		if (err < 0)
 374			goto chan_err;
 375	}
 376
 377	/* call core specific FW paser to load FW data into DSP */
 378	err = dsp->ops->parse_fw(sst_fw);
 379	if (err < 0) {
 380		dev_err(dsp->dev, "error: parse fw failed %d\n", err);
 381		goto parse_err;
 382	}
 383
 384	if (dsp->fw_use_dma)
 385		sst_dsp_dma_put_channel(dsp);
 386
 387	mutex_lock(&dsp->mutex);
 388	list_add(&sst_fw->list, &dsp->fw_list);
 389	mutex_unlock(&dsp->mutex);
 390
 391	return sst_fw;
 392
 393parse_err:
 394	if (dsp->fw_use_dma)
 395		sst_dsp_dma_put_channel(dsp);
 396chan_err:
 397	dma_free_coherent(dsp->dma_dev, sst_fw->size,
 398				sst_fw->dma_buf,
 399				sst_fw->dmable_fw_paddr);
 400	sst_fw->dma_buf = NULL;
 401	kfree(sst_fw);
 402	return NULL;
 403}
 404EXPORT_SYMBOL_GPL(sst_fw_new);
 405
 406int sst_fw_reload(struct sst_fw *sst_fw)
 407{
 408	struct sst_dsp *dsp = sst_fw->dsp;
 409	int ret;
 410
 411	dev_dbg(dsp->dev, "reloading firmware\n");
 412
 413	/* call core specific FW paser to load FW data into DSP */
 414	ret = dsp->ops->parse_fw(sst_fw);
 415	if (ret < 0)
 416		dev_err(dsp->dev, "error: parse fw failed %d\n", ret);
 417
 418	return ret;
 419}
 420EXPORT_SYMBOL_GPL(sst_fw_reload);
 421
 422void sst_fw_unload(struct sst_fw *sst_fw)
 423{
 424	struct sst_dsp *dsp = sst_fw->dsp;
 425	struct sst_module *module, *mtmp;
 426	struct sst_module_runtime *runtime, *rtmp;
 427
 428	dev_dbg(dsp->dev, "unloading firmware\n");
 429
 430	mutex_lock(&dsp->mutex);
 431
 432	/* check module by module */
 433	list_for_each_entry_safe(module, mtmp, &dsp->module_list, list) {
 434		if (module->sst_fw == sst_fw) {
 435
 436			/* remove runtime modules */
 437			list_for_each_entry_safe(runtime, rtmp, &module->runtime_list, list) {
 438
 439				block_list_remove(dsp, &runtime->block_list);
 440				list_del(&runtime->list);
 441				kfree(runtime);
 442			}
 443
 444			/* now remove the module */
 445			block_list_remove(dsp, &module->block_list);
 446			list_del(&module->list);
 447			kfree(module);
 448		}
 449	}
 450
 451	/* remove all scratch blocks */
 452	block_list_remove(dsp, &dsp->scratch_block_list);
 453
 454	mutex_unlock(&dsp->mutex);
 455}
 456EXPORT_SYMBOL_GPL(sst_fw_unload);
 457
 458/* free single firmware object */
 459void sst_fw_free(struct sst_fw *sst_fw)
 460{
 461	struct sst_dsp *dsp = sst_fw->dsp;
 462
 463	mutex_lock(&dsp->mutex);
 464	list_del(&sst_fw->list);
 465	mutex_unlock(&dsp->mutex);
 466
 467	if (sst_fw->dma_buf)
 468		dma_free_coherent(dsp->dma_dev, sst_fw->size, sst_fw->dma_buf,
 469			sst_fw->dmable_fw_paddr);
 470	kfree(sst_fw);
 471}
 472EXPORT_SYMBOL_GPL(sst_fw_free);
 473
 474/* free all firmware objects */
 475void sst_fw_free_all(struct sst_dsp *dsp)
 476{
 477	struct sst_fw *sst_fw, *t;
 478
 479	mutex_lock(&dsp->mutex);
 480	list_for_each_entry_safe(sst_fw, t, &dsp->fw_list, list) {
 481
 482		list_del(&sst_fw->list);
 483		dma_free_coherent(dsp->dev, sst_fw->size, sst_fw->dma_buf,
 484			sst_fw->dmable_fw_paddr);
 485		kfree(sst_fw);
 486	}
 487	mutex_unlock(&dsp->mutex);
 488}
 489EXPORT_SYMBOL_GPL(sst_fw_free_all);
 490
 491/* create a new SST generic module from FW template */
 492struct sst_module *sst_module_new(struct sst_fw *sst_fw,
 493	struct sst_module_template *template, void *private)
 494{
 495	struct sst_dsp *dsp = sst_fw->dsp;
 496	struct sst_module *sst_module;
 497
 498	sst_module = kzalloc(sizeof(*sst_module), GFP_KERNEL);
 499	if (sst_module == NULL)
 500		return NULL;
 501
 502	sst_module->id = template->id;
 503	sst_module->dsp = dsp;
 504	sst_module->sst_fw = sst_fw;
 505	sst_module->scratch_size = template->scratch_size;
 506	sst_module->persistent_size = template->persistent_size;
 507	sst_module->entry = template->entry;
 508	sst_module->state = SST_MODULE_STATE_UNLOADED;
 509
 510	INIT_LIST_HEAD(&sst_module->block_list);
 511	INIT_LIST_HEAD(&sst_module->runtime_list);
 512
 513	mutex_lock(&dsp->mutex);
 514	list_add(&sst_module->list, &dsp->module_list);
 515	mutex_unlock(&dsp->mutex);
 516
 517	return sst_module;
 518}
 519EXPORT_SYMBOL_GPL(sst_module_new);
 520
 521/* free firmware module and remove from available list */
 522void sst_module_free(struct sst_module *sst_module)
 523{
 524	struct sst_dsp *dsp = sst_module->dsp;
 525
 526	mutex_lock(&dsp->mutex);
 527	list_del(&sst_module->list);
 528	mutex_unlock(&dsp->mutex);
 529
 530	kfree(sst_module);
 531}
 532EXPORT_SYMBOL_GPL(sst_module_free);
 533
 534struct sst_module_runtime *sst_module_runtime_new(struct sst_module *module,
 535	int id, void *private)
 536{
 537	struct sst_dsp *dsp = module->dsp;
 538	struct sst_module_runtime *runtime;
 539
 540	runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
 541	if (runtime == NULL)
 542		return NULL;
 543
 544	runtime->id = id;
 545	runtime->dsp = dsp;
 546	runtime->module = module;
 547	INIT_LIST_HEAD(&runtime->block_list);
 548
 549	mutex_lock(&dsp->mutex);
 550	list_add(&runtime->list, &module->runtime_list);
 551	mutex_unlock(&dsp->mutex);
 552
 553	return runtime;
 554}
 555EXPORT_SYMBOL_GPL(sst_module_runtime_new);
 556
 557void sst_module_runtime_free(struct sst_module_runtime *runtime)
 558{
 559	struct sst_dsp *dsp = runtime->dsp;
 560
 561	mutex_lock(&dsp->mutex);
 562	list_del(&runtime->list);
 563	mutex_unlock(&dsp->mutex);
 564
 565	kfree(runtime);
 566}
 567EXPORT_SYMBOL_GPL(sst_module_runtime_free);
 568
 569static struct sst_mem_block *find_block(struct sst_dsp *dsp,
 570	struct sst_block_allocator *ba)
 571{
 572	struct sst_mem_block *block;
 573
 574	list_for_each_entry(block, &dsp->free_block_list, list) {
 575		if (block->type == ba->type && block->offset == ba->offset)
 576			return block;
 577	}
 578
 579	return NULL;
 580}
 581
 582/* Block allocator must be on block boundary */
 583static int block_alloc_contiguous(struct sst_dsp *dsp,
 584	struct sst_block_allocator *ba, struct list_head *block_list)
 585{
 586	struct list_head tmp = LIST_HEAD_INIT(tmp);
 587	struct sst_mem_block *block;
 588	u32 block_start = SST_HSW_BLOCK_ANY;
 589	int size = ba->size, offset = ba->offset;
 590
 591	while (ba->size > 0) {
 592
 593		block = find_block(dsp, ba);
 594		if (!block) {
 595			list_splice(&tmp, &dsp->free_block_list);
 596
 597			ba->size = size;
 598			ba->offset = offset;
 599			return -ENOMEM;
 600		}
 601
 602		list_move_tail(&block->list, &tmp);
 603		ba->offset += block->size;
 604		ba->size -= block->size;
 605	}
 606	ba->size = size;
 607	ba->offset = offset;
 608
 609	list_for_each_entry(block, &tmp, list) {
 610
 611		if (block->offset < block_start)
 612			block_start = block->offset;
 613
 614		list_add(&block->module_list, block_list);
 615
 616		dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 617			block->type, block->index, block->offset);
 618	}
 619
 620	list_splice(&tmp, &dsp->used_block_list);
 621	return 0;
 622}
 623
 624/* allocate first free DSP blocks for data - callers hold locks */
 625static int block_alloc(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 626	struct list_head *block_list)
 627{
 628	struct sst_mem_block *block, *tmp;
 629	int ret = 0;
 630
 631	if (ba->size == 0)
 632		return 0;
 633
 634	/* find first free whole blocks that can hold module */
 635	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 636
 637		/* ignore blocks with wrong type */
 638		if (block->type != ba->type)
 639			continue;
 640
 641		if (ba->size > block->size)
 642			continue;
 643
 644		ba->offset = block->offset;
 645		block->bytes_used = ba->size % block->size;
 646		list_add(&block->module_list, block_list);
 647		list_move(&block->list, &dsp->used_block_list);
 648		dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 649			block->type, block->index, block->offset);
 650		return 0;
 651	}
 652
 653	/* then find free multiple blocks that can hold module */
 654	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 655
 656		/* ignore blocks with wrong type */
 657		if (block->type != ba->type)
 658			continue;
 659
 660		/* do we span > 1 blocks */
 661		if (ba->size > block->size) {
 662
 663			/* align ba to block boundary */
 664			ba->offset = block->offset;
 665
 666			ret = block_alloc_contiguous(dsp, ba, block_list);
 667			if (ret == 0)
 668				return ret;
 669
 670		}
 671	}
 672
 673	/* not enough free block space */
 674	return -ENOMEM;
 675}
 676
 677int sst_alloc_blocks(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 678	struct list_head *block_list)
 679{
 680	int ret;
 681
 682	dev_dbg(dsp->dev, "block request 0x%x bytes at offset 0x%x type %d\n",
 683		ba->size, ba->offset, ba->type);
 684
 685	mutex_lock(&dsp->mutex);
 686
 687	ret = block_alloc(dsp, ba, block_list);
 688	if (ret < 0) {
 689		dev_err(dsp->dev, "error: can't alloc blocks %d\n", ret);
 690		goto out;
 691	}
 692
 693	/* prepare DSP blocks for module usage */
 694	ret = block_list_prepare(dsp, block_list);
 695	if (ret < 0)
 696		dev_err(dsp->dev, "error: prepare failed\n");
 697
 698out:
 699	mutex_unlock(&dsp->mutex);
 700	return ret;
 701}
 702EXPORT_SYMBOL_GPL(sst_alloc_blocks);
 703
 704int sst_free_blocks(struct sst_dsp *dsp, struct list_head *block_list)
 705{
 706	mutex_lock(&dsp->mutex);
 707	block_list_remove(dsp, block_list);
 708	mutex_unlock(&dsp->mutex);
 709	return 0;
 710}
 711EXPORT_SYMBOL_GPL(sst_free_blocks);
 712
 713/* allocate memory blocks for static module addresses - callers hold locks */
 714static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba,
 715	struct list_head *block_list)
 716{
 717	struct sst_mem_block *block, *tmp;
 718	struct sst_block_allocator ba_tmp = *ba;
 719	u32 end = ba->offset + ba->size, block_end;
 720	int err;
 721
 722	/* only IRAM/DRAM blocks are managed */
 723	if (ba->type != SST_MEM_IRAM && ba->type != SST_MEM_DRAM)
 724		return 0;
 725
 726	/* are blocks already attached to this module */
 727	list_for_each_entry_safe(block, tmp, block_list, module_list) {
 728
 729		/* ignore blocks with wrong type */
 730		if (block->type != ba->type)
 731			continue;
 732
 733		block_end = block->offset + block->size;
 734
 735		/* find block that holds section */
 736		if (ba->offset >= block->offset && end <= block_end)
 737			return 0;
 738
 739		/* does block span more than 1 section */
 740		if (ba->offset >= block->offset && ba->offset < block_end) {
 741
 742			/* align ba to block boundary */
 743			ba_tmp.size -= block_end - ba->offset;
 744			ba_tmp.offset = block_end;
 745			err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
 746			if (err < 0)
 747				return -ENOMEM;
 748
 749			/* module already owns blocks */
 750			return 0;
 751		}
 752	}
 753
 754	/* find first free blocks that can hold section in free list */
 755	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
 756		block_end = block->offset + block->size;
 757
 758		/* ignore blocks with wrong type */
 759		if (block->type != ba->type)
 760			continue;
 761
 762		/* find block that holds section */
 763		if (ba->offset >= block->offset && end <= block_end) {
 764
 765			/* add block */
 766			list_move(&block->list, &dsp->used_block_list);
 767			list_add(&block->module_list, block_list);
 768			dev_dbg(dsp->dev, "block allocated %d:%d at offset 0x%x\n",
 769				block->type, block->index, block->offset);
 770			return 0;
 771		}
 772
 773		/* does block span more than 1 section */
 774		if (ba->offset >= block->offset && ba->offset < block_end) {
 775
 776			/* add block */
 777			list_move(&block->list, &dsp->used_block_list);
 778			list_add(&block->module_list, block_list);
 779			/* align ba to block boundary */
 780			ba_tmp.size -= block_end - ba->offset;
 781			ba_tmp.offset = block_end;
 782
 783			err = block_alloc_contiguous(dsp, &ba_tmp, block_list);
 784			if (err < 0)
 785				return -ENOMEM;
 786
 787			return 0;
 788		}
 789	}
 790
 791	return -ENOMEM;
 792}
 793
 794/* Load fixed module data into DSP memory blocks */
 795int sst_module_alloc_blocks(struct sst_module *module)
 796{
 797	struct sst_dsp *dsp = module->dsp;
 798	struct sst_fw *sst_fw = module->sst_fw;
 799	struct sst_block_allocator ba;
 800	int ret;
 801
 802	memset(&ba, 0, sizeof(ba));
 803	ba.size = module->size;
 804	ba.type = module->type;
 805	ba.offset = module->offset;
 806
 807	dev_dbg(dsp->dev, "block request 0x%x bytes at offset 0x%x type %d\n",
 808		ba.size, ba.offset, ba.type);
 809
 810	mutex_lock(&dsp->mutex);
 811
 812	/* alloc blocks that includes this section */
 813	ret = block_alloc_fixed(dsp, &ba, &module->block_list);
 814	if (ret < 0) {
 815		dev_err(dsp->dev,
 816			"error: no free blocks for section at offset 0x%x size 0x%x\n",
 817			module->offset, module->size);
 818		mutex_unlock(&dsp->mutex);
 819		return -ENOMEM;
 820	}
 821
 822	/* prepare DSP blocks for module copy */
 823	ret = block_list_prepare(dsp, &module->block_list);
 824	if (ret < 0) {
 825		dev_err(dsp->dev, "error: fw module prepare failed\n");
 826		goto err;
 827	}
 828
 829	/* copy partial module data to blocks */
 830	if (dsp->fw_use_dma) {
 831		ret = sst_dsp_dma_copyto(dsp,
 832			dsp->addr.lpe_base + module->offset,
 833			sst_fw->dmable_fw_paddr + module->data_offset,
 834			module->size);
 835		if (ret < 0) {
 836			dev_err(dsp->dev, "error: module copy failed\n");
 837			goto err;
 838		}
 839	} else
 840		sst_memcpy32(dsp->addr.lpe + module->offset, module->data,
 841			module->size);
 842
 843	mutex_unlock(&dsp->mutex);
 844	return ret;
 845
 846err:
 847	block_list_remove(dsp, &module->block_list);
 848	mutex_unlock(&dsp->mutex);
 849	return ret;
 850}
 851EXPORT_SYMBOL_GPL(sst_module_alloc_blocks);
 852
 853/* Unload entire module from DSP memory */
 854int sst_module_free_blocks(struct sst_module *module)
 855{
 856	struct sst_dsp *dsp = module->dsp;
 857
 858	mutex_lock(&dsp->mutex);
 859	block_list_remove(dsp, &module->block_list);
 860	mutex_unlock(&dsp->mutex);
 861	return 0;
 862}
 863EXPORT_SYMBOL_GPL(sst_module_free_blocks);
 864
 865int sst_module_runtime_alloc_blocks(struct sst_module_runtime *runtime,
 866	int offset)
 867{
 868	struct sst_dsp *dsp = runtime->dsp;
 869	struct sst_module *module = runtime->module;
 870	struct sst_block_allocator ba;
 871	int ret;
 872
 873	if (module->persistent_size == 0)
 874		return 0;
 875
 876	memset(&ba, 0, sizeof(ba));
 877	ba.size = module->persistent_size;
 878	ba.type = SST_MEM_DRAM;
 879
 880	mutex_lock(&dsp->mutex);
 881
 882	/* do we need to allocate at a fixed address ? */
 883	if (offset != 0) {
 884
 885		ba.offset = offset;
 886
 887		dev_dbg(dsp->dev, "persistent fixed block request 0x%x bytes type %d offset 0x%x\n",
 888			ba.size, ba.type, ba.offset);
 889
 890		/* alloc blocks that includes this section */
 891		ret = block_alloc_fixed(dsp, &ba, &runtime->block_list);
 892
 893	} else {
 894		dev_dbg(dsp->dev, "persistent block request 0x%x bytes type %d\n",
 895			ba.size, ba.type);
 896
 897		/* alloc blocks that includes this section */
 898		ret = block_alloc(dsp, &ba, &runtime->block_list);
 899	}
 900	if (ret < 0) {
 901		dev_err(dsp->dev,
 902		"error: no free blocks for runtime module size 0x%x\n",
 903			module->persistent_size);
 904		mutex_unlock(&dsp->mutex);
 905		return -ENOMEM;
 906	}
 907	runtime->persistent_offset = ba.offset;
 908
 909	/* prepare DSP blocks for module copy */
 910	ret = block_list_prepare(dsp, &runtime->block_list);
 911	if (ret < 0) {
 912		dev_err(dsp->dev, "error: runtime block prepare failed\n");
 913		goto err;
 914	}
 915
 916	mutex_unlock(&dsp->mutex);
 917	return ret;
 918
 919err:
 920	block_list_remove(dsp, &module->block_list);
 921	mutex_unlock(&dsp->mutex);
 922	return ret;
 923}
 924EXPORT_SYMBOL_GPL(sst_module_runtime_alloc_blocks);
 925
 926int sst_module_runtime_free_blocks(struct sst_module_runtime *runtime)
 927{
 928	struct sst_dsp *dsp = runtime->dsp;
 929
 930	mutex_lock(&dsp->mutex);
 931	block_list_remove(dsp, &runtime->block_list);
 932	mutex_unlock(&dsp->mutex);
 933	return 0;
 934}
 935EXPORT_SYMBOL_GPL(sst_module_runtime_free_blocks);
 936
 937int sst_module_runtime_save(struct sst_module_runtime *runtime,
 938	struct sst_module_runtime_context *context)
 939{
 940	struct sst_dsp *dsp = runtime->dsp;
 941	struct sst_module *module = runtime->module;
 942	int ret = 0;
 943
 944	dev_dbg(dsp->dev, "saving runtime %d memory at 0x%x size 0x%x\n",
 945		runtime->id, runtime->persistent_offset,
 946		module->persistent_size);
 947
 948	context->buffer = dma_alloc_coherent(dsp->dma_dev,
 949		module->persistent_size,
 950		&context->dma_buffer, GFP_DMA | GFP_KERNEL);
 951	if (!context->buffer) {
 952		dev_err(dsp->dev, "error: DMA context alloc failed\n");
 953		return -ENOMEM;
 954	}
 955
 956	mutex_lock(&dsp->mutex);
 957
 958	if (dsp->fw_use_dma) {
 959
 960		ret = sst_dsp_dma_get_channel(dsp, 0);
 961		if (ret < 0)
 962			goto err;
 963
 964		ret = sst_dsp_dma_copyfrom(dsp, context->dma_buffer,
 965			dsp->addr.lpe_base + runtime->persistent_offset,
 966			module->persistent_size);
 967		sst_dsp_dma_put_channel(dsp);
 968		if (ret < 0) {
 969			dev_err(dsp->dev, "error: context copy failed\n");
 970			goto err;
 971		}
 972	} else
 973		sst_memcpy32(context->buffer, dsp->addr.lpe +
 974			runtime->persistent_offset,
 975			module->persistent_size);
 976
 977err:
 978	mutex_unlock(&dsp->mutex);
 979	return ret;
 980}
 981EXPORT_SYMBOL_GPL(sst_module_runtime_save);
 982
 983int sst_module_runtime_restore(struct sst_module_runtime *runtime,
 984	struct sst_module_runtime_context *context)
 985{
 986	struct sst_dsp *dsp = runtime->dsp;
 987	struct sst_module *module = runtime->module;
 988	int ret = 0;
 989
 990	dev_dbg(dsp->dev, "restoring runtime %d memory at 0x%x size 0x%x\n",
 991		runtime->id, runtime->persistent_offset,
 992		module->persistent_size);
 993
 994	mutex_lock(&dsp->mutex);
 995
 996	if (!context->buffer) {
 997		dev_info(dsp->dev, "no context buffer need to restore!\n");
 998		goto err;
 999	}
1000
1001	if (dsp->fw_use_dma) {
1002
1003		ret = sst_dsp_dma_get_channel(dsp, 0);
1004		if (ret < 0)
1005			goto err;
1006
1007		ret = sst_dsp_dma_copyto(dsp,
1008			dsp->addr.lpe_base + runtime->persistent_offset,
1009			context->dma_buffer, module->persistent_size);
1010		sst_dsp_dma_put_channel(dsp);
1011		if (ret < 0) {
1012			dev_err(dsp->dev, "error: module copy failed\n");
1013			goto err;
1014		}
1015	} else
1016		sst_memcpy32(dsp->addr.lpe + runtime->persistent_offset,
1017			context->buffer, module->persistent_size);
1018
1019	dma_free_coherent(dsp->dma_dev, module->persistent_size,
1020				context->buffer, context->dma_buffer);
1021	context->buffer = NULL;
1022
1023err:
1024	mutex_unlock(&dsp->mutex);
1025	return ret;
1026}
1027EXPORT_SYMBOL_GPL(sst_module_runtime_restore);
1028
1029/* register a DSP memory block for use with FW based modules */
1030struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset,
1031	u32 size, enum sst_mem_type type, const struct sst_block_ops *ops,
1032	u32 index, void *private)
1033{
1034	struct sst_mem_block *block;
1035
1036	block = kzalloc(sizeof(*block), GFP_KERNEL);
1037	if (block == NULL)
1038		return NULL;
1039
1040	block->offset = offset;
1041	block->size = size;
1042	block->index = index;
1043	block->type = type;
1044	block->dsp = dsp;
1045	block->private = private;
1046	block->ops = ops;
1047
1048	mutex_lock(&dsp->mutex);
1049	list_add(&block->list, &dsp->free_block_list);
1050	mutex_unlock(&dsp->mutex);
1051
1052	return block;
1053}
1054EXPORT_SYMBOL_GPL(sst_mem_block_register);
1055
1056/* unregister all DSP memory blocks */
1057void sst_mem_block_unregister_all(struct sst_dsp *dsp)
1058{
1059	struct sst_mem_block *block, *tmp;
1060
1061	mutex_lock(&dsp->mutex);
1062
1063	/* unregister used blocks */
1064	list_for_each_entry_safe(block, tmp, &dsp->used_block_list, list) {
1065		list_del(&block->list);
1066		kfree(block);
1067	}
1068
1069	/* unregister free blocks */
1070	list_for_each_entry_safe(block, tmp, &dsp->free_block_list, list) {
1071		list_del(&block->list);
1072		kfree(block);
1073	}
1074
1075	mutex_unlock(&dsp->mutex);
1076}
1077EXPORT_SYMBOL_GPL(sst_mem_block_unregister_all);
1078
1079/* allocate scratch buffer blocks */
1080int sst_block_alloc_scratch(struct sst_dsp *dsp)
1081{
1082	struct sst_module *module;
1083	struct sst_block_allocator ba;
1084	int ret;
1085
1086	mutex_lock(&dsp->mutex);
1087
1088	/* calculate required scratch size */
1089	dsp->scratch_size = 0;
1090	list_for_each_entry(module, &dsp->module_list, list) {
1091		dev_dbg(dsp->dev, "module %d scratch req 0x%x bytes\n",
1092			module->id, module->scratch_size);
1093		if (dsp->scratch_size < module->scratch_size)
1094			dsp->scratch_size = module->scratch_size;
1095	}
1096
1097	dev_dbg(dsp->dev, "scratch buffer required is 0x%x bytes\n",
1098		dsp->scratch_size);
1099
1100	if (dsp->scratch_size == 0) {
1101		dev_info(dsp->dev, "no modules need scratch buffer\n");
1102		mutex_unlock(&dsp->mutex);
1103		return 0;
1104	}
1105
1106	/* allocate blocks for module scratch buffers */
1107	dev_dbg(dsp->dev, "allocating scratch blocks\n");
1108
1109	ba.size = dsp->scratch_size;
1110	ba.type = SST_MEM_DRAM;
1111
1112	/* do we need to allocate at fixed offset */
1113	if (dsp->scratch_offset != 0) {
1114
1115		dev_dbg(dsp->dev, "block request 0x%x bytes type %d at 0x%x\n",
1116			ba.size, ba.type, ba.offset);
1117
1118		ba.offset = dsp->scratch_offset;
1119
1120		/* alloc blocks that includes this section */
1121		ret = block_alloc_fixed(dsp, &ba, &dsp->scratch_block_list);
1122
1123	} else {
1124		dev_dbg(dsp->dev, "block request 0x%x bytes type %d\n",
1125			ba.size, ba.type);
1126
1127		ba.offset = 0;
1128		ret = block_alloc(dsp, &ba, &dsp->scratch_block_list);
1129	}
1130	if (ret < 0) {
1131		dev_err(dsp->dev, "error: can't alloc scratch blocks\n");
1132		mutex_unlock(&dsp->mutex);
1133		return ret;
1134	}
1135
1136	ret = block_list_prepare(dsp, &dsp->scratch_block_list);
1137	if (ret < 0) {
1138		dev_err(dsp->dev, "error: scratch block prepare failed\n");
1139		mutex_unlock(&dsp->mutex);
1140		return ret;
1141	}
1142
1143	/* assign the same offset of scratch to each module */
1144	dsp->scratch_offset = ba.offset;
1145	mutex_unlock(&dsp->mutex);
1146	return dsp->scratch_size;
1147}
1148EXPORT_SYMBOL_GPL(sst_block_alloc_scratch);
1149
1150/* free all scratch blocks */
1151void sst_block_free_scratch(struct sst_dsp *dsp)
1152{
1153	mutex_lock(&dsp->mutex);
1154	block_list_remove(dsp, &dsp->scratch_block_list);
1155	mutex_unlock(&dsp->mutex);
1156}
1157EXPORT_SYMBOL_GPL(sst_block_free_scratch);
1158
1159/* get a module from it's unique ID */
1160struct sst_module *sst_module_get_from_id(struct sst_dsp *dsp, u32 id)
1161{
1162	struct sst_module *module;
1163
1164	mutex_lock(&dsp->mutex);
1165
1166	list_for_each_entry(module, &dsp->module_list, list) {
1167		if (module->id == id) {
1168			mutex_unlock(&dsp->mutex);
1169			return module;
1170		}
1171	}
1172
1173	mutex_unlock(&dsp->mutex);
1174	return NULL;
1175}
1176EXPORT_SYMBOL_GPL(sst_module_get_from_id);
1177
1178struct sst_module_runtime *sst_module_runtime_get_from_id(
1179	struct sst_module *module, u32 id)
1180{
1181	struct sst_module_runtime *runtime;
1182	struct sst_dsp *dsp = module->dsp;
1183
1184	mutex_lock(&dsp->mutex);
1185
1186	list_for_each_entry(runtime, &module->runtime_list, list) {
1187		if (runtime->id == id) {
1188			mutex_unlock(&dsp->mutex);
1189			return runtime;
1190		}
1191	}
1192
1193	mutex_unlock(&dsp->mutex);
1194	return NULL;
1195}
1196EXPORT_SYMBOL_GPL(sst_module_runtime_get_from_id);
1197
1198/* returns block address in DSP address space */
1199u32 sst_dsp_get_offset(struct sst_dsp *dsp, u32 offset,
1200	enum sst_mem_type type)
1201{
1202	switch (type) {
1203	case SST_MEM_IRAM:
1204		return offset - dsp->addr.iram_offset +
1205			dsp->addr.dsp_iram_offset;
1206	case SST_MEM_DRAM:
1207		return offset - dsp->addr.dram_offset +
1208			dsp->addr.dsp_dram_offset;
1209	default:
1210		return 0;
1211	}
1212}
1213EXPORT_SYMBOL_GPL(sst_dsp_get_offset);
1214
1215struct sst_dsp *sst_dsp_new(struct device *dev,
1216	struct sst_dsp_device *sst_dev, struct sst_pdata *pdata)
1217{
1218	struct sst_dsp *sst;
1219	int err;
1220
1221	dev_dbg(dev, "initialising audio DSP id 0x%x\n", pdata->id);
1222
1223	sst = devm_kzalloc(dev, sizeof(*sst), GFP_KERNEL);
1224	if (sst == NULL)
1225		return NULL;
1226
1227	spin_lock_init(&sst->spinlock);
1228	mutex_init(&sst->mutex);
1229	sst->dev = dev;
1230	sst->dma_dev = pdata->dma_dev;
1231	sst->thread_context = sst_dev->thread_context;
1232	sst->sst_dev = sst_dev;
1233	sst->id = pdata->id;
1234	sst->irq = pdata->irq;
1235	sst->ops = sst_dev->ops;
1236	sst->pdata = pdata;
1237	INIT_LIST_HEAD(&sst->used_block_list);
1238	INIT_LIST_HEAD(&sst->free_block_list);
1239	INIT_LIST_HEAD(&sst->module_list);
1240	INIT_LIST_HEAD(&sst->fw_list);
1241	INIT_LIST_HEAD(&sst->scratch_block_list);
1242
1243	/* Initialise SST Audio DSP */
1244	if (sst->ops->init) {
1245		err = sst->ops->init(sst, pdata);
1246		if (err < 0)
1247			return NULL;
1248	}
1249
1250	/* Register the ISR */
1251	err = request_threaded_irq(sst->irq, sst->ops->irq_handler,
1252		sst_dev->thread, IRQF_SHARED, "AudioDSP", sst);
1253	if (err)
1254		goto irq_err;
1255
1256	err = sst_dma_new(sst);
1257	if (err)
1258		dev_warn(dev, "sst_dma_new failed %d\n", err);
 
 
1259
1260	return sst;
1261
 
 
1262irq_err:
1263	if (sst->ops->free)
1264		sst->ops->free(sst);
1265
1266	return NULL;
1267}
1268EXPORT_SYMBOL_GPL(sst_dsp_new);
1269
1270void sst_dsp_free(struct sst_dsp *sst)
1271{
1272	free_irq(sst->irq, sst);
1273	if (sst->ops->free)
1274		sst->ops->free(sst);
1275
1276	sst_dma_free(sst->dma);
1277}
1278EXPORT_SYMBOL_GPL(sst_dsp_free);
1279
1280MODULE_DESCRIPTION("Intel SST Firmware Loader");
1281MODULE_LICENSE("GPL v2");