intel_gart: add support for Gen8+ GPUs

Change-Id: I8b84e278f33542c359fc0d783f571e06ebc89b2a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4737
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Rudolf Cornelissen <[email protected]>
This commit is contained in:
Kacper Kasper
2021-11-29 18:14:21 +00:00
committed by Jérôme Duval
parent c199501e81
commit fe9ab0f353
2 changed files with 187 additions and 5 deletions
@@ -51,6 +51,8 @@
#define INTEL_GROUP_BDW (INTEL_FAMILY_SOC0 | 0x0040) // Broadwell #define INTEL_GROUP_BDW (INTEL_FAMILY_SOC0 | 0x0040) // Broadwell
#define INTEL_GROUP_SKY (INTEL_FAMILY_LAKE | 0x0010) // SkyLake #define INTEL_GROUP_SKY (INTEL_FAMILY_LAKE | 0x0010) // SkyLake
#define INTEL_GROUP_KBY (INTEL_FAMILY_LAKE | 0x0020) // KabyLake #define INTEL_GROUP_KBY (INTEL_FAMILY_LAKE | 0x0020) // KabyLake
#define INTEL_GROUP_CFL (INTEL_FAMILY_LAKE | 0x0040) // CoffeeLake
#define INTEL_GROUP_CML (INTEL_FAMILY_LAKE | 0x0080) // CometLake
// models // models
#define INTEL_TYPE_SERVER 0x0004 #define INTEL_TYPE_SERVER 0x0004
#define INTEL_TYPE_MOBILE 0x0008 #define INTEL_TYPE_MOBILE 0x0008
@@ -82,6 +84,8 @@
#define INTEL_MODEL_SKY (INTEL_GROUP_SKY) #define INTEL_MODEL_SKY (INTEL_GROUP_SKY)
#define INTEL_MODEL_SKYM (INTEL_GROUP_SKY | INTEL_TYPE_MOBILE) #define INTEL_MODEL_SKYM (INTEL_GROUP_SKY | INTEL_TYPE_MOBILE)
#define INTEL_MODEL_SKYS (INTEL_GROUP_SKY | INTEL_TYPE_SERVER) #define INTEL_MODEL_SKYS (INTEL_GROUP_SKY | INTEL_TYPE_SERVER)
#define INTEL_MODEL_CFL (INTEL_GROUP_CFL)
#define INTEL_MODEL_CML (INTEL_GROUP_CML)
#define INTEL_PCH_DEVICE_ID_MASK 0xff80 #define INTEL_PCH_DEVICE_ID_MASK 0xff80
#define INTEL_PCH_IBX_DEVICE_ID 0x3b00 #define INTEL_PCH_IBX_DEVICE_ID 0x3b00
@@ -420,6 +424,54 @@ struct intel_free_graphics_memory {
#define SNB_GTT_SIZE_1MB (1 << 8) #define SNB_GTT_SIZE_1MB (1 << 8)
#define SNB_GTT_SIZE_2MB (2 << 8) #define SNB_GTT_SIZE_2MB (2 << 8)
// BDW+ (GGC_0_0_0_PCI)
#define BDW_GRAPHICS_MEMORY_CONTROL 0x50
#define BDW_STOLEN_MEMORY_MASK 0xff00
#define BDW_STOLEN_MEMORY_32MB (1 << 8)
#define BDW_STOLEN_MEMORY_64MB (2 << 8)
#define BDW_STOLEN_MEMORY_96MB (3 << 8)
#define BDW_STOLEN_MEMORY_128MB (4 << 8)
#define BDW_STOLEN_MEMORY_160MB (5 << 8)
#define BDW_STOLEN_MEMORY_192MB (6 << 8)
#define BDW_STOLEN_MEMORY_224MB (7 << 8)
#define BDW_STOLEN_MEMORY_256MB (8 << 8)
#define BDW_STOLEN_MEMORY_288MB (9 << 8)
#define BDW_STOLEN_MEMORY_320MB (10 << 8)
#define BDW_STOLEN_MEMORY_352MB (11 << 8)
#define BDW_STOLEN_MEMORY_384MB (12 << 8)
#define BDW_STOLEN_MEMORY_416MB (13 << 8)
#define BDW_STOLEN_MEMORY_448MB (14 << 8)
#define BDW_STOLEN_MEMORY_480MB (15 << 8)
#define BDW_STOLEN_MEMORY_512MB (16 << 8)
#define BDW_STOLEN_MEMORY_1024MB (32 << 8)
#define BDW_STOLEN_MEMORY_1536MB (48 << 8)
#define BDW_STOLEN_MEMORY_2016MB (63 << 8)
#define SKL_STOLEN_MEMORY_2048MB (64 << 8)
#define SKL_STOLEN_MEMORY_4MB (240 << 8)
#define SKL_STOLEN_MEMORY_8MB (241 << 8)
#define SKL_STOLEN_MEMORY_12MB (242 << 8)
#define SKL_STOLEN_MEMORY_16MB (243 << 8)
#define SKL_STOLEN_MEMORY_20MB (244 << 8)
#define SKL_STOLEN_MEMORY_24MB (245 << 8)
#define SKL_STOLEN_MEMORY_28MB (246 << 8)
#define SKL_STOLEN_MEMORY_32MB (247 << 8)
#define SKL_STOLEN_MEMORY_36MB (248 << 8)
#define SKL_STOLEN_MEMORY_40MB (249 << 8)
#define SKL_STOLEN_MEMORY_44MB (250 << 8)
#define SKL_STOLEN_MEMORY_48MB (251 << 8)
#define SKL_STOLEN_MEMORY_52MB (252 << 8)
#define SKL_STOLEN_MEMORY_56MB (253 << 8)
#define SKL_STOLEN_MEMORY_60MB (254 << 8)
#define BDW_GTT_SIZE_MASK (3 << 6)
#define BDW_GTT_SIZE_NONE (0 << 6)
#define BDW_GTT_SIZE_2MB (1 << 6)
#define BDW_GTT_SIZE_4MB (2 << 6)
#define BDW_GTT_SIZE_8MB (3 << 6)
// graphics page translation table // graphics page translation table
#define INTEL_PAGE_TABLE_CONTROL 0x02020 #define INTEL_PAGE_TABLE_CONTROL 0x02020
#define PAGE_TABLE_ENABLED 0x00000001 #define PAGE_TABLE_ENABLED 0x00000001
@@ -193,7 +193,7 @@ static uint16
gtt_memory_config(intel_info &info) gtt_memory_config(intel_info &info)
{ {
uint8 controlRegister = INTEL_GRAPHICS_MEMORY_CONTROL; uint8 controlRegister = INTEL_GRAPHICS_MEMORY_CONTROL;
if (info.type->InGroup(INTEL_GROUP_SNB)) if (info.type->Generation() >= 6)
controlRegister = SNB_GRAPHICS_MEMORY_CONTROL; controlRegister = SNB_GRAPHICS_MEMORY_CONTROL;
return get_pci_config(info.bridge, controlRegister, 2); return get_pci_config(info.bridge, controlRegister, 2);
@@ -223,7 +223,9 @@ determine_gtt_stolen(intel_info &info)
memorySize *= 8; memorySize *= 8;
break; break;
} }
} else if (info.type->InGroup(INTEL_GROUP_SNB)) { } else if (info.type->InGroup(INTEL_GROUP_SNB)
|| info.type->InGroup(INTEL_GROUP_IVB)
|| info.type->InGroup(INTEL_GROUP_HAS)) {
switch (memoryConfig & SNB_STOLEN_MEMORY_MASK) { switch (memoryConfig & SNB_STOLEN_MEMORY_MASK) {
case SNB_STOLEN_MEMORY_32MB: case SNB_STOLEN_MEMORY_32MB:
memorySize *= 32; memorySize *= 32;
@@ -274,10 +276,120 @@ determine_gtt_stolen(intel_info &info)
memorySize *= 512; memorySize *= 512;
break; break;
} }
} else if (info.type->InGroup(INTEL_GROUP_BDW)
|| info.type->InFamily(INTEL_FAMILY_LAKE)) {
switch (memoryConfig & BDW_STOLEN_MEMORY_MASK) {
case BDW_STOLEN_MEMORY_32MB:
memorySize *= 32;
break;
case BDW_STOLEN_MEMORY_64MB:
memorySize *= 64;
break;
case BDW_STOLEN_MEMORY_96MB:
memorySize *= 96;
break;
case BDW_STOLEN_MEMORY_128MB:
memorySize *= 128;
break;
case BDW_STOLEN_MEMORY_160MB:
memorySize *= 160;
break;
case BDW_STOLEN_MEMORY_192MB:
memorySize *= 192;
break;
case BDW_STOLEN_MEMORY_224MB:
memorySize *= 224;
break;
case BDW_STOLEN_MEMORY_256MB:
memorySize *= 256;
break;
case BDW_STOLEN_MEMORY_288MB:
memorySize *= 288;
break;
case BDW_STOLEN_MEMORY_320MB:
memorySize *= 320;
break;
case BDW_STOLEN_MEMORY_352MB:
memorySize *= 352;
break;
case BDW_STOLEN_MEMORY_384MB:
memorySize *= 384;
break;
case BDW_STOLEN_MEMORY_416MB:
memorySize *= 416;
break;
case BDW_STOLEN_MEMORY_448MB:
memorySize *= 448;
break;
case BDW_STOLEN_MEMORY_480MB:
memorySize *= 480;
break;
case BDW_STOLEN_MEMORY_512MB:
memorySize *= 512;
break;
case BDW_STOLEN_MEMORY_1024MB:
memorySize *= 1024;
break;
case BDW_STOLEN_MEMORY_1536MB:
memorySize *= 1536;
break;
}
if(info.type->InGroup(INTEL_GROUP_BDW)) {
if((memoryConfig & BDW_STOLEN_MEMORY_MASK) == BDW_STOLEN_MEMORY_2016MB) {
memorySize *= 2016;
}
} else if(info.type->InFamily(INTEL_FAMILY_LAKE)) {
switch(memoryConfig & BDW_STOLEN_MEMORY_MASK) {
case SKL_STOLEN_MEMORY_4MB:
memorySize *= 4;
break;
case SKL_STOLEN_MEMORY_8MB:
memorySize *= 8;
break;
case SKL_STOLEN_MEMORY_12MB:
memorySize *= 12;
break;
case SKL_STOLEN_MEMORY_16MB:
memorySize *= 16;
break;
case SKL_STOLEN_MEMORY_20MB:
memorySize *= 20;
break;
case SKL_STOLEN_MEMORY_24MB:
memorySize *= 24;
break;
case SKL_STOLEN_MEMORY_28MB:
memorySize *= 28;
break;
case SKL_STOLEN_MEMORY_32MB:
memorySize *= 32;
break;
case SKL_STOLEN_MEMORY_36MB:
memorySize *= 36;
break;
case SKL_STOLEN_MEMORY_40MB:
memorySize *= 40;
break;
case SKL_STOLEN_MEMORY_44MB:
memorySize *= 44;
break;
case SKL_STOLEN_MEMORY_48MB:
memorySize *= 48;
break;
case SKL_STOLEN_MEMORY_52MB:
memorySize *= 52;
break;
case SKL_STOLEN_MEMORY_56MB:
memorySize *= 56;
break;
case SKL_STOLEN_MEMORY_60MB:
memorySize *= 60;
break;
}
}
} else if (info.type->InGroup(INTEL_GROUP_85x) } else if (info.type->InGroup(INTEL_GROUP_85x)
|| info.type->InFamily(INTEL_FAMILY_9xx) || info.type->InFamily(INTEL_FAMILY_9xx)
|| info.type->InFamily(INTEL_FAMILY_SER5) || info.type->InGroup(INTEL_GROUP_ILK)) {
|| info.type->InFamily(INTEL_FAMILY_SOC0)) {
switch (memoryConfig & STOLEN_MEMORY_MASK) { switch (memoryConfig & STOLEN_MEMORY_MASK) {
case i855_STOLEN_MEMORY_4M: case i855_STOLEN_MEMORY_4M:
memorySize *= 4; memorySize *= 4;
@@ -372,7 +484,9 @@ determine_gtt_size(intel_info &info)
gttSize = 4 << 20; gttSize = 4 << 20;
break; break;
} }
} else if (info.type->InGroup(INTEL_GROUP_SNB)) { } else if (info.type->InGroup(INTEL_GROUP_SNB)
|| info.type->InGroup(INTEL_GROUP_IVB)
|| info.type->InGroup(INTEL_GROUP_HAS)) {
switch (memoryConfig & SNB_GTT_SIZE_MASK) { switch (memoryConfig & SNB_GTT_SIZE_MASK) {
case SNB_GTT_SIZE_NONE: case SNB_GTT_SIZE_NONE:
gttSize = 0; gttSize = 0;
@@ -384,6 +498,22 @@ determine_gtt_size(intel_info &info)
gttSize = 2 << 20; gttSize = 2 << 20;
break; break;
} }
} else if (info.type->InGroup(INTEL_GROUP_BDW)
|| info.type->InFamily(INTEL_FAMILY_LAKE)) {
switch (memoryConfig & BDW_GTT_SIZE_MASK) {
case BDW_GTT_SIZE_NONE:
gttSize = 0;
break;
case BDW_GTT_SIZE_2MB:
gttSize = 2 << 20;
break;
case BDW_GTT_SIZE_4MB:
gttSize = 4 << 20;
break;
case BDW_GTT_SIZE_8MB:
gttSize = 8 << 20;
break;
}
} else { } else {
// older models have the GTT as large as their frame buffer mapping // older models have the GTT as large as their frame buffer mapping
// TODO: check if the i9xx version works with the i8xx chips as well // TODO: check if the i9xx version works with the i8xx chips as well