Home | History | Annotate | Download | only in Wpce791
      1 /** @file
      2 
      3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      9   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     13 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     21 
     23 Module Name:
     24 
     25     LpcIsaAcpi.c
     26 
     27 Abstract: IsaAcpi implementation
     28 
     29 
     30 
     31 --*/
     32 
     33 #include "LpcDriver.h"
     34 
     35 //
     36 // PS/2 Keyboard Controller
     37 //
     38 static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2KeyboardDeviceResources[] = {
     39   {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
     40   {EfiIsaAcpiResourceInterrupt, 0, 1,     0},
     41   {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
     42 };
     43 
     44 //
     45 // PS/2 Mouse Controller
     46 //
     47 static EFI_ISA_ACPI_RESOURCE  mLpcWpce791Ps2MouseDeviceResources[] = {
     48   {EfiIsaAcpiResourceIo,        0, 0x60, 0x64},
     49   {EfiIsaAcpiResourceInterrupt, 0, 12,     0},
     50   {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
     51 };
     52 
     53 //
     54 // COM
     55 //
     56 static EFI_ISA_ACPI_RESOURCE  mLpcWpce791ComDeviceResources[] = {
     57   {EfiIsaAcpiResourceIo,        0, 0x3f8, 0x3ff},
     58   {EfiIsaAcpiResourceInterrupt, 0, 4,     0},
     59   {EfiIsaAcpiResourceEndOfList, 0, 0,     0}
     60 };
     61 
     62 //
     63 // Table of ISA Controllers
     64 //
     65 EFI_ISA_ACPI_RESOURCE_LIST mLpcWpce791DeviceList[] = {
     66   {{EISA_PNP_ID(0x303), 0}, mLpcWpce791Ps2KeyboardDeviceResources }, // PS/2 Keyboard Controller
     67   {{EISA_PNP_ID(0xF03), 0}, mLpcWpce791Ps2MouseDeviceResources	  }, // PS/2 Mouse Controller
     68   {{EISA_PNP_ID(0x501), 0}, mLpcWpce791ComDeviceResources	      }, // COM
     69   {{0,                  0}, NULL                                  }  // End
     70 };
     71 
     72 static ICH_DMA_INIT  mIchDmaInitTable [] = {
     73 //
     74 //Register OFFSET,           Value
     75 //
     76 
     77             0x0D8,           0x000,   // Reset DMA Controller 2
     78             0x0D0,           0x000,   // Enable DMA controller 2
     79             0x00C,           0x000,   // Reset DMA Controller 1
     80             0x008,           0x000,   // Enable DMA controller 1
     81 
     82             //
     83             // Channel 4
     84             //
     85             0x0D6,           0x0c0,   // DMA contr. 2 Cascade mode, addr. increment, disable auto init.
     86             0x0D2,           0x000,   // Clear write request register
     87             0x0d4,           0x000,   // Enable DREQs for channel
     88 
     89             //
     90             // Channel 0
     91             //
     92             0x00B,           0x040,   // DMA contr. 1 single mode, addr. increment, disable auto init.
     93             0x009,           0x000,   // Clear write request register
     94             0x00A,           0x000,   // Enable DREQs for channel
     95 
     96             //
     97             // Channel 1
     98             //
     99             0x00B,           0x041,   // DMA contr. 1 single mode, addr. increment, disable auto init.
    100             0x009,           0x001,   // Clear write request register
    101             0x00A,           0x001,   // Enable DREQs for channel
    102 
    103             //
    104             // Channel 2
    105             //
    106             0x00B,           0x042,   // DMA contr. 1 single mode, addr. increment, disable auto init.
    107             0x009,           0x002,   // Clear write request register
    108             0x00A,           0x002,   // Enable DREQs for channel
    109 
    110             //
    111             // Channel 3
    112             //
    113             0x00B,           0x043,   // DMA contr. 1 single mode, addr. increment, disable auto init.
    114             0x009,           0x003,   // Clear write request register
    115             0x00A,           0x003,   // Enable DREQs for channel
    116 
    117             //
    118             // Channel 5
    119             //
    120             0x0D6,           0x041,   // DMA contr. 2 single mode, addr. increment, disable auto init.
    121             0x0D2,           0x001,   // Clear write request register
    122             0x0D4,           0x001,   // Enable DREQs for channel
    123 
    124             //
    125             // Channel 6
    126             //
    127             0x0D6,           0x042,   // DMA contr. 2 single mode, addr. increment, disable auto init.
    128             0x0D2,           0x002,   // Clear write request register
    129             0x0D4,           0x002,   // Enable DREQs for channel
    130 
    131             //
    132             // Channel 7
    133             //
    134             0x0D6,           0x043,   // DMA contr. 2 single mode, addr. increment, disable auto init.
    135             0x0D2,           0x003,   // Clear write request register
    136             0x0D4,           0x003    // Enable DREQs for channel
    137 
    138 };
    139 
    140 //
    141 // ISA ACPI Protocol Functions
    142 //
    143 /**
    144 
    145   Enumerate the ISA devices on the ISA bus
    146 
    147 **/
    148 VOID
    149 IsaDeviceLookup (
    150   IN  EFI_ISA_ACPI_DEVICE_ID      *Device,
    151   OUT EFI_ISA_ACPI_RESOURCE_LIST  **IsaAcpiDevice,
    152   OUT EFI_ISA_ACPI_RESOURCE_LIST  **NextIsaAcpiDevice
    153   )
    154 {
    155   UINTN  Index;
    156 
    157   *IsaAcpiDevice = NULL;
    158   if (NextIsaAcpiDevice != NULL) {
    159     *NextIsaAcpiDevice = NULL;
    160   }
    161   if (Device == NULL) {
    162     Index = 0;
    163   } else {
    164     for(Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
    165       if (Device->HID == mLpcWpce791DeviceList[Index].Device.HID &&
    166           Device->UID == mLpcWpce791DeviceList[Index].Device.UID    ) {
    167         break;
    168       }
    169     }
    170     if (mLpcWpce791DeviceList[Index].Device.HID == 0) {
    171       return;
    172     }
    173     *IsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
    174     Index++;
    175   }
    176   if (NextIsaAcpiDevice != NULL && mLpcWpce791DeviceList[Index].Device.HID != 0){
    177     *NextIsaAcpiDevice = &(mLpcWpce791DeviceList[Index]);
    178   }
    179 }
    180 
    181 
    182 /**
    183   Enumerate the ISA devices on the ISA bus
    184   It is hard code now and future it will get from ACPI table
    185 
    186 **/
    187 EFI_STATUS
    188 EFIAPI
    189 IsaDeviceEnumerate (
    190   IN     EFI_ISA_ACPI_PROTOCOL       *This,
    191   OUT    EFI_ISA_ACPI_DEVICE_ID      **Device
    192   )
    193 {
    194   EFI_ISA_ACPI_RESOURCE_LIST  *IsaAcpiDevice;
    195   EFI_ISA_ACPI_RESOURCE_LIST  *NextIsaAcpiDevice;
    196 
    197   IsaDeviceLookup (*Device, &IsaAcpiDevice, &NextIsaAcpiDevice);
    198   if (NextIsaAcpiDevice == NULL) {
    199     return EFI_NOT_FOUND;
    200   }
    201   *Device = &(NextIsaAcpiDevice->Device);
    202   return EFI_SUCCESS;
    203 }
    204 
    205 /**
    206   Set ISA device power use sio
    207 
    208 **/
    209 EFI_STATUS
    210 EFIAPI
    211 IsaDeviceSetPower (
    212   IN     EFI_ISA_ACPI_PROTOCOL       *This,
    213   IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
    214   IN     BOOLEAN                     OnOff
    215   )
    216 {
    217   return EFI_UNSUPPORTED;
    218 }
    219 
    220 
    221 /**
    222   Get current Resource of the specific ISA device
    223   It is hardcode now and future will get from ACPI table
    224 
    225 **/
    226 EFI_STATUS
    227 EFIAPI
    228 IsaGetCurrentResource (
    229   IN     EFI_ISA_ACPI_PROTOCOL        *This,
    230   IN     EFI_ISA_ACPI_DEVICE_ID       *Device,
    231   OUT    EFI_ISA_ACPI_RESOURCE_LIST   **ResourceList
    232   )
    233 {
    234   IsaDeviceLookup (Device, ResourceList, NULL);
    235   if (*ResourceList == NULL || (*ResourceList)->ResourceItem == NULL) {
    236     return EFI_NOT_FOUND;
    237   }
    238   return EFI_SUCCESS;
    239 }
    240 
    241 EFI_STATUS
    242 EFIAPI
    243 IsaGetPossibleResource (
    244   IN     EFI_ISA_ACPI_PROTOCOL       *This,
    245   IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
    246   OUT    EFI_ISA_ACPI_RESOURCE_LIST  **ResourceList
    247   )
    248 {
    249   //
    250   // Not supported yet
    251   //
    252   return EFI_UNSUPPORTED;
    253 }
    254 
    255 
    256 EFI_STATUS
    257 EFIAPI
    258 IsaSetResource (
    259   IN     EFI_ISA_ACPI_PROTOCOL       *This,
    260   IN     EFI_ISA_ACPI_DEVICE_ID      *Device,
    261   IN     EFI_ISA_ACPI_RESOURCE_LIST  *ResourceList
    262   )
    263 {
    264   return EFI_UNSUPPORTED;
    265 }
    266 
    267 EFI_STATUS
    268 EFIAPI
    269 IsaEnableDevice (
    270   IN    EFI_ISA_ACPI_PROTOCOL        *This,
    271   IN    EFI_ISA_ACPI_DEVICE_ID       *Device,
    272   IN    BOOLEAN                      Enable
    273   )
    274 {
    275 
    276   return EFI_UNSUPPORTED;
    277 }
    278 
    279 /**
    280 
    281   Clear out Resource List if device is set to disable by platform policy
    282 
    283 **/
    284 VOID
    285 EmptyResourceList (
    286   IN  UINT32      DeviceHid
    287   )
    288 {
    289   UINT8     Index;
    290   for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
    291     if (DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) {
    292       mLpcWpce791DeviceList[Index].ResourceItem = NULL;
    293     }
    294   }
    295   return;
    296 }
    297 
    298 /**
    299 
    300   Clear out Resource List if device is set to disable by platform policy
    301 
    302 **/
    303 VOID
    304 EmptyResourceListHidUid (
    305   IN  UINT32      DeviceHid,
    306   IN  UINT32      DeviceUid
    307   )
    308 {
    309   UINT8     Index;
    310   for (Index = 0; mLpcWpce791DeviceList[Index].Device.HID != 0; Index++) {
    311     if ((DeviceHid == mLpcWpce791DeviceList[Index].Device.HID) &&
    312         (DeviceUid == mLpcWpce791DeviceList[Index].Device.UID)) {
    313       mLpcWpce791DeviceList[Index].ResourceItem = NULL;
    314     }
    315   }
    316   return;
    317 }
    318 
    319 EFI_STATUS
    320 EFIAPI
    321 IsaInitDevice (
    322   IN    EFI_ISA_ACPI_PROTOCOL        *This,
    323   IN    EFI_ISA_ACPI_DEVICE_ID       *Device
    324   )
    325 {
    326   EFI_WPCE791_POLICY_PROTOCOL      *LpcWpce791Policy;
    327   EFI_STATUS                      Status;
    328 
    329   //
    330   // Disable configuration according to platform protocol
    331   //
    332   Status = gBS->LocateProtocol (
    333                   &gEfiLpcWpce791PolicyProtocolGuid,
    334                   NULL,
    335                   (VOID **) &LpcWpce791Policy
    336                   );
    337   if (!EFI_ERROR(Status)) {
    338     if (LpcWpce791Policy->DeviceEnables.Ps2Keyboard == EFI_WPCE791_PS2_KEYBOARD_DISABLE) {
    339       EmptyResourceList(EISA_PNP_ID(0x303));
    340       DisableLogicalDevice (SIO_KEYBOARD);
    341       EmptyResourceList(EISA_PNP_ID(0xF03));
    342       DisableLogicalDevice (SIO_KEYBOARD);
    343     }
    344     if (LpcWpce791Policy->DeviceEnables.Ps2Mouse == EFI_WPCE791_PS2_MOUSE_DISABLE) {
    345       EmptyResourceList(EISA_PNP_ID(0xF03));
    346       DisableLogicalDevice (SIO_MOUSE);
    347     }
    348   }
    349 
    350   return EFI_SUCCESS;
    351 }
    352 
    353 EFI_STATUS
    354 EFIAPI
    355 LpcInterfaceInit (
    356   IN    EFI_ISA_ACPI_PROTOCOL        *This
    357   )
    358 {
    359   EFI_PCI_IO_PROTOCOL             *PciIo;
    360   UINTN                           Index;
    361 
    362   PciIo = (LPC_ISA_ACPI_FROM_THIS (This))->PciIo;
    363 
    364   //
    365   // DMA controller initialize
    366   //
    367   for (Index=0; Index < (sizeof(mIchDmaInitTable)/sizeof(ICH_DMA_INIT)); Index++) {
    368     PciIo->Io.Write (
    369                 PciIo,
    370                 EfiPciIoWidthUint8,
    371                 EFI_PCI_IO_PASS_THROUGH_BAR,
    372                 mIchDmaInitTable[Index].Register,
    373                 1,
    374                 &mIchDmaInitTable[Index].Value
    375                 );
    376   }
    377 
    378   return EFI_SUCCESS;
    379 }
    380 
    381