[06/14] drm/ast: Set PCI config before accessing I/O registers

Thomas Zimmermann tzimmermann at suse.de
Mon Jun 19 08:24:52 UTC 2023


Hi

Am 19.06.23 um 10:19 schrieb Sui Jingfeng:
> Hi,
> 
> On 2023/6/19 15:59, Thomas Zimmermann wrote:
>> Hi
>>
>> Am 17.06.23 um 10:01 schrieb Sui Jingfeng:
>>>
>>> On 2023/6/16 21:52, Thomas Zimmermann wrote:
>>>> Access to I/O registers is required to detect and set up the
>>>> device. Enable the rsp PCI config bits before. While at it,
>>>> convert the magic number to macro constants.
>>>>
>>>> Enabling the PCI config bits was done after trying to detect
>>>> the device. It was probably too late at this point.
>>>>
>>>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
>>>> ---
>>>>   drivers/gpu/drm/ast/ast_drv.h  |  2 ++
>>>>   drivers/gpu/drm/ast/ast_main.c | 22 ++++++++++++++++++++++
>>>>   drivers/gpu/drm/ast/ast_post.c |  6 ------
>>>>   3 files changed, 24 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/ast/ast_drv.h 
>>>> b/drivers/gpu/drm/ast/ast_drv.h
>>>> index 0141705beaee9..555a0850957f3 100644
>>>> --- a/drivers/gpu/drm/ast/ast_drv.h
>>>> +++ b/drivers/gpu/drm/ast/ast_drv.h
>>>> @@ -52,6 +52,8 @@
>>>>   #define PCI_CHIP_AST2000 0x2000
>>>>   #define PCI_CHIP_AST2100 0x2010
>>>> +#define AST_PCI_OPTION_MEM_ACCESS_ENABLE    BIT(1)
>>>> +#define AST_PCI_OPTION_IO_ACCESS_ENABLE        BIT(0)
>>>>   enum ast_chip {
>>>>       AST2000,
>>>> diff --git a/drivers/gpu/drm/ast/ast_main.c 
>>>> b/drivers/gpu/drm/ast/ast_main.c
>>>> index c6987e0446618..fe054739b494a 100644
>>>> --- a/drivers/gpu/drm/ast/ast_main.c
>>>> +++ b/drivers/gpu/drm/ast/ast_main.c
>>>> @@ -35,6 +35,24 @@
>>>>   #include "ast_drv.h"
>>>> +static int ast_init_pci_config(struct pci_dev *pdev)
>>>> +{
>>>> +    int err;
>>>> +    u32 pcis04;
>>>> +
>>>> +    err = pci_read_config_dword(pdev, 0x04, &pcis04);
>>>
>>> The third argument of pci_read_config_dword() function should be 'u16 
>>> *' type;
>>
>> No, a dword is a 32-bit integer.
>>
> Yes, you are right.
> 
> 'u32' is for the pci_read_config_dword() function.
> 
> I'm recommend you to use the pci_read_config_word() function.
> 
> Sorry for the noise.

No problem, please see my other reply. The PCI and ast specs disagree a 
bit. I'm considering to change this to the 16-bit access.

Best regards
Thomas

> 
>>>
>>>
>>>> +    if (err)
>>>> +        goto out;
>>>> +
>>>> +    pcis04 |= AST_PCI_OPTION_MEM_ACCESS_ENABLE |
>>>> +          AST_PCI_OPTION_IO_ACCESS_ENABLE;
>>>> +
>>>> +    err = pci_write_config_dword(pdev, 0x04, pcis04);
>>>> +
>>>> +out:
>>>> +    return pcibios_err_to_errno(err);
>>>> +}
>>>
>>>
>>> static void ast_enable_mem_io(struct pci_dev *pdev)
>>> {
>>>      u16 cmd;
>>>
>>>      pci_read_config_word(pdev, PCI_COMMAND, &cmd);
>>>
>>>      cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
>>>
>>>      pci_write_config_word(pdev, PCI_COMMAND, &cmd);
>>> }
>>>
>>>>   static void ast_detect_config_mode(struct drm_device *dev, u32 
>>>> *scu_rev)
>>>>   {
>>>>       struct device_node *np = dev->dev->of_node;
>>>> @@ -399,6 +417,10 @@ struct ast_device *ast_device_create(const 
>>>> struct drm_driver *drv,
>>>>               return ERR_PTR(-EIO);
>>>>       }
>>>> +    ret = ast_init_pci_config(pdev);
>>>> +    if (ret)
>>>> +        return ERR_PTR(ret);
>>>> +
>>>>       if (!ast_is_vga_enabled(dev)) {
>>>>           drm_info(dev, "VGA not enabled on entry, requesting chip 
>>>> POST\n");
>>>>           need_post = true;
>>>> diff --git a/drivers/gpu/drm/ast/ast_post.c 
>>>> b/drivers/gpu/drm/ast/ast_post.c
>>>> index aa3f2cb00f82c..2da5bdb4bac45 100644
>>>> --- a/drivers/gpu/drm/ast/ast_post.c
>>>> +++ b/drivers/gpu/drm/ast/ast_post.c
>>>> @@ -361,12 +361,6 @@ static void ast_init_dram_reg(struct drm_device 
>>>> *dev)
>>>>   void ast_post_gpu(struct drm_device *dev)
>>>>   {
>>>>       struct ast_device *ast = to_ast_device(dev);
>>>> -    struct pci_dev *pdev = to_pci_dev(dev->dev);
>>>> -    u32 reg;
>>>> -
>>>> -    pci_read_config_dword(pdev, 0x04, &reg);
>>>> -    reg |= 0x3;
>>>> -    pci_write_config_dword(pdev, 0x04, reg);
>>>>       ast_enable_vga(dev);
>>>>       ast_open_key(ast);
>>>
>>

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20230619/4fabdb17/attachment.sig>


More information about the dri-devel mailing list