Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

PCI: be more verbose about resource quirks

When reserving an PCI quirk, note that in the kernel bootup messages.

Also, parse the strange PIIX4 device resources - they should get their
own PCI resource quirks, but for now just print out what it finds to
verify that the code does the right thing.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>

+88 -13
+88 -13
drivers/pci/quirks.c
··· 241 241 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M ); 242 242 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M ); 243 243 244 - static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsigned size, int nr) 244 + static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, 245 + unsigned size, int nr, const char *name) 245 246 { 246 247 region &= ~(size-1); 247 248 if (region) { ··· 260 259 pcibios_bus_to_resource(dev, res, &bus_region); 261 260 262 261 pci_claim_resource(dev, nr); 262 + printk("PCI quirk: region %04x-%04x claimed by %s\n", region, region + size - 1, name); 263 263 } 264 264 } 265 265 ··· 293 291 u16 region; 294 292 295 293 pci_read_config_word(dev, 0xE0, &region); 296 - quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); 294 + quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI"); 297 295 pci_read_config_word(dev, 0xE2, &region); 298 - quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); 296 + quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB"); 299 297 } 300 298 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi ); 299 + 300 + static void piix4_io_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable) 301 + { 302 + u32 devres; 303 + u32 mask, size, base; 304 + 305 + pci_read_config_dword(dev, port, &devres); 306 + if ((devres & enable) != enable) 307 + return; 308 + mask = (devres >> 16) & 15; 309 + base = devres & 0xffff; 310 + size = 16; 311 + for (;;) { 312 + unsigned bit = size >> 1; 313 + if ((bit & mask) == bit) 314 + break; 315 + size = bit; 316 + } 317 + /* 318 + * For now we only print it out. Eventually we'll want to 319 + * reserve it (at least if it's in the 0x1000+ range), but 320 + * let's get enough confirmation reports first. 321 + */ 322 + base &= -size; 323 + printk("%s PIO at %04x-%04x\n", name, base, base + size - 1); 324 + } 325 + 326 + static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable) 327 + { 328 + u32 devres; 329 + u32 mask, size, base; 330 + 331 + pci_read_config_dword(dev, port, &devres); 332 + if ((devres & enable) != enable) 333 + return; 334 + base = devres & 0xffff0000; 335 + mask = (devres & 0x3f) << 16; 336 + size = 128 << 16; 337 + for (;;) { 338 + unsigned bit = size >> 1; 339 + if ((bit & mask) == bit) 340 + break; 341 + size = bit; 342 + } 343 + /* 344 + * For now we only print it out. Eventually we'll want to 345 + * reserve it, but let's get enough confirmation reports first. 346 + */ 347 + base &= -size; 348 + printk("%s MMIO at %04x-%04x\n", name, base, base + size - 1); 349 + } 301 350 302 351 /* 303 352 * PIIX4 ACPI: Two IO regions pointed to by longwords at 304 353 * 0x40 (64 bytes of ACPI registers) 305 354 * 0x90 (32 bytes of SMB registers) 355 + * and a few strange programmable PIIX4 device resources. 306 356 */ 307 357 static void __devinit quirk_piix4_acpi(struct pci_dev *dev) 308 358 { 309 - u32 region; 359 + u32 region, res_a; 310 360 311 361 pci_read_config_dword(dev, 0x40, &region); 312 - quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); 362 + quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI"); 313 363 pci_read_config_dword(dev, 0x90, &region); 314 - quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); 364 + quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB"); 365 + 366 + /* Device resource A has enables for some of the other ones */ 367 + pci_read_config_dword(dev, 0x5c, &res_a); 368 + 369 + piix4_io_quirk(dev, "PIIX4 devres B", 0x60, 3 << 21); 370 + piix4_io_quirk(dev, "PIIX4 devres C", 0x64, 3 << 21); 371 + 372 + /* Device resource D is just bitfields for static resources */ 373 + 374 + /* Device 12 enabled? */ 375 + if (res_a & (1 << 29)) { 376 + piix4_io_quirk(dev, "PIIX4 devres E", 0x68, 1 << 20); 377 + piix4_mem_quirk(dev, "PIIX4 devres F", 0x6c, 1 << 7); 378 + } 379 + /* Device 13 enabled? */ 380 + if (res_a & (1 << 30)) { 381 + piix4_io_quirk(dev, "PIIX4 devres G", 0x70, 1 << 20); 382 + piix4_mem_quirk(dev, "PIIX4 devres H", 0x74, 1 << 7); 383 + } 384 + piix4_io_quirk(dev, "PIIX4 devres I", 0x78, 1 << 20); 385 + piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); 315 386 } 316 387 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); 317 388 ··· 398 323 u32 region; 399 324 400 325 pci_read_config_dword(dev, 0x40, &region); 401 - quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES); 326 + quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, "ICH4 ACPI/GPIO/TCO"); 402 327 403 328 pci_read_config_dword(dev, 0x58, &region); 404 - quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1); 329 + quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH4 GPIO"); 405 330 } 406 331 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi ); 407 332 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi ); ··· 427 352 if (rev & 0x10) { 428 353 pci_read_config_dword(dev, 0x48, &region); 429 354 region &= PCI_BASE_ADDRESS_IO_MASK; 430 - quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES); 355 + quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES, "vt82c586 ACPI"); 431 356 } 432 357 } 433 358 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi ); ··· 447 372 448 373 pci_read_config_word(dev, 0x70, &hm); 449 374 hm &= PCI_BASE_ADDRESS_IO_MASK; 450 - quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1); 375 + quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c868 HW-mon"); 451 376 452 377 pci_read_config_dword(dev, 0x90, &smb); 453 378 smb &= PCI_BASE_ADDRESS_IO_MASK; 454 - quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2); 379 + quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c868 SMB"); 455 380 } 456 381 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi ); 457 382 ··· 466 391 467 392 pci_read_config_word(dev, 0x88, &pm); 468 393 pm &= PCI_BASE_ADDRESS_IO_MASK; 469 - quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES); 394 + quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM"); 470 395 471 396 pci_read_config_word(dev, 0xd0, &smb); 472 397 smb &= PCI_BASE_ADDRESS_IO_MASK; 473 - quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1); 398 + quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1, "vt8235 SMB"); 474 399 } 475 400 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); 476 401