The snd_pcm_substream structure has a snd_dma_buffer structure. snd_dma_buffer looks like this:
struct snd_dma_buffer { struct snd_dma_device dev; /* device type */ unsigned char *area; /* virtual pointer */ dma_addr_t addr; /* physical address */ size_t bytes; /* buffer size in bytes */ void *private_data; /* private for allocator; don't touch */ };
snd_pcm_substream also has a snd_pcm_runtime structure, which looks like this:
struct snd_pcm_runtime { ...
/* -- DMA -- */ unsigned char *dma_area; /* DMA area */ dma_addr_t dma_addr; /* physical bus address (not accessible from main CPU) */ size_t dma_bytes; /* size of DMA area */
struct snd_dma_buffer *dma_buffer_p; /* allocated buffer */
Why the redundancy? Not only does snd_pcm_runtime have dma_area, dma_addr, and dma_bytes, but it also has a pointer to a dns_dma_buffer structure, which also has this information!
So given a snd_pcm_substream structure, you can obtain the physical address of the DMA buffer three ways:
substream->dma_buffer.addr substream->runtime->dma_addr substream->runtime->dma_buffer_p->addr
When will these three variable contain different values? If the answer is never, then why do they all exist?