[dev][intel-hda][dsp] pass dsp pipeline param to stream
Change-Id: I52605820c06dddc0b41a2e75e9ed8e878b32146f
diff --git a/system/dev/audio/intel-hda/dsp/intel-audio-dsp.cpp b/system/dev/audio/intel-hda/dsp/intel-audio-dsp.cpp
index 3add636..1f9d8a1 100644
--- a/system/dev/audio/intel-hda/dsp/intel-audio-dsp.cpp
+++ b/system/dev/audio/intel-hda/dsp/intel-audio-dsp.cpp
@@ -352,36 +352,6 @@
return 0;
}
-zx_status_t IntelAudioDsp::CreateAndStartStreams() {
- zx_status_t res = ZX_OK;
-
- // Create and publish the streams we will use.
- static struct {
- uint32_t stream_id;
- bool is_input;
- } STREAMS[] = {
- // Speakers
- {
- .stream_id = 1,
- .is_input = false,
- },
- };
-
- for (size_t i = 0; i < countof(STREAMS); ++i) {
- const auto& stream_def = STREAMS[i];
- auto stream = fbl::AdoptRef(new IntelDspStream(stream_def.stream_id, stream_def.is_input));
-
- res = ActivateStream(stream);
- if (res != ZX_OK) {
- LOG(ERROR, "Failed to activate %s stream id #%u (res %d)!",
- stream_def.is_input ? "input" : "output", stream_def.stream_id, res);
- return res;
- }
- }
-
- return ZX_OK;
-}
-
zx_status_t IntelAudioDsp::Boot() {
zx_status_t st = ZX_OK;
diff --git a/system/dev/audio/intel-hda/dsp/intel-audio-dsp.h b/system/dev/audio/intel-hda/dsp/intel-audio-dsp.h
index 546a3f5..727b802 100644
--- a/system/dev/audio/intel-hda/dsp/intel-audio-dsp.h
+++ b/system/dev/audio/intel-hda/dsp/intel-audio-dsp.h
@@ -27,6 +27,7 @@
#include "debug-logging.h"
#include "intel-dsp-ipc.h"
#include "intel-dsp-stream.h"
+#include "intel-dsp-topology.h"
namespace audio {
namespace intel_hda {
@@ -53,8 +54,8 @@
mailbox_in_.Read(data, size);
}
- zx_status_t StartPipelines();
- zx_status_t PausePipelines();
+ zx_status_t StartPipeline(const DspPipeline& pipeline);
+ zx_status_t PausePipeline(const DspPipeline& pipeline);
zx_status_t DriverBind(zx_device_t* hda_dev) __WARN_UNUSED_RESULT;
void DeviceShutdown();
diff --git a/system/dev/audio/intel-hda/dsp/intel-dsp-stream.cpp b/system/dev/audio/intel-hda/dsp/intel-dsp-stream.cpp
index 4a74620..e779ded 100644
--- a/system/dev/audio/intel-hda/dsp/intel-dsp-stream.cpp
+++ b/system/dev/audio/intel-hda/dsp/intel-dsp-stream.cpp
@@ -15,8 +15,8 @@
namespace audio {
namespace intel_hda {
-IntelDspStream::IntelDspStream(uint32_t id, bool is_input)
- : IntelHDAStreamBase(id, is_input) {
+IntelDspStream::IntelDspStream(uint32_t id, bool is_input, const DspPipeline& pipeline)
+ : IntelHDAStreamBase(id, is_input), pipeline_(pipeline) {
snprintf(log_prefix_, sizeof(log_prefix_), "IHDA DSP %cStream #%u", is_input ? 'I' : 'O', id);
}
@@ -184,7 +184,7 @@
case AUDIO_RB_CMD_START:
{
auto dsp = fbl::RefPtr<IntelAudioDsp>::Downcast(parent_codec());
- zx_status_t st = dsp->StartPipelines();
+ zx_status_t st = dsp->StartPipeline(pipeline_);
if (st != ZX_OK) {
audio_proto::RingBufStartResp resp = { };
resp.hdr = req.hdr;
@@ -248,7 +248,7 @@
case AUDIO_RB_CMD_STOP:
{
auto dsp = fbl::RefPtr<IntelAudioDsp>::Downcast(parent_codec());
- zx_status_t st = dsp->PausePipelines();
+ zx_status_t st = dsp->PausePipeline(pipeline_);
if (st != ZX_OK) {
audio_proto::RingBufStopResp resp = { };
resp.hdr = req.hdr;
diff --git a/system/dev/audio/intel-hda/dsp/intel-dsp-stream.h b/system/dev/audio/intel-hda/dsp/intel-dsp-stream.h
index e48c21b..ff4cedb 100644
--- a/system/dev/audio/intel-hda/dsp/intel-dsp-stream.h
+++ b/system/dev/audio/intel-hda/dsp/intel-dsp-stream.h
@@ -8,6 +8,7 @@
#include <intel-hda/codec-utils/stream-base.h>
+#include "intel-dsp-topology.h"
#include "debug-logging.h"
namespace audio {
@@ -17,7 +18,7 @@
class IntelDspStream : public codecs::IntelHDAStreamBase {
public:
- IntelDspStream(uint32_t id, bool is_input);
+ IntelDspStream(uint32_t id, bool is_input, const DspPipeline& pipeline);
// Overloaded
zx_status_t ProcessSetStreamFmt(const ihda_proto::SetStreamFmtResp& resp,
@@ -66,6 +67,8 @@
// Log prefix storage
char log_prefix_[LOG_PREFIX_STORAGE] = { 0 };
+ const DspPipeline pipeline_;
+
fbl::RefPtr<dispatcher::Channel> rb_channel_ __TA_GUARDED(obj_lock());
fbl::RefPtr<dispatcher::Channel> client_rb_channel_ __TA_GUARDED(obj_lock());
};
diff --git a/system/dev/audio/intel-hda/dsp/intel-dsp-topology.cpp b/system/dev/audio/intel-hda/dsp/intel-dsp-topology.cpp
index 32726cc..004818f 100644
--- a/system/dev/audio/intel-hda/dsp/intel-dsp-topology.cpp
+++ b/system/dev/audio/intel-hda/dsp/intel-dsp-topology.cpp
@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "intel-audio-dsp.h"
-#include <pretty/hexdump.h>
+#include "intel-dsp-topology.h"
namespace audio {
namespace intel_hda {
@@ -493,32 +493,70 @@
return ZX_OK;
}
-zx_status_t IntelAudioDsp::StartPipelines() {
- zx_status_t st = RunPipeline(PIPELINE1_ID);
+zx_status_t IntelAudioDsp::StartPipeline(const DspPipeline& pipeline) {
+ // Sink first and then source
+ zx_status_t st = RunPipeline(pipeline.pl_sink);
if (st != ZX_OK) {
return st;
}
- return RunPipeline(PIPELINE0_ID);
+ return RunPipeline(pipeline.pl_source);
// TODO Error recovery
}
-zx_status_t IntelAudioDsp::PausePipelines() {
- zx_status_t st = ipc_.SetPipelineState(PIPELINE0_ID, PipelineState::PAUSED, true);
+zx_status_t IntelAudioDsp::PausePipeline(const DspPipeline& pipeline) {
+ zx_status_t st = ipc_.SetPipelineState(pipeline.pl_source, PipelineState::PAUSED, true);
if (st != ZX_OK) {
return st;
}
- st = ipc_.SetPipelineState(PIPELINE1_ID, PipelineState::PAUSED, true);
+ st = ipc_.SetPipelineState(pipeline.pl_sink, PipelineState::PAUSED, true);
if (st != ZX_OK) {
return st;
}
// Reset DSP DMA
- st = ipc_.SetPipelineState(PIPELINE0_ID, PipelineState::RESET, true);
+ st = ipc_.SetPipelineState(pipeline.pl_source, PipelineState::RESET, true);
if (st != ZX_OK) {
return st;
}
- return ipc_.SetPipelineState(PIPELINE1_ID, PipelineState::RESET, true);
+ return ipc_.SetPipelineState(pipeline.pl_sink, PipelineState::RESET, true);
// TODO Error recovery
}
+zx_status_t IntelAudioDsp::CreateAndStartStreams() {
+ zx_status_t res = ZX_OK;
+
+ // Create and publish the streams we will use.
+ static struct {
+ uint32_t stream_id;
+ bool is_input;
+ struct DspPipeline pipeline;
+ } STREAMS[] = {
+ // Speakers
+ {
+ .stream_id = 1,
+ .is_input = false,
+ .pipeline = {
+ .pl_source = PIPELINE0_ID,
+ .pl_sink = PIPELINE1_ID,
+ },
+ },
+ };
+
+ for (const auto& stream_def : STREAMS) {
+ auto stream = fbl::AdoptRef(new IntelDspStream(stream_def.stream_id,
+ stream_def.is_input,
+ stream_def.pipeline));
+
+ res = ActivateStream(stream);
+ if (res != ZX_OK) {
+ LOG(ERROR, "Failed to activate %s stream id #%u (res %d)!",
+ stream_def.is_input ? "input" : "output", stream_def.stream_id, res);
+ return res;
+ }
+ }
+
+ return ZX_OK;
+}
+
+
} // namespace intel_hda
} // namespace audio
diff --git a/system/dev/audio/intel-hda/dsp/intel-dsp-topology.h b/system/dev/audio/intel-hda/dsp/intel-dsp-topology.h
new file mode 100644
index 0000000..0e3c84f
--- /dev/null
+++ b/system/dev/audio/intel-hda/dsp/intel-dsp-topology.h
@@ -0,0 +1,17 @@
+// Copyright 2018 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#pragma once
+
+namespace audio {
+namespace intel_hda {
+
+// Represents a pipeline backing an audio stream.
+struct DspPipeline {
+ uint8_t pl_source;
+ uint8_t pl_sink;
+};
+
+} // namespace intel_hda
+} // namespace audio