drivers/video/fbdev/via/viafbdev.c
Source file repositories/reference/linux-study-clean/drivers/video/fbdev/via/viafbdev.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/video/fbdev/via/viafbdev.c- Extension
.c- Size
- 59887 bytes
- Lines
- 2150
- Domain
- Driver Families
- Bucket
- drivers/video
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- 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/compiler.hlinux/module.hlinux/seq_file.hlinux/slab.hlinux/stat.hlinux/via-core.hlinux/via_i2c.hglobal.h
Detected Declarations
function viafb_fill_var_color_infofunction viafb_update_fixfunction viafb_setup_fixinfofunction viafb_openfunction viafb_releasefunction get_var_refreshfunction viafb_check_varfunction viafb_set_parfunction viafb_setcolregfunction viafb_pan_displayfunction viafb_blankfunction viafb_ioctlfunction viafb_fillrectfunction viafb_copyareafunction viafb_imageblitfunction viafb_cursorfunction viafb_syncfunction get_primary_devicefunction retrieve_device_settingfunction parse_active_devfunction parse_portfunction parse_lcd_portfunction parse_dvi_portfunction viafb_dvp0_proc_showfunction viafb_dvp0_proc_openfunction viafb_dvp0_proc_writefunction viafb_dvp1_proc_showfunction viafb_dvp1_proc_openfunction viafb_dvp1_proc_writefunction viafb_dfph_proc_showfunction viafb_dfph_proc_openfunction viafb_dfph_proc_writefunction viafb_dfpl_proc_showfunction viafb_dfpl_proc_openfunction viafb_dfpl_proc_writefunction viafb_vt1636_proc_showfunction viafb_vt1636_proc_openfunction viafb_vt1636_proc_writefunction viafb_sup_odev_proc_showfunction odev_updatefunction viafb_iga1_odev_proc_showfunction viafb_iga1_odev_proc_openfunction viafb_iga1_odev_proc_writefunction viafb_iga2_odev_proc_showfunction viafb_iga2_odev_proc_openfunction viafb_iga2_odev_proc_writefunction viafb_init_procfunction viafb_remove_proc
Annotated Snippet
if (viafb_SAMM_ON == 1) {
u.viamode.xres_sec = viafb_second_xres;
u.viamode.yres_sec = viafb_second_yres;
u.viamode.virtual_xres_sec = viafb_dual_fb ? viafbinfo1->var.xres_virtual : viafbinfo->var.xres_virtual;
u.viamode.virtual_yres_sec = viafb_dual_fb ? viafbinfo1->var.yres_virtual : viafbinfo->var.yres_virtual;
u.viamode.refresh_sec = viafb_refresh1;
u.viamode.bpp_sec = viafb_bpp1;
} else {
u.viamode.xres_sec = 0;
u.viamode.yres_sec = 0;
u.viamode.virtual_xres_sec = 0;
u.viamode.virtual_yres_sec = 0;
u.viamode.refresh_sec = 0;
u.viamode.bpp_sec = 0;
}
if (copy_to_user(argp, &u.viamode, sizeof(u.viamode)))
return -EFAULT;
break;
case VIAFB_GET_SAMM_INFO:
u.viasamm.samm_status = viafb_SAMM_ON;
if (viafb_SAMM_ON == 1) {
if (viafb_dual_fb) {
u.viasamm.size_prim = viaparinfo->fbmem_free;
u.viasamm.size_sec = viaparinfo1->fbmem_free;
} else {
if (viafb_second_size) {
u.viasamm.size_prim =
viaparinfo->fbmem_free -
viafb_second_size * 1024 * 1024;
u.viasamm.size_sec =
viafb_second_size * 1024 * 1024;
} else {
u.viasamm.size_prim =
viaparinfo->fbmem_free >> 1;
u.viasamm.size_sec =
(viaparinfo->fbmem_free >> 1);
}
}
u.viasamm.mem_base = viaparinfo->fbmem;
u.viasamm.offset_sec = viafb_second_offset;
} else {
u.viasamm.size_prim =
viaparinfo->memsize - viaparinfo->fbmem_used;
u.viasamm.size_sec = 0;
u.viasamm.mem_base = viaparinfo->fbmem;
u.viasamm.offset_sec = 0;
}
if (copy_to_user(argp, &u.viasamm, sizeof(u.viasamm)))
return -EFAULT;
break;
case VIAFB_TURN_ON_OUTPUT_DEVICE:
if (copy_from_user(&gpu32, argp, sizeof(gpu32)))
return -EFAULT;
if (gpu32 & CRT_Device)
via_set_state(VIA_CRT, VIA_STATE_ON);
if (gpu32 & DVI_Device)
viafb_dvi_enable();
if (gpu32 & LCD_Device)
viafb_lcd_enable();
break;
case VIAFB_TURN_OFF_OUTPUT_DEVICE:
if (copy_from_user(&gpu32, argp, sizeof(gpu32)))
return -EFAULT;
if (gpu32 & CRT_Device)
via_set_state(VIA_CRT, VIA_STATE_OFF);
if (gpu32 & DVI_Device)
viafb_dvi_disable();
if (gpu32 & LCD_Device)
viafb_lcd_disable();
break;
case VIAFB_GET_DEVICE:
u.active_dev.crt = viafb_CRT_ON;
u.active_dev.dvi = viafb_DVI_ON;
u.active_dev.lcd = viafb_LCD_ON;
u.active_dev.samm = viafb_SAMM_ON;
u.active_dev.primary_dev = viafb_primary_dev;
u.active_dev.lcd_dsp_cent = viafb_lcd_dsp_method;
u.active_dev.lcd_panel_id = viafb_lcd_panel_id;
u.active_dev.lcd_mode = viafb_lcd_mode;
u.active_dev.xres = viafb_hotplug_Xres;
u.active_dev.yres = viafb_hotplug_Yres;
u.active_dev.xres1 = viafb_second_xres;
u.active_dev.yres1 = viafb_second_yres;
Annotation
- Immediate include surface: `linux/compiler.h`, `linux/module.h`, `linux/seq_file.h`, `linux/slab.h`, `linux/stat.h`, `linux/via-core.h`, `linux/via_i2c.h`, `global.h`.
- Detected declarations: `function viafb_fill_var_color_info`, `function viafb_update_fix`, `function viafb_setup_fixinfo`, `function viafb_open`, `function viafb_release`, `function get_var_refresh`, `function viafb_check_var`, `function viafb_set_par`, `function viafb_setcolreg`, `function viafb_pan_display`.
- Atlas domain: Driver Families / drivers/video.
- Implementation status: source implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
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.