From: "Y.C. Chen" <[email protected]> The origianl driver will access BMC configuration through P2A bridge. It will cause system hanged if P2A bridge is disabled.
Signed-off-by: Y.C. Chen <[email protected]> --- src/ast.h | 1 + src/ast_vgatool.c | 184 ++++++++++++++++++++++++++++++------------------------ 2 files changed, 103 insertions(+), 82 deletions(-) diff --git a/src/ast.h b/src/ast.h index 1aa58c3..4309a6e 100644 --- a/src/ast.h +++ b/src/ast.h @@ -255,6 +255,7 @@ typedef struct _ASTRec { int DBGSelect; Bool VGA2Clone; Bool SupportWideScreen; + Bool DisableP2A; ULONG FBPhysAddr; /* Frame buffer physical address */ ULONG MMIOPhysAddr; /* MMIO region physical address */ diff --git a/src/ast_vgatool.c b/src/ast_vgatool.c index 7e967f8..62b1c84 100644 --- a/src/ast_vgatool.c +++ b/src/ast_vgatool.c @@ -429,89 +429,101 @@ ASTGetDRAMInfo(ScrnInfoPtr pScrn) ULONG ulRefPLL, ulDeNumerator, ulNumerator, ulDivider; ULONG ulData, ulData2; - *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; - *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; + if (pAST->DisableP2A) + { + pAST->jDRAMType = DRAMTYPE_1Gx16; + pAST->ulDRAMBusWidth = 16; + if (pAST->jChipType == AST2500) + pAST->ulMCLK = 800; + else + pAST->ulMCLK = 396; + } + else + { + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; - *(ULONG *) (pAST->MMIOVirtualAddr + 0x10000) = 0xFC600309; - do { - ; - } while (*(volatile ULONG *) (pAST->MMIOVirtualAddr + 0x10000) != 0x01); + *(ULONG *) (pAST->MMIOVirtualAddr + 0x10000) = 0xFC600309; + do { + ; + } while (*(volatile ULONG *) (pAST->MMIOVirtualAddr + 0x10000) != 0x01); - ulData = *(volatile ULONG *) (pAST->MMIOVirtualAddr + 0x10004); + ulData = *(volatile ULONG *) (pAST->MMIOVirtualAddr + 0x10004); - /* Get BusWidth */ - if (ulData & 0x40) - pAST->ulDRAMBusWidth = 16; - else - pAST->ulDRAMBusWidth = 32; + /* Get BusWidth */ + if (ulData & 0x40) + pAST->ulDRAMBusWidth = 16; + else + pAST->ulDRAMBusWidth = 32; - /* Get DRAM Type */ - if ((pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500)) - { - switch (ulData & 0x03) + /* Get DRAM Type */ + if ((pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500)) { - case 0x00: - pAST->jDRAMType = DRAMTYPE_512Mx16; - break; - default: - case 0x01: - pAST->jDRAMType = DRAMTYPE_1Gx16; - break; - case 0x02: - pAST->jDRAMType = DRAMTYPE_2Gx16; - break; - case 0x03: - pAST->jDRAMType = DRAMTYPE_4Gx16; + switch (ulData & 0x03) + { + case 0x00: + pAST->jDRAMType = DRAMTYPE_512Mx16; break; + default: + case 0x01: + pAST->jDRAMType = DRAMTYPE_1Gx16; + break; + case 0x02: + pAST->jDRAMType = DRAMTYPE_2Gx16; + break; + case 0x03: + pAST->jDRAMType = DRAMTYPE_4Gx16; + break; + } } - } - else - { - switch (ulData & 0x0C) + else { - case 0x00: - case 0x04: - pAST->jDRAMType = DRAMTYPE_512Mx16; - break; - - case 0x08: - if (ulData & 0x40) /* 16bits */ - pAST->jDRAMType = DRAMTYPE_1Gx16; - else /* 32bits */ - pAST->jDRAMType = DRAMTYPE_512Mx32; - break; - - case 0x0C: - pAST->jDRAMType = DRAMTYPE_1Gx32; - break; + switch (ulData & 0x0C) + { + case 0x00: + case 0x04: + pAST->jDRAMType = DRAMTYPE_512Mx16; + break; + + case 0x08: + if (ulData & 0x40) /* 16bits */ + pAST->jDRAMType = DRAMTYPE_1Gx16; + else /* 32bits */ + pAST->jDRAMType = DRAMTYPE_512Mx32; + break; + + case 0x0C: + pAST->jDRAMType = DRAMTYPE_1Gx32; + break; + } } - } - /* Get MCLK */ - ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x10120); - ulData2 = *(ULONG *) (pAST->MMIOVirtualAddr + 0x10170); - if (ulData2 & 0x2000) - ulRefPLL = 14318; - else - ulRefPLL = 12000; + /* Get MCLK */ + ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x10120); + ulData2 = *(ULONG *) (pAST->MMIOVirtualAddr + 0x10170); + if (ulData2 & 0x2000) + ulRefPLL = 14318; + else + ulRefPLL = 12000; - ulDeNumerator = ulData & 0x1F; - ulNumerator = (ulData & 0x3FE0) >> 5; + ulDeNumerator = ulData & 0x1F; + ulNumerator = (ulData & 0x3FE0) >> 5; - ulData = (ulData & 0xC000) >> 14; - switch (ulData) - { - case 0x03: - ulDivider = 0x04; - break; - case 0x02: - case 0x01: - ulDivider = 0x02; - break; - default: - ulDivider = 0x01; - } - pAST->ulMCLK = ulRefPLL * (ulNumerator + 2) / ((ulDeNumerator + 2) * ulDivider * 1000); + ulData = (ulData & 0xC000) >> 14; + switch (ulData) + { + case 0x03: + ulDivider = 0x04; + break; + case 0x02: + case 0x01: + ulDivider = 0x02; + break; + default: + ulDivider = 0x01; + } + pAST->ulMCLK = ulRefPLL * (ulNumerator + 2) / ((ulDeNumerator + 2) * ulDivider * 1000); + } /* DisbleP2A */ } /* ASTGetDRAMInfo */ @@ -657,6 +669,11 @@ ASTGetScratchOptions(ScrnInfoPtr pScrn) ULONG ulData; UCHAR jReg; + /* Check P2A Access */ + pAST->DisableP2A = FALSE; + ulData = *(ULONG *)(pAST->MMIOVirtualAddr + 0xF004); + if (ulData == 0xFFFFFFFF) pAST->DisableP2A = TRUE; + /* VGA2 Clone Support */ GetIndexRegMask(CRTC_PORT, 0x90, 0xFF, jReg); if (jReg & 0x10) @@ -3561,17 +3578,20 @@ Bool ASTInitVGA(ScrnInfoPtr pScrn, ULONG Flags) vSetDefVCLK(pScrn); vSetDefExtReg(pScrn); - if (Flags == 0) - vGetDefaultSettings(pScrn); - - if (pAST->jChipType == AST2500) - vInitAST2500DRAMReg(pScrn); - else if ((pAST->jChipType == AST2300) || (pAST->jChipType == AST2400)) - vInitAST2300DRAMReg(pScrn); - else - vInitDRAMReg(pScrn); - - vInit3rdTX(pScrn); + if (pAST->DisableP2A == FALSE) + { + if (Flags == 0) + vGetDefaultSettings(pScrn); + + if (pAST->jChipType == AST2500) + vInitAST2500DRAMReg(pScrn); + else if ((pAST->jChipType == AST2300) || (pAST->jChipType == AST2400)) + vInitAST2300DRAMReg(pScrn); + else + vInitDRAMReg(pScrn); + + vInit3rdTX(pScrn); + } /* Disable P2A */ } return (TRUE); -- 1.8.3.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
