lkml.org 
[lkml]   [2019]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectQuery: PCIe Interrupt handler support with ACPI
Date
Hi,

I am working on adding ACPI support for our PCIe controller. Our controller is not ECAM compliant so I had to implement
MCFG Quick for our own config read/write/map/init function. After this device enumeration is working fine.

Next I am trying to make the legacy interrupt work with our controller with ACPI.
With device tree , we enable interrupts using below routine during driver probe and we register our interrupt handler(ls_pcie_g4_handler).

static int ls_pcie_g4_interrupt_init(struct mobiveil_pcie *mv_pci)
{
struct ls_pcie_g4 *pcie = to_ls_pcie_g4(mv_pci);
u32 val;
int ret;

pcie->irq = platform_get_irq_byname(mv_pci->pdev, "intr");
if (pcie->irq < 0) {
dev_err(&mv_pci->pdev->dev, "Can't get 'intr' irq.\n");
return pcie->irq;
}
ret = devm_request_irq(&mv_pci->pdev->dev, pcie->irq,
ls_pcie_g4_handler, IRQF_SHARED,
mv_pci->pdev->name, pcie);
if (ret) {
dev_err(&mv_pci->pdev->dev, "Can't register PCIe IRQ.\n");
return ret;
}

/* Enable interrupts */
val = PAB_INTP_INTX_MASK | PAB_INTP_MSI | PAB_INTP_RESET |
PAB_INTP_PCIE_UE | PAB_INTP_IE_PMREDI | PAB_INTP_IE_EC;
csr_writel(mv_pci, val, PAB_INTP_AMBA_MISC_ENB);

return 0;
}

Can someone help me how can I add similar support (register our interrupt handler) with ACPI and how to get the pcie->irq ?
I am using below ACPI table for my host bridge in firmware (UEFI).
=========
Scope(_SB)
{
// PCIe Root bus
Device (PCI0)
{
Name (_HID, "PNP0A08") // PCI Express Root Bridge
Name (_CID, "PNP0A03") // Compatible PCI Root Bridge
Name(_SEG, 0) // Segment of this Root complex
Name(_BBN, 0) // Base Bus Number
Name(_CCA, 1) // Cache Coherency Attribute
Method (_CRS, 0, Serialized) { // Root complex resources
Name (RBUF, ResourceTemplate () {
WordBusNumber ( // Bus numbers assigned to this root
ResourceProducer, MinFixed, MaxFixed, PosDecode,
0, // AddressGranularity
LX2160A_PCI_SEG_BUSNUM_MIN, // AddressMinimum - Minimum Bus Number
LX2160A_PCI_SEG_BUSNUM_MAX, // AddressMaximum - Maximum Bus Number
0, // AddressTranslation
LX2160A_PCI_SEG_BUSNUM_RANGE // RangeLength - # of Busses
)
QWordMemory ( // 64-bit BAR Windows
ResourceProducer,
PosDecode,
MinFixed,
MaxFixed,
NonCacheable,
ReadWrite,
0x0, // Granularity
LX2160A_PCI_SEG0_MMIO64_MIN, // Min Base Address
LX2160A_PCI_SEG0_MMIO64_MAX, // Max Base Address
LX2160A_PCI_SEG0_MMIO64_XLATE, // Translate
LX2160A_PCI_SEG0_MMIO64_SIZE // Length
)
})
Return (RBUF)
}

Device (RES0)
{
Name (_HID, "NXP0016") // NXP PCIe RC config base address
Name (_CRS, ResourceTemplate (){
Memory32Fixed (ReadWrite, LX2160A_PCI_SEG0_RC_CONFIG_BASE,
LX2160A_PCI_SEG0_RC_CONFIG_SIZE)
})
}

// PCI Routing Table
Name (_PRT, Package () {
Package () { 0xFFFF, 0, Zero, LX2160A_PCI_SEG0_INTA }, // INTA
Package () { 0xFFFF, 1, Zero, LX2160A_PCI_SEG0_INTB }, // INTB
Package () { 0xFFFF, 2, Zero, LX2160A_PCI_SEG0_INTC }, // INTC
Package () { 0xFFFF, 3, Zero, LX2160A_PCI_SEG0_INTD }, // INTD
})
//
// OS Control Handoff
//
Name (SUPP, Zero) // PCI _OSC Support Field value
Name (CTRL, Zero) // PCI _OSC Control Field value

Method(_OSC,4)
{
// Check for proper UUID
If (LEqual (Arg0, ToUUID ("33DB4D5B-1FF7-401C-9657-7441C03DD766")))
{
// Create DWord-adressable fields from the Capabilities Buffer
CreateDWordField (Arg3, 0, CDW1)
CreateDWordField (Arg3, 4, CDW2)
CreateDWordField (Arg3, 8, CDW3)

// Save Capabilities DWord2 & 3
Store (CDW2, SUPP)
Store (CDW3, CTRL)

// Disable PCIe and SHPC hotplug, AER and PME
// And (CTRL, 0x10, CTRL)

// Capabilities bits were masked
Or (CDW1, 0x10, CDW1)

// Update DWORD3 in the buffer
Store (CTRL, CDW3)
Return (Arg3)
} Else {
Or (CDW1, 4, CDW1) // Unrecognized UUID
Return (Arg3)
}
} // End _OSC
} // Device(PCI0)

Device (RES0)
{
Name (_HID, "NXP0016") // NXP PCIe RC config base address
Name (_CID, "PNP0C02") // Motherboard reserved resource
Name (_UID, 0x0) // Unique ID
Name (_CRS, ResourceTemplate (){
Memory32Fixed (ReadWrite, LX2160A_PCI_SEG0_RC_CONFIG_BASE,
LX2160A_PCI_SEG0_RC_CONFIG_SIZE)
})
}

Device (RESP) //reserve for ecam resource
{
Name (_HID, "PNP0C02")
Name (_CRS, ResourceTemplate (){
QwordMemory ( //ECAM space for [bus 00-ff]
ResourceConsumer,
PosDecode,
MinFixed,
MaxFixed,
NonCacheable,
ReadWrite,
0x0, // Granularity
LX2160A_PCI_SEG0_CONFIG_BASE, // Min Base Address
LX2160A_PCI_SEG0_CONFIG_BASE_MAX, // Max Base Address
0x0, // Translate
LX2160A_PCI_SEG0_CONFIG_SIZE // Length
)
})
}
}
==================

Regards,
Wasim

\
 
 \ /
  Last update: 2019-11-21 11:23    [W:0.034 / U:0.112 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site