On Fri, Oct 4, 2024 at 2:45 PM <boyuan.zhang@xxxxxxx> wrote: > > From: Boyuan Zhang <boyuan.zhang@xxxxxxx> > > Add a new function to allow setting requested powergating state for the > given instance. If the instance value doesn't match with the one inside > ip_block, then do nothing since this request is for other instances with > the same block type. > > Signed-off-by: Boyuan Zhang <boyuan.zhang@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 +++ > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 37 ++++++++++++++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 3442564fe174..ae59497f3074 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -358,6 +358,10 @@ int amdgpu_device_ip_set_clockgating_state(void *dev, > int amdgpu_device_ip_set_powergating_state(void *dev, > enum amd_ip_block_type block_type, > enum amd_powergating_state state); > +int amdgpu_device_ip_set_powergating_state_instance(void *dev, > + enum amd_ip_block_type block_type, > + enum amd_powergating_state state, > + unsigned int inst); > void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev, > u64 *flags); > int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev, > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 35a3e71a5a84..f0b6a9675405 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -2162,6 +2162,43 @@ int amdgpu_device_ip_set_powergating_state(void *dev, > return r; > } > > +/** > + * amdgpu_device_ip_set_powergating_state_instance - set the PG state > + * > + * @dev: amdgpu_device pointer > + * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.) > + * @state: powergating state (gate or ungate) > + * > + * Sets the requested powergating state for the given instance of > + * the hardware IP specified. > + * Returns the error code from the last instance. > + */ > +int amdgpu_device_ip_set_powergating_state_instance(void *dev, > + enum amd_ip_block_type block_type, > + enum amd_powergating_state state, > + unsigned int inst) > +{ > + struct amdgpu_device *adev = dev; > + int i, r = 0; > + > + for (i = 0; i < adev->num_ip_blocks; i++) { > + if (!adev->ip_blocks[i].status.valid) > + continue; > + if (adev->ip_blocks[i].version->type != block_type) > + continue; > + if (adev->ip_blocks[i].instance != inst) > + continue; > + if (!adev->ip_blocks[i].version->funcs->set_powergating_state) > + continue; > + r = adev->ip_blocks[i].version->funcs->set_powergating_state( > + (void *)&adev->ip_blocks[i], state); > + if (r) > + DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n", > + adev->ip_blocks[i].version->funcs->name, r); > + } > + return r; > +} > + I think it would also be cleaner to update amdgpu_device_ip_set_powergating_state() to take the instance as a new parameter. Same for amdgpu_device_ip_set_clockgating_state(). Alex > /** > * amdgpu_device_ip_get_clockgating_state - get the CG state > * > -- > 2.34.1 >