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

Commit 00b12b88 authored by Sreelakshmi Gownipalli's avatar Sreelakshmi Gownipalli Committed by Chris Lew
Browse files

diag: Migrate from GLINK to RPMSG



Add support for diag communicaton over rpmsg to peripherals. Remove
GLINK diagfwd since RPMSG replaces GLINK.

Change-Id: I7f66b2b302a603112378aa1977fca4c268eca328
Signed-off-by: default avatarSreelakshmi Gownipalli <sgownipa@codeaurora.org>
Signed-off-by: default avatarChris Lew <clew@codeaurora.org>
parent 0cabc1d7
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
obj-$(CONFIG_DIAG_CHAR) += diagchar_core.o diagchar_hdlc.o diagfwd.o diagfwd_peripheral.o diagfwd_socket.o diag_mux.o diag_memorydevice.o diag_usb.o diagmem.o diagfwd_cntl.o diag_dci.o diag_masks.o diag_debugfs.o
obj-$(CONFIG_DIAG_CHAR) += diagchar_core.o diagchar_hdlc.o diagfwd.o diagfwd_peripheral.o diagfwd_socket.o diagfwd_rpmsg.o
obj-$(CONFIG_DIAG_CHAR) += diag_mux.o diag_memorydevice.o diag_usb.o diagmem.o diagfwd_cntl.o diag_dci.o diag_masks.o diag_debugfs.o
obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_bridge.o
obj-$(CONFIG_USB_QCOM_DIAG_BRIDGE) += diagfwd_hsic.o
obj-$(CONFIG_USB_QCOM_DIAG_BRIDGE) += diagfwd_smux.o
+18 −20
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
#include "diag_usb.h"
#include "diagfwd_peripheral.h"
#include "diagfwd_socket.h"
#include "diagfwd_glink.h"
#include "diagfwd_rpmsg.h"
#include "diag_debugfs.h"
#include "diag_ipc_logging.h"

@@ -43,7 +43,7 @@ static int diag_dbgfs_table_index;
static int diag_dbgfs_mempool_index;
static int diag_dbgfs_usbinfo_index;
static int diag_dbgfs_socketinfo_index;
static int diag_dbgfs_glinkinfo_index;
static int diag_dbgfs_rpmsginfo_index;
static int diag_dbgfs_hsicinfo_index;
static int diag_dbgfs_mhiinfo_index;
static int diag_dbgfs_bridgeinfo_index;
@@ -580,7 +580,7 @@ static ssize_t diag_dbgfs_read_socketinfo(struct file *file, char __user *ubuf,
	return ret;
}

static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
static ssize_t diag_dbgfs_read_rpmsginfo(struct file *file, char __user *ubuf,
					  size_t count, loff_t *ppos)
{
	char *buf = NULL;
@@ -591,12 +591,12 @@ static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
	unsigned int bytes_remaining = 0;
	unsigned int bytes_written = 0;
	unsigned int bytes_in_buffer = 0;
	struct diag_glink_info *info = NULL;
	struct diag_rpmsg_info *info = NULL;
	struct diagfwd_info *fwd_ctxt = NULL;

	if (diag_dbgfs_glinkinfo_index >= NUM_PERIPHERALS) {
	if (diag_dbgfs_rpmsginfo_index >= NUM_PERIPHERALS) {
		/* Done. Reset to prepare for future requests */
		diag_dbgfs_socketinfo_index = 0;
		diag_dbgfs_rpmsginfo_index = 0;
		return 0;
	}

@@ -610,19 +610,19 @@ static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
		for (j = 0; j < NUM_PERIPHERALS; j++) {
			switch (i) {
			case TYPE_DATA:
				info = &glink_data[j];
				info = &rpmsg_data[j];
				break;
			case TYPE_CNTL:
				info = &glink_cntl[j];
				info = &rpmsg_cntl[j];
				break;
			case TYPE_DCI:
				info = &glink_dci[j];
				info = &rpmsg_dci[j];
				break;
			case TYPE_CMD:
				info = &glink_cmd[j];
				info = &rpmsg_cmd[j];
				break;
			case TYPE_DCI_CMD:
				info = &glink_dci_cmd[j];
				info = &rpmsg_dci_cmd[j];
				break;
			default:
				return -EINVAL;
@@ -639,7 +639,6 @@ static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
				"diag_state\t:\t%d\n"
				"buf_1 busy\t:\t%d\n"
				"buf_2 busy\t:\t%d\n"
				"tx_intent_ready\t:\t%d\n"
				"open pending\t:\t%d\n"
				"close pending\t:\t%d\n"
				"read pending\t:\t%d\n"
@@ -657,7 +656,6 @@ static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
				atomic_read(&fwd_ctxt->buf_1->in_busy) : -1,
				(fwd_ctxt && fwd_ctxt->buf_2) ?
				atomic_read(&fwd_ctxt->buf_2->in_busy) : -1,
				atomic_read(&info->tx_intent_ready),
				work_pending(&info->open_work),
				work_pending(&info->close_work),
				work_pending(&info->read_work),
@@ -676,7 +674,7 @@ static ssize_t diag_dbgfs_read_glinkinfo(struct file *file, char __user *ubuf,
				break;
		}
	}
	diag_dbgfs_glinkinfo_index = i+1;
	diag_dbgfs_rpmsginfo_index = i+1;
	*ppos = 0;
	ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);

@@ -943,8 +941,8 @@ const struct file_operations diag_dbgfs_socketinfo_ops = {
	.read = diag_dbgfs_read_socketinfo,
};

const struct file_operations diag_dbgfs_glinkinfo_ops = {
	.read = diag_dbgfs_read_glinkinfo,
const struct file_operations diag_dbgfs_rpmsginfo_ops = {
	.read = diag_dbgfs_read_rpmsginfo,
};

const struct file_operations diag_dbgfs_table_ops = {
@@ -989,8 +987,8 @@ int diag_debugfs_init(void)
	if (!entry)
		goto err;

	entry = debugfs_create_file("glinkinfo", 0444, diag_dbgfs_dent, 0,
				    &diag_dbgfs_glinkinfo_ops);
	entry = debugfs_create_file("rpmsginfo", 0444, diag_dbgfs_dent, 0,
				    &diag_dbgfs_rpmsginfo_ops);
	if (!entry)
		goto err;

+1 −1
Original line number Diff line number Diff line
@@ -338,7 +338,7 @@ static void diag_close_transport_work_fn(struct work_struct *work)
			continue;
		driver->close_transport ^= PERIPHERAL_MASK(peripheral);
		transport = driver->feature[peripheral].sockets_enabled ?
					TRANSPORT_GLINK : TRANSPORT_SOCKET;
					TRANSPORT_RPMSG : TRANSPORT_SOCKET;
		diagfwd_close_transport(transport, peripheral);
	}
	mutex_unlock(&driver->cntl_lock);

drivers/char/diag/diagfwd_glink.c

deleted100644 → 0
+0 −830

File deleted.

Preview size limit exceeded, changes collapsed.

+20 −148
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@
#include "diagfwd_socket.h"
#include "diag_mux.h"
#include "diag_ipc_logging.h"
#include "diagfwd_glink.h"
#include "diagfwd_rpmsg.h"

struct data_header {
	uint8_t control_char;
@@ -53,8 +53,6 @@ static void diagfwd_cntl_read_done(struct diagfwd_info *fwd_info,
				   unsigned char *buf, int len);
static void diagfwd_dci_read_done(struct diagfwd_info *fwd_info,
				  unsigned char *buf, int len);
static void diagfwd_write_buffers_init(struct diagfwd_info *fwd_info);
static void diagfwd_write_buffers_exit(struct diagfwd_info *fwd_info);
struct diagfwd_info peripheral_info[NUM_TYPES][NUM_PERIPHERALS];

static struct diag_channel_ops data_ch_ops = {
@@ -778,7 +776,6 @@ int diagfwd_peripheral_init(void)
			fwd_info->num_pd = 0;
			mutex_init(&fwd_info->buf_mutex);
			mutex_init(&fwd_info->data_mutex);
			spin_lock_init(&fwd_info->write_buf_lock);

			for (i = 0; i < MAX_PERIPHERAL_UPD; i++) {
				fwd_info->diagid_user[i] = 0;
@@ -803,7 +800,6 @@ int diagfwd_peripheral_init(void)
			fwd_info->num_pd = 0;
			fwd_info->cpd_len_1 = 0;
			fwd_info->cpd_len_2 = 0;
			spin_lock_init(&fwd_info->write_buf_lock);
			mutex_init(&fwd_info->buf_mutex);
			mutex_init(&fwd_info->data_mutex);

@@ -836,7 +832,7 @@ int diagfwd_peripheral_init(void)

	if (driver->supports_sockets)
		diag_socket_init();
	diag_glink_init();
	diag_rpmsg_init();

	return 0;
}
@@ -992,17 +988,17 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral)
		return;

	switch (transport) {
	case TRANSPORT_GLINK:
	case TRANSPORT_RPMSG:
		transport_open = TRANSPORT_SOCKET;
		init_fn = diag_socket_init_peripheral;
		invalidate_fn = diag_socket_invalidate;
		check_channel_state = diag_socket_check_state;
		break;
	case TRANSPORT_SOCKET:
		transport_open = TRANSPORT_GLINK;
		init_fn = diag_glink_init_peripheral;
		invalidate_fn = diag_glink_invalidate;
		check_channel_state = diag_glink_check_state;
		transport_open = TRANSPORT_RPMSG;
		init_fn = diag_rpmsg_init_peripheral;
		invalidate_fn = diag_rpmsg_invalidate;
		check_channel_state = diag_rpmsg_check_state;
		break;
	default:
		return;
@@ -1027,10 +1023,17 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral)
	dest_info->buf_2 = fwd_info->buf_2;
	dest_info->transport = fwd_info->transport;
	invalidate_fn(dest_info->ctxt, dest_info);
	for (i = 0; i < NUM_WRITE_BUFFERS; i++)
		dest_info->buf_ptr[i] = fwd_info->buf_ptr[i];
	if (!check_channel_state(dest_info->ctxt))
		diagfwd_late_open(dest_info);

	/*
	 *	Open control channel to update masks after buffers are
	 *	initialized for peripherals that have transport other than
	 *	GLINK. GLINK supported peripheral mask update will
	 *	happen after glink buffers are initialized.
	 */

	if (dest_info->transport != TRANSPORT_RPMSG)
		diagfwd_cntl_open(dest_info);
	init_fn(peripheral);
	mutex_unlock(&driver->diagfwd_channel_mutex[peripheral]);
@@ -1038,33 +1041,12 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral)
	diagfwd_queue_read(&peripheral_info[TYPE_CMD][peripheral]);
}

void *diagfwd_request_write_buf(struct diagfwd_info *fwd_info)
{
	void *buf = NULL;
	int index;
	unsigned long flags;

	spin_lock_irqsave(&fwd_info->write_buf_lock, flags);
	for (index = 0 ; index < NUM_WRITE_BUFFERS; index++) {
		if (!atomic_read(&(fwd_info->buf_ptr[index]->in_busy))) {
			atomic_set(&(fwd_info->buf_ptr[index]->in_busy), 1);
			buf = fwd_info->buf_ptr[index]->data;
			if (!buf)
				return NULL;
			break;
		}
	}
	spin_unlock_irqrestore(&fwd_info->write_buf_lock, flags);
	return buf;
}

int diagfwd_write(uint8_t peripheral, uint8_t type, void *buf, int len)
{
	struct diagfwd_info *fwd_info = NULL;
	int err = 0;
	uint8_t retry_count = 0;
	uint8_t max_retries = 3;
	void *buf_ptr = NULL;

	if (peripheral >= NUM_PERIPHERALS || type >= NUM_TYPES)
		return -EINVAL;
@@ -1097,21 +1079,9 @@ int diagfwd_write(uint8_t peripheral, uint8_t type, void *buf, int len)
	if (!(fwd_info->p_ops && fwd_info->p_ops->write && fwd_info->ctxt))
		return -EIO;

	if (fwd_info->transport == TRANSPORT_GLINK) {
		buf_ptr = diagfwd_request_write_buf(fwd_info);
		if (buf_ptr)
			memcpy(buf_ptr, buf, len);
		else {
			DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
				 "diag: buffer not found for writing\n");
			return -EIO;
		}
	} else
		buf_ptr = buf;

	while (retry_count < max_retries) {
		err = 0;
		err = fwd_info->p_ops->write(fwd_info->ctxt, buf_ptr, len);
		err = fwd_info->p_ops->write(fwd_info->ctxt, buf, len);
		if (err && err != -ENODEV) {
			usleep_range(100000, 101000);
			retry_count++;
@@ -1122,9 +1092,7 @@ int diagfwd_write(uint8_t peripheral, uint8_t type, void *buf, int len)

	if (!err)
		fwd_info->write_bytes += len;
	else
		if (fwd_info->transport == TRANSPORT_GLINK)
			diagfwd_write_buffer_done(fwd_info, buf_ptr);

	return err;
}

@@ -1225,19 +1193,9 @@ int diagfwd_channel_open(struct diagfwd_info *fwd_info)
	fwd_info->ch_open = 1;
	diagfwd_buffers_init(fwd_info);

	/*
	 * Initialize buffers for glink supported
	 * peripherals only.
	 */
	if (fwd_info->transport == TRANSPORT_GLINK)
		diagfwd_write_buffers_init(fwd_info);

	if (fwd_info && fwd_info->c_ops && fwd_info->c_ops->open)
		fwd_info->c_ops->open(fwd_info);
	for (i = 0; i < NUM_WRITE_BUFFERS; i++) {
		if (fwd_info->buf_ptr[i])
			atomic_set(&fwd_info->buf_ptr[i]->in_busy, 0);
	}

	diagfwd_queue_read(fwd_info);
	DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "p: %d t: %d considered opened\n",
		 fwd_info->peripheral, fwd_info->type);
@@ -1270,10 +1228,6 @@ int diagfwd_channel_close(struct diagfwd_info *fwd_info)
	if (fwd_info->buf_2 && fwd_info->buf_2->data)
		atomic_set(&fwd_info->buf_2->in_busy, 0);

	for (i = 0; i < NUM_WRITE_BUFFERS; i++) {
		if (fwd_info->buf_ptr[i])
			atomic_set(&fwd_info->buf_ptr[i]->in_busy, 1);
	}
	DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "p: %d t: %d considered closed\n",
		 fwd_info->peripheral, fwd_info->type);
	mutex_unlock(&driver->diagfwd_channel_mutex[fwd_info->peripheral]);
@@ -1369,27 +1323,6 @@ void diagfwd_write_done(uint8_t peripheral, uint8_t type, int ctxt)
	diagfwd_queue_read(fwd_info);
}

int diagfwd_write_buffer_done(struct diagfwd_info *fwd_info, const void *ptr)
{

	int found = 0;
	int index = 0;
	unsigned long flags;

	if (!fwd_info || !ptr)
		return found;
	spin_lock_irqsave(&fwd_info->write_buf_lock, flags);
	for (index = 0; index < NUM_WRITE_BUFFERS; index++) {
		if (fwd_info->buf_ptr[index]->data == ptr) {
			atomic_set(&fwd_info->buf_ptr[index]->in_busy, 0);
			found = 1;
			break;
		}
	}
	spin_unlock_irqrestore(&fwd_info->write_buf_lock, flags);
	return found;
}

void diagfwd_channel_read(struct diagfwd_info *fwd_info)
{
	int err = 0;
@@ -1712,64 +1645,3 @@ static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info)
	mutex_unlock(&fwd_info->buf_mutex);
}
void diagfwd_write_buffers_init(struct diagfwd_info *fwd_info)
{
	unsigned long flags;
	int i;

	if (!fwd_info)
		return;

	if (!fwd_info->inited) {
		pr_err("diag: In %s, channel not inited, p: %d, t: %d\n",
		       __func__, fwd_info->peripheral, fwd_info->type);
		return;
	}

	spin_lock_irqsave(&fwd_info->write_buf_lock, flags);
	for (i = 0; i < NUM_WRITE_BUFFERS; i++) {
		if (!fwd_info->buf_ptr[i])
			fwd_info->buf_ptr[i] =
					kzalloc(sizeof(struct diagfwd_buf_t),
						GFP_ATOMIC);
		if (!fwd_info->buf_ptr[i])
			goto err;
		kmemleak_not_leak(fwd_info->buf_ptr[i]);
		if (!fwd_info->buf_ptr[i]->data) {
			fwd_info->buf_ptr[i]->data = kzalloc(PERIPHERAL_BUF_SZ,
								GFP_ATOMIC);
			if (!fwd_info->buf_ptr[i]->data)
				goto err;
			fwd_info->buf_ptr[i]->len = PERIPHERAL_BUF_SZ;
			kmemleak_not_leak(fwd_info->buf_ptr[i]->data);
		}
	}
	spin_unlock_irqrestore(&fwd_info->write_buf_lock, flags);
	return;

err:
	spin_unlock_irqrestore(&fwd_info->write_buf_lock, flags);
	pr_err("diag:unable to allocate write buffers\n");
	diagfwd_write_buffers_exit(fwd_info);

}

static void diagfwd_write_buffers_exit(struct diagfwd_info *fwd_info)
{
	unsigned long flags;
	int i;

	if (!fwd_info)
		return;

	spin_lock_irqsave(&fwd_info->write_buf_lock, flags);
	for (i = 0; i < NUM_WRITE_BUFFERS; i++) {
		if (fwd_info->buf_ptr[i]) {
			kfree(fwd_info->buf_ptr[i]->data);
			fwd_info->buf_ptr[i]->data = NULL;
			kfree(fwd_info->buf_ptr[i]);
			fwd_info->buf_ptr[i] = NULL;
		}
	}
	spin_unlock_irqrestore(&fwd_info->write_buf_lock, flags);
}
Loading