• akshatzen's avatar
    scsi: pm80xx: Check main config table address · 95652f98
    akshatzen authored
    The driver initializes main configuration, general status, inbound queue
    and outbound queue table addresses based on a value read from
    MSGU_SCRATCH_PAD_0 register.
    
    We should validate these addresses before dereferencing them.
    
    Adds two validations:
    
     1. Check if main configuration table offset lies within the pcibar
        mapped
    
     2. Check if first dword of main configuration table reads "PMCS"
    
    There are two calls to init_pci_device_addresses() done during
    pm8001_pci_probe() in this sequence:
    
     1. First inside chip_soft_rst, where if init_pci_device_addresses fails we
        will go ahead assuming MPI state is not ready and reset the device as
        long as bootloader is okay.  This gives chance to second call of
        init_pci_device_addresses to set up the addresses after reset.
    
     2. The second call is via pm80xx_chip_init, after soft reset is done and
        firmware is checked to be ready. Once that is done we are safe to go
        ahead and initialize default table values and use them.
    
    Tests:
    
     1. Enabled debugging logs and observed no issues during initialization,
        with a controller with no issues:
    
        pm80xx0:: pm8001_setup_msix 1034: pci_alloc_irq_vectors request ret:64 no of intr 64
        pm80xx0:: init_pci_device_addresses 917: Scratchpad 0 Offset: 0x2000 value 0x40002000
        pm80xx0:: init_pci_device_addresses 925: Scratchpad 0 PCI BAR: 0
        pm80xx0:: init_pci_device_addresses 952: VALID main config signature 0x53434d50
        pm80xx0:: init_pci_device_addresses 975: GST OFFSET 0xc4
        pm80xx0:: init_pci_device_addresses 978: INBND OFFSET 0x20000128
        pm80xx0:: init_pci_device_addresses 981: OBND OFFSET 0x24000928
        pm80xx0:: init_pci_device_addresses 984: IVT OFFSET 0x8001408
        pm80xx0:: init_pci_device_addresses 987: PSPA OFFSET 0x8001608
        pm80xx0:: init_pci_device_addresses 991: addr - main cfg (ptrval) general status (ptrval)
        pm80xx0:: init_pci_device_addresses 995: addr - inbnd (ptrval) obnd (ptrval)
        pm80xx0:: init_pci_device_addresses 999: addr - pspa (ptrval) ivt (ptrval)
        pm80xx0:: pm80xx_chip_soft_rst 1446: reset register before write : 0x0
        pm80xx0:: pm80xx_chip_soft_rst 1478: reset register after write 0x40
        pm80xx0:: pm80xx_chip_soft_rst 1544: SPCv soft reset Complete
        pm80xx0:: init_pci_device_addresses 917: Scratchpad 0 Offset: 0x2000 value 0x40002000
        pm80xx0:: init_pci_device_addresses 925: Scratchpad 0 PCI BAR: 0
        pm80xx0:: init_pci_device_addresses 952: VALID main config signature 0x53434d50
        pm80xx0:: init_pci_device_addresses 975: GST OFFSET 0xc4
        pm80xx0:: init_pci_device_addresses 978: INBND OFFSET 0x20000128
        pm80xx0:: init_pci_device_addresses 981: OBND OFFSET 0x24000928
        pm80xx0:: init_pci_device_addresses 984: IVT OFFSET 0x8001408
        pm80xx0:: init_pci_device_addresses 987: PSPA OFFSET 0x8001608
        pm80xx0:: init_pci_device_addresses 991: addr - main cfg (ptrval) general status (ptrval)
        pm80xx0:: init_pci_device_addresses 995: addr - inbnd (ptrval) obnd (ptrval)
        pm80xx0:: init_pci_device_addresses 999: addr - pspa (ptrval) ivt (ptrval)
        pm80xx0:: pm80xx_chip_init 1329: MPI initialize successful!
    
     2. Tested controller with firmware known to have initialization issue and
        observed no crashes with this fix:
    
        pm80xx 0000:01:00.0: pm80xx: driver version 0.1.38
        pm80xx 0000:01:00.0: Removing from 1:1 domain
        pm80xx 0000:01:00.0: Requesting non-1:1 mappings
        pm80xx0:: init_pci_device_addresses 948: BAD main config signature 0x0
        pm80xx0:: mpi_uninit_check 1365: Failed to init pci addresses
        pm80xx0:: pm80xx_chip_soft_rst 1435: MPI state is not ready scratch:0:8:62a01000:0
        pm80xx0:: pm80xx_chip_soft_rst 1518: Firmware is not ready!
        pm80xx0:: pm80xx_chip_soft_rst 1532: iButton Feature is not Available!!!
        pm80xx0:: pm80xx_chip_init 1301: Firmware is not ready!
        pm80xx0:: pm8001_pci_probe 1215: chip_init failed [ret: -16]
        pm80xx: probe of 0000:01:00.0 failed with error -16
        pm80xx 0000:07:00.0: pm80xx: driver version 0.1.38
        pm80xx 0000:07:00.0: Removing from 1:1 domain
        pm80xx 0000:07:00.0: Requesting non-1:1 mappings
        scsi host6: pm80xx
        pm80xx1:: pm8001_setup_sgpio 5568: failed sgpio_req timeout
        pm80xx1:: mpi_phy_start_resp 3447: phy start resp status:0x0, phyid:0x0
        pm80xx 0000:08:00.0: pm80xx: driver version 0.1.38
        pm80xx 0000:08:00.0: Removing from 1:1 domain
        pm80xx 0000:08:00.0: Requesting non-1:1 mappings
    
     3. Without this fix we observe crash on the same controller:
    
        pm80xx 0000:01:00.0: pm80xx: driver version 0.1.38
        pm80xx 0000:01:00.0: Removing from 1:1 domain
        pm80xx 0000:01:00.0: Requesting non-1:1 mappings
        [<ffffffffc0451b3b>] pm80xx_chip_soft_rst+0x6b/0x4c0 [pm80xx]
        [<ffffffffc043a933>] pm8001_pci_probe+0xa43/0x1630 [pm80xx]
        RIP: 0010:pm80xx_chip_soft_rst+0x71/0x4c0 [pm80xx]
        [<ffffffffc0451b3b>] ? pm80xx_chip_soft_rst+0x6b/0x4c0 [pm80xx]
        [<ffffffffc043a933>] pm8001_pci_probe+0xa43/0x1630 [pm80xx]
        pm80xx0:: mpi_uninit_check 1339: TIMEOUT:IBDB value/=2
        pm80xx0:: pm80xx_chip_soft_rst 1387: MPI state is not ready scratch:0:8:62a01000:0
        pm80xx0:: pm80xx_chip_soft_rst 1470: Firmware is not ready!
        pm80xx0:: pm80xx_chip_soft_rst 1484: iButton Feature is not Available!!!
        pm80xx0:: pm80xx_chip_init 1266: Firmware is not ready!
        pm80xx0:: pm8001_pci_probe 1207: chip_init failed [ret: -16]
        pm80xx: probe of 0000:01:00.0 failed with error -16
    
    Link: https://lore.kernel.org/r/20210109123849.17098-4-Viswas.G@microchip.comAcked-by: default avatarJack Wang <jinpu.wang@cloud.ionos.com>
    Signed-off-by: default avatarakshatzen <akshatzen@google.com>
    Signed-off-by: default avatarViswas G <Viswas.G@microchip.com>
    Signed-off-by: default avatarRuksar Devadi <Ruksar.devadi@microchip.com>
    Signed-off-by: default avatarRadha Ramachandran <radha@google.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    95652f98
pm80xx_hwi.c 163 KB