How acpi_walk_resources() find specific _CRS for one device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Experts

I am reading the PCI enumeration code on x86. One thing on ACPI
namespace puzzles me.

In the initialize process, the call flow is like this
acpi_pci_root_add()
	try_get_root_bridge_busnr()
		acpi_walk_resources(handle, METHOD_NAME__CRS,
		         get_root_bridge_busnr_callback, res)

By reading the ACPI spec, this is trying to go through the namespace and
find  the _CRS method/object.

1. Hmm... I want to know this function is trying to go through the whole
   namespace or just the device related namespace? 
2. If it is searching the whole namespace, how could this function find the
   device specific resource just by given the "_CRS" as a parameter?
3. Also, if it just go through the device specific namespace, which
   parameter identify this.

Here is an example in the ACPI specification in 9.11.1:
Device (PCI0) { // PCI Root Bridge
	Name (_HID, EISAID("PNP0A03"))
	Name (_UID, 0)
	Name (_BBN, 0x00)
	Name (_SEG, 0x00) // assign segment 0 of module device to PCI0
	Name (_CRS, ResourceTemplate () {
		WordBusNumber (
			ResourceProducer,
			MinFixed, // _MIF
			MaxFixed,, // _MAF
			0x00, // _GRA
			0x00, // _MIN
			0xFF, // _MAX
			0x0, // _TRA
			0x80) // _LEN
		WordIO (
			ResourceProducer,
			MinFixed, // _MIF
			MaxFixed,,, // _MAF
			0x0000, // _GRA
			0x0000, // _MIN
			0x0CF7, // _MAX
			0x0, // _TRA
			0x0CF8) // _LEN
		DWordMemory (
			ResourceProducer,,
			MinNotFixed, // _MIF
			MaxNotFixed, // _MAF
			NonCacheable, // _MEM
			ReadWrite, // _RW
			0x0FFFFFFF, // _GRA
			0x40000000, // _MIN
			0x5FFFFFFF, // _MAX
			0x0, // _TRA
			0x00000000) // _LEN
	})
	}
}

Device (PCI1) { // PCI Root Bridge
	Name (_HID, EISAID("PNP0A03"))
	Name (_UID, 0)
	Name (_BBN, 0x00)
	Name (_SEG, 0x01) // assign segment 1 of module device to PCI1
	Name (_CRS, ResourceTemplate () {
		WordBusNumber (
			ResourceProducer,
			MinFixed, //
			MaxFixed,, //
			0x00, //
			0x00, //
			0x7F, //
			0x0, //
			0x80) //
		WordIO (
			ResourceProducer,
			MinFixed, //
			MaxFixed, //
			0x0000, //
			0x0D00, //
			0x7FFF, //
			0x0, //
			0x7300) //
		DWordMemory (
			ResourceProducer,
			MinNotFixed,
			MaxNotFixed,
			NonCacheable,
			ReadWrite,
			0x0FFFFFFF,
			0x60000000,
			0x7FFFFFFF,
			0x0,
			0x00000000)
	})
	}
}

We can see there are two PCI Root Bridge, and each has its own _CRS
field. And each field has its own busnumber/iores/memios.

So, in the acpi_walk_resources() function, how to find the proper _CRS
infomation for a root device?

-- 
Richard Yang
Help you, Help me

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux