]> Git Repo - J-linux.git/commitdiff
Merge tag 'soundwire-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul...
authorLinus Torvalds <[email protected]>
Wed, 27 Nov 2024 21:38:09 +0000 (13:38 -0800)
committerLinus Torvalds <[email protected]>
Wed, 27 Nov 2024 21:38:09 +0000 (13:38 -0800)
Pull soundwire updates from Vinod Koul:

 - structure optimization of few bus structures and header updates

 - support for 2.0 disco spec

 - amd driver updates for acp revision, refactoring code and support for
   acp6.3

 - soft reset support for cadence driver

* tag 'soundwire-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire: (24 commits)
  soundwire: Minor formatting fixups in sdw.h header
  soundwire: Update the includes on the sdw.h header
  soundwire: cadence: clear MCP BLOCK_WAKEUP in init
  soundwire: cadence: add soft-reset on startup
  soundwire: intel_auxdevice: add kernel parameter for mclk divider
  soundwire: mipi-disco: add support for DP0/DPn 'lane-list' property
  soundwire: mipi-disco: add new properties from 2.0 spec
  soundwire: mipi-disco: add comment on DP0-supported property
  soundwire: mipi-disco: add support for peripheral channelprepare timeout
  soundwire: mipi_disco: add support for clock-scales property
  soundwire: mipi-disco: add error handling for property array read
  soundwire: mipi-disco: remove DPn audio-modes
  soundwire: optimize sdw_dpn_prop
  soundwire: optimize sdw_dp0_prop
  soundwire: optimize sdw_slave_prop
  soundwire: optimize sdw_bus structure
  soundwire: optimize sdw_master_prop
  soundwire: optimize sdw_stream_runtime memory layout
  soundwire: mipi_disco: add MIPI-specific property_read_bool() helpers
  soundwire: Correct some typos in comments
  ...

1  2 
Documentation/admin-guide/kernel-parameters.rst
Documentation/admin-guide/kernel-parameters.txt
drivers/soundwire/amd_init.c
include/linux/soundwire/sdw.h
include/linux/soundwire/sdw_amd.h
sound/soc/amd/ps/pci-ps.c
sound/soc/sof/amd/acp.c

index 6247bbc9547ce8932b8cfab451a33ee9b6b7f87e,a64130fd19bff624e38e77a55c8b088bc9e02568..59931f21c974974e25259701821189521f9df9d7
@@@ -27,16 -27,6 +27,16 @@@ kernel command line (/proc/cmdline) an
  when it loads a module, so the kernel command line can be used for
  loadable modules too.
  
 +This document may not be entirely up to date and comprehensive. The command
 +"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
 +module. Loadable modules, after being loaded into the running kernel, also
 +reveal their parameters in /sys/module/${modulename}/parameters/. Some of these
 +parameters may be changed at runtime by the command
 +``echo -n ${value} > /sys/module/${modulename}/parameters/${parm}``.
 +
 +Special handling
 +----------------
 +
  Hyphens (dashes) and underscores are equivalent in parameter names, so::
  
        log_buf_len=1M print-fatal-signals=1
@@@ -49,8 -39,8 +49,8 @@@ Double-quotes can be used to protect sp
  
        param="spaces in here"
  
 -cpu lists:
 -----------
 +cpu lists
 +~~~~~~~~~
  
  Some kernel parameters take a list of CPUs as a value, e.g.  isolcpus,
  nohz_full, irqaffinity, rcu_nocbs.  The format of this list is:
@@@ -92,17 -82,12 +92,17 @@@ so that "nohz_full=all" is the equivale
  The semantics of "N" and "all" is supported on a level of bitmaps and holds for
  all users of bitmap_parselist().
  
 -This document may not be entirely up to date and comprehensive. The command
 -"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
 -module. Loadable modules, after being loaded into the running kernel, also
 -reveal their parameters in /sys/module/${modulename}/parameters/. Some of these
 -parameters may be changed at runtime by the command
 -``echo -n ${value} > /sys/module/${modulename}/parameters/${parm}``.
 +Metric suffixes
 +~~~~~~~~~~~~~~~
 +
 +The [KMG] suffix is commonly described after a number of kernel
 +parameter values. 'K', 'M', 'G', 'T', 'P', and 'E' suffixes are allowed.
 +These letters represent the _binary_ multipliers 'Kilo', 'Mega', 'Giga',
 +'Tera', 'Peta', and 'Exa', equaling 2^10, 2^20, 2^30, 2^40, 2^50, and
 +2^60 bytes respectively. Such letter suffixes can also be entirely omitted.
 +
 +Kernel Build Options
 +--------------------
  
  The parameters listed below are only valid if certain kernel build options
  were enabled and if respective hardware is present. This list should be kept
@@@ -174,6 -159,7 +174,7 @@@ is applicable:
        SCSI    Appropriate SCSI support is enabled.
                        A lot of drivers have their options described inside
                        the Documentation/scsi/ sub-directory.
+         SDW     SoundWire support is enabled.
        SECURITY Different security models are enabled.
        SELINUX SELinux support is enabled.
        SERIAL  Serial support is enabled.
@@@ -226,5 -212,10 +227,5 @@@ a fixed number of characters. This limi
  and is between 256 and 4096 characters. It is defined in the file
  ./include/uapi/asm-generic/setup.h as COMMAND_LINE_SIZE.
  
 -Finally, the [KMG] suffix is commonly described after a number of kernel
 -parameter values. These 'K', 'M', and 'G' letters represent the _binary_
 -multipliers 'Kilo', 'Mega', and 'Giga', equaling 2^10, 2^20, and 2^30
 -bytes respectively. Such letter suffixes can also be entirely omitted:
 -
  .. include:: kernel-parameters.txt
     :literal:
index 14ebd1f4b45e0081b1fa09132716bdd7f50249c7,d7aee9ed5a1d1ecdc8533bbc04af873ebb61a647..dc663c0ca67067d041cf9a3767117eec765ccca8
        arm64.nobti     [ARM64] Unconditionally disable Branch Target
                        Identification support
  
 +      arm64.nogcs     [ARM64] Unconditionally disable Guarded Control Stack
 +                      support
 +
        arm64.nomops    [ARM64] Unconditionally disable Memory Copy and Memory
                        Set instructions support
  
                        the parameter has no effect.
  
        crash_kexec_post_notifiers
 -                      Run kdump after running panic-notifiers and dumping
 -                      kmsg. This only for the users who doubt kdump always
 -                      succeeds in any situation.
 -                      Note that this also increases risks of kdump failure,
 -                      because some panic notifiers can make the crashed
 -                      kernel more unstable.
 +                      Only jump to kdump kernel after running the panic
 +                      notifiers and dumping kmsg. This option increases
 +                      the risks of a kdump failure, since some panic
 +                      notifiers can make the crashed kernel more unstable.
 +                      In configurations where kdump may not be reliable,
 +                      running the panic notifiers could allow collecting
 +                      more data on dmesg, like stack traces from other CPUS
 +                      or extra data dumped by panic_print. Note that some
 +                      configurations enable this option unconditionally,
 +                      like Hyper-V, PowerPC (fadump) and AMD SEV-SNP.
  
        crashkernel=size[KMG][@offset[KMG]]
                        [KNL,EARLY] Using kexec, Linux can switch to a 'crash kernel'
        failslab=
        fail_usercopy=
        fail_page_alloc=
 +      fail_skb_realloc=
        fail_make_request=[KNL]
                        General fault injection mechanism.
                        Format: <interval>,<probability>,<space>,<times>
                nomio           [S390] Do not use MIO instructions.
                norid           [S390] ignore the RID field and force use of
                                one PCI domain per PCI function
 +              notph           [PCIE] If the PCIE_TPH kernel config parameter
 +                              is enabled, this kernel boot option can be used
 +                              to disable PCIe TLP Processing Hints support
 +                              system-wide.
  
        pcie_aspm=      [PCIE] Forcibly enable or ignore PCIe Active State Power
                        Management.
                        Set time (jiffies) between CPU-hotplug operations,
                        or zero to disable CPU-hotplug testing.
  
 -      rcutorture.read_exit= [KNL]
 -                      Set the number of read-then-exit kthreads used
 -                      to test the interaction of RCU updaters and
 -                      task-exit processing.
 -
        rcutorture.read_exit_burst= [KNL]
                        The number of times in a given read-then-exit
                        episode that a set of read-then-exit kthreads
                        The delay, in seconds, between successive
                        read-then-exit testing episodes.
  
 +      rcutorture.reader_flavor= [KNL]
 +                      A bit mask indicating which readers to use.
 +                      If there is more than one bit set, the readers
 +                      are entered from low-order bit up, and are
 +                      exited in the opposite order.  For SRCU, the
 +                      0x1 bit is normal readers, 0x2 NMI-safe readers,
 +                      and 0x4 light-weight readers.
 +
        rcutorture.shuffle_interval= [KNL]
                        Set task-shuffle interval (s).  Shuffling tasks
                        allows some CPUs to go into dyntick-idle mode
                        non-zero "wait" parameter.  See weight_single
                        and weight_many.
  
+       sdw_mclk_divider=[SDW]
+                       Specify the MCLK divider for Intel SoundWire buses in
+                       case the BIOS does not provide the clock rate properly.
        skew_tick=      [KNL,EARLY] Offset the periodic timer tick per cpu to mitigate
                        xtime_lock contention on larger systems, and/or RCU lock
                        contention on all systems with CONFIG_MAXSMP set.
                        For more information see Documentation/mm/slub.rst.
                        (slub_nomerge legacy name also accepted for now)
  
 +      slab_strict_numa        [MM]
 +                      Support memory policies on a per object level
 +                      in the slab allocator. The default is for memory
 +                      policies to be applied at the folio level when
 +                      a new folio is needed or a partial folio is
 +                      retrieved from the lists. Increases overhead
 +                      in the slab fastpaths but gains more accurate
 +                      NUMA kernel object placement which helps with slow
 +                      interconnects in NUMA systems.
 +
        slram=          [HW,MTD]
  
        smart2=         [HW]
                        0: no polling (default)
  
        thp_anon=       [KNL]
 -                      Format: <size>,<size>[KMG]:<state>;<size>-<size>[KMG]:<state>
 +                      Format: <size>[KMG],<size>[KMG]:<state>;<size>[KMG]-<size>[KMG]:<state>
                        state is one of "always", "madvise", "never" or "inherit".
                        Control the default behavior of the system with respect
                        to anonymous transparent hugepages.
                        Force threading of all interrupt handlers except those
                        marked explicitly IRQF_NO_THREAD.
  
 +      thp_shmem=      [KNL]
 +                      Format: <size>[KMG],<size>[KMG]:<policy>;<size>[KMG]-<size>[KMG]:<policy>
 +                      Control the default policy of each hugepage size for the
 +                      internal shmem mount. <policy> is one of policies available
 +                      for the shmem mount ("always", "inherit", "never", "within_size",
 +                      and "advise").
 +                      It can be used multiple times for multiple shmem THP sizes.
 +                      See Documentation/admin-guide/mm/transhuge.rst for more
 +                      details.
 +
        topology=       [S390,EARLY]
                        Format: {off | on}
                        Specify if the kernel should make use of the cpu
        torture.verbose_sleep_duration= [KNL]
                        Duration of each verbose-printk() sleep in jiffies.
  
 +      tpm.disable_pcr_integrity= [HW,TPM]
 +                      Do not protect PCR registers from unintended physical
 +                      access, or interposers in the bus by the means of
 +                      having an integrity protected session wrapped around
 +                      TPM2_PCR_Extend command. Consider this in a situation
 +                      where TPM is heavily utilized by IMA, thus protection
 +                      causing a major performance hit, and the space where
 +                      machines are deployed is by other means guarded.
 +
        tpm_suspend_pcr=[HW,TPM]
                        Format: integer pcr id
                        Specify that at suspend time, the tpm driver
  
                                reserve_mem=12M:4096:trace trace_instance=boot_map^traceoff^traceprintk@trace,sched,irq
  
 +                      Note, saving the trace buffer across reboots does require that the system
 +                      is set up to not wipe memory. For instance, CONFIG_RESET_ATTACK_MITIGATION
 +                      can force a memory reset on boot which will clear any trace that was stored.
 +                      This is just one of many ways that can clear memory. Make sure your system
 +                      keeps the content of memory across reboots before relying on this option.
 +
                        See also Documentation/trace/debugging.rst
  
  
                        See Documentation/admin-guide/mm/transhuge.rst
                        for more details.
  
 +      transparent_hugepage_shmem= [KNL]
 +                      Format: [always|within_size|advise|never|deny|force]
 +                      Can be used to control the hugepage allocation policy for
 +                      the internal shmem mount.
 +                      See Documentation/admin-guide/mm/transhuge.rst
 +                      for more details.
 +
        trusted.source= [KEYS]
                        Format: <string>
                        This parameter identifies the trust source as a backend
index 53d1d707ca1a7bcb0bd03a7de340418edf7f68bb,4f6e356e6bd246ef397ab0d9de38c6fc71269211..d11b60efda33fe3f79172c7788aa0df6c48b3b0d
@@@ -121,6 -121,7 +121,7 @@@ static struct sdw_amd_ctx *sdw_amd_prob
  
                sdw_pdata[index].instance = index;
                sdw_pdata[index].acp_sdw_lock = res->acp_lock;
+               sdw_pdata[index].acp_rev = res->acp_rev;
                pdevinfo[index].name = "amd_sdw_manager";
                pdevinfo[index].id = index;
                pdevinfo[index].parent = res->parent;
@@@ -177,7 -178,7 +178,7 @@@ EXPORT_SYMBOL_NS(sdw_amd_probe, SOUNDWI
  void sdw_amd_exit(struct sdw_amd_ctx *ctx)
  {
        sdw_amd_cleanup(ctx);
 -      kfree(ctx->ids);
 +      kfree(ctx->peripherals);
        kfree(ctx);
  }
  EXPORT_SYMBOL_NS(sdw_amd_exit, SOUNDWIRE_AMD_INIT);
@@@ -204,11 -205,10 +205,11 @@@ int sdw_amd_get_slave_info(struct sdw_a
                        num_slaves++;
        }
  
 -      ctx->ids = kcalloc(num_slaves, sizeof(*ctx->ids), GFP_KERNEL);
 -      if (!ctx->ids)
 +      ctx->peripherals = kmalloc(struct_size(ctx->peripherals, array, num_slaves),
 +                                 GFP_KERNEL);
 +      if (!ctx->peripherals)
                return -ENOMEM;
 -      ctx->num_slaves = num_slaves;
 +      ctx->peripherals->num_peripherals = num_slaves;
        for (index = 0; index < ctx->count; index++) {
                if (!(ctx->link_mask & BIT(index)))
                        continue;
                if (amd_manager) {
                        bus = &amd_manager->bus;
                        list_for_each_entry(slave, &bus->slaves, node) {
 -                              ctx->ids[i].id = slave->id;
 -                              ctx->ids[i].link_id = bus->link_id;
 +                              ctx->peripherals->array[i] = slave;
                                i++;
                        }
                }
index 49d690f3d29a59af73f5b63e8acd54e682a3ed6a,784656f740f676dea0368ab4449a1e73af01101c..bd9836690da625f937fd44f7cc87e1eed584c07b
@@@ -4,14 -4,20 +4,21 @@@
  #ifndef __SOUNDWIRE_H
  #define __SOUNDWIRE_H
  
+ #include <linux/bitfield.h>
  #include <linux/bug.h>
- #include <linux/lockdep_types.h>
+ #include <linux/completion.h>
+ #include <linux/device.h>
  #include <linux/irq.h>
  #include <linux/irqdomain.h>
+ #include <linux/lockdep_types.h>
  #include <linux/mod_devicetable.h>
- #include <linux/bitfield.h>
+ #include <linux/mutex.h>
+ #include <linux/types.h>
 +#include <sound/sdca.h>
  
+ struct dentry;
+ struct fwnode_handle;
  struct sdw_bus;
  struct sdw_slave;
  
@@@ -227,64 -233,36 +234,36 @@@ enum sdw_clk_stop_mode 
  
  /**
   * struct sdw_dp0_prop - DP0 properties
+  * @words: wordlengths supported
   * @max_word: Maximum number of bits in a Payload Channel Sample, 1 to 64
   * (inclusive)
   * @min_word: Minimum number of bits in a Payload Channel Sample, 1 to 64
   * (inclusive)
   * @num_words: number of wordlengths supported
-  * @words: wordlengths supported
+  * @ch_prep_timeout: Port-specific timeout value, in milliseconds
   * @BRA_flow_controlled: Slave implementation results in an OK_NotReady
   * response
   * @simple_ch_prep_sm: If channel prepare sequence is required
-  * @ch_prep_timeout: Port-specific timeout value, in milliseconds
   * @imp_def_interrupts: If set, each bit corresponds to support for
   * implementation-defined interrupts
+  * @num_lanes: array size of @lane_list
+  * @lane_list: indicates which Lanes can be used by DP0
   *
   * The wordlengths are specified by Spec as max, min AND number of
   * discrete values, implementation can define based on the wordlengths they
   * support
   */
  struct sdw_dp0_prop {
+       u32 *words;
        u32 max_word;
        u32 min_word;
        u32 num_words;
-       u32 *words;
+       u32 ch_prep_timeout;
        bool BRA_flow_controlled;
        bool simple_ch_prep_sm;
-       u32 ch_prep_timeout;
        bool imp_def_interrupts;
- };
- /**
-  * struct sdw_dpn_audio_mode - Audio mode properties for DPn
-  * @bus_min_freq: Minimum bus frequency, in Hz
-  * @bus_max_freq: Maximum bus frequency, in Hz
-  * @bus_num_freq: Number of discrete frequencies supported
-  * @bus_freq: Discrete bus frequencies, in Hz
-  * @min_freq: Minimum sampling frequency, in Hz
-  * @max_freq: Maximum sampling bus frequency, in Hz
-  * @num_freq: Number of discrete sampling frequency supported
-  * @freq: Discrete sampling frequencies, in Hz
-  * @prep_ch_behave: Specifies the dependencies between Channel Prepare
-  * sequence and bus clock configuration
-  * If 0, Channel Prepare can happen at any Bus clock rate
-  * If 1, Channel Prepare sequence shall happen only after Bus clock is
-  * changed to a frequency supported by this mode or compatible modes
-  * described by the next field
-  * @glitchless: Bitmap describing possible glitchless transitions from this
-  * Audio Mode to other Audio Modes
-  */
- struct sdw_dpn_audio_mode {
-       u32 bus_min_freq;
-       u32 bus_max_freq;
-       u32 bus_num_freq;
-       u32 *bus_freq;
-       u32 max_freq;
-       u32 min_freq;
-       u32 num_freq;
-       u32 *freq;
-       u32 prep_ch_behave;
-       u32 glitchless;
+       int num_lanes;
+       u32 *lane_list;
  };
  
  /**
   * @type: Data port type. Full, Simplified or Reduced
   * @max_grouping: Maximum number of samples that can be grouped together for
   * a full data port
-  * @simple_ch_prep_sm: If the port supports simplified channel prepare state
-  * machine
   * @ch_prep_timeout: Port-specific timeout value, in milliseconds
   * @imp_def_interrupts: If set, each bit corresponds to support for
   * implementation-defined interrupts
   * @max_ch: Maximum channels supported
   * @min_ch: Minimum channels supported
   * @num_channels: Number of discrete channels supported
-  * @channels: Discrete channels supported
   * @num_ch_combinations: Number of channel combinations supported
+  * @channels: Discrete channels supported
   * @ch_combinations: Channel combinations supported
+  * @lane_list: indicates which Lanes can be used by DPn
+  * @num_lanes: array size of @lane_list
   * @modes: SDW mode supported
   * @max_async_buffer: Number of samples that this port can buffer in
   * asynchronous modes
+  * @port_encoding: Payload Channel Sample encoding schemes supported
   * @block_pack_mode: Type of block port mode supported
   * @read_only_wordlength: Read Only wordlength field in DPN_BlockCtrl1 register
-  * @port_encoding: Payload Channel Sample encoding schemes supported
-  * @audio_modes: Audio modes supported
+  * @simple_ch_prep_sm: If the port supports simplified channel prepare state
+  * machine
   */
  struct sdw_dpn_prop {
        u32 num;
        u32 *words;
        enum sdw_dpn_type type;
        u32 max_grouping;
-       bool simple_ch_prep_sm;
        u32 ch_prep_timeout;
        u32 imp_def_interrupts;
        u32 max_ch;
        u32 min_ch;
        u32 num_channels;
-       u32 *channels;
        u32 num_ch_combinations;
+       u32 *channels;
        u32 *ch_combinations;
+       u32 *lane_list;
+       int num_lanes;
        u32 modes;
        u32 max_async_buffer;
+       u32 port_encoding;
        bool block_pack_mode;
        bool read_only_wordlength;
-       u32 port_encoding;
-       struct sdw_dpn_audio_mode *audio_modes;
+       bool simple_ch_prep_sm;
  };
  
  /**
   * struct sdw_slave_prop - SoundWire Slave properties
+  * @dp0_prop: Data Port 0 properties
+  * @src_dpn_prop: Source Data Port N properties
+  * @sink_dpn_prop: Sink Data Port N properties
   * @mipi_revision: Spec version of the implementation
   * @wake_capable: Wake-up events are supported
   * @test_mode_capable: If test mode is supported
   * SCP_AddrPage2
   * @bank_delay_support: Slave implements bank delay/bridge support registers
   * SCP_BankDelay and SCP_NextFrame
+  * @lane_control_support: Slave supports lane control
   * @p15_behave: Slave behavior when the Master attempts a read to the Port15
   * alias
-  * @lane_control_support: Slave supports lane control
   * @master_count: Number of Masters present on this Slave
   * @source_ports: Bitmap identifying source ports
   * @sink_ports: Bitmap identifying sink ports
-  * @dp0_prop: Data Port 0 properties
-  * @src_dpn_prop: Source Data Port N properties
-  * @sink_dpn_prop: Sink Data Port N properties
-  * @scp_int1_mask: SCP_INT1_MASK desired settings
   * @quirks: bitmask identifying deltas from the MIPI specification
+  * @sdca_interrupt_register_list: indicates which sets of SDCA interrupt status
+  * and masks are supported
+  * @commit_register_supported: is PCP_Commit register supported
+  * @scp_int1_mask: SCP_INT1_MASK desired settings
   * @clock_reg_supported: the Peripheral implements the clock base and scale
   * registers introduced with the SoundWire 1.2 specification. SDCA devices
   * do not need to set this boolean property as the registers are required.
   * @use_domain_irq: call actual IRQ handler on slave, as well as callback
   */
  struct sdw_slave_prop {
+       struct sdw_dp0_prop *dp0_prop;
+       struct sdw_dpn_prop *src_dpn_prop;
+       struct sdw_dpn_prop *sink_dpn_prop;
        u32 mipi_revision;
        bool wake_capable;
        bool test_mode_capable;
        bool high_PHY_capable;
        bool paging_support;
        bool bank_delay_support;
-       enum sdw_p15_behave p15_behave;
        bool lane_control_support;
+       enum sdw_p15_behave p15_behave;
        u32 master_count;
        u32 source_ports;
        u32 sink_ports;
-       struct sdw_dp0_prop *dp0_prop;
-       struct sdw_dpn_prop *src_dpn_prop;
-       struct sdw_dpn_prop *sink_dpn_prop;
-       u8 scp_int1_mask;
        u32 quirks;
+       u32 sdca_interrupt_register_list;
+       u8 commit_register_supported;
+       u8 scp_int1_mask;
        bool clock_reg_supported;
        bool use_domain_irq;
  };
  
  /**
   * struct sdw_master_prop - Master properties
+  * @clk_gears: Clock gears supported
+  * @clk_freq: Clock frequencies supported, in Hz
+  * @quirks: bitmask identifying optional behavior beyond the scope of the MIPI specification
   * @revision: MIPI spec version of the implementation
   * @clk_stop_modes: Bitmap, bit N set when clock-stop-modeN supported
   * @max_clk_freq: Maximum Bus clock frequency, in Hz
   * @num_clk_gears: Number of clock gears supported
-  * @clk_gears: Clock gears supported
   * @num_clk_freq: Number of clock frequencies supported, in Hz
-  * @clk_freq: Clock frequencies supported, in Hz
   * @default_frame_rate: Controller default Frame rate, in Hz
   * @default_row: Number of rows
   * @default_col: Number of columns
   * command
   * @mclk_freq: clock reference passed to SoundWire Master, in Hz.
   * @hw_disabled: if true, the Master is not functional, typically due to pin-mux
-  * @quirks: bitmask identifying optional behavior beyond the scope of the MIPI specification
   */
  struct sdw_master_prop {
+       u32 *clk_gears;
+       u32 *clk_freq;
+       u64 quirks;
        u32 revision;
        u32 clk_stop_modes;
        u32 max_clk_freq;
        u32 num_clk_gears;
-       u32 *clk_gears;
        u32 num_clk_freq;
-       u32 *clk_freq;
        u32 default_frame_rate;
        u32 default_row;
        u32 default_col;
-       bool dynamic_frame;
        u32 err_threshold;
        u32 mclk_freq;
+       bool dynamic_frame;
        bool hw_disabled;
-       u64 quirks;
  };
  
  /* Definitions for Master quirks */
@@@ -489,9 -474,9 +475,9 @@@ struct sdw_slave_id 
        __u8 sdw_version:4;
  };
  
 -struct sdw_extended_slave_id {
 -      int link_id;
 -      struct sdw_slave_id id;
 +struct sdw_peripherals {
 +      int num_peripherals;
 +      struct sdw_slave *array[];
  };
  
  /*
@@@ -631,7 -616,6 +617,6 @@@ struct sdw_slave_ops 
        int (*clk_stop)(struct sdw_slave *slave,
                        enum sdw_clk_stop_mode mode,
                        enum sdw_clk_stop_type type);
  };
  
  /**
   * @is_mockup_device: status flag used to squelch errors in the command/control
   * protocol for SoundWire mockup devices
   * @sdw_dev_lock: mutex used to protect callbacks/remove races
 + * @sdca_data: structure containing all device data for SDCA helpers
   */
  struct sdw_slave {
        struct sdw_slave_id id;
        bool first_interrupt_done;
        bool is_mockup_device;
        struct mutex sdw_dev_lock; /* protect callbacks/remove races */
 +      struct sdca_device_data sdca_data;
  };
  
  #define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev)
@@@ -707,8 -689,7 +692,7 @@@ struct sdw_master_device 
        container_of(d, struct sdw_master_device, dev)
  
  struct sdw_driver {
-       int (*probe)(struct sdw_slave *sdw,
-                       const struct sdw_device_id *id);
+       int (*probe)(struct sdw_slave *sdw, const struct sdw_device_id *id);
        int (*remove)(struct sdw_slave *sdw);
        void (*shutdown)(struct sdw_slave *sdw);
  
        SDW_SLAVE_ENTRY_EXT((_mfg_id), (_part_id), 0, 0, (_drv_data))
  
  int sdw_handle_slave_status(struct sdw_bus *bus,
-                       enum sdw_slave_status status[]);
+                           enum sdw_slave_status status[]);
  
  /*
   * SDW master structures and APIs
@@@ -809,29 -790,28 +793,28 @@@ struct sdw_enable_ch 
   */
  struct sdw_master_port_ops {
        int (*dpn_set_port_params)(struct sdw_bus *bus,
-                       struct sdw_port_params *port_params,
-                       unsigned int bank);
+                                  struct sdw_port_params *port_params,
+                                  unsigned int bank);
        int (*dpn_set_port_transport_params)(struct sdw_bus *bus,
-                       struct sdw_transport_params *transport_params,
-                       enum sdw_reg_bank bank);
-       int (*dpn_port_prep)(struct sdw_bus *bus,
-                       struct sdw_prepare_ch *prepare_ch);
+                                            struct sdw_transport_params *transport_params,
+                                            enum sdw_reg_bank bank);
+       int (*dpn_port_prep)(struct sdw_bus *bus, struct sdw_prepare_ch *prepare_ch);
        int (*dpn_port_enable_ch)(struct sdw_bus *bus,
-                       struct sdw_enable_ch *enable_ch, unsigned int bank);
+                                 struct sdw_enable_ch *enable_ch, unsigned int bank);
  };
  
  struct sdw_msg;
  
  /**
-  * struct sdw_defer - SDW deffered message
-  * @length: message length
+  * struct sdw_defer - SDW deferred message
   * @complete: message completion
   * @msg: SDW message
+  * @length: message length
   */
  struct sdw_defer {
+       struct sdw_msg *msg;
        int length;
        struct completion complete;
-       struct sdw_msg *msg;
  };
  
  /**
   */
  struct sdw_master_ops {
        int (*read_prop)(struct sdw_bus *bus);
-       u64 (*override_adr)
-                       (struct sdw_bus *bus, u64 addr);
-       enum sdw_command_response (*xfer_msg)
-                       (struct sdw_bus *bus, struct sdw_msg *msg);
-       enum sdw_command_response (*xfer_msg_defer)
-                       (struct sdw_bus *bus);
+       u64 (*override_adr)(struct sdw_bus *bus, u64 addr);
+       enum sdw_command_response (*xfer_msg)(struct sdw_bus *bus, struct sdw_msg *msg);
+       enum sdw_command_response (*xfer_msg_defer)(struct sdw_bus *bus);
        int (*set_bus_conf)(struct sdw_bus *bus,
-                       struct sdw_bus_params *params);
+                           struct sdw_bus_params *params);
        int (*pre_bank_switch)(struct sdw_bus *bus);
        int (*post_bank_switch)(struct sdw_bus *bus);
        u32 (*read_ping_status)(struct sdw_bus *bus);
   * struct sdw_bus - SoundWire bus
   * @dev: Shortcut to &bus->md->dev to avoid changing the entire code.
   * @md: Master device
-  * @controller_id: system-unique controller ID. If set to -1, the bus @id will be used.
-  * @link_id: Link id number, can be 0 to N, unique for each Controller
-  * @id: bus system-wide unique id
-  * @slaves: list of Slaves on this bus
-  * @assigned: Bitmap for Slave device numbers.
-  * Bit set implies used number, bit clear implies unused number.
+  * @bus_lock_key: bus lock key associated to @bus_lock
   * @bus_lock: bus lock
+  * @slaves: list of Slaves on this bus
+  * @msg_lock_key: message lock key associated to @msg_lock
   * @msg_lock: message lock
-  * @compute_params: points to Bus resource management implementation
-  * @ops: Master callback ops
-  * @port_ops: Master port callback ops
-  * @params: Current bus parameters
-  * @prop: Master properties
-  * @vendor_specific_prop: pointer to non-standard properties
   * @m_rt_list: List of Master instance of all stream(s) running on Bus. This
   * is used to compute and program bus bandwidth, clock, frame shape,
   * transport and port parameters
-  * @debugfs: Bus debugfs
-  * @domain: IRQ domain
   * @defer_msg: Defer message
-  * @clk_stop_timeout: Clock stop timeout computed
-  * @bank_switch_timeout: Bank switch timeout computed
-  * @multi_link: Store bus property that indicates if multi links
-  * are supported. This flag is populated by drivers after reading
-  * appropriate firmware (ACPI/DT).
+  * @params: Current bus parameters
+  * @stream_refcount: number of streams currently using this bus
+  * @ops: Master callback ops
+  * @port_ops: Master port callback ops
+  * @prop: Master properties
+  * @vendor_specific_prop: pointer to non-standard properties
   * @hw_sync_min_links: Number of links used by a stream above which
   * hardware-based synchronization is required. This value is only
   * meaningful if multi_link is set. If set to 1, hardware-based
   * synchronization will be used even if a stream only uses a single
   * SoundWire segment.
-  * @stream_refcount: number of streams currently using this bus
+  * @controller_id: system-unique controller ID. If set to -1, the bus @id will be used.
+  * @link_id: Link id number, can be 0 to N, unique for each Controller
+  * @id: bus system-wide unique id
+  * @compute_params: points to Bus resource management implementation
+  * @assigned: Bitmap for Slave device numbers.
+  * Bit set implies used number, bit clear implies unused number.
+  * @clk_stop_timeout: Clock stop timeout computed
+  * @bank_switch_timeout: Bank switch timeout computed
+  * @domain: IRQ domain
+  * @irq_chip: IRQ chip
+  * @debugfs: Bus debugfs (optional)
+  * @multi_link: Store bus property that indicates if multi links
+  * are supported. This flag is populated by drivers after reading
+  * appropriate firmware (ACPI/DT).
   */
  struct sdw_bus {
        struct device *dev;
        struct sdw_master_device *md;
-       int controller_id;
-       unsigned int link_id;
-       int id;
-       struct list_head slaves;
-       DECLARE_BITMAP(assigned, SDW_MAX_DEVICES);
-       struct mutex bus_lock;
        struct lock_class_key bus_lock_key;
-       struct mutex msg_lock;
+       struct mutex bus_lock;
+       struct list_head slaves;
        struct lock_class_key msg_lock_key;
-       int (*compute_params)(struct sdw_bus *bus);
+       struct mutex msg_lock;
+       struct list_head m_rt_list;
+       struct sdw_defer defer_msg;
+       struct sdw_bus_params params;
+       int stream_refcount;
        const struct sdw_master_ops *ops;
        const struct sdw_master_port_ops *port_ops;
-       struct sdw_bus_params params;
        struct sdw_master_prop prop;
        void *vendor_specific_prop;
-       struct list_head m_rt_list;
+       int hw_sync_min_links;
+       int controller_id;
+       unsigned int link_id;
+       int id;
+       int (*compute_params)(struct sdw_bus *bus);
+       DECLARE_BITMAP(assigned, SDW_MAX_DEVICES);
+       unsigned int clk_stop_timeout;
+       u32 bank_switch_timeout;
+       struct irq_chip irq_chip;
+       struct irq_domain *domain;
  #ifdef CONFIG_DEBUG_FS
        struct dentry *debugfs;
  #endif
-       struct irq_chip irq_chip;
-       struct irq_domain *domain;
-       struct sdw_defer defer_msg;
-       unsigned int clk_stop_timeout;
-       u32 bank_switch_timeout;
        bool multi_link;
-       int hw_sync_min_links;
-       int stream_refcount;
  };
  
  int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
@@@ -1013,18 -993,18 +996,18 @@@ struct sdw_stream_params 
   * @params: Stream parameters
   * @state: Current state of the stream
   * @type: Stream type PCM or PDM
+  * @m_rt_count: Count of Master runtime(s) in this stream
   * @master_list: List of Master runtime(s) in this stream.
   * master_list can contain only one m_rt per Master instance
   * for a stream
-  * @m_rt_count: Count of Master runtime(s) in this stream
   */
  struct sdw_stream_runtime {
        const char *name;
        struct sdw_stream_params params;
        enum sdw_stream_state state;
        enum sdw_stream_type type;
-       struct list_head master_list;
        int m_rt_count;
+       struct list_head master_list;
  };
  
  struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name);
@@@ -1033,12 -1013,12 +1016,12 @@@ void sdw_release_stream(struct sdw_stre
  int sdw_compute_params(struct sdw_bus *bus);
  
  int sdw_stream_add_master(struct sdw_bus *bus,
-               struct sdw_stream_config *stream_config,
-               const struct sdw_port_config *port_config,
-               unsigned int num_ports,
-               struct sdw_stream_runtime *stream);
+                         struct sdw_stream_config *stream_config,
+                         const struct sdw_port_config *port_config,
+                         unsigned int num_ports,
+                         struct sdw_stream_runtime *stream);
  int sdw_stream_remove_master(struct sdw_bus *bus,
-               struct sdw_stream_runtime *stream);
+                            struct sdw_stream_runtime *stream);
  int sdw_startup_stream(void *sdw_substream);
  int sdw_prepare_stream(struct sdw_stream_runtime *stream);
  int sdw_enable_stream(struct sdw_stream_runtime *stream);
index 585b4c58a8a6f2b3b26f970b8a076eb8dce33823,c9586f22c5a9b322df39351a3deb4e04fd37190a..799f8578137b45862e70c93c34c70b2a9089ac1f
  #define ACP_SDW0      0
  #define ACP_SDW1      1
  #define AMD_SDW_MAX_MANAGER_COUNT     2
+ #define ACP63_PCI_REV_ID              0x63
  
  struct acp_sdw_pdata {
        u16 instance;
+       u32 acp_rev;
        /* mutex to protect acp common register access */
        struct mutex *acp_sdw_lock;
  };
@@@ -66,6 -68,7 +68,7 @@@ struct sdw_amd_dai_runtime 
   * @instance: SoundWire manager instance
   * @quirks: SoundWire manager quirks
   * @wake_en_mask: wake enable mask per SoundWire manager
+  * @acp_rev: acp pci device revision id
   * @clk_stopped: flag set to true when clock is stopped
   * @power_mode_mask: flag interprets amd SoundWire manager power mode
   * @dai_runtime_array: dai runtime array
@@@ -94,6 -97,7 +97,7 @@@ struct amd_sdw_manager 
        u32 quirks;
        u32 wake_en_mask;
        u32 power_mode_mask;
+       u32 acp_rev;
        bool clk_stopped;
  
        struct sdw_amd_dai_runtime **dai_runtime_array;
@@@ -115,22 -119,26 +119,23 @@@ struct sdw_amd_acpi_info 
   * struct sdw_amd_ctx - context allocated by the controller driver probe
   *
   * @count: link count
 - * @num_slaves: total number of devices exposed across all enabled links
   * @link_mask: bit-wise mask listing SoundWire links reported by the
   * Controller
 - * @ids: array of slave_id, representing Slaves exposed across all enabled
 - * links
   * @pdev: platform device structure
 + * @peripherals: array representing Peripherals exposed across all enabled links
   */
  struct sdw_amd_ctx {
        int count;
 -      int num_slaves;
        u32 link_mask;
 -      struct sdw_extended_slave_id *ids;
        struct platform_device *pdev[AMD_SDW_MAX_MANAGER_COUNT];
 +      struct sdw_peripherals *peripherals;
  };
  
  /**
   * struct sdw_amd_res - Soundwire AMD global resource structure,
   * typically populated by the DSP driver/Legacy driver
   *
+  * @acp_rev: acp pci device revision id
   * @addr: acp pci device resource start address
   * @reg_range: ACP register range
   * @link_mask: bit-wise mask listing links selected by the DSP driver/
   * @acp_lock: mutex protecting acp common registers access
   */
  struct sdw_amd_res {
+       u32 acp_rev;
        u32 addr;
        u32 reg_range;
        u32 link_mask;
index a7583844f5b4e7bf529322b016d202a9acc57739,0c3bb1da509755d727a40fa2a9f1b982e9b39d53..aef73ec6f7ef4ecdd7005176f895b986189a92f2
@@@ -267,6 -267,7 +267,7 @@@ static int amd_sdw_probe(struct device 
        sdw_res.acp_lock = &acp_data->acp_lock;
        sdw_res.count = acp_data->info.count;
        sdw_res.mmio_base = acp_data->acp63_base;
+       sdw_res.acp_rev = acp_data->acp_rev;
        sdw_res.link_mask = acp_data->info.link_mask;
        ret = sdw_amd_probe(&sdw_res, &acp_data->sdw);
        if (ret)
@@@ -302,7 -303,8 +303,7 @@@ static struct snd_soc_acpi_mach *acp63_
                        link = mach->links;
                        for (i = 0; i < acp_data->info.count && link->num_adr; link++, i++) {
                                if (!snd_soc_acpi_sdw_link_slaves_found(dev, link,
 -                                                                      acp_data->sdw->ids,
 -                                                                      acp_data->sdw->num_slaves))
 +                                                                      acp_data->sdw->peripherals))
                                        break;
                        }
                        if (i == acp_data->info.count || !link->num_adr)
@@@ -575,6 -577,7 +576,7 @@@ static int snd_acp63_probe(struct pci_d
        }
        adata->addr = addr;
        adata->reg_range = ACP63_REG_END - ACP63_REG_START;
+       adata->acp_rev = pci->revision;
        pci_set_master(pci);
        pci_set_drvdata(pci, adata);
        mutex_init(&adata->acp_lock);
                dev_err(&pci->dev, "ACP platform devices creation failed\n");
                goto de_init;
        }
 +      adata->machines = snd_soc_acpi_amd_acp63_sdw_machines;
        ret = acp63_machine_register(&pci->dev);
        if (ret) {
                dev_err(&pci->dev, "ACP machine register failed\n");
diff --combined sound/soc/sof/amd/acp.c
index 95d4762c9d9390068aabeaa1a9c27f86a60bc084,f967e8498798123fbe7db22fb7083fe82e5f92f4..f7814dadf3bace4609f1e216a230fe6dc3913f5e
@@@ -329,9 -329,7 +329,9 @@@ int configure_and_run_sha_dma(struct ac
                                            fw_qualifier, fw_qualifier & DSP_FW_RUN_ENABLE,
                                            ACP_REG_POLL_INTERVAL, ACP_DMA_COMPLETE_TIMEOUT_US);
        if (ret < 0) {
 -              dev_err(sdev->dev, "PSP validation failed\n");
 +              val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SHA_PSP_ACK);
 +              dev_err(sdev->dev, "PSP validation failed: fw_qualifier = %#x, ACP_SHA_PSP_ACK = %#x\n",
 +                      fw_qualifier, val);
                return ret;
        }
  
@@@ -342,19 -340,11 +342,19 @@@ int acp_dma_status(struct acp_dev_data 
  {
        struct snd_sof_dev *sdev = adata->dev;
        unsigned int val;
 +      unsigned int acp_dma_ch_sts;
        int ret = 0;
  
 +      switch (adata->pci_rev) {
 +      case ACP70_PCI_ID:
 +              acp_dma_ch_sts = ACP70_DMA_CH_STS;
 +              break;
 +      default:
 +              acp_dma_ch_sts = ACP_DMA_CH_STS;
 +      }
        val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_DMA_CNTL_0 + ch * sizeof(u32));
        if (val & ACP_DMA_CH_RUN) {
 -              ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, ACP_DMA_CH_STS, val, !val,
 +              ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, acp_dma_ch_sts, val, !val,
                                                    ACP_REG_POLL_INTERVAL,
                                                    ACP_DMA_COMPLETE_TIMEOUT_US);
                if (ret < 0)
@@@ -693,6 -683,7 +693,7 @@@ static int amd_sof_sdw_probe(struct snd
        sdw_res.count = acp_data->info.count;
        sdw_res.link_mask = acp_data->info.link_mask;
        sdw_res.mmio_base = sdev->bar[ACP_DSP_BAR];
+       sdw_res.acp_rev = acp_data->pci_rev;
  
        ret = sdw_amd_probe(&sdw_res, &acp_data->sdw);
        if (ret)
This page took 0.10612 seconds and 4 git commands to generate.