2022-05-20 13:23:25 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2023-02-13 22:29:17 +01:00
|
|
|
// Copyright (C) 2004-2023 Sam Demeulemeester
|
2022-05-20 13:23:25 +02:00
|
|
|
//
|
|
|
|
// ------------------------
|
|
|
|
// This file is used to detect quirks on specific hardware
|
|
|
|
// that require proprietary init here *OR* different code path
|
|
|
|
// later in various part of the code.
|
|
|
|
//
|
|
|
|
// Please add a quick comment for every quirk added to the list.
|
|
|
|
|
|
|
|
#include "hwquirks.h"
|
|
|
|
#include "io.h"
|
|
|
|
#include "pci.h"
|
|
|
|
#include "unistd.h"
|
2022-06-06 19:56:04 +02:00
|
|
|
#include "cpuinfo.h"
|
2023-02-13 22:29:17 +01:00
|
|
|
#include "cpuid.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "temperature.h"
|
Add LoongArch support (#410)
* lib/assert: Add LoongArch assert support
Added LoongArch break 3 assert instruction.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/barrier: Add barrier method for LoongArch
Added LoongArch barriers in barrier_spin_wait and barrier_halt_wait
functions.
Signed-off-by: Chao Li <lichao@loognson.cn>
* lib/spinlock: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/string: Make LoongArch use the string function in the file
Since LoongArch GCC doesn't have built-in string functions, use the
string function instance in the sting.c
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/unistd: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/acpi: Reduce the way of search RSDP for non-x86 ARCHs
Searching RSDP from legacy BIOS EDBA and reserved areas is available
only on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cache: Add LoongArch64 cache operations support
Added cache operations support for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cpuid: Add the compile limit
Make the `cpuid` function action only on i386/x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/heap: Add heap support for LoongArch64
LoongArch64 uses the low 256MB as the low memory.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add 8-bit and 16-bit memory operations
Added 8-bit and 16-bit memory access operations, which 8-bit uses
`movb` and 16-bit is `movw`.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add LoongArch memory access operations
Added 8/16/32/64-bit memory access operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add Loongson PCI vendor ID and Loongson 7A chipset EHCI workaround
1. Added Loongson PCI vendor ID.
2. Added Loongson 7A chipset ECHI workaround.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/io: Add LoongArch64 IO port operations
Added IO port operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/reloc64: Add LoongArch64 relocations support
Added R_LARCH_RELATIVE and R_LARCH_NONE relocations support for
LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/serial: Add Loongson CPU serial port support
Add the serial port address perfix of Loongson CPU and obtain serial
port clock method.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smbus: Rename smbus.c to i2c_x86.c
Renamed the smbus.c to i2c_x86.c in i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smp: Add LoongArch SMP support
Added LoongArch multi-core support and a way of map to node numbers if
the NUMA is enabled.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/timers: Add LoongArch supports
In LoongArch, there is a stable counter that is independent of other
clocks, it like the TSC in x64. Using it to count the ticks per
millisecond.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/tsc: Add LoongArch support
Usually the frequency of stable counter is not same to CPU frequency, so
using the performance counter for the delay operations.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add LoongArch MMIO perfix
Added LoongArch64 MMIO address perfix, use for address the PCI memory
space.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add Loongson 7A2000 chipset OHCI BAR offset fix
If the BAR address is not fixed for the Loongson 7A2000 OHCI controller,
some prots will not be usable, This change currently only affects the
LoongArch platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to IO access via MMIO
Usually, it is access the IO like PCI IO via MMIO on non-X86 ARCHs, so
a method to access IO via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to access PCI memory space via MMIO
Some uniformly address ARCHs access the PCI memory depended the MMIO, so
the method to access PCI memory via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app: Add LoongArch version support
Reduced the version field by two characters to support ARCH name
abbreviations with more than three characters, and added "la64" ARCH
version display.
Singed-off-by: Chao Li <lichao@loongson.cn>
* test/block_move: Add block move test via ASM for LoongArch
Add block move test inline assembly instance for LoongArch.
Signed-off-by: Chao Li <lichao@loongson.cn>
* test/mov_inv_fixed: Add LoongArch ASM version word write operation
Add LoongArch ASM version word write cycle if it uses the HAND_OPTIMISED.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Adjust the AP stack size for LoongArch
LoongArch exception will store all of the GP, FP and CSR on stack, it
need more stack size, make LoongArch AP using 2KB stack size.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efisetup: Add LoongArch CPU halt instruction
Add "idle 0" for LoongArch
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efi: Limiting the ms_abi using scope
Make the ms_abi only work on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/imc/loongson: Add Loongson LoongArch IMC support
Added the Loongson LoongArch CPU IMC instance, support read out the IMC
sequence, currently only supports reading MC0.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app/loongarch: Add intrrupt handler for LoongArch
Added the LoongArch IRQ handler support.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/loongarch: Add LoongArch ARCH specific files
Added LoongArch ARCH specific files: cpuid.c, cpuinfo.c, hwctrl.c,
memctrl.c, temperature.c, vmem.c, registers.h
They use the same pubilc API for i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Add LoongArch startup and header
Added the header.S and startup64.S for LoongArch, CPU works on:
1. Page mode.
2. Load and store is cacheable.
3. Instructions is cacheable.
4. DMWn 0 and 1 is used.
5. To access non-cacheable areas, use the perfix 0x8000000000000000.
Signed-off Chao Li <lichao@loongson.cn>
* build64/la64: Add LoongArch64 build files
Add infrastructure files to build memtest86 plus for LoongArch64
platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* workflows: Add LoongArch64 CI supports
Adjust workflow logci, remvoe 32 and 64 wordsize, replace with "i386,
x86_64 and la64", add LoongArch64 build CI check.
Signed-off-by: Chao Li <lichao@loongson.cn>
---------
Signed-off-by: Chao Li <lichao@loongson.cn>
Signed-off-by: Chao Li <lichao@loognson.cn>
2024-08-30 19:38:46 +08:00
|
|
|
#include "memrw.h"
|
|
|
|
#include "vmem.h"
|
2022-05-20 13:23:25 +02:00
|
|
|
|
|
|
|
quirk_t quirk;
|
|
|
|
|
|
|
|
// --------------------------------------
|
|
|
|
// -- Private quirk-specific functions --
|
|
|
|
// --------------------------------------
|
|
|
|
|
|
|
|
static void asus_tusl2_configure_mux(void)
|
|
|
|
{
|
|
|
|
uint8_t muxreg;
|
|
|
|
|
|
|
|
// Enter ASB100 Config Mode
|
|
|
|
outb(0x87, 0x2E);
|
|
|
|
outb(0x87, 0x2E);
|
|
|
|
usleep(200);
|
|
|
|
|
|
|
|
// Write LPC Command to access Config Mode Reg
|
|
|
|
lpc_outb(0x7, 0x8);
|
|
|
|
|
|
|
|
// Read Config Mode Register
|
|
|
|
muxreg = lpc_inb(0xF1);
|
|
|
|
|
|
|
|
// Change Smbus Mux Channel & Write Config Mode Register
|
|
|
|
muxreg &= 0xE7;
|
|
|
|
muxreg |= 0x10;
|
|
|
|
lpc_outb(0xF1, muxreg);
|
|
|
|
usleep(200);
|
|
|
|
|
|
|
|
// Leave Config Mode
|
|
|
|
outb(0xAA, 0x2E);
|
|
|
|
}
|
|
|
|
|
2024-11-11 23:10:40 +00:00
|
|
|
static int *get_motherboard_cache(void)
|
|
|
|
{
|
|
|
|
if (l2_cache == 0) {
|
|
|
|
return &l2_cache;
|
|
|
|
} else if (l3_cache == 0) {
|
|
|
|
return &l3_cache;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2022-06-06 19:56:04 +02:00
|
|
|
static void get_m1541_l2_cache_size(void)
|
|
|
|
{
|
|
|
|
if (l2_cache != 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if L2 cache is enabled with L2CC-2 Register[0]
|
|
|
|
if ((pci_config_read8(0, 0, 0, 0x42) & 1) == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get L2 Cache Size with L2CC-1 Register[3:2]
|
|
|
|
uint8_t reg = (pci_config_read8(0, 0, 0, 0x41) >> 2) & 3;
|
|
|
|
|
|
|
|
if (reg == 0b00) { l2_cache = 256; }
|
|
|
|
if (reg == 0b01) { l2_cache = 512; }
|
|
|
|
if (reg == 0b10) { l2_cache = 1024; }
|
|
|
|
}
|
|
|
|
|
2024-11-11 23:10:40 +00:00
|
|
|
static void get_vt82c597_mb_cache_size(void)
|
|
|
|
{
|
|
|
|
int *const mb_cache = get_motherboard_cache();
|
|
|
|
if (!mb_cache) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if cache is enabled with CC1 Register[7:6]
|
|
|
|
if ((pci_config_read8(0, 0, 0, 0x50) & 0xc0) != 0x80) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get cache size with CC2 Register[1:0]
|
|
|
|
const uint8_t reg = pci_config_read8(0, 0, 0, 0x51) & 0x03;
|
|
|
|
|
|
|
|
*mb_cache = 256 << reg;
|
|
|
|
}
|
|
|
|
|
2023-02-13 22:29:17 +01:00
|
|
|
static void disable_temp_reporting(void)
|
|
|
|
{
|
|
|
|
enable_temperature = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void amd_k8_revfg_temp(void)
|
|
|
|
{
|
|
|
|
uint32_t rtcr = pci_config_read32(0, 24, 3, AMD_TEMP_REG_K8);
|
|
|
|
|
|
|
|
// For Rev F & G, switch sensor if no temperature is reported
|
|
|
|
if (!((rtcr >> 16) & 0xFF)) {
|
|
|
|
pci_config_write8(0, 24, 3, AMD_TEMP_REG_K8, rtcr | 0x04);
|
|
|
|
}
|
|
|
|
|
|
|
|
// K8 Rev G Desktop requires an additional offset.
|
2024-09-30 13:38:13 +02:00
|
|
|
if (cpuid_info.version.extendedModel < 6 || cpuid_info.version.extendedModel > 7) // Not Rev G
|
2023-02-13 22:29:17 +01:00
|
|
|
return;
|
|
|
|
|
2024-09-30 13:38:13 +02:00
|
|
|
if (cpuid_info.version.extendedModel == 6 && cpuid_info.version.model < 9) // Not Desktop
|
2023-02-13 22:29:17 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
uint16_t brandID = (cpuid_info.version.extendedBrandID >> 9) & 0x1f;
|
|
|
|
|
|
|
|
if (cpuid_info.version.model == 0xF && (brandID == 0x7 || brandID == 0x9 || brandID == 0xC)) // Mobile (Single Core)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (cpuid_info.version.model == 0xB && brandID > 0xB) // Mobile (Dual Core)
|
|
|
|
return;
|
|
|
|
|
|
|
|
cpu_temp_offset = 21.0f;
|
|
|
|
}
|
|
|
|
|
Add LoongArch support (#410)
* lib/assert: Add LoongArch assert support
Added LoongArch break 3 assert instruction.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/barrier: Add barrier method for LoongArch
Added LoongArch barriers in barrier_spin_wait and barrier_halt_wait
functions.
Signed-off-by: Chao Li <lichao@loognson.cn>
* lib/spinlock: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/string: Make LoongArch use the string function in the file
Since LoongArch GCC doesn't have built-in string functions, use the
string function instance in the sting.c
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/unistd: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/acpi: Reduce the way of search RSDP for non-x86 ARCHs
Searching RSDP from legacy BIOS EDBA and reserved areas is available
only on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cache: Add LoongArch64 cache operations support
Added cache operations support for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cpuid: Add the compile limit
Make the `cpuid` function action only on i386/x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/heap: Add heap support for LoongArch64
LoongArch64 uses the low 256MB as the low memory.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add 8-bit and 16-bit memory operations
Added 8-bit and 16-bit memory access operations, which 8-bit uses
`movb` and 16-bit is `movw`.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add LoongArch memory access operations
Added 8/16/32/64-bit memory access operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add Loongson PCI vendor ID and Loongson 7A chipset EHCI workaround
1. Added Loongson PCI vendor ID.
2. Added Loongson 7A chipset ECHI workaround.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/io: Add LoongArch64 IO port operations
Added IO port operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/reloc64: Add LoongArch64 relocations support
Added R_LARCH_RELATIVE and R_LARCH_NONE relocations support for
LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/serial: Add Loongson CPU serial port support
Add the serial port address perfix of Loongson CPU and obtain serial
port clock method.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smbus: Rename smbus.c to i2c_x86.c
Renamed the smbus.c to i2c_x86.c in i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smp: Add LoongArch SMP support
Added LoongArch multi-core support and a way of map to node numbers if
the NUMA is enabled.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/timers: Add LoongArch supports
In LoongArch, there is a stable counter that is independent of other
clocks, it like the TSC in x64. Using it to count the ticks per
millisecond.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/tsc: Add LoongArch support
Usually the frequency of stable counter is not same to CPU frequency, so
using the performance counter for the delay operations.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add LoongArch MMIO perfix
Added LoongArch64 MMIO address perfix, use for address the PCI memory
space.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add Loongson 7A2000 chipset OHCI BAR offset fix
If the BAR address is not fixed for the Loongson 7A2000 OHCI controller,
some prots will not be usable, This change currently only affects the
LoongArch platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to IO access via MMIO
Usually, it is access the IO like PCI IO via MMIO on non-X86 ARCHs, so
a method to access IO via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to access PCI memory space via MMIO
Some uniformly address ARCHs access the PCI memory depended the MMIO, so
the method to access PCI memory via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app: Add LoongArch version support
Reduced the version field by two characters to support ARCH name
abbreviations with more than three characters, and added "la64" ARCH
version display.
Singed-off-by: Chao Li <lichao@loongson.cn>
* test/block_move: Add block move test via ASM for LoongArch
Add block move test inline assembly instance for LoongArch.
Signed-off-by: Chao Li <lichao@loongson.cn>
* test/mov_inv_fixed: Add LoongArch ASM version word write operation
Add LoongArch ASM version word write cycle if it uses the HAND_OPTIMISED.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Adjust the AP stack size for LoongArch
LoongArch exception will store all of the GP, FP and CSR on stack, it
need more stack size, make LoongArch AP using 2KB stack size.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efisetup: Add LoongArch CPU halt instruction
Add "idle 0" for LoongArch
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efi: Limiting the ms_abi using scope
Make the ms_abi only work on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/imc/loongson: Add Loongson LoongArch IMC support
Added the Loongson LoongArch CPU IMC instance, support read out the IMC
sequence, currently only supports reading MC0.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app/loongarch: Add intrrupt handler for LoongArch
Added the LoongArch IRQ handler support.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/loongarch: Add LoongArch ARCH specific files
Added LoongArch ARCH specific files: cpuid.c, cpuinfo.c, hwctrl.c,
memctrl.c, temperature.c, vmem.c, registers.h
They use the same pubilc API for i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Add LoongArch startup and header
Added the header.S and startup64.S for LoongArch, CPU works on:
1. Page mode.
2. Load and store is cacheable.
3. Instructions is cacheable.
4. DMWn 0 and 1 is used.
5. To access non-cacheable areas, use the perfix 0x8000000000000000.
Signed-off Chao Li <lichao@loongson.cn>
* build64/la64: Add LoongArch64 build files
Add infrastructure files to build memtest86 plus for LoongArch64
platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* workflows: Add LoongArch64 CI supports
Adjust workflow logci, remvoe 32 and 64 wordsize, replace with "i386,
x86_64 and la64", add LoongArch64 build CI check.
Signed-off-by: Chao Li <lichao@loongson.cn>
---------
Signed-off-by: Chao Li <lichao@loongson.cn>
Signed-off-by: Chao Li <lichao@loognson.cn>
2024-08-30 19:38:46 +08:00
|
|
|
static void loongson_7a00_ehci_workaround(void)
|
|
|
|
{
|
|
|
|
uintptr_t reg_addr = 0x10010000;
|
|
|
|
|
|
|
|
#if (ARCH_BITS == 64)
|
|
|
|
reg_addr |= 0xEULL << 40;
|
|
|
|
#endif
|
|
|
|
reg_addr = map_region(reg_addr, 0x0, false);
|
|
|
|
write8((uint8_t *)(reg_addr + 0x3820), 0xFF);
|
|
|
|
write8((uint8_t *)(reg_addr + 0x3830), 0xFF);
|
|
|
|
write32((uint32_t *)(reg_addr + 0x3100), 0xFFFFFFFF);
|
|
|
|
write32((uint32_t *)(reg_addr + 0x3180), 0xFFFFFFFF);
|
|
|
|
write8((uint8_t *)(reg_addr + 0x3820), 0x0);
|
|
|
|
write8((uint8_t *)(reg_addr + 0x3830), 0x0);
|
|
|
|
}
|
|
|
|
|
2022-05-20 13:23:25 +02:00
|
|
|
// ---------------------
|
|
|
|
// -- Public function --
|
|
|
|
// ---------------------
|
|
|
|
|
|
|
|
void quirks_init(void)
|
|
|
|
{
|
|
|
|
quirk.id = QUIRK_NONE;
|
|
|
|
quirk.type = QUIRK_TYPE_NONE;
|
2023-01-30 16:47:54 +01:00
|
|
|
quirk.root_vid = pci_config_read16(0, 0, 0, PCI_VID_REG);
|
|
|
|
quirk.root_did = pci_config_read16(0, 0, 0, PCI_DID_REG);
|
2022-06-05 14:36:56 +02:00
|
|
|
quirk.process = NULL;
|
2022-05-20 13:23:25 +02:00
|
|
|
|
2022-06-06 19:56:04 +02:00
|
|
|
// -------------------------
|
|
|
|
// -- ALi Aladdin V Quirk --
|
|
|
|
// -------------------------
|
2022-09-14 18:57:10 +02:00
|
|
|
// As on many Socket 7 Motherboards, the L2 cache is external and must
|
2022-06-06 19:56:04 +02:00
|
|
|
// be detected by a proprietary way based on chipset registers
|
2022-09-14 18:57:10 +02:00
|
|
|
if (quirk.root_vid == PCI_VID_ALI && quirk.root_did == 0x1541) { // ALi Aladdin V (M1541)
|
2022-06-06 19:56:04 +02:00
|
|
|
quirk.id = QUIRK_ALI_ALADDIN_V;
|
|
|
|
quirk.type |= QUIRK_TYPE_MEM_SIZE;
|
|
|
|
quirk.process = get_m1541_l2_cache_size;
|
|
|
|
}
|
|
|
|
|
2024-11-11 23:10:40 +00:00
|
|
|
// -----------------------------------------------
|
|
|
|
// -- VIA VP3 (VT82C597), MVP3 (VT82C598) Quirk --
|
|
|
|
// -----------------------------------------------
|
|
|
|
// Motherboard cache detection
|
|
|
|
else if (quirk.root_vid == PCI_VID_VIA && (quirk.root_did == 0x0597 || quirk.root_did == 0x0598)) { // VIA VT82C597/8
|
|
|
|
quirk.id = QUIRK_VIA_VP3;
|
|
|
|
quirk.type |= QUIRK_TYPE_MEM_SIZE;
|
|
|
|
quirk.process = get_vt82c597_mb_cache_size;
|
|
|
|
}
|
|
|
|
|
2022-05-20 13:23:25 +02:00
|
|
|
// ------------------------
|
|
|
|
// -- ASUS TUSL2-C Quirk --
|
|
|
|
// ------------------------
|
|
|
|
// This motherboard has an ASB100 ASIC with a SMBUS Mux Integrated.
|
|
|
|
// To access SPD later in the code, we need to configure the mux.
|
|
|
|
// PS: Detection via DMI is unreliable, so using Root PCI Registers
|
2023-01-30 16:47:54 +01:00
|
|
|
if (quirk.root_vid == PCI_VID_INTEL && quirk.root_did == 0x1130) { // Intel i815
|
|
|
|
if (pci_config_read16(0, 0, 0, PCI_SUB_VID_REG) == PCI_VID_ASUS) { // ASUS
|
|
|
|
if (pci_config_read16(0, 0, 0, PCI_SUB_DID_REG) == 0x8027) { // TUSL2-C
|
2022-05-20 13:23:25 +02:00
|
|
|
quirk.id = QUIRK_TUSL2;
|
|
|
|
quirk.type |= QUIRK_TYPE_SMBUS;
|
2022-06-05 14:36:56 +02:00
|
|
|
quirk.process = asus_tusl2_configure_mux;
|
2022-05-20 13:23:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-30 16:47:54 +01:00
|
|
|
|
|
|
|
// -------------------------------------------------
|
|
|
|
// -- SuperMicro X10SDV Quirk (GitHub Issue #233) --
|
|
|
|
// -------------------------------------------------
|
|
|
|
// Memtest86+ crashs on Super Micro X10SDV motherboard with SMP Enabled
|
|
|
|
// We were unable to find a solution so far, so disable SMP by default
|
|
|
|
if (quirk.root_vid == PCI_VID_INTEL && quirk.root_did == 0x6F00) { // Broadwell-E (Xeon-D)
|
|
|
|
if (pci_config_read16(0, 0, 0, PCI_SUB_VID_REG) == PCI_VID_SUPERMICRO) { // Super Micro
|
|
|
|
quirk.id = QUIRK_X10SDV_NOSMP;
|
|
|
|
quirk.type |= QUIRK_TYPE_SMP;
|
|
|
|
quirk.process = NULL;
|
|
|
|
}
|
|
|
|
}
|
2023-02-13 22:29:17 +01:00
|
|
|
|
|
|
|
// ------------------------------------------------------
|
|
|
|
// -- Early AMD K8 doesn't support temperature reading --
|
|
|
|
// ------------------------------------------------------
|
|
|
|
// The on-die temperature diode on SH-B0/B3 stepping does not work.
|
|
|
|
if (cpuid_info.vendor_id.str[0] == 'A' && cpuid_info.version.family == 0xF
|
|
|
|
&& cpuid_info.version.extendedFamily == 0 && cpuid_info.version.extendedModel == 0) { // Early K8
|
|
|
|
if ((cpuid_info.version.model == 4 && cpuid_info.version.stepping == 0) || // SH-B0 ClawHammer (Athlon 64)
|
|
|
|
(cpuid_info.version.model == 5 && cpuid_info.version.stepping <= 1)) { // SH-B0/B3 SledgeHammer (Opteron)
|
|
|
|
quirk.id = QUIRK_K8_BSTEP_NOTEMP;
|
|
|
|
quirk.type |= QUIRK_TYPE_TEMP;
|
|
|
|
quirk.process = disable_temp_reporting;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------
|
|
|
|
// -- Late AMD K8 (rev F/G) temp sensor workaround --
|
|
|
|
// ---------------------------------------------------
|
|
|
|
if (cpuid_info.vendor_id.str[0] == 'A' && cpuid_info.version.family == 0xF
|
|
|
|
&& cpuid_info.version.extendedFamily == 0 && cpuid_info.version.extendedModel >= 4) { // Later K8
|
|
|
|
|
|
|
|
quirk.id = QUIRK_K8_REVFG_TEMP;
|
|
|
|
quirk.type |= QUIRK_TYPE_TEMP;
|
|
|
|
quirk.process = amd_k8_revfg_temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------------------------------
|
|
|
|
// -- AMD K10 CPUs Temp workaround (Errata #319) --
|
|
|
|
// ------------------------------------------------
|
|
|
|
// Some AMD K10 CPUs on Socket AM2+/F have buggued thermal diode leading
|
|
|
|
// to inaccurate temperature measurements. Affected steppings: DR-BA/B2/B3, RB-C2 & HY-D0.
|
|
|
|
if (cpuid_info.vendor_id.str[0] == 'A' && cpuid_info.version.family == 0xF
|
|
|
|
&& cpuid_info.version.extendedFamily == 1 && cpuid_info.version.extendedModel == 0) { // AMD K10
|
|
|
|
|
|
|
|
uint8_t pkg_type = (cpuid_info.version.extendedBrandID >> 28) & 0x0F;
|
|
|
|
uint32_t dct0_high = pci_config_read32(0, 24, 2, 0x94); // 0x94[8] = 1 for DDR3
|
|
|
|
|
|
|
|
if (pkg_type == 0b0000 || (pkg_type == 0b0001 && (((dct0_high >> 8) & 1) == 0))) { // Socket F or AM2+ (exclude AM3)
|
|
|
|
|
|
|
|
if (cpuid_info.version.model < 4 || // DR-BA, DR-B2 & DR-B3
|
|
|
|
(cpuid_info.version.model == 4 && cpuid_info.version.stepping <= 2) || // RB-C2
|
|
|
|
cpuid_info.version.model == 8) { // HY-D0
|
|
|
|
|
|
|
|
quirk.id = QUIRK_AMD_ERRATA_319;
|
|
|
|
quirk.type |= QUIRK_TYPE_TEMP;
|
|
|
|
quirk.process = disable_temp_reporting;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Add LoongArch support (#410)
* lib/assert: Add LoongArch assert support
Added LoongArch break 3 assert instruction.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/barrier: Add barrier method for LoongArch
Added LoongArch barriers in barrier_spin_wait and barrier_halt_wait
functions.
Signed-off-by: Chao Li <lichao@loognson.cn>
* lib/spinlock: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/string: Make LoongArch use the string function in the file
Since LoongArch GCC doesn't have built-in string functions, use the
string function instance in the sting.c
Signed-off-by: Chao Li <lichao@loongson.cn>
* lib/unistd: Add LoongArch CPU pause
Because the LoongArch haven't pause instruction, using eight nops to
replace the pause.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/acpi: Reduce the way of search RSDP for non-x86 ARCHs
Searching RSDP from legacy BIOS EDBA and reserved areas is available
only on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cache: Add LoongArch64 cache operations support
Added cache operations support for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/cpuid: Add the compile limit
Make the `cpuid` function action only on i386/x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/heap: Add heap support for LoongArch64
LoongArch64 uses the low 256MB as the low memory.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add 8-bit and 16-bit memory operations
Added 8-bit and 16-bit memory access operations, which 8-bit uses
`movb` and 16-bit is `movw`.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/memrw: Add LoongArch memory access operations
Added 8/16/32/64-bit memory access operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add Loongson PCI vendor ID and Loongson 7A chipset EHCI workaround
1. Added Loongson PCI vendor ID.
2. Added Loongson 7A chipset ECHI workaround.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/io: Add LoongArch64 IO port operations
Added IO port operations for LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/reloc64: Add LoongArch64 relocations support
Added R_LARCH_RELATIVE and R_LARCH_NONE relocations support for
LoongArch64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/serial: Add Loongson CPU serial port support
Add the serial port address perfix of Loongson CPU and obtain serial
port clock method.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smbus: Rename smbus.c to i2c_x86.c
Renamed the smbus.c to i2c_x86.c in i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/smp: Add LoongArch SMP support
Added LoongArch multi-core support and a way of map to node numbers if
the NUMA is enabled.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/timers: Add LoongArch supports
In LoongArch, there is a stable counter that is independent of other
clocks, it like the TSC in x64. Using it to count the ticks per
millisecond.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/tsc: Add LoongArch support
Usually the frequency of stable counter is not same to CPU frequency, so
using the performance counter for the delay operations.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add LoongArch MMIO perfix
Added LoongArch64 MMIO address perfix, use for address the PCI memory
space.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/usbhcd: Add Loongson 7A2000 chipset OHCI BAR offset fix
If the BAR address is not fixed for the Loongson 7A2000 OHCI controller,
some prots will not be usable, This change currently only affects the
LoongArch platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to IO access via MMIO
Usually, it is access the IO like PCI IO via MMIO on non-X86 ARCHs, so
a method to access IO via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system: Add the way to access PCI memory space via MMIO
Some uniformly address ARCHs access the PCI memory depended the MMIO, so
the method to access PCI memory via MMIO is added.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app: Add LoongArch version support
Reduced the version field by two characters to support ARCH name
abbreviations with more than three characters, and added "la64" ARCH
version display.
Singed-off-by: Chao Li <lichao@loongson.cn>
* test/block_move: Add block move test via ASM for LoongArch
Add block move test inline assembly instance for LoongArch.
Signed-off-by: Chao Li <lichao@loongson.cn>
* test/mov_inv_fixed: Add LoongArch ASM version word write operation
Add LoongArch ASM version word write cycle if it uses the HAND_OPTIMISED.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Adjust the AP stack size for LoongArch
LoongArch exception will store all of the GP, FP and CSR on stack, it
need more stack size, make LoongArch AP using 2KB stack size.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efisetup: Add LoongArch CPU halt instruction
Add "idle 0" for LoongArch
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot/efi: Limiting the ms_abi using scope
Make the ms_abi only work on i386 and x64.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/imc/loongson: Add Loongson LoongArch IMC support
Added the Loongson LoongArch CPU IMC instance, support read out the IMC
sequence, currently only supports reading MC0.
Signed-off-by: Chao Li <lichao@loongson.cn>
* app/loongarch: Add intrrupt handler for LoongArch
Added the LoongArch IRQ handler support.
Signed-off-by: Chao Li <lichao@loongson.cn>
* system/loongarch: Add LoongArch ARCH specific files
Added LoongArch ARCH specific files: cpuid.c, cpuinfo.c, hwctrl.c,
memctrl.c, temperature.c, vmem.c, registers.h
They use the same pubilc API for i386 and x64 platforms.
Signed-off-by: Chao Li <lichao@loongson.cn>
* boot: Add LoongArch startup and header
Added the header.S and startup64.S for LoongArch, CPU works on:
1. Page mode.
2. Load and store is cacheable.
3. Instructions is cacheable.
4. DMWn 0 and 1 is used.
5. To access non-cacheable areas, use the perfix 0x8000000000000000.
Signed-off Chao Li <lichao@loongson.cn>
* build64/la64: Add LoongArch64 build files
Add infrastructure files to build memtest86 plus for LoongArch64
platform.
Signed-off-by: Chao Li <lichao@loongson.cn>
* workflows: Add LoongArch64 CI supports
Adjust workflow logci, remvoe 32 and 64 wordsize, replace with "i386,
x86_64 and la64", add LoongArch64 build CI check.
Signed-off-by: Chao Li <lichao@loongson.cn>
---------
Signed-off-by: Chao Li <lichao@loongson.cn>
Signed-off-by: Chao Li <lichao@loognson.cn>
2024-08-30 19:38:46 +08:00
|
|
|
|
|
|
|
// -----------------------------------------------------------
|
|
|
|
// -- Loongson 7A1000 and 7A2000 chipset USB 2.0 workaround --
|
|
|
|
// -----------------------------------------------------------
|
|
|
|
if (quirk.root_vid == PCI_VID_LOONGSON && quirk.root_did == 0x7a00) {
|
|
|
|
quirk.id = QUIRK_LOONGSON7A00_EHCI_WORKARD;
|
|
|
|
quirk.type |= QUIRK_TYPE_USB;
|
|
|
|
quirk.process = loongson_7a00_ehci_workaround;
|
|
|
|
}
|
2022-05-20 13:23:25 +02:00
|
|
|
}
|