uboot/board/Marvell/common/memory.c
<<
>>
Prefs
   1/*
   2 * Copyright - Galileo technology.
   3 *
   4 * See file CREDITS for list of people who contributed to this
   5 * project.
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License as
   9 * published by the Free Software Foundation; either version 2 of
  10 * the License, or (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20 * MA 02111-1307 USA
  21 */
  22
  23/*
  24 *
  25 * written or collected and sometimes rewritten by
  26 * Ingo Assmus <ingo.assmus@keymile.com>
  27 *
  28 */
  29
  30
  31#include <common.h>
  32#include "../include/core.h"
  33#include "../include/memory.h"
  34
  35/*******************************************************************************
  36* memoryGetBankBaseAddress - Returns the base address of a memory bank.
  37* DESCRIPTION:
  38*       This function returns the base address of one of the SDRAMÂ’s memory
  39*       banks. There are 4 memory banks and each one represents one DIMM side.
  40* INPUT:
  41*       MEMORY_BANK bank - Selects one of the four banks as defined in Memory.h.
  42* OUTPUT:
  43*       None.
  44* RETURN:
  45*       32 bit Memory bank base address.
  46*******************************************************************************/
  47static unsigned long memoryGetBankRegOffset (MEMORY_BANK bank)
  48{
  49        switch (bank) {
  50        case BANK0:
  51                return SCS_0_LOW_DECODE_ADDRESS;
  52        case BANK1:
  53                return SCS_1_LOW_DECODE_ADDRESS;
  54        case BANK2:
  55                return SCS_2_LOW_DECODE_ADDRESS;
  56        case BANK3:
  57                return SCS_3_LOW_DECODE_ADDRESS;
  58
  59        }
  60        return SCS_0_LOW_DECODE_ADDRESS;        /* default value */
  61}
  62
  63unsigned int memoryGetBankBaseAddress (MEMORY_BANK bank)
  64{
  65        unsigned int base;
  66        unsigned int regOffset = memoryGetBankRegOffset (bank);
  67
  68        GT_REG_READ (regOffset, &base);
  69        base = base << 16;      /* MV6436x */
  70        return base;
  71}
  72
  73/*******************************************************************************
  74* memoryGetDeviceBaseAddress - Returns the base address of a device.
  75* DESCRIPTION:
  76*       This function returns the base address of a device on the system. There
  77*       are 5 possible devices (0 - 4 and one boot device) as defined in
  78*       gtMemory.h. Each of the device parameters is maped to one of the CS
  79*       (Devices chip selects) base address register.
  80* INPUT:
  81*       device - Selects one of the five devices as defined in Memory.h.
  82* OUTPUT:
  83*       None.
  84* RETURN:
  85*       32 bit Device base address.
  86*
  87*******************************************************************************/
  88static unsigned int memoryGetDeviceRegOffset (DEVICE device)
  89{
  90        switch (device) {
  91        case DEVICE0:
  92                return CS_0_LOW_DECODE_ADDRESS;
  93        case DEVICE1:
  94                return CS_1_LOW_DECODE_ADDRESS;
  95        case DEVICE2:
  96                return CS_2_LOW_DECODE_ADDRESS;
  97        case DEVICE3:
  98                return CS_3_LOW_DECODE_ADDRESS;
  99        case BOOT_DEVICE:
 100                return BOOTCS_LOW_DECODE_ADDRESS;
 101        }
 102        return CS_0_LOW_DECODE_ADDRESS; /* default value */
 103}
 104
 105unsigned int memoryGetDeviceBaseAddress (DEVICE device)
 106{
 107        unsigned int regBase;
 108        unsigned int regOffset = memoryGetDeviceRegOffset (device);
 109
 110        GT_REG_READ (regOffset, &regBase);
 111
 112        regBase = regBase << 16;        /* MV6436x */
 113        return regBase;
 114}
 115
 116/*******************************************************************************
 117* MemoryGetPciBaseAddr - Returns the base address of a PCI window.
 118* DESCRIPTION:
 119*       This function returns the base address of a PCI window. There are 5
 120*       possible PCI windows (memory 0 - 3 and one for I/O) for each PCI
 121*       interface as defined in gtMemory.h, used by the CPU's address decoding
 122*       mechanism.
 123*       New in MV6436x
 124* INPUT:
 125*       pciWindow - Selects one of the PCI windows as defined in Memory.h.
 126* OUTPUT:
 127*       None.
 128* RETURN:
 129*       32 bit PCI window base address.
 130*******************************************************************************/
 131unsigned int MemoryGetPciBaseAddr (PCI_MEM_WINDOW pciWindow)
 132{
 133        unsigned int baseAddrReg, base;
 134
 135        switch (pciWindow) {
 136        case PCI_0_IO:
 137                baseAddrReg = PCI_0I_O_LOW_DECODE_ADDRESS;      /*PCI_0_IO_BASE_ADDR;  */
 138                break;
 139        case PCI_0_MEM0:
 140                baseAddrReg = PCI_0MEMORY0_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY0_BASE_ADDR; */
 141                break;
 142        case PCI_0_MEM1:
 143                baseAddrReg = PCI_0MEMORY1_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY1_BASE_ADDR; */
 144                break;
 145        case PCI_0_MEM2:
 146                baseAddrReg = PCI_0MEMORY2_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY2_BASE_ADDR;  */
 147                break;
 148        case PCI_0_MEM3:
 149                baseAddrReg = PCI_0MEMORY3_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY3_BASE_ADDR;  */
 150                break;
 151#ifdef INCLUDE_PCI_1
 152        case PCI_1_IO:
 153                baseAddrReg = PCI_1I_O_LOW_DECODE_ADDRESS;      /*PCI_1_IO_BASE_ADDR;  */
 154                break;
 155        case PCI_1_MEM0:
 156                baseAddrReg = PCI_1MEMORY0_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY0_BASE_ADDR; */
 157                break;
 158        case PCI_1_MEM1:
 159                baseAddrReg = PCI_1MEMORY1_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY1_BASE_ADDR;  */
 160                break;
 161        case PCI_1_MEM2:
 162                baseAddrReg = PCI_1MEMORY2_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY2_BASE_ADDR;  */
 163                break;
 164        case PCI_1_MEM3:
 165                baseAddrReg = PCI_1MEMORY3_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY3_BASE_ADDR; */
 166                break;
 167#endif /* INCLUDE_PCI_1 */
 168        default:
 169                return 0xffffffff;
 170        }
 171        GT_REG_READ (baseAddrReg, &base);
 172        return (base << 16);
 173}
 174
 175/*******************************************************************************
 176* memoryGetBankSize - Returns the size of a memory bank.
 177* DESCRIPTION:
 178*       This function returns the size of memory bank as described in
 179*       'gtMemoryGetBankBaseAddress' function.
 180* INPUT:
 181*       bank - Selects one of the four banks as defined in Memory.h.
 182* OUTPUT:
 183*       None.
 184* RETURN:
 185*       32 bit size memory bank size or 0 for a closed or non populated bank.
 186*
 187*******************************************************************************/
 188unsigned int memoryGetBankSize (MEMORY_BANK bank)
 189{
 190        unsigned int sizeReg, size;
 191        MEMORY_WINDOW window;
 192
 193        switch (bank) {
 194        case BANK0:
 195                sizeReg = SCS_0_HIGH_DECODE_ADDRESS;    /* CS_0_SIZE; */
 196                window = CS_0_WINDOW;
 197                break;
 198        case BANK1:
 199                sizeReg = SCS_1_HIGH_DECODE_ADDRESS;    /* CS_1_SIZE; */
 200                window = CS_1_WINDOW;
 201                break;
 202        case BANK2:
 203                sizeReg = SCS_2_HIGH_DECODE_ADDRESS;    /* CS_2_SIZE; */
 204                window = CS_2_WINDOW;
 205                break;
 206        case BANK3:
 207                sizeReg = SCS_3_HIGH_DECODE_ADDRESS;    /* CS_3_SIZE; */
 208                window = CS_3_WINDOW;
 209                break;
 210        default:
 211                return 0;
 212                break;
 213        }
 214        /* If the window is closed, a size of 0 is returned */
 215        if (MemoryGetMemWindowStatus (window) != MEM_WINDOW_ENABLED)
 216                return 0;
 217        GT_REG_READ (sizeReg, &size);
 218        size = ((size << 16) | 0xffff) + 1;
 219        return size;
 220}
 221
 222/*******************************************************************************
 223* memoryGetDeviceSize - Returns the size of a device memory space.
 224* DESCRIPTION:
 225*       This function returns the memory space size of a given device.
 226* INPUT:
 227*       device - Selects one of the five devices as defined in Memory.h.
 228* OUTPUT:
 229*       None.
 230* RETURN:
 231*       32 bit size of a device memory space.
 232*******************************************************************************/
 233unsigned int memoryGetDeviceSize (DEVICE device)
 234{
 235        unsigned int sizeReg, size;
 236        MEMORY_WINDOW window;
 237
 238        switch (device) {
 239        case DEVICE0:
 240                sizeReg = CS_0_HIGH_DECODE_ADDRESS;     /*DEV_CS0_SIZE; */
 241                window = DEVCS_0_WINDOW;
 242                break;
 243        case DEVICE1:
 244                sizeReg = CS_1_HIGH_DECODE_ADDRESS;     /*DEV_CS1_SIZE; */
 245                window = DEVCS_1_WINDOW;
 246                break;
 247        case DEVICE2:
 248                sizeReg = CS_2_HIGH_DECODE_ADDRESS;     /*DEV_CS2_SIZE; */
 249                window = DEVCS_2_WINDOW;
 250                break;
 251        case DEVICE3:
 252                sizeReg = CS_3_HIGH_DECODE_ADDRESS;     /*DEV_CS3_SIZE; */
 253                window = DEVCS_3_WINDOW;
 254                break;
 255        case BOOT_DEVICE:
 256                sizeReg = BOOTCS_HIGH_DECODE_ADDRESS;   /*BOOTCS_SIZE; */
 257                window = BOOT_CS_WINDOW;
 258                break;
 259        default:
 260                return 0;
 261                break;
 262        }
 263        /* If the window is closed, a size of 0 is returned */
 264        if (MemoryGetMemWindowStatus (window) != MEM_WINDOW_ENABLED)
 265                return 0;
 266        GT_REG_READ (sizeReg, &size);
 267        size = ((size << 16) | 0xffff) + 1;
 268        return size;
 269}
 270
 271/*******************************************************************************
 272* MemoryGetPciWindowSize - Returns the size of a PCI memory window.
 273* DESCRIPTION:
 274*       This function returns the size of a PCI window.
 275* INPUT:
 276*       pciWindow - Selects one of the PCI memory windows as defined in
 277*       Memory.h.
 278* OUTPUT:
 279*       None.
 280* RETURN:
 281*       32 bit size of a PCI memory window.
 282*******************************************************************************/
 283unsigned int MemoryGetPciWindowSize (PCI_MEM_WINDOW pciWindow)
 284{
 285        unsigned int sizeReg, size;
 286
 287        switch (pciWindow) {
 288        case PCI_0_IO:
 289                sizeReg = PCI_0I_O_HIGH_DECODE_ADDRESS; /*PCI_0_IO_SIZE; */
 290                break;
 291        case PCI_0_MEM0:
 292                sizeReg = PCI_0MEMORY0_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY0_SIZE; */
 293                break;
 294        case PCI_0_MEM1:
 295                sizeReg = PCI_0MEMORY1_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY1_SIZE; */
 296                break;
 297        case PCI_0_MEM2:
 298                sizeReg = PCI_0MEMORY2_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY2_SIZE; */
 299                break;
 300        case PCI_0_MEM3:
 301                sizeReg = PCI_0MEMORY3_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY3_SIZE; */
 302                break;
 303#ifdef INCLUDE_PCI_1
 304        case PCI_1_IO:
 305                sizeReg = PCI_1I_O_HIGH_DECODE_ADDRESS; /*PCI_1_IO_SIZE; */
 306                break;
 307        case PCI_1_MEM0:
 308                sizeReg = PCI_1MEMORY0_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY0_SIZE; */
 309                break;
 310        case PCI_1_MEM1:
 311                sizeReg = PCI_1MEMORY1_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY1_SIZE;  */
 312                break;
 313        case PCI_1_MEM2:
 314                sizeReg = PCI_1MEMORY2_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY2_SIZE;  */
 315                break;
 316        case PCI_1_MEM3:
 317                sizeReg = PCI_1MEMORY3_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY3_SIZE; */
 318                break;
 319#endif /* INCLUDE_PCI_1 */
 320        default:
 321                return 0x0;
 322        }
 323        /* If the memory window is disabled, retrun size = 0 */
 324        if (MemoryGetMemWindowStatus (PCI_0_IO_WINDOW << pciWindow)
 325            == MEM_WINDOW_DISABLED)
 326                return 0;
 327        GT_REG_READ (sizeReg, &size);
 328        size = ((size << 16) | 0xffff) + 1;
 329        return size;
 330}
 331
 332/*******************************************************************************
 333* memoryGetDeviceWidth - Returns the width of a given device.
 334* DESCRIPTION:
 335*       The MV's device interface supports up to 32 Bit wide devices. A device
 336*       can have a  1, 2, 4 or 8 Bytes data width. This function returns the
 337*       width of a device as defined by the user or the operating system.
 338* INPUT:
 339*       device - Selects one of the five devices as defined in Memory.h.
 340* OUTPUT:
 341*       None.
 342* RETURN:
 343*       Device width in Bytes (1,2,4 or 8), 0 if error had occurred.
 344*******************************************************************************/
 345unsigned int memoryGetDeviceWidth (DEVICE device)
 346{
 347        unsigned int width;
 348        unsigned int regValue;
 349
 350        GT_REG_READ (DEVICE_BANK0PARAMETERS + device * 4, &regValue);
 351        width = (regValue & (BIT20 | BIT21)) >> 20;
 352        return (BIT0 << width);
 353}
 354
 355/*******************************************************************************
 356* memoryMapBank - Set new base address and size for one of the memory
 357*                         banks.
 358*
 359* DESCRIPTION:
 360*       The CPU interface address decoding map consists of 21 address windows
 361*       for the different devices (e.g. CS[3:0] ,PCI0 Mem 0/1/2/3...). Each
 362*       window can have a minimum of 1Mbytes of address space, and up to 4Gbyte
 363*       space. Each address window is defined by two registers - base and size.
 364*       The CPU address is compared with the values in the various CPU windows
 365*       until a match is found and the address is than targeted to that window.
 366*       This function sets new base and size for one the memory banks
 367*       (CS0 - CS3). It is the programmer`s responsibility to make sure that
 368*       there are no conflicts with other memory spaces. When two memory spaces
 369*       overlap, the MVÂ’s behavior is not defined .If a bank needs to be closed,
 370*       set the Â’bankLengthÂ’ parameter size to 0x0.
 371*
 372* INPUT:
 373*       bank      - One of the memory banks (CS0-CS3) as defined in gtMemory.h.
 374*       bankBase  - The memory bank base address.
 375*       bankLength  - The memory bank size. This function will decrement the
 376*                   'bankLength' parameter by one and then check if the size is
 377*                   valid. A valid size must be programed from LSB to MSB as
 378*                   sequence of ‘1’s followed by sequence of ‘0’s.
 379*                   To close a memory window simply set the size to 0.
 380*      NOTE!!!
 381*       The size must be in 64Kbyte granularity.
 382*       The base address must be aligned to the size.
 383* OUTPUT:
 384*       None.
 385* RETURN:
 386*       False for invalid size, true otherwise.
 387*
 388* CAUTION: PCI_functions must be implemented later To_do !!!!!!!!!!!!!!!!!
 389*
 390*******************************************************************************/
 391
 392bool memoryMapBank (MEMORY_BANK bank, unsigned int bankBase,
 393                    unsigned int bankLength)
 394{
 395        unsigned int newBase, newSize, baseReg, sizeReg, temp, rShift;
 396
 397/*    PCI_INTERNAL_BAR pciBAR; */
 398
 399        switch (bank) {
 400        case BANK0:
 401                baseReg = SCS_0_LOW_DECODE_ADDRESS;     /*CS_0_BASE_ADDR; */
 402                sizeReg = SCS_0_HIGH_DECODE_ADDRESS;    /*CS_0_SIZE; */
 403/*        pciBAR = PCI_CS0_BAR; */
 404                break;
 405        case BANK1:
 406                baseReg = SCS_1_LOW_DECODE_ADDRESS;     /*CS_1_BASE_ADDR; */
 407                sizeReg = SCS_1_HIGH_DECODE_ADDRESS;    /*CS_1_SIZE; */
 408                /*        pciBAR = SCS_0_HIGH_DECODE_ADDRESS; */ /*PCI_CS1_BAR; */
 409                break;
 410        case BANK2:
 411                baseReg = SCS_2_LOW_DECODE_ADDRESS;     /*CS_2_BASE_ADDR; */
 412                sizeReg = SCS_2_HIGH_DECODE_ADDRESS;    /*CS_2_SIZE; */
 413/*        pciBAR = PCI_CS2_BAR;*/
 414                break;
 415        case BANK3:
 416                baseReg = SCS_3_LOW_DECODE_ADDRESS;     /*CS_3_BASE_ADDR; */
 417                sizeReg = SCS_3_HIGH_DECODE_ADDRESS;    /*CS_3_SIZE; */
 418/*        pciBAR = PCI_CS3_BAR; */
 419                break;
 420        default:
 421                return false;
 422        }
 423        /* If the size is 0, the window will be disabled */
 424        if (bankLength == 0) {
 425                MemoryDisableWindow (CS_0_WINDOW << bank);
 426                /* Disable the BAR from the PCI slave side */
 427/*        gtPci0DisableInternalBAR(pciBAR); */
 428/*        gtPci1DisableInternalBAR(pciBAR); */
 429                return true;
 430        }
 431        /* The base address must be aligned to the size */
 432        if ((bankBase % bankLength) != 0) {
 433                return false;
 434        }
 435        if (bankLength >= MINIMUM_MEM_BANK_SIZE) {
 436                newBase = bankBase >> 16;
 437                newSize = bankLength >> 16;
 438                /* Checking that the size is a sequence of '1' followed by a
 439                   sequence of '0' starting from LSB to MSB. */
 440                temp = newSize - 1;
 441                for (rShift = 0; rShift < 16; rShift++) {
 442                        temp = temp >> rShift;
 443                        if ((temp & 0x1) == 0) {        /* Either we got to the last '1' */
 444                                                        /* or the size is not valid      */
 445                                if (temp > 0x0)
 446                                        return false;
 447                                else
 448                                        break;
 449                        }
 450                }
 451#ifdef DEBUG
 452                {
 453                        unsigned int oldBase, oldSize;
 454
 455                        GT_REG_READ (baseReg, &oldBase);
 456                        GT_REG_READ (sizeReg + 8, &oldSize);
 457
 458                        printf ("b%d Base:%x Size:%x -> Base:%x Size:%x\n",
 459                                bank, oldBase, oldSize, newBase, newSize);
 460                }
 461#endif
 462                /* writing the new values */
 463                GT_REG_WRITE (baseReg, newBase);
 464                GT_REG_WRITE (sizeReg, newSize - 1);
 465                /* Enable back the window */
 466                MemoryEnableWindow (CS_0_WINDOW << bank);
 467                /* Enable the BAR from the PCI slave side */
 468/*        gtPci0EnableInternalBAR(pciBAR); */
 469/*        gtPci1EnableInternalBAR(pciBAR); */
 470                return true;
 471        }
 472        return false;
 473}
 474
 475
 476/*******************************************************************************
 477* memoryMapDeviceSpace - Set new base address and size for one of the device
 478*                           windows.
 479*
 480* DESCRIPTION:
 481*       The CPU interface address decoding map consists of 21 address windows
 482*       for the different devices (e.g. CS[3:0] ,PCI0 Mem 0/1/2/3...). Each
 483*       window can have a minimum of 1Mbytes of address space, and up to 4Gbyte
 484*       space. Each address window is defined by two registers - base and size.
 485*       The CPU address is compared with the values in the various CPU windows
 486*       until a match is found and the address is than targeted to that window.
 487*       This function sets new base and size for one the device windows
 488*       (DEV_CS0 - DEV_CS3). It is the programmer`s responsibility to make sure
 489*       that there are no conflicts with other memory spaces. When two memory
 490*       spaces overlap, the MVÂ’s behavior is not defined .If a device window
 491*       needs to be closed, set the 'deviceLength' parameter size to 0x0.
 492*
 493* INPUT:
 494*       device           - One of the device windows (DEV_CS0-DEV_CS3) as
 495*                          defined in gtMemory.h.
 496*       deviceBase - The device window base address.
 497*       deviceLength - The device window size. This function will decrement
 498*                          the 'deviceLength' parameter by one and then
 499*                          check if the size is valid. A valid size must be
 500*                          programed from LSB to MSB as sequence of ‘1’s
 501*                          followed by sequence of ‘0’s.
 502*                          To close a memory window simply set the size to 0.
 503*
 504*      NOTE!!!
 505*       The size must be in 64Kbyte granularity.
 506*       The base address must be aligned to the size.
 507*
 508* OUTPUT:
 509*       None.
 510*
 511* RETURN:
 512*       False for invalid size, true otherwise.
 513*
 514* CAUTION: PCI_functions must be implemented later To_do !!!!!!!!!!!!!!!!!
 515*
 516*******************************************************************************/
 517
 518bool memoryMapDeviceSpace (DEVICE device, unsigned int deviceBase,
 519                           unsigned int deviceLength)
 520{
 521        unsigned int newBase, newSize, baseReg, sizeReg, temp, rShift;
 522
 523/*    PCI_INTERNAL_BAR pciBAR;*/
 524
 525        switch (device) {
 526        case DEVICE0:
 527                baseReg = CS_0_LOW_DECODE_ADDRESS;      /*DEV_CS0_BASE_ADDR; */
 528                sizeReg = CS_0_HIGH_DECODE_ADDRESS;     /*DEV_CS0_SIZE; */
 529/*        pciBAR = PCI_DEV_CS0_BAR; */
 530                break;
 531        case DEVICE1:
 532                baseReg = CS_1_LOW_DECODE_ADDRESS;      /*DEV_CS1_BASE_ADDR; */
 533                sizeReg = CS_1_HIGH_DECODE_ADDRESS;     /*DEV_CS1_SIZE; */
 534/*        pciBAR = PCI_DEV_CS1_BAR; */
 535                break;
 536        case DEVICE2:
 537                baseReg = CS_2_LOW_DECODE_ADDRESS;      /*DEV_CS2_BASE_ADDR; */
 538                sizeReg = CS_2_HIGH_DECODE_ADDRESS;     /*DEV_CS2_SIZE; */
 539/*        pciBAR = PCI_DEV_CS2_BAR; */
 540                break;
 541        case DEVICE3:
 542                baseReg = CS_3_LOW_DECODE_ADDRESS;      /*DEV_CS3_BASE_ADDR; */
 543                sizeReg = CS_3_HIGH_DECODE_ADDRESS;     /*DEV_CS3_SIZE; */
 544/*        pciBAR = PCI_DEV_CS3_BAR; */
 545                break;
 546        case BOOT_DEVICE:
 547                baseReg = BOOTCS_LOW_DECODE_ADDRESS;    /*BOOTCS_BASE_ADDR; */
 548                sizeReg = BOOTCS_HIGH_DECODE_ADDRESS;   /*BOOTCS_SIZE; */
 549/*        pciBAR = PCI_BOOT_CS_BAR; */
 550                break;
 551        default:
 552                return false;
 553        }
 554        if (deviceLength == 0) {
 555                MemoryDisableWindow (DEVCS_0_WINDOW << device);
 556                /* Disable the BAR from the PCI slave side */
 557/*        gtPci0DisableInternalBAR(pciBAR); */
 558/*        gtPci1DisableInternalBAR(pciBAR); */
 559                return true;
 560        }
 561        /* The base address must be aligned to the size */
 562        if ((deviceBase % deviceLength) != 0) {
 563                return false;
 564        }
 565        if (deviceLength >= MINIMUM_DEVICE_WINDOW_SIZE) {
 566                newBase = deviceBase >> 16;
 567                newSize = deviceLength >> 16;
 568                /* Checking that the size is a sequence of '1' followed by a
 569                   sequence of '0' starting from LSB to MSB. */
 570                temp = newSize - 1;
 571                for (rShift = 0; rShift < 16; rShift++) {
 572                        temp = temp >> rShift;
 573                        if ((temp & 0x1) == 0) {        /* Either we got to the last '1' */
 574                                                        /* or the size is not valid       */
 575                                if (temp > 0x0)
 576                                        return false;
 577                                else
 578                                        break;
 579                        }
 580                }
 581                /* writing the new values */
 582                GT_REG_WRITE (baseReg, newBase);
 583                GT_REG_WRITE (sizeReg, newSize - 1);
 584                MemoryEnableWindow (DEVCS_0_WINDOW << device);
 585                /* Enable the BAR from the PCI slave side */
 586/*        gtPci0EnableInternalBAR(pciBAR); */
 587/*        gtPci1EnableInternalBAR(pciBAR); */
 588                return true;
 589        }
 590        return false;
 591}
 592
 593/*******************************************************************************
 594* MemorySetPciWindow - Set new base address and size for one of the PCI
 595*                        windows.
 596*
 597* DESCRIPTION:
 598*       The CPU interface address decoding map consists of 21 address windows
 599*       for the different devices (e.g. CS[3:0] ,PCI0 Mem 0/1/2/3...). Each
 600*       window can have a minimum of 1Mbytes of address space, and up to 4Gbyte
 601*       space. Each address window is defined by two registers - base and size.
 602*       The CPU address is compared with the values in the various CPU windows
 603*       until a match is found and the address is than targeted to that window.
 604*       This function sets new base and size for one the PCI windows
 605*       (PCI memory0/1/2..). It is the programmer`s responsibility to make sure
 606*       that there are no conflicts with other memory spaces. When two memory
 607*       spaces overlap, the MVÂ’s behavior is not defined .If a PCI window
 608*       needs to be closed, set the 'pciWindowSize' parameter size to 0x0.
 609*
 610* INPUT:
 611*       pciWindow     - One of the PCI windows as defined in gtMemory.h.
 612*       pciWindowBase - The PCI window base address.
 613*       pciWindowSize - The PCI window size. This function will decrement the
 614*                       'pciWindowSize' parameter by one and then check if the
 615*                       size is valid. A valid size must be programed from LSB
 616*                       to MSB as sequence of ‘1’s followed by sequence of ‘0’s.
 617*                       To close a memory window simply set the size to 0.
 618*
 619*      NOTE!!!
 620*       The size must be in 64Kbyte granularity.
 621*       The base address must be aligned to the size.
 622*
 623* OUTPUT:
 624*       None.
 625*
 626* RETURN:
 627*       False for invalid size, true otherwise.
 628*
 629*******************************************************************************/
 630bool memorySetPciWindow (PCI_MEM_WINDOW pciWindow, unsigned int pciWindowBase,
 631                         unsigned int pciWindowSize)
 632{
 633        unsigned int currentLow, baseAddrReg, sizeReg, temp, rShift;
 634
 635        switch (pciWindow) {
 636        case PCI_0_IO:
 637                baseAddrReg = PCI_1I_O_LOW_DECODE_ADDRESS;      /*PCI_0_IO_BASE_ADDR; */
 638                sizeReg = PCI_0I_O_HIGH_DECODE_ADDRESS; /*PCI_0_IO_SIZE; */
 639                break;
 640        case PCI_0_MEM0:
 641                baseAddrReg = PCI_0MEMORY0_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY0_BASE_ADDR; */
 642                sizeReg = PCI_0MEMORY0_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY0_SIZE; */
 643                break;
 644        case PCI_0_MEM1:
 645                baseAddrReg = PCI_0MEMORY1_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY1_BASE_ADDR; */
 646                sizeReg = PCI_0MEMORY1_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY1_SIZE; */
 647                break;
 648        case PCI_0_MEM2:
 649                baseAddrReg = PCI_0MEMORY2_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY2_BASE_ADDR; */
 650                sizeReg = PCI_0MEMORY2_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY2_SIZE; */
 651                break;
 652        case PCI_0_MEM3:
 653                baseAddrReg = PCI_0MEMORY3_LOW_DECODE_ADDRESS;  /*PCI_0_MEMORY3_BASE_ADDR; */
 654                sizeReg = PCI_0MEMORY3_HIGH_DECODE_ADDRESS;     /*PCI_0_MEMORY3_SIZE; */
 655                break;
 656#ifdef INCLUDE_PCI_1
 657        case PCI_1_IO:
 658                baseAddrReg = PCI_1I_O_LOW_DECODE_ADDRESS;      /*PCI_1_IO_BASE_ADDR; */
 659                sizeReg = PCI_1I_O_HIGH_DECODE_ADDRESS; /*PCI_1_IO_SIZE; */
 660                break;
 661        case PCI_1_MEM0:
 662                baseAddrReg = PCI_1MEMORY0_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY0_BASE_ADDR; */
 663                sizeReg = PCI_1MEMORY0_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY0_SIZE; */
 664                break;
 665        case PCI_1_MEM1:
 666                baseAddrReg = PCI_1MEMORY1_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY1_BASE_ADDR;  */
 667                sizeReg = PCI_1MEMORY1_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY1_SIZE; */
 668                break;
 669        case PCI_1_MEM2:
 670                baseAddrReg = PCI_1MEMORY2_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY2_BASE_ADDR;  */
 671                sizeReg = PCI_1MEMORY2_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY2_SIZE; */
 672                break;
 673        case PCI_1_MEM3:
 674                baseAddrReg = PCI_1MEMORY3_LOW_DECODE_ADDRESS;  /*PCI_1_MEMORY3_BASE_ADDR; */
 675                sizeReg = PCI_1MEMORY3_HIGH_DECODE_ADDRESS;     /*PCI_1_MEMORY3_SIZE; */
 676                break;
 677#endif /* INCLUDE_PCI_1 */
 678        default:
 679                return false;
 680        }
 681        if (pciWindowSize == 0) {
 682                MemoryDisableWindow (PCI_0_IO_WINDOW << pciWindow);
 683                return true;
 684        }
 685        /* The base address must be aligned to the size */
 686        if ((pciWindowBase % pciWindowSize) != 0) {
 687                return false;
 688        }
 689        if (pciWindowSize >= MINIMUM_PCI_WINDOW_SIZE) {
 690                pciWindowBase >>= 16;
 691                pciWindowSize >>= 16;
 692                /* Checking that the size is a sequence of '1' followed by a
 693                   sequence of '0' starting from LSB to MSB. */
 694                temp = pciWindowSize - 1;
 695                for (rShift = 0; rShift < 16; rShift++) {
 696                        temp = temp >> rShift;
 697                        if ((temp & 0x1) == 0) {        /* Either we got to the last '1' */
 698                                                        /* or the size is not valid       */
 699                                if (temp > 0x0)
 700                                        return false;
 701                                else
 702                                        break;
 703                        }
 704                }
 705                GT_REG_WRITE (sizeReg, pciWindowSize - 1);
 706                GT_REG_READ (baseAddrReg, &currentLow);
 707                pciWindowBase =
 708                        (pciWindowBase & 0xfffff) | (currentLow & 0xfff00000);
 709                GT_REG_WRITE (baseAddrReg, pciWindowBase);
 710                MemoryEnableWindow (PCI_0_IO_WINDOW << pciWindow);
 711                return true;
 712        }
 713        return false;
 714}
 715
 716/*******************************************************************************
 717* memoryMapInternalRegistersSpace - Sets new base address for the internal
 718*                                  registers memory space.
 719*
 720* DESCRIPTION:
 721*       This function set new base address for the internal registerÂ’s memory
 722*       space (the size is fixed and cannot be modified). The function does not
 723*       handle overlapping with other memory spaces, it is the programer's
 724*       responsibility to ensure that overlapping does not occur.
 725*       When two memory spaces overlap, the MVÂ’s behavior is not defined.
 726*
 727* INPUT:
 728*       internalRegBase - new base address for the internal registerÂ’s memory
 729*                         space.
 730*
 731* OUTPUT:
 732*       None.
 733*
 734* RETURN:
 735*        true on success, false on failure
 736*
 737*******************************************************************************/
 738/********************************************************************
 739* memoryMapInternalRegistersSpace - Sets new base address for the internals
 740*                                   registers.
 741*
 742* INPUTS:  unsigned int internalRegBase - The new base address.
 743* RETURNS: true on success, false on failure
 744*********************************************************************/
 745bool memoryMapInternalRegistersSpace (unsigned int internalRegBase)
 746{
 747        unsigned int currentValue;
 748        unsigned int internalValue = internalRegBase;
 749
 750        internalRegBase = (internalRegBase >> 16);
 751        GT_REG_READ (INTERNAL_SPACE_DECODE, &currentValue);
 752        internalRegBase = (currentValue & 0xff000000) | internalRegBase;
 753        GT_REG_WRITE (INTERNAL_SPACE_DECODE, internalRegBase);
 754        /* initializing also the global variable 'internalRegBaseAddr' */
 755/*    gtInternalRegBaseAddr = internalValue; */
 756        INTERNAL_REG_BASE_ADDR = internalValue;
 757        return true;
 758}
 759
 760/*******************************************************************************
 761* memoryGetInternalRegistersSpace - Returns the internal registers Base
 762*                                     address.
 763*
 764* DESCRIPTION:
 765*       This function returns the base address of  the internal registerÂ’s
 766*       memory space .
 767*
 768* INPUT:
 769*       None.
 770*
 771* OUTPUT:
 772*       None.
 773*
 774* RETURN:
 775*       32 bit base address of the internal registerÂ’s memory space.
 776*
 777*******************************************************************************/
 778unsigned int memoryGetInternalRegistersSpace (void)
 779{
 780        unsigned int currentValue = 0;
 781
 782        GT_REG_READ (INTERNAL_SPACE_DECODE, &currentValue);
 783        return ((currentValue & 0x000fffff) << 16);
 784}
 785
 786/*******************************************************************************
 787* gtMemoryGetInternalSramBaseAddr - Returns the integrated SRAM base address.
 788*
 789* DESCRIPTION:
 790*       The Atlantis incorporate integrated 2Mbit SRAM for general use. This
 791*       funcnion return the SRAM's base address.
 792* INPUT:
 793*       None.
 794* OUTPUT:
 795*       None.
 796* RETURN:
 797*       32 bit SRAM's base address.
 798*
 799*******************************************************************************/
 800unsigned int memoryGetInternalSramBaseAddr (void)
 801{
 802        return ((GTREGREAD (INTEGRATED_SRAM_BASE_ADDR) & 0xfffff) << 16);
 803}
 804
 805/*******************************************************************************
 806* gtMemorySetInternalSramBaseAddr - Set the integrated SRAM base address.
 807*
 808* DESCRIPTION:
 809*       The Atlantis incorporate integrated 2Mbit SRAM for general use. This
 810*       function sets a new base address to the SRAM .
 811* INPUT:
 812*       sramBaseAddress - The SRAM's base address.
 813* OUTPUT:
 814*       None.
 815* RETURN:
 816*       None.
 817*
 818*******************************************************************************/
 819void gtMemorySetInternalSramBaseAddr (unsigned int sramBaseAddress)
 820{
 821        GT_REG_WRITE (INTEGRATED_SRAM_BASE_ADDR, sramBaseAddress >> 16);
 822}
 823
 824/*******************************************************************************
 825* memorySetProtectRegion - Set protection mode for one of the 8 regions.
 826*
 827* DESCRIPTION:
 828*       The CPU interface supports configurable access protection. This includes
 829*       up to eight address ranges defined to a different protection type :
 830*       whether the address range is cacheable or not, whether it is writable or
 831*       not , and whether it is accessible or not. A Low and High registers
 832*       define each window while the minimum address range of each window is
 833*       1Mbyte. An address driven by the CPU, in addition to the address
 834*       decoding and remapping process, is compared against the eight Access
 835*       Protection Low/High registers , if an address matches one of the windows
 836*       , the MV device checks the transaction type against the protection bits
 837*       defined in CPU Access Protection register, to determine if the access is
 838*       allowed. This function set a protection mode to one of the 8 possible
 839*       regions.
 840*      NOTE:
 841*       The CPU address windows are restricted to a size of  2 power n and the
 842*       start address must be aligned to the window size. For example, if using
 843*       a 16 MB window, the start address bits [23:0] must be 0.The MV's
 844*       internal registers space is not protected, even if the access protection
 845*       windows contain this space.
 846*
 847* INPUT:
 848*       region - selects which region to be configured. The values defined in
 849*                gtMemory.h:
 850*
 851*                 - MEM_REGION0
 852*                 - MEM_REGION1
 853*                 - etc.
 854*
 855*       memAccess - Allows or forbids access (read or write ) to the region. The
 856*                   values defined in gtMemory.h:
 857*
 858*                    - MEM_ACCESS_ALLOWED
 859*                    - MEM_ACCESS_FORBIDEN
 860*
 861*       memWrite - CPU write protection to the region. The values defined in
 862*                  gtMemory.h:
 863*
 864*                   - MEM_WRITE_ALLOWED
 865*                   - MEM_WRITE_FORBIDEN
 866*
 867*       cacheProtection - Defines whether caching the region is allowed or not.
 868*                         The values defined in gtMemory.h:
 869*
 870*                          - MEM_CACHE_ALLOWED
 871*                          - MEM_CACHE_FORBIDEN
 872*
 873*       baseAddress - the region's base Address.
 874*       regionSize  - The region's size. This function will decrement the
 875*                     'regionSize' parameter by one and then check if the size
 876*                     is valid. A valid size must be programed from LSB to MSB
 877*                     as sequence of ‘1’s followed by sequence of ‘0’s.
 878*                     To close a memory window simply set the size to 0.
 879*
 880*      NOTE!!!
 881*       The size must be in 64Kbyte granularity.
 882*       The base address must be aligned to the size.
 883*
 884* OUTPUT:
 885*       None.
 886*
 887* RETURN:
 888*       False for invalid size, true otherwise.
 889*
 890*******************************************************************************/
 891bool memorySetProtectRegion (MEMORY_PROTECT_WINDOW window,
 892                             MEMORY_ACCESS memAccess,
 893                             MEMORY_ACCESS_WRITE memWrite,
 894                             MEMORY_CACHE_PROTECT cacheProtection,
 895                             unsigned int baseAddress, unsigned int size)
 896{
 897        unsigned int dataForReg, temp, rShift;
 898
 899        if (size == 0) {
 900                GT_REG_WRITE ((CPU_PROTECT_WINDOW_0_SIZE + 0x10 * window),
 901                              0x0);
 902                return true;
 903        }
 904        /* The base address must be aligned to the size.  */
 905        if (baseAddress % size != 0) {
 906                return false;
 907        }
 908        if (size >= MINIMUM_ACCESS_WIN_SIZE) {
 909                baseAddress = ((baseAddress >> 16) & 0xfffff);
 910                dataForReg = baseAddress | ((memAccess << 20) & BIT20) |
 911                        ((memWrite << 21) & BIT21) | ((cacheProtection << 22)
 912                                                      & BIT22) | BIT31;
 913                GT_REG_WRITE (CPU_PROTECT_WINDOW_0_BASE_ADDR + 0x10 * window,
 914                              dataForReg);
 915                size >>= 16;
 916                /* Checking that the size is a sequence of '1' followed by a
 917                   sequence of '0' starting from LSB to MSB. */
 918                temp = size - 1;
 919                for (rShift = 0; rShift < 16; rShift++) {
 920                        temp = temp >> rShift;
 921                        if ((temp & 0x1) == 0) {        /* Either we got to the last '1' */
 922                                                        /* or the size is not valid       */
 923                                if (temp > 0x0)
 924                                        return false;
 925                                else
 926                                        break;
 927                        }
 928                }
 929                GT_REG_WRITE ((CPU_PROTECT_WINDOW_0_SIZE + 0x10 * window),
 930                              size - 1);
 931                return true;
 932        }
 933        return false;
 934}
 935
 936/*******************************************************************************
 937* gtMemoryDisableProtectRegion - Disable a protected window.
 938*
 939* DESCRIPTION:
 940*       This function disable a protected window set by
 941*       'gtMemorySetProtectRegion' function.
 942*
 943* INPUT:
 944*       window - one of the 4 windows ( defined in gtMemory.h ).
 945*
 946* OUTPUT:
 947*       None.
 948*
 949* RETURN:
 950*       None.
 951*
 952*******************************************************************************/
 953void memoryDisableProtectRegion (MEMORY_PROTECT_WINDOW window)
 954{
 955        RESET_REG_BITS (((CPU_PROTECT_WINDOW_0_BASE_ADDR) + (0x10 * window)),
 956                        BIT31);
 957}
 958
 959/*******************************************************************************
 960* memorySetPciRemapValue - Set a remap value to a PCI memory space target.
 961*
 962* DESCRIPTION:
 963*       In addition to the address decoding mechanism, the CPU has an address
 964*       remapping mechanism to be used by every PCI decoding window. Each PCI
 965*       window can be remaped to a desired address target according to the remap
 966*       value within the remap register. The address remapping is useful when a
 967*       CPU address range must be reallocated to a different location on the
 968*       PCI bus. Also, it enables CPU access to a PCI agent located above the
 969*       4Gbyte space. On system boot, each of the PCI memory spaces is maped to
 970*       a defualt value (see CPU interface section in the MV spec for the
 971*       default values). The remap mechanism does not always produce the desired
 972*       address on the PCI bus because of the remap mechanism way of working
 973*       (to fully understand why, please see the 'Address Remapping' section in
 974*       the MV's spec). Therefor, this function sets a desired remap value to
 975*       one of the PCI memory windows and return the effective address that
 976*       should be used when exiting the PCI memory window. You should ALWAYS use
 977*       the returned value by this function when remapping a PCI window and
 978*       exiting it. If for example the base address of PCI0 memory 0 is
 979*       0x90000000, the size is 0x03ffffff and the remap value is 0x11000000,
 980*       the function will return the value of 0x91000000 that MUST
 981*       be used to exit this memory window in order to achive the deisred
 982*       remapping.
 983*
 984* INPUT:
 985*       memoryWindow   - One of the PCI memory windows as defined in Memory.h
 986*       remapValueLow  - The low remap value.
 987*       remapValueHigh - The high remap value.
 988* OUTPUT:
 989*       None.
 990*
 991* RETURN:
 992*       The effective base address to exit the PCI, or 0xffffffff if one of the
 993*       parameters is erroneous or the effective base address is higher the top
 994*       decode value.
 995*
 996*******************************************************************************/
 997unsigned int memorySetPciRemapValue (PCI_MEM_WINDOW memoryWindow,
 998                                     unsigned int remapValueHigh,
 999                                     unsigned int remapValueLow)
1000{
1001        unsigned int pciMemWindowBaseAddrReg = 0, baseAddrValue = 0;
1002        unsigned int pciMemWindowSizeReg = 0, windowSizeValue = 0;
1003        unsigned int effectiveBaseAddress, remapRegLow, remapRegHigh;
1004
1005        /* Initializing the base and size variables of the PCI
1006           memory windows */
1007        switch (memoryWindow) {
1008        case PCI_0_IO:
1009                pciMemWindowBaseAddrReg = PCI_0_IO_BASE_ADDR;
1010                pciMemWindowSizeReg = PCI_0_IO_SIZE;
1011                remapRegLow = PCI_0_IO_ADDR_REMAP;
1012                remapRegHigh = PCI_0_IO_ADDR_REMAP;
1013                break;
1014        case PCI_0_MEM0:
1015                pciMemWindowBaseAddrReg = PCI_0_MEMORY0_BASE_ADDR;
1016                pciMemWindowSizeReg = PCI_0_MEMORY0_SIZE;
1017                remapRegLow = PCI_0_MEMORY0_LOW_ADDR_REMAP;
1018                remapRegHigh = PCI_0_MEMORY0_HIGH_ADDR_REMAP;
1019                break;
1020        case PCI_0_MEM1:
1021                pciMemWindowBaseAddrReg = PCI_0_MEMORY1_BASE_ADDR;
1022                pciMemWindowSizeReg = PCI_0_MEMORY1_SIZE;
1023                remapRegLow = PCI_0_MEMORY1_LOW_ADDR_REMAP;
1024                remapRegHigh = PCI_0_MEMORY1_HIGH_ADDR_REMAP;
1025                break;
1026        case PCI_0_MEM2:
1027                pciMemWindowBaseAddrReg = PCI_0_MEMORY2_BASE_ADDR;
1028                pciMemWindowSizeReg = PCI_0_MEMORY2_SIZE;
1029                remapRegLow = PCI_0_MEMORY2_LOW_ADDR_REMAP;
1030                remapRegHigh = PCI_0_MEMORY2_HIGH_ADDR_REMAP;
1031                break;
1032        case PCI_0_MEM3:
1033                pciMemWindowBaseAddrReg = PCI_0_MEMORY3_BASE_ADDR;
1034                pciMemWindowSizeReg = PCI_0_MEMORY3_SIZE;
1035                remapRegLow = PCI_0_MEMORY3_LOW_ADDR_REMAP;
1036                remapRegHigh = PCI_0_MEMORY3_HIGH_ADDR_REMAP;
1037                break;
1038#ifdef INCLUDE_PCI_1
1039        case PCI_1_IO:
1040                pciMemWindowBaseAddrReg = PCI_1_IO_BASE_ADDR;
1041                pciMemWindowSizeReg = PCI_1_IO_SIZE;
1042                remapRegLow = PCI_1_IO_ADDR_REMAP;
1043                remapRegHigh = PCI_1_IO_ADDR_REMAP;
1044                break;
1045        case PCI_1_MEM0:
1046                pciMemWindowBaseAddrReg = PCI_1_MEMORY0_BASE_ADDR;
1047                pciMemWindowSizeReg = PCI_1_MEMORY0_SIZE;
1048                remapRegLow = PCI_1_MEMORY0_LOW_ADDR_REMAP;
1049                remapRegHigh = PCI_1_MEMORY0_HIGH_ADDR_REMAP;
1050                break;
1051        case PCI_1_MEM1:
1052                pciMemWindowBaseAddrReg = PCI_1_MEMORY1_BASE_ADDR;
1053                pciMemWindowSizeReg = PCI_1_MEMORY1_SIZE;
1054                remapRegLow = PCI_1_MEMORY1_LOW_ADDR_REMAP;
1055                remapRegHigh = PCI_1_MEMORY1_HIGH_ADDR_REMAP;
1056                break;
1057        case PCI_1_MEM2:
1058                pciMemWindowBaseAddrReg = PCI_1_MEMORY1_BASE_ADDR;
1059                pciMemWindowSizeReg = PCI_1_MEMORY1_SIZE;
1060                remapRegLow = PCI_1_MEMORY1_LOW_ADDR_REMAP;
1061                remapRegHigh = PCI_1_MEMORY1_HIGH_ADDR_REMAP;
1062                break;
1063        case PCI_1_MEM3:
1064                pciMemWindowBaseAddrReg = PCI_1_MEMORY3_BASE_ADDR;
1065                pciMemWindowSizeReg = PCI_1_MEMORY3_SIZE;
1066                remapRegLow = PCI_1_MEMORY3_LOW_ADDR_REMAP;
1067                remapRegHigh = PCI_1_MEMORY3_HIGH_ADDR_REMAP;
1068                break;
1069#endif /* INCLUDE_PCI_1 */
1070        default:
1071                /* Retrun an invalid effective base address */
1072                return 0xffffffff;
1073        }
1074        /* Writing the remap value to the remap regisers */
1075        GT_REG_WRITE (remapRegHigh, remapValueHigh);
1076        GT_REG_WRITE (remapRegLow, remapValueLow >> 16);
1077        /* Reading the values from the base address and size registers */
1078        baseAddrValue = GTREGREAD (pciMemWindowBaseAddrReg) & 0xfffff;
1079        windowSizeValue = GTREGREAD (pciMemWindowSizeReg) & 0xffff;
1080        /* Start calculating the effective Base Address */
1081        effectiveBaseAddress = baseAddrValue << 16;
1082        /* The effective base address will be combined from the chopped (if any)
1083           remap value (according to the size value and remap mechanism) and the
1084           window's base address */
1085        effectiveBaseAddress |=
1086                (((windowSizeValue << 16) | 0xffff) & remapValueLow);
1087        /* If the effectiveBaseAddress exceed the window boundaries return an
1088           invalid value. */
1089        if (effectiveBaseAddress >
1090            ((baseAddrValue << 16) + ((windowSizeValue << 16) | 0xffff)))
1091                return 0xffffffff;
1092        return effectiveBaseAddress;
1093}
1094
1095/********************************************************************
1096* memorySetRegionSnoopMode - This function modifys one of the 4 regions which
1097*                            supports Cache Coherency.
1098*
1099*
1100* Inputs: SNOOP_REGION region - One of the four regions.
1101*         SNOOP_TYPE snoopType - There is four optional Types:
1102*                               1. No Snoop.
1103*                               2. Snoop to WT region.
1104*                               3. Snoop to WB region.
1105*                               4. Snoop & Invalidate to WB region.
1106*         unsigned int baseAddress - Base Address of this region.
1107*         unsigned int topAddress - Top Address of this region.
1108* Returns: false if one of the parameters is wrong and true else
1109*********************************************************************/
1110/* evb6260 code */
1111#if 0
1112bool memorySetRegionSnoopMode(MEMORY_SNOOP_REGION region,
1113                              MEMORY_SNOOP_TYPE snoopType,
1114                              unsigned int baseAddress,
1115                              unsigned int regionLength)
1116{
1117    unsigned int snoopXbaseAddress;
1118    unsigned int snoopXtopAddress;
1119    unsigned int data;
1120    unsigned int snoopHigh = baseAddress + regionLength;
1121
1122    if( (region > MEM_SNOOP_REGION3) || (snoopType > MEM_SNOOP_WB) )
1123        return false;
1124    snoopXbaseAddress = SNOOP_BASE_ADDRESS_0 + 0x10 * region;
1125    snoopXtopAddress = SNOOP_TOP_ADDRESS_0 + 0x10 * region;
1126                                 if(regionLength == 0) /* closing the region */
1127    {
1128        GT_REG_WRITE(snoopXbaseAddress,0x0000ffff);
1129        GT_REG_WRITE(snoopXtopAddress,0);
1130        return true;
1131    }
1132    baseAddress = baseAddress & 0xffff0000;
1133    data = (baseAddress >> 16) | snoopType << 16;
1134    GT_REG_WRITE(snoopXbaseAddress,data);
1135    snoopHigh = (snoopHigh & 0xfff00000) >> 20;
1136    GT_REG_WRITE(snoopXtopAddress,snoopHigh - 1);
1137    return true;
1138}
1139#endif
1140
1141/********************************************************************
1142* memoryRemapAddress - This fubction used for address remapping.
1143*
1144*
1145* Inputs: regOffset: remap register
1146*         remapValue :
1147* Returns: false if one of the parameters is erroneous,true otherwise.
1148*
1149* Not needed function To_do !!!!
1150*********************************************************************/
1151bool memoryRemapAddress (unsigned int remapReg, unsigned int remapValue)
1152{
1153        unsigned int valueForReg;
1154
1155        valueForReg = (remapValue & 0xfff00000) >> 20;
1156        GT_REG_WRITE (remapReg, valueForReg);
1157        return true;
1158}
1159
1160/*******************************************************************************
1161* memoryGetDeviceParam - Extract the device parameters from the device bank
1162*                          parameters register.
1163*
1164* DESCRIPTION:
1165*       To allow interfacing with very slow devices and fast synchronous SRAMs,
1166*       each device can be programed to different timing parameters. Each bank
1167*       has its own parameters register. Bank width can be programmed to 8, 16,
1168*       or 32-bits. Bank timing parameters can be programmed to support
1169*       different device types (e.g. Sync Burst SRAM, Flash , ROM, I/O
1170*       Controllers). The MV allows you to set timing parameters and width for
1171*       each device through parameters register .
1172*       This function extracts the parameters described from the Device Bank
1173*       parameters register and fills the given 'deviceParam' (defined in
1174*       gtMemory.h) structure with the read data.
1175*
1176* INPUT:
1177*       deviceParam -  pointer to a structure DEVICE_PARAM (defined in
1178*                      Memory.h).For details about each structure field please
1179*                      see the device timing parameter section in the MV
1180*                      datasheet.
1181*       deviceNum  -   Select on of the five device banks (defined in
1182*                      Memory.h) :
1183*
1184*                       - DEVICE0
1185*                       - DEVICE1
1186*                       - DEVICE2
1187*                       - etc.
1188*
1189* OUTPUT:
1190*       None.
1191*
1192* RETURN:
1193*       false if one of the parameters is erroneous,true otherwise.
1194*
1195*******************************************************************************/
1196/********************************************************************
1197* memoryGetDeviceParam - This function used for getting device parameters from
1198*                        DEVICE BANK PARAMETERS REGISTER
1199*
1200*
1201* Inputs:        - deviceParam: STRUCT with paramiters for DEVICE BANK
1202*                  PARAMETERS REGISTER
1203*                - deviceNum : number of device
1204* Returns: false if one of the parameters is erroneous,true otherwise.
1205*********************************************************************/
1206
1207bool memoryGetDeviceParam (DEVICE_PARAM * deviceParam, DEVICE deviceNum)
1208{
1209        unsigned int valueOfReg;
1210        unsigned int calcData;
1211
1212        if (deviceNum > 4)
1213                return false;
1214        GT_REG_READ (DEVICE_BANK0PARAMETERS + 4 * deviceNum, &valueOfReg);
1215        calcData = (0x7 & valueOfReg) + ((BIT22 & valueOfReg) >> 19);
1216        deviceParam->turnOff = calcData;        /* Turn Off */
1217
1218        calcData = ((0x78 & valueOfReg) >> 3) + ((BIT23 & valueOfReg) >> 19);
1219        deviceParam->acc2First = calcData;      /* Access To First */
1220
1221        calcData = ((0x780 & valueOfReg) >> 7) + ((BIT24 & valueOfReg) >> 20);
1222        deviceParam->acc2Next = calcData;       /* Access To Next */
1223
1224        calcData =
1225                ((0x3800 & valueOfReg) >> 11) + ((BIT25 & valueOfReg) >> 22);
1226        deviceParam->ale2Wr = calcData; /* Ale To Write */
1227
1228        calcData = ((0x1c000 & valueOfReg) >> 14) +
1229                ((BIT26 & valueOfReg) >> 23);
1230        deviceParam->wrLow = calcData;  /* Write Active */
1231
1232        calcData = ((0xe0000 & valueOfReg) >> 17) +
1233                ((BIT27 & valueOfReg) >> 24);
1234        deviceParam->wrHigh = calcData; /* Write High */
1235
1236        calcData = ((0x300000 & valueOfReg) >> 20);
1237        deviceParam->deviceWidth = (BIT0 << calcData);  /* In bytes */
1238        calcData = ((0x30000000 & valueOfReg) >> 28);
1239        deviceParam->badrSkew = calcData;       /* Cycles gap between BAdr
1240                                                   toggle to read data sample. */
1241        calcData = ((0x40000000 & valueOfReg) >> 30);
1242        deviceParam->DPEn = calcData;   /*  Data Parity enable  */
1243        return true;
1244}
1245
1246/*******************************************************************************
1247* memorySetDeviceParam - Set new parameters for a device.
1248*
1249*
1250* DESCRIPTION:
1251*       To allow interfacing with very slow devices and fast synchronous SRAMs,
1252*       each device can be programed to different timing parameters. Each bank
1253*       has its own parameters register. Bank width can be programmed to 8, 16,
1254*       or 32-bits. Bank timing parameters can be programmed to support
1255*       different device types (e.g. Sync Burst SRAM, Flash , ROM, I/O
1256*       Controllers). The MV allows you to set timing parameters and width for
1257*       each device through parameters register. This function set new
1258*       parameters to a device Bank from the delivered structure 'deviceParam'
1259*       (defined in gtMemory.h). The structure must be initialized with data
1260*       prior to the use of these function.
1261*
1262* INPUT:
1263*       deviceParam -  pointer to a structure DEVICE_PARAM (defined in
1264*                      Memory.h).For details about each structure field please
1265*                      see the device timing parameter section in the MV
1266*                      datasheet.
1267*       deviceNum  -   Select on of the five device banks (defined in
1268*                      Memory.h) :
1269*
1270*                       - DEVICE0
1271*                       - DEVICE1
1272*                       - DEVICE2
1273*                       - etc.
1274*
1275* OUTPUT:
1276*       None.
1277*
1278* RETURN:
1279*       false if one of the parameters is erroneous,true otherwise.
1280*
1281*******************************************************************************/
1282/********************************************************************
1283* memorySetDeviceParam - This function used for setting device parameters to
1284*                        DEVICE BANK PARAMETERS REGISTER
1285*
1286*
1287* Inputs:        - deviceParam: STRUCT for store paramiters from DEVICE BANK
1288*                  PARAMETERS REGISTER
1289*                - deviceNum : number of device
1290* Returns: false if one of the parameters is erroneous,true otherwise.
1291*********************************************************************/
1292bool memorySetDeviceParam (DEVICE_PARAM * deviceParam, DEVICE deviceNum)
1293{
1294        unsigned int valueForReg;
1295
1296        if ((deviceParam->turnOff > 0x7) || (deviceParam->acc2First > 0xf) ||
1297            (deviceParam->acc2Next > 0xf) || (deviceParam->ale2Wr > 0x7) ||
1298            (deviceParam->wrLow > 0x7) || (deviceParam->wrHigh > 0x7) ||
1299            (deviceParam->badrSkew > 0x2) || (deviceParam->DPEn > 0x1)) {
1300                return false;
1301        }
1302        valueForReg = (((deviceParam->turnOff) & 0x7) |
1303                       (((deviceParam->turnOff) & 0x8) << 19) |
1304                       (((deviceParam->acc2First) & 0xf) << 3) |
1305                       (((deviceParam->acc2First) & 0x10) << 19) |
1306                       (((deviceParam->acc2Next) & 0xf) << 7) |
1307                       (((deviceParam->acc2Next) & 0x10) << 20) |
1308                       (((deviceParam->ale2Wr) & 0x7) << 11) |
1309                       (((deviceParam->ale2Wr) & 0xf) << 22) |
1310                       (((deviceParam->wrLow) & 0x7) << 14) |
1311                       (((deviceParam->wrLow) & 0xf) << 23) |
1312                       (((deviceParam->wrHigh) & 0x7) << 17) |
1313                       (((deviceParam->wrHigh) & 0xf) << 24) |
1314                       (((deviceParam->badrSkew) & 0x3) << 28) |
1315                       (((deviceParam->DPEn) & 0x1) << 30));
1316
1317        /* insert the device width: */
1318        switch (deviceParam->deviceWidth) {
1319        case 1:
1320                valueForReg = valueForReg | _8BIT;
1321                break;
1322        case 2:
1323                valueForReg = valueForReg | _16BIT;
1324                break;
1325        case 4:
1326                valueForReg = valueForReg | _32BIT;
1327                break;
1328        default:
1329                valueForReg = valueForReg | _8BIT;
1330                break;
1331        }
1332        GT_REG_WRITE (DEVICE_BANK0PARAMETERS + 4 * deviceNum, valueForReg);
1333        return true;
1334}
1335
1336/*******************************************************************************
1337* MemoryDisableWindow - Disable a memory space by the disable bit.
1338* DESCRIPTION:
1339*       This function disables one of the 21 availiable windows dedicated for
1340*       the CPU decoding mechanism. Its possible to combine several windows with
1341*       the OR command.
1342* INPUT:
1343*       window - One or more of the memory windows (defined in gtMemory.h).
1344* OUTPUT:
1345*       None.
1346* RETURN:
1347*       None.
1348*******************************************************************************/
1349void MemoryDisableWindow (MEMORY_WINDOW window)
1350{
1351        SET_REG_BITS (BASE_ADDR_ENABLE, window);
1352}
1353
1354/*******************************************************************************
1355* MemoryEnableWindow - Enable a memory space that was disabled by
1356*                       'MemoryDisableWindow'.
1357* DESCRIPTION:
1358*       This function enables one of the 21 availiable windows dedicated for the
1359*       CPU decoding mechanism. Its possible to combine several windows with the
1360*       OR command.
1361* INPUT:
1362*       window - One or more of the memory windows (defined in gtMemory.h).
1363* OUTPUT:
1364*       None.
1365* RETURN:
1366*       None.
1367*******************************************************************************/
1368void MemoryEnableWindow (MEMORY_WINDOW window)
1369{
1370        RESET_REG_BITS (BASE_ADDR_ENABLE, window);
1371}
1372
1373/*******************************************************************************
1374* MemoryGetMemWindowStatus - This function check whether the memory window is
1375*                              disabled or not.
1376* DESCRIPTION:
1377*       This function checks if the given memory window is closed .
1378* INPUT:
1379*       window - One or more of the memory windows (defined in gtMemory.h).
1380* OUTPUT:
1381*       None.
1382* RETURN:
1383*       True for a closed window, false otherwise .
1384*******************************************************************************/
1385MEMORY_WINDOW_STATUS MemoryGetMemWindowStatus (MEMORY_WINDOW window)
1386{
1387        if (GTREGREAD (BASE_ADDR_ENABLE) & window)
1388                return MEM_WINDOW_DISABLED;
1389        return MEM_WINDOW_ENABLED;
1390}
1391