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

Sui Jingfeng suijingfeng at loongson.cn
Mon Jun 19 08:08:50 UTC 2023


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.
>
I meant the "u32 pcis04" should be declared as "u16 pcis04", right ?

>>
>>
>>> +    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);
>>
>
-- 
Jingfeng



More information about the dri-devel mailing list