Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-08-06 Thread Bjorn Andersson
On Wed 18 Jul 19:36 PDT 2018, David Dai wrote:
> diff --git a/drivers/interconnect/qcom/sdm845.c 
> b/drivers/interconnect/qcom/sdm845.c
[..]
> +DEFINE_QNODE(ipa_core_master, MASTER_IPA_CORE, 1, 8, 1, SLAVE_IPA_CORE);
[..]
> +DEFINE_QNODE(ipa_core_slave, SLAVE_IPA_CORE, 1, 8, 0);

As discussed before; while the two sides of IPA_CORE are controlled
through the "bus mechanism", they do represent the clock of the IPA
block.

I think it would make sense to make this interconnect provider also
register a clock provider and expose this as a clock, for the IPA driver
to consume.

Regards,
Bjorn


Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-08-06 Thread Bjorn Andersson
On Wed 18 Jul 19:36 PDT 2018, David Dai wrote:
> diff --git a/drivers/interconnect/qcom/sdm845.c 
> b/drivers/interconnect/qcom/sdm845.c
[..]
> +DEFINE_QNODE(ipa_core_master, MASTER_IPA_CORE, 1, 8, 1, SLAVE_IPA_CORE);
[..]
> +DEFINE_QNODE(ipa_core_slave, SLAVE_IPA_CORE, 1, 8, 0);

As discussed before; while the two sides of IPA_CORE are controlled
through the "bus mechanism", they do represent the clock of the IPA
block.

I think it would make sense to make this interconnect provider also
register a clock provider and expose this as a clock, for the IPA driver
to consume.

Regards,
Bjorn


Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-07-31 Thread David Dai

Hi Evan,

Thanks for taking the time to review and feedback!


On 7/27/2018 2:12 PM, Evan Green wrote:

Hi David,

On Thu, Jul 26, 2018 at 4:30 PM David Dai  wrote:

Introduce Qualcomm SDM845 specific provider driver using the
interconnect framework.

Signed-off-by: David Dai 
---
  .../bindings/interconnect/qcom-sdm845.txt  |  22 +
  drivers/interconnect/qcom/Kconfig  |   8 +
  drivers/interconnect/qcom/Makefile |   1 +
  drivers/interconnect/qcom/qcom-icc-ids.h   | 142 
  drivers/interconnect/qcom/sdm845.c | 826 +
  5 files changed, 999 insertions(+)
  create mode 100644 
Documentation/devicetree/bindings/interconnect/qcom-sdm845.txt
  create mode 100644 drivers/interconnect/qcom/qcom-icc-ids.h
  create mode 100644 drivers/interconnect/qcom/sdm845.c


...

diff --git a/drivers/interconnect/qcom/sdm845.c 
b/drivers/interconnect/qcom/sdm845.c
new file mode 100644
index 000..bf13053
--- /dev/null
+++ b/drivers/interconnect/qcom/sdm845.c
@@ -0,0 +1,826 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include "qcom-icc-ids.h"
+
+#define BCM_TCS_CMD_COMMIT_SHFT30
+#define BCM_TCS_CMD_COMMIT_MASK0x4000
+#define BCM_TCS_CMD_VALID_SHFT 29
+#define BCM_TCS_CMD_VALID_MASK 0x20001
+#define BCM_TCS_CMD_VOTE_X_SHFT14
+#define BCM_TCS_CMD_VOTE_MASK  0x3fff
+#define BCM_TCS_CMD_VOTE_Y_SHFT0
+#define BCM_TCS_CMD_VOTE_Y_MASK0xfffc000
+
+#define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \
+   ((commit << BCM_TCS_CMD_COMMIT_SHFT) |\
+   (valid << BCM_TCS_CMD_VALID_SHFT) |\
+   ((vote_x & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) |\
+   ((vote_y & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT))

These values that are >8 bits (vote_x and vote_y) should be converted
from cpu to little endian.

Done.



+
+#define to_qcom_provider(_provider) \
+   container_of(_provider, struct qcom_icc_provider, provider)
+
+#define DEFINE_QNODE(_name, _id, _channels, _buswidth, \
+   _numlinks, ...) \
+   static struct qcom_icc_node _name = {   \
+   .id = _id,  \
+   .name = #_name, \
+   .channels = _channels,  \
+   .buswidth = _buswidth,  \
+   .num_links = _numlinks, \
+   .links = { __VA_ARGS__ },   \
+   }
+
+#define DEFINE_QBCM(_name, _bcmname, _keepalive, _numnodes, ...)   \
+   static struct qcom_icc_bcm _name = {\
+   .name = _bcmname,   \
+   .keepalive = _keepalive,\
+   .num_nodes = _numnodes, \
+   .nodes = { __VA_ARGS__ },   \
+   }
+
+struct qcom_icc_provider {
+   struct icc_provider provider;
+   void __iomem*base;
+   struct device   *dev;
+   struct qcom_icc_bcm **bcms;
+   size_t num_bcms;
+};
+
+/**
+ * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager(BCM)
+ * @unit: bcm threshold values are in magnitudes of this
+ * @width: prototype width
+ * @vcd: virtual clock domain that this bcm belongs to
+ */
+
+struct bcm_db {
+   u32 unit;
+   u16 width;
+   u8 vcd;
+   u8 reserved;
+};
+
+#define SDM845_MAX_LINKS   43
+#define SDM845_MAX_BCMS30
+#define SDM845_MAX_BCM_PER_NODE2
+#define SDM845_MAX_VCD 10
+
+/**
+ * struct qcom_icc_node - Qualcomm specific interconnect nodes
+ * @name: the node name used in debugfs
+ * @links: an array of nodes where we can go next while traversing
+ * @id: a unique node identifier
+ * @num_links: the total number of @links
+ * @channels: num of channels at this node
+ * @buswidth: width of the interconnect between a node and the bus
+ * @sum_avg: current sum aggregate value of all avg bw requests
+ * @max_peak: current max aggregate value of all peak bw requests
+ * @bcms: list of bcms associated with this logical node
+ * @num_bcm: num of @bcms
+ */
+struct qcom_icc_node {
+   const char *name;
+   u16 links[SDM845_MAX_LINKS];
+   u16 id;
+   u16 num_links;
+   u16 channels;
+   u16 buswidth;
+   u64 sum_avg;
+   u64 max_peak;
+   struct qcom_icc_bcm *bcms[SDM845_MAX_BCM_PER_NODE];
+   size_t 

Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-07-31 Thread David Dai

Hi Evan,

Thanks for taking the time to review and feedback!


On 7/27/2018 2:12 PM, Evan Green wrote:

Hi David,

On Thu, Jul 26, 2018 at 4:30 PM David Dai  wrote:

Introduce Qualcomm SDM845 specific provider driver using the
interconnect framework.

Signed-off-by: David Dai 
---
  .../bindings/interconnect/qcom-sdm845.txt  |  22 +
  drivers/interconnect/qcom/Kconfig  |   8 +
  drivers/interconnect/qcom/Makefile |   1 +
  drivers/interconnect/qcom/qcom-icc-ids.h   | 142 
  drivers/interconnect/qcom/sdm845.c | 826 +
  5 files changed, 999 insertions(+)
  create mode 100644 
Documentation/devicetree/bindings/interconnect/qcom-sdm845.txt
  create mode 100644 drivers/interconnect/qcom/qcom-icc-ids.h
  create mode 100644 drivers/interconnect/qcom/sdm845.c


...

diff --git a/drivers/interconnect/qcom/sdm845.c 
b/drivers/interconnect/qcom/sdm845.c
new file mode 100644
index 000..bf13053
--- /dev/null
+++ b/drivers/interconnect/qcom/sdm845.c
@@ -0,0 +1,826 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include "qcom-icc-ids.h"
+
+#define BCM_TCS_CMD_COMMIT_SHFT30
+#define BCM_TCS_CMD_COMMIT_MASK0x4000
+#define BCM_TCS_CMD_VALID_SHFT 29
+#define BCM_TCS_CMD_VALID_MASK 0x20001
+#define BCM_TCS_CMD_VOTE_X_SHFT14
+#define BCM_TCS_CMD_VOTE_MASK  0x3fff
+#define BCM_TCS_CMD_VOTE_Y_SHFT0
+#define BCM_TCS_CMD_VOTE_Y_MASK0xfffc000
+
+#define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \
+   ((commit << BCM_TCS_CMD_COMMIT_SHFT) |\
+   (valid << BCM_TCS_CMD_VALID_SHFT) |\
+   ((vote_x & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) |\
+   ((vote_y & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT))

These values that are >8 bits (vote_x and vote_y) should be converted
from cpu to little endian.

Done.



+
+#define to_qcom_provider(_provider) \
+   container_of(_provider, struct qcom_icc_provider, provider)
+
+#define DEFINE_QNODE(_name, _id, _channels, _buswidth, \
+   _numlinks, ...) \
+   static struct qcom_icc_node _name = {   \
+   .id = _id,  \
+   .name = #_name, \
+   .channels = _channels,  \
+   .buswidth = _buswidth,  \
+   .num_links = _numlinks, \
+   .links = { __VA_ARGS__ },   \
+   }
+
+#define DEFINE_QBCM(_name, _bcmname, _keepalive, _numnodes, ...)   \
+   static struct qcom_icc_bcm _name = {\
+   .name = _bcmname,   \
+   .keepalive = _keepalive,\
+   .num_nodes = _numnodes, \
+   .nodes = { __VA_ARGS__ },   \
+   }
+
+struct qcom_icc_provider {
+   struct icc_provider provider;
+   void __iomem*base;
+   struct device   *dev;
+   struct qcom_icc_bcm **bcms;
+   size_t num_bcms;
+};
+
+/**
+ * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager(BCM)
+ * @unit: bcm threshold values are in magnitudes of this
+ * @width: prototype width
+ * @vcd: virtual clock domain that this bcm belongs to
+ */
+
+struct bcm_db {
+   u32 unit;
+   u16 width;
+   u8 vcd;
+   u8 reserved;
+};
+
+#define SDM845_MAX_LINKS   43
+#define SDM845_MAX_BCMS30
+#define SDM845_MAX_BCM_PER_NODE2
+#define SDM845_MAX_VCD 10
+
+/**
+ * struct qcom_icc_node - Qualcomm specific interconnect nodes
+ * @name: the node name used in debugfs
+ * @links: an array of nodes where we can go next while traversing
+ * @id: a unique node identifier
+ * @num_links: the total number of @links
+ * @channels: num of channels at this node
+ * @buswidth: width of the interconnect between a node and the bus
+ * @sum_avg: current sum aggregate value of all avg bw requests
+ * @max_peak: current max aggregate value of all peak bw requests
+ * @bcms: list of bcms associated with this logical node
+ * @num_bcm: num of @bcms
+ */
+struct qcom_icc_node {
+   const char *name;
+   u16 links[SDM845_MAX_LINKS];
+   u16 id;
+   u16 num_links;
+   u16 channels;
+   u16 buswidth;
+   u64 sum_avg;
+   u64 max_peak;
+   struct qcom_icc_bcm *bcms[SDM845_MAX_BCM_PER_NODE];
+   size_t 

Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-07-27 Thread Evan Green
Hi David,

On Thu, Jul 26, 2018 at 4:30 PM David Dai  wrote:
>
> Introduce Qualcomm SDM845 specific provider driver using the
> interconnect framework.
>
> Signed-off-by: David Dai 
> ---
>  .../bindings/interconnect/qcom-sdm845.txt  |  22 +
>  drivers/interconnect/qcom/Kconfig  |   8 +
>  drivers/interconnect/qcom/Makefile |   1 +
>  drivers/interconnect/qcom/qcom-icc-ids.h   | 142 
>  drivers/interconnect/qcom/sdm845.c | 826 
> +
>  5 files changed, 999 insertions(+)
>  create mode 100644 
> Documentation/devicetree/bindings/interconnect/qcom-sdm845.txt
>  create mode 100644 drivers/interconnect/qcom/qcom-icc-ids.h
>  create mode 100644 drivers/interconnect/qcom/sdm845.c
>
...
> diff --git a/drivers/interconnect/qcom/sdm845.c 
> b/drivers/interconnect/qcom/sdm845.c
> new file mode 100644
> index 000..bf13053
> --- /dev/null
> +++ b/drivers/interconnect/qcom/sdm845.c
> @@ -0,0 +1,826 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (c) 2018, The Linux Foundation. All rights reserved.
> + *
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +#include 
> +#include 
> +
> +#include "qcom-icc-ids.h"
> +
> +#define BCM_TCS_CMD_COMMIT_SHFT30
> +#define BCM_TCS_CMD_COMMIT_MASK0x4000
> +#define BCM_TCS_CMD_VALID_SHFT 29
> +#define BCM_TCS_CMD_VALID_MASK 0x20001
> +#define BCM_TCS_CMD_VOTE_X_SHFT14
> +#define BCM_TCS_CMD_VOTE_MASK  0x3fff
> +#define BCM_TCS_CMD_VOTE_Y_SHFT0
> +#define BCM_TCS_CMD_VOTE_Y_MASK0xfffc000
> +
> +#define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \
> +   ((commit << BCM_TCS_CMD_COMMIT_SHFT) |\
> +   (valid << BCM_TCS_CMD_VALID_SHFT) |\
> +   ((vote_x & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) |\
> +   ((vote_y & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT))

These values that are >8 bits (vote_x and vote_y) should be converted
from cpu to little endian.

> +
> +#define to_qcom_provider(_provider) \
> +   container_of(_provider, struct qcom_icc_provider, provider)
> +
> +#define DEFINE_QNODE(_name, _id, _channels, _buswidth, \
> +   _numlinks, ...) \
> +   static struct qcom_icc_node _name = {   \
> +   .id = _id,  \
> +   .name = #_name, \
> +   .channels = _channels,  \
> +   .buswidth = _buswidth,  \
> +   .num_links = _numlinks, \
> +   .links = { __VA_ARGS__ },   \
> +   }
> +
> +#define DEFINE_QBCM(_name, _bcmname, _keepalive, _numnodes, ...)   \
> +   static struct qcom_icc_bcm _name = {\
> +   .name = _bcmname,   \
> +   .keepalive = _keepalive,\
> +   .num_nodes = _numnodes, \
> +   .nodes = { __VA_ARGS__ },   \
> +   }
> +
> +struct qcom_icc_provider {
> +   struct icc_provider provider;
> +   void __iomem*base;
> +   struct device   *dev;
> +   struct qcom_icc_bcm **bcms;
> +   size_t num_bcms;
> +};
> +
> +/**
> + * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager(BCM)
> + * @unit: bcm threshold values are in magnitudes of this
> + * @width: prototype width
> + * @vcd: virtual clock domain that this bcm belongs to
> + */
> +
> +struct bcm_db {
> +   u32 unit;
> +   u16 width;
> +   u8 vcd;
> +   u8 reserved;
> +};
> +
> +#define SDM845_MAX_LINKS   43
> +#define SDM845_MAX_BCMS30
> +#define SDM845_MAX_BCM_PER_NODE2
> +#define SDM845_MAX_VCD 10
> +
> +/**
> + * struct qcom_icc_node - Qualcomm specific interconnect nodes
> + * @name: the node name used in debugfs
> + * @links: an array of nodes where we can go next while traversing
> + * @id: a unique node identifier
> + * @num_links: the total number of @links
> + * @channels: num of channels at this node
> + * @buswidth: width of the interconnect between a node and the bus
> + * @sum_avg: current sum aggregate value of all avg bw requests
> + * @max_peak: current max aggregate value of all peak bw requests
> + * @bcms: list of bcms associated with this logical node
> + * @num_bcm: num of @bcms
> + */
> +struct qcom_icc_node {
> +   const char *name;
> +   u16 links[SDM845_MAX_LINKS];
> +   u16 id;
> +   u16 num_links;
> +   u16 channels;
> + 

Re: [RFC PATCH v2 1/2] interconnect: qcom: Add sdm845 interconnect provider driver

2018-07-27 Thread Evan Green
Hi David,

On Thu, Jul 26, 2018 at 4:30 PM David Dai  wrote:
>
> Introduce Qualcomm SDM845 specific provider driver using the
> interconnect framework.
>
> Signed-off-by: David Dai 
> ---
>  .../bindings/interconnect/qcom-sdm845.txt  |  22 +
>  drivers/interconnect/qcom/Kconfig  |   8 +
>  drivers/interconnect/qcom/Makefile |   1 +
>  drivers/interconnect/qcom/qcom-icc-ids.h   | 142 
>  drivers/interconnect/qcom/sdm845.c | 826 
> +
>  5 files changed, 999 insertions(+)
>  create mode 100644 
> Documentation/devicetree/bindings/interconnect/qcom-sdm845.txt
>  create mode 100644 drivers/interconnect/qcom/qcom-icc-ids.h
>  create mode 100644 drivers/interconnect/qcom/sdm845.c
>
...
> diff --git a/drivers/interconnect/qcom/sdm845.c 
> b/drivers/interconnect/qcom/sdm845.c
> new file mode 100644
> index 000..bf13053
> --- /dev/null
> +++ b/drivers/interconnect/qcom/sdm845.c
> @@ -0,0 +1,826 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (c) 2018, The Linux Foundation. All rights reserved.
> + *
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +#include 
> +#include 
> +
> +#include "qcom-icc-ids.h"
> +
> +#define BCM_TCS_CMD_COMMIT_SHFT30
> +#define BCM_TCS_CMD_COMMIT_MASK0x4000
> +#define BCM_TCS_CMD_VALID_SHFT 29
> +#define BCM_TCS_CMD_VALID_MASK 0x20001
> +#define BCM_TCS_CMD_VOTE_X_SHFT14
> +#define BCM_TCS_CMD_VOTE_MASK  0x3fff
> +#define BCM_TCS_CMD_VOTE_Y_SHFT0
> +#define BCM_TCS_CMD_VOTE_Y_MASK0xfffc000
> +
> +#define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \
> +   ((commit << BCM_TCS_CMD_COMMIT_SHFT) |\
> +   (valid << BCM_TCS_CMD_VALID_SHFT) |\
> +   ((vote_x & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) |\
> +   ((vote_y & BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT))

These values that are >8 bits (vote_x and vote_y) should be converted
from cpu to little endian.

> +
> +#define to_qcom_provider(_provider) \
> +   container_of(_provider, struct qcom_icc_provider, provider)
> +
> +#define DEFINE_QNODE(_name, _id, _channels, _buswidth, \
> +   _numlinks, ...) \
> +   static struct qcom_icc_node _name = {   \
> +   .id = _id,  \
> +   .name = #_name, \
> +   .channels = _channels,  \
> +   .buswidth = _buswidth,  \
> +   .num_links = _numlinks, \
> +   .links = { __VA_ARGS__ },   \
> +   }
> +
> +#define DEFINE_QBCM(_name, _bcmname, _keepalive, _numnodes, ...)   \
> +   static struct qcom_icc_bcm _name = {\
> +   .name = _bcmname,   \
> +   .keepalive = _keepalive,\
> +   .num_nodes = _numnodes, \
> +   .nodes = { __VA_ARGS__ },   \
> +   }
> +
> +struct qcom_icc_provider {
> +   struct icc_provider provider;
> +   void __iomem*base;
> +   struct device   *dev;
> +   struct qcom_icc_bcm **bcms;
> +   size_t num_bcms;
> +};
> +
> +/**
> + * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager(BCM)
> + * @unit: bcm threshold values are in magnitudes of this
> + * @width: prototype width
> + * @vcd: virtual clock domain that this bcm belongs to
> + */
> +
> +struct bcm_db {
> +   u32 unit;
> +   u16 width;
> +   u8 vcd;
> +   u8 reserved;
> +};
> +
> +#define SDM845_MAX_LINKS   43
> +#define SDM845_MAX_BCMS30
> +#define SDM845_MAX_BCM_PER_NODE2
> +#define SDM845_MAX_VCD 10
> +
> +/**
> + * struct qcom_icc_node - Qualcomm specific interconnect nodes
> + * @name: the node name used in debugfs
> + * @links: an array of nodes where we can go next while traversing
> + * @id: a unique node identifier
> + * @num_links: the total number of @links
> + * @channels: num of channels at this node
> + * @buswidth: width of the interconnect between a node and the bus
> + * @sum_avg: current sum aggregate value of all avg bw requests
> + * @max_peak: current max aggregate value of all peak bw requests
> + * @bcms: list of bcms associated with this logical node
> + * @num_bcm: num of @bcms
> + */
> +struct qcom_icc_node {
> +   const char *name;
> +   u16 links[SDM845_MAX_LINKS];
> +   u16 id;
> +   u16 num_links;
> +   u16 channels;
> +