drivers/video/fbdev/nvidia/nv_setup.c
Source file repositories/reference/linux-study-clean/drivers/video/fbdev/nvidia/nv_setup.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/video/fbdev/nvidia/nv_setup.c- Extension
.c- Size
- 18419 bytes
- Lines
- 650
- 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.
- 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
video/vga.hlinux/delay.hlinux/pci.hlinux/slab.hnv_type.hnv_local.hnv_proto.h
Detected Declarations
function NVWriteCrtcfunction NVReadCrtcfunction NVWriteGrfunction NVReadGrfunction NVWriteSeqfunction NVReadSeqfunction NVWriteAttrfunction NVReadAttrfunction NVWriteMiscOutfunction NVReadMiscOutfunction NVWriteDacMaskfunction NVWriteDacReadAddrfunction NVWriteDacWriteAddrfunction NVWriteDacDatafunction NVReadDacDatafunction NVIsConnectedfunction NVSelectHeadRegistersfunction nv4GetConfigfunction nv10GetConfigfunction NVCommonSetup
Annotated Snippet
switch (NV_RD32(par->PFB, 0x0000) & 0x00000003) {
case 0:
par->RamAmountKBytes = 1024 * 32;
break;
case 1:
par->RamAmountKBytes = 1024 * 4;
break;
case 2:
par->RamAmountKBytes = 1024 * 8;
break;
case 3:
default:
par->RamAmountKBytes = 1024 * 16;
break;
}
}
par->CrystalFreqKHz = (NV_RD32(par->PEXTDEV, 0x0000) & 0x00000040) ?
14318 : 13500;
par->CURSOR = &par->PRAMIN[0x1E00];
par->MinVClockFreqKHz = 12000;
par->MaxVClockFreqKHz = 350000;
}
static void nv10GetConfig(struct nvidia_par *par)
{
struct pci_dev *dev;
u32 implementation = par->Chipset & 0x0ff0;
#ifdef __BIG_ENDIAN
/* turn on big endian register access */
if (!(NV_RD32(par->PMC, 0x0004) & 0x01000001)) {
NV_WR32(par->PMC, 0x0004, 0x01000001);
mb();
}
#endif
dev = pci_get_domain_bus_and_slot(pci_domain_nr(par->pci_dev->bus),
0, 1);
if ((par->Chipset & 0xffff) == 0x01a0) {
u32 amt;
pci_read_config_dword(dev, 0x7c, &amt);
par->RamAmountKBytes = (((amt >> 6) & 31) + 1) * 1024;
} else if ((par->Chipset & 0xffff) == 0x01f0) {
u32 amt;
pci_read_config_dword(dev, 0x84, &amt);
par->RamAmountKBytes = (((amt >> 4) & 127) + 1) * 1024;
} else {
par->RamAmountKBytes =
(NV_RD32(par->PFB, 0x020C) & 0xFFF00000) >> 10;
}
pci_dev_put(dev);
par->CrystalFreqKHz = (NV_RD32(par->PEXTDEV, 0x0000) & (1 << 6)) ?
14318 : 13500;
if (par->twoHeads && (implementation != 0x0110)) {
if (NV_RD32(par->PEXTDEV, 0x0000) & (1 << 22))
par->CrystalFreqKHz = 27000;
}
par->CURSOR = NULL; /* can't set this here */
par->MinVClockFreqKHz = 12000;
par->MaxVClockFreqKHz = par->twoStagePLL ? 400000 : 350000;
}
int NVCommonSetup(struct fb_info *info)
{
struct nvidia_par *par = info->par;
struct fb_var_screeninfo *var;
u16 implementation = par->Chipset & 0x0ff0;
u8 *edidA = NULL, *edidB = NULL;
struct fb_monspecs *monitorA, *monitorB;
struct fb_monspecs *monA = NULL, *monB = NULL;
int mobile = 0;
int tvA = 0;
int tvB = 0;
int FlatPanel = -1; /* really means the CRTC is slaved */
int Television = 0;
int err = 0;
var = kzalloc_obj(struct fb_var_screeninfo);
monitorA = kzalloc_obj(struct fb_monspecs);
monitorB = kzalloc_obj(struct fb_monspecs);
if (!var || !monitorA || !monitorB) {
err = -ENOMEM;
goto done;
}
Annotation
- Immediate include surface: `video/vga.h`, `linux/delay.h`, `linux/pci.h`, `linux/slab.h`, `nv_type.h`, `nv_local.h`, `nv_proto.h`.
- Detected declarations: `function NVWriteCrtc`, `function NVReadCrtc`, `function NVWriteGr`, `function NVReadGr`, `function NVWriteSeq`, `function NVReadSeq`, `function NVWriteAttr`, `function NVReadAttr`, `function NVWriteMiscOut`, `function NVReadMiscOut`.
- Atlas domain: Driver Families / drivers/video.
- 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.