[Sound-open-firmware] [RFC PATCH 2/6] dma: ops: introduce channel_status() op to retrieve number of channels in use

Ranjani Sridharan ranjani.sridharan at linux.intel.com
Tue Jun 5 06:23:16 CEST 2018


This patch adds a new dma op for retreiving the number of channels
in use in a given DMAC. This will be useful in providing basic
and primitive QoS while allocating DMAC for various users.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
---
 src/drivers/dw-dma.c  | 19 +++++++++++++++++++
 src/drivers/hda-dma.c | 20 ++++++++++++++++++++
 src/include/sof/dma.h |  7 +++++++
 3 files changed, 46 insertions(+)

diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c
index c064330..0ed742f 100644
--- a/src/drivers/dw-dma.c
+++ b/src/drivers/dw-dma.c
@@ -289,6 +289,24 @@ static inline void dw_update_bits(struct dma *dma, uint32_t reg, uint32_t mask,
 	io_reg_update_bits(dma_base(dma) + reg, mask, value);
 }
 
+/* get the number of DMA channels in use */
+static int dw_dma_channel_status(struct dma *dma)
+{
+	struct dma_pdata *p = dma_get_drvdata(dma);
+	int i, count = 0;
+
+	trace_dma("Dct");
+
+	for (i = 0; i < DW_MAX_CHAN; i++) {
+
+		/* find channels in use */
+		if (p->chan[i].status != COMP_STATE_INIT)
+			count++;
+	}
+
+	return count;
+}
+
 /* allocate next free DMA channel */
 static int dw_dma_channel_get(struct dma *dma, int req_chan)
 {
@@ -1177,6 +1195,7 @@ static int dw_dma_probe(struct dma *dma)
 const struct dma_ops dw_dma_ops = {
 	.channel_get	= dw_dma_channel_get,
 	.channel_put	= dw_dma_channel_put,
+	.channel_status = dw_dma_channel_status,
 	.start		= dw_dma_start,
 	.stop		= dw_dma_stop,
 	.pause		= dw_dma_pause,
diff --git a/src/drivers/hda-dma.c b/src/drivers/hda-dma.c
index 97ea0ef..0e88a35 100644
--- a/src/drivers/hda-dma.c
+++ b/src/drivers/hda-dma.c
@@ -131,6 +131,24 @@ static int hda_dma_copy(struct dma *dma, int channel, int bytes)
 	return 0;
 }
 
+/* get the number of DMA channels in use */
+static int hda_dma_channel_status(struct dma *dma)
+{
+	struct dma_pdata *p = dma_get_drvdata(dma);
+	int i, count = 0;
+
+	trace_host("Dct");
+
+	for (i = 0; i < HDA_DMA_MAX_CHANS; i++) {
+
+		/* find channels in use */
+		if (p->chan[i].status != COMP_STATE_INIT)
+			count++;
+	}
+
+	return count;
+}
+
 /* acquire the specific DMA channel */
 static int hda_dma_channel_get(struct dma *dma, int channel)
 {
@@ -406,6 +424,7 @@ static int hda_dma_probe(struct dma *dma)
 const struct dma_ops hda_host_dma_ops = {
 	.channel_get	= hda_dma_channel_get,
 	.channel_put	= hda_dma_channel_put,
+	.channel_status = hda_dma_channel_status,
 	.start		= hda_dma_start,
 	.stop		= hda_dma_stop,
 	.copy		= hda_dma_copy,
@@ -422,6 +441,7 @@ const struct dma_ops hda_host_dma_ops = {
 const struct dma_ops hda_link_dma_ops = {
 	.channel_get	= hda_dma_channel_get,
 	.channel_put	= hda_dma_channel_put,
+	.channel_status = hda_dma_channel_status,
 	.start		= hda_dma_start,
 	.stop		= hda_dma_stop,
 	.copy		= hda_dma_copy,
diff --git a/src/include/sof/dma.h b/src/include/sof/dma.h
index 80ca880..1de9efc 100644
--- a/src/include/sof/dma.h
+++ b/src/include/sof/dma.h
@@ -93,6 +93,7 @@ struct dma_ops {
 
 	int (*channel_get)(struct dma *dma, int req_channel);
 	void (*channel_put)(struct dma *dma, int channel);
+	int (*channel_status)(struct dma *dma);
 
 	int (*start)(struct dma *dma, int channel);
 	int (*stop)(struct dma *dma, int channel);
@@ -178,6 +179,12 @@ static inline void dma_channel_put(struct dma *dma, int channel)
 	dma->ops->channel_put(dma, channel);
 }
 
+/* get the number of DMA channels in use */
+static inline int dma_channel_status(struct dma *dma)
+{
+	return dma->ops->channel_status(dma);
+}
+
 static inline int dma_set_cb(struct dma *dma, int channel, int type,
 	void (*cb)(void *data, uint32_t type, struct dma_sg_elem *next), void *data)
 {
-- 
2.17.0



More information about the Sound-open-firmware mailing list