1 /** @file 2 ISA ACPI Protocol Implementation 3 4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 **/ 13 14 #include "PcatIsaAcpi.h" 15 16 // 17 // Platform specific data for the ISA devices that are present.in the platform 18 // 19 20 // 21 // COM 1 UART Controller 22 // 23 GLOBAL_REMOVE_IF_UNREFERENCED 24 EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom1DeviceResources[] = { 25 {EfiIsaAcpiResourceIo, 0, 0x3f8, 0x3ff}, 26 {EfiIsaAcpiResourceInterrupt, 0, 4, 0}, 27 {EfiIsaAcpiResourceEndOfList, 0, 0, 0} 28 }; 29 30 // 31 // COM 2 UART Controller 32 // 33 GLOBAL_REMOVE_IF_UNREFERENCED 34 EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiCom2DeviceResources[] = { 35 {EfiIsaAcpiResourceIo, 0, 0x2f8, 0x2ff}, 36 {EfiIsaAcpiResourceInterrupt, 0, 3, 0}, 37 {EfiIsaAcpiResourceEndOfList, 0, 0, 0} 38 }; 39 40 // 41 // PS/2 Keyboard Controller 42 // 43 GLOBAL_REMOVE_IF_UNREFERENCED 44 EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2KeyboardDeviceResources[] = { 45 {EfiIsaAcpiResourceIo, 0, 0x60, 0x64}, 46 {EfiIsaAcpiResourceInterrupt, 0, 1, 0}, 47 {EfiIsaAcpiResourceEndOfList, 0, 0, 0} 48 }; 49 50 // 51 // PS/2 Mouse Controller 52 // 53 GLOBAL_REMOVE_IF_UNREFERENCED 54 EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiPs2MouseDeviceResources[] = { 55 {EfiIsaAcpiResourceIo, 0, 0x60, 0x64}, 56 {EfiIsaAcpiResourceInterrupt, 0, 12, 0}, 57 {EfiIsaAcpiResourceEndOfList, 0, 0, 0} 58 }; 59 60 // 61 // Floppy Disk Controller 62 // 63 GLOBAL_REMOVE_IF_UNREFERENCED 64 EFI_ISA_ACPI_RESOURCE mPcatIsaAcpiFloppyResources[] = { 65 {EfiIsaAcpiResourceIo, 0, 0x3f0, 0x3f7}, 66 {EfiIsaAcpiResourceInterrupt, 0, 6, 0}, 67 {EfiIsaAcpiResourceDma, EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE | EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8 | EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE, 2, 0}, 68 {EfiIsaAcpiResourceEndOfList, 0, 0, 0} 69 }; 70 71 GLOBAL_REMOVE_IF_UNREFERENCED 72 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiCom1Device = { 73 {EISA_PNP_ID(0x501), 0}, mPcatIsaAcpiCom1DeviceResources 74 }; // COM 1 UART Controller 75 76 GLOBAL_REMOVE_IF_UNREFERENCED 77 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiCom2Device = { 78 {EISA_PNP_ID(0x501), 1}, mPcatIsaAcpiCom2DeviceResources 79 }; // COM 2 UART Controller 80 81 GLOBAL_REMOVE_IF_UNREFERENCED 82 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiPs2KeyboardDevice = { 83 {EISA_PNP_ID(0x303), 0}, mPcatIsaAcpiPs2KeyboardDeviceResources 84 }; // PS/2 Keyboard Controller 85 86 GLOBAL_REMOVE_IF_UNREFERENCED 87 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiPs2MouseDevice = { 88 {EISA_PNP_ID(0x303), 1}, mPcatIsaAcpiPs2MouseDeviceResources 89 }; // PS/2 Mouse Controller 90 91 GLOBAL_REMOVE_IF_UNREFERENCED 92 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiFloppyADevice = { 93 {EISA_PNP_ID(0x604), 0}, mPcatIsaAcpiFloppyResources 94 }; // Floppy Disk Controller A: 95 96 GLOBAL_REMOVE_IF_UNREFERENCED 97 EFI_ISA_ACPI_RESOURCE_LIST mPcatIsaAcpiFloppyBDevice = { 98 {EISA_PNP_ID(0x604), 1}, mPcatIsaAcpiFloppyResources 99 }; // Floppy Disk Controller B: 100 101 // 102 // Table of ISA Controllers 103 // 104 EFI_ISA_ACPI_RESOURCE_LIST gPcatIsaAcpiDeviceList[7] = {{{0, 0}, NULL}}; 105 106 /** 107 Initialize gPcatIsaAcpiDeviceList. 108 **/ 109 VOID 110 InitializePcatIsaAcpiDeviceList ( 111 VOID 112 ) 113 { 114 UINTN Index; 115 116 Index = 0; 117 if (PcdGetBool (PcdIsaAcpiCom1Enable)) { 118 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiCom1Device, sizeof(mPcatIsaAcpiCom1Device)); 119 Index++; 120 } 121 if (PcdGetBool (PcdIsaAcpiCom2Enable)) { 122 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiCom2Device, sizeof(mPcatIsaAcpiCom2Device)); 123 Index++; 124 } 125 if (PcdGetBool (PcdIsaAcpiPs2KeyboardEnable)) { 126 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiPs2KeyboardDevice, sizeof(mPcatIsaAcpiPs2KeyboardDevice)); 127 Index++; 128 } 129 if (PcdGetBool (PcdIsaAcpiPs2MouseEnable)) { 130 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiPs2MouseDevice, sizeof(mPcatIsaAcpiPs2MouseDevice)); 131 Index++; 132 } 133 if (PcdGetBool (PcdIsaAcpiFloppyAEnable)) { 134 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiFloppyADevice, sizeof(mPcatIsaAcpiFloppyADevice)); 135 Index++; 136 } 137 if (PcdGetBool (PcdIsaAcpiFloppyBEnable)) { 138 CopyMem (&gPcatIsaAcpiDeviceList[Index], &mPcatIsaAcpiFloppyBDevice, sizeof(mPcatIsaAcpiFloppyBDevice)); 139 Index++; 140 } 141 } 142 143 // 144 // ISA ACPI Protocol Functions 145 // 146 /** 147 Enumerate the ISA devices on the ISA bus. 148 149 @param Device Point to device ID instance 150 @param IsaAcpiDevice On return, point to resource data for Isa device 151 @param NextIsaAcpiDevice On return, point to resource data for next Isa device 152 **/ 153 VOID 154 IsaDeviceLookup ( 155 IN EFI_ISA_ACPI_DEVICE_ID *Device, 156 OUT EFI_ISA_ACPI_RESOURCE_LIST **IsaAcpiDevice, 157 OUT EFI_ISA_ACPI_RESOURCE_LIST **NextIsaAcpiDevice 158 ) 159 { 160 UINTN Index; 161 162 *IsaAcpiDevice = NULL; 163 if (NextIsaAcpiDevice != NULL) { 164 *NextIsaAcpiDevice = NULL; 165 } 166 if (Device == NULL) { 167 Index = 0; 168 } else { 169 for(Index = 0; gPcatIsaAcpiDeviceList[Index].ResourceItem != NULL; Index++) { 170 if (Device->HID == gPcatIsaAcpiDeviceList[Index].Device.HID && 171 Device->UID == gPcatIsaAcpiDeviceList[Index].Device.UID ) { 172 break; 173 } 174 } 175 if (gPcatIsaAcpiDeviceList[Index].ResourceItem == NULL) { 176 return; 177 } 178 *IsaAcpiDevice = &(gPcatIsaAcpiDeviceList[Index]); 179 Index++; 180 } 181 if (gPcatIsaAcpiDeviceList[Index].ResourceItem != NULL && NextIsaAcpiDevice != NULL) { 182 *NextIsaAcpiDevice = &(gPcatIsaAcpiDeviceList[Index]); 183 } 184 } 185 186 /** 187 Enumerate the ISA devices on the ISA bus 188 189 190 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 191 @param Device Point to device ID instance 192 193 @retval EFI_NOT_FOUND Can not found the next Isa device. 194 @retval EFI_SUCESS Success retrieve the next Isa device for enumration. 195 196 **/ 197 EFI_STATUS 198 EFIAPI 199 IsaDeviceEnumerate ( 200 IN EFI_ISA_ACPI_PROTOCOL *This, 201 OUT EFI_ISA_ACPI_DEVICE_ID **Device 202 ) 203 { 204 EFI_ISA_ACPI_RESOURCE_LIST *IsaAcpiDevice; 205 EFI_ISA_ACPI_RESOURCE_LIST *NextIsaAcpiDevice; 206 207 IsaDeviceLookup (*Device, &IsaAcpiDevice, &NextIsaAcpiDevice); 208 if (NextIsaAcpiDevice == NULL) { 209 return EFI_NOT_FOUND; 210 } 211 *Device = &(NextIsaAcpiDevice->Device); 212 return EFI_SUCCESS; 213 } 214 215 /** 216 Set ISA device power 217 218 219 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 220 @param Device Point to device ID instance 221 @param OnOff TRUE for setting isa device power on, 222 FALSE for setting isa device power off 223 224 @return EFI_SUCCESS Sucess to change power status for isa device. 225 **/ 226 EFI_STATUS 227 EFIAPI 228 IsaDeviceSetPower ( 229 IN EFI_ISA_ACPI_PROTOCOL *This, 230 IN EFI_ISA_ACPI_DEVICE_ID *Device, 231 IN BOOLEAN OnOff 232 ) 233 { 234 return EFI_SUCCESS; 235 } 236 237 /** 238 Get current resource for the specific ISA device. 239 240 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 241 @param Device Point to device ID instance 242 @param ResourceList On return, point to resources instances for given isa device 243 244 @retval EFI_NOT_FOUND Can not found the resource instance for given isa device 245 @retval EFI_SUCCESS Success to get resource instance for given isa device. 246 **/ 247 EFI_STATUS 248 EFIAPI 249 IsaGetCurrentResource ( 250 IN EFI_ISA_ACPI_PROTOCOL *This, 251 IN EFI_ISA_ACPI_DEVICE_ID *Device, 252 OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList 253 ) 254 { 255 IsaDeviceLookup (Device, ResourceList, NULL); 256 if (*ResourceList == NULL) { 257 return EFI_NOT_FOUND; 258 } 259 return EFI_SUCCESS; 260 } 261 262 /** 263 Get possible resource for the specific ISA device. 264 265 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 266 @param Device Point to device ID instance 267 @param ResourceList On return, point to resources instances for given isa device 268 269 @retval EFI_SUCCESS Success to get resource instance for given isa device. 270 **/ 271 EFI_STATUS 272 EFIAPI 273 IsaGetPossibleResource ( 274 IN EFI_ISA_ACPI_PROTOCOL *This, 275 IN EFI_ISA_ACPI_DEVICE_ID *Device, 276 OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList 277 ) 278 { 279 return EFI_SUCCESS; 280 } 281 282 /** 283 Set resource for the specific ISA device. 284 285 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 286 @param Device Point to device ID instance 287 @param ResourceList Point to resources instances for given isa device 288 289 @return EFI_SUCESS Success to set resource. 290 291 **/ 292 EFI_STATUS 293 EFIAPI 294 IsaSetResource ( 295 IN EFI_ISA_ACPI_PROTOCOL *This, 296 IN EFI_ISA_ACPI_DEVICE_ID *Device, 297 IN EFI_ISA_ACPI_RESOURCE_LIST *ResourceList 298 ) 299 { 300 return EFI_SUCCESS; 301 } 302 303 /** 304 Enable/Disable the specific ISA device. 305 306 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 307 @param Device Point to device ID instance 308 @param Enable Enable/Disable 309 310 @return EFI_SUCESS Success to enable/disable. 311 312 **/ 313 EFI_STATUS 314 EFIAPI 315 IsaEnableDevice ( 316 IN EFI_ISA_ACPI_PROTOCOL *This, 317 IN EFI_ISA_ACPI_DEVICE_ID *Device, 318 IN BOOLEAN Enable 319 ) 320 { 321 return EFI_SUCCESS; 322 } 323 324 /** 325 Initialize the specific ISA device. 326 327 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 328 @param Device Point to device ID instance 329 330 @return EFI_SUCESS Success to initialize. 331 332 **/ 333 EFI_STATUS 334 EFIAPI 335 IsaInitDevice ( 336 IN EFI_ISA_ACPI_PROTOCOL *This, 337 IN EFI_ISA_ACPI_DEVICE_ID *Device 338 ) 339 { 340 return EFI_SUCCESS; 341 } 342 343 344 /** 345 Initialize the ISA interface. 346 347 @param This Point to instance of EFI_ISA_ACPI_PROTOCOL 348 349 @return EFI_SUCESS Success to initialize ISA interface. 350 351 **/ 352 EFI_STATUS 353 EFIAPI 354 IsaInterfaceInit ( 355 IN EFI_ISA_ACPI_PROTOCOL *This 356 ) 357 { 358 return EFI_SUCCESS; 359 } 360