/*
 * Copyright (C) 2019-2021 Intel Corporation
 *
 * SPDX-License-Identifier: MIT
 *
 */

#include "shared/source/helpers/constants.h"

#include "mock_gdi.h"

extern ADAPTER_INFO gAdapterInfo;
extern uint64_t gGpuAddressSpace;

void InitGfxPartition() {
    if (gGpuAddressSpace >= maxNBitValue(48)) {
        // Full-range SVM 48 bit
        gAdapterInfo.GfxPartition.Standard.Base = 0x0000800400000000;
        gAdapterInfo.GfxPartition.Standard.Limit = 0x0000b801ffffffff;
        gAdapterInfo.GfxPartition.Standard64KB.Base = 0x0000b80200000000;
        gAdapterInfo.GfxPartition.Standard64KB.Limit = 0x0000efffffffffff;
        gAdapterInfo.GfxPartition.SVM.Base = 0;
        gAdapterInfo.GfxPartition.SVM.Limit = MemoryConstants::maxSvmAddress;
        gAdapterInfo.GfxPartition.Heap32[0].Base = 0x0000800000000000;
        gAdapterInfo.GfxPartition.Heap32[0].Limit = 0x00008000ffffefff;
        gAdapterInfo.GfxPartition.Heap32[1].Base = 0x0000800100000000;
        gAdapterInfo.GfxPartition.Heap32[1].Limit = 0x00008001ffffefff;
        gAdapterInfo.GfxPartition.Heap32[2].Base = 0x0000800200000000;
        gAdapterInfo.GfxPartition.Heap32[2].Limit = 0x00008002ffffefff;
        gAdapterInfo.GfxPartition.Heap32[3].Base = 0x0000800300000000;
        gAdapterInfo.GfxPartition.Heap32[3].Limit = 0x00008003ffffefff;
    } else if (gGpuAddressSpace == maxNBitValue(47)) {
        // Full-range SVM 47 bit
        gAdapterInfo.GfxPartition.Standard.Base = 0x000001c98a320000;
        gAdapterInfo.GfxPartition.Standard.Limit = 0x000005c98a31ffff;
        gAdapterInfo.GfxPartition.Standard64KB.Base = 0x000005ce00000000;
        gAdapterInfo.GfxPartition.Standard64KB.Limit = 0x000009cdffffffff;
        gAdapterInfo.GfxPartition.SVM.Base = 0;
        gAdapterInfo.GfxPartition.SVM.Limit = MemoryConstants::maxSvmAddress;
        gAdapterInfo.GfxPartition.Heap32[0].Base = 0x000005ca00000000;
        gAdapterInfo.GfxPartition.Heap32[0].Limit = 0x000005caffffefff;
        gAdapterInfo.GfxPartition.Heap32[1].Base = 0x000005cb00000000;
        gAdapterInfo.GfxPartition.Heap32[1].Limit = 0x000005cbffffefff;
        gAdapterInfo.GfxPartition.Heap32[2].Base = 0x000005cc00000000;
        gAdapterInfo.GfxPartition.Heap32[2].Limit = 0x000005ccffffefff;
        gAdapterInfo.GfxPartition.Heap32[3].Base = 0x000005cd00000000;
        gAdapterInfo.GfxPartition.Heap32[3].Limit = 0x000005cdffffefff;
    } else {
        // Limited range
        gAdapterInfo.GfxPartition.Standard.Base = 0x0000000100000000;
        gAdapterInfo.GfxPartition.Standard.Limit = 0x0000000FFFFFFFFF;
        gAdapterInfo.GfxPartition.Standard64KB.Base = 0x0000000100000000;
        gAdapterInfo.GfxPartition.Standard64KB.Limit = 0x0000000FFFFFFFFF;
        gAdapterInfo.GfxPartition.SVM.Base = 0x0;
        gAdapterInfo.GfxPartition.SVM.Limit = 0x0;
        gAdapterInfo.GfxPartition.Heap32[0].Base = 0x00001000;
        gAdapterInfo.GfxPartition.Heap32[0].Limit = 0xFFFFEFFF;
        gAdapterInfo.GfxPartition.Heap32[1].Base = 0x00001000;
        gAdapterInfo.GfxPartition.Heap32[1].Limit = 0xFFFFEFFF;
        gAdapterInfo.GfxPartition.Heap32[2].Base = 0x00001000;
        gAdapterInfo.GfxPartition.Heap32[2].Limit = 0xFFFFEFFF;
        gAdapterInfo.GfxPartition.Heap32[3].Base = 0x00001000;
        gAdapterInfo.GfxPartition.Heap32[3].Limit = 0xFFFFEFFF;
    }
}
