Re: [1/2] drm/amd/powerplay: smu_v11_0: fix uninitialized variable use

From: Arnd Bergmann
Date: Mon Jul 08 2019 - 11:58:36 EST


On Mon, Jul 8, 2019 at 5:02 PM Nathan Chancellor
<natechancellor@xxxxxxxxx> wrote:
> On Mon, Jul 08, 2019 at 04:07:58PM +0200, Arnd Bergmann wrote:
> > /* if don't has GetDpmClockFreq Message, try get current clock by SmuMetrics_t */
> > - if (smu_msg_get_index(smu, SMU_MSG_GetDpmClockFreq) == 0)
> > + if (smu_msg_get_index(smu, SMU_MSG_GetDpmClockFreq) == 0) {
> > ret = smu_get_current_clk_freq_by_table(smu, clk_id, &freq);
> > - else {
> > + if (ret)
> > + return ret;
>
> I am kind of surprised that this fixes the warning. If I am interpreting
> the warning correctly, it is complaining that the member
> get_current_clk_freq_by_table could be NULL and not be called to
> initialize freq and that entire statement will become 0. If that is the
> case, it seems like this added error handling won't fix that problem,
> right?

No, I'm fairly sure this is the right fix. Looking at the whole function:

| static int smu_v11_0_get_current_clk_freq(struct smu_context *smu,
| enum smu_clk_type clk_id,
| uint32_t *value)
|{
| int ret = 0;
| uint32_t freq;
|
| if (clk_id >= SMU_CLK_COUNT || !value)
| return -EINVAL;
|
| /* if don't has GetDpmClockFreq Message, try get current
clock by SmuMetrics_t */
| if (smu_msg_get_index(smu, SMU_MSG_GetDpmClockFreq) == 0) {
| ret = smu_get_current_clk_freq_by_table(smu, clk_id, &freq);

Here &freq may or may not get initialized

| } else {
| ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDpmClockFreq,
|
(smu_clk_get_index(smu, clk_id) << 16));
| if (ret)
| return ret;
|
| ret = smu_read_smc_arg(smu, &freq);
| if (ret)
| return ret;

Same here, but if it's not initialized, we bail out

| }
|
| freq *= 100;
| *value = freq;

And here it gets assigned to *value

| return ret;
|}

Arnd