Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2ba5b89 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Add MHI diag support for multiple devices"

parents e5d1df0c cc132592
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -73,6 +73,13 @@ struct dci_ops_tbl_t dci_ops_tbl[NUM_DCI_PROC] = {
		.send_event_mask = diag_send_dci_event_mask_remote,
		.peripheral_status = 0,
		.mempool = POOL_TYPE_MDM_DCI_WRITE,
	},
	{
		.ctx = DIAGFWD_MDM_DCI_2,
		.send_log_mask = diag_send_dci_log_mask_remote,
		.send_event_mask = diag_send_dci_event_mask_remote,
		.peripheral_status = 0,
		.mempool = POOL_TYPE_MDM2_DCI_WRITE,
	}
#endif
};
@@ -593,7 +600,7 @@ void diag_process_remote_dci_read_data(int index, void *buf, int recd_bytes)
		 * (1 byte) + version (1 byte) + length (2 bytes)
		 */
		err = diag_process_single_dci_pkt(buf + 4, dci_pkt_len,
						 DCI_REMOTE_DATA, DCI_MDM_PROC);
						 DCI_REMOTE_DATA, token);
		if (err)
			break;
		read_bytes += header_len + dci_pkt_len;
@@ -2963,6 +2970,7 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry)
		new_entry->num_buffers = NUM_DCI_PERIPHERALS;
		break;
	case DCI_MDM_PROC:
	case DCI_MDM_2_PROC:
		new_entry->num_buffers = 1;
		break;
	}
+3 −2
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
 */
#ifndef DIAG_DCI_H
#define DIAG_DCI_H
@@ -58,7 +58,8 @@ extern unsigned int dci_max_clients;
#define DCI_LOCAL_PROC		0
#define DCI_REMOTE_BASE		1
#define DCI_MDM_PROC		DCI_REMOTE_BASE
#define DCI_REMOTE_LAST		(DCI_REMOTE_BASE + 1)
#define DCI_MDM_2_PROC		(DCI_REMOTE_BASE + 1)
#define DCI_REMOTE_LAST		(DCI_REMOTE_BASE + 2)

#ifndef CONFIG_DIAGFWD_BRIDGE_CODE
#define NUM_DCI_PROC		1
+31 −25
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
 */

#ifdef CONFIG_DEBUG_FS
@@ -789,7 +789,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf,
{
	char *buf = NULL;
	int ret = 0;
	int i = 0;
	int ch_idx = 0;
	int dev_idx = 0;
	unsigned int buf_size;
	unsigned int bytes_remaining = 0;
	unsigned int bytes_written = 0;
@@ -810,9 +811,13 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf,

	buf_size = ksize(buf);
	bytes_remaining = buf_size;
	for (i = diag_dbgfs_mhiinfo_index; i < NUM_MHI_DEV; i++) {
		mhi_info = &diag_mhi[i];
		bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
	for (dev_idx = diag_dbgfs_mhiinfo_index; dev_idx < NUM_MHI_DEV;
								dev_idx++) {
		for (ch_idx = diag_dbgfs_mhiinfo_index; ch_idx < NUM_MHI_DEV;
								ch_idx++) {
			mhi_info = &diag_mhi[dev_idx][ch_idx];
			bytes_written = scnprintf(buf+bytes_in_buffer,
						bytes_remaining,
						"id: %d\n"
						"name: %s\n"
						"enabled %d\n"
@@ -843,7 +848,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf,
			if (bytes_remaining < bytes_written)
				break;
		}
	diag_dbgfs_mhiinfo_index = i+1;
	}
	diag_dbgfs_mhiinfo_index = dev_idx + 1;
	*ppos = 0;
	ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);

+23 −10
Original line number Diff line number Diff line
@@ -45,9 +45,9 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = {
		.dci_wq = NULL,
	},
	{
		.id = DIAGFWD_SMUX,
		.id = DIAGFWD_MDM2,
		.type = DIAG_DATA_TYPE,
		.name = "SMUX",
		.name = "MDM_2",
		.inited = 0,
		.ctxt = 0,
		.dci_read_ptr = NULL,
@@ -68,6 +68,18 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = {
		.dci_read_len = 0,
		.dci_wq = NULL,
	},
	{
		.id = DIAGFWD_MDM_DCI_2,
		.type = DIAG_DCI_TYPE,
		.name = "MDM_DCI_2",
		.inited = 0,
		.ctxt = 0,
		.dci_read_ptr = NULL,
		.dev_ops = NULL,
		.dci_read_buf = NULL,
		.dci_read_len = 0,
		.dci_wq = NULL,
	},
};

static int diagfwd_bridge_mux_connect(int id, int mode)
@@ -75,7 +87,7 @@ static int diagfwd_bridge_mux_connect(int id, int mode)
	if (id < 0 || id >= NUM_REMOTE_DEV)
		return -EINVAL;
	if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->open)
		bridge_info[id].dev_ops->open(bridge_info[id].ctxt);
		bridge_info[id].dev_ops->open(id, bridge_info[id].ctxt);
	return 0;
}

@@ -101,7 +113,7 @@ static int diagfwd_bridge_mux_write_done(unsigned char *buf, int len,
		return -EINVAL;
	ch = &bridge_info[buf_ctx];
	if (ch->dev_ops && ch->dev_ops->fwd_complete)
		ch->dev_ops->fwd_complete(ch->ctxt, buf, len, 0);
		ch->dev_ops->fwd_complete(ch->id, ch->ctxt, buf, len, 0);
	return 0;
}

@@ -122,7 +134,7 @@ static void bridge_dci_read_work_fn(struct work_struct *work)
	diag_process_remote_dci_read_data(ch->id, ch->dci_read_buf,
					  ch->dci_read_len);
	if (ch->dev_ops && ch->dev_ops->fwd_complete) {
		ch->dev_ops->fwd_complete(ch->ctxt, ch->dci_read_ptr,
		ch->dev_ops->fwd_complete(ch->id, ch->ctxt, ch->dci_read_ptr,
					  ch->dci_read_len, 0);
	}
}
@@ -134,7 +146,8 @@ int diagfwd_bridge_register(int id, int ctxt, struct diag_remote_dev_ops *ops)
	char wq_name[DIAG_BRIDGE_NAME_SZ + 10];

	if (!ops) {
		pr_err("diag: Invalid pointers ops: %pK ctxt: %d\n", ops, ctxt);
		pr_err("diag: Invalid pointers ops: %pK ctxt: %d id: %d\n",
			ops, ctxt, id);
		return -EINVAL;
	}

@@ -201,7 +214,7 @@ int diag_remote_dev_read_done(int id, unsigned char *buf, int len)
	if (ch->type == DIAG_DATA_TYPE) {
		err = diag_mux_write(BRIDGE_TO_MUX(id), buf, len, id);
		if (ch->dev_ops && ch->dev_ops->queue_read)
			ch->dev_ops->queue_read(ch->ctxt);
			ch->dev_ops->queue_read(id, ch->ctxt);
		return err;
	}
	/*
@@ -277,7 +290,7 @@ int diagfwd_bridge_close(int id)
	if (id < 0 || id >= NUM_REMOTE_DEV)
		return -EINVAL;
	if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->close)
		return bridge_info[id].dev_ops->close(bridge_info[id].ctxt);
		return bridge_info[id].dev_ops->close(id, bridge_info[id].ctxt);
	return 0;
}

@@ -286,7 +299,7 @@ int diagfwd_bridge_write(int id, unsigned char *buf, int len)
	if (id < 0 || id >= NUM_REMOTE_DEV)
		return -EINVAL;
	if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->write) {
		return bridge_info[id].dev_ops->write(bridge_info[id].ctxt,
		return bridge_info[id].dev_ops->write(id, bridge_info[id].ctxt,
						      buf, len, 0);
	}
	return 0;
@@ -301,7 +314,7 @@ uint16_t diag_get_remote_device_mask(void)
		if (bridge_info[i].inited &&
		    bridge_info[i].type == DIAG_DATA_TYPE &&
		    (bridge_info[i].dev_ops->remote_proc_check &&
		    bridge_info[i].dev_ops->remote_proc_check())) {
		    bridge_info[i].dev_ops->remote_proc_check(i))) {
			remote_dev |= 1 << i;
		}
	}
+12 −9
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2012-2014, 2017-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2014, 2017-2019, The Linux Foundation. All rights reserved.
 */

#ifndef DIAGFWD_BRIDGE_H
@@ -10,22 +10,25 @@
 * bottom half of this list.
 */
#define DIAGFWD_MDM		0
#define DIAGFWD_SMUX		1
#define DIAGFWD_MDM2		1
#define NUM_REMOTE_DATA_DEV	2
#define DIAGFWD_MDM_DCI		NUM_REMOTE_DATA_DEV
#define NUM_REMOTE_DCI_DEV	(DIAGFWD_MDM_DCI - NUM_REMOTE_DATA_DEV + 1)
#define DIAGFWD_MDM_DCI_2	(NUM_REMOTE_DATA_DEV + 1)
#define NUM_REMOTE_DCI_DEV	(DIAGFWD_MDM_DCI_2 - NUM_REMOTE_DATA_DEV + 1)
#define NUM_REMOTE_DEV		(NUM_REMOTE_DATA_DEV + NUM_REMOTE_DCI_DEV)

#define DIAG_BRIDGE_NAME_SZ	24
#define DIAG_BRIDGE_GET_NAME(x)	(bridge_info[x].name)

struct diag_remote_dev_ops {
	int (*open)(int id);
	int (*close)(int id);
	int (*queue_read)(int id);
	int (*write)(int id, unsigned char *buf, int len, int ctxt);
	int (*fwd_complete)(int id, unsigned char *buf, int len, int ctxt);
	int (*remote_proc_check)(void);
	int (*open)(int id, int  ch);
	int (*close)(int id, int ch);
	int (*queue_read)(int id, int ch);
	int (*write)(int id, int ch, unsigned char *buf,
			int len, int ctxt);
	int (*fwd_complete)(int id, int ch, unsigned char *buf,
				int len, int ctxt);
	int (*remote_proc_check)(int id);
};

struct diagfwd_bridge_info {
Loading