Commit Graph

2620 Commits

Author SHA1 Message Date
Keyon Jie 4c1937e50c dai: add R/W pointer check for dai copy
We should only copy when there is data, after copied the last bytes
or period, we will stop the dai and ssp, and trigger the pipeline
finish, which will notify host side the last read pointer and let
host side send trigger stop ipc.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 33d624956a mixer: add dd->last_bytes for the last bytes(< period) caculation
For the last bytes (< 1 period) copy, we need to remember this
for the size caculation at finished, here add dd->last_bytes for
this purpos.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 7a834bb2e2 mixer: add R/W pointer check for mixer_copy()
We should only copy when there is data, as we are using pulling
mode, should sink side should have free space always, we check
each source->avail and copy only some bytes when avail < period
size.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 4cbe38a52d mixer: mixer_params(): set the sink buffer params to STREAM_FORMAT_S32_LE.
As its sink won't be host/dai, it is alwasys internal component,
let's hard code it to STREAM_FORMAT_S32_LE ATM.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 240f90c54d volume: add R/W pointer check for volume_copy()
We should only copy when there is data, as we are using pulling
mode, should sink side should have free space always, we check
source->avail only and copy only some bytes when avail < period
size.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 7d0c7b6c1d volume: volume_cmd(): only stop/pause at running
We should only stop/pause it when the volume component is in
running status.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie f3aec1d744 component: status: rename COMP_STATE_STOPPED to COMP_STATE_SETUP
For component 'inactive, but ready' status, naming 'SETUP' may
be more understandable than 'STOPPED', and 'SETUP' is consistent
with ALSA.

     new()        params()       start()
none ======> init =======> setup ======> running
     <======      <=======       <======
     free()       reset()         stop()
2017-02-13 14:54:31 +00:00
Keyon Jie 002daab594 volume: volume_params(): set the sink buffer params depending on its sink
If its sink is host, we need set it to 16bit(hard coded ATM);
if its sink is dai, we need set it to 32bit SSP format;
otherwise, for internal component, we uses STREAM_FORMAT_S32_LE.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 1ff623bdf5 host: host_copy: only copy when there is data and wait until finish
We don't copy when host_avail is 0(usually stream finished), at the
same time, we need wait until the dma copy is finished before we
can start next pulling copy.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 8cbf06c96b host: cleanup host_cmd() cases
1. only pause at running stage;
2. resetting buffer pointers and local_elem for stopping, to let next
starting begin from original position;
3. adding processes for COMP_CMD_AVAIL_UPDATE.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie f0d4d7a14c host: reset pointers at new() and reset()
We need to clear those pointers at new(), and undo at reset()
those initialization what we did in set_params().

For new(), rzalloc() will help set host_data members to 0s and
NULLs.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 9e58cf39a5 host: add a completion work to notify host side
We need to wait until the last bytes/period is finished in dai,
before we can notify host side about that, otherwise, host side
will trigger stop too early, and we will miss rendering them.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 1e524a17f0 host: add R/W pointers check for playback
Here add R/W pointers check for playback, make sure the next
copy size is not bigger than the host avail bytes.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 0eeb6ca7d2 host: for the last bytes/period, send read notification later
This read pointer indicate how much we have read, we can use it
to inform host side to refill the free periods.

But as it doesn't really mean that we have rendered all of them
(there may be several periods in the pipeline buffer), and for
the last bytes/period, host side will trigger stop immediately
once it got this notification.

To avoid lost for last several periods issue, we postpone this
notification to the finish of last bytes/period copy in dai,
which will be add in the following patches.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 33fccb139d host: rename host_pos_blks to host_pos_read
We use host_pos_blks to store the latest read pointer, and
report *host_pos to host side, here rename host_pos_blks to
host_pos_read to make it understandable.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie d9d1bc98f1 host: add host_update_buffer for produce and consume
To implement host side buffer R/W pointer check, we need add
buffer update procedures at first, here we introduce host_avail
and host_free to indicate the buffer usuage status.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie db2a9154da intel-ipc: add stream operation IPC_INTEL_STR_STOP
It used IPC_INTEL_STR_PAUSE plus IPC_INTEL_STR_RESET to stop a
stream, but sometimes we application only intend to stop the
stream(e.g. speaker-test with large buffer size( > .wav file
size)), which means we only reset the buffer pointers but don't
need set params again(for reset, we need set params again).

Here add this stream operation IPC_INTEL_STR_STOP to handle
this case.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie ce36bdc47a intel-ipc: add application buffer pointer update from host side
We need the application buffer pointer(write pointer for playback)
update from the host side, to make the ALSA pcm buffer pointer
checking possible.

Here we introduce component command COMP_CMD_AVAIL_UPDATE for the
update event notification.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie b3909d4601 ipc: presentation_posn should be uint64_t type
The presentation_posn used for dai rendered bytes readback to
host side should be uint64_t type, according to the driver side
definition.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 105a6c297f host: start: don't real start for start command
We uses pull mode for running pipeline, that means, we
start each copy in pipeline_schedule_copy().

So here remove this superfluous one period copy.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 7a1d88fdef pipleline: op_sink: don't need clear the buffer for each prepare
We clear the buffer in pipeline/buffer creating stage, here we
don't clear them for each preparing.
2017-02-13 14:54:31 +00:00
Keyon Jie f2f0cc3beb dai: reset dai_pos at MMAP_PPOS command
It reset dai_pos at prepare stage before, which will
make it wrong when the prepare is called more than
one time.

Here move the reset to MMAP_POS command handling,
which should happen at stream allocating stage only.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 423e8c910e host: handle more possibility for playback spitting
We may meet src buffer bound, sink buffer bound, and
splitting may not finish at one time DMA copy, that
is, next_size < split_remaining, ...

This patch added to handle all of those cases, and
prepare for the buffer read/write pointer checking
in future.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-02-13 14:54:31 +00:00
Keyon Jie 1659269bfa volume: fix the L/R channel mixed issue
The Right channel was assigned with Left channel by mistake
in vol_s16_to_s32 and vol_s32_to_s32, here correct it.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-11 08:18:25 +00:00
Keyon Jie 87bb87af53 component: fix comp_update_buffer() when buffer full
It will treat full buffer as empty one at current
comp_update_buffer(), as w_ptr is equal to r_ptr,
this will make us missing those datas or at least
the buffer->avail/free are not correct.

Here spit comp_update_buffer() into consuming one
and producing one, for consuming, 'r_ptr == w_ptr'
update means buffer is becoming empty, and for
producing, 'w_ptr == r_ptr' means buffer is becoming
full.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-10 09:34:41 +00:00
Keyon Jie b9bd368186 volume: use rzalloc for component new
Replace rmalloc() with rzalloc() to make sure the new
allocated structs are clear to all 0s.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-10 09:34:34 +00:00
Keyon Jie 75eee17e0c dai: rename frame_size in dai_config to sample_size
The element frame_size in dai_config struct is actually
sample size for each channel, e.g. 24 for S24_4LE, so
rename it to sample_size to avoid confusion.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-03 11:37:32 +00:00
Keyon Jie 41305b3605 pipeline: change back to use normal static pipeline by default
As the normal static pipeline can work fine after the 1.33->1ms
buffer and 16->32 bits internal buffer transforming finished,
let's change back to use normal static pipeline by default.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-03 11:37:27 +00:00
Keyon Jie 6e01ff627e mixer: use int64_t intermediate variable to avoid clamping
As we have changed internal buffer to 32 bits, to
avoid clamping, we need to change accumulator to
64 bits.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-03 11:37:27 +00:00
Keyon Jie 6cc211498e volume: add 24bit<==>32bit scaler and mapping
As we are using 32 bits data in internal buffer, we need
24bit<==>32bit volume scaler for host<==>processing<==>dai
converting.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2017-01-03 11:37:27 +00:00
Keyon Jie f24dd313ea host: fix the increment offset in the callback
When the host buffer is not 1ms aligned and splitting happens,
the increment is not period size, this wrong pointer will make
pcm data missed/clipped and sound noisy.

Changing to use the actual size last dma copy consumed,
local_elem->size, to fix the issue.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-29 10:41:42 +00:00
Keyon Jie 6d608f76f5 dai: add stream_format to dai_data for codec stream
Adding stream_format to indicate the stream format that the
dai buffer is using, which will be used for volume copy
functions mapping.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-29 10:41:42 +00:00
Liam Girdwood c87617fe7c ssp: use BCLK and MCLK directly for DAI clocking
It's better to express MCLK and BCLK as freqencies rather than as ratios.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-29 10:41:31 +00:00
Liam Girdwood 8eb6743a45 mixer: make mixer more optimal and easier to vectorise
Make the mixer compute two channels per loop iteration. This allows for
easier vectorisation. The loop is also more efficient if we update or
source/sink pointers after mixing has completed.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-29 10:41:31 +00:00
Liam Girdwood dcbff09253 volume: Fix R channel and select correct conversion.
The conversion should up/down convert only if source/sink is host or dai.
Volume should be 32 bit at all other times

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-29 10:41:31 +00:00
Liam Girdwood b246c42d07 pipeline: set up static buffers using platform macros.
Use period frames instead of period size in bytes. This makes the pipeline
configuration less ambiguous and also allows for host, dai and internal frame
sizes to be defined.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-29 10:41:31 +00:00
Liam Girdwood 77bc065d6c version: improve git version for build and IPC
Improve the git version and include last commit for IPC version message.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:20:10 +00:00
Liam Girdwood cc9b2ffa21 pipeline: Add simple debug pipeline.
Add a simple static pipeline that can be used for debug

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:20:02 +00:00
Liam Girdwood 8b7e372eb3 pipeline: use 1ms tick for low latency pipeline.
Change tick from 1.3ms to 1ms to improve latency.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:56 +00:00
Liam Girdwood ae0a203d31 dw-dma: Add parenthesis around if statement logic
Make it less ambiguous.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:49 +00:00
Liam Girdwood 53a996454e panic: disable all interrupts when we panic.
Make sure any interrupt handler can run after a panic.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:43 +00:00
Liam Girdwood e413380d43 host: Add support for non continuous host buffers
Host buffers are not guaranteed to be continuous physical pages or a factor
of the DSP period size. Add support for non continuous host buffers of any
size.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:38 +00:00
Liam Girdwood 0fb95a8ed3 host: use platform DMA timeout for host DMA timeout.
This will be different for each platform so use the platform tiemout.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:34 +00:00
Liam Girdwood bf407d2a7e component: host: Add support for passing host buffer size as param
The host buffer may not be a multiple of host PHY page size, so provide
so pass this value as part of our host buffer init.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:28 +00:00
Liam Girdwood 6d21349094 dma: Add support for callback DMA reload.
Add support to immediately reload the DMA during a DMA transfer completion
callback. This allows components to respond quickly to any physical
DMA copy updates i.e. period split over two non continuous physical host
pages.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
2016-12-22 20:19:22 +00:00
Keyon Jie cff154ca87 ssp: switch dai format form PCM B mode to normal I2S mode
it is configured from host/codec side that using I2S mode, so
switch it.
2016-12-22 16:30:26 +00:00
Keyon Jie 71a85c764d volume: add 16bit<==>24bit volume copy function and mapping
add 16bit<==>24bit volume copy function and mapping, for
24 bits ssp output/input.

here also optimize all other volume copy functions.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-22 16:18:47 +00:00
Keyon Jie 6ac88d96a4 platform: switch default ssp clock to 19.2M
switch default ssp clock from 25M to 19.2M, which may help
for 24 bit format.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-22 16:18:42 +00:00
Keyon Jie d58b35c4e7 ssp: switch to use SCR for BCLK generation.
switch the BCLK generation from shim ssp clock divider to
using SSCR0.SCR, as the divider may lead to jitter.

clear and remove M/N divider part code.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-22 16:18:36 +00:00
Keyon Jie 05af7a8a8a dw-dma: fix dsp local memory mapping issue
for DMA controller, we need mask dsp local memory before
setting it to DMAC registers, otherwise, DMAC will locate
to wrong memory address.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
2016-12-09 14:15:25 +00:00