A few other guarantees that the audio framework makes, that I forgot to 
mention:

1) audio_engine_open() will only be called for an engine that is not 
already opened
2) audio_engine_start() will only be called for an engine that is open, 
but not started
3) audio_engine_stop() will only be called for an engine that is open, 
and started
4) audio_engine_count() will only be called for an open, started engine
5) audio_engine_close() will only be called for an engine that is open 
but not started

Basically, there is a state machine which one can pretty easily imagine 
makes sense from the above.  I won't offend your vision by trying to 
draw the state diagram here in ASCII art, but I _think_ its pretty much 
what you would expect given the above.

    - Garrett

Garrett D'Amore - sun microsystems wrote:
> Template Version: @(#)sac_nextcase 1.68 02/23/09 SMI
> This information is Copyright 2009 Sun Microsystems
> 1. Introduction
>     1.1. Project/Component Working Name:
>        Audio DDI Simplifications
>     1.2. Name of Document Author/Supplier:
>        Author:  Garrett D'Amore
>     1.3  Date of This Document:
>       22 December, 2009
> 4. Technical Description
>
> PROBLEM
>
> Since Boomer (PSARC 2008/318) has integrated, we've gotten quite a bit of
> experience with audio drivers.  As part of the work to move to an
> interrupt-free design (PSARC 2009/674), we found that most drivers were
> still retaining a fair bit of complexity simply to support to suspend/resume.
> Yet, since the framework had to suspend and resume the devices properly anyway
> (in order to prevent underruns) outside of the normal DDI suspend/resume
> framework for devices, this complexity seemed largely redundant.
>
>
> SOLUTION (SUMMARY)
>
> We therefore have come up with some changes to the audio DDI which will
> facilitate a number of changes, and another set of significant
> reductions in complexity for audio device drivers.  (Indeed, in our work,
> these changes allow drivers like audiots and audio810 to run completely
> without any need for synchronization primitives, and with very little in
> the way of explicit code to support suspend/resume.)
>
>
> DETAILS
>
> We propose to add the following two functions:
>
>       void audio_dev_suspend(audio_dev_t *);
>       void audio_dev_resume(audio_dev_t *);
>
> The driver shall call these during DDI_SUSPEND and DDI_RESUME handling,
> respectively.  The framework guarantees not to call any of the driver's
> entry points (either for controls or for engines) after audio_dev_suspend()
> returns, or before the driver calls audio_dev_resume().
>
> Additionally, the framework guarantees all audio engines will be be properly
> stopped during audio_dev_suspend(), and (if appropriate) restarted during
> audio_dev_resume().   (This is done using the audio_engine_t's entry points.)
>
> Furthermore, all audio controls will have their values saved and restored
> by these functions, provided that they are both readable and writable.
>
> Note that the driver must not be holding any locks while calling these
> suspend/resume functions, since they will call back into the driver.
>
> There is also a semantic requirement made of audio engines.  Specifically
> it is now assumed that an audio_engine_t will perform a full reset of the
> engine (including resetting the processing index in the buffer to zero).
> The master count returned by audio_engine_count() must _not_, however,
> be reset.  (Although it must stop incrementing between the calls to
> audio_engine_stop() and audio_engine_start(), as before.)
>
> As a consequence of these requirements, we are able to remove the exported
> audio_engine_reset() interface, as drivers no longer need to call it.  (Its
> action is performed implicitly by the framework as part of audio_dev_resume()
> processing before the engine is restarted.)
>
> Additionally, the framework makes the following additional guarantees:
>
> 1. Each engine's entry points will be serialized.  That is, no entry point
>    for an audio_engine_t will be executed by the framework when any other
>    entry point for the same audio_engine_t is active.
>
> 2. No entry point for an audio_ctrl_t on a given device (audio_dev_t)
>    will be executed while any other entry points for audio_ctrl_t's on
>    the same device are active.
>
> Ultimately, this means that if a device driver has no other need for an
> interrupt routine or asynchronous handling, and has separate state and
> registers for each of its engines (and collectively for its controls),
> the device can operate without any locks or explicit checks for suspended
> state on its hot code paths.
>
>
> AC'97 CHANGES
>
> With the above, we can also remove a lot of complexity from the AC'97 code
> which had explicit awareness and support for suspend/resume and concurrency.
>
> We therefore are removing the following two functions:
>
>       ac97_suspend()
>       ac97_resume()
>
> However, drivers which use AC'97 codecs must still perform a low-level
> reinitialization of the codec during DDI_RESUME handling.  Previously
> this was performed by ac97_resume().  Instead, we now require the drivers
> to call ac97_reset(), which already existed.
>
>
> INTERFACE TABLES
>
> audio_dev_suspend()   Cons. Private           New function
> audio_dev_resume()     "      "                "      "
> audio_engine_reset()  REMOVED                 REMOVED
> ac97_suspend()                REMOVED                 REMOVED
> ac97_resume()         REMOVED                 REMOVED
> ac97_reset()          Cons. Private           No change
> Synchronous guarantees        Cons. Private           New semantics
> audio_engine_start()  Cons. Private           New semantics
> audio_engine_stop()   Cons. Private           New semantics
>
>
> 6. Resources and Schedule
>     6.4. Steering Committee requested information
>       6.4.1. Consolidation C-team Name:
>               ON
>     6.5. ARC review type: FastTrack
>     6.6. ARC Exposure: open
>
>   

Reply via email to