//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
//  Copyright (C) 2004-2007, Freescale Semiconductor, Inc. All Rights Reserved.
//  THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
//  AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------

#include <bsp.h>

//------------------------------------------------------------------------------
// Local Variables

// TODO:
// UUID could be based on IIM fuse values or memory chip ID.  For now we
// keep it simple and use the MAC.
static UUID gUUID = { ((BSP_ARGS_DEFAULT_MAC_BYTE3 << 24) |  // Data1
                       (BSP_ARGS_DEFAULT_MAC_BYTE2 << 16) |
                       (BSP_ARGS_DEFAULT_MAC_BYTE1 << 8)  |
                       (BSP_ARGS_DEFAULT_MAC_BYTE0)),
                      ((BSP_ARGS_DEFAULT_MAC_BYTE5 << 8)  | // Data2
                       (BSP_ARGS_DEFAULT_MAC_BYTE4)),
                       0,                                   // Data 3
                       0, 0, 0, 0                           // Data 4
                    };


//------------------------------------------------------------------------------
//
//  Function:  OALArgsQuery
//
//  This function is called from other OAL modules to return boot arguments.
//  Boot arguments are typically placed in fixed memory location and they are
//  filled by boot loader. In case that boot arguments can't be located
//  the function should return NULL. The OAL module then must use default
//  values.
//
VOID* OALArgsQuery(UINT32 type)
{
   VOID *pData = NULL;
   BSP_ARGS *pArgs = (BSP_ARGS *)IMAGE_SHARE_ARGS_UA_START;
   
   OALMSG(OAL_ARGS&&OAL_FUNC, (L"+OALArgsQuery(%d)\r\n", type));
   
   // Check if there is expected signature
   if ((pArgs->header.signature  != OAL_ARGS_SIGNATURE) ||
       (pArgs->header.oalVersion != OAL_ARGS_VERSION)   ||
       (pArgs->header.bspVersion != BSP_ARGS_VERSION)) {
      goto cleanUp;
   }
   
   // Depending on required args
   switch (type) {
      case OAL_ARGS_QUERY_DEVID:
         pData = &pArgs->deviceId;
         break;
         
      case OAL_ARGS_QUERY_KITL:
         switch ((UINT32)pArgs->kitl.devLoc.PhysicalLoc) {
            case BSP_BASE_REG_PA_SERIALKITL:
               pArgs->kitl.flags = OAL_KITL_FLAGS_ENABLED|OAL_KITL_FLAGS_POLL;
               pArgs->kitl.baudRate = BSP_UART_KITL_SERIAL_BAUD;
               pArgs->kitl.dataBits = UART_UCR2_WS_8BIT;
               pArgs->kitl.stopBits = UART_UCR2_STPB_1STOP;
               pArgs->kitl.parity = UART_UCR2_PREN_DISBLE;
               pArgs->kitl.devLoc.LogicalLoc  = BSP_BASE_REG_PA_SERIALKITL;
               pArgs->kitl.devLoc.PhysicalLoc = (PVOID)BSP_BASE_REG_PA_SERIALKITL;
               pArgs->kitl.devLoc.BusNumber   = 0;
               pArgs->kitl.devLoc.Pin   = 0;
               pArgs->kitl.devLoc.IfcType = Internal;
               break;
               
            default:
               //pArgs->kitl.flags |= (OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI);
               
               // Has the bootloader provided a non-zero IP address and subnet mask?
               // If not, use DHCP to obtain this information.
               //
               if ((pArgs->kitl.ipAddress == 0) || (pArgs->kitl.ipMask == 0)) {
                  pArgs->kitl.flags |= OAL_KITL_FLAGS_DHCP;
               }
               
               // Has the bootloader provided information about which NIC it was using?
               // If not, choose the CS8900A as the default.
               //
               if (pArgs->kitl.devLoc.LogicalLoc == 0) {
                  pArgs->kitl.devLoc.IfcType     = Internal;
                  pArgs->kitl.devLoc.BusNumber   = 0;
                  pArgs->kitl.devLoc.PhysicalLoc = (PVOID)(BSP_BASE_REG_PA_LAN911x_IOBASE);
                  pArgs->kitl.devLoc.LogicalLoc  = (DWORD)pArgs->kitl.devLoc.PhysicalLoc;
               }
         }
         pData = &pArgs->kitl;
         
         break;
         
      // Check if this is a UUID request
      case OAL_ARGS_QUERY_UUID:
         // Return pointer to global UUID
         pData = &gUUID;
         break;
         
      case OAL_ARGS_QUERY_UPDATEMODE:
         pData = &pArgs->updateMode;
         break;
   }
   
cleanUp:
   OALMSG(OAL_ARGS&&OAL_FUNC, (L"-OALArgsQuery(pData = 0x%08x)\r\n", pData));
   return pData;
}


//------------------------------------------------------------------------------
//
// Function: OALBSPArgsSetup
//
// This function setup global BSP args.
//
// Parameters:
//      PBSP_ARGS pBSPArgs: pointer to the global variable BSPArgs
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void OALBSPArgsSetup(PBSP_ARGS pBSPArgs)
{
#if 0
   if ((pBSPArgs->header.signature  == OAL_ARGS_SIGNATURE) &&
       (pBSPArgs->header.oalVersion == OAL_ARGS_VERSION)   &&
       (pBSPArgs->header.bspVersion == BSP_ARGS_VERSION)) {
      // Signature is valid, just return back
      return;
   }
#endif
   
   pBSPArgs->header.signature  = OAL_ARGS_SIGNATURE;
   pBSPArgs->header.oalVersion = OAL_ARGS_VERSION;
   pBSPArgs->header.bspVersion = BSP_ARGS_VERSION;
   
   // Setup KITL argument
//   memset(&pBSPArgs->kitl, 0, sizeof(pBSPArgs->kitl));
   pBSPArgs->kitl.flags = (OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI | OAL_KITL_FLAGS_DHCP);
   pBSPArgs->kitl.devLoc.IfcType     = Internal;
   pBSPArgs->kitl.devLoc.BusNumber   = 0;
   pBSPArgs->kitl.devLoc.PhysicalLoc = (PVOID)(BSP_BASE_REG_PA_LAN911x_IOBASE);
   pBSPArgs->kitl.devLoc.LogicalLoc  = (DWORD)pBSPArgs->kitl.devLoc.PhysicalLoc;
#if 0
   if ((pBSPArgs->kitl.mac[0] == 0) && (pBSPArgs->kitl.mac[1] == 0) && (pBSPArgs->kitl.mac[2] == 0)) {
      pBSPArgs->kitl.mac[0] = 0x0800;
      pBSPArgs->kitl.mac[1] = 0x01EE;
      pBSPArgs->kitl.mac[2] = 0x8866;
   }
#endif
   
   // Setup Device Name
#if 0
   OALKitlCreateName(BSP_DEVICE_PREFIX, pBSPArgs->kitl.mac, pBSPArgs->deviceId);
#else
   memset(&pBSPArgs->deviceId, 0, sizeof(pBSPArgs->deviceId));
#endif
   
   return;
}

//------------------------------------------------------------------------------
//
// Function: OALBSPArgsEnableKITL
//
// This function enable/disable kitl.
//
// Parameters:
//      PBSP_ARGS pBSPArgs: pointer to the global variable BSPArgs
//      BOOL fEnable: Enable(TRUE)/Disalbe(FALSE) KITL
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void OALBSPArgsEnableKITL(PBSP_ARGS pBSPArgs, BOOL fEnable)
{
   if ((pBSPArgs->header.signature  == OAL_ARGS_SIGNATURE) ||
       (pBSPArgs->header.oalVersion == OAL_ARGS_VERSION)   ||
       (pBSPArgs->header.bspVersion == BSP_ARGS_VERSION)) {
      if (fEnable) {
         pBSPArgs->kitl.flags |=  OAL_KITL_FLAGS_ENABLED;
      }
      else {
         pBSPArgs->kitl.flags &= ~OAL_KITL_FLAGS_ENABLED;
      }
   }
   
   return;
}

//------------------------------------------------------------------------------
//
// Function: OALBSPArgsEnableShareEth
//
// This function enable/disable kitl share ethernet(VMINI).
//
// Parameters:
//      PBSP_ARGS pBSPArgs: pointer to the global variable BSPArgs
//      BOOL fEnable: Enable(TRUE)/Disalbe(FALSE) Share Ethernet (VMINI)
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void OALBSPArgsEnableShareEth(PBSP_ARGS pBSPArgs, BOOL fEnable)
{
   if ((pBSPArgs->header.signature  == OAL_ARGS_SIGNATURE) ||
       (pBSPArgs->header.oalVersion == OAL_ARGS_VERSION)   ||
       (pBSPArgs->header.bspVersion == BSP_ARGS_VERSION)) {
      if (fEnable) {
         pBSPArgs->kitl.flags |=  OAL_KITL_FLAGS_VMINI;
      }
      else {
         pBSPArgs->kitl.flags &= ~OAL_KITL_FLAGS_VMINI;
      }
   }
   
   return;
}

//------------------------------------------------------------------------------
//
// Function: OALBSPArgsSetIPAddress
//
// This function setup static ip or use dhcp.
//
// Parameters:
//      PBSP_ARGS pBSPArgs: pointer to the global variable BSPArgs
//      BOOL fEnable: Enable(TRUE)/Disalbe(FALSE) DHCP
//      DWORD dwIP: static ip address
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void OALBSPArgsSetIPAddress(PBSP_ARGS pBSPArgs, BOOL fIsDHCP, DWORD dwIP)
{
   if ((pBSPArgs->header.signature  == OAL_ARGS_SIGNATURE) ||
       (pBSPArgs->header.oalVersion == OAL_ARGS_VERSION)   ||
       (pBSPArgs->header.bspVersion == BSP_ARGS_VERSION)) {
      if (fIsDHCP) {
         pBSPArgs->kitl.flags |=  OAL_KITL_FLAGS_DHCP;
         pBSPArgs->kitl.ipAddress = 0;
         pBSPArgs->kitl.ipMask = 0;
      }
      else {
         pBSPArgs->kitl.flags &= ~OAL_KITL_FLAGS_DHCP;
         pBSPArgs->kitl.ipAddress = dwIP;
         pBSPArgs->kitl.ipMask = 0x00FFFFFF;   // set mask as 255.255.255.0
      }
   }
   
   return;
}
//------------------------------------------------------------------------------
