intel_extreme: setup Gen11 interrupts
added register names from i915 as that's what the register dump tool uses. Change-Id: I4c4db881f55ffa820c0a6a058a533328a0b5d68f Reviewed-on: https://review.haiku-os.org/c/haiku/+/5161 Reviewed-by: Adrien Destugues <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
7bbfd0ff49
commit
467b19de28
@@ -224,6 +224,8 @@ struct DeviceType {
|
|||||||
return 7;
|
return 7;
|
||||||
if (InGroup(INTEL_GROUP_CHV) || InGroup(INTEL_GROUP_BDW))
|
if (InGroup(INTEL_GROUP_CHV) || InGroup(INTEL_GROUP_BDW))
|
||||||
return 8;
|
return 8;
|
||||||
|
if (InGroup(INTEL_GROUP_JSL))
|
||||||
|
return 11;
|
||||||
if (InFamily(INTEL_FAMILY_LAKE))
|
if (InFamily(INTEL_FAMILY_LAKE))
|
||||||
return 9;
|
return 9;
|
||||||
|
|
||||||
@@ -596,12 +598,46 @@ struct intel_free_graphics_memory {
|
|||||||
#define PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(pipe) (1 << (15 + pipe))
|
#define PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(pipe) (1 << (15 + pipe))
|
||||||
#define PCH_MASTER_INT_CTL_GLOBAL_BDW (1 << 31)
|
#define PCH_MASTER_INT_CTL_GLOBAL_BDW (1 << 31)
|
||||||
|
|
||||||
#define PCH_INTERRUPT_PIPE_STATUS_BDW(pipe) (0x44400 + (pipe - 1) * 0x10)
|
#define PCH_INTERRUPT_PIPE_STATUS_BDW(pipe) (0x44400 + (pipe - 1) * 0x10) // GEN8_DE_PIPE_ISR
|
||||||
#define PCH_INTERRUPT_PIPE_MASK_BDW(pipe) (0x44404 + (pipe - 1) * 0x10)
|
#define PCH_INTERRUPT_PIPE_MASK_BDW(pipe) (0x44404 + (pipe - 1) * 0x10) // GEN8_DE_PIPE_IMR
|
||||||
#define PCH_INTERRUPT_PIPE_IDENTITY_BDW(pipe) (0x44408 + (pipe - 1) * 0x10)
|
#define PCH_INTERRUPT_PIPE_IDENTITY_BDW(pipe) (0x44408 + (pipe - 1) * 0x10) // GEN8_DE_PIPE_IIR
|
||||||
#define PCH_INTERRUPT_PIPE_ENABLED_BDW(pipe) (0x4440c + (pipe - 1) * 0x10)
|
#define PCH_INTERRUPT_PIPE_ENABLED_BDW(pipe) (0x4440c + (pipe - 1) * 0x10) // GEN8_DE_PIPE_IER
|
||||||
|
|
||||||
|
#define GEN8_DE_PORT_ISR 0x44440
|
||||||
|
#define GEN8_DE_PORT_IMR 0x44444
|
||||||
|
#define GEN8_DE_PORT_IIR 0x44448
|
||||||
|
#define GEN8_DE_PORT_IER 0x4444c
|
||||||
|
#define GEN8_AUX_CHANNEL_A (1 << 0)
|
||||||
|
#define GEN9_AUX_CHANNEL_B (1 << 25)
|
||||||
|
#define GEN9_AUX_CHANNEL_C (1 << 26)
|
||||||
|
#define GEN9_AUX_CHANNEL_D (1 << 27)
|
||||||
|
#define CNL_AUX_CHANNEL_F (1 << 28)
|
||||||
|
#define ICL_AUX_CHANNEL_E (1 << 29)
|
||||||
|
|
||||||
|
#define GEN8_DE_MISC_ISR 0x44460
|
||||||
|
#define GEN8_DE_MISC_IMR 0x44464
|
||||||
|
#define GEN8_DE_MISC_IIR 0x44468
|
||||||
|
#define GEN8_DE_MISC_IER 0x4446c
|
||||||
|
#define GEN8_DE_EDP_PSR (1 << 19)
|
||||||
|
|
||||||
|
#define PCH_INTERRUPT_VBLANK_BDW (1 << 0) // GEN8_PIPE_VBLANK
|
||||||
|
#define GEN8_PIPE_VSYNC (1 << 1)
|
||||||
|
#define GEN8_PIPE_SCAN_LINE_EVENT (1 << 2)
|
||||||
|
|
||||||
|
#define GEN11_DISPLAY_INT_CTL 0x44200 // same as PCH_MASTER_INT_CTL_BDW
|
||||||
|
#define GEN11_GFX_MSTR_IRQ 0x190010
|
||||||
|
#define GEN11_MASTER_IRQ (1 << 31)
|
||||||
|
#define GEN11_GT_DW1_IRQ (1 << 1)
|
||||||
|
#define GEN11_GT_DW0_IRQ (1 << 0)
|
||||||
|
|
||||||
|
#define GEN11_GT_INTR_DW0 0x190018
|
||||||
|
#define GEN11_GT_INTR_DW1 0x19001c
|
||||||
|
|
||||||
|
#define GEN11_GU_MISC_IMR 0x444f4
|
||||||
|
#define GEN11_GU_MISC_IIR 0x444f8
|
||||||
|
#define GEN11_GU_MISC_IER 0x444fc
|
||||||
|
#define GEN11_GU_MISC_GSE (1 << 27)
|
||||||
|
|
||||||
#define PCH_INTERRUPT_VBLANK_BDW (1 << 0)
|
|
||||||
|
|
||||||
// graphics port control (i.e. G45)
|
// graphics port control (i.e. G45)
|
||||||
#define DISPLAY_MONITOR_PORT_ENABLED (1UL << 31)
|
#define DISPLAY_MONITOR_PORT_ENABLED (1UL << 31)
|
||||||
|
|||||||
@@ -100,6 +100,14 @@ bdw_enable_interrupts(intel_info& info, pipe_index pipe, bool enable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
gen11_enable_global_interrupts(intel_info& info, bool enable)
|
||||||
|
{
|
||||||
|
write32(info, GEN11_GFX_MSTR_IRQ, enable ? GEN11_MASTER_IRQ : 0);
|
||||||
|
read32(info, GEN11_GFX_MSTR_IRQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdw_enable_global_interrupts(intel_info& info, bool enable)
|
bdw_enable_global_interrupts(intel_info& info, bool enable)
|
||||||
{
|
{
|
||||||
@@ -120,7 +128,7 @@ bdw_check_interrupt(intel_info& info, pipes& which)
|
|||||||
ASSERT(info.device_type.Generation() >= 12 || !which.HasPipe(INTEL_PIPE_D));
|
ASSERT(info.device_type.Generation() >= 12 || !which.HasPipe(INTEL_PIPE_D));
|
||||||
|
|
||||||
which.ClearPipe(INTEL_PIPE_ANY);
|
which.ClearPipe(INTEL_PIPE_ANY);
|
||||||
const uint32 interrupt = read32(info, PCH_MASTER_INT_CTL_BDW);
|
uint32 interrupt = read32(info, PCH_MASTER_INT_CTL_BDW);
|
||||||
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_A)) != 0)
|
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_A)) != 0)
|
||||||
which.SetPipe(INTEL_PIPE_A);
|
which.SetPipe(INTEL_PIPE_A);
|
||||||
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_B)) != 0)
|
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_B)) != 0)
|
||||||
@@ -129,6 +137,12 @@ bdw_check_interrupt(intel_info& info, pipes& which)
|
|||||||
which.SetPipe(INTEL_PIPE_C);
|
which.SetPipe(INTEL_PIPE_C);
|
||||||
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_D)) != 0)
|
if ((interrupt & PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_D)) != 0)
|
||||||
which.SetPipe(INTEL_PIPE_D);
|
which.SetPipe(INTEL_PIPE_D);
|
||||||
|
interrupt &= ~(PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_A)
|
||||||
|
| PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_B)
|
||||||
|
| PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_C)
|
||||||
|
| PCH_MASTER_INT_CTL_PIPE_PENDING_BDW(INTEL_PIPE_D));
|
||||||
|
if (interrupt != 0)
|
||||||
|
dprintf("bdw_check_interrupt %" B_PRIx32 "\n", interrupt);
|
||||||
return which.HasPipe(INTEL_PIPE_ANY);
|
return which.HasPipe(INTEL_PIPE_ANY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,9 +442,34 @@ init_interrupt_handler(intel_info &info)
|
|||||||
status = install_io_interrupt_handler(info.irq,
|
status = install_io_interrupt_handler(info.irq,
|
||||||
&bdw_interrupt_handler, (void*)&info, 0);
|
&bdw_interrupt_handler, (void*)&info, 0);
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
bdw_enable_global_interrupts(info, true);
|
|
||||||
bdw_enable_interrupts(info, INTEL_PIPE_A, true);
|
bdw_enable_interrupts(info, INTEL_PIPE_A, true);
|
||||||
bdw_enable_interrupts(info, INTEL_PIPE_B, true);
|
bdw_enable_interrupts(info, INTEL_PIPE_B, true);
|
||||||
|
if (info.device_type.Generation() >= 11)
|
||||||
|
bdw_enable_interrupts(info, INTEL_PIPE_C, true);
|
||||||
|
bdw_enable_global_interrupts(info, true);
|
||||||
|
|
||||||
|
if (info.device_type.Generation() >= 11) {
|
||||||
|
uint32 mask = GEN8_AUX_CHANNEL_A;
|
||||||
|
mask |= GEN9_AUX_CHANNEL_B | GEN9_AUX_CHANNEL_C | GEN9_AUX_CHANNEL_D;
|
||||||
|
mask |= CNL_AUX_CHANNEL_F;
|
||||||
|
mask |= ICL_AUX_CHANNEL_E;
|
||||||
|
read32(info, GEN8_DE_PORT_ISR);
|
||||||
|
write32(info, GEN8_DE_PORT_IER, mask);
|
||||||
|
write32(info, GEN8_DE_PORT_IMR, ~mask);
|
||||||
|
read32(info, GEN8_DE_PORT_IMR);
|
||||||
|
|
||||||
|
read32(info, GEN8_DE_MISC_ISR);
|
||||||
|
write32(info, GEN8_DE_MISC_IER, GEN8_DE_EDP_PSR);
|
||||||
|
write32(info, GEN8_DE_MISC_IMR, ~GEN8_DE_EDP_PSR);
|
||||||
|
read32(info, GEN8_DE_MISC_IMR);
|
||||||
|
|
||||||
|
read32(info, GEN11_GU_MISC_IIR);
|
||||||
|
write32(info, GEN11_GU_MISC_IER, GEN11_GU_MISC_GSE);
|
||||||
|
write32(info, GEN11_GU_MISC_IMR, ~GEN11_GU_MISC_GSE);
|
||||||
|
read32(info, GEN11_GU_MISC_IMR);
|
||||||
|
// Missing: Hotplug
|
||||||
|
gen11_enable_global_interrupts(info, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = install_io_interrupt_handler(info.irq,
|
status = install_io_interrupt_handler(info.irq,
|
||||||
@@ -660,13 +699,13 @@ intel_extreme_init(intel_info &info)
|
|||||||
info.shared_info->pll_info.max_frequency = 350000;
|
info.shared_info->pll_info.max_frequency = 350000;
|
||||||
// 350 MHz RAM DAC speed
|
// 350 MHz RAM DAC speed
|
||||||
info.shared_info->pll_info.min_frequency = 25000; // 25 MHz
|
info.shared_info->pll_info.min_frequency = 25000; // 25 MHz
|
||||||
} else if ((info.device_type.Generation() == 9) &&
|
} else if ((info.device_type.Generation() >= 9) &&
|
||||||
info.device_type.InGroup(INTEL_GROUP_SKY)) {
|
info.device_type.InGroup(INTEL_GROUP_SKY)) {
|
||||||
info.shared_info->pll_info.reference_frequency = 24000; // 24 MHz
|
info.shared_info->pll_info.reference_frequency = 24000; // 24 MHz
|
||||||
info.shared_info->pll_info.max_frequency = 350000;
|
info.shared_info->pll_info.max_frequency = 350000;
|
||||||
// 350 MHz RAM DAC speed
|
// 350 MHz RAM DAC speed
|
||||||
info.shared_info->pll_info.min_frequency = 25000; // 25 MHz
|
info.shared_info->pll_info.min_frequency = 25000; // 25 MHz
|
||||||
} else if (info.device_type.Generation() == 9) {
|
} else if (info.device_type.Generation() >= 9) {
|
||||||
uint32 refInfo =
|
uint32 refInfo =
|
||||||
(read32(info, ICL_DSSM) & ICL_DSSM_REF_FREQ_MASK) >> ICL_DSSM_REF_FREQ_SHIFT;
|
(read32(info, ICL_DSSM) & ICL_DSSM_REF_FREQ_MASK) >> ICL_DSSM_REF_FREQ_SHIFT;
|
||||||
switch (refInfo) {
|
switch (refInfo) {
|
||||||
@@ -774,6 +813,9 @@ intel_extreme_uninit(intel_info &info)
|
|||||||
if (!info.fake_interrupts && info.shared_info->vblank_sem > 0) {
|
if (!info.fake_interrupts && info.shared_info->vblank_sem > 0) {
|
||||||
// disable interrupt generation
|
// disable interrupt generation
|
||||||
if (info.device_type.Generation() >= 8) {
|
if (info.device_type.Generation() >= 8) {
|
||||||
|
if (info.device_type.Generation() >= 11) {
|
||||||
|
gen11_enable_global_interrupts(info, false);
|
||||||
|
}
|
||||||
bdw_enable_global_interrupts(info, false);
|
bdw_enable_global_interrupts(info, false);
|
||||||
remove_io_interrupt_handler(info.irq, bdw_interrupt_handler, &info);
|
remove_io_interrupt_handler(info.irq, bdw_interrupt_handler, &info);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user