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