Message ID | 20220304145755.2844173-9-cezary.rojewski@intel.com |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: Intel: AVS - Audio DSP for cAVS | expand |
On Fri, 2022-03-04 at 15:57 +0100, Cezary Rojewski wrote: > Audio DSP supports low power states i.e.: transitions between D0 and > D3 > and D0-substates in form of D0i0 and D0i3. That process is a > combination > of core and IPC operations. Here, Dx and D0ix IPC handlers are added. > > Signed-off-by: Amadeusz Sławiński < > amadeuszx.slawinski@linux.intel.com> > Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> > --- > sound/soc/intel/avs/messages.c | 44 > ++++++++++++++++++++++++++++++++++ > sound/soc/intel/avs/messages.h | 15 ++++++++++++ > 2 files changed, 59 insertions(+) > > diff --git a/sound/soc/intel/avs/messages.c > b/sound/soc/intel/avs/messages.c > index 613c9452226d..e8f441b28d71 100644 > --- a/sound/soc/intel/avs/messages.c > +++ b/sound/soc/intel/avs/messages.c > @@ -401,3 +401,47 @@ int avs_ipc_get_large_config(struct avs_dev > *adev, u16 module_id, u8 instance_id > > return 0; > } > + > +int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool > powerup) a description for this function would be helpful. > +{ > + union avs_module_msg msg = AVS_MODULE_REQUEST(SET_DX); > + struct avs_ipc_msg request; > + struct avs_dxstate_info dx; > + int ret; > + > + dx.core_mask = core_mask; > + dx.dx_mask = powerup ? core_mask : 0; > + request.header = msg.val; > + request.data = &dx; > + request.size = sizeof(dx); > + > + ret = avs_dsp_send_msg(adev, &request, NULL); > + if (ret) > + avs_ipc_err(adev, &request, "set dx", ret); > + > + return ret; > +} > + > +/* > + * avs_ipc_set_d0ix - Set power gating policy (entering D0IX > substates) > + * > + * @enable_pg: Whether to enable or disable power gating > + * @streaming: Whether a stream is running when transitioning > + */ What do you mean why "whether a stream is running" does it mean any stream? What is the difference between a D0ix transition with a stream running compared to not running? Thanks,Ranjani
diff --git a/sound/soc/intel/avs/messages.c b/sound/soc/intel/avs/messages.c index 613c9452226d..e8f441b28d71 100644 --- a/sound/soc/intel/avs/messages.c +++ b/sound/soc/intel/avs/messages.c @@ -401,3 +401,47 @@ int avs_ipc_get_large_config(struct avs_dev *adev, u16 module_id, u8 instance_id return 0; } + +int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool powerup) +{ + union avs_module_msg msg = AVS_MODULE_REQUEST(SET_DX); + struct avs_ipc_msg request; + struct avs_dxstate_info dx; + int ret; + + dx.core_mask = core_mask; + dx.dx_mask = powerup ? core_mask : 0; + request.header = msg.val; + request.data = &dx; + request.size = sizeof(dx); + + ret = avs_dsp_send_msg(adev, &request, NULL); + if (ret) + avs_ipc_err(adev, &request, "set dx", ret); + + return ret; +} + +/* + * avs_ipc_set_d0ix - Set power gating policy (entering D0IX substates) + * + * @enable_pg: Whether to enable or disable power gating + * @streaming: Whether a stream is running when transitioning + */ +int avs_ipc_set_d0ix(struct avs_dev *adev, bool enable_pg, bool streaming) +{ + union avs_module_msg msg = AVS_MODULE_REQUEST(SET_D0IX); + struct avs_ipc_msg request = {{0}}; + int ret; + + msg.ext.set_d0ix.wake = enable_pg; + msg.ext.set_d0ix.streaming = streaming; + + request.header = msg.val; + + ret = avs_dsp_send_msg(adev, &request, NULL); + if (ret) + avs_ipc_err(adev, &request, "set d0ix", ret); + + return ret; +} diff --git a/sound/soc/intel/avs/messages.h b/sound/soc/intel/avs/messages.h index e4b95b066d70..69920f5e802b 100644 --- a/sound/soc/intel/avs/messages.h +++ b/sound/soc/intel/avs/messages.h @@ -97,6 +97,8 @@ enum avs_module_msg_type { AVS_MOD_LARGE_CONFIG_SET = 4, AVS_MOD_BIND = 5, AVS_MOD_UNBIND = 6, + AVS_MOD_SET_DX = 7, + AVS_MOD_SET_D0IX = 8, AVS_MOD_DELETE_INSTANCE = 11, }; @@ -133,6 +135,10 @@ union avs_module_msg { u32 dst_queue:3; u32 src_queue:3; } bind_unbind; + struct { + u32 wake:1; + u32 streaming:1; + } set_d0ix; } ext; }; } __packed; @@ -290,4 +296,13 @@ int avs_ipc_get_large_config(struct avs_dev *adev, u16 module_id, u8 instance_id u8 param_id, u8 *request_data, size_t request_size, u8 **reply_data, size_t *reply_size); +/* DSP cores and domains power management messages */ +struct avs_dxstate_info { + u32 core_mask; /* which cores are subject for power transition */ + u32 dx_mask; /* bit[n]=1 core n goes to D0, bit[n]=0 it goes to D3 */ +} __packed; + +int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool powerup); +int avs_ipc_set_d0ix(struct avs_dev *adev, bool enable_pg, bool streaming); + #endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */