[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