| /*++ | |
| Copyright (c) 2006, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| Module Name: | |
| MiscPortInternalConnectorDesignatorFunction.c | |
| Abstract: | |
| This driver parses the mMiscSubclassDataTable structure and reports | |
| any generated data to the DataHub. | |
| --*/ | |
| #include "MiscSubClassDriver.h" | |
| // | |
| // | |
| // | |
| MISC_SUBCLASS_TABLE_FUNCTION ( | |
| MiscPortInternalConnectorDesignator | |
| ) | |
| /*++ | |
| Description: | |
| This function makes boot time changes to the contents of the | |
| MiscPortConnectorInformation (Type 8). | |
| Parameters: | |
| RecordType | |
| Type of record to be processed from the Data Table. | |
| mMiscSubclassDataTable[].RecordType | |
| RecordLen | |
| Size of static RecordData from the Data Table. | |
| mMiscSubclassDataTable[].RecordLen | |
| RecordData | |
| Pointer to copy of RecordData from the Data Table. Changes made | |
| to this copy will be written to the Data Hub but will not alter | |
| the contents of the static Data Table. | |
| LogRecordData | |
| Set *LogRecordData to TRUE to log RecordData to Data Hub. | |
| Set *LogRecordData to FALSE when there is no more data to log. | |
| Returns: | |
| EFI_SUCCESS | |
| All parameters were valid and *RecordData and *LogRecordData have | |
| been set. | |
| EFI_UNSUPPORTED | |
| Unexpected RecordType value. | |
| EFI_INVALID_PARAMETER | |
| One of the following parameter conditions was true: | |
| RecordLen was zero. | |
| RecordData was NULL. | |
| LogRecordData was NULL. | |
| --*/ | |
| { | |
| STATIC BOOLEAN Done = FALSE; | |
| STATIC PS2_CONN_DEVICE_PATH mPs2KeyboardDevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0303, 0), DP_END }; | |
| STATIC PS2_CONN_DEVICE_PATH mPs2MouseDevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0303, 1), DP_END }; | |
| STATIC SERIAL_CONN_DEVICE_PATH mCom1DevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0501, 0), DP_END }; | |
| STATIC SERIAL_CONN_DEVICE_PATH mCom2DevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0501, 1), DP_END }; | |
| //STATIC PARALLEL_CONN_DEVICE_PATH mLpt1DevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0401, 0), DP_END }; | |
| STATIC FLOOPY_CONN_DEVICE_PATH mFloopyADevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0604, 0), DP_END }; | |
| //STATIC FLOOPY_CONN_DEVICE_PATH mFloopyBDevicePath = { DP_ACPI, DP_PCI (0x1F, 0x00), DP_LPC (0x0604, 1), DP_END }; | |
| //STATIC USB_PORT_DEVICE_PATH mUsb0DevicePath = { DP_ACPI, DP_PCI (0x1d, 0x00), DP_END }; | |
| //STATIC USB_PORT_DEVICE_PATH mUsb1DevicePath = { DP_ACPI, DP_PCI (0x1d, 0x01), DP_END }; | |
| //STATIC USB_PORT_DEVICE_PATH mUsb2DevicePath = { DP_ACPI, DP_PCI (0x1d, 0x02), DP_END }; | |
| //STATIC USB_PORT_DEVICE_PATH mUsb3DevicePath = { DP_ACPI, DP_PCI (0x1d, 0x07), DP_END }; | |
| //STATIC IDE_DEVICE_PATH mIdeDevicePath = { DP_ACPI, DP_PCI (0x1F, 0x01), DP_END }; | |
| //STATIC GB_NIC_DEVICE_PATH mGbNicDevicePath = { DP_ACPI, DP_PCI( 0x03,0x00 ),DP_PCI( 0x1F,0x00 ),DP_PCI( 0x07,0x00 ), DP_END }; | |
| EFI_DEVICE_PATH_PROTOCOL EndDevicePath = DP_END; | |
| // | |
| // First check for invalid parameters. | |
| // | |
| // Shanmu >> to fix the Device Path Issue... | |
| // if (RecordLen == 0 || RecordData == NULL || LogRecordData == NULL) { | |
| // | |
| if (*RecordLen == 0 || RecordData == NULL || LogRecordData == NULL) { | |
| // | |
| // End Shanmu | |
| // | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| // | |
| // Then check for unsupported RecordType. | |
| // | |
| if (RecordType != EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| // | |
| // Is this the first time through this function? | |
| // | |
| if (!Done) { | |
| // | |
| // Yes, this is the first time. Inspect/Change the contents of the | |
| // RecordData structure. | |
| // | |
| // | |
| // Device path is only updated here as it was not taking that in static data | |
| // | |
| // Shanmu >> to fix the Device Path Issue... | |
| // | |
| /* | |
| switch (((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortInternalConnectorDesignator) | |
| { | |
| case STR_MISC_PORT_INTERNAL_MOUSE: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mPs2MouseDevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_KEYBOARD: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mPs2KeyboardDevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_COM1: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mCom1DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_COM2: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mCom2DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_LPT1: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mLpt1DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_USB1: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mUsb0DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_USB2: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mUsb1DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_USB3: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mUsb2DevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_NETWORK: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mGbNicDevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_FLOPPY: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mFloopyADevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_IDE1: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mIdeDevicePath); | |
| }break; | |
| case STR_MISC_PORT_INTERNAL_IDE2: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = *((EFI_DEVICE_PATH_PROTOCOL*)&mIdeDevicePath); | |
| }break; | |
| default: | |
| { | |
| (EFI_DEVICE_PATH_PROTOCOL)((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *)RecordData)->PortPath = EndDevicePath; | |
| }break; | |
| } | |
| */ | |
| switch (((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortInternalConnectorDesignator) { | |
| case STR_MISC_PORT_INTERNAL_MOUSE: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &mPs2MouseDevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mPs2MouseDevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mPs2MouseDevicePath); | |
| } | |
| break; | |
| case STR_MISC_PORT_INTERNAL_KEYBOARD: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &mPs2KeyboardDevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mPs2KeyboardDevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mPs2KeyboardDevicePath); | |
| } | |
| break; | |
| case STR_MISC_PORT_INTERNAL_COM1: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &mCom1DevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mCom1DevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mCom1DevicePath); | |
| } | |
| break; | |
| case STR_MISC_PORT_INTERNAL_COM2: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &mCom2DevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mCom2DevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mCom2DevicePath); | |
| } | |
| break; | |
| case STR_MISC_PORT_INTERNAL_FLOPPY: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &mFloopyADevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mFloopyADevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &mFloopyADevicePath); | |
| } | |
| break; | |
| default: | |
| { | |
| CopyMem ( | |
| &((EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData)->PortPath, | |
| &EndDevicePath, | |
| GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &EndDevicePath) | |
| ); | |
| *RecordLen = *RecordLen - sizeof (EFI_MISC_PORT_DEVICE_PATH) + GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) &EndDevicePath); | |
| } | |
| break; | |
| } | |
| // | |
| // End Shanmu | |
| // | |
| // Set Done flag to TRUE for next pass through this function. | |
| // Set *LogRecordData to TRUE so data will get logged to Data Hub. | |
| // | |
| Done = TRUE; | |
| *LogRecordData = TRUE; | |
| } else { | |
| // | |
| // No, this is the second time. Reset the state of the Done flag | |
| // to FALSE and tell the data logger that there is no more data | |
| // to be logged for this record type. If any memory allocations | |
| // were made by earlier passes, they must be released now. | |
| // | |
| Done = FALSE; | |
| *LogRecordData = FALSE; | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /* eof - MiscSystemManufacturerFunction.c */ |