在 2018/6/28 18:54, Ard Biesheuvel 写道:
> On 28 June 2018 at 04:26, Ming <ming.hu...@linaro.org> wrote:
>>
>>
>> 在 2018/6/27 15:33, Ard Biesheuvel 写道:
>>> On 27 June 2018 at 09:04, Ming Huang <ming.hu...@linaro.org> wrote:
>>>> Fix the issue of onboard Nic not work kerenl with AMD GPU and
>>>> NVME SSD in board. The GPU don't support 64 MSI, so need to
>>>> allocate INTx, but the default interrupt number 255 is invalid,
>>>> so Change all the PCI Device interrupt number to 0.
>>>>
>>>
>>> Could you please try to explain in more detail what the problem is you
>>> are solving, and why you think it should be solved in the firmware?
>>> What does '64 MSI' mean? And where does the default of 255 come from?
>>>
>>>
>>
>> With AMD GPU and NVMe in board, the onboard Nic(hns-nic) can not work in 
>> ubuntu os.
>> The AMD GPU has two devices:
>> PCI device amdgpu 000d:33:00.0, snd_hda_intel 000d:33:00.1
>> The MSI is 64bit address in D05, and snd_hda_intel don't support 64bit MSI 
>> address,
> 
> Legacy PCIe endpoints are permitted to only implement support for
> 32-bit addressing of the MSI doorbell register, which is why it is
> generally a good idea to put that below 4 GB in the physical address
> space.
> 
> So how is this implemented on D05? How are the PCIe host bridge
> inbound windows configured? Any chance you could fix this by remapping
> inbound transactions so the MSI doorbell appears at a 32-bit
> addressable offset?
> 

Inbound windows is not configured on D05. Maybe There are some risks if we 
configure inbound windows
considering D05 has been running stably for a long time.

Thanks.

> 
>> so snd_hda_intel use the 255 irq. The onboard Nic register 255 irq failed.
>> The 255 is the default value of PCI_INTERRUPT_LINE reg (0x3C).
>> There is not a proper solution in kernel.This patch is a workaround in 
>> firmware.
>>
>> error log in kernel:
>>  Mar  1 00:27:07 ubuntu kernel: [   25.581265] snd_hda_intel 000d:33:00.1: 
>> Device has broken 64-bit MSI but arch tried to assign one above 4Gl
>>
>> Mar  1 00:36:39 ubuntu kernel: [  600.751276] genirq: Flags mismatch irq 
>> 255. 00000001 (enahisic2i0-tx1) vs. 00000081 (snd_hda_intel:card0)
>>
>> Mar  1 00:36:39 ubuntu kernel: [  600.761137] hns-nic HISI00C2:00 
>> enahisic2i0: request irq(255) fail
>>
>> Thanks.
>>
>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.1
>>>> Signed-off-by: Ming Huang <ming.hu...@linaro.org>
>>>> Signed-off-by: Heyi Guo <heyi....@linaro.org>
>>>> ---
>>>>  Platform/Hisilicon/D05/D05.dsc                                     |  1 +
>>>>  Platform/Hisilicon/D05/D05.fdf                                     |  1 +
>>>>  Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.c   | 99 
>>>> ++++++++++++++++++++
>>>>  Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf | 47 
>>>> ++++++++++
>>>>  4 files changed, 148 insertions(+)
>>>>
>>>> diff --git a/Platform/Hisilicon/D05/D05.dsc 
>>>> b/Platform/Hisilicon/D05/D05.dsc
>>>> index b6e1a9d98a..0e6d5912a0 100644
>>>> --- a/Platform/Hisilicon/D05/D05.dsc
>>>> +++ b/Platform/Hisilicon/D05/D05.dsc
>>>> @@ -629,6 +629,7 @@
>>>>
>>>>
>>>>    
>>>> Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
>>>> +  Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf
>>>>
>>>>    #
>>>>    # Memory test
>>>> diff --git a/Platform/Hisilicon/D05/D05.fdf 
>>>> b/Platform/Hisilicon/D05/D05.fdf
>>>> index 37d9cc0c18..32374e245e 100644
>>>> --- a/Platform/Hisilicon/D05/D05.fdf
>>>> +++ b/Platform/Hisilicon/D05/D05.fdf
>>>> @@ -358,6 +358,7 @@ READ_LOCK_STATUS   = TRUE
>>>>    INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
>>>>    INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
>>>>    INF Platform/Hisilicon/D05/EarlyConfigPeim/EarlyConfigPeimD05.inf
>>>> +  INF Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf
>>>>
>>>>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>
>>>> diff --git 
>>>> a/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.c 
>>>> b/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.c
>>>> new file mode 100644
>>>> index 0000000000..8519b7139d
>>>> --- /dev/null
>>>> +++ b/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.c
>>>> @@ -0,0 +1,99 @@
>>>> +/** @file
>>>> +*
>>>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>>>> +*  Copyright (c) 2016, Linaro Limited. All rights reserved.
>>>> +*
>>>> +*  This program and the accompanying materials
>>>> +*  are licensed and made available under the terms and conditions of the 
>>>> BSD License
>>>> +*  which accompanies this distribution.  The full text of the license may 
>>>> be found at
>>>> +*  http://opensource.org/licenses/bsd-license.php
>>>> +*
>>>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>>>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>>>> IMPLIED.
>>>> +*
>>>> +**/
>>>> +
>>>> +#include <Uefi.h>
>>>> +#include <IndustryStandard/Pci.h>
>>>> +#include <Library/DebugLib.h>
>>>> +#include <Library/UefiBootServicesTableLib.h>
>>>> +#include <Protocol/PciIo.h>
>>>> +
>>>> +VOID
>>>> +SetIntLine (
>>>> +  )
>>>> +{
>>>> +  EFI_STATUS                         Status;
>>>> +  UINTN                              HandleIndex;
>>>> +  EFI_HANDLE                         *HandleBuffer;
>>>> +  UINTN                              HandleCount;
>>>> +  EFI_PCI_IO_PROTOCOL                *PciIo;
>>>> +  UINT8                              INTLine;
>>>> +  UINTN                              Segment;
>>>> +  UINTN                              Bus;
>>>> +  UINTN                              Device;
>>>> +  UINTN                              Fun;
>>>> +
>>>> +  Status = gBS->LocateHandleBuffer (
>>>> +                  ByProtocol,
>>>> +                  &gEfiPciIoProtocolGuid,
>>>> +                  NULL,
>>>> +                  &HandleCount,
>>>> +                  &HandleBuffer
>>>> +                  );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +      DEBUG  ((DEBUG_ERROR, " Locate gEfiPciIoProtocol Failed.\n"));
>>>> +      gBS->FreePool ((VOID *)HandleBuffer);
>>>> +      return;
>>>> +  }
>>>> +
>>>> +  for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
>>>> +      Status = gBS->HandleProtocol (
>>>> +                      HandleBuffer[HandleIndex],
>>>> +                      &gEfiPciIoProtocolGuid,
>>>> +                      (VOID **)&PciIo
>>>> +                      );
>>>> +      if (EFI_ERROR (Status)) {
>>>> +          continue;
>>>> +      }
>>>> +
>>>> +      INTLine = 0;
>>>> +      (VOID)PciIo->Pci.Write (
>>>> +                         PciIo,
>>>> +                         EfiPciIoWidthUint8,
>>>> +                         PCI_INT_LINE_OFFSET,
>>>> +                         1,
>>>> +                         &INTLine);
>>>> +      (VOID)PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Fun);
>>>> +      DEBUG ((DEBUG_INFO, "Set BDF(%x-%x-%x) IntLine to 0\n", Bus, 
>>>> Device, Fun));
>>>> +  }
>>>> +
>>>> +  gBS->FreePool ((VOID *)HandleBuffer);
>>>> +  return;
>>>> +}
>>>> +
>>>> +EFI_STATUS
>>>> +EFIAPI
>>>> +PlatformMiscDxeEntry (
>>>> +  IN EFI_HANDLE           ImageHandle,
>>>> +  IN EFI_SYSTEM_TABLE     *SystemTable
>>>> +  )
>>>> +{
>>>> +  EFI_STATUS  Status;
>>>> +  EFI_EVENT   Event;
>>>> +
>>>> +  Status = gBS->CreateEventEx (
>>>> +                  EVT_NOTIFY_SIGNAL,
>>>> +                  TPL_CALLBACK,
>>>> +                  SetIntLine,
>>>> +                  NULL,
>>>> +                  &gEfiEventReadyToBootGuid,
>>>> +                  &Event
>>>> +                  );
>>>> +  if (EFI_ERROR (Status)) {
>>>> +    DEBUG ((DEBUG_ERROR, "Create event for SetIntLine, %r!\n", Status));
>>>> +  }
>>>> +
>>>> +  return EFI_SUCCESS;
>>>> +}
>>>> +
>>>> diff --git 
>>>> a/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf 
>>>> b/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf
>>>> new file mode 100644
>>>> index 0000000000..0b365e7a53
>>>> --- /dev/null
>>>> +++ b/Platform/Hisilicon/D05/Drivers/PlatformMiscDxe/PlatformMiscDxe.inf
>>>> @@ -0,0 +1,47 @@
>>>> +#/** @file
>>>> +#
>>>> +#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>>>> +#    Copyright (c) 2016, Linaro Limited. All rights reserved.
>>>> +#
>>>> +#    This program and the accompanying materials
>>>> +#    are licensed and made available under the terms and conditions of 
>>>> the BSD License
>>>> +#    which accompanies this distribution. The full text of the license 
>>>> may be found at
>>>> +#    http://opensource.org/licenses/bsd-license.php
>>>> +#
>>>> +#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>>>> +#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>>>> IMPLIED.
>>>> +#
>>>> +#**/
>>>> +
>>>> +[Defines]
>>>> +  INF_VERSION                    = 0x0001001A
>>>> +  BASE_NAME                      = PlatformMiscDxe
>>>> +  FILE_GUID                      = a48f7a09-253f-468b-87c6-caf78baf47bb
>>>> +  MODULE_TYPE                    = DXE_DRIVER
>>>> +  VERSION_STRING                 = 1.0
>>>> +  ENTRY_POINT                    = PlatformMiscDxeEntry
>>>> +
>>>> +[Sources.common]
>>>> +  PlatformMiscDxe.c
>>>> +
>>>> +[Packages]
>>>> +  MdeModulePkg/MdeModulePkg.dec
>>>> +  MdePkg/MdePkg.dec
>>>> +  Silicon/Hisilicon/HisiPkg.dec
>>>> +
>>>> +[Guids]
>>>> +  gEfiEventReadyToBootGuid
>>>> +
>>>> +[Protocols]
>>>> +  gEfiPciIoProtocolGuid
>>>> +
>>>> +[LibraryClasses]
>>>> +  BaseLib
>>>> +  DebugLib
>>>> +  UefiBootServicesTableLib
>>>> +  UefiDriverEntryPoint
>>>> +
>>>> +[FixedPcd]
>>>> +
>>>> +[Depex]
>>>> +  TRUE
>>>> --
>>>> 2.17.0
>>>>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to