#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <dev/acpi/acpireg.h>
#include <dev/acpi/acpivar.h>
#include <dev/pci/pcivar.h>
int acpimcfg_match(struct device *, void *, void *);
void acpimcfg_attach(struct device *, struct device *, void *);
const struct cfattach acpimcfg_ca = {
sizeof(struct device), acpimcfg_match, acpimcfg_attach
};
struct cfdriver acpimcfg_cd = {
NULL, "acpimcfg", DV_DULL, CD_COCOVM
};
int
acpimcfg_match(struct device *parent, void *match, void *aux)
{
struct acpi_attach_args *aaa = aux;
struct acpi_table_header *hdr;
if (aaa->aaa_table == NULL)
return (0);
hdr = (struct acpi_table_header *)aaa->aaa_table;
if (memcmp(hdr->signature, MCFG_SIG, sizeof(MCFG_SIG) - 1) != 0)
return (0);
return (1);
}
void
acpimcfg_attach(struct device *parent, struct device *self, void *aux)
{
struct acpi_attach_args *aaa = aux;
struct acpi_mcfg *mcfg = (struct acpi_mcfg *)aaa->aaa_table;
caddr_t addr = (caddr_t)(mcfg + 1);
printf("\n");
while (addr < (caddr_t)mcfg + mcfg->hdr.length) {
struct acpi_mcfg_entry *entry = (struct acpi_mcfg_entry *)addr;
printf("%s: addr 0x%llx, bus %d-%d\n", self->dv_xname,
entry->base_address, entry->min_bus_number, entry->max_bus_number);
pci_mcfg_init(aaa->aaa_memt, entry->base_address,
entry->segment, entry->min_bus_number, entry->max_bus_number);
addr += sizeof(struct acpi_mcfg_entry);
}
}