[PATCH 1/8] drm/amd/amdgpu: Added asic_type as ACP DMA driver platform data

Christian König deathsimple at vodafone.de
Mon Jun 26 13:29:06 UTC 2017


Am 23.06.2017 um 19:05 schrieb Alex Deucher:
> On Fri, Jun 23, 2017 at 12:43 PM, Christian König
> <deathsimple at vodafone.de> wrote:
>> Am 23.06.2017 um 18:34 schrieb Alex Deucher:
>>> From: Vijendar Mukunda <Vijendar.Mukunda at amd.com>
>>>
>>> asic_type information is passed to ACP DMA Driver as platform data.
>>> We need this to determine whether the asic is Carrizo (CZ) or
>>> Stoney (ST) in the acp sound driver.
>>>
>>> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
>>> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda at amd.com>
>>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>>> ---
>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 4 ++++
>>>    sound/soc/amd/acp-pcm-dma.c             | 8 ++------
>>>    sound/soc/amd/acp.h                     | 7 +++++++
>>>    3 files changed, 13 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
>>> index 06879d1..7a2a765 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
>>> @@ -262,6 +262,7 @@ static int acp_hw_init(void *handle)
>>>          uint64_t acp_base;
>>>          struct device *dev;
>>>          struct i2s_platform_data *i2s_pdata;
>>> +       u32 asic_type;
>>>          struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>>>    @@ -271,6 +272,7 @@ static int acp_hw_init(void *handle)
>>>          if (!ip_block)
>>>                  return -EINVAL;
>>>    +     asic_type = adev->asic_type;
>>>          r = amd_acp_hw_init(adev->acp.cgs_device,
>>>                              ip_block->version->major,
>>> ip_block->version->minor);
>>>          /* -ENODEV means board uses AZ rather than ACP */
>>> @@ -355,6 +357,8 @@ static int acp_hw_init(void *handle)
>>>          adev->acp.acp_cell[0].name = "acp_audio_dma";
>>>          adev->acp.acp_cell[0].num_resources = 4;
>>>          adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
>>> +       adev->acp.acp_cell[0].platform_data = &asic_type;
>>> +       adev->acp.acp_cell[0].pdata_size = sizeof(asic_type);
>>
>> Have the painkillers jellyfied my brain or are you setting a pointer in the
>> amdgpu device structure to some variable on the stack?
>>
>> If it's just for initialization then that's probably ok, but I would reset
>> the pointer at the end of the function.
>>
>> Otherwise somebody might have the idea to dereference it later on and that
>> can only lead to trouble.
> I think it's ok because the hotplug of the audio device is triggered
> from this function, so the audio device should be probed by the time
> this variable goes out of scope.  That said, it would probably be
> better to use the asic_type from the GPU driver instance directly
> rather than a stack variable.

Yeah, agree. But keeping a stale reference in to a stack variable in the 
driver struct is still ugly like hell.

At bare minimum set this to NULL at the end of the function, or even 
better use a intptr_t to encode the asic type into the pointer.

Christian.

>
> Alex
>
>
>> Christian.
>>
>>
>>>          adev->acp.acp_cell[1].name = "designware-i2s";
>>>          adev->acp.acp_cell[1].num_resources = 1;
>>> diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c
>>> index 08b1399..dcbf997 100644
>>> --- a/sound/soc/amd/acp-pcm-dma.c
>>> +++ b/sound/soc/amd/acp-pcm-dma.c
>>> @@ -73,12 +73,6 @@ static const struct snd_pcm_hardware
>>> acp_pcm_hardware_capture = {
>>>          .periods_max = CAPTURE_MAX_NUM_PERIODS,
>>>    };
>>>    -struct audio_drv_data {
>>> -       struct snd_pcm_substream *play_stream;
>>> -       struct snd_pcm_substream *capture_stream;
>>> -       void __iomem *acp_mmio;
>>> -};
>>> -
>>>    static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg)
>>>    {
>>>          return readl(acp_mmio + (reg * 4));
>>> @@ -916,6 +910,7 @@ static int acp_audio_probe(struct platform_device
>>> *pdev)
>>>          int status;
>>>          struct audio_drv_data *audio_drv_data;
>>>          struct resource *res;
>>> +       const u32 *pdata = pdev->dev.platform_data;
>>>          audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct
>>> audio_drv_data),
>>>                                          GFP_KERNEL);
>>> @@ -932,6 +927,7 @@ static int acp_audio_probe(struct platform_device
>>> *pdev)
>>>          audio_drv_data->play_stream = NULL;
>>>          audio_drv_data->capture_stream = NULL;
>>> +       audio_drv_data->asic_type =  *pdata;
>>>          res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
>>>          if (!res) {
>>> diff --git a/sound/soc/amd/acp.h b/sound/soc/amd/acp.h
>>> index 330832e..28cf914 100644
>>> --- a/sound/soc/amd/acp.h
>>> +++ b/sound/soc/amd/acp.h
>>> @@ -84,6 +84,13 @@ struct audio_substream_data {
>>>          void __iomem *acp_mmio;
>>>    };
>>>    +struct audio_drv_data {
>>> +       struct snd_pcm_substream *play_stream;
>>> +       struct snd_pcm_substream *capture_stream;
>>> +       void __iomem *acp_mmio;
>>> +       u32 asic_type;
>>> +};
>>> +
>>>    enum {
>>>          ACP_TILE_P1 = 0,
>>>          ACP_TILE_P2,
>>
>>



More information about the dri-devel mailing list