arch/powerpc/platforms/pseries/vas.c
Source file repositories/reference/linux-study-clean/arch/powerpc/platforms/pseries/vas.c
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/platforms/pseries/vas.c- Extension
.c- Size
- 31848 bytes
- Lines
- 1142
- Domain
- Architecture Layer
- Bucket
- arch/powerpc
- Inferred role
- Architecture Layer: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/module.hlinux/kernel.hlinux/export.hlinux/types.hlinux/delay.hlinux/slab.hlinux/interrupt.hlinux/irqdomain.hasm/machdep.hasm/hvcall.hasm/plpar_wrappers.hasm/firmware.hasm/vphn.hasm/vas.hvas.h
Detected Declarations
function hcall_return_busy_checkfunction h_allocate_vas_windowfunction h_deallocate_vas_windowfunction h_modify_vas_windowfunction featurefunction h_get_nx_faultfunction pseries_vas_fault_thread_fnfunction irq_default_primary_handlerfunction allocate_setup_windowfunction free_irq_setupfunction vas_paste_addressfunction deallocate_free_windowfunction vas_deallocate_windowfunction vas_register_api_pseriesfunction vas_unregister_api_pseriesfunction get_vas_capabilitiesfunction reconfig_open_windowsfunction list_for_each_entry_safefunction list_for_each_entry_safe_fromfunction reconfig_close_windowsfunction list_for_each_entry_safefunction vas_reconfig_capabiltiesfunction pseries_vas_dlpar_cpufunction availablefunction vas_migration_handlerfunction vas_allocate_windowfunction pseries_vas_initexport h_query_vas_capabilitiesexport vas_register_api_pseriesexport vas_unregister_api_pseries
Annotated Snippet
if (win->win_addr == VAS_INVALID_WIN_ADDRESS) {
pr_err("H_ALLOCATE_VAS_WINDOW: COPY/PASTE is not supported\n");
return -ENOTSUPP;
}
win->vas_win.winid = retbuf[0];
win->win_addr = retbuf[1];
win->complete_irq = retbuf[2];
win->fault_irq = retbuf[3];
return 0;
}
pr_err("H_ALLOCATE_VAS_WINDOW error: %ld, wintype: %u, credits: %u\n",
rc, wintype, credits);
return -EIO;
}
/*
* Deallocate VAS window hcall.
*/
static int h_deallocate_vas_window(u64 winid)
{
long rc;
do {
rc = plpar_hcall_norets(H_DEALLOCATE_VAS_WINDOW, winid);
rc = hcall_return_busy_check(rc);
} while (rc == H_BUSY);
if (rc == H_SUCCESS)
return 0;
pr_err("H_DEALLOCATE_VAS_WINDOW error: %ld, winid: %llu\n",
rc, winid);
return -EIO;
}
/*
* Modify VAS window.
* After the window is opened with allocate window hcall, configure it
* with flags and LPAR PID before using.
*/
static int h_modify_vas_window(struct pseries_vas_window *win)
{
long rc;
/*
* AMR value is not supported in Linux VAS implementation.
* The hypervisor ignores it if 0 is passed.
*/
do {
rc = plpar_hcall_norets(H_MODIFY_VAS_WINDOW,
win->vas_win.winid, win->pid, 0,
VAS_MOD_WIN_FLAGS, 0);
rc = hcall_return_busy_check(rc);
} while (rc == H_BUSY);
if (rc == H_SUCCESS)
return 0;
pr_err("H_MODIFY_VAS_WINDOW error: %ld, winid %u pid %u\n",
rc, win->vas_win.winid, win->pid);
return -EIO;
}
/*
* This hcall is used to determine the capabilities from the hypervisor.
* @hcall: H_QUERY_VAS_CAPABILITIES or H_QUERY_NX_CAPABILITIES
* @query_type: If 0 is passed, the hypervisor returns the overall
* capabilities which provides all feature(s) that are
* available. Then query the hypervisor to get the
* corresponding capabilities for the specific feature.
* Example: H_QUERY_VAS_CAPABILITIES provides VAS GZIP QoS
* and VAS GZIP Default capabilities.
* H_QUERY_NX_CAPABILITIES provides NX GZIP
* capabilities.
* @result: Return buffer to save capabilities.
*/
int h_query_vas_capabilities(const u64 hcall, u8 query_type, u64 result)
{
long rc;
rc = plpar_hcall_norets(hcall, query_type, result);
if (rc == H_SUCCESS)
return 0;
/* H_FUNCTION means HV does not support VAS so don't print an error */
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/export.h`, `linux/types.h`, `linux/delay.h`, `linux/slab.h`, `linux/interrupt.h`, `linux/irqdomain.h`.
- Detected declarations: `function hcall_return_busy_check`, `function h_allocate_vas_window`, `function h_deallocate_vas_window`, `function h_modify_vas_window`, `function feature`, `function h_get_nx_fault`, `function pseries_vas_fault_thread_fn`, `function irq_default_primary_handler`, `function allocate_setup_window`, `function free_irq_setup`.
- Atlas domain: Architecture Layer / arch/powerpc.
- Implementation status: integration 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.