arch/m68k/sun3x/dvma.c
Source file repositories/reference/linux-study-clean/arch/m68k/sun3x/dvma.c
File Facts
- System
- Linux kernel
- Corpus path
arch/m68k/sun3x/dvma.c- Extension
.c- Size
- 4670 bytes
- Lines
- 201
- Domain
- Architecture Layer
- Bucket
- arch/m68k
- 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.
Dependency Surface
linux/kernel.hlinux/init.hlinux/bitops.hlinux/mm.hlinux/memblock.hlinux/vmalloc.hasm/sun3x.hasm/dvma.hasm/io.hasm/page.hasm/tlbflush.h
Detected Declarations
function dvma_printfunction dvma_map_cpufunction dvma_map_iommufunction dvma_unmap_iommu
Annotated Snippet
if((pmd = pmd_alloc(&init_mm, pud, vaddr)) == NULL) {
ret = -ENOMEM;
goto out;
}
if((end & PGDIR_MASK) > (vaddr & PGDIR_MASK))
end2 = (vaddr + (PGDIR_SIZE-1)) & PGDIR_MASK;
else
end2 = end;
do {
pte_t *pte;
unsigned long end3;
if((pte = pte_alloc_kernel(pmd, vaddr)) == NULL) {
ret = -ENOMEM;
goto out;
}
if((end2 & PMD_MASK) > (vaddr & PMD_MASK))
end3 = (vaddr + (PMD_SIZE-1)) & PMD_MASK;
else
end3 = end2;
do {
pr_debug("mapping %08lx phys to %08lx\n",
__pa(kaddr), vaddr);
set_pte(pte, pfn_pte(virt_to_pfn((void *)kaddr),
PAGE_KERNEL));
pte++;
kaddr += PAGE_SIZE;
vaddr += PAGE_SIZE;
} while(vaddr < end3);
} while(vaddr < end2);
} while(vaddr < end);
flush_tlb_all();
out:
return ret;
}
int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, int len)
{
unsigned long end, index;
index = baddr >> DVMA_PAGE_SHIFT;
end = ((baddr+len) >> DVMA_PAGE_SHIFT);
if(len & ~DVMA_PAGE_MASK)
end++;
for(; index < end ; index++) {
// if(dvma_entry_use(index))
// BUG();
// pr_info("mapping pa %lx to ba %lx\n", __pa(kaddr),
// index << DVMA_PAGE_SHIFT);
dvma_entry_set(index, __pa(kaddr));
iommu_pte[index] |= IOMMU_FULL_BLOCK;
// dvma_entry_inc(index);
kaddr += DVMA_PAGE_SIZE;
}
#ifdef DEBUG
for(index = (baddr >> DVMA_PAGE_SHIFT); index < end; index++)
dvma_print(index << DVMA_PAGE_SHIFT);
#endif
return 0;
}
void dvma_unmap_iommu(unsigned long baddr, int len)
{
int index, end;
index = baddr >> DVMA_PAGE_SHIFT;
end = (DVMA_PAGE_ALIGN(baddr+len) >> DVMA_PAGE_SHIFT);
for(; index < end ; index++) {
pr_debug("freeing bus mapping %08x\n",
index << DVMA_PAGE_SHIFT);
#if 0
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/init.h`, `linux/bitops.h`, `linux/mm.h`, `linux/memblock.h`, `linux/vmalloc.h`, `asm/sun3x.h`, `asm/dvma.h`.
- Detected declarations: `function dvma_print`, `function dvma_map_cpu`, `function dvma_map_iommu`, `function dvma_unmap_iommu`.
- Atlas domain: Architecture Layer / arch/m68k.
- 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.