Hello.
Pedanekar, Hemant wrote:
Add support for Texas Instuments Communication Port Programming Interface 4.1
(CPPI 4.1) used on OMAP-L137/DA830.
At this moment, only the DMA controller and queue manager are supported.
Support for the buffer manager is lacking but this chip doesn't have it
anyway.
Index: linux-davinci/arch/arm/mach-davinci/cppi41.c
===================================================================
--- /dev/null
+++ linux-davinci/arch/arm/mach-davinci/cppi41.c
@@ -0,0 +1,788 @@
+/*
[...]
+
+/* First 32 packet descriptors are reserved for unallocated memory
regions. */
+static u32 next_desc_index[CPPI41_NUM_QUEUE_MGR] = { 1 << 5 };
+static u8 next_mem_rgn[CPPI41_NUM_QUEUE_MGR];
+
+static struct {
+ size_t rgn_size;
+ void *virt_addr;
+ dma_addr_t phys_addr;
+ struct cppi41_queue_obj queue_obj;
+ u8 mem_rgn;
+} dma_teardown[CPPI41_NUM_DMA_BLOCK];
+
+/******************** CPPI 4.1 Functions (External Interface)
*****************/
+
+int __init cppi41_queue_mgr_init(u8 q_mgr, dma_addr_t rgn0_base, u16
rgn0_size)
+{
+ void __iomem *q_mgr_regs;
+ void *ptr;
+
+ if (q_mgr >= cppi41_num_queue_mgr)
+ return -EINVAL;
+
+ q_mgr_regs = cppi41_queue_mgr[q_mgr].q_mgr_rgn_base;
+
+ __raw_writel(rgn0_base, q_mgr_regs +
QMGR_LINKING_RAM_RGN0_BASE_REG);
+ DBG("Linking RAM region 0 base @ %p, value: %x\n",
+ q_mgr_regs + QMGR_LINKING_RAM_RGN0_BASE_REG,
+ __raw_readl(q_mgr_regs + QMGR_LINKING_RAM_RGN0_BASE_REG));
+
+ __raw_writel(rgn0_size, q_mgr_regs +
QMGR_LINKING_RAM_RGN0_SIZE_REG);
+ DBG("Linking RAM region 0 size @ %p, value: %x\n",
+ q_mgr_regs + QMGR_LINKING_RAM_RGN0_SIZE_REG,
+ __raw_readl(q_mgr_regs + QMGR_LINKING_RAM_RGN0_SIZE_REG));
+
+ ptr = dma_alloc_coherent(NULL, 0x10000 - rgn0_size * 4,
+ &linking_ram[q_mgr].phys_addr,
+ GFP_KERNEL | GFP_DMA);
[HP] Consider if region 2 allocation is really required always.
In context of DA830 -- yes, always.
Of course, this will need total number of descriptors in system to be known
beforehand.
Well, could add a function parameter...
+enum cppi41_rx_desc_type {
+ cppi41_rx_embed_desc,
+ cppi41_rx_host_desc,
+ cppi41_rx_mono_desc,
+};
+
+/**
+ * struct cppi41_rx_ch_cfg - Rx Channel Configuration
+ *
+ * Must be allocated and filled by the caller of
cppi41_rx_ch_configure().
+ *
+ * The same channel can be configured to receive different descripor type
+ * packets (not simaltaneously). When the Rx packets on a port need to be
sent
+ * to the SR, the channels default descriptor type is set to Embedded and
the
+ * Rx completion queue is set to the queue which CPU polls for input
packets.
+ * When in SR bypass mode, the same channel's default descriptor type
will be
+ * set to Host and the Rx completion queue set to one of the queues which
host
+ * can get interrupted on (via the Queuing proxy/accumulator). In this
example,
+ * the embedded mode configuration fetches free descriptor from the Free
+ * descriptor queue (as defined by struct cppi41_embed_pkt_cfg) and host
+ * mode configuration fetches free descriptors/buffers from the free
descriptor/
+ * buffer queue (as defined by struct cppi41_host_pkt_cfg).
+ *
+ * NOTE: There seems to be no separate configuration for teardown
completion
+ * descriptor. The assumption is rxQueue tuple is used for this purpose
as well.
+ */
[HP] Replace reference to SR with generic term ('embedded processor'?)
Embedded processor will be confusing, as DA830 itself is an embedded
processor. :-)
What SR stands for BTW?
+
+/*
+ * CPPI 4.1 Miscellaneous APIs
+ */
+
+/**
+ * cppi41_get_teardown_info - CPPI 4.1 teardown completion processing
function
+ *
+ * @addr: physical address of teardown descriptor
+ * @info: pointer to the teardown information word
+ *
+ * This function is called to complete the teardown processing on a
channel
+ * and provides teardown information from the teardown descriptor passed
to it.
+ * It also recycles the teardown descriptor back to the teardown
descriptor
+ * queue.
+ *
+ * Returns 0 if valid descriptor, -EINVAL otherwise.
+ */
+int cppi41_get_teardown_info(unsigned long addr, u32 *info);
[HP] A more specific name as this is not just a 'get' function?
Any idea? Note that it was called PAL_cppi4GetTdInfo() originally.
Thanks,
Hemant
WBR, Sergei
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source