drivers/pci/controller/dwc/pcie-amd-mdb.c
Source file repositories/reference/linux-study-clean/drivers/pci/controller/dwc/pcie-amd-mdb.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pci/controller/dwc/pcie-amd-mdb.c- Extension
.c- Size
- 13774 bytes
- Lines
- 527
- Domain
- Representative Device Path
- Bucket
- PCIe NVMe Storage Path
- Inferred role
- Representative Device Path: implementation source
- Status
- source implementation candidate
Why This File Exists
Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/clk.hlinux/delay.hlinux/gpio.hlinux/interrupt.hlinux/irqdomain.hlinux/kernel.hlinux/init.hlinux/of_device.hlinux/pci.hlinux/platform_device.hlinux/resource.hlinux/types.h../../pci.hpcie-designware.h
Detected Declarations
struct amd_mdb_pciefunction amd_mdb_intx_irq_maskfunction amd_mdb_intx_irq_unmaskfunction amd_mdb_pcie_intx_mapfunction dw_pcie_rp_intxfunction amd_mdb_event_irq_maskfunction amd_mdb_event_irq_unmaskfunction amd_mdb_pcie_event_mapfunction amd_mdb_pcie_eventfunction amd_mdb_pcie_free_irq_domainsfunction amd_mdb_pcie_init_portfunction amd_mdb_pcie_init_irq_domainsfunction amd_mdb_pcie_intr_handlerfunction amd_mdb_setup_irqfunction amd_mdb_parse_pcie_portfunction amd_mdb_add_pcie_portfunction amd_mdb_pcie_probe
Annotated Snippet
struct amd_mdb_pcie {
struct dw_pcie pci;
void __iomem *slcr;
struct irq_domain *intx_domain;
struct irq_domain *mdb_domain;
struct gpio_desc *perst_gpio;
int intx_irq;
};
static const struct dw_pcie_host_ops amd_mdb_pcie_host_ops = {
};
static void amd_mdb_intx_irq_mask(struct irq_data *data)
{
struct amd_mdb_pcie *pcie = irq_data_get_irq_chip_data(data);
struct dw_pcie *pci = &pcie->pci;
struct dw_pcie_rp *port = &pci->pp;
unsigned long flags;
u32 val;
raw_spin_lock_irqsave(&port->lock, flags);
val = FIELD_PREP(AMD_MDB_TLP_PCIE_INTX_MASK,
AMD_MDB_PCIE_INTR_INTX_ASSERT(data->hwirq));
/*
* Writing '1' to a bit in AMD_MDB_TLP_IR_DISABLE_MISC disables that
* interrupt, writing '0' has no effect.
*/
writel_relaxed(val, pcie->slcr + AMD_MDB_TLP_IR_DISABLE_MISC);
raw_spin_unlock_irqrestore(&port->lock, flags);
}
static void amd_mdb_intx_irq_unmask(struct irq_data *data)
{
struct amd_mdb_pcie *pcie = irq_data_get_irq_chip_data(data);
struct dw_pcie *pci = &pcie->pci;
struct dw_pcie_rp *port = &pci->pp;
unsigned long flags;
u32 val;
raw_spin_lock_irqsave(&port->lock, flags);
val = FIELD_PREP(AMD_MDB_TLP_PCIE_INTX_MASK,
AMD_MDB_PCIE_INTR_INTX_ASSERT(data->hwirq));
/*
* Writing '1' to a bit in AMD_MDB_TLP_IR_ENABLE_MISC enables that
* interrupt, writing '0' has no effect.
*/
writel_relaxed(val, pcie->slcr + AMD_MDB_TLP_IR_ENABLE_MISC);
raw_spin_unlock_irqrestore(&port->lock, flags);
}
static struct irq_chip amd_mdb_intx_irq_chip = {
.name = "AMD MDB INTx",
.irq_mask = amd_mdb_intx_irq_mask,
.irq_unmask = amd_mdb_intx_irq_unmask,
};
/**
* amd_mdb_pcie_intx_map - Set the handler for the INTx and mark IRQ as valid
* @domain: IRQ domain
* @irq: Virtual IRQ number
* @hwirq: Hardware interrupt number
*
* Return: Always returns '0'.
*/
static int amd_mdb_pcie_intx_map(struct irq_domain *domain,
unsigned int irq, irq_hw_number_t hwirq)
{
irq_set_chip_and_handler(irq, &amd_mdb_intx_irq_chip,
handle_level_irq);
irq_set_chip_data(irq, domain->host_data);
irq_set_status_flags(irq, IRQ_LEVEL);
return 0;
}
/* INTx IRQ domain operations. */
static const struct irq_domain_ops amd_intx_domain_ops = {
.map = amd_mdb_pcie_intx_map,
};
static irqreturn_t dw_pcie_rp_intx(int irq, void *args)
{
struct amd_mdb_pcie *pcie = args;
unsigned long val;
int i, int_status;
val = readl_relaxed(pcie->slcr + AMD_MDB_TLP_IR_STATUS_MISC);
int_status = FIELD_GET(AMD_MDB_TLP_PCIE_INTX_MASK, val);
Annotation
- Immediate include surface: `linux/clk.h`, `linux/delay.h`, `linux/gpio.h`, `linux/interrupt.h`, `linux/irqdomain.h`, `linux/kernel.h`, `linux/init.h`, `linux/of_device.h`.
- Detected declarations: `struct amd_mdb_pcie`, `function amd_mdb_intx_irq_mask`, `function amd_mdb_intx_irq_unmask`, `function amd_mdb_pcie_intx_map`, `function dw_pcie_rp_intx`, `function amd_mdb_event_irq_mask`, `function amd_mdb_event_irq_unmask`, `function amd_mdb_pcie_event_map`, `function amd_mdb_pcie_event`, `function amd_mdb_pcie_free_irq_domains`.
- Atlas domain: Representative Device Path / PCIe NVMe Storage Path.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.