ソースを参照

ubwcp: debug interface to control multi-tile processing

Provides debugfs node to enable/disable multi-tile processing.

Change-Id: I92e81f5332f0990688c05d7a0d90b8a978d44059
Signed-off-by: Amol Jadi <[email protected]>
Amol Jadi 1 年間 前
コミット
0702773127
3 ファイル変更58 行追加1 行削除
  1. 14 0
      ubwcp/ubwcp_hw.c
  2. 2 1
      ubwcp/ubwcp_hw.h
  3. 42 0
      ubwcp/ubwcp_main.c

+ 14 - 0
ubwcp/ubwcp_hw.c

@@ -342,6 +342,20 @@ void ubwcp_hw_power_vote_status(void __iomem *pwr_ctrl, u8 *vote, u8 *status)
 	*status = (reg & BIT(31)) >> 31;
 }
 
+/* process only one tile at a time */
+void ubwcp_hw_single_tile(void __iomem *base, bool en)
+{
+	u32 reg;
+
+	reg = UBWCP_REG_READ(base, SPARE);
+	if (en)
+		reg |= BIT(15);
+	else
+		reg &= ~BIT(15);
+	UBWCP_REG_WRITE(base, SPARE, reg);
+}
+EXPORT_SYMBOL(ubwcp_hw_single_tile);
+
 void ubwcp_hw_one_time_init(void __iomem *base)
 {
 	u32 reg;

+ 2 - 1
ubwcp/ubwcp_hw.h

@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef __UBWCP_HW_H_
@@ -68,5 +68,6 @@ void ubwcp_hw_one_time_init(void __iomem *base);
 int ubwcp_hw_flush(void __iomem *base);
 void ubwcp_hw_trace_set(bool value);
 void ubwcp_hw_trace_get(bool *value);
+void ubwcp_hw_single_tile(void __iomem *base, bool en);
 
 #endif /* __UBWCP_HW_H_ */

+ 42 - 0
ubwcp/ubwcp_main.c

@@ -137,6 +137,7 @@ struct ubwcp_driver {
 	bool write_err_irq_en;
 	bool decode_err_irq_en;
 	bool encode_err_irq_en;
+	bool single_tile_en;
 
 	/* ubwcp devices */
 	struct device *dev; //ubwcp device
@@ -2682,11 +2683,46 @@ static int reg_rw_trace_r_op(void *data, u64 *value)
 	return 0;
 }
 
+static int single_tile_r_op(void *data, u64 *value)
+{
+	struct ubwcp_driver *ubwcp = data;
+
+	if (ubwcp->state != UBWCP_STATE_READY)
+		return -EPERM;
+
+	*value = ubwcp->single_tile_en;
+	return 0;
+}
+
+static int single_tile_w_op(void *data, u64 value)
+{
+	struct ubwcp_driver *ubwcp = data;
+
+	if (ubwcp->state != UBWCP_STATE_READY)
+		return -EPERM;
+
+	if (ubwcp_power(ubwcp, true))
+		goto err;
+
+	ubwcp_hw_single_tile(ubwcp->base, value);
+	ubwcp->single_tile_en = value;
+
+	if (ubwcp_power(ubwcp, false))
+		goto err;
+
+	return 0;
+err:
+	ubwcp->state = UBWCP_STATE_FAULT;
+	ERR("state set to fault");
+	return -1;
+}
+
 DEFINE_DEBUGFS_ATTRIBUTE(read_err_fops, read_err_r_op, read_err_w_op, "%d\n");
 DEFINE_DEBUGFS_ATTRIBUTE(decode_err_fops, decode_err_r_op, decode_err_w_op, "%d\n");
 DEFINE_DEBUGFS_ATTRIBUTE(write_err_fops, write_err_r_op, write_err_w_op, "%d\n");
 DEFINE_DEBUGFS_ATTRIBUTE(encode_err_fops, encode_err_r_op, encode_err_w_op, "%d\n");
 DEFINE_DEBUGFS_ATTRIBUTE(reg_rw_trace_fops, reg_rw_trace_r_op, reg_rw_trace_w_op, "%d\n");
+DEFINE_DEBUGFS_ATTRIBUTE(single_tile_fops, single_tile_r_op, single_tile_w_op, "%d\n");
 
 static void ubwcp_debugfs_init(struct ubwcp_driver *ubwcp)
 {
@@ -2733,6 +2769,12 @@ static void ubwcp_debugfs_init(struct ubwcp_driver *ubwcp)
 		goto err;
 	}
 
+	dfile = debugfs_create_file("single_tile_en", 0644, debugfs_root, ubwcp, &single_tile_fops);
+	if (IS_ERR_OR_NULL(dfile)) {
+		ERR("failed to create write_err_irq debugfs file");
+		goto err;
+	}
+
 	ubwcp->debugfs_root = debugfs_root;
 	return;