0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/io-64-nonatomic-lo-hi.h>
0012 #include <linux/platform_device.h>
0013 #include <asm/unaligned.h>
0014 #include <sound/soc.h>
0015 #include <sound/sof.h>
0016 #include "sof-priv.h"
0017 #include "ops.h"
0018
0019
0020
0021
0022
0023
0024
0025
0026 void sof_io_write(struct snd_sof_dev *sdev, void __iomem *addr, u32 value)
0027 {
0028 writel(value, addr);
0029 }
0030 EXPORT_SYMBOL(sof_io_write);
0031
0032 u32 sof_io_read(struct snd_sof_dev *sdev, void __iomem *addr)
0033 {
0034 return readl(addr);
0035 }
0036 EXPORT_SYMBOL(sof_io_read);
0037
0038 void sof_io_write64(struct snd_sof_dev *sdev, void __iomem *addr, u64 value)
0039 {
0040 writeq(value, addr);
0041 }
0042 EXPORT_SYMBOL(sof_io_write64);
0043
0044 u64 sof_io_read64(struct snd_sof_dev *sdev, void __iomem *addr)
0045 {
0046 return readq(addr);
0047 }
0048 EXPORT_SYMBOL(sof_io_read64);
0049
0050
0051
0052
0053
0054 void sof_mailbox_write(struct snd_sof_dev *sdev, u32 offset,
0055 void *message, size_t bytes)
0056 {
0057 void __iomem *dest = sdev->bar[sdev->mailbox_bar] + offset;
0058
0059 memcpy_toio(dest, message, bytes);
0060 }
0061 EXPORT_SYMBOL(sof_mailbox_write);
0062
0063 void sof_mailbox_read(struct snd_sof_dev *sdev, u32 offset,
0064 void *message, size_t bytes)
0065 {
0066 void __iomem *src = sdev->bar[sdev->mailbox_bar] + offset;
0067
0068 memcpy_fromio(message, src, bytes);
0069 }
0070 EXPORT_SYMBOL(sof_mailbox_read);
0071
0072
0073
0074
0075
0076 int sof_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_type,
0077 u32 offset, void *src, size_t size)
0078 {
0079 int bar = snd_sof_dsp_get_bar_index(sdev, blk_type);
0080 const u8 *src_byte = src;
0081 void __iomem *dest;
0082 u32 affected_mask;
0083 u32 tmp;
0084 int m, n;
0085
0086 if (bar < 0)
0087 return bar;
0088
0089 dest = sdev->bar[bar] + offset;
0090
0091 m = size / 4;
0092 n = size % 4;
0093
0094
0095 __iowrite32_copy(dest, src, m);
0096
0097 if (n) {
0098 affected_mask = (1 << (8 * n)) - 1;
0099
0100
0101
0102
0103
0104 tmp = ioread32(dest + m * 4);
0105 tmp &= ~affected_mask;
0106
0107 tmp |= *(u32 *)(src_byte + m * 4) & affected_mask;
0108 iowrite32(tmp, dest + m * 4);
0109 }
0110
0111 return 0;
0112 }
0113 EXPORT_SYMBOL(sof_block_write);
0114
0115 int sof_block_read(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_type,
0116 u32 offset, void *dest, size_t size)
0117 {
0118 int bar = snd_sof_dsp_get_bar_index(sdev, blk_type);
0119
0120 if (bar < 0)
0121 return bar;
0122
0123 memcpy_fromio(dest, sdev->bar[bar] + offset, size);
0124
0125 return 0;
0126 }
0127 EXPORT_SYMBOL(sof_block_read);