* [bug report] drm/amdgpu: create I2S platform devices for Jadeite platform
@ 2022-07-26 15:17 Dan Carpenter
2022-07-27 6:36 ` Mukunda,Vijendar
0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2022-07-26 15:17 UTC (permalink / raw)
To: Vijendar.Mukunda; +Cc: amd-gfx
Hello Vijendar Mukunda,
The patch 4c33e5179ff1: "drm/amdgpu: create I2S platform devices for
Jadeite platform" from Jun 30, 2022, leads to the following Smatch
static checker warning:
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:393 acp_hw_init()
error: buffer overflow 'i2s_pdata' 3 <= 3
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:396 acp_hw_init()
error: buffer overflow 'i2s_pdata' 3 <= 3
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
225 static int acp_hw_init(void *handle)
226 {
227 int r;
228 u64 acp_base;
229 u32 val = 0;
230 u32 count = 0;
231 struct i2s_platform_data *i2s_pdata = NULL;
232
233 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
234
235 const struct amdgpu_ip_block *ip_block =
236 amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP);
237
238 if (!ip_block)
239 return -EINVAL;
240
241 r = amd_acp_hw_init(adev->acp.cgs_device,
242 ip_block->version->major, ip_block->version->minor);
243 /* -ENODEV means board uses AZ rather than ACP */
244 if (r == -ENODEV) {
245 amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_ACP, true);
246 return 0;
247 } else if (r) {
248 return r;
249 }
250
251 if (adev->rmmio_size == 0 || adev->rmmio_size < 0x5289)
252 return -EINVAL;
253
254 acp_base = adev->rmmio_base;
255 adev->acp.acp_genpd = kzalloc(sizeof(struct acp_pm_domain), GFP_KERNEL);
256 if (!adev->acp.acp_genpd)
257 return -ENOMEM;
258
259 adev->acp.acp_genpd->gpd.name = "ACP_AUDIO";
260 adev->acp.acp_genpd->gpd.power_off = acp_poweroff;
261 adev->acp.acp_genpd->gpd.power_on = acp_poweron;
262 adev->acp.acp_genpd->adev = adev;
263
264 pm_genpd_init(&adev->acp.acp_genpd->gpd, NULL, false);
265 dmi_check_system(acp_quirk_table);
266 switch (acp_machine_id) {
267 case ST_JADEITE:
268 {
269 adev->acp.acp_cell = kcalloc(2, sizeof(struct mfd_cell),
270 GFP_KERNEL);
271 if (!adev->acp.acp_cell) {
272 r = -ENOMEM;
273 goto failure;
274 }
275
276 adev->acp.acp_res = kcalloc(3, sizeof(struct resource), GFP_KERNEL);
277 if (!adev->acp.acp_res) {
278 r = -ENOMEM;
279 goto failure;
280 }
281
282 i2s_pdata = kcalloc(1, sizeof(struct i2s_platform_data), GFP_KERNEL);
283 if (!i2s_pdata) {
284 r = -ENOMEM;
285 goto failure;
286 }
287
288 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
289 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
290 i2s_pdata[0].cap = DWC_I2S_PLAY | DWC_I2S_RECORD;
291 i2s_pdata[0].snd_rates = SNDRV_PCM_RATE_8000_96000;
292 i2s_pdata[0].i2s_reg_comp1 = ACP_I2S_COMP1_CAP_REG_OFFSET;
293 i2s_pdata[0].i2s_reg_comp2 = ACP_I2S_COMP2_CAP_REG_OFFSET;
294
295 adev->acp.acp_res[0].name = "acp2x_dma";
296 adev->acp.acp_res[0].flags = IORESOURCE_MEM;
297 adev->acp.acp_res[0].start = acp_base;
298 adev->acp.acp_res[0].end = acp_base + ACP_DMA_REGS_END;
299
300 adev->acp.acp_res[1].name = "acp2x_dw_i2s_play_cap";
301 adev->acp.acp_res[1].flags = IORESOURCE_MEM;
302 adev->acp.acp_res[1].start = acp_base + ACP_I2S_CAP_REGS_START;
303 adev->acp.acp_res[1].end = acp_base + ACP_I2S_CAP_REGS_END;
304
305 adev->acp.acp_res[2].name = "acp2x_dma_irq";
306 adev->acp.acp_res[2].flags = IORESOURCE_IRQ;
307 adev->acp.acp_res[2].start = amdgpu_irq_create_mapping(adev, 162);
308 adev->acp.acp_res[2].end = adev->acp.acp_res[2].start;
309
310 adev->acp.acp_cell[0].name = "acp_audio_dma";
311 adev->acp.acp_cell[0].num_resources = 3;
312 adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
313 adev->acp.acp_cell[0].platform_data = &adev->asic_type;
314 adev->acp.acp_cell[0].pdata_size = sizeof(adev->asic_type);
315
316 adev->acp.acp_cell[1].name = "designware-i2s";
317 adev->acp.acp_cell[1].num_resources = 1;
318 adev->acp.acp_cell[1].resources = &adev->acp.acp_res[1];
319 adev->acp.acp_cell[1].platform_data = &i2s_pdata[0];
320 adev->acp.acp_cell[1].pdata_size = sizeof(struct i2s_platform_data);
321 r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell, 2);
322 if (r)
323 goto failure;
324 r = device_for_each_child(adev->acp.parent, &adev->acp.acp_genpd->gpd,
325 acp_genpd_add_device);
326 if (r)
327 goto failure;
328 break;
329 }
330 default:
331 adev->acp.acp_cell = kcalloc(ACP_DEVS, sizeof(struct mfd_cell),
332 GFP_KERNEL);
333
334 if (!adev->acp.acp_cell) {
335 r = -ENOMEM;
336 goto failure;
337 }
338
339 adev->acp.acp_res = kcalloc(5, sizeof(struct resource), GFP_KERNEL);
340 if (!adev->acp.acp_res) {
341 r = -ENOMEM;
342 goto failure;
343 }
344
345 i2s_pdata = kcalloc(3, sizeof(struct i2s_platform_data), GFP_KERNEL);
^
3 elements
346 if (!i2s_pdata) {
347 r = -ENOMEM;
348 goto failure;
349 }
350
351 switch (adev->asic_type) {
352 case CHIP_STONEY:
353 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
354 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
355 break;
356 default:
357 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
358 }
359 i2s_pdata[0].cap = DWC_I2S_PLAY;
360 i2s_pdata[0].snd_rates = SNDRV_PCM_RATE_8000_96000;
361 i2s_pdata[0].i2s_reg_comp1 = ACP_I2S_COMP1_PLAY_REG_OFFSET;
362 i2s_pdata[0].i2s_reg_comp2 = ACP_I2S_COMP2_PLAY_REG_OFFSET;
363 switch (adev->asic_type) {
364 case CHIP_STONEY:
365 i2s_pdata[1].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
366 DW_I2S_QUIRK_COMP_PARAM1 |
367 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
368 break;
369 default:
370 i2s_pdata[1].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
371 DW_I2S_QUIRK_COMP_PARAM1;
372 }
373
374 i2s_pdata[1].cap = DWC_I2S_RECORD;
375 i2s_pdata[1].snd_rates = SNDRV_PCM_RATE_8000_96000;
376 i2s_pdata[1].i2s_reg_comp1 = ACP_I2S_COMP1_CAP_REG_OFFSET;
377 i2s_pdata[1].i2s_reg_comp2 = ACP_I2S_COMP2_CAP_REG_OFFSET;
378
379 i2s_pdata[2].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
380 switch (adev->asic_type) {
381 case CHIP_STONEY:
382 i2s_pdata[2].quirks |= DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
383 break;
384 default:
385 break;
386 }
387
388 i2s_pdata[2].cap = DWC_I2S_PLAY | DWC_I2S_RECORD;
389 i2s_pdata[2].snd_rates = SNDRV_PCM_RATE_8000_96000;
390 i2s_pdata[2].i2s_reg_comp1 = ACP_BT_COMP1_REG_OFFSET;
391 i2s_pdata[2].i2s_reg_comp2 = ACP_BT_COMP2_REG_OFFSET;
392
--> 393 i2s_pdata[3].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
^^^^^^^^^^^^
394 switch (adev->asic_type) {
395 case CHIP_STONEY:
396 i2s_pdata[3].quirks |= DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
^^^^^^^^^^^^
Out of boundses.
397 break;
398 default:
399 break;
400 }
401 adev->acp.acp_res[0].name = "acp2x_dma";
402 adev->acp.acp_res[0].flags = IORESOURCE_MEM;
403 adev->acp.acp_res[0].start = acp_base;
404 adev->acp.acp_res[0].end = acp_base + ACP_DMA_REGS_END;
405
406 adev->acp.acp_res[1].name = "acp2x_dw_i2s_play";
407 adev->acp.acp_res[1].flags = IORESOURCE_MEM;
408 adev->acp.acp_res[1].start = acp_base + ACP_I2S_PLAY_REGS_START;
409 adev->acp.acp_res[1].end = acp_base + ACP_I2S_PLAY_REGS_END;
410
411 adev->acp.acp_res[2].name = "acp2x_dw_i2s_cap";
412 adev->acp.acp_res[2].flags = IORESOURCE_MEM;
413 adev->acp.acp_res[2].start = acp_base + ACP_I2S_CAP_REGS_START;
414 adev->acp.acp_res[2].end = acp_base + ACP_I2S_CAP_REGS_END;
415
416 adev->acp.acp_res[3].name = "acp2x_dw_bt_i2s_play_cap";
417 adev->acp.acp_res[3].flags = IORESOURCE_MEM;
418 adev->acp.acp_res[3].start = acp_base + ACP_BT_PLAY_REGS_START;
419 adev->acp.acp_res[3].end = acp_base + ACP_BT_PLAY_REGS_END;
420
421 adev->acp.acp_res[4].name = "acp2x_dma_irq";
422 adev->acp.acp_res[4].flags = IORESOURCE_IRQ;
423 adev->acp.acp_res[4].start = amdgpu_irq_create_mapping(adev, 162);
424 adev->acp.acp_res[4].end = adev->acp.acp_res[4].start;
425
426 adev->acp.acp_cell[0].name = "acp_audio_dma";
427 adev->acp.acp_cell[0].num_resources = 5;
428 adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
429 adev->acp.acp_cell[0].platform_data = &adev->asic_type;
430 adev->acp.acp_cell[0].pdata_size = sizeof(adev->asic_type);
431
432 adev->acp.acp_cell[1].name = "designware-i2s";
433 adev->acp.acp_cell[1].num_resources = 1;
434 adev->acp.acp_cell[1].resources = &adev->acp.acp_res[1];
435 adev->acp.acp_cell[1].platform_data = &i2s_pdata[0];
436 adev->acp.acp_cell[1].pdata_size = sizeof(struct i2s_platform_data);
437
438 adev->acp.acp_cell[2].name = "designware-i2s";
439 adev->acp.acp_cell[2].num_resources = 1;
440 adev->acp.acp_cell[2].resources = &adev->acp.acp_res[2];
441 adev->acp.acp_cell[2].platform_data = &i2s_pdata[1];
442 adev->acp.acp_cell[2].pdata_size = sizeof(struct i2s_platform_data);
443
444 adev->acp.acp_cell[3].name = "designware-i2s";
445 adev->acp.acp_cell[3].num_resources = 1;
446 adev->acp.acp_cell[3].resources = &adev->acp.acp_res[3];
447 adev->acp.acp_cell[3].platform_data = &i2s_pdata[2];
448 adev->acp.acp_cell[3].pdata_size = sizeof(struct i2s_platform_data);
449
450 r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell, ACP_DEVS);
451 if (r)
452 goto failure;
453
454 r = device_for_each_child(adev->acp.parent, &adev->acp.acp_genpd->gpd,
455 acp_genpd_add_device);
456 if (r)
457 goto failure;
458 }
459
460 /* Assert Soft reset of ACP */
461 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
462
463 val |= ACP_SOFT_RESET__SoftResetAud_MASK;
464 cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val);
465
466 count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
467 while (true) {
468 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
469 if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
470 (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
471 break;
472 if (--count == 0) {
473 dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
474 r = -ETIMEDOUT;
475 goto failure;
476 }
477 udelay(100);
478 }
479 /* Enable clock to ACP and wait until the clock is enabled */
480 val = cgs_read_register(adev->acp.cgs_device, mmACP_CONTROL);
481 val = val | ACP_CONTROL__ClkEn_MASK;
482 cgs_write_register(adev->acp.cgs_device, mmACP_CONTROL, val);
483
484 count = ACP_CLOCK_EN_TIME_OUT_VALUE;
485
486 while (true) {
487 val = cgs_read_register(adev->acp.cgs_device, mmACP_STATUS);
488 if (val & (u32) 0x1)
489 break;
490 if (--count == 0) {
491 dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
492 r = -ETIMEDOUT;
493 goto failure;
494 }
495 udelay(100);
496 }
497 /* Deassert the SOFT RESET flags */
498 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
499 val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
500 cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val);
501 return 0;
502
503 failure:
504 kfree(i2s_pdata);
505 kfree(adev->acp.acp_res);
506 kfree(adev->acp.acp_cell);
507 kfree(adev->acp.acp_genpd);
508 return r;
509 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [bug report] drm/amdgpu: create I2S platform devices for Jadeite platform
2022-07-26 15:17 [bug report] drm/amdgpu: create I2S platform devices for Jadeite platform Dan Carpenter
@ 2022-07-27 6:36 ` Mukunda,Vijendar
0 siblings, 0 replies; 2+ messages in thread
From: Mukunda,Vijendar @ 2022-07-27 6:36 UTC (permalink / raw)
To: Dan Carpenter; +Cc: Dommati, Sunil-kumar, amd-gfx
On 7/26/22 8:47 PM, Dan Carpenter wrote:
> Hello Vijendar Mukunda,
>
> The patch 4c33e5179ff1: "drm/amdgpu: create I2S platform devices for
> Jadeite platform" from Jun 30, 2022, leads to the following Smatch
> static checker warning:
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:393 acp_hw_init()
> error: buffer overflow 'i2s_pdata' 3 <= 3
> drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c:396 acp_hw_init()
> error: buffer overflow 'i2s_pdata' 3 <= 3
will fix it and provide a patch.
--
Vijendar
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
> 225 static int acp_hw_init(void *handle)
> 226 {
> 227 int r;
> 228 u64 acp_base;
> 229 u32 val = 0;
> 230 u32 count = 0;
> 231 struct i2s_platform_data *i2s_pdata = NULL;
> 232
> 233 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 234
> 235 const struct amdgpu_ip_block *ip_block =
> 236 amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP);
> 237
> 238 if (!ip_block)
> 239 return -EINVAL;
> 240
> 241 r = amd_acp_hw_init(adev->acp.cgs_device,
> 242 ip_block->version->major, ip_block->version->minor);
> 243 /* -ENODEV means board uses AZ rather than ACP */
> 244 if (r == -ENODEV) {
> 245 amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_ACP, true);
> 246 return 0;
> 247 } else if (r) {
> 248 return r;
> 249 }
> 250
> 251 if (adev->rmmio_size == 0 || adev->rmmio_size < 0x5289)
> 252 return -EINVAL;
> 253
> 254 acp_base = adev->rmmio_base;
> 255 adev->acp.acp_genpd = kzalloc(sizeof(struct acp_pm_domain), GFP_KERNEL);
> 256 if (!adev->acp.acp_genpd)
> 257 return -ENOMEM;
> 258
> 259 adev->acp.acp_genpd->gpd.name = "ACP_AUDIO";
> 260 adev->acp.acp_genpd->gpd.power_off = acp_poweroff;
> 261 adev->acp.acp_genpd->gpd.power_on = acp_poweron;
> 262 adev->acp.acp_genpd->adev = adev;
> 263
> 264 pm_genpd_init(&adev->acp.acp_genpd->gpd, NULL, false);
> 265 dmi_check_system(acp_quirk_table);
> 266 switch (acp_machine_id) {
> 267 case ST_JADEITE:
> 268 {
> 269 adev->acp.acp_cell = kcalloc(2, sizeof(struct mfd_cell),
> 270 GFP_KERNEL);
> 271 if (!adev->acp.acp_cell) {
> 272 r = -ENOMEM;
> 273 goto failure;
> 274 }
> 275
> 276 adev->acp.acp_res = kcalloc(3, sizeof(struct resource), GFP_KERNEL);
> 277 if (!adev->acp.acp_res) {
> 278 r = -ENOMEM;
> 279 goto failure;
> 280 }
> 281
> 282 i2s_pdata = kcalloc(1, sizeof(struct i2s_platform_data), GFP_KERNEL);
> 283 if (!i2s_pdata) {
> 284 r = -ENOMEM;
> 285 goto failure;
> 286 }
> 287
> 288 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
> 289 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
> 290 i2s_pdata[0].cap = DWC_I2S_PLAY | DWC_I2S_RECORD;
> 291 i2s_pdata[0].snd_rates = SNDRV_PCM_RATE_8000_96000;
> 292 i2s_pdata[0].i2s_reg_comp1 = ACP_I2S_COMP1_CAP_REG_OFFSET;
> 293 i2s_pdata[0].i2s_reg_comp2 = ACP_I2S_COMP2_CAP_REG_OFFSET;
> 294
> 295 adev->acp.acp_res[0].name = "acp2x_dma";
> 296 adev->acp.acp_res[0].flags = IORESOURCE_MEM;
> 297 adev->acp.acp_res[0].start = acp_base;
> 298 adev->acp.acp_res[0].end = acp_base + ACP_DMA_REGS_END;
> 299
> 300 adev->acp.acp_res[1].name = "acp2x_dw_i2s_play_cap";
> 301 adev->acp.acp_res[1].flags = IORESOURCE_MEM;
> 302 adev->acp.acp_res[1].start = acp_base + ACP_I2S_CAP_REGS_START;
> 303 adev->acp.acp_res[1].end = acp_base + ACP_I2S_CAP_REGS_END;
> 304
> 305 adev->acp.acp_res[2].name = "acp2x_dma_irq";
> 306 adev->acp.acp_res[2].flags = IORESOURCE_IRQ;
> 307 adev->acp.acp_res[2].start = amdgpu_irq_create_mapping(adev, 162);
> 308 adev->acp.acp_res[2].end = adev->acp.acp_res[2].start;
> 309
> 310 adev->acp.acp_cell[0].name = "acp_audio_dma";
> 311 adev->acp.acp_cell[0].num_resources = 3;
> 312 adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
> 313 adev->acp.acp_cell[0].platform_data = &adev->asic_type;
> 314 adev->acp.acp_cell[0].pdata_size = sizeof(adev->asic_type);
> 315
> 316 adev->acp.acp_cell[1].name = "designware-i2s";
> 317 adev->acp.acp_cell[1].num_resources = 1;
> 318 adev->acp.acp_cell[1].resources = &adev->acp.acp_res[1];
> 319 adev->acp.acp_cell[1].platform_data = &i2s_pdata[0];
> 320 adev->acp.acp_cell[1].pdata_size = sizeof(struct i2s_platform_data);
> 321 r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell, 2);
> 322 if (r)
> 323 goto failure;
> 324 r = device_for_each_child(adev->acp.parent, &adev->acp.acp_genpd->gpd,
> 325 acp_genpd_add_device);
> 326 if (r)
> 327 goto failure;
> 328 break;
> 329 }
> 330 default:
> 331 adev->acp.acp_cell = kcalloc(ACP_DEVS, sizeof(struct mfd_cell),
> 332 GFP_KERNEL);
> 333
> 334 if (!adev->acp.acp_cell) {
> 335 r = -ENOMEM;
> 336 goto failure;
> 337 }
> 338
> 339 adev->acp.acp_res = kcalloc(5, sizeof(struct resource), GFP_KERNEL);
> 340 if (!adev->acp.acp_res) {
> 341 r = -ENOMEM;
> 342 goto failure;
> 343 }
> 344
> 345 i2s_pdata = kcalloc(3, sizeof(struct i2s_platform_data), GFP_KERNEL);
> ^
> 3 elements
>
> 346 if (!i2s_pdata) {
> 347 r = -ENOMEM;
> 348 goto failure;
> 349 }
> 350
> 351 switch (adev->asic_type) {
> 352 case CHIP_STONEY:
> 353 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
> 354 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
> 355 break;
> 356 default:
> 357 i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
> 358 }
> 359 i2s_pdata[0].cap = DWC_I2S_PLAY;
> 360 i2s_pdata[0].snd_rates = SNDRV_PCM_RATE_8000_96000;
> 361 i2s_pdata[0].i2s_reg_comp1 = ACP_I2S_COMP1_PLAY_REG_OFFSET;
> 362 i2s_pdata[0].i2s_reg_comp2 = ACP_I2S_COMP2_PLAY_REG_OFFSET;
> 363 switch (adev->asic_type) {
> 364 case CHIP_STONEY:
> 365 i2s_pdata[1].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
> 366 DW_I2S_QUIRK_COMP_PARAM1 |
> 367 DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
> 368 break;
> 369 default:
> 370 i2s_pdata[1].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
> 371 DW_I2S_QUIRK_COMP_PARAM1;
> 372 }
> 373
> 374 i2s_pdata[1].cap = DWC_I2S_RECORD;
> 375 i2s_pdata[1].snd_rates = SNDRV_PCM_RATE_8000_96000;
> 376 i2s_pdata[1].i2s_reg_comp1 = ACP_I2S_COMP1_CAP_REG_OFFSET;
> 377 i2s_pdata[1].i2s_reg_comp2 = ACP_I2S_COMP2_CAP_REG_OFFSET;
> 378
> 379 i2s_pdata[2].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
> 380 switch (adev->asic_type) {
> 381 case CHIP_STONEY:
> 382 i2s_pdata[2].quirks |= DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
> 383 break;
> 384 default:
> 385 break;
> 386 }
> 387
> 388 i2s_pdata[2].cap = DWC_I2S_PLAY | DWC_I2S_RECORD;
> 389 i2s_pdata[2].snd_rates = SNDRV_PCM_RATE_8000_96000;
> 390 i2s_pdata[2].i2s_reg_comp1 = ACP_BT_COMP1_REG_OFFSET;
> 391 i2s_pdata[2].i2s_reg_comp2 = ACP_BT_COMP2_REG_OFFSET;
> 392
> --> 393 i2s_pdata[3].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
> ^^^^^^^^^^^^
>
> 394 switch (adev->asic_type) {
> 395 case CHIP_STONEY:
> 396 i2s_pdata[3].quirks |= DW_I2S_QUIRK_16BIT_IDX_OVERRIDE;
> ^^^^^^^^^^^^
>
> Out of boundses.
>
> 397 break;
> 398 default:
> 399 break;
> 400 }
> 401 adev->acp.acp_res[0].name = "acp2x_dma";
> 402 adev->acp.acp_res[0].flags = IORESOURCE_MEM;
> 403 adev->acp.acp_res[0].start = acp_base;
> 404 adev->acp.acp_res[0].end = acp_base + ACP_DMA_REGS_END;
> 405
> 406 adev->acp.acp_res[1].name = "acp2x_dw_i2s_play";
> 407 adev->acp.acp_res[1].flags = IORESOURCE_MEM;
> 408 adev->acp.acp_res[1].start = acp_base + ACP_I2S_PLAY_REGS_START;
> 409 adev->acp.acp_res[1].end = acp_base + ACP_I2S_PLAY_REGS_END;
> 410
> 411 adev->acp.acp_res[2].name = "acp2x_dw_i2s_cap";
> 412 adev->acp.acp_res[2].flags = IORESOURCE_MEM;
> 413 adev->acp.acp_res[2].start = acp_base + ACP_I2S_CAP_REGS_START;
> 414 adev->acp.acp_res[2].end = acp_base + ACP_I2S_CAP_REGS_END;
> 415
> 416 adev->acp.acp_res[3].name = "acp2x_dw_bt_i2s_play_cap";
> 417 adev->acp.acp_res[3].flags = IORESOURCE_MEM;
> 418 adev->acp.acp_res[3].start = acp_base + ACP_BT_PLAY_REGS_START;
> 419 adev->acp.acp_res[3].end = acp_base + ACP_BT_PLAY_REGS_END;
> 420
> 421 adev->acp.acp_res[4].name = "acp2x_dma_irq";
> 422 adev->acp.acp_res[4].flags = IORESOURCE_IRQ;
> 423 adev->acp.acp_res[4].start = amdgpu_irq_create_mapping(adev, 162);
> 424 adev->acp.acp_res[4].end = adev->acp.acp_res[4].start;
> 425
> 426 adev->acp.acp_cell[0].name = "acp_audio_dma";
> 427 adev->acp.acp_cell[0].num_resources = 5;
> 428 adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
> 429 adev->acp.acp_cell[0].platform_data = &adev->asic_type;
> 430 adev->acp.acp_cell[0].pdata_size = sizeof(adev->asic_type);
> 431
> 432 adev->acp.acp_cell[1].name = "designware-i2s";
> 433 adev->acp.acp_cell[1].num_resources = 1;
> 434 adev->acp.acp_cell[1].resources = &adev->acp.acp_res[1];
> 435 adev->acp.acp_cell[1].platform_data = &i2s_pdata[0];
> 436 adev->acp.acp_cell[1].pdata_size = sizeof(struct i2s_platform_data);
> 437
> 438 adev->acp.acp_cell[2].name = "designware-i2s";
> 439 adev->acp.acp_cell[2].num_resources = 1;
> 440 adev->acp.acp_cell[2].resources = &adev->acp.acp_res[2];
> 441 adev->acp.acp_cell[2].platform_data = &i2s_pdata[1];
> 442 adev->acp.acp_cell[2].pdata_size = sizeof(struct i2s_platform_data);
> 443
> 444 adev->acp.acp_cell[3].name = "designware-i2s";
> 445 adev->acp.acp_cell[3].num_resources = 1;
> 446 adev->acp.acp_cell[3].resources = &adev->acp.acp_res[3];
> 447 adev->acp.acp_cell[3].platform_data = &i2s_pdata[2];
> 448 adev->acp.acp_cell[3].pdata_size = sizeof(struct i2s_platform_data);
> 449
> 450 r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell, ACP_DEVS);
> 451 if (r)
> 452 goto failure;
> 453
> 454 r = device_for_each_child(adev->acp.parent, &adev->acp.acp_genpd->gpd,
> 455 acp_genpd_add_device);
> 456 if (r)
> 457 goto failure;
> 458 }
> 459
> 460 /* Assert Soft reset of ACP */
> 461 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
> 462
> 463 val |= ACP_SOFT_RESET__SoftResetAud_MASK;
> 464 cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val);
> 465
> 466 count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
> 467 while (true) {
> 468 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
> 469 if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
> 470 (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
> 471 break;
> 472 if (--count == 0) {
> 473 dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
> 474 r = -ETIMEDOUT;
> 475 goto failure;
> 476 }
> 477 udelay(100);
> 478 }
> 479 /* Enable clock to ACP and wait until the clock is enabled */
> 480 val = cgs_read_register(adev->acp.cgs_device, mmACP_CONTROL);
> 481 val = val | ACP_CONTROL__ClkEn_MASK;
> 482 cgs_write_register(adev->acp.cgs_device, mmACP_CONTROL, val);
> 483
> 484 count = ACP_CLOCK_EN_TIME_OUT_VALUE;
> 485
> 486 while (true) {
> 487 val = cgs_read_register(adev->acp.cgs_device, mmACP_STATUS);
> 488 if (val & (u32) 0x1)
> 489 break;
> 490 if (--count == 0) {
> 491 dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
> 492 r = -ETIMEDOUT;
> 493 goto failure;
> 494 }
> 495 udelay(100);
> 496 }
> 497 /* Deassert the SOFT RESET flags */
> 498 val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
> 499 val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
> 500 cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val);
> 501 return 0;
> 502
> 503 failure:
> 504 kfree(i2s_pdata);
> 505 kfree(adev->acp.acp_res);
> 506 kfree(adev->acp.acp_cell);
> 507 kfree(adev->acp.acp_genpd);
> 508 return r;
> 509 }
>
> regards,
> dan carpenter
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-07-27 6:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-26 15:17 [bug report] drm/amdgpu: create I2S platform devices for Jadeite platform Dan Carpenter
2022-07-27 6:36 ` Mukunda,Vijendar
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.