Date: Sun, 9 Sep 2018 12:22:55 +0300 From: Konstantin Belousov <kostikbel@gmail.com> To: Yuri Pankov <yuripv@yuripv.net> Cc: freebsd-hackers <freebsd-hackers@freebsd.org> Subject: Re: acpi, pci, spibus -- tying it all together Message-ID: <20180909092255.GM3161@kib.kiev.ua> In-Reply-To: <30e41db8-a56d-e916-0490-7e184063a811@yuripv.net> References: <30e41db8-a56d-e916-0490-7e184063a811@yuripv.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Sep 09, 2018 at 10:25:44AM +0300, Yuri Pankov wrote: > I have modified intelspi to attach to SPI master (Sunrise Point-H Serial > IO SPI) located on pci bus, and on attach I have the spibus0 and spibus1 > buses added. > > As spibus is not self-enumerating, the only way to find the slave device > I need is via acpi bus probe, that works, but I don't see a way to make > it a child of spibus1 (where it's located). > > In ACPI terms it looks like the below (from DSDT): > > ... > \_SB_.PCI0.SPI0 "Device (SPI0)" > \_SB_.PCI0.SPI1 "Device (SPI1)" > ... > Scope (SPI1) { > Device (SPIT) { > ...here comes all the data we need, > including the ACPI ID we can probe... > } > } > ... > > I hope that made at least some sense. And the question is if there any > existing way of tying it all together, and adding that slave device to > the spibus1 (which only knows about hinted children at the moment)? I had very similar situation where I wrote NVDIMM driver. The suggestion I got was to implement DEVICE_IDENTIFY() method. It gets the driver_t and the parent bus device_t arguments. In the method, you create children' device_t, iterating over the ACPI enumerated entries. Practically, you would use acpica AcpiWalkNamespace(ACPI_TYPE_DEVICE, ...) function and call BUS_ADD_CHILD() when needed. Set the ACPI handle for the created child. [Get the Intel' ACPICA reference manual to understand the KPI]. Then probe does nothing, and attach verifies against the handle. You can see that in https://kib.kiev.ua/kib/nvdimm.7.patch nvdimm_identify(), nvdimm_foreach_acpi(), and nvdimm_create_dev().
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20180909092255.GM3161>