/*
 * Author: Tzu-Jung Lee <tjlee@ambarella.com>
 *
 * Copyright (C) 2012-2012, Ambarella, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include <linux/platform_device.h>

#include <linux/slab.h>
#include <linux/virtio_ids.h>
#include <linux/rpmsg.h>
#include <linux/dma-mapping.h>

#include <plat/remoteproc.h>
#include <plat/remoteproc_cfg.h>

/*
 * The gen_rsc_table_* functions below fabricate the "resource table", which is
 * used to initialize the vring configurations by the RPROC subsystem.
 *
 * The tables were originally meant to be loaded from ELF files on filesystem.
 * It's a flexible and generic design, but requires extra maintenance out side
 * the kernel space. So we currently code it plainly and directly here.
 *
 * The following illustrate the layout and structure of the table we use.
 * Watch out the "sizeof()", since most of the structures here are embedded with
 * variable-length array.
 *
 *  0x0000  &table
 *
 *          < sizeof(*table) >
 *          < sizeof(u32) * table->num >
 *
 *  0x0014  &hdr (&table->offset)
 *
 *          < sizeof(*hdr) >
 *
 *  0x0018  &vdev (&hdr->data)
 *
 *          < sizeof(*vdev) >
 *
 *  0x0030  &vdev->ring[0] (&hdr->data)
 *
 *          < sizeof(*vring) >
 *
 *  0x0044  &vdev->ring[1];
 *
 *         < sizeof(*vring) >
 *  0x0058
 */

static struct resource_table *gen_rsc_table_ca9_b(int *tablesz)
{
	struct resource_table		*table;
	struct fw_rsc_hdr		*hdr;
	struct fw_rsc_vdev		*vdev;
	struct fw_rsc_vdev_vring	*vring;

	*tablesz		= sizeof(*table) + sizeof(u32) * 1
				    + sizeof(*hdr) + sizeof(*vdev)
				    + sizeof(*vring) * 2;

	table			= kzalloc((*tablesz), GFP_KERNEL);
	table->ver		= 1;
	table->num		= 1;
	table->offset[0]	= sizeof(*table) + sizeof(u32) * table->num;

	hdr			= (void*)table + table->offset[0];
	hdr->type		= RSC_VDEV;
	vdev			= (void*)&hdr->data;
	vdev->id		= VIRTIO_ID_RPMSG;
	vdev->notifyid		= 123;
	vdev->dfeatures		= (1 << VIRTIO_RPMSG_F_NS);
	vdev->config_len	= 0;
	vdev->num_of_vrings	= 2;

	vring			= (void*)&vdev->vring[0];
	vring->da		= VRING_CA9_B_TO_A;
	vring->align		= PAGE_SIZE;
	vring->num		= RPMSG_NUM_BUFS >> 1;
	vring->notifyid		= 111;

	vring			= (void*)&vdev->vring[1];
	vring->da		= VRING_CA9_A_TO_B;
	vring->align		= PAGE_SIZE;
	vring->num		= RPMSG_NUM_BUFS >> 1;
	vring->notifyid		= 112;

	return table;
}

static struct resource_table *gen_rsc_table_arm11(int *tablesz)
{
	struct resource_table		*table;
	struct fw_rsc_hdr		*hdr;
	struct fw_rsc_vdev		*vdev;
	struct fw_rsc_vdev_vring	*vring;

	*tablesz		= sizeof(*table) + sizeof(u32) * 1
				    + sizeof(*hdr) + sizeof(*vdev)
				    + sizeof(*vring) * 2;

	table			= kzalloc((*tablesz), GFP_KERNEL);
	table->ver		= 1;
	table->num		= 1;
	table->offset[0]	= sizeof(*table) + sizeof(u32) * table->num;

	hdr			= (void*)table + table->offset[0];
	hdr->type		= RSC_VDEV;
	vdev			= (void*)&hdr->data;
	vdev->id		= VIRTIO_ID_RPMSG;
	vdev->notifyid		= 124;
	vdev->dfeatures		= (1 << VIRTIO_RPMSG_F_NS);
	vdev->config_len	= 0;
	vdev->num_of_vrings	= 2;

	vring			= (void*)&vdev->vring[0];
	vring->da		= VRING_ARM11_TO_CA9_A;
	vring->align		= PAGE_SIZE;
	vring->num		= RPMSG_NUM_BUFS >> 1;
	vring->notifyid		= 111;

	vring			= (void*)&vdev->vring[1];
	vring->da		= VRING_CA9_A_TO_ARM11;
	vring->align		= PAGE_SIZE;
	vring->num		= RPMSG_NUM_BUFS >> 1;
	vring->notifyid		= 112;

	return table;
}

static struct ambarella_rproc_pdata pdata_ca9_b = {
	.name			= "ca9_a_and_b",
	.firmware		= "dummy",
	.svq_tx_irq		= VRING_CA9_A_TO_B_CLNT_IRQ,
	.svq_rx_irq		= VRING_CA9_A_TO_B_HOST_IRQ,
	.rvq_tx_irq		= VRING_CA9_B_TO_A_CLNT_IRQ,
	.rvq_rx_irq		= VRING_CA9_B_TO_A_HOST_IRQ,
	.ops			= NULL,
	.buf_addr_pa		= VRING_BUF_CA9_A_AND_B,
	.gen_rsc_table		= gen_rsc_table_ca9_b,
};

struct platform_device ambarella_rproc_ca9_a_and_b_dev = {
	.name			= "ca9_a_and_b",
	.id			= VIRTIO_ID_RPMSG,
	.resource		= NULL,
	.num_resources		= 0,
	.dev			= {
		.platform_data		= &pdata_ca9_b,
		.dma_mask		= &ambarella_dmamask,
		.coherent_dma_mask	= DMA_BIT_MASK(32),
	},
};

static struct ambarella_rproc_pdata pdata_arm11 = {
	.name			= "ca9_a_and_arm11",
	.firmware		= "dummy",
	.svq_tx_irq		= -VRING_CA9_A_TO_ARM11_CLNT_IRQ,
	.svq_rx_irq		= VRING_CA9_A_TO_ARM11_HOST_IRQ,
	.rvq_tx_irq		= -VRING_ARM11_TO_CA9_A_CLNT_IRQ,
	.rvq_rx_irq		= VRING_ARM11_TO_CA9_A_HOST_IRQ,
	.ops			= NULL,
	.buf_addr_pa		= VRING_BUF_CA9_A_AND_ARM11,
	.gen_rsc_table		= gen_rsc_table_arm11,
};

struct platform_device ambarella_rproc_ca9_a_and_arm11_dev = {
	.name			= "ca9_a_and_arm11",
	.id	      	  	= VIRTIO_ID_RPMSG,
	.resource     	  	= NULL,
	.num_resources		= 0,
	.dev			= {
		.platform_data		= &pdata_arm11,
		.dma_mask		= &ambarella_dmamask,
		.coherent_dma_mask	= DMA_BIT_MASK(32),
	},
};
