Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os 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>

authored by

Peter Ujfalusi and committed by
Mark Brown
ee844305 ab3a2189

+104 -65
+4 -1
sound/soc/sof/Makefile
··· 1 1 # SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2 2 3 3 snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\ 4 - control.o trace.o utils.o sof-audio.o stream-ipc.o 4 + control.o trace.o iomem-utils.o sof-audio.o stream-ipc.o 5 5 6 6 snd-sof-$(CONFIG_SND_SOC_SOF_DEBUG_PROBES) += sof-probes.o 7 7 snd-sof-$(CONFIG_SND_SOC_SOF_COMPRESS) += compress.o ··· 12 12 13 13 snd-sof-nocodec-objs := nocodec.o 14 14 15 + snd-sof-utils-objs := sof-utils.o 16 + 15 17 obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o 16 18 obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o 17 19 20 + obj-$(CONFIG_SND_SOC_SOF) += snd-sof-utils.o 18 21 19 22 obj-$(CONFIG_SND_SOC_SOF_ACPI_DEV) += snd-sof-acpi.o 20 23 obj-$(CONFIG_SND_SOC_SOF_OF_DEV) += snd-sof-of.o
+1
sound/soc/sof/compress.c
··· 9 9 #include <sound/compress_driver.h> 10 10 #include "sof-audio.h" 11 11 #include "sof-priv.h" 12 + #include "sof-utils.h" 12 13 13 14 static void sof_set_transferred_bytes(struct snd_compr_tstamp *tstamp, 14 15 u64 host_pos, u64 buffer_size)
+1
sound/soc/sof/pcm.c
··· 19 19 #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES) 20 20 #include "sof-probes.h" 21 21 #endif 22 + #include "sof-utils.h" 22 23 23 24 /* Create DMA buffer page table for DSP */ 24 25 static int create_page_table(struct snd_soc_component *component,
-4
sound/soc/sof/sof-priv.h
··· 502 502 503 503 void snd_sof_new_platform_drv(struct snd_sof_dev *sdev); 504 504 505 - int snd_sof_create_page_table(struct device *dev, 506 - struct snd_dma_buffer *dmab, 507 - unsigned char *page_table, size_t size); 508 - 509 505 /* 510 506 * Firmware loading. 511 507 */
+77
sound/soc/sof/sof-utils.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2 + // 3 + // This file is provided under a dual BSD/GPLv2 license. When using or 4 + // redistributing this file, you may do so under either license. 5 + // 6 + // Copyright(c) 2018-2022 Intel Corporation. All rights reserved. 7 + // 8 + // Author: Keyon Jie <yang.jie@linux.intel.com> 9 + // 10 + 11 + #include <asm/unaligned.h> 12 + #include <linux/io-64-nonatomic-lo-hi.h> 13 + #include <linux/device.h> 14 + #include <sound/memalloc.h> 15 + #include <linux/module.h> 16 + #include "sof-utils.h" 17 + 18 + /* 19 + * Generic buffer page table creation. 20 + * Take the each physical page address and drop the least significant unused 21 + * bits from each (based on PAGE_SIZE). Then pack valid page address bits 22 + * into compressed page table. 23 + */ 24 + 25 + int snd_sof_create_page_table(struct device *dev, 26 + struct snd_dma_buffer *dmab, 27 + unsigned char *page_table, size_t size) 28 + { 29 + int i, pages; 30 + 31 + pages = snd_sgbuf_aligned_pages(size); 32 + 33 + dev_dbg(dev, "generating page table for %p size 0x%zx pages %d\n", 34 + dmab->area, size, pages); 35 + 36 + for (i = 0; i < pages; i++) { 37 + /* 38 + * The number of valid address bits for each page is 20. 39 + * idx determines the byte position within page_table 40 + * where the current page's address is stored 41 + * in the compressed page_table. 42 + * This can be calculated by multiplying the page number by 2.5. 43 + */ 44 + u32 idx = (5 * i) >> 1; 45 + u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT; 46 + u8 *pg_table; 47 + 48 + dev_vdbg(dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn); 49 + 50 + pg_table = (u8 *)(page_table + idx); 51 + 52 + /* 53 + * pagetable compression: 54 + * byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 55 + * ___________pfn 0__________ __________pfn 1___________ _pfn 2... 56 + * .... .... .... .... .... .... .... .... .... .... .... 57 + * It is created by: 58 + * 1. set current location to 0, PFN index i to 0 59 + * 2. put pfn[i] at current location in Little Endian byte order 60 + * 3. calculate an intermediate value as 61 + * x = (pfn[i+1] << 4) | (pfn[i] & 0xf) 62 + * 4. put x at offset (current location + 2) in LE byte order 63 + * 5. increment current location by 5 bytes, increment i by 2 64 + * 6. continue to (2) 65 + */ 66 + if (i & 1) 67 + put_unaligned_le32((pg_table[0] & 0xf) | pfn << 4, 68 + pg_table); 69 + else 70 + put_unaligned_le32(pfn, pg_table); 71 + } 72 + 73 + return pages; 74 + } 75 + EXPORT_SYMBOL(snd_sof_create_page_table); 76 + 77 + MODULE_LICENSE("Dual BSD/GPL");
+19
sound/soc/sof/sof-utils.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2 + /* 3 + * This file is provided under a dual BSD/GPLv2 license. When using or 4 + * redistributing this file, you may do so under either license. 5 + * 6 + * Copyright(c) 2022 Intel Corporation. All rights reserved. 7 + */ 8 + 9 + #ifndef __SOC_SOF_UTILS_H 10 + #define __SOC_SOF_UTILS_H 11 + 12 + struct snd_dma_buffer; 13 + struct device; 14 + 15 + int snd_sof_create_page_table(struct device *dev, 16 + struct snd_dma_buffer *dmab, 17 + unsigned char *page_table, size_t size); 18 + 19 + #endif
+1
sound/soc/sof/trace.c
··· 12 12 #include <linux/sched/signal.h> 13 13 #include "sof-priv.h" 14 14 #include "ops.h" 15 + #include "sof-utils.h" 15 16 16 17 #define TRACE_FILTER_ELEMENTS_PER_ENTRY 4 17 18 #define TRACE_FILTER_MAX_CONFIG_STRING_LENGTH 1024
+1 -60
sound/soc/sof/utils.c sound/soc/sof/iomem-utils.c
··· 3 3 // This file is provided under a dual BSD/GPLv2 license. When using or 4 4 // redistributing this file, you may do so under either license. 5 5 // 6 - // Copyright(c) 2018 Intel Corporation. All rights reserved. 6 + // Copyright(c) 2018-2022 Intel Corporation. All rights reserved. 7 7 // 8 8 // Author: Keyon Jie <yang.jie@linux.intel.com> 9 9 // ··· 125 125 return 0; 126 126 } 127 127 EXPORT_SYMBOL(sof_block_read); 128 - 129 - /* 130 - * Generic buffer page table creation. 131 - * Take the each physical page address and drop the least significant unused 132 - * bits from each (based on PAGE_SIZE). Then pack valid page address bits 133 - * into compressed page table. 134 - */ 135 - 136 - int snd_sof_create_page_table(struct device *dev, 137 - struct snd_dma_buffer *dmab, 138 - unsigned char *page_table, size_t size) 139 - { 140 - int i, pages; 141 - 142 - pages = snd_sgbuf_aligned_pages(size); 143 - 144 - dev_dbg(dev, "generating page table for %p size 0x%zx pages %d\n", 145 - dmab->area, size, pages); 146 - 147 - for (i = 0; i < pages; i++) { 148 - /* 149 - * The number of valid address bits for each page is 20. 150 - * idx determines the byte position within page_table 151 - * where the current page's address is stored 152 - * in the compressed page_table. 153 - * This can be calculated by multiplying the page number by 2.5. 154 - */ 155 - u32 idx = (5 * i) >> 1; 156 - u32 pfn = snd_sgbuf_get_addr(dmab, i * PAGE_SIZE) >> PAGE_SHIFT; 157 - u8 *pg_table; 158 - 159 - dev_vdbg(dev, "pfn i %i idx %d pfn %x\n", i, idx, pfn); 160 - 161 - pg_table = (u8 *)(page_table + idx); 162 - 163 - /* 164 - * pagetable compression: 165 - * byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 166 - * ___________pfn 0__________ __________pfn 1___________ _pfn 2... 167 - * .... .... .... .... .... .... .... .... .... .... .... 168 - * It is created by: 169 - * 1. set current location to 0, PFN index i to 0 170 - * 2. put pfn[i] at current location in Little Endian byte order 171 - * 3. calculate an intermediate value as 172 - * x = (pfn[i+1] << 4) | (pfn[i] & 0xf) 173 - * 4. put x at offset (current location + 2) in LE byte order 174 - * 5. increment current location by 5 bytes, increment i by 2 175 - * 6. continue to (2) 176 - */ 177 - if (i & 1) 178 - put_unaligned_le32((pg_table[0] & 0xf) | pfn << 4, 179 - pg_table); 180 - else 181 - put_unaligned_le32(pfn, pg_table); 182 - } 183 - 184 - return pages; 185 - } 186 - EXPORT_SYMBOL(snd_sof_create_page_table);