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

[Xen-ia64-devel] [PATCH][Open GFW]Support ACPI SPCR table



Hi Tristan,

The following patch supports ACPI Serial Port Console
Redirection(SPCR) table, by which we can use Windows Special
Administration Console(SAC).

Thanks,
KAZ

Signed-off-by: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>
# HG changeset patch
# User Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>
# Date 1206681923 -32400
# Node ID c5bbf82de136f80f67ce863ee3412e5de4f11e9f
# Parent  7097ce08e5befea698f130279ccdcd3e1e08545e
Supports ACPI Serial Port Console Redirection(SPCR) table, by which we
can use Windows Special Administration Console(SAC).

Signed-off-by: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>

diff -r 7097ce08e5be -r c5bbf82de136 edk2-sparse/EdkXenPkg/Dxe/XenAcpi/acpi2_0.h
--- a/edk2-sparse/EdkXenPkg/Dxe/XenAcpi/acpi2_0.h       Fri Mar 28 02:50:55 
2008 +0100
+++ b/edk2-sparse/EdkXenPkg/Dxe/XenAcpi/acpi2_0.h       Fri Mar 28 14:25:23 
2008 +0900
@@ -263,6 +263,34 @@ struct acpi_20_hpet {
 #define ACPI_HPET_ADDRESS 0xFED00000UL
 
 /*
+ * SPCR - Serial Port Console Redirection table
+ */
+struct acpi_20_spcr {
+    struct acpi_header header;    /* Common ACPI table header */
+    uint8_t interface_type;       /* 0=full 16550, 1=subset of 16550 */
+    uint8_t reserved[3];
+    struct acpi_20_generic_address addr;
+    uint8_t interrupt_type;
+    uint8_t pc_interrupt;
+    uint32_t interrupt;
+    uint8_t baud_rate;
+    uint8_t parity;
+    uint8_t stop_bits;
+    uint8_t flow_control;
+    uint8_t terminal_type;
+    uint8_t reserved1;
+    uint16_t pci_device_id;
+    uint16_t pci_vendor_id;
+    uint8_t pci_bus;
+    uint8_t pci_device;
+    uint8_t pci_function;
+    uint32_t pci_flags;
+    uint8_t pci_segment;
+    uint32_t reserved2;
+};
+#define ACPI_SPCR_ADDRESS 0x000003F8UL
+
+/*
  * Multiple APIC Flags.
  */
 #define ACPI_PCAT_COMPAT (1 << 0)
@@ -351,6 +379,7 @@ struct acpi_20_madt_iosapic {
 #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T')
 #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
 #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
+#define ACPI_2_0_SPCR_SIGNATURE ASCII32('S','P','C','R')
 
 /*
  * Table revision numbers.
@@ -362,6 +391,7 @@ struct acpi_20_madt_iosapic {
 #define ACPI_2_0_XSDT_REVISION 0x01
 #define ACPI_2_0_TCPA_REVISION 0x02
 #define ACPI_2_0_HPET_REVISION 0x01
+#define ACPI_2_0_SPCR_REVISION 0x01
 
 #pragma pack ()
 
diff -r 7097ce08e5be -r c5bbf82de136 edk2-sparse/EdkXenPkg/Dxe/XenAcpi/build.c
--- a/edk2-sparse/EdkXenPkg/Dxe/XenAcpi/build.c Fri Mar 28 02:50:55 2008 +0100
+++ b/edk2-sparse/EdkXenPkg/Dxe/XenAcpi/build.c Fri Mar 28 14:25:23 2008 +0900
@@ -187,11 +187,53 @@ int construct_hpet(struct acpi_20_hpet *
     return offset;
 }
 
+int construct_spcr(struct acpi_20_spcr *spcr)
+{
+    int offset;
+
+    memset(spcr, 0, sizeof(*spcr));
+    spcr->header.signature    = ACPI_2_0_SPCR_SIGNATURE;
+    spcr->header.revision     = ACPI_2_0_SPCR_REVISION;
+    strncpy(spcr->header.oem_id, ACPI_OEM_ID, 6);
+    strncpy(spcr->header.oem_table_id, ACPI_OEM_TABLE_ID, 8);
+    spcr->header.oem_revision = ACPI_OEM_REVISION;
+    spcr->header.creator_id   = ACPI_CREATOR_ID;
+    spcr->header.creator_revision = ACPI_CREATOR_REVISION;
+    spcr->interface_type = 0;
+    spcr->addr.address_space_id = 1;
+    spcr->addr.register_bit_width = 8;
+    spcr->addr.register_bit_offset = 0;
+    spcr->addr.address = ACPI_SPCR_ADDRESS;;
+    spcr->interrupt_type = 5;
+    spcr->pc_interrupt = 4;
+    spcr->interrupt = 4;
+    spcr->baud_rate = 7;
+    spcr->parity = 0;
+    spcr->stop_bits = 1;
+    spcr->flow_control = 3;
+    spcr->terminal_type = 2;
+    spcr->pci_device_id = 0xffff;
+    spcr->pci_vendor_id = 0xffff;
+    spcr->pci_bus = 0;
+    spcr->pci_device = 0;
+    spcr->pci_function = 0;
+    spcr->pci_flags = 0;
+    spcr->pci_segment = 0;
+
+    offset = sizeof(*spcr);
+
+    spcr->header.length = offset;
+    set_checksum(spcr, offsetof(struct acpi_header, checksum), offset);
+
+    return offset;
+}
+
 int construct_secondary_tables(uint8_t *buf, unsigned long *table_ptrs)
 {
     int offset = 0, nr_tables = 0;
     struct acpi_20_madt *madt;
     struct acpi_20_hpet *hpet;
+    struct acpi_20_spcr *spcr;
 #if 0
     struct acpi_20_tcpa *tcpa;
     static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
@@ -210,6 +252,11 @@ int construct_secondary_tables(uint8_t *
     hpet = (struct acpi_20_hpet *)&buf[offset];
     offset += construct_hpet(hpet);
     table_ptrs[nr_tables++] = (unsigned long)hpet;
+
+    /* SPCR. */
+    spcr = (struct acpi_20_spcr *)&buf[offset];
+    offset += construct_spcr(spcr);
+    table_ptrs[nr_tables++] = (unsigned long)spcr;
 
 #if 0
     /* TPM TCPA and SSDT. */
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.