arch/mips/pci/pci-xtalk-bridge.c
Source file repositories/reference/linux-study-clean/arch/mips/pci/pci-xtalk-bridge.c
File Facts
- System
- Linux kernel
- Corpus path
arch/mips/pci/pci-xtalk-bridge.c- Extension
.c- Size
- 20174 bytes
- Lines
- 759
- Domain
- Architecture Layer
- Bucket
- arch/mips
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- 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/kernel.hlinux/export.hlinux/pci.hlinux/smp.hlinux/dma-direct.hlinux/platform_device.hlinux/platform_data/xtalk-bridge.hlinux/nvmem-consumer.hlinux/crc16.hlinux/irqdomain.hasm/pci/bridge.hasm/paccess.hasm/sn/irq_alloc.hasm/sn/ioc3.h
Detected Declarations
struct bridge_irq_chip_datafunction Copyrightfunction dma_to_physfunction ioc3_cfg_rdfunction ioc3_cfg_wrfunction bridge_disable_swappingfunction pci_conf0_read_configfunction pci_conf1_read_configfunction pci_read_configfunction pci_conf0_write_configfunction pci_conf1_write_configfunction pci_write_configfunction bridge_set_affinityfunction bridge_domain_allocfunction bridge_domain_freefunction bridge_domain_activatefunction bridge_domain_deactivatefunction bridge_map_irqfunction bridge_setup_ip27_baseio6gfunction bridge_setup_ip27_baseiofunction bridge_setup_ip29_baseiofunction bridge_setup_ip30_sysboardfunction bridge_setup_menetfunction bridge_setup_io7function bridge_setup_io8function bridge_setup_io9function bridge_setup_ip34_fuel_sysboardfunction bridge_setup_boardfunction bridge_nvmem_matchfunction bridge_get_partnumfunction bridge_probefunction bridge_remove
Annotated Snippet
struct bridge_irq_chip_data {
struct bridge_controller *bc;
nasid_t nasid;
};
static int bridge_set_affinity(struct irq_data *d, const struct cpumask *mask,
bool force)
{
#ifdef CONFIG_NUMA
struct bridge_irq_chip_data *data = d->chip_data;
int bit = d->parent_data->hwirq;
int pin = d->hwirq;
int ret, cpu;
ret = irq_chip_set_affinity_parent(d, mask, force);
if (ret >= 0) {
cpu = cpumask_first_and(mask, cpu_online_mask);
data->nasid = cpu_to_node(cpu);
bridge_write(data->bc, b_int_addr[pin].addr,
(((data->bc->intr_addr >> 30) & 0x30000) |
bit | (data->nasid << 8)));
bridge_read(data->bc, b_wid_tflush);
}
return ret;
#else
return irq_chip_set_affinity_parent(d, mask, force);
#endif
}
struct irq_chip bridge_irq_chip = {
.name = "BRIDGE",
.irq_mask = irq_chip_mask_parent,
.irq_unmask = irq_chip_unmask_parent,
.irq_set_affinity = bridge_set_affinity
};
static int bridge_domain_alloc(struct irq_domain *domain, unsigned int virq,
unsigned int nr_irqs, void *arg)
{
struct bridge_irq_chip_data *data;
struct irq_alloc_info *info = arg;
int ret;
if (nr_irqs > 1 || !info)
return -EINVAL;
data = kzalloc_obj(*data);
if (!data)
return -ENOMEM;
ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
if (ret >= 0) {
data->bc = info->ctrl;
data->nasid = info->nasid;
irq_domain_set_info(domain, virq, info->pin, &bridge_irq_chip,
data, handle_level_irq, NULL, NULL);
} else {
kfree(data);
}
return ret;
}
static void bridge_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nr_irqs)
{
struct irq_data *irqd = irq_domain_get_irq_data(domain, virq);
if (nr_irqs)
return;
kfree(irqd->chip_data);
irq_domain_free_irqs_top(domain, virq, nr_irqs);
}
static int bridge_domain_activate(struct irq_domain *domain,
struct irq_data *irqd, bool reserve)
{
struct bridge_irq_chip_data *data = irqd->chip_data;
struct bridge_controller *bc = data->bc;
int bit = irqd->parent_data->hwirq;
int pin = irqd->hwirq;
u32 device;
bridge_write(bc, b_int_addr[pin].addr,
(((bc->intr_addr >> 30) & 0x30000) |
bit | (data->nasid << 8)));
bridge_set(bc, b_int_enable, (1 << pin));
bridge_set(bc, b_int_enable, 0x7ffffe00); /* more stuff in int_enable */
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/export.h`, `linux/pci.h`, `linux/smp.h`, `linux/dma-direct.h`, `linux/platform_device.h`, `linux/platform_data/xtalk-bridge.h`, `linux/nvmem-consumer.h`.
- Detected declarations: `struct bridge_irq_chip_data`, `function Copyright`, `function dma_to_phys`, `function ioc3_cfg_rd`, `function ioc3_cfg_wr`, `function bridge_disable_swapping`, `function pci_conf0_read_config`, `function pci_conf1_read_config`, `function pci_read_config`, `function pci_conf0_write_config`.
- Atlas domain: Architecture Layer / arch/mips.
- Implementation status: source implementation candidate.
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.