Skip to content

Commit

Permalink
[media] saa7164: convert buffering structs to be more generic
Browse files Browse the repository at this point in the history
Current structs assume transport, making a number of changes to
switch to generic functions allowing a smoother integration
for the analog encoder.

Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Steven Toth authored and Mauro Carvalho Chehab committed Oct 21, 2010
1 parent 335961c commit add3f58
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 116 deletions.
6 changes: 3 additions & 3 deletions drivers/media/video/saa7164/saa7164-api.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

#include "saa7164.h"

int saa7164_api_transition_port(struct saa7164_tsport *port, u8 mode)
int saa7164_api_transition_port(struct saa7164_port *port, u8 mode)
{
int ret;

Expand Down Expand Up @@ -63,7 +63,7 @@ int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen)


int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,
struct saa7164_tsport *port,
struct saa7164_port *port,
tmComResTSFormatDescrHeader_t *tsfmt)
{
dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", tsfmt->bFormatIndex);
Expand Down Expand Up @@ -98,7 +98,7 @@ int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,

int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
{
struct saa7164_tsport *port = 0;
struct saa7164_port *port = 0;
u32 idx, next_offset;
int i;
tmComResDescrHeader_t *hdr, *t;
Expand Down
129 changes: 119 additions & 10 deletions drivers/media/video/saa7164/saa7164-buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,33 @@
| etc
*/

void saa7164_buffer_display(struct saa7164_buffer *buf)
{
struct saa7164_dev *dev = buf->port->dev;
int i;

dprintk(DBGLVL_BUF, "%s() buffer @ 0x%p nr=%d\n",
__func__, buf, buf->idx);
dprintk(DBGLVL_BUF, " pci_cpu @ 0x%p dma @ 0x%p len = 0x%x\n",
buf->cpu, (void *)buf->dma, buf->pci_size);
dprintk(DBGLVL_BUF, " pt_cpu @ 0x%p pt_dma @ 0x%p len = 0x%x\n",
buf->pt_cpu, (void *)buf->pt_dma, buf->pt_size);

/* Format the Page Table Entries to point into the data buffer */
for (i = 0 ; i < SAA7164_PT_ENTRIES; i++) {

dprintk(DBGLVL_BUF, " pt[%02d] = 0x%p -> 0x%llx\n",
i, buf->pt_cpu, (u64)*(buf->pt_cpu));

}
}
/* Allocate a new buffer structure and associated PCI space in bytes.
* len must be a multiple of sizeof(u64)
*/
struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_port *port,
u32 len)
{
tmHWStreamParameters_t *params = &port->hw_streamingparams;
struct saa7164_buffer *buf = 0;
struct saa7164_dev *dev = port->dev;
int i;
Expand All @@ -87,8 +108,11 @@ struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
goto ret;
}

buf->idx = -1;
buf->port = port;
buf->flags = SAA7164_BUFFER_FREE;
buf->pos = 0;
buf->actual_size = params->pitch * params->numberoflines;
/* TODO: arg len is being ignored */
buf->pci_size = SAA7164_PT_ENTRIES * 0x1000;
buf->pt_size = (SAA7164_PT_ENTRIES * sizeof(u64)) + 0x1000;
Expand All @@ -108,7 +132,8 @@ struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
memset(buf->cpu, 0xff, buf->pci_size);
memset(buf->pt_cpu, 0xff, buf->pt_size);

dprintk(DBGLVL_BUF, "%s() allocated buffer @ 0x%p\n", __func__, buf);
dprintk(DBGLVL_BUF, "%s() allocated buffer @ 0x%p\n",
__func__, buf);
dprintk(DBGLVL_BUF, " pci_cpu @ 0x%p dma @ 0x%08lx len = 0x%x\n",
buf->cpu, (long)buf->dma, buf->pci_size);
dprintk(DBGLVL_BUF, " pt_cpu @ 0x%p pt_dma @ 0x%08lx len = 0x%x\n",
Expand All @@ -133,26 +158,110 @@ struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
return buf;
}

int saa7164_buffer_dealloc(struct saa7164_tsport *port,
struct saa7164_buffer *buf)
int saa7164_buffer_dealloc(struct saa7164_buffer *buf)
{
struct saa7164_dev *dev;

if (!buf || !port)
if (!buf || !buf->port)
return SAA_ERR_BAD_PARAMETER;
dev = port->dev;
dev = buf->port->dev;

dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n", __func__, buf);
dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n",
__func__, buf);

if (buf->flags != SAA7164_BUFFER_FREE)
log_warn(" freeing a non-free buffer\n");

pci_free_consistent(port->dev->pci, buf->pci_size, buf->cpu, buf->dma);
pci_free_consistent(port->dev->pci, buf->pt_size, buf->pt_cpu,
buf->pt_dma);
pci_free_consistent(dev->pci, buf->pci_size, buf->cpu, buf->dma);
pci_free_consistent(dev->pci, buf->pt_size, buf->pt_cpu, buf->pt_dma);

kfree(buf);

return SAA_OK;
}

/* Write a buffer into the hardware */
int saa7164_buffer_activate(struct saa7164_buffer *buf, int i)
{
struct saa7164_port *port = buf->port;
struct saa7164_dev *dev = port->dev;

if ((i < 0) || (i >= port->hwcfg.buffercount))
return -EINVAL;

dprintk(DBGLVL_BUF, "%s(idx = %d)\n", __func__, i);

buf->idx = i; /* Note of which buffer list index position we occupy */
buf->flags = SAA7164_BUFFER_BUSY;
buf->pos = 0;

/* TODO: Review this in light of 32v64 assignments */
saa7164_writel(port->bufoffset + (sizeof(u32) * i), 0);
saa7164_writel(port->bufptr32h + ((sizeof(u32) * 2) * i), buf->pt_dma);
saa7164_writel(port->bufptr32l + ((sizeof(u32) * 2) * i), 0);

dprintk(DBGLVL_BUF, " buf[%d] offset 0x%llx (0x%x) "
"buf 0x%llx/%llx (0x%x/%x) nr=%d\n",
buf->idx,
(u64)port->bufoffset + (i * sizeof(u32)),
saa7164_readl(port->bufoffset + (sizeof(u32) * i)),
(u64)port->bufptr32h + ((sizeof(u32) * 2) * i),
(u64)port->bufptr32l + ((sizeof(u32) * 2) * i),
saa7164_readl(port->bufptr32h + ((sizeof(u32) * i) * 2)),
saa7164_readl(port->bufptr32l + ((sizeof(u32) * i) * 2)),
buf->idx);

return 0;
}

int saa7164_buffer_cfg_port(struct saa7164_port *port)
{
tmHWStreamParameters_t *params = &port->hw_streamingparams;
struct saa7164_dev *dev = port->dev;
struct saa7164_buffer *buf;
struct list_head *c, *n;
int i = 0;

dprintk(DBGLVL_BUF, "%s(port=%d)\n", __func__, port->nr);

saa7164_writel(port->bufcounter, 0);
saa7164_writel(port->pitch, params->pitch);
saa7164_writel(port->bufsize, params->pitch * params->numberoflines);

dprintk(DBGLVL_BUF, " configured:\n");
dprintk(DBGLVL_BUF, " lmmio 0x%p\n", dev->lmmio);
dprintk(DBGLVL_BUF, " bufcounter 0x%x = 0x%x\n", port->bufcounter,
saa7164_readl(port->bufcounter));

dprintk(DBGLVL_BUF, " pitch 0x%x = %d\n", port->pitch,
saa7164_readl(port->pitch));

dprintk(DBGLVL_BUF, " bufsize 0x%x = %d\n", port->bufsize,
saa7164_readl(port->bufsize));

dprintk(DBGLVL_BUF, " buffercount = %d\n", port->hwcfg.buffercount);
dprintk(DBGLVL_BUF, " bufoffset = 0x%x\n", port->bufoffset);
dprintk(DBGLVL_BUF, " bufptr32h = 0x%x\n", port->bufptr32h);
dprintk(DBGLVL_BUF, " bufptr32l = 0x%x\n", port->bufptr32l);

/* Poke the buffers and offsets into PCI space */
mutex_lock(&port->dmaqueue_lock);
list_for_each_safe(c, n, &port->dmaqueue.list) {
buf = list_entry(c, struct saa7164_buffer, list);

if (buf->flags != SAA7164_BUFFER_FREE)
BUG();

/* Place the buffer in the h/w queue */
saa7164_buffer_activate(buf, i);

/* Don't exceed the device maximum # bufs */
if (i++ > port->hwcfg.buffercount)
BUG();

}
mutex_unlock(&port->dmaqueue_lock);

return 0;
}

12 changes: 5 additions & 7 deletions drivers/media/video/saa7164/saa7164-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,15 @@ static void saa7164_work_cmdhandler(struct work_struct *w)

static void saa7164_buffer_deliver(struct saa7164_buffer *buf)
{
struct saa7164_tsport *port = buf->port;
struct saa7164_port *port = buf->port;

/* Feed the transport payload into the kernel demux */
dvb_dmx_swfilter_packets(&port->dvb.demux, (u8 *)buf->cpu,
SAA7164_TS_NUMBER_OF_LINES);

}

static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port)
static irqreturn_t saa7164_irq_ts(struct saa7164_port *port)
{
struct saa7164_dev *dev = port->dev;
struct saa7164_buffer *buf;
Expand All @@ -107,7 +107,7 @@ static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port)
if (i++ > port->hwcfg.buffercount)
BUG();

if (buf->nr == rp) {
if (buf->idx == rp) {
/* Found the buffer, deal with it */
dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d\n",
__func__, wp, rp);
Expand Down Expand Up @@ -446,20 +446,18 @@ static int saa7164_dev_setup(struct saa7164_dev *dev)
/* Transport port A Defaults / setup */
dev->ts1.dev = dev;
dev->ts1.nr = 0;
dev->ts1.type = SAA7164_MPEG_UNDEFINED;
mutex_init(&dev->ts1.dvb.lock);
INIT_LIST_HEAD(&dev->ts1.dmaqueue.list);
INIT_LIST_HEAD(&dev->ts1.dummy_dmaqueue.list);
mutex_init(&dev->ts1.dmaqueue_lock);
mutex_init(&dev->ts1.dummy_dmaqueue_lock);

/* Transport port B Defaults / setup */
dev->ts2.dev = dev;
dev->ts2.nr = 1;
dev->ts2.type = SAA7164_MPEG_UNDEFINED;
mutex_init(&dev->ts2.dvb.lock);
INIT_LIST_HEAD(&dev->ts2.dmaqueue.list);
INIT_LIST_HEAD(&dev->ts2.dummy_dmaqueue.list);
mutex_init(&dev->ts2.dmaqueue_lock);
mutex_init(&dev->ts2.dummy_dmaqueue_lock);

if (get_resources(dev) < 0) {
printk(KERN_ERR "CORE %s No more PCIe resources for "
Expand Down
Loading

0 comments on commit add3f58

Please sign in to comment.