forked from Minki/linux
ASoC: SOF: Split up utils.c into sof-utils and iomem-utils
The utils.c contains wrappers and implementation for accessing iomem mapped regions and a single unrelated function to create a compressed page table from snd_dma_buffer for firmware use. The latter is used by the PCM and the dma trace code and it needs to be moved to a generic source/header for the client conversion to be possible. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Link: https://lore.kernel.org/r/20220210150525.30756-5-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ab3a2189a3
commit
ee8443050b
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
|
||||
|
||||
snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\
|
||||
control.o trace.o utils.o sof-audio.o stream-ipc.o
|
||||
control.o trace.o iomem-utils.o sof-audio.o stream-ipc.o
|
||||
|
||||
snd-sof-$(CONFIG_SND_SOC_SOF_DEBUG_PROBES) += sof-probes.o
|
||||
snd-sof-$(CONFIG_SND_SOC_SOF_COMPRESS) += compress.o
|
||||
@ -12,9 +12,12 @@ snd-sof-of-objs := sof-of-dev.o
|
||||
|
||||
snd-sof-nocodec-objs := nocodec.o
|
||||
|
||||
snd-sof-utils-objs := sof-utils.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SOF) += snd-sof-utils.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SOF_ACPI_DEV) += snd-sof-acpi.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_OF_DEV) += snd-sof-of.o
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <sound/compress_driver.h>
|
||||
#include "sof-audio.h"
|
||||
#include "sof-priv.h"
|
||||
#include "sof-utils.h"
|
||||
|
||||
static void sof_set_transferred_bytes(struct snd_compr_tstamp *tstamp,
|
||||
u64 host_pos, u64 buffer_size)
|
||||
|
@ -3,7 +3,7 @@
|
||||
// This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
// redistributing this file, you may do so under either license.
|
||||
//
|
||||
// Copyright(c) 2018 Intel Corporation. All rights reserved.
|
||||
// Copyright(c) 2018-2022 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Keyon Jie <yang.jie@linux.intel.com>
|
||||
//
|
||||
@ -125,62 +125,3 @@ int sof_block_read(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_type,
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sof_block_read);
|
||||
|
||||
/*
|
||||
* Generic buffer page table creation.
|
||||
* Take the each physical page address and drop the least significant unused
|
||||
* bits from each (based on PAGE_SIZE). Then pack valid page address bits
|
||||
* into compressed page table.
|
||||
*/
|
||||
|
||||
int snd_sof_create_page_table(struct device *dev,
|
||||
struct snd_dma_buffer *dmab,
|
||||
unsigned char *page_table, size_t size)
|
||||
{
|
||||
int i, pages;
|
||||
|
||||
pages = snd_sgbuf_aligned_pages(size);
|
||||
|
||||
dev_dbg(dev, "generating page table for %p size 0x%zx pages %d\n",
|
||||
dmab->area, size, pages);
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
/*
|
||||
* The number of valid address bits for each page is 20.
|
||||
* idx determines the byte position within page_table
|
||||
* where the current page's address is stored
|
||||
* in the compressed page_table.
|
||||
* This can be calculated by multiplying the page number by 2.5.
|
||||
*/
|
||||
u32 idx = (5 * i) >> 1;
|
||||
u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT;
|
||||
u8 *pg_table;
|
||||
|
||||
dev_vdbg(dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn);
|
||||
|
||||
pg_table = (u8 *)(page_table + idx);
|
||||
|
||||
/*
|
||||
* pagetable compression:
|
||||
* byte 0 byte 1 byte 2 byte 3 byte 4 byte 5
|
||||
* ___________pfn 0__________ __________pfn 1___________ _pfn 2...
|
||||
* .... .... .... .... .... .... .... .... .... .... ....
|
||||
* It is created by:
|
||||
* 1. set current location to 0, PFN index i to 0
|
||||
* 2. put pfn[i] at current location in Little Endian byte order
|
||||
* 3. calculate an intermediate value as
|
||||
* x = (pfn[i+1] << 4) | (pfn[i] & 0xf)
|
||||
* 4. put x at offset (current location + 2) in LE byte order
|
||||
* 5. increment current location by 5 bytes, increment i by 2
|
||||
* 6. continue to (2)
|
||||
*/
|
||||
if (i & 1)
|
||||
put_unaligned_le32((pg_table[0] & 0xf) | pfn << 4,
|
||||
pg_table);
|
||||
else
|
||||
put_unaligned_le32(pfn, pg_table);
|
||||
}
|
||||
|
||||
return pages;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sof_create_page_table);
|
@ -19,6 +19,7 @@
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
|
||||
#include "sof-probes.h"
|
||||
#endif
|
||||
#include "sof-utils.h"
|
||||
|
||||
/* Create DMA buffer page table for DSP */
|
||||
static int create_page_table(struct snd_soc_component *component,
|
||||
|
@ -502,10 +502,6 @@ void snd_sof_complete(struct device *dev);
|
||||
|
||||
void snd_sof_new_platform_drv(struct snd_sof_dev *sdev);
|
||||
|
||||
int snd_sof_create_page_table(struct device *dev,
|
||||
struct snd_dma_buffer *dmab,
|
||||
unsigned char *page_table, size_t size);
|
||||
|
||||
/*
|
||||
* Firmware loading.
|
||||
*/
|
||||
|
77
sound/soc/sof/sof-utils.c
Normal file
77
sound/soc/sof/sof-utils.c
Normal file
@ -0,0 +1,77 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
|
||||
//
|
||||
// This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
// redistributing this file, you may do so under either license.
|
||||
//
|
||||
// Copyright(c) 2018-2022 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Keyon Jie <yang.jie@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||
#include <linux/device.h>
|
||||
#include <sound/memalloc.h>
|
||||
#include <linux/module.h>
|
||||
#include "sof-utils.h"
|
||||
|
||||
/*
|
||||
* Generic buffer page table creation.
|
||||
* Take the each physical page address and drop the least significant unused
|
||||
* bits from each (based on PAGE_SIZE). Then pack valid page address bits
|
||||
* into compressed page table.
|
||||
*/
|
||||
|
||||
int snd_sof_create_page_table(struct device *dev,
|
||||
struct snd_dma_buffer *dmab,
|
||||
unsigned char *page_table, size_t size)
|
||||
{
|
||||
int i, pages;
|
||||
|
||||
pages = snd_sgbuf_aligned_pages(size);
|
||||
|
||||
dev_dbg(dev, "generating page table for %p size 0x%zx pages %d\n",
|
||||
dmab->area, size, pages);
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
/*
|
||||
* The number of valid address bits for each page is 20.
|
||||
* idx determines the byte position within page_table
|
||||
* where the current page's address is stored
|
||||
* in the compressed page_table.
|
||||
* This can be calculated by multiplying the page number by 2.5.
|
||||
*/
|
||||
u32 idx = (5 * i) >> 1;
|
||||
u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT;
|
||||
u8 *pg_table;
|
||||
|
||||
dev_vdbg(dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn);
|
||||
|
||||
pg_table = (u8 *)(page_table + idx);
|
||||
|
||||
/*
|
||||
* pagetable compression:
|
||||
* byte 0 byte 1 byte 2 byte 3 byte 4 byte 5
|
||||
* ___________pfn 0__________ __________pfn 1___________ _pfn 2...
|
||||
* .... .... .... .... .... .... .... .... .... .... ....
|
||||
* It is created by:
|
||||
* 1. set current location to 0, PFN index i to 0
|
||||
* 2. put pfn[i] at current location in Little Endian byte order
|
||||
* 3. calculate an intermediate value as
|
||||
* x = (pfn[i+1] << 4) | (pfn[i] & 0xf)
|
||||
* 4. put x at offset (current location + 2) in LE byte order
|
||||
* 5. increment current location by 5 bytes, increment i by 2
|
||||
* 6. continue to (2)
|
||||
*/
|
||||
if (i & 1)
|
||||
put_unaligned_le32((pg_table[0] & 0xf) | pfn << 4,
|
||||
pg_table);
|
||||
else
|
||||
put_unaligned_le32(pfn, pg_table);
|
||||
}
|
||||
|
||||
return pages;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sof_create_page_table);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
19
sound/soc/sof/sof-utils.h
Normal file
19
sound/soc/sof/sof-utils.h
Normal file
@ -0,0 +1,19 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
|
||||
/*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* Copyright(c) 2022 Intel Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __SOC_SOF_UTILS_H
|
||||
#define __SOC_SOF_UTILS_H
|
||||
|
||||
struct snd_dma_buffer;
|
||||
struct device;
|
||||
|
||||
int snd_sof_create_page_table(struct device *dev,
|
||||
struct snd_dma_buffer *dmab,
|
||||
unsigned char *page_table, size_t size);
|
||||
|
||||
#endif
|
@ -12,6 +12,7 @@
|
||||
#include <linux/sched/signal.h>
|
||||
#include "sof-priv.h"
|
||||
#include "ops.h"
|
||||
#include "sof-utils.h"
|
||||
|
||||
#define TRACE_FILTER_ELEMENTS_PER_ENTRY 4
|
||||
#define TRACE_FILTER_MAX_CONFIG_STRING_LENGTH 1024
|
||||
|
Loading…
Reference in New Issue
Block a user