2007-08-12 03:14:16

by Michael Bourgeous

[permalink] [raw]
Subject: Driver-level memory management

Hello everyone,

I'm working on a driver for older HDTV cards based on the TL880 chip.
These cards typically have 16MB of their own memory, which is
available to me over the PCI bus. Various functions of the card
require me to manage this memory, allocating and freeing chunks of it
as necessary. I can easily include my own allocation and management
code, but I'm sure this is a problem that has been solved before.
I've found two interesting sets of functions, the kmem_cache_* and
mempool_* functions, but neither does quite what I'm looking for. So,
in a sentence, my question is this: Does the kernel provide memory
pool functions that would allow me to call the appropriate equivalent
of kmalloc/kfree, using the card's memory as the pool instead of
actually allocating physical or virtual memory?

By the way, I am not subscribed to the LKML, so please include my
address in any responses.

Thanks,
Mike Bourgeous
http://myhd.sf.net/


2007-08-12 05:05:23

by Paul Mundt

[permalink] [raw]
Subject: Re: Driver-level memory management

On Sat, Aug 11, 2007 at 09:14:00PM -0600, Michael Bourgeous wrote:
> I'm working on a driver for older HDTV cards based on the TL880 chip.
> These cards typically have 16MB of their own memory, which is
> available to me over the PCI bus. Various functions of the card
> require me to manage this memory, allocating and freeing chunks of it
> as necessary. I can easily include my own allocation and management
> code, but I'm sure this is a problem that has been solved before.
> I've found two interesting sets of functions, the kmem_cache_* and
> mempool_* functions, but neither does quite what I'm looking for. So,
> in a sentence, my question is this: Does the kernel provide memory
> pool functions that would allow me to call the appropriate equivalent
> of kmalloc/kfree, using the card's memory as the pool instead of
> actually allocating physical or virtual memory?
>
Many platforms have similar requirements for DMA, both in terms of bounce
buffers and consistent allocations. If you're looking at this
specifically for DMA, then things like dma_declare_coherent_memory() and
the corresponding alloc/free routines that go along with it will do what
you need. If you require something more generalized, you can still
abstract what you need fairly trivially.

There are a few examples of bitmap based region management in the kernel
you can look at. arch/i386/kernel/pci-dma.c implements the aforementioned
DMA ops, and arch/sh/kernel/cpu/sh4/sq.c does something similar, albeit
with a larger address range (64MB). A simple bitmap approach from one or
the other should work fine for your 16MB case.

2007-08-13 00:37:52

by Ingo Oeser

[permalink] [raw]
Subject: Re: Driver-level memory management

Hi Michael,

On Sunday 12 August 2007, Michael Bourgeous wrote:
> I'm working on a driver for older HDTV cards based on the TL880 chip.
> These cards typically have 16MB of their own memory, which is
> available to me over the PCI bus. Various functions of the card
> require me to manage this memory, allocating and freeing chunks of it
> as necessary. I can easily include my own allocation and management
> code,

Ok.

> but I'm sure this is a problem that has been solved before.

Yes!

in your Kconfig

select GENERIC_ALLOCATOR

in your driver.c

#include <linux/genalloc.h>

Code is in lib/genalloc.c, if you like to take a look.

Memory for MANAGING free/allocated space is NOT taken
from your on-card memory! That allocator is explicitly developed
for such use cases.

Happy hacking!


Best regards

Ingo Oeser