Re: [PATCH RFC 07/13] xen: implement IO APIC support in Xen mptable parser

2014-02-13 Thread John Baldwin
On Tuesday, December 24, 2013 12:20:56 PM Roger Pau Monne wrote:
 Use madt_setup_io (from madt.c) on Xen apic_enumerator, in order to
 parse the interrupt sources from the IO APIC.
 
 I would like to get opinions, but I think we should rename and move
 madt_setup_io to io_apic.c.

It wouldn't be appropriate for io_apic.c as it isn't generic to I/O
APICs but is specific to ACPI.  However, mptable.c is really not a
great name for this file in sys/x86/xen.  I wonder if it should be
xen_apic.c instead?  Also, if Xen PV has an MADT table, why do you
need a custom APIC enumerator at all?  That is, what is preventing
the code in madt.c from just working?  Do you just not have
'device acpi' in the kernel config you are using?

-- 
John Baldwin
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 07/13] xen: implement IO APIC support in Xen mptable parser

2013-12-24 Thread Roger Pau Monne
Use madt_setup_io (from madt.c) on Xen apic_enumerator, in order to
parse the interrupt sources from the IO APIC.

I would like to get opinions, but I think we should rename and move
madt_setup_io to io_apic.c.
---
 sys/amd64/include/apicvar.h |1 +
 sys/i386/include/apicvar.h  |1 +
 sys/x86/acpica/madt.c   |5 ++---
 sys/x86/xen/mptable.c   |   24 +++-
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index a48a76b..3974067 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -233,6 +233,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
 void   lapic_set_tpr(u_int vector);
 void   lapic_setup(int boot);
 void   xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
 
 #endif /* !LOCORE */
 #endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index c8ee9bc..05ec013 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -232,6 +232,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
 void   lapic_set_tpr(u_int vector);
 void   lapic_setup(int boot);
 void   xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
 
 #endif /* !LOCORE */
 #endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/x86/acpica/madt.c b/sys/x86/acpica/madt.c
index 5929fde..6f3b591 100644
--- a/sys/x86/acpica/madt.c
+++ b/sys/x86/acpica/madt.c
@@ -61,7 +61,7 @@ static struct lapic_info {
 } lapics[MAX_APIC_ID + 1];
 
 static int madt_found_sci_override;
-static ACPI_TABLE_MADT *madt;
+ACPI_TABLE_MADT *madt;
 static vm_paddr_t madt_physaddr;
 static vm_offset_t madt_length;
 
@@ -84,7 +84,6 @@ static void   madt_probe_cpus_handler(ACPI_SUBTABLE_HEADER 
*entry,
void *arg __unused);
 static voidmadt_register(void *dummy);
 static int madt_setup_local(void);
-static int madt_setup_io(void);
 static voidmadt_walk_table(acpi_subtable_handler *handler, void *arg);
 
 static struct apic_enumerator madt_enumerator = {
@@ -147,7 +146,7 @@ madt_setup_local(void)
 /*
  * Enumerate I/O APICs and setup interrupt sources.
  */
-static int
+int
 madt_setup_io(void)
 {
void *ioapic;
diff --git a/sys/x86/xen/mptable.c b/sys/x86/xen/mptable.c
index 0384886..46b03f3 100644
--- a/sys/x86/xen/mptable.c
+++ b/sys/x86/xen/mptable.c
@@ -43,6 +43,9 @@ __FBSDID($FreeBSD$);
 #include machine/intr_machdep.h
 #include machine/apicvar.h
 
+#include contrib/dev/acpica/include/acpi.h
+#include contrib/dev/acpica/include/actables.h
+
 #include machine/cpu.h
 #include machine/smp.h
 
@@ -51,6 +54,9 @@ __FBSDID($FreeBSD$);
 
 #include xen/interface/vcpu.h
 
+/* From madt.c */
+extern ACPI_TABLE_MADT *madt;
+
 static int xenpv_probe(void);
 static int xenpv_probe_cpus(void);
 static int xenpv_setup_local(void);
@@ -107,7 +113,23 @@ xenpv_setup_local(void)
 static int
 xenpv_setup_io(void)
 {
-   return (0);
+   vm_paddr_t madt_physaddr;
+   vm_offset_t madt_length;
+
+   if (!xen_initial_domain())
+   return (0);
+
+   madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
+   if (madt_physaddr == 0)
+   panic(could not find MADT table);
+   madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
+   if (madt == NULL)
+   panic(unable to map MADT);
+   madt_length = madt-Header.Length;
+   acpi_unmap_table(madt);
+   madt = pmap_mapbios(madt_physaddr, madt_length);
+
+   return (madt_setup_io());
 }
 
 static void
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org