mailman.alsa-project.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Sound-open-firmware

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
sound-open-firmware@alsa-project.org

March 2018

  • 20 participants
  • 144 discussions
[Sound-open-firmware] [RFC/RFT] dai: Make system stable by moving DAI buffer pointer update location
by Keyon Jie 31 Mar '18

31 Mar '18
From: Wu Zhigang <zhigang.wu(a)linux.intel.com> Move the DAI's buffer pointer update location from dai_dma_cb() to dai_copy(). This will make pipeline more stable. The xrun possibility will be lower.Even in xrun it will recover, it will not have dsp oops. DAI's buffer pointer will be updated in the pipeline copy sequence as other components did. Then the DMA will not update the buffer pointer by itself. in HOST--->VOL--->DAI pipeline, when DMA finished, it has to reschedule the pipeline to let the pointer update. this could avoid the xrun when adjust the read and write pointers by different componets. Signed-off-by: Wu Zhigang <zhigang.wu(a)linux.intel.com> Tested-by: Keyon Jie <yang.jie(a)linux.intel.com> --- Tested on APL-GPMRB kernel: sof-v4.14 commit <c33cfed51fff5eb156dcf70ba849e6ffb3008377> sof: 1.1-stable commit <949de92142aa9cdd4a31fda68f05d29212683cc1> tools: 1.1-stable commit <b799e3fa3bab7f5df70f2458bda42de167e65fb3> RFT: can someone help test it on byt also? src/audio/dai.c | 108 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index e1ea9ab..6d0c1fa 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -78,7 +78,6 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) struct comp_dev *dev = (struct comp_dev *)data; struct dai_data *dd = comp_get_drvdata(dev); struct comp_buffer *dma_buffer; - uint32_t copied_size; trace_dai("irq"); @@ -114,57 +113,6 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) return; } - if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) { - dma_buffer = list_first_item(&dev->bsource_list, - struct comp_buffer, sink_list); - - copied_size = dd->last_bytes ? dd->last_bytes : dd->period_bytes; - - /* recalc available buffer space */ - comp_update_buffer_consume(dma_buffer, copied_size); - - /* writeback buffer contents from cache */ - dcache_writeback_region(dma_buffer->r_ptr, copied_size); - - /* update host position(in bytes offset) for drivers */ - dev->position += copied_size; - if (dd->dai_pos) { - dd->dai_pos_blks += copied_size; - *dd->dai_pos = dd->dai_pos_blks + - dma_buffer->r_ptr - dma_buffer->addr; - } - - /* make sure there is availble bytes for next period */ - if (dma_buffer->avail < dd->period_bytes) { - trace_dai_error("xru"); - comp_underrun(dev, dma_buffer, copied_size, 0); - } - - } else { - dma_buffer = list_first_item(&dev->bsink_list, - struct comp_buffer, source_list); - - /* invalidate buffer contents */ - dcache_invalidate_region(dma_buffer->w_ptr, dd->period_bytes); - - /* recalc available buffer space */ - comp_update_buffer_produce(dma_buffer, dd->period_bytes); - - /* update positions */ - dev->position += dd->period_bytes; - if (dd->dai_pos) { - dd->dai_pos_blks += dd->period_bytes; - *dd->dai_pos = dd->dai_pos_blks + - dma_buffer->w_ptr - dma_buffer->addr; - } - - /* make sure there is free bytes for next period */ - if (dma_buffer->free < dd->period_bytes) { - trace_dai_error("xro"); - comp_overrun(dev, dma_buffer, dd->period_bytes, 0); - } - } - /* notify pipeline that DAI needs its buffer processed */ if (dev->state == COMP_STATE_ACTIVE) pipeline_schedule_copy(dev->pipeline, 0); @@ -607,6 +555,62 @@ static int dai_comp_trigger(struct comp_dev *dev, int cmd) /* copy and process stream data from source to sink buffers */ static int dai_copy(struct comp_dev *dev) { + struct dai_data *dd = comp_get_drvdata(dev); + struct comp_buffer *dma_buffer; + uint32_t copied_size; + + if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) { + dma_buffer = list_first_item(&dev->bsource_list, + struct comp_buffer, sink_list); + + copied_size = dd->last_bytes ? + dd->last_bytes : dd->period_bytes; + + /* recalc available buffer space */ + comp_update_buffer_consume(dma_buffer, copied_size); + + /* writeback buffer contents from cache */ + dcache_writeback_region(dma_buffer->r_ptr, copied_size); + + /* update host position(in bytes offset) for drivers */ + dev->position += copied_size; + if (dd->dai_pos) { + dd->dai_pos_blks += copied_size; + *dd->dai_pos = dd->dai_pos_blks + + dma_buffer->r_ptr - dma_buffer->addr; + } + + /* make sure there is available bytes for next period */ + if (dma_buffer->avail < dd->period_bytes) { + trace_dai_error("xru"); + comp_underrun(dev, dma_buffer, copied_size, 0); + } + + } else { + dma_buffer = list_first_item(&dev->bsink_list, + struct comp_buffer, source_list); + + /* invalidate buffer contents */ + dcache_invalidate_region(dma_buffer->w_ptr, dd->period_bytes); + + /* recalc available buffer space */ + comp_update_buffer_produce(dma_buffer, dd->period_bytes); + + /* update positions */ + dev->position += dd->period_bytes; + if (dd->dai_pos) { + dd->dai_pos_blks += dd->period_bytes; + *dd->dai_pos = dd->dai_pos_blks + + dma_buffer->w_ptr - dma_buffer->addr; + } + + /* make sure there is free bytes for next period */ + if (dma_buffer->free < dd->period_bytes) { + trace_dai_error("xro"); + comp_overrun(dev, dma_buffer, dd->period_bytes, 0); + } + } + return 0; } -- 2.14.1
3 3
0 0
[Sound-open-firmware] [PATCH] dai: handle xrun with more clear logic
by Keyon Jie 30 Mar '18

30 Mar '18
1. xrun happens. 2. trigger pipeline xrun and recover. 3. set dd->xrun in XRUN cmd from pipeline recover. 4. stop dma and reset buffer to 0s. 5. dai prepare and clear dd->xrun in prepare calling from recover. 6. start dma again in START cmd from pipeline recover. This fix APL pause/release Xrun issue in my test. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/dai.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index 2888c40..e1ea9ab 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -82,8 +82,8 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) trace_dai("irq"); - /* is stream stopped or paused and we are not handling XRUN ? */ - if (dev->state != COMP_STATE_ACTIVE && dd->xrun == 0) { + /* stop dma copy for pause/stop/xrun */ + if (dev->state != COMP_STATE_ACTIVE || dd->xrun) { /* stop the DAI */ dai_trigger(dd->dai, COMP_TRIGGER_STOP, dev->params.direction); @@ -111,9 +111,6 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next) dcache_writeback_region(dma_buffer->addr, dma_buffer->size); } - - /* inform waiters */ - wait_completed(&dd->complete); return; } @@ -456,8 +453,11 @@ static int dai_prepare(struct comp_dev *dev) } /* dma reconfig not required if XRUN handling */ - if (dd->xrun) + if (dd->xrun) { + /* after prepare, we have recovered from xrun */ + dd->xrun = 0; return ret; + } ret = dma_set_config(dd->dma, dd->chan, &dd->config); if (ret < 0) -- 2.14.1
2 1
0 0
[Sound-open-firmware] [PATCH v2] cnl: core: Add support for xcc
by Liam Girdwood 30 Mar '18

30 Mar '18
xcc has more strict rules than gcc: - Add missing sections to linker scripts - Fix compile warnings - Extend memory enabling timeout to infinite (too small delay for xcc) Signed-off-by: Tomasz Lauda <tomasz.lauda(a)linux.intel.com> # Conflicts: # src/platform/apollolake/platform.c # src/platform/cannonlake/platform.c --- rimage/manifest.c | 9 +- rimage/manifest.h | 3 + src/arch/xtensa/boot_loader.c | 11 +-- .../apollolake/include/platform/platform.h | 2 +- src/platform/apollolake/platform.c | 98 +++++++++++----------- src/platform/baytrail/platform.c | 84 ++++++++++--------- src/platform/cannonlake/boot_ldr.x.in | 7 +- src/platform/cannonlake/cannonlake.x.in | 49 +++++------ .../cannonlake/include/platform/platform.h | 2 +- src/platform/cannonlake/platform.c | 98 +++++++++++----------- src/platform/haswell/platform.c | 84 ++++++++++--------- 11 files changed, 230 insertions(+), 217 deletions(-) diff --git a/rimage/manifest.c b/rimage/manifest.c index 243c194f..f3f85600 100644 --- a/rimage/manifest.c +++ b/rimage/manifest.c @@ -211,11 +211,18 @@ static int man_get_module_manifest(struct image *image, struct module *module, section = &module->section[man_section_idx]; /* load in manifest data */ - ret = fseek(module->fd, section->sh_offset, SEEK_SET); + /* module built using xcc has preceding bytes */ + if (section->sh_size > sizeof(sof_mod)) + ret = fseek(module->fd, + section->sh_offset + XCC_MOD_OFFSET, SEEK_SET); + else + ret = fseek(module->fd, section->sh_offset, SEEK_SET); + if (ret < 0) { fprintf(stderr, "error: can't seek to section %d\n", ret); return ret; } + count = fread(&sof_mod, 1, sizeof(sof_mod), module->fd); if (count != sizeof(sof_mod)) { fprintf(stderr, "error: can't read section %d\n", -errno); diff --git a/rimage/manifest.h b/rimage/manifest.h index ca951321..8d1d3d2c 100644 --- a/rimage/manifest.h +++ b/rimage/manifest.h @@ -22,6 +22,9 @@ #define MAN_PAGE_SIZE 4096 +/* start offset for modules built using xcc */ +#define XCC_MOD_OFFSET 0x8 + /* start offset for base FW module */ #define FILE_TEXT_OFFSET 0x8000 diff --git a/src/arch/xtensa/boot_loader.c b/src/arch/xtensa/boot_loader.c index 862db458..05d6bf90 100644 --- a/src/arch/xtensa/boot_loader.c +++ b/src/arch/xtensa/boot_loader.c @@ -121,7 +121,7 @@ static void parse_manifest(void) /* power on HPSRAM */ static int32_t hp_sram_init(void) { - int delay_count = 256, timeout = 256; + int delay_count = 256; uint32_t status; shim_write(SHIM_LDOCTL, SHIM_HPMEM_POWER_ON); @@ -141,24 +141,15 @@ static int32_t hp_sram_init(void) status = io_reg_read(HSPGISTS0); while (status) { idelay(delay_count); - status = io_reg_read(HSPGISTS0); - if (timeout-- < 0) { - return -EIO; - } } /* query the power status of second part of HP memory */ /* and do as above code */ - timeout = 256; status = io_reg_read(HSPGISTS1); while (status) { idelay(delay_count); - status = io_reg_read(HSPGISTS1); - if (timeout-- < 0) { - return -EIO; - } } /* add some delay before touch power register */ diff --git a/src/platform/apollolake/include/platform/platform.h b/src/platform/apollolake/include/platform/platform.h index 86172bfa..3a2d40bc 100644 --- a/src/platform/apollolake/include/platform/platform.h +++ b/src/platform/apollolake/include/platform/platform.h @@ -125,7 +125,7 @@ struct reef; #define platform_trace_point(__x) \ sw_reg_write(SRAM_REG_FW_TRACEP, __x) -struct timer *platform_timer; +extern struct timer *platform_timer; /* * APIs declared here are defined for every platform and IPC mechanism. diff --git a/src/platform/apollolake/platform.c b/src/platform/apollolake/platform.c index 2b41028b..ce408da6 100644 --- a/src/platform/apollolake/platform.c +++ b/src/platform/apollolake/platform.c @@ -78,54 +78,56 @@ static const struct sof_ipc_window sram_window = { .type = SOF_IPC_EXT_WINDOW, }, .num_windows = NUM_APL_WINDOWS, - .window[0] = { - .type = SOF_IPC_REGION_REGS, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_SW_REG_SIZE, - .offset = 0, - }, - .window[1] = { - .type = SOF_IPC_REGION_UPBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DSPBOX_SIZE, - .offset = MAILBOX_SW_REG_SIZE, - }, - .window[2] = { - .type = SOF_IPC_REGION_DOWNBOX, - .id = 1, /* map to host window 1 */ - .flags = 0, // TODO: set later - .size = MAILBOX_HOSTBOX_SIZE, - .offset = 0, - }, - .window[3] = { - .type = SOF_IPC_REGION_DEBUG, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DEBUG_SIZE, - .offset = 0, - }, - .window[4] = { - .type = SOF_IPC_REGION_EXCEPTION, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_EXCEPTION_SIZE, - .offset = MAILBOX_EXCEPTION_OFFSET, - }, - .window[5] = { - .type = SOF_IPC_REGION_STREAM, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_STREAM_SIZE, - .offset = MAILBOX_STREAM_OFFSET, - }, - .window[6] = { - .type = SOF_IPC_REGION_TRACE, - .id = 3, /* map to host window 3 */ - .flags = 0, // TODO: set later - .size = MAILBOX_TRACE_SIZE, - .offset = 0, + .window = { + { + .type = SOF_IPC_REGION_REGS, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_SW_REG_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_UPBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DSPBOX_SIZE, + .offset = MAILBOX_SW_REG_SIZE, + }, + { + .type = SOF_IPC_REGION_DOWNBOX, + .id = 1, /* map to host window 1 */ + .flags = 0, // TODO: set later + .size = MAILBOX_HOSTBOX_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_DEBUG, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE + MAILBOX_DEBUG_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_EXCEPTION, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE, + .offset = MAILBOX_EXCEPTION_OFFSET, + }, + { + .type = SOF_IPC_REGION_STREAM, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_STREAM_SIZE, + .offset = MAILBOX_STREAM_OFFSET, + }, + { + .type = SOF_IPC_REGION_TRACE, + .id = 3, /* map to host window 3 */ + .flags = 0, // TODO: set later + .size = MAILBOX_TRACE_SIZE, + .offset = 0, + }, }, }; diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index 8fa03a75..1917054e 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -79,47 +79,49 @@ static const struct sof_ipc_window sram_window = { .type = SOF_IPC_EXT_WINDOW, }, .num_windows = NUM_BYT_WINDOWS, - .window[0] = { - .type = SOF_IPC_REGION_UPBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DSPBOX_SIZE, - .offset = MAILBOX_DSPBOX_OFFSET, - }, - .window[1] = { - .type = SOF_IPC_REGION_DOWNBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_HOSTBOX_SIZE, - .offset = MAILBOX_HOSTBOX_OFFSET, - }, - .window[2] = { - .type = SOF_IPC_REGION_DEBUG, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DEBUG_SIZE, - .offset = MAILBOX_DEBUG_OFFSET, - }, - .window[3] = { - .type = SOF_IPC_REGION_TRACE, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_TRACE_SIZE, - .offset = MAILBOX_TRACE_OFFSET, - }, - .window[4] = { - .type = SOF_IPC_REGION_STREAM, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_STREAM_SIZE, - .offset = MAILBOX_STREAM_OFFSET, - }, - .window[5] = { - .type = SOF_IPC_REGION_EXCEPTION, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_EXCEPTION_SIZE, - .offset = MAILBOX_EXCEPTION_OFFSET, + .window = { + { + .type = SOF_IPC_REGION_UPBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DSPBOX_SIZE, + .offset = MAILBOX_DSPBOX_OFFSET, + }, + { + .type = SOF_IPC_REGION_DOWNBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_HOSTBOX_SIZE, + .offset = MAILBOX_HOSTBOX_OFFSET, + }, + { + .type = SOF_IPC_REGION_DEBUG, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DEBUG_SIZE, + .offset = MAILBOX_DEBUG_OFFSET, + }, + { + .type = SOF_IPC_REGION_TRACE, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_TRACE_SIZE, + .offset = MAILBOX_TRACE_OFFSET, + }, + { + .type = SOF_IPC_REGION_STREAM, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_STREAM_SIZE, + .offset = MAILBOX_STREAM_OFFSET, + }, + { + .type = SOF_IPC_REGION_EXCEPTION, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE, + .offset = MAILBOX_EXCEPTION_OFFSET, + }, }, }; diff --git a/src/platform/cannonlake/boot_ldr.x.in b/src/platform/cannonlake/boot_ldr.x.in index a42fd897..b85bfab2 100644 --- a/src/platform/cannonlake/boot_ldr.x.in +++ b/src/platform/cannonlake/boot_ldr.x.in @@ -21,7 +21,7 @@ MEMORY org = IMR_BOOT_LDR_LIT_BASE, len = IMR_BOOT_LDR_LIT_SIZE reef_text : - org = IMR_BOOT_LDR_TEXT_BASE, + org = IMR_BOOT_LDR_TEXT_BASE, len = IMR_BOOT_LDR_TEXT_SIZE, vector_base_text : org = XCHAL_VECBASE_RESET_PADDR, @@ -81,7 +81,7 @@ MEMORY org = XCHAL_DOUBLEEXC_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE reef_data : - org = IMR_BOOT_LDR_DATA_BASE, + org = IMR_BOOT_LDR_DATA_BASE, len = IMR_BOOT_LDR_DATA_SIZE reef_bss_data : org = IMR_BOOT_LDR_BSS_BASE, @@ -148,6 +148,9 @@ SECTIONS *(.fini.literal) KEEP(*(.fini)) *(.gnu.version) + KEEP (*(.ResetVector.text)) + KEEP (*(.ResetHandler.text)) + KEEP (*(.MemoryExceptionVector.text)) _text_end = ABSOLUTE(.); _etext = .; } >reef_text :reef_text_phdr diff --git a/src/platform/cannonlake/cannonlake.x.in b/src/platform/cannonlake/cannonlake.x.in index 47acd5e0..2a52d674 100644 --- a/src/platform/cannonlake/cannonlake.x.in +++ b/src/platform/cannonlake/cannonlake.x.in @@ -21,79 +21,79 @@ MEMORY org = XCHAL_RESET_VECTOR0_PADDR + REEF_MEM_RESET_TEXT_SIZE, len = REEF_MEM_RESET_LIT_SIZE vector_memory_lit : - org = XCHAL_MEMERROR_VECTOR_PADDR + REEF_MEM_ERROR_LIT_SIZE, + org = XCHAL_MEMERROR_VECTOR_PADDR + REEF_MEM_ERROR_LIT_SIZE, len = REEF_MEM_ERROR_LIT_SIZE vector_memory_text : - org = XCHAL_MEMERROR_VECTOR_PADDR, + org = XCHAL_MEMERROR_VECTOR_PADDR, len = REEF_MEM_ERROR_TEXT_SIZE vector_base_text : - org = XCHAL_VECBASE_RESET_PADDR, + org = XCHAL_VECBASE_RESET_PADDR, len = REEF_MEM_VECBASE_LIT_SIZE vector_int2_lit : - org = XCHAL_INTLEVEL2_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL2_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int2_text : org = XCHAL_INTLEVEL2_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_int3_lit : - org = XCHAL_INTLEVEL3_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL3_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int3_text : - org = XCHAL_INTLEVEL3_VECTOR_PADDR, + org = XCHAL_INTLEVEL3_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_int4_lit : - org = XCHAL_INTLEVEL4_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL4_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int4_text : - org = XCHAL_INTLEVEL4_VECTOR_PADDR, + org = XCHAL_INTLEVEL4_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_int5_lit : - org = XCHAL_INTLEVEL5_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL5_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int5_text : - org = XCHAL_INTLEVEL5_VECTOR_PADDR, + org = XCHAL_INTLEVEL5_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_int6_lit : - org = XCHAL_INTLEVEL6_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL6_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int6_text : - org = XCHAL_INTLEVEL6_VECTOR_PADDR, + org = XCHAL_INTLEVEL6_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_int7_lit : - org = XCHAL_INTLEVEL7_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_INTLEVEL7_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_int7_text : - org = XCHAL_INTLEVEL7_VECTOR_PADDR, + org = XCHAL_INTLEVEL7_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_kernel_lit : - org = XCHAL_KERNEL_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_KERNEL_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_kernel_text : - org = XCHAL_KERNEL_VECTOR_PADDR, + org = XCHAL_KERNEL_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_user_lit : - org = XCHAL_USER_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_USER_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_user_text : - org = XCHAL_USER_VECTOR_PADDR, + org = XCHAL_USER_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE vector_double_lit : - org = XCHAL_DOUBLEEXC_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, + org = XCHAL_DOUBLEEXC_VECTOR_PADDR - REEF_MEM_VECT_LIT_SIZE, len = REEF_MEM_VECT_LIT_SIZE vector_double_text : - org = XCHAL_DOUBLEEXC_VECTOR_PADDR, + org = XCHAL_DOUBLEEXC_VECTOR_PADDR, len = REEF_MEM_VECT_TEXT_SIZE reef_text_start : - org = REEF_TEXT_START, + org = REEF_TEXT_START, len = REEF_TEXT_START_SIZE, reef_text : - org = REEF_TEXT_BASE, + org = REEF_TEXT_BASE, len = REEF_TEXT_SIZE, reef_data : - org = REEF_TEXT_BASE + REEF_TEXT_SIZE, + org = REEF_TEXT_BASE + REEF_TEXT_SIZE, len = REEF_DATA_SIZE reef_bss_data : - org = REEF_TEXT_BASE + REEF_TEXT_SIZE + REEF_DATA_SIZE, + org = REEF_TEXT_BASE + REEF_TEXT_SIZE + REEF_DATA_SIZE, len = REEF_BSS_DATA_SIZE system_heap : org = HEAP_SYSTEM_BASE, @@ -350,6 +350,7 @@ SECTIONS *(.fini.literal) KEEP(*(.fini)) *(.gnu.version) + KEEP (*(.ResetHandler.text)) _text_end = ABSOLUTE(.); _etext = .; } >reef_text :reef_text_phdr diff --git a/src/platform/cannonlake/include/platform/platform.h b/src/platform/cannonlake/include/platform/platform.h index 764ef76a..44345bc3 100644 --- a/src/platform/cannonlake/include/platform/platform.h +++ b/src/platform/cannonlake/include/platform/platform.h @@ -120,7 +120,7 @@ struct reef; #define platform_trace_point(__x) \ sw_reg_write(SRAM_REG_FW_TRACEP, __x) -struct timer *platform_timer; +extern struct timer *platform_timer; /* * APIs declared here are defined for every platform and IPC mechanism. diff --git a/src/platform/cannonlake/platform.c b/src/platform/cannonlake/platform.c index 1f1fd2fc..a0198e5b 100644 --- a/src/platform/cannonlake/platform.c +++ b/src/platform/cannonlake/platform.c @@ -80,54 +80,56 @@ static const struct sof_ipc_window sram_window = { .type = SOF_IPC_EXT_WINDOW, }, .num_windows = NUM_CNL_WINDOWS, - .window[0] = { - .type = SOF_IPC_REGION_REGS, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_SW_REG_SIZE, - .offset = 0, - }, - .window[1] = { - .type = SOF_IPC_REGION_UPBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DSPBOX_SIZE, - .offset = MAILBOX_SW_REG_SIZE, - }, - .window[2] = { - .type = SOF_IPC_REGION_DOWNBOX, - .id = 1, /* map to host window 1 */ - .flags = 0, // TODO: set later - .size = MAILBOX_HOSTBOX_SIZE, - .offset = 0, - }, - .window[3] = { - .type = SOF_IPC_REGION_DEBUG, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DEBUG_SIZE, - .offset = 0, - }, - .window[4] = { - .type = SOF_IPC_REGION_EXCEPTION, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_EXCEPTION_SIZE, - .offset = MAILBOX_EXCEPTION_OFFSET, - }, - .window[5] = { - .type = SOF_IPC_REGION_STREAM, - .id = 2, /* map to host window 2 */ - .flags = 0, // TODO: set later - .size = MAILBOX_STREAM_SIZE, - .offset = MAILBOX_STREAM_OFFSET, - }, - .window[6] = { - .type = SOF_IPC_REGION_TRACE, - .id = 3, /* map to host window 3 */ - .flags = 0, // TODO: set later - .size = MAILBOX_TRACE_SIZE, - .offset = 0, + .window = { + { + .type = SOF_IPC_REGION_REGS, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_SW_REG_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_UPBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DSPBOX_SIZE, + .offset = MAILBOX_SW_REG_SIZE, + }, + { + .type = SOF_IPC_REGION_DOWNBOX, + .id = 1, /* map to host window 1 */ + .flags = 0, // TODO: set later + .size = MAILBOX_HOSTBOX_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_DEBUG, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE + MAILBOX_DEBUG_SIZE, + .offset = 0, + }, + { + .type = SOF_IPC_REGION_EXCEPTION, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE, + .offset = MAILBOX_EXCEPTION_OFFSET, + }, + { + .type = SOF_IPC_REGION_STREAM, + .id = 2, /* map to host window 2 */ + .flags = 0, // TODO: set later + .size = MAILBOX_STREAM_SIZE, + .offset = MAILBOX_STREAM_OFFSET, + }, + { + .type = SOF_IPC_REGION_TRACE, + .id = 3, /* map to host window 3 */ + .flags = 0, // TODO: set later + .size = MAILBOX_TRACE_SIZE, + .offset = 0, + }, }, }; diff --git a/src/platform/haswell/platform.c b/src/platform/haswell/platform.c index e9270ac1..30e8e5d7 100644 --- a/src/platform/haswell/platform.c +++ b/src/platform/haswell/platform.c @@ -78,47 +78,49 @@ static const struct sof_ipc_window sram_window = { .type = SOF_IPC_EXT_WINDOW, }, .num_windows = NUM_HSW_WINDOWS, - .window[0] = { - .type = SOF_IPC_REGION_UPBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DSPBOX_SIZE, - .offset = MAILBOX_DSPBOX_OFFSET, - }, - .window[1] = { - .type = SOF_IPC_REGION_DOWNBOX, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_HOSTBOX_SIZE, - .offset = MAILBOX_HOSTBOX_OFFSET, - }, - .window[2] = { - .type = SOF_IPC_REGION_DEBUG, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_DEBUG_SIZE, - .offset = MAILBOX_DEBUG_OFFSET, - }, - .window[3] = { - .type = SOF_IPC_REGION_TRACE, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_TRACE_SIZE, - .offset = MAILBOX_TRACE_OFFSET, - }, - .window[4] = { - .type = SOF_IPC_REGION_STREAM, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_STREAM_SIZE, - .offset = MAILBOX_STREAM_OFFSET, - }, - .window[5] = { - .type = SOF_IPC_REGION_EXCEPTION, - .id = 0, /* map to host window 0 */ - .flags = 0, // TODO: set later - .size = MAILBOX_EXCEPTION_SIZE, - .offset = MAILBOX_EXCEPTION_OFFSET, + .window = { + { + .type = SOF_IPC_REGION_UPBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DSPBOX_SIZE, + .offset = MAILBOX_DSPBOX_OFFSET, + }, + { + .type = SOF_IPC_REGION_DOWNBOX, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_HOSTBOX_SIZE, + .offset = MAILBOX_HOSTBOX_OFFSET, + }, + { + .type = SOF_IPC_REGION_DEBUG, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_DEBUG_SIZE, + .offset = MAILBOX_DEBUG_OFFSET, + }, + { + .type = SOF_IPC_REGION_TRACE, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_TRACE_SIZE, + .offset = MAILBOX_TRACE_OFFSET, + }, + { + .type = SOF_IPC_REGION_STREAM, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_STREAM_SIZE, + .offset = MAILBOX_STREAM_OFFSET, + }, + { + .type = SOF_IPC_REGION_EXCEPTION, + .id = 0, /* map to host window 0 */ + .flags = 0, // TODO: set later + .size = MAILBOX_EXCEPTION_SIZE, + .offset = MAILBOX_EXCEPTION_OFFSET, + }, }, }; -- 2.14.1
2 1
0 0
[Sound-open-firmware] [PATCH] topology: bdw-rt5640: Fix BE DAI name to match legacy driver
by Liam Girdwood 30 Mar '18

30 Mar '18
Now matches legacy driver. Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- topology/reef-bdw-rt5640.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/topology/reef-bdw-rt5640.m4 b/topology/reef-bdw-rt5640.m4 index 53c9610..0a083e4 100644 --- a/topology/reef-bdw-rt5640.m4 +++ b/topology/reef-bdw-rt5640.m4 @@ -76,14 +76,14 @@ SectionGraph."pipe-bdw-rt5640" { # playback DAI is SSP0 using 2 periods # Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0 DAI_ADD(sof/pipe-dai-playback.m4, - 1, SSP, 0, Audio, + 1, SSP, 0, Codec, PIPELINE_SOURCE_1, 2, s24le, 48, 1000, 0, 0) # capture DAI is SSP0 using 2 periods # Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0 DAI_ADD(sof/pipe-dai-capture.m4, - 2, SSP, 0, Audio, + 2, SSP, 0, Codec, PIPELINE_SINK_2, 2, s24le, 48, 1000, 0, 0) -- 2.14.1
1 0
0 0
[Sound-open-firmware] [PATCH] Revert "topology: reef-apl-nocodec: use SSP4 for playback and SSP2 for both"
by Liam Girdwood 30 Mar '18

30 Mar '18
This reverts commit 0d63b75d1e74e2fcb9508fc1585db983c7fb3482. Needs multi DAI support scheduled for 1.2 Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- topology/reef-apl-nocodec.m4 | 96 ++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/topology/reef-apl-nocodec.m4 b/topology/reef-apl-nocodec.m4 index 72eff0e..78a1a4e 100644 --- a/topology/reef-apl-nocodec.m4 +++ b/topology/reef-apl-nocodec.m4 @@ -19,72 +19,82 @@ include(`dsps/bxt.m4') # # Define the pipelines # -# PCM0 ----> Volume ----> SSP4 -# PCM1 ----> Volume ----> SSP2 -# PCM2 <---- Volume <---- SSP2 +# PCM0 ----> volume ---------------+ +# |--low latency mixer ----> volume ----> SSP2 +# PCM2 ----> SRC -----> volume ----+ +# | +# Tone -----> volume ----+ +# +# PCM1 <---- Volume <---- SSP2 # -# Volume playback pipeline 1 on PCM 0 using max 2 channels of s16le. -# Schedule 48 frames per 1000us deadline on core 0 with priority 0 -# Use DMAC 0 channel 1 for PCM audio playback data -PIPELINE_PCM_DAI_ADD(sof/pipe-volume-playback.m4, - 1, 0, 2, s16le, - 48, 1000, 0, 0, 0, 1, SSP, 4, s16le, 2) - -# Volume playback pipeline 1 on PCM 0 using max 2 channels of s16le. +# Low Latency playback pipeline 1 on PCM 0 using max 2 channels of s32le. # Schedule 48 frames per 1000us deadline on core 0 with priority 0 # Use DMAC 0 channel 1 for PCM audio playback data -PIPELINE_PCM_DAI_ADD(sof/pipe-volume-playback.m4, - 2, 1, 2, s16le, - 48, 1000, 0, 0, 0, 1, SSP, 2, s16le, 2) +PIPELINE_PCM_ADD(sof/pipe-low-latency-playback.m4, + 1, 0, 2, s32le, + 48, 1000, 0, 0, 0, 1) -# Volume playback pipeline 1 on PCM 0 using max 2 channels of s16le. +# Low Latency capture pipeline 2 on PCM 0 using max 2 channels of s32le. # Schedule 48 frames per 1000us deadline on core 0 with priority 0 # Use DMAC 0 channel 2 for PCM audio capture data -PIPELINE_PCM_DAI_ADD(sof/pipe-volume-capture.m4, - 3, 1, 2, s16le, - 48, 1000, 0, 0, 0, 1, SSP, 2, s16le, 2) +PIPELINE_PCM_ADD(sof/pipe-low-latency-capture.m4, + 2, 0, 2, s32le, + 48, 1000, 0, 0, 0, 2) + +# PCM Media Playback pipeline 3 on PCM 1 using max 2 channels of s32le. +# Schedule 96 frames per 2000us deadline on core 0 with priority 1 +# Use DMAC 0 channel 3 for PCM audio playback data +PIPELINE_PCM_ADD(sof/pipe-pcm-media.m4, + 3, 1, 2, s32le, + 96, 2000, 1, 0, 0, 3) + +# Tone Playback pipeline 5 using max 2 channels of s32le. +# Schedule 192 frames per 4000us deadline on core 0 with priority 2 +PIPELINE_ADD(sof/pipe-tone.m4, + 5, 2, s32le, + 192, 4000, 2, 0) + +# Connect pipelines together +SectionGraph."pipe-apl-nocodec" { + index "0" + + lines [ + # media 0 + dapm(PIPELINE_MIXER_1, PIPELINE_SOURCE_3) + #tone + dapm(PIPELINE_MIXER_1, PIPELINE_SOURCE_5) + ] +} # # DAI configuration # - -# playback DAI is SSP4 using 2 periods -# Buffers use s16le format, with 48 frame per 1000us on core 0 with priority 0 -DAI_ADD(sof/pipe-dai-playback.m4, - 1, SSP, 4, SSP4-NoCodec, - PIPELINE_SOURCE_1, 2, s16le, - 48, 1000, 0, 0) +# SSP port 2 is our only pipeline DAI +# # playback DAI is SSP2 using 2 periods -# Buffers use s16le format, with 48 frame per 1000us on core 0 with priority 0 +# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0 DAI_ADD(sof/pipe-dai-playback.m4, - 2, SSP, 2, SSP4-NoCodec, - PIPELINE_SOURCE_2, 2, s16le, + 1, SSP, 2, NoCodec, + PIPELINE_SOURCE_1, 2, s24le, 48, 1000, 0, 0) # capture DAI is SSP2 using 2 periods -# Buffers use s16le format, with 48 frame per 1000us on core 0 with priority 0 +# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0 DAI_ADD(sof/pipe-dai-capture.m4, - 3, SSP, 2, SSP2-NoCodec, - PIPELINE_SINK_3, 2, s16le, + 2, SSP, 2, NoCodec, + PIPELINE_SINK_2, 2, s24le, 48, 1000, 0, 0) # PCM Low Latency -PCM_PLAYBACK_ADD(Port4, 1, 0, 0, PIPELINE_PCM_1) -PCM_DUPLEX_ADD(Port2, 4, 1, 1, PIPELINE_PCM_2, PIPELINE_PCM_3) +PCM_DUPLEX_ADD(Low Latency, 6, 0, 0, PIPELINE_PCM_1, PIPELINE_PCM_2) # # BE configurations - overrides config in ACPI if present # -DAI_CONFIG(SSP, 2, SSP2-NoCodec, I2S, 16, - DAI_CLOCK(mclk, 24576000, slave), - DAI_CLOCK(bclk, 1536000, slave), - DAI_CLOCK(fsync, 48000, slave), - DAI_TDM(2, 16, 3, 3)) - -DAI_CONFIG(SSP, 4, SSP4-NoCodec, I2S, 16, - DAI_CLOCK(mclk, 24576000, slave), - DAI_CLOCK(bclk, 1536000, slave), +DAI_CONFIG(SSP, 2, NoCodec, I2S, 24, + DAI_CLOCK(mclk, 19200000, slave), + DAI_CLOCK(bclk, 2400000, slave), DAI_CLOCK(fsync, 48000, slave), - DAI_TDM(2, 16, 3, 3)) + DAI_TDM(2, 25, 3, 3)) -- 2.14.1
1 0
0 0
[Sound-open-firmware] [PATCH] APL/CNL Fix: Only send position once after copy DMA trace data on APL/CNL.
by yan.wang@linux.intel.com 30 Mar '18

30 Mar '18
From: Yan Wang <yan.wang(a)linux.intel.com> Firmware side should not send position in every trace_work() is called. Signed-off-by: Yan Wang <yan.wang(a)linux.intel.com> --- Test with: Mininow max rt5651 and APL UP^2 nocodec and CNL nocodec SOF 1.1-stable: 98d3a838cb397e91d6c032cf9b39d3748102803e SOF-Tool 1.1-stable: 78ad1ccce5ac689680adc32f8136f5bf551b0f7c https://github.com/plbossart/sound/tree/topic/sof-v4.14: c33cfed51fff5eb156dcf70ba849e6ffb3008377 --- src/include/reef/dma-trace.h | 1 + src/lib/dma-trace.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/include/reef/dma-trace.h b/src/include/reef/dma-trace.h index bf6e3f3..c5982d2 100644 --- a/src/include/reef/dma-trace.h +++ b/src/include/reef/dma-trace.h @@ -56,6 +56,7 @@ struct dma_trace_data { struct dma_sg_config config; struct dma_trace_buf dmatb; struct dma_copy dc; + uint32_t old_host_offset; uint32_t host_offset; uint32_t overflow; uint32_t messages; diff --git a/src/lib/dma-trace.c b/src/lib/dma-trace.c index d9adb6d..d7ad3d2 100644 --- a/src/lib/dma-trace.c +++ b/src/lib/dma-trace.c @@ -64,7 +64,10 @@ static uint64_t trace_work(void *data, uint64_t delay) * This function will be called once every 500ms at least even * if no new trace is filled. */ - ipc_dma_trace_send_position(); + if (d->old_host_offset != d->host_offset) { + ipc_dma_trace_send_position(); + d->old_host_offset = d->host_offset; + } #endif /* any data to copy ? */ -- 2.14.3
2 1
0 0
[Sound-open-firmware] [PATCH] Fix: Don't update avail trace size when DMA copying fails.
by yan.wang@linux.intel.com 30 Mar '18

30 Mar '18
From: Yan Wang <yan.wang(a)linux.intel.com> When DMA copying fails, its returned copy size is negative error number. So it shouldn't be used to update avail variable. Signed-off-by: Yan Wang <yan.wang(a)linux.intel.com> --- Test with: Mininow max rt5651 and APL UP^2 nocodec and CNL nocodec SOF 1.1-stable: 98d3a838cb397e91d6c032cf9b39d3748102803e SOF-Tool 1.1-stable: 78ad1ccce5ac689680adc32f8136f5bf551b0f7c https://github.com/plbossart/sound/tree/topic/sof-v4.14: c33cfed51fff5eb156dcf70ba849e6ffb3008377 --- src/lib/dma-trace.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/dma-trace.c b/src/lib/dma-trace.c index 21d1a39..d9adb6d 100644 --- a/src/lib/dma-trace.c +++ b/src/lib/dma-trace.c @@ -122,10 +122,11 @@ out: spin_lock_irq(&d->lock, flags); /* disregard any old messages and dont resend them if we overflow */ - if (d->overflow) { - buffer->avail = DMA_TRACE_LOCAL_SIZE - size; - } else { - buffer->avail -= size; + if (size > 0) { + if (d->overflow) + buffer->avail = DMA_TRACE_LOCAL_SIZE - size; + else + buffer->avail -= size; } /* DMA trace copying is done, allow reschedule */ -- 2.14.3
2 1
0 0
[Sound-open-firmware] [PATCH] dw-dma: recover dma status when release
by Xiuli Pan 30 Mar '18

30 Mar '18
From: Pan Xiuli <xiuli.pan(a)linux.intel.com> Resume pause will re-start DMA, which will cause the DMA status diff from buffer COMP. Add a release function to recover the status mainily for LLI now. This patch fixes pause/resume noise issues. Tested-by: Keyon Jie <yang.jie(a)linux.intel.com> Signed-off-by: Pan Xiuli <xiuli.pan(a)linux.intel.com> --- Test with: Mininow max rt5651 SOF 1.1-stable: 98d3a838cb397e91d6c032cf9b39d3748102803e SOF-Tool 1.1-stable: 78ad1ccce5ac689680adc32f8136f5bf551b0f7c https://github.com/plbossart/sound/tree/topic/sof-v4.14: c33cfed51fff5eb156dcf70ba849e6ffb3008377 --- src/audio/dai.c | 21 ++++++++++++++++++--- src/drivers/dw-dma.c | 16 ++++++++++------ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index 79e877f..9865e02 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -558,12 +558,27 @@ static int dai_comp_trigger(struct comp_dev *dev, int cmd) switch (cmd) { case COMP_TRIGGER_START: dai_pointer_init(dev); - /* fall through */ - case COMP_TRIGGER_RELEASE: - /* only start the DAI if we are not XRUN handling */ if (dd->xrun == 0) { + /* start the DAI */ + ret = dma_start(dd->dma, dd->chan); + if (ret < 0) + return ret; + dai_trigger(dd->dai, cmd, dev->params.direction); + } else { + dd->xrun = 0; + } + /* update starting wallclock */ + platform_dai_wallclock(dev, &dd->wallclock); + break; + case COMP_TRIGGER_RELEASE: + /* only start the DAI if we are not XRUN handling */ + if (dd->xrun == 0) { + /* recover the dma status */ + ret = dma_release(dd->dma, dd->chan); + if (ret < 0) + return ret; /* start the DAI */ ret = dma_start(dd->dma, dd->chan); if (ret < 0) diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c index aac524e..a21ecc5 100644 --- a/src/drivers/dw-dma.c +++ b/src/drivers/dw-dma.c @@ -430,18 +430,22 @@ out: static int dw_dma_release(struct dma *dma, int channel) { struct dma_pdata *p = dma_get_drvdata(dma); + struct dw_lli2 *lli; uint32_t flags; spin_lock_irq(&dma->lock, flags); trace_dma("Dpr"); - if (p->chan[channel].status == COMP_STATE_PAUSED) { - dw_dma_chan_reload_lli(dma, channel); - } - - /* resume and reload DMA */ - p->chan[channel].status = COMP_STATE_ACTIVE; + /* get current lli */ +#if DW_USE_HW_LLI + lli = (struct dw_lli2 *)dw_read(dma, DW_LLP(channel)); +#else + lli = p->chan[channel].lli_current; +#endif + /* get next lli and recover the lli to head for restart */ + lli = (struct dw_lli2 *)lli->llp; + p->chan[channel].lli = lli; spin_unlock_irq(&dma->lock, flags); return 0; -- 2.7.4
3 2
0 0
[Sound-open-firmware] [PATCH] topology: test: remove 2 unsupported passthrough tplg
by Keqiao.Zhang 30 Mar '18

30 Mar '18
Signed-off-by: Keqiao.Zhang <keqiao.zhang(a)linux.intel.com> --- topology/test/tplg-build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/topology/test/tplg-build.sh b/topology/test/tplg-build.sh index 5926ee7..ff2d144 100755 --- a/topology/test/tplg-build.sh +++ b/topology/test/tplg-build.sh @@ -93,8 +93,6 @@ simple_test nocodec volume "NoCodec" s16le 2 s24le 25 24 2400000 19200000 I2S simple_test nocodec src "NoCodec" s24le 2 s24le 25 24 2400000 19200000 I2S simple_test codec passthrough "SSP2-Codec" s16le 2 s16le 20 16 1920000 19200000 I2S -simple_test codec passthrough "SSP2-Codec" s24le 2 s16le 20 16 1920000 19200000 I2S -simple_test codec passthrough "SSP2-Codec" s16le 2 s24le 25 24 2400000 19200000 I2S simple_test codec passthrough "SSP2-Codec" s24le 2 s24le 25 24 2400000 19200000 I2S simple_test codec volume "SSP2-Codec" s16le 2 s16le 20 16 1920000 19200000 I2S simple_test codec volume "SSP2-Codec" s24le 2 s24le 25 24 2400000 19200000 I2S -- 2.11.0
3 2
0 0
[Sound-open-firmware] [PATCH] topology: test: add different ssp modes of topologies for test
by Keqiao.Zhang 30 Mar '18

30 Mar '18
Signed-off-by: Keqiao.Zhang <keqiao.zhang(a)linux.intel.com> --- topology/test/tplg-build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/topology/test/tplg-build.sh b/topology/test/tplg-build.sh index 96f3f9f..5926ee7 100755 --- a/topology/test/tplg-build.sh +++ b/topology/test/tplg-build.sh @@ -104,14 +104,17 @@ simple_test codec src "SSP2-Codec" s24le 2 s24le 25 24 2400000 19200000 I2S # for APL simple_test nocodec volume "NoCodec" s16le 4 s16le 16 16 1536000 24576000 I2S +simple_test nocodec volume "NoCodec" s16le 4 s16le 16 16 1536000 24576000 DSP_A simple_test nocodec volume "NoCodec" s24le 4 s16le 16 16 1536000 24576000 I2S simple_test nocodec volume "NoCodec" s32le 4 s16le 16 16 1536000 24576000 I2S simple_test nocodec volume "NoCodec" s16le 4 s24le 32 24 3072000 24576000 I2S simple_test nocodec volume "NoCodec" s24le 4 s24le 32 24 3072000 24576000 I2S +simple_test nocodec volume "NoCodec" s24le 4 s24le 32 24 3072000 24576000 DSP_B simple_test nocodec volume "NoCodec" s32le 4 s24le 32 24 3072000 24576000 I2S simple_test nocodec volume "NoCodec" s16le 4 s32le 32 32 3072000 24576000 I2S simple_test nocodec volume "NoCodec" s24le 4 s32le 32 32 3072000 24576000 I2S simple_test nocodec volume "NoCodec" s32le 4 s32le 32 32 3072000 24576000 I2S +simple_test nocodec volume "NoCodec" s32le 4 s32le 32 32 3072000 24576000 LEFT_J simple_test codec volume "SSP4-Codec" s16le 4 s16le 16 16 1536000 24576000 I2S simple_test nocodec volume "NoCodec" s16le 5 s16le 16 16 1536000 24576000 I2S simple_test nocodec src "NoCodec" s24le 4 s24le 32 24 3072000 24576000 I2S -- 2.11.0
2 1
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • ...
  • 15
  • Older →

HyperKitty Powered by HyperKitty version 1.3.8.