-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

Following patch adds MCFG table for ACPI, so linux can find MMCONFIG area for
PCI configuration access.

Please note that you need to hack Linux kernel and remove the check for e820 not
reserved complain.

Signed-off-by: Rudolf Marek <[EMAIL PROTECTED]>

Rudolf
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFG/Za43J9wPJqZRNURAmibAKCLqEzJTAT3X332dzvLUFr9fQK7lQCglxLC
zQvvXvQNuY/NACGvuJozLi8=
=iSRu
-----END PGP SIGNATURE-----
Index: src/arch/i386/boot/acpi.c
===================================================================
--- src/arch/i386/boot/acpi.c	(revision 2776)
+++ src/arch/i386/boot/acpi.c	(working copy)
@@ -65,7 +65,16 @@
 	printk_warning("ACPI: could not add ACPI table to RSDT. failed.\n");
 }
 
+int acpi_create_mcfg_mmconfig(acpi_mcfg_mmconfig_t *mmconfig, u32 base, u16 seg_nr, u8 start, u8 end) {
+	mmconfig->base_address = base;
+	mmconfig->base_reserved = 0;
+	mmconfig->pci_segment_group_number = seg_nr;
+	mmconfig->start_bus_number = start;
+	mmconfig->end_bus_number = end;
+	return (sizeof(acpi_mcfg_mmconfig_t));
+}
 
+
 int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic)
 {
 	lapic->type=0;
@@ -146,6 +155,31 @@
 	header->checksum	= acpi_checksum((void *)madt, header->length);
 }
 
+void acpi_create_mcfg(acpi_mcfg_t *mcfg)
+{
+
+	acpi_header_t *header=&(mcfg->header);
+	unsigned long current=(unsigned long)mcfg+sizeof(acpi_mcfg_t);
+	
+	memset((void *)mcfg, 0, sizeof(acpi_mcfg_t));
+	
+	/* fill out header fields */
+	memcpy(header->signature, MCFG_NAME, 4);
+	memcpy(header->oem_id, OEM_ID, 6);
+	memcpy(header->oem_table_id, MCFG_TABLE, 8);
+	memcpy(header->asl_compiler_id, ASLC, 4);
+	
+	header->length = sizeof(acpi_mcfg_t);
+	header->revision = 1;
+
+	current = acpi_fill_mcfg(current);
+	
+	/* recalculate length */
+	header->length= current - (unsigned long)mcfg;
+	
+	header->checksum	= acpi_checksum((void *)mcfg, header->length);
+}
+
 int acpi_create_srat_lapic(acpi_srat_lapic_t *lapic, u8 node, u8 apic)
 {
         lapic->type=0;
Index: src/arch/i386/include/arch/acpi.h
===================================================================
--- src/arch/i386/include/arch/acpi.h	(revision 2776)
+++ src/arch/i386/include/arch/acpi.h	(working copy)
@@ -26,11 +26,13 @@
 #define RSDT_NAME             "RSDT"
 #define HPET_NAME             "HPET"
 #define MADT_NAME             "APIC"
+#define MCFG_NAME             "MCFG"
 #define SRAT_NAME             "SRAT"
 #define SLIT_NAME	      "SLIT"
 
 #define RSDT_TABLE            "RSDT    "
 #define HPET_TABLE            "AMD64   "
+#define MCFG_TABLE            "MCFG    "
 #define MADT_TABLE            "MADT    "
 #define SRAT_TABLE	      "SRAT    "
 #define SLIT_TABLE	      "SLIT    "
@@ -81,7 +83,7 @@
 /* RSDT */
 typedef struct acpi_rsdt {
 	struct acpi_table_header header;
-	u32 entry[6+ACPI_SSDTX_NUM+CONFIG_MAX_CPUS]; /* HPET, FADT, SRAT, SLIT, MADT(APIC), SSDT, SSDTX, and SSDT for CPU pstate*/
+	u32 entry[7+ACPI_SSDTX_NUM+CONFIG_MAX_CPUS]; /* MCONFIG, HPET, FADT, SRAT, SLIT, MADT(APIC), SSDT, SSDTX, and SSDT for CPU pstate*/
 } __attribute__ ((packed)) acpi_rsdt_t;
 
 /* XSDT */
@@ -100,6 +102,22 @@
 	u8 attributes;
 } __attribute__ ((packed)) acpi_hpet_t;
 
+/* MCFG taken from include/linux/acpi.h */
+typedef struct acpi_mcfg {
+	struct acpi_table_header header;
+	u8 reserved[8];
+} __attribute__ ((packed)) acpi_mcfg_t;
+
+typedef struct acpi_mcfg_mmconfig {
+	u32 base_address;
+	u32 base_reserved;
+	u16 pci_segment_group_number;
+	u8 start_bus_number;
+	u8 end_bus_number;
+	u8 reserved[4];
+} __attribute__ ((packed)) acpi_mcfg_mmconfig_t;
+
+
 /* SRAT */
 typedef struct acpi_srat {
         struct acpi_table_header header;
@@ -273,6 +291,7 @@
 /* These are implemented by the target port */
 unsigned long write_acpi_tables(unsigned long addr);
 unsigned long acpi_fill_madt(unsigned long current);
+unsigned long acpi_fill_mcfg(unsigned long current);
 unsigned long acpi_fill_srat(unsigned long current); 
 void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs,void *dsdt);
 
@@ -294,11 +313,14 @@
 
 int acpi_create_srat_lapic(acpi_srat_lapic_t *lapic, u8 node, u8 apic);
 int acpi_create_srat_mem(acpi_srat_mem_t *mem, u8 node, u32 basek,u32 sizek, u32 flags);
+int acpi_create_mcfg_mmconfig(acpi_mcfg_mmconfig_t *mmconfig, u32 base, u16 seg_nr, u8 start, u8 end);
 unsigned long acpi_create_srat_lapics(unsigned long current);
 void acpi_create_srat(acpi_srat_t *srat);
 
 void acpi_create_hpet(acpi_hpet_t *hpet);
 
+void acpi_create_mcfg(acpi_mcfg_t *mcfg);
+
 void acpi_create_facs(acpi_facs_t *facs);
 
 void acpi_write_rsdt(acpi_rsdt_t *rsdt);
-- 
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to