linux/sound/soc/sof/sof-priv.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0 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 Intel Corporation. All rights reserved.
   7 *
   8 * Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
   9 */
  10
  11#ifndef __SOUND_SOC_SOF_PRIV_H
  12#define __SOUND_SOC_SOF_PRIV_H
  13
  14#include <linux/device.h>
  15
  16#include <sound/hdaudio.h>
  17#include <sound/soc.h>
  18
  19#include <sound/sof.h>
  20#include <sound/sof/stream.h> /* needs to be included before control.h */
  21#include <sound/sof/control.h>
  22#include <sound/sof/dai.h>
  23#include <sound/sof/info.h>
  24#include <sound/sof/pm.h>
  25#include <sound/sof/topology.h>
  26#include <sound/sof/trace.h>
  27
  28#include <uapi/sound/sof/fw.h>
  29
  30/* debug flags */
  31#define SOF_DBG_REGS    BIT(1)
  32#define SOF_DBG_MBOX    BIT(2)
  33#define SOF_DBG_TEXT    BIT(3)
  34#define SOF_DBG_PCI     BIT(4)
  35
  36/* max BARs mmaped devices can use */
  37#define SND_SOF_BARS    8
  38
  39/* time in ms for runtime suspend delay */
  40#define SND_SOF_SUSPEND_DELAY_MS        2000
  41
  42/* DMA buffer size for trace */
  43#define DMA_BUF_SIZE_FOR_TRACE (PAGE_SIZE * 16)
  44
  45/* max number of FE PCMs before BEs */
  46#define SOF_BE_PCM_BASE         16
  47
  48#define SOF_IPC_DSP_REPLY               0
  49#define SOF_IPC_HOST_REPLY              1
  50
  51/* convenience constructor for DAI driver streams */
  52#define SOF_DAI_STREAM(sname, scmin, scmax, srates, sfmt) \
  53        {.stream_name = sname, .channels_min = scmin, .channels_max = scmax, \
  54         .rates = srates, .formats = sfmt}
  55
  56#define SOF_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
  57        SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_FLOAT)
  58
  59#define ENABLE_DEBUGFS_CACHEBUF \
  60        (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE) || \
  61         IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST))
  62
  63#define DMA_CHAN_INVALID        0xFFFFFFFF
  64
  65struct snd_sof_dev;
  66struct snd_sof_ipc_msg;
  67struct snd_sof_ipc;
  68struct snd_sof_debugfs_map;
  69struct snd_soc_tplg_ops;
  70struct snd_soc_component;
  71struct snd_sof_pdata;
  72
  73/*
  74 * SOF DSP HW abstraction operations.
  75 * Used to abstract DSP HW architecture and any IO busses between host CPU
  76 * and DSP device(s).
  77 */
  78struct snd_sof_dsp_ops {
  79
  80        /* probe and remove */
  81        int (*probe)(struct snd_sof_dev *sof_dev); /* mandatory */
  82        int (*remove)(struct snd_sof_dev *sof_dev); /* optional */
  83
  84        /* DSP core boot / reset */
  85        int (*run)(struct snd_sof_dev *sof_dev); /* mandatory */
  86        int (*stall)(struct snd_sof_dev *sof_dev); /* optional */
  87        int (*reset)(struct snd_sof_dev *sof_dev); /* optional */
  88        int (*core_power_up)(struct snd_sof_dev *sof_dev,
  89                             unsigned int core_mask); /* optional */
  90        int (*core_power_down)(struct snd_sof_dev *sof_dev,
  91                               unsigned int core_mask); /* optional */
  92
  93        /*
  94         * Register IO: only used by respective drivers themselves,
  95         * TODO: consider removing these operations and calling respective
  96         * implementations directly
  97         */
  98        void (*write)(struct snd_sof_dev *sof_dev, void __iomem *addr,
  99                      u32 value); /* optional */
 100        u32 (*read)(struct snd_sof_dev *sof_dev,
 101                    void __iomem *addr); /* optional */
 102        void (*write64)(struct snd_sof_dev *sof_dev, void __iomem *addr,
 103                        u64 value); /* optional */
 104        u64 (*read64)(struct snd_sof_dev *sof_dev,
 105                      void __iomem *addr); /* optional */
 106
 107        /* memcpy IO */
 108        void (*block_read)(struct snd_sof_dev *sof_dev, u32 bar,
 109                           u32 offset, void *dest,
 110                           size_t size); /* mandatory */
 111        void (*block_write)(struct snd_sof_dev *sof_dev, u32 bar,
 112                            u32 offset, void *src,
 113                            size_t size); /* mandatory */
 114
 115        /* doorbell */
 116        irqreturn_t (*irq_handler)(int irq, void *context); /* optional */
 117        irqreturn_t (*irq_thread)(int irq, void *context); /* optional */
 118
 119        /* ipc */
 120        int (*send_msg)(struct snd_sof_dev *sof_dev,
 121                        struct snd_sof_ipc_msg *msg); /* mandatory */
 122
 123        /* FW loading */
 124        int (*load_firmware)(struct snd_sof_dev *sof_dev); /* mandatory */
 125        int (*load_module)(struct snd_sof_dev *sof_dev,
 126                           struct snd_sof_mod_hdr *hdr); /* optional */
 127        /*
 128         * FW ready checks for ABI compatibility and creates
 129         * memory windows at first boot
 130         */
 131        int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); /* optional */
 132
 133        /* connect pcm substream to a host stream */
 134        int (*pcm_open)(struct snd_sof_dev *sdev,
 135                        struct snd_pcm_substream *substream); /* optional */
 136        /* disconnect pcm substream to a host stream */
 137        int (*pcm_close)(struct snd_sof_dev *sdev,
 138                         struct snd_pcm_substream *substream); /* optional */
 139
 140        /* host stream hw params */
 141        int (*pcm_hw_params)(struct snd_sof_dev *sdev,
 142                             struct snd_pcm_substream *substream,
 143                             struct snd_pcm_hw_params *params,
 144                             struct sof_ipc_stream_params *ipc_params); /* optional */
 145
 146        /* host stream hw_free */
 147        int (*pcm_hw_free)(struct snd_sof_dev *sdev,
 148                           struct snd_pcm_substream *substream); /* optional */
 149
 150        /* host stream trigger */
 151        int (*pcm_trigger)(struct snd_sof_dev *sdev,
 152                           struct snd_pcm_substream *substream,
 153                           int cmd); /* optional */
 154
 155        /* host stream pointer */
 156        snd_pcm_uframes_t (*pcm_pointer)(struct snd_sof_dev *sdev,
 157                                         struct snd_pcm_substream *substream); /* optional */
 158
 159        /* host read DSP stream data */
 160        void (*ipc_msg_data)(struct snd_sof_dev *sdev,
 161                             struct snd_pcm_substream *substream,
 162                             void *p, size_t sz); /* mandatory */
 163
 164        /* host configure DSP HW parameters */
 165        int (*ipc_pcm_params)(struct snd_sof_dev *sdev,
 166                              struct snd_pcm_substream *substream,
 167                              const struct sof_ipc_pcm_params_reply *reply); /* mandatory */
 168
 169        /* pre/post firmware run */
 170        int (*pre_fw_run)(struct snd_sof_dev *sof_dev); /* optional */
 171        int (*post_fw_run)(struct snd_sof_dev *sof_dev); /* optional */
 172
 173        /* DSP PM */
 174        int (*suspend)(struct snd_sof_dev *sof_dev, int state); /* optional */
 175        int (*resume)(struct snd_sof_dev *sof_dev); /* optional */
 176        int (*runtime_suspend)(struct snd_sof_dev *sof_dev,
 177                               int state); /* optional */
 178        int (*runtime_resume)(struct snd_sof_dev *sof_dev); /* optional */
 179        int (*runtime_idle)(struct snd_sof_dev *sof_dev); /* optional */
 180        int (*set_hw_params_upon_resume)(struct snd_sof_dev *sdev); /* optional */
 181
 182        /* DSP clocking */
 183        int (*set_clk)(struct snd_sof_dev *sof_dev, u32 freq); /* optional */
 184
 185        /* debug */
 186        const struct snd_sof_debugfs_map *debug_map; /* optional */
 187        int debug_map_count; /* optional */
 188        void (*dbg_dump)(struct snd_sof_dev *sof_dev,
 189                         u32 flags); /* optional */
 190        void (*ipc_dump)(struct snd_sof_dev *sof_dev); /* optional */
 191
 192        /* host DMA trace initialization */
 193        int (*trace_init)(struct snd_sof_dev *sdev,
 194                          u32 *stream_tag); /* optional */
 195        int (*trace_release)(struct snd_sof_dev *sdev); /* optional */
 196        int (*trace_trigger)(struct snd_sof_dev *sdev,
 197                             int cmd); /* optional */
 198
 199        /* DAI ops */
 200        struct snd_soc_dai_driver *drv;
 201        int num_drv;
 202};
 203
 204/* DSP architecture specific callbacks for oops and stack dumps */
 205struct sof_arch_ops {
 206        void (*dsp_oops)(struct snd_sof_dev *sdev, void *oops);
 207        void (*dsp_stack)(struct snd_sof_dev *sdev, void *oops,
 208                          u32 *stack, u32 stack_words);
 209};
 210
 211#define sof_arch_ops(sdev) ((sdev)->pdata->desc->arch_ops)
 212
 213/* DSP device HW descriptor mapping between bus ID and ops */
 214struct sof_ops_table {
 215        const struct sof_dev_desc *desc;
 216        const struct snd_sof_dsp_ops *ops;
 217};
 218
 219enum sof_dfsentry_type {
 220        SOF_DFSENTRY_TYPE_IOMEM = 0,
 221        SOF_DFSENTRY_TYPE_BUF,
 222};
 223
 224enum sof_debugfs_access_type {
 225        SOF_DEBUGFS_ACCESS_ALWAYS = 0,
 226        SOF_DEBUGFS_ACCESS_D0_ONLY,
 227};
 228
 229/* FS entry for debug files that can expose DSP memories, registers */
 230struct snd_sof_dfsentry {
 231        struct dentry *dfsentry;
 232        size_t size;
 233        enum sof_dfsentry_type type;
 234        /*
 235         * access_type specifies if the
 236         * memory -> DSP resource (memory, register etc) is always accessible
 237         * or if it is accessible only when the DSP is in D0.
 238         */
 239        enum sof_debugfs_access_type access_type;
 240#if ENABLE_DEBUGFS_CACHEBUF
 241        char *cache_buf; /* buffer to cache the contents of debugfs memory */
 242#endif
 243        struct snd_sof_dev *sdev;
 244        struct list_head list;  /* list in sdev dfsentry list */
 245        union {
 246                void __iomem *io_mem;
 247                void *buf;
 248        };
 249};
 250
 251/* Debug mapping for any DSP memory or registers that can used for debug */
 252struct snd_sof_debugfs_map {
 253        const char *name;
 254        u32 bar;
 255        u32 offset;
 256        u32 size;
 257        /*
 258         * access_type specifies if the memory is always accessible
 259         * or if it is accessible only when the DSP is in D0.
 260         */
 261        enum sof_debugfs_access_type access_type;
 262};
 263
 264/* mailbox descriptor, used for host <-> DSP IPC */
 265struct snd_sof_mailbox {
 266        u32 offset;
 267        size_t size;
 268};
 269
 270/* IPC message descriptor for host <-> DSP IO */
 271struct snd_sof_ipc_msg {
 272        /* message data */
 273        u32 header;
 274        void *msg_data;
 275        void *reply_data;
 276        size_t msg_size;
 277        size_t reply_size;
 278        int reply_error;
 279
 280        wait_queue_head_t waitq;
 281        bool ipc_complete;
 282};
 283
 284/* PCM stream, mapped to FW component  */
 285struct snd_sof_pcm_stream {
 286        u32 comp_id;
 287        struct snd_dma_buffer page_table;
 288        struct sof_ipc_stream_posn posn;
 289        struct snd_pcm_substream *substream;
 290        struct work_struct period_elapsed_work;
 291};
 292
 293/* ALSA SOF PCM device */
 294struct snd_sof_pcm {
 295        struct snd_sof_dev *sdev;
 296        struct snd_soc_tplg_pcm pcm;
 297        struct snd_sof_pcm_stream stream[2];
 298        struct list_head list;  /* list in sdev pcm list */
 299        struct snd_pcm_hw_params params[2];
 300        int hw_params_upon_resume[2]; /* set up hw_params upon resume */
 301};
 302
 303/* ALSA SOF Kcontrol device */
 304struct snd_sof_control {
 305        struct snd_sof_dev *sdev;
 306        int comp_id;
 307        int min_volume_step; /* min volume step for volume_table */
 308        int max_volume_step; /* max volume step for volume_table */
 309        int num_channels;
 310        u32 readback_offset; /* offset to mmaped data if used */
 311        struct sof_ipc_ctrl_data *control_data;
 312        u32 size;       /* cdata size */
 313        enum sof_ipc_ctrl_cmd cmd;
 314        u32 *volume_table; /* volume table computed from tlv data*/
 315
 316        struct list_head list;  /* list in sdev control list */
 317};
 318
 319/* ASoC SOF DAPM widget */
 320struct snd_sof_widget {
 321        struct snd_sof_dev *sdev;
 322        int comp_id;
 323        int pipeline_id;
 324        int complete;
 325        int id;
 326
 327        struct snd_soc_dapm_widget *widget;
 328        struct list_head list;  /* list in sdev widget list */
 329
 330        void *private;          /* core does not touch this */
 331};
 332
 333/* ASoC SOF DAPM route */
 334struct snd_sof_route {
 335        struct snd_sof_dev *sdev;
 336
 337        struct snd_soc_dapm_route *route;
 338        struct list_head list;  /* list in sdev route list */
 339
 340        void *private;
 341};
 342
 343/* ASoC DAI device */
 344struct snd_sof_dai {
 345        struct snd_sof_dev *sdev;
 346        const char *name;
 347        const char *cpu_dai_name;
 348
 349        struct sof_ipc_comp_dai comp_dai;
 350        struct sof_ipc_dai_config *dai_config;
 351        struct list_head list;  /* list in sdev dai list */
 352};
 353
 354/*
 355 * SOF Device Level.
 356 */
 357struct snd_sof_dev {
 358        struct device *dev;
 359        spinlock_t ipc_lock;    /* lock for IPC users */
 360        spinlock_t hw_lock;     /* lock for HW IO access */
 361
 362        /*
 363         * ASoC components. plat_drv fields are set dynamically so
 364         * can't use const
 365         */
 366        struct snd_soc_component_driver plat_drv;
 367
 368        /* DSP firmware boot */
 369        wait_queue_head_t boot_wait;
 370        u32 boot_complete;
 371        u32 first_boot;
 372
 373        /* work queue in case the probe is implemented in two steps */
 374        struct work_struct probe_work;
 375
 376        /* DSP HW differentiation */
 377        struct snd_sof_pdata *pdata;
 378
 379        /* IPC */
 380        struct snd_sof_ipc *ipc;
 381        struct snd_sof_mailbox dsp_box;         /* DSP initiated IPC */
 382        struct snd_sof_mailbox host_box;        /* Host initiated IPC */
 383        struct snd_sof_mailbox stream_box;      /* Stream position update */
 384        struct snd_sof_ipc_msg *msg;
 385        int ipc_irq;
 386        u32 next_comp_id; /* monotonic - reset during S3 */
 387
 388        /* memory bases for mmaped DSPs - set by dsp_init() */
 389        void __iomem *bar[SND_SOF_BARS];        /* DSP base address */
 390        int mmio_bar;
 391        int mailbox_bar;
 392        size_t dsp_oops_offset;
 393
 394        /* debug */
 395        struct dentry *debugfs_root;
 396        struct list_head dfsentry_list;
 397
 398        /* firmware loader */
 399        struct snd_dma_buffer dmab;
 400        struct snd_dma_buffer dmab_bdl;
 401        struct sof_ipc_fw_ready fw_ready;
 402        struct sof_ipc_fw_version fw_version;
 403
 404        /* topology */
 405        struct snd_soc_tplg_ops *tplg_ops;
 406        struct list_head pcm_list;
 407        struct list_head kcontrol_list;
 408        struct list_head widget_list;
 409        struct list_head dai_list;
 410        struct list_head route_list;
 411        struct snd_soc_component *component;
 412        u32 enabled_cores_mask; /* keep track of enabled cores */
 413
 414        /* FW configuration */
 415        struct sof_ipc_dma_buffer_data *info_buffer;
 416        struct sof_ipc_window *info_window;
 417
 418        /* IPC timeouts in ms */
 419        int ipc_timeout;
 420        int boot_timeout;
 421
 422        /* Wait queue for code loading */
 423        wait_queue_head_t waitq;
 424        int code_loading;
 425
 426        /* DMA for Trace */
 427        struct snd_dma_buffer dmatb;
 428        struct snd_dma_buffer dmatp;
 429        int dma_trace_pages;
 430        wait_queue_head_t trace_sleep;
 431        u32 host_offset;
 432        u32 dtrace_is_enabled;
 433        u32 dtrace_error;
 434        u32 dtrace_draining;
 435
 436        u32 msi_enabled;
 437
 438        void *private;                  /* core does not touch this */
 439};
 440
 441/*
 442 * Device Level.
 443 */
 444
 445int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data);
 446int snd_sof_device_remove(struct device *dev);
 447
 448int snd_sof_runtime_suspend(struct device *dev);
 449int snd_sof_runtime_resume(struct device *dev);
 450int snd_sof_runtime_idle(struct device *dev);
 451int snd_sof_resume(struct device *dev);
 452int snd_sof_suspend(struct device *dev);
 453
 454void snd_sof_new_platform_drv(struct snd_sof_dev *sdev);
 455
 456int snd_sof_create_page_table(struct snd_sof_dev *sdev,
 457                              struct snd_dma_buffer *dmab,
 458                              unsigned char *page_table, size_t size);
 459
 460/*
 461 * Firmware loading.
 462 */
 463int snd_sof_load_firmware(struct snd_sof_dev *sdev);
 464int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev);
 465int snd_sof_load_firmware_memcpy(struct snd_sof_dev *sdev);
 466int snd_sof_run_firmware(struct snd_sof_dev *sdev);
 467int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev,
 468                                struct snd_sof_mod_hdr *module);
 469void snd_sof_fw_unload(struct snd_sof_dev *sdev);
 470int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset);
 471
 472/*
 473 * IPC low level APIs.
 474 */
 475struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev);
 476void snd_sof_ipc_free(struct snd_sof_dev *sdev);
 477int snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id);
 478void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev);
 479int snd_sof_ipc_stream_pcm_params(struct snd_sof_dev *sdev,
 480                                  struct sof_ipc_pcm_params *params);
 481int snd_sof_dsp_mailbox_init(struct snd_sof_dev *sdev, u32 dspbox,
 482                             size_t dspbox_size, u32 hostbox,
 483                             size_t hostbox_size);
 484int snd_sof_ipc_valid(struct snd_sof_dev *sdev);
 485int sof_ipc_tx_message(struct snd_sof_ipc *ipc, u32 header,
 486                       void *msg_data, size_t msg_bytes, void *reply_data,
 487                       size_t reply_bytes);
 488struct snd_sof_widget *snd_sof_find_swidget(struct snd_sof_dev *sdev,
 489                                            const char *name);
 490struct snd_sof_widget *snd_sof_find_swidget_sname(struct snd_sof_dev *sdev,
 491                                                  const char *pcm_name,
 492                                                  int dir);
 493struct snd_sof_dai *snd_sof_find_dai(struct snd_sof_dev *sdev,
 494                                     const char *name);
 495
 496static inline
 497struct snd_sof_pcm *snd_sof_find_spcm_dai(struct snd_sof_dev *sdev,
 498                                          struct snd_soc_pcm_runtime *rtd)
 499{
 500        struct snd_sof_pcm *spcm = NULL;
 501
 502        list_for_each_entry(spcm, &sdev->pcm_list, list) {
 503                if (le32_to_cpu(spcm->pcm.dai_id) == rtd->dai_link->id)
 504                        return spcm;
 505        }
 506
 507        return NULL;
 508}
 509
 510struct snd_sof_pcm *snd_sof_find_spcm_name(struct snd_sof_dev *sdev,
 511                                           const char *name);
 512struct snd_sof_pcm *snd_sof_find_spcm_comp(struct snd_sof_dev *sdev,
 513                                           unsigned int comp_id,
 514                                           int *direction);
 515struct snd_sof_pcm *snd_sof_find_spcm_pcm_id(struct snd_sof_dev *sdev,
 516                                             unsigned int pcm_id);
 517void snd_sof_pcm_period_elapsed(struct snd_pcm_substream *substream);
 518
 519/*
 520 * Stream IPC
 521 */
 522int snd_sof_ipc_stream_posn(struct snd_sof_dev *sdev,
 523                            struct snd_sof_pcm *spcm, int direction,
 524                            struct sof_ipc_stream_posn *posn);
 525
 526/*
 527 * Mixer IPC
 528 */
 529int snd_sof_ipc_set_get_comp_data(struct snd_sof_ipc *ipc,
 530                                  struct snd_sof_control *scontrol, u32 ipc_cmd,
 531                                  enum sof_ipc_ctrl_type ctrl_type,
 532                                  enum sof_ipc_ctrl_cmd ctrl_cmd,
 533                                  bool send);
 534
 535/*
 536 * Topology.
 537 * There is no snd_sof_free_topology since topology components will
 538 * be freed by snd_soc_unregister_component,
 539 */
 540int snd_sof_init_topology(struct snd_sof_dev *sdev,
 541                          struct snd_soc_tplg_ops *ops);
 542int snd_sof_load_topology(struct snd_sof_dev *sdev, const char *file);
 543int snd_sof_complete_pipeline(struct snd_sof_dev *sdev,
 544                              struct snd_sof_widget *swidget);
 545
 546int sof_load_pipeline_ipc(struct snd_sof_dev *sdev,
 547                          struct sof_ipc_pipe_new *pipeline,
 548                          struct sof_ipc_comp_reply *r);
 549
 550/*
 551 * Trace/debug
 552 */
 553int snd_sof_init_trace(struct snd_sof_dev *sdev);
 554void snd_sof_release_trace(struct snd_sof_dev *sdev);
 555void snd_sof_free_trace(struct snd_sof_dev *sdev);
 556int snd_sof_dbg_init(struct snd_sof_dev *sdev);
 557void snd_sof_free_debug(struct snd_sof_dev *sdev);
 558int snd_sof_debugfs_io_item(struct snd_sof_dev *sdev,
 559                            void __iomem *base, size_t size,
 560                            const char *name,
 561                            enum sof_debugfs_access_type access_type);
 562int snd_sof_debugfs_buf_item(struct snd_sof_dev *sdev,
 563                             void *base, size_t size,
 564                             const char *name, mode_t mode);
 565int snd_sof_trace_update_pos(struct snd_sof_dev *sdev,
 566                             struct sof_ipc_dma_trace_posn *posn);
 567void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev);
 568void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code,
 569                        u32 tracep_code, void *oops,
 570                        struct sof_ipc_panic_info *panic_info,
 571                        void *stack, size_t stack_words);
 572int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev);
 573
 574/*
 575 * Platform specific ops.
 576 */
 577extern struct snd_compr_ops sof_compressed_ops;
 578
 579/*
 580 * Kcontrols.
 581 */
 582
 583int snd_sof_volume_get(struct snd_kcontrol *kcontrol,
 584                       struct snd_ctl_elem_value *ucontrol);
 585int snd_sof_volume_put(struct snd_kcontrol *kcontrol,
 586                       struct snd_ctl_elem_value *ucontrol);
 587int snd_sof_switch_get(struct snd_kcontrol *kcontrol,
 588                       struct snd_ctl_elem_value *ucontrol);
 589int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
 590                       struct snd_ctl_elem_value *ucontrol);
 591int snd_sof_enum_get(struct snd_kcontrol *kcontrol,
 592                     struct snd_ctl_elem_value *ucontrol);
 593int snd_sof_enum_put(struct snd_kcontrol *kcontrol,
 594                     struct snd_ctl_elem_value *ucontrol);
 595int snd_sof_bytes_get(struct snd_kcontrol *kcontrol,
 596                      struct snd_ctl_elem_value *ucontrol);
 597int snd_sof_bytes_put(struct snd_kcontrol *kcontrol,
 598                      struct snd_ctl_elem_value *ucontrol);
 599int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
 600                          const unsigned int __user *binary_data,
 601                          unsigned int size);
 602int snd_sof_bytes_ext_get(struct snd_kcontrol *kcontrol,
 603                          unsigned int __user *binary_data,
 604                          unsigned int size);
 605
 606/*
 607 * DSP Architectures.
 608 */
 609static inline void sof_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
 610                             u32 stack_words)
 611{
 612        if (sof_arch_ops(sdev)->dsp_stack)
 613                sof_arch_ops(sdev)->dsp_stack(sdev, oops, stack, stack_words);
 614}
 615
 616static inline void sof_oops(struct snd_sof_dev *sdev, void *oops)
 617{
 618        if (sof_arch_ops(sdev)->dsp_oops)
 619                sof_arch_ops(sdev)->dsp_oops(sdev, oops);
 620}
 621
 622extern const struct sof_arch_ops sof_xtensa_arch_ops;
 623
 624/*
 625 * Utilities
 626 */
 627void sof_io_write(struct snd_sof_dev *sdev, void __iomem *addr, u32 value);
 628void sof_io_write64(struct snd_sof_dev *sdev, void __iomem *addr, u64 value);
 629u32 sof_io_read(struct snd_sof_dev *sdev, void __iomem *addr);
 630u64 sof_io_read64(struct snd_sof_dev *sdev, void __iomem *addr);
 631void sof_mailbox_write(struct snd_sof_dev *sdev, u32 offset,
 632                       void *message, size_t bytes);
 633void sof_mailbox_read(struct snd_sof_dev *sdev, u32 offset,
 634                      void *message, size_t bytes);
 635void sof_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src,
 636                     size_t size);
 637void sof_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest,
 638                    size_t size);
 639
 640void intel_ipc_msg_data(struct snd_sof_dev *sdev,
 641                        struct snd_pcm_substream *substream,
 642                        void *p, size_t sz);
 643int intel_ipc_pcm_params(struct snd_sof_dev *sdev,
 644                         struct snd_pcm_substream *substream,
 645                         const struct sof_ipc_pcm_params_reply *reply);
 646
 647int intel_pcm_open(struct snd_sof_dev *sdev,
 648                   struct snd_pcm_substream *substream);
 649int intel_pcm_close(struct snd_sof_dev *sdev,
 650                    struct snd_pcm_substream *substream);
 651
 652#endif
 653