arch/x86: Wrap lines at 80 columns
Fix the following warning detected by checkpatch.pl: WARNING: line over 80 characters TEST=Build and run on Galileo Gen2 Change-Id: I3495cd30d1737d9ee728c8a9e72bd426d7a69c37 Signed-off-by: Lee Leahy <Leroy.P.Leahy@intel.com> Reviewed-on: https://review.coreboot.org/18864 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
e5f29e8bf8
commit
6f80ccc357
|
@ -6,7 +6,8 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 SUSE LINUX AG
|
* Copyright (C) 2004 SUSE LINUX AG
|
||||||
* Copyright (C) 2005-2009 coresystems GmbH
|
* Copyright (C) 2005-2009 coresystems GmbH
|
||||||
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
|
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
|
||||||
|
* Raptor Engineering
|
||||||
* Copyright (C) 2016 Siemens AG
|
* Copyright (C) 2016 Siemens AG
|
||||||
*
|
*
|
||||||
* ACPI FADT, FACS, and DSDT table support added by
|
* ACPI FADT, FACS, and DSDT table support added by
|
||||||
|
@ -589,7 +590,8 @@ void acpi_create_hpet(acpi_hpet_t *hpet)
|
||||||
|
|
||||||
void acpi_create_vfct(struct device *device,
|
void acpi_create_vfct(struct device *device,
|
||||||
struct acpi_vfct *vfct,
|
struct acpi_vfct *vfct,
|
||||||
unsigned long (*acpi_fill_vfct)(struct device *device, struct acpi_vfct *vfct_struct, unsigned long current))
|
unsigned long (*acpi_fill_vfct)(struct device *device,
|
||||||
|
struct acpi_vfct *vfct_struct, unsigned long current))
|
||||||
{
|
{
|
||||||
acpi_header_t *header = &(vfct->header);
|
acpi_header_t *header = &(vfct->header);
|
||||||
unsigned long current = (unsigned long)vfct + sizeof(struct acpi_vfct);
|
unsigned long current = (unsigned long)vfct + sizeof(struct acpi_vfct);
|
||||||
|
@ -613,7 +615,8 @@ void acpi_create_vfct(struct device *device,
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
|
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
|
||||||
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t *ivrs_struct, unsigned long current))
|
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t *ivrs_struct,
|
||||||
|
unsigned long current))
|
||||||
{
|
{
|
||||||
acpi_header_t *header = &(ivrs->header);
|
acpi_header_t *header = &(ivrs->header);
|
||||||
unsigned long current = (unsigned long)ivrs + sizeof(acpi_ivrs_t);
|
unsigned long current = (unsigned long)ivrs + sizeof(acpi_ivrs_t);
|
||||||
|
@ -636,7 +639,8 @@ void acpi_create_ivrs(acpi_ivrs_t *ivrs,
|
||||||
header->checksum = acpi_checksum((void *)ivrs, header->length);
|
header->checksum = acpi_checksum((void *)ivrs, header->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long acpi_write_hpet(device_t device, unsigned long current, acpi_rsdp_t *rsdp)
|
unsigned long acpi_write_hpet(device_t device, unsigned long current,
|
||||||
|
acpi_rsdp_t *rsdp)
|
||||||
{
|
{
|
||||||
acpi_hpet_t *hpet;
|
acpi_hpet_t *hpet;
|
||||||
|
|
||||||
|
@ -737,7 +741,8 @@ static void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt,
|
||||||
rsdp->ext_checksum = acpi_checksum((void *)rsdp, sizeof(acpi_rsdp_t));
|
rsdp->ext_checksum = acpi_checksum((void *)rsdp, sizeof(acpi_rsdp_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest, acpi_hest_esd_t *esd, u16 type, void *data, u16 data_len)
|
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest,
|
||||||
|
acpi_hest_esd_t *esd, u16 type, void *data, u16 data_len)
|
||||||
{
|
{
|
||||||
acpi_header_t *header = &(hest->header);
|
acpi_header_t *header = &(hest->header);
|
||||||
acpi_hest_hen_t *hen;
|
acpi_hest_hen_t *hen;
|
||||||
|
@ -765,7 +770,7 @@ unsigned long acpi_create_hest_error_source(acpi_hest_t *hest, acpi_hest_esd_t *
|
||||||
memset(pos, 0, sizeof(acpi_hest_hen_t));
|
memset(pos, 0, sizeof(acpi_hest_hen_t));
|
||||||
hen->type = 3; /* SCI? */
|
hen->type = 3; /* SCI? */
|
||||||
hen->length = sizeof(acpi_hest_hen_t);
|
hen->length = sizeof(acpi_hest_hen_t);
|
||||||
hen->conf_we = 0; /* Configuration Write Enable. */
|
hen->conf_we = 0; /* Configuration Write Enable. */
|
||||||
hen->poll_interval = 0;
|
hen->poll_interval = 0;
|
||||||
hen->vector = 0;
|
hen->vector = 0;
|
||||||
hen->sw2poll_threshold_val = 0;
|
hen->sw2poll_threshold_val = 0;
|
||||||
|
@ -1024,7 +1029,8 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
for (dev = all_devices; dev; dev = dev->next) {
|
for (dev = all_devices; dev; dev = dev->next) {
|
||||||
if (dev->ops && dev->ops->write_acpi_tables) {
|
if (dev->ops && dev->ops->write_acpi_tables) {
|
||||||
current = dev->ops->write_acpi_tables(dev, current, rsdp);
|
current = dev->ops->write_acpi_tables(dev, current,
|
||||||
|
rsdp);
|
||||||
current = acpi_align_current(current);
|
current = acpi_align_current(current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,8 @@ static int backup_create_or_update(struct resume_backup *backup_mem,
|
||||||
|
|
||||||
/* Allocate backup with room for header. */
|
/* Allocate backup with room for header. */
|
||||||
if (!backup_mem) {
|
if (!backup_mem) {
|
||||||
size_t header_sz = ALIGN_UP(sizeof(*backup_mem), BACKUP_PAGE_SZ);
|
size_t header_sz = ALIGN_UP(sizeof(*backup_mem),
|
||||||
|
BACKUP_PAGE_SZ);
|
||||||
backup_mem = cbmem_add(CBMEM_ID_RESUME, header_sz + size);
|
backup_mem = cbmem_add(CBMEM_ID_RESUME, header_sz + size);
|
||||||
if (!backup_mem)
|
if (!backup_mem)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -126,7 +127,8 @@ void *acpi_backup_container(uintptr_t base, size_t size)
|
||||||
if (!backup_mem)
|
if (!backup_mem)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!IS_ALIGNED(base, BACKUP_PAGE_SZ) || !IS_ALIGNED(size, BACKUP_PAGE_SZ))
|
if (!IS_ALIGNED(base, BACKUP_PAGE_SZ) || !IS_ALIGNED(size,
|
||||||
|
BACKUP_PAGE_SZ))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (backup_create_or_update(backup_mem, base, size) < 0)
|
if (backup_create_or_update(backup_mem, base, size) < 0)
|
||||||
|
@ -158,7 +160,8 @@ void backup_ramstage_section(uintptr_t base, size_t size)
|
||||||
|
|
||||||
/* Back up the OS-controlled memory where ramstage will be loaded. */
|
/* Back up the OS-controlled memory where ramstage will be loaded. */
|
||||||
memcpy((void *)(uintptr_t)backup_mem->cbmem,
|
memcpy((void *)(uintptr_t)backup_mem->cbmem,
|
||||||
(void *)(uintptr_t)backup_mem->lowmem, (size_t)backup_mem->size);
|
(void *)(uintptr_t)backup_mem->lowmem,
|
||||||
|
(size_t)backup_mem->size);
|
||||||
backup_mem->valid = 1;
|
backup_mem->valid = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +178,8 @@ void acpi_prepare_for_resume(void)
|
||||||
|
|
||||||
/* Back up the OS-controlled memory where ramstage will be loaded. */
|
/* Back up the OS-controlled memory where ramstage will be loaded. */
|
||||||
memcpy((void *)(uintptr_t)backup_mem->cbmem,
|
memcpy((void *)(uintptr_t)backup_mem->cbmem,
|
||||||
(void *)(uintptr_t)backup_mem->lowmem, (size_t)backup_mem->size);
|
(void *)(uintptr_t)backup_mem->lowmem,
|
||||||
|
(size_t)backup_mem->size);
|
||||||
backup_mem->valid = 1;
|
backup_mem->valid = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* This file is part of the coreboot project.
|
* This file is part of the coreboot project.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
|
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
|
||||||
|
* Raptor Engineering
|
||||||
* Copyright (C) 2009 Rudolf Marek <r.marek@assembler.cz>
|
* Copyright (C) 2009 Rudolf Marek <r.marek@assembler.cz>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -494,12 +495,18 @@ void acpigen_write_empty_PCT(void)
|
||||||
})
|
})
|
||||||
*/
|
*/
|
||||||
static char stream[] = {
|
static char stream[] = {
|
||||||
0x08, 0x5F, 0x50, 0x43, 0x54, 0x12, 0x2C, /* 00000030 "0._PCT.," */
|
/* 00000030 "0._PCT.," */
|
||||||
0x02, 0x11, 0x14, 0x0A, 0x11, 0x82, 0x0C, 0x00, /* 00000038 "........" */
|
0x08, 0x5F, 0x50, 0x43, 0x54, 0x12, 0x2C,
|
||||||
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000040 "........" */
|
/* 00000038 "........" */
|
||||||
0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x11, 0x14, /* 00000048 "....y..." */
|
0x02, 0x11, 0x14, 0x0A, 0x11, 0x82, 0x0C, 0x00,
|
||||||
0x0A, 0x11, 0x82, 0x0C, 0x00, 0x7F, 0x00, 0x00, /* 00000050 "........" */
|
/* 00000040 "........" */
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000058 "........" */
|
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* 00000048 "....y..." */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x11, 0x14,
|
||||||
|
/* 00000050 "........" */
|
||||||
|
0x0A, 0x11, 0x82, 0x0C, 0x00, 0x7F, 0x00, 0x00,
|
||||||
|
/* 00000058 "........" */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x79, 0x00
|
0x00, 0x79, 0x00
|
||||||
};
|
};
|
||||||
acpigen_emit_stream(stream, ARRAY_SIZE(stream));
|
acpigen_emit_stream(stream, ARRAY_SIZE(stream));
|
||||||
|
@ -713,7 +720,8 @@ void acpigen_write_CST_package(acpi_cstate_t *cstate, int nentries)
|
||||||
acpigen_pop_len();
|
acpigen_pop_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpigen_write_CSD_package(u32 domain, u32 numprocs, CSD_coord coordtype, u32 index)
|
void acpigen_write_CSD_package(u32 domain, u32 numprocs, CSD_coord coordtype,
|
||||||
|
u32 index)
|
||||||
{
|
{
|
||||||
acpigen_write_name("_CSD");
|
acpigen_write_name("_CSD");
|
||||||
acpigen_write_package(1);
|
acpigen_write_package(1);
|
||||||
|
|
|
@ -132,9 +132,13 @@ static void jmp_payload(void *entry, unsigned long buffer, unsigned long size)
|
||||||
" shrl $2, %%ecx\n\t"
|
" shrl $2, %%ecx\n\t"
|
||||||
" rep movsl\n\t"
|
" rep movsl\n\t"
|
||||||
|
|
||||||
/* Adjust the stack pointer to point into the new coreboot image */
|
/* Adjust the stack pointer to point into the new coreboot
|
||||||
|
* image
|
||||||
|
*/
|
||||||
" addl 20(%%esp), %%esp\n\t"
|
" addl 20(%%esp), %%esp\n\t"
|
||||||
/* Adjust the instruction pointer to point into the new coreboot image */
|
/* Adjust the instruction pointer to point into the new coreboot
|
||||||
|
* image
|
||||||
|
*/
|
||||||
" movl $1f, %%eax\n\t"
|
" movl $1f, %%eax\n\t"
|
||||||
" addl 20(%%esp), %%eax\n\t"
|
" addl 20(%%esp), %%eax\n\t"
|
||||||
" jmp *%%eax\n\t"
|
" jmp *%%eax\n\t"
|
||||||
|
@ -166,10 +170,14 @@ static void jmp_payload(void *entry, unsigned long buffer, unsigned long size)
|
||||||
" shrl $2, %%ecx\n\t"
|
" shrl $2, %%ecx\n\t"
|
||||||
" rep movsl\n\t"
|
" rep movsl\n\t"
|
||||||
|
|
||||||
/* Adjust the stack pointer to point into the old coreboot image */
|
/* Adjust the stack pointer to point into the old coreboot
|
||||||
|
* image
|
||||||
|
*/
|
||||||
" subl 20(%%esp), %%esp\n\t"
|
" subl 20(%%esp), %%esp\n\t"
|
||||||
|
|
||||||
/* Adjust the instruction pointer to point into the old coreboot image */
|
/* Adjust the instruction pointer to point into the old coreboot
|
||||||
|
* image
|
||||||
|
*/
|
||||||
" movl $1f, %%eax\n\t"
|
" movl $1f, %%eax\n\t"
|
||||||
" subl 20(%%esp), %%eax\n\t"
|
" subl 20(%%esp), %%eax\n\t"
|
||||||
" jmp *%%eax\n\t"
|
" jmp *%%eax\n\t"
|
||||||
|
|
|
@ -349,7 +349,9 @@ gdt:
|
||||||
|
|
||||||
/* selgdt 0x10, flat code segment */
|
/* selgdt 0x10, flat code segment */
|
||||||
.word 0xffff, 0x0000
|
.word 0xffff, 0x0000
|
||||||
.byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
|
.byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for
|
||||||
|
* limit
|
||||||
|
*/
|
||||||
|
|
||||||
/* selgdt 0x18, flat data segment */
|
/* selgdt 0x18, flat data segment */
|
||||||
.word 0xffff, 0x0000
|
.word 0xffff, 0x0000
|
||||||
|
@ -377,11 +379,15 @@ gdt:
|
||||||
|
|
||||||
/* selgdt 0x38, flat data segment 16 bit */
|
/* selgdt 0x38, flat data segment 16 bit */
|
||||||
.word 0x0000, 0x0000 /* dummy */
|
.word 0x0000, 0x0000 /* dummy */
|
||||||
.byte 0x00, 0x93, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
|
.byte 0x00, 0x93, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for
|
||||||
|
* limit
|
||||||
|
*/
|
||||||
|
|
||||||
/* selgdt 0x40, flat code segment 16 bit */
|
/* selgdt 0x40, flat code segment 16 bit */
|
||||||
.word 0xffff, 0x0000
|
.word 0xffff, 0x0000
|
||||||
.byte 0x00, 0x9b, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
|
.byte 0x00, 0x9b, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for
|
||||||
|
* limit
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
/* selgdt 0x48, flat x64 code segment */
|
/* selgdt 0x48, flat x64 code segment */
|
||||||
|
@ -407,14 +413,16 @@ SetCodeSelector:
|
||||||
# use iret to jump to a 64-bit offset in a new code segment
|
# use iret to jump to a 64-bit offset in a new code segment
|
||||||
# iret will pop cs:rip, flags, then ss:rsp
|
# iret will pop cs:rip, flags, then ss:rsp
|
||||||
mov %ss, %ax # need to push ss..
|
mov %ss, %ax # need to push ss..
|
||||||
push %rax # push ss instuction not valid in x64 mode, so use ax
|
push %rax # push ss instuction not valid in x64 mode,
|
||||||
|
# so use ax
|
||||||
push %rsp
|
push %rsp
|
||||||
pushfq
|
pushfq
|
||||||
push %rcx # cx is code segment selector from caller
|
push %rcx # cx is code segment selector from caller
|
||||||
mov $setCodeSelectorLongJump, %rax
|
mov $setCodeSelectorLongJump, %rax
|
||||||
push %rax
|
push %rax
|
||||||
|
|
||||||
# the iret will continue at next instruction, with the new cs value loaded
|
# the iret will continue at next instruction, with the new cs value
|
||||||
|
# loaded
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
setCodeSelectorLongJump:
|
setCodeSelectorLongJump:
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
#if !defined(__PRE_RAM__)
|
#if !defined(__PRE_RAM__)
|
||||||
void __attribute__((weak)) backup_top_of_ram(uint64_t ramtop)
|
void __attribute__((weak)) backup_top_of_ram(uint64_t ramtop)
|
||||||
{
|
{
|
||||||
/* Do nothing. Chipset may have implementation to save ramtop in NVRAM. */
|
/* Do nothing. Chipset may have implementation to save ramtop in NVRAM.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *ramtop_pointer;
|
static void *ramtop_pointer;
|
||||||
|
|
|
@ -316,7 +316,9 @@ static int get_packet(char *buffer)
|
||||||
|
|
||||||
/* Wishlit implement a timeout in get_packet */
|
/* Wishlit implement a timeout in get_packet */
|
||||||
do {
|
do {
|
||||||
/* wait around for the start character, ignore all other characters */
|
/* wait around for the start character, ignore all other
|
||||||
|
* characters
|
||||||
|
*/
|
||||||
while ((ch = (stub_getc() & 0x7f)) != '$');
|
while ((ch = (stub_getc() & 0x7f)) != '$');
|
||||||
checksum = 0;
|
checksum = 0;
|
||||||
xmitcsum = -1;
|
xmitcsum = -1;
|
||||||
|
@ -417,10 +419,12 @@ void x86_exception(struct eregs *info)
|
||||||
out_buffer[3] = '\0';
|
out_buffer[3] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'g': /* return the value of the CPU registers */
|
case 'g': /* return the value of the CPU registers */
|
||||||
copy_to_hex(out_buffer, &gdb_stub_registers, sizeof(gdb_stub_registers));
|
copy_to_hex(out_buffer, &gdb_stub_registers,
|
||||||
|
sizeof(gdb_stub_registers));
|
||||||
break;
|
break;
|
||||||
case 'G': /* set the value of the CPU registers - return OK */
|
case 'G': /* set the value of the CPU registers - return OK */
|
||||||
copy_from_hex(&gdb_stub_registers, in_buffer + 1, sizeof(gdb_stub_registers));
|
copy_from_hex(&gdb_stub_registers, in_buffer + 1,
|
||||||
|
sizeof(gdb_stub_registers));
|
||||||
memcpy(info, gdb_stub_registers, 8*sizeof(uint32_t));
|
memcpy(info, gdb_stub_registers, 8*sizeof(uint32_t));
|
||||||
info->eip = gdb_stub_registers[PC];
|
info->eip = gdb_stub_registers[PC];
|
||||||
info->cs = gdb_stub_registers[CS];
|
info->cs = gdb_stub_registers[CS];
|
||||||
|
@ -438,7 +442,9 @@ void x86_exception(struct eregs *info)
|
||||||
memcpy(out_buffer, "E01", 4);
|
memcpy(out_buffer, "E01", 4);
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
|
/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA
|
||||||
|
* return OK
|
||||||
|
*/
|
||||||
ptr = &in_buffer[1];
|
ptr = &in_buffer[1];
|
||||||
if (parse_ulong(&ptr, &addr) &&
|
if (parse_ulong(&ptr, &addr) &&
|
||||||
(*(ptr++) == ',') &&
|
(*(ptr++) == ',') &&
|
||||||
|
@ -451,8 +457,9 @@ void x86_exception(struct eregs *info)
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
case 'c':
|
case 'c':
|
||||||
/* cAA..AA Continue at address AA..AA(optional) */
|
/* cAA..AA Continue at address AA..AA(optional)
|
||||||
/* sAA..AA Step one instruction from AA..AA(optional) */
|
* sAA..AA Step one instruction from AA..AA(optional)
|
||||||
|
*/
|
||||||
ptr = &in_buffer[1];
|
ptr = &in_buffer[1];
|
||||||
if (parse_ulong(&ptr, &addr))
|
if (parse_ulong(&ptr, &addr))
|
||||||
info->eip = addr;
|
info->eip = addr;
|
||||||
|
|
|
@ -23,9 +23,15 @@ vendor:
|
||||||
.asciz CONFIG_MAINBOARD_VENDOR
|
.asciz CONFIG_MAINBOARD_VENDOR
|
||||||
part:
|
part:
|
||||||
.asciz CONFIG_MAINBOARD_PART_NUMBER
|
.asciz CONFIG_MAINBOARD_PART_NUMBER
|
||||||
.long __id_end + CONFIG_ID_SECTION_OFFSET - ver /* Reverse offset to the vendor id */
|
.long __id_end + CONFIG_ID_SECTION_OFFSET - ver /* Reverse offset to the
|
||||||
.long __id_end + CONFIG_ID_SECTION_OFFSET - vendor /* Reverse offset to the vendor id */
|
*vendor id
|
||||||
.long __id_end + CONFIG_ID_SECTION_OFFSET - part /* Reverse offset to the part number */
|
*/
|
||||||
|
.long __id_end + CONFIG_ID_SECTION_OFFSET - vendor /* Reverse offset to the
|
||||||
|
* vendor id
|
||||||
|
*/
|
||||||
|
.long __id_end + CONFIG_ID_SECTION_OFFSET - part /* Reverse offset to the
|
||||||
|
* part number
|
||||||
|
*/
|
||||||
.long CONFIG_ROM_SIZE /* Size of this romimage */
|
.long CONFIG_ROM_SIZE /* Size of this romimage */
|
||||||
.globl __id_end
|
.globl __id_end
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
* Copyright (C) 2004 SUSE LINUX AG
|
* Copyright (C) 2004 SUSE LINUX AG
|
||||||
* Copyright (C) 2004 Nick Barker
|
* Copyright (C) 2004 Nick Barker
|
||||||
* Copyright (C) 2008-2009 coresystems GmbH
|
* Copyright (C) 2008-2009 coresystems GmbH
|
||||||
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
|
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
|
||||||
|
* Raptor Engineering
|
||||||
* Copyright (C) 2016 Siemens AG
|
* Copyright (C) 2016 Siemens AG
|
||||||
* (Written by Stefan Reinauer <stepan@coresystems.de>)
|
* (Written by Stefan Reinauer <stepan@coresystems.de>)
|
||||||
*
|
*
|
||||||
|
@ -85,8 +86,9 @@ typedef struct acpi_gen_regaddr {
|
||||||
u8 bit_width; /* Register size in bits */
|
u8 bit_width; /* Register size in bits */
|
||||||
u8 bit_offset; /* Register bit offset */
|
u8 bit_offset; /* Register bit offset */
|
||||||
union {
|
union {
|
||||||
u8 resv; /* Reserved in ACPI 2.0 - 2.0b */
|
u8 resv; /* Reserved in ACPI 2.0 - 2.0b */
|
||||||
u8 access_size; /* Access size in ACPI 2.0c/3.0/4.0/5.0 */
|
u8 access_size; /* Access size in ACPI 2.0c/3.0/4.0/5.0
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
u32 addrl; /* Register address, low 32 bits */
|
u32 addrl; /* Register address, low 32 bits */
|
||||||
u32 addrh; /* Register address, high 32 bits */
|
u32 addrh; /* Register address, high 32 bits */
|
||||||
|
@ -109,7 +111,7 @@ typedef struct acpi_gen_regaddr {
|
||||||
/* 0xc0-0xff: OEM defined */
|
/* 0xc0-0xff: OEM defined */
|
||||||
|
|
||||||
/* Access size definitions for Generic address structure */
|
/* Access size definitions for Generic address structure */
|
||||||
#define ACPI_ACCESS_SIZE_UNDEFINED 0 /* Undefined (legacy reasons) */
|
#define ACPI_ACCESS_SIZE_UNDEFINED 0 /* Undefined (legacy reasons) */
|
||||||
#define ACPI_ACCESS_SIZE_BYTE_ACCESS 1
|
#define ACPI_ACCESS_SIZE_BYTE_ACCESS 1
|
||||||
#define ACPI_ACCESS_SIZE_WORD_ACCESS 2
|
#define ACPI_ACCESS_SIZE_WORD_ACCESS 2
|
||||||
#define ACPI_ACCESS_SIZE_DWORD_ACCESS 3
|
#define ACPI_ACCESS_SIZE_DWORD_ACCESS 3
|
||||||
|
@ -206,7 +208,9 @@ typedef struct acpi_srat_mem {
|
||||||
u32 length_low; /* Mem range length, low */
|
u32 length_low; /* Mem range length, low */
|
||||||
u32 length_high; /* Mem range length, high */
|
u32 length_high; /* Mem range length, high */
|
||||||
u32 resv1;
|
u32 resv1;
|
||||||
u32 flags; /* Enable bit 0, hot pluggable bit 1; Non Volatile bit 2, other bits reserved to 0 */
|
u32 flags; /* Enable bit 0, hot pluggable bit 1; Non Volatile bit 2,
|
||||||
|
* other bits reserved to 0
|
||||||
|
*/
|
||||||
u32 resv2[2];
|
u32 resv2[2];
|
||||||
} __attribute__ ((packed)) acpi_srat_mem_t;
|
} __attribute__ ((packed)) acpi_srat_mem_t;
|
||||||
|
|
||||||
|
@ -551,7 +555,9 @@ typedef struct acpi_hest_esd {
|
||||||
u16 resv;
|
u16 resv;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 enabled;
|
u8 enabled;
|
||||||
u32 prealloc_erecords; /* The number of error records to pre-allocate for this error source. */
|
u32 prealloc_erecords; /* The number of error records to
|
||||||
|
* pre-allocate for this error source.
|
||||||
|
*/
|
||||||
u32 max_section_per_record;
|
u32 max_section_per_record;
|
||||||
} __attribute__ ((packed)) acpi_hest_esd_t;
|
} __attribute__ ((packed)) acpi_hest_esd_t;
|
||||||
|
|
||||||
|
@ -635,11 +641,13 @@ void acpi_create_vfct(struct device *device,
|
||||||
unsigned long current));
|
unsigned long current));
|
||||||
|
|
||||||
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
|
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
|
||||||
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t *ivrs_struct, unsigned long current));
|
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t *ivrs_struct,
|
||||||
|
unsigned long current));
|
||||||
|
|
||||||
#if ENV_RAMSTAGE && !defined(__SIMPLE_DEVICE__)
|
#if ENV_RAMSTAGE && !defined(__SIMPLE_DEVICE__)
|
||||||
void acpi_create_hpet(acpi_hpet_t *hpet);
|
void acpi_create_hpet(acpi_hpet_t *hpet);
|
||||||
unsigned long acpi_write_hpet(device_t device, unsigned long start, acpi_rsdp_t *rsdp);
|
unsigned long acpi_write_hpet(device_t device, unsigned long start,
|
||||||
|
acpi_rsdp_t *rsdp);
|
||||||
|
|
||||||
/* cpu/intel/speedstep/acpi.c */
|
/* cpu/intel/speedstep/acpi.c */
|
||||||
void generate_cpu_entries(device_t device);
|
void generate_cpu_entries(device_t device);
|
||||||
|
@ -670,7 +678,8 @@ unsigned long acpi_create_dmar_drhd_ds_msi_hpet(unsigned long current,
|
||||||
void acpi_write_hest(acpi_hest_t *hest,
|
void acpi_write_hest(acpi_hest_t *hest,
|
||||||
unsigned long (*acpi_fill_hest)(acpi_hest_t *hest));
|
unsigned long (*acpi_fill_hest)(acpi_hest_t *hest));
|
||||||
|
|
||||||
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest, acpi_hest_esd_t *esd, u16 type, void *data, u16 len);
|
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest,
|
||||||
|
acpi_hest_esd_t *esd, u16 type, void *data, u16 len);
|
||||||
|
|
||||||
void acpi_save_gnvs(u32 gnvs_address);
|
void acpi_save_gnvs(u32 gnvs_address);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
* This file is part of the coreboot project.
|
* This file is part of the coreboot project.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Rudolf Marek <r.marek@assembler.cz>
|
* Copyright (C) 2009 Rudolf Marek <r.marek@assembler.cz>
|
||||||
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
|
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
|
||||||
|
* Raptor Engineering
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -203,14 +204,15 @@ void acpigen_write_empty_PTC(void);
|
||||||
void acpigen_write_PRW(u32 wake, u32 level);
|
void acpigen_write_PRW(u32 wake, u32 level);
|
||||||
void acpigen_write_STA(uint8_t status);
|
void acpigen_write_STA(uint8_t status);
|
||||||
void acpigen_write_TPC(const char *gnvs_tpc_limit);
|
void acpigen_write_TPC(const char *gnvs_tpc_limit);
|
||||||
void acpigen_write_PSS_package(u32 coreFreq, u32 power, u32 transLat, u32 busmLat,
|
void acpigen_write_PSS_package(u32 coreFreq, u32 power, u32 transLat,
|
||||||
u32 control, u32 status);
|
u32 busmLat, u32 control, u32 status);
|
||||||
typedef enum { SW_ALL = 0xfc, SW_ANY = 0xfd, HW_ALL = 0xfe } PSD_coord;
|
typedef enum { SW_ALL = 0xfc, SW_ANY = 0xfd, HW_ALL = 0xfe } PSD_coord;
|
||||||
void acpigen_write_PSD_package(u32 domain, u32 numprocs, PSD_coord coordtype);
|
void acpigen_write_PSD_package(u32 domain, u32 numprocs, PSD_coord coordtype);
|
||||||
void acpigen_write_CST_package_entry(acpi_cstate_t *cstate);
|
void acpigen_write_CST_package_entry(acpi_cstate_t *cstate);
|
||||||
void acpigen_write_CST_package(acpi_cstate_t *entry, int nentries);
|
void acpigen_write_CST_package(acpi_cstate_t *entry, int nentries);
|
||||||
typedef enum { CSD_HW_ALL = 0xfe } CSD_coord;
|
typedef enum { CSD_HW_ALL = 0xfe } CSD_coord;
|
||||||
void acpigen_write_CSD_package(u32 domain, u32 numprocs, CSD_coord coordtype, u32 index);
|
void acpigen_write_CSD_package(u32 domain, u32 numprocs, CSD_coord coordtype,
|
||||||
|
u32 index);
|
||||||
void acpigen_write_processor(u8 cpuindex, u32 pblock_addr, u8 pblock_len);
|
void acpigen_write_processor(u8 cpuindex, u32 pblock_addr, u8 pblock_len);
|
||||||
void acpigen_write_TSS_package(int entries, acpi_tstate_t *tstate_list);
|
void acpigen_write_TSS_package(int entries, acpi_tstate_t *tstate_list);
|
||||||
void acpigen_write_TSD_package(u32 domain, u32 numprocs, PSD_coord coordtype);
|
void acpigen_write_TSD_package(u32 domain, u32 numprocs, PSD_coord coordtype);
|
||||||
|
|
|
@ -49,8 +49,10 @@ static void bootblock_mainboard_init(void)
|
||||||
#if CONFIG_USE_OPTION_TABLE
|
#if CONFIG_USE_OPTION_TABLE
|
||||||
static void sanitize_cmos(void)
|
static void sanitize_cmos(void)
|
||||||
{
|
{
|
||||||
if (cmos_error() || !cmos_chksum_valid() || IS_ENABLED(CONFIG_STATIC_OPTION_TABLE)) {
|
if (cmos_error() || !cmos_chksum_valid()
|
||||||
unsigned char *cmos_default = (unsigned char *)walkcbfs("cmos.default");
|
|| IS_ENABLED(CONFIG_STATIC_OPTION_TABLE)) {
|
||||||
|
unsigned char *cmos_default =
|
||||||
|
(unsigned char *)walkcbfs("cmos.default");
|
||||||
if (cmos_default) {
|
if (cmos_default) {
|
||||||
int i;
|
int i;
|
||||||
cmos_disable_rtc();
|
cmos_disable_rtc();
|
||||||
|
|
|
@ -27,7 +27,8 @@ static struct cbfs_file *walkcbfs_head(char *target)
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"mov $1f, %%esp\n\t"
|
"mov $1f, %%esp\n\t"
|
||||||
"jmp walkcbfs_asm\n\t"
|
"jmp walkcbfs_asm\n\t"
|
||||||
"1:\n\t" : "=a" (entry) : "S" (target) : "ebx", "ecx", "edi", "esp");
|
"1:\n\t" : "=a" (entry) : "S" (target) : "ebx", "ecx", "edi",
|
||||||
|
"esp");
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +42,9 @@ static void *walkcbfs(char *target)
|
||||||
return (void *)0;
|
return (void *)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* just enough to support findstage. copied because the original version doesn't easily pass through romcc */
|
/* just enough to support findstage. copied because the original version doesn't
|
||||||
|
* easily pass through romcc
|
||||||
|
*/
|
||||||
struct cbfs_stage_restricted {
|
struct cbfs_stage_restricted {
|
||||||
unsigned long compression;
|
unsigned long compression;
|
||||||
unsigned long entry; // this is really 64bit, but properly endianized
|
unsigned long entry; // this is really 64bit, but properly endianized
|
||||||
|
|
|
@ -26,7 +26,8 @@ extern void mainboard_interrupt_handlers(int intXX, int (*intXX_func)(void));
|
||||||
#elif CONFIG_PCI_OPTION_ROM_RUN_YABEL
|
#elif CONFIG_PCI_OPTION_ROM_RUN_YABEL
|
||||||
#include <device/oprom/yabel/biosemu.h>
|
#include <device/oprom/yabel/biosemu.h>
|
||||||
#else
|
#else
|
||||||
static inline void mainboard_interrupt_handlers(int intXX, int (*intXX_func)(void)) { }
|
static inline void mainboard_interrupt_handlers(int intXX,
|
||||||
|
int (*intXX_func)(void)) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* INTERRUPT_H */
|
#endif /* INTERRUPT_H */
|
||||||
|
|
|
@ -156,32 +156,38 @@ static inline void insl(uint16_t port, void *addr, unsigned long count)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint8_t read8(const volatile void *addr)
|
static inline __attribute__((always_inline)) uint8_t read8(
|
||||||
|
const volatile void *addr)
|
||||||
{
|
{
|
||||||
return *((volatile uint8_t *)(addr));
|
return *((volatile uint8_t *)(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint16_t read16(const volatile void *addr)
|
static inline __attribute__((always_inline)) uint16_t read16(
|
||||||
|
const volatile void *addr)
|
||||||
{
|
{
|
||||||
return *((volatile uint16_t *)(addr));
|
return *((volatile uint16_t *)(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint32_t read32(const volatile void *addr)
|
static inline __attribute__((always_inline)) uint32_t read32(
|
||||||
|
const volatile void *addr)
|
||||||
{
|
{
|
||||||
return *((volatile uint32_t *)(addr));
|
return *((volatile uint32_t *)(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) void write8(volatile void *addr, uint8_t value)
|
static inline __attribute__((always_inline)) void write8(volatile void *addr,
|
||||||
|
uint8_t value)
|
||||||
{
|
{
|
||||||
*((volatile uint8_t *)(addr)) = value;
|
*((volatile uint8_t *)(addr)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) void write16(volatile void *addr, uint16_t value)
|
static inline __attribute__((always_inline)) void write16(volatile void *addr,
|
||||||
|
uint16_t value)
|
||||||
{
|
{
|
||||||
*((volatile uint16_t *)(addr)) = value;
|
*((volatile uint16_t *)(addr)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) void write32(volatile void *addr, uint32_t value)
|
static inline __attribute__((always_inline)) void write32(volatile void *addr,
|
||||||
|
uint32_t value)
|
||||||
{
|
{
|
||||||
*((volatile uint32_t *)(addr)) = value;
|
*((volatile uint32_t *)(addr)) = value;
|
||||||
}
|
}
|
||||||
|
@ -238,8 +244,8 @@ static inline int __ffs(u32 value)
|
||||||
/* Use pci_devfn_t or pnp_devfn_t instead */
|
/* Use pci_devfn_t or pnp_devfn_t instead */
|
||||||
typedef u32 device_t;
|
typedef u32 device_t;
|
||||||
|
|
||||||
/* FIXME: We need to make the coreboot to run at 64bit mode, So when read/write memory above 4G,
|
/* FIXME: We need to make the coreboot to run at 64bit mode, So when read/write
|
||||||
* We don't need to set %fs, and %gs anymore
|
* memory above 4G, We don't need to set %fs, and %gs anymore
|
||||||
* Before that We need to use %gs, and leave %fs to other RAM access
|
* Before that We need to use %gs, and leave %fs to other RAM access
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -301,7 +307,8 @@ void pci_write_config32(pci_devfn_t dev, unsigned int where, uint32_t value)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PCI_DEV_INVALID (0xffffffffU)
|
#define PCI_DEV_INVALID (0xffffffffU)
|
||||||
static inline pci_devfn_t pci_io_locate_device(unsigned int pci_id, pci_devfn_t dev)
|
static inline pci_devfn_t pci_io_locate_device(unsigned int pci_id,
|
||||||
|
pci_devfn_t dev)
|
||||||
{
|
{
|
||||||
for (; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0, 0, 1)) {
|
for (; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0, 0, 1)) {
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
|
@ -312,7 +319,8 @@ static inline pci_devfn_t pci_io_locate_device(unsigned int pci_id, pci_devfn_t
|
||||||
return PCI_DEV_INVALID;
|
return PCI_DEV_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline pci_devfn_t pci_locate_device(unsigned int pci_id, pci_devfn_t dev)
|
static inline pci_devfn_t pci_locate_device(unsigned int pci_id,
|
||||||
|
pci_devfn_t dev)
|
||||||
{
|
{
|
||||||
for (; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0, 0, 1)) {
|
for (; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0, 0, 1)) {
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
|
@ -341,14 +349,16 @@ static inline pci_devfn_t pci_locate_device_on_bus(unsigned int pci_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generic functions for pnp devices */
|
/* Generic functions for pnp devices */
|
||||||
static inline __attribute__((always_inline)) void pnp_write_config(pnp_devfn_t dev, uint8_t reg, uint8_t value)
|
static inline __attribute__((always_inline)) void pnp_write_config(
|
||||||
|
pnp_devfn_t dev, uint8_t reg, uint8_t value)
|
||||||
{
|
{
|
||||||
unsigned int port = dev >> 8;
|
unsigned int port = dev >> 8;
|
||||||
outb(reg, port);
|
outb(reg, port);
|
||||||
outb(value, port + 1);
|
outb(value, port + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uint8_t pnp_read_config(pnp_devfn_t dev, uint8_t reg)
|
static inline __attribute__((always_inline)) uint8_t pnp_read_config(
|
||||||
|
pnp_devfn_t dev, uint8_t reg)
|
||||||
{
|
{
|
||||||
unsigned int port = dev >> 8;
|
unsigned int port = dev >> 8;
|
||||||
outb(reg, port);
|
outb(reg, port);
|
||||||
|
@ -384,7 +394,8 @@ void pnp_set_iobase(pnp_devfn_t dev, unsigned int index, unsigned int iobase)
|
||||||
static inline __attribute__((always_inline))
|
static inline __attribute__((always_inline))
|
||||||
uint16_t pnp_read_iobase(pnp_devfn_t dev, unsigned int index)
|
uint16_t pnp_read_iobase(pnp_devfn_t dev, unsigned int index)
|
||||||
{
|
{
|
||||||
return ((uint16_t)(pnp_read_config(dev, index)) << 8) | pnp_read_config(dev, index + 1);
|
return ((uint16_t)(pnp_read_config(dev, index)) << 8)
|
||||||
|
| pnp_read_config(dev, index + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((always_inline))
|
static inline __attribute__((always_inline))
|
||||||
|
|
|
@ -56,7 +56,8 @@ struct irq_routing_table {
|
||||||
struct irq_info slots[CONFIG_IRQ_SLOT_COUNT];
|
struct irq_info slots[CONFIG_IRQ_SLOT_COUNT];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
unsigned long copy_pirq_routing_table(unsigned long addr, const struct irq_routing_table *routing_table);
|
unsigned long copy_pirq_routing_table(unsigned long addr,
|
||||||
|
const struct irq_routing_table *routing_table);
|
||||||
unsigned long write_pirq_routing_table(unsigned long start);
|
unsigned long write_pirq_routing_table(unsigned long start);
|
||||||
|
|
||||||
#if CONFIG_PIRQ_ROUTE
|
#if CONFIG_PIRQ_ROUTE
|
||||||
|
|
|
@ -278,8 +278,10 @@ void *smp_write_floating_table(unsigned long addr, unsigned int virtualwire);
|
||||||
unsigned long write_smp_table(unsigned long addr);
|
unsigned long write_smp_table(unsigned long addr);
|
||||||
|
|
||||||
void mptable_lintsrc(struct mp_config_table *mc, unsigned long bus_isa);
|
void mptable_lintsrc(struct mp_config_table *mc, unsigned long bus_isa);
|
||||||
void mptable_add_isa_interrupts(struct mp_config_table *mc, unsigned long bus_isa, unsigned long apicid, int external);
|
void mptable_add_isa_interrupts(struct mp_config_table *mc,
|
||||||
void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus, int *isa_bus);
|
unsigned long bus_isa, unsigned long apicid, int external);
|
||||||
|
void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus,
|
||||||
|
int *isa_bus);
|
||||||
void *mptable_finalize(struct mp_config_table *mc);
|
void *mptable_finalize(struct mp_config_table *mc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1991,1992,1993,1997,1998,2003, 2005 Free Software Foundation, Inc.
|
* Copyright (C) 1991,1992,1993,1997,1998,2003, 2005 Free Software Foundation,
|
||||||
|
* Inc.
|
||||||
* This file is part of the GNU C Library.
|
* This file is part of the GNU C Library.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
|
|
@ -68,7 +68,8 @@ static unsigned char smp_compute_checksum(void *v, int len)
|
||||||
return checksum;
|
return checksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *smp_write_floating_table_physaddr(uintptr_t addr, uintptr_t mpf_physptr, unsigned int virtualwire)
|
static void *smp_write_floating_table_physaddr(uintptr_t addr,
|
||||||
|
uintptr_t mpf_physptr, unsigned int virtualwire)
|
||||||
{
|
{
|
||||||
struct intel_mp_floating *mf;
|
struct intel_mp_floating *mf;
|
||||||
void *v;
|
void *v;
|
||||||
|
@ -96,7 +97,8 @@ void *smp_write_floating_table(unsigned long addr, unsigned int virtualwire)
|
||||||
{
|
{
|
||||||
/* 16 byte align the table address */
|
/* 16 byte align the table address */
|
||||||
addr = (addr + 0xf) & (~0xf);
|
addr = (addr + 0xf) & (~0xf);
|
||||||
return smp_write_floating_table_physaddr(addr, addr + SMP_FLOATING_TABLE_LEN, virtualwire);
|
return smp_write_floating_table_physaddr(addr, addr
|
||||||
|
+ SMP_FLOATING_TABLE_LEN, virtualwire);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *smp_next_mpc_entry(struct mp_config_table *mc)
|
void *smp_next_mpc_entry(struct mp_config_table *mc)
|
||||||
|
@ -173,7 +175,8 @@ void smp_write_processors(struct mp_config_table *mc)
|
||||||
for (cpu = all_devices; cpu; cpu = cpu->next) {
|
for (cpu = all_devices; cpu; cpu = cpu->next) {
|
||||||
unsigned long cpu_flag;
|
unsigned long cpu_flag;
|
||||||
if ((cpu->path.type != DEVICE_PATH_APIC) ||
|
if ((cpu->path.type != DEVICE_PATH_APIC) ||
|
||||||
(cpu->bus->dev->path.type != DEVICE_PATH_CPU_CLUSTER))
|
(cpu->bus->dev->path.type !=
|
||||||
|
DEVICE_PATH_CPU_CLUSTER))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!cpu->enabled)
|
if (!cpu->enabled)
|
||||||
|
@ -182,12 +185,14 @@ void smp_write_processors(struct mp_config_table *mc)
|
||||||
cpu_flag = MPC_CPU_ENABLED;
|
cpu_flag = MPC_CPU_ENABLED;
|
||||||
|
|
||||||
if (boot_apic_id == cpu->path.apic.apic_id)
|
if (boot_apic_id == cpu->path.apic.apic_id)
|
||||||
cpu_flag = MPC_CPU_ENABLED | MPC_CPU_BOOTPROCESSOR;
|
cpu_flag = MPC_CPU_ENABLED
|
||||||
|
| MPC_CPU_BOOTPROCESSOR;
|
||||||
|
|
||||||
if (cpu->path.apic.apic_id == order_id) {
|
if (cpu->path.apic.apic_id == order_id) {
|
||||||
smp_write_processor(mc,
|
smp_write_processor(mc,
|
||||||
cpu->path.apic.apic_id, apic_version,
|
cpu->path.apic.apic_id, apic_version,
|
||||||
cpu_flag, cpu_features, cpu_feature_flags
|
cpu_flag, cpu_features,
|
||||||
|
cpu_feature_flags
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -252,7 +257,8 @@ void smp_write_intsrc(struct mp_config_table *mc,
|
||||||
mpc->mpc_dstirq = dstirq;
|
mpc->mpc_dstirq = dstirq;
|
||||||
smp_add_mpc_entry(mc, sizeof(*mpc));
|
smp_add_mpc_entry(mc, sizeof(*mpc));
|
||||||
#ifdef DEBUG_MPTABLE
|
#ifdef DEBUG_MPTABLE
|
||||||
printk(BIOS_DEBUG, "add intsrc srcbus 0x%x srcbusirq 0x%x, dstapic 0x%x, dstirq 0x%x\n",
|
printk(BIOS_DEBUG,
|
||||||
|
"add intsrc srcbus 0x%x srcbusirq 0x%x, dstapic 0x%x, dstirq 0x%x\n",
|
||||||
srcbus, srcbusirq, dstapic, dstirq);
|
srcbus, srcbusirq, dstapic, dstirq);
|
||||||
hexdump(__func__, mpc, sizeof(*mpc));
|
hexdump(__func__, mpc, sizeof(*mpc));
|
||||||
#endif
|
#endif
|
||||||
|
@ -272,9 +278,11 @@ void smp_write_pci_intsrc(struct mp_config_table *mc,
|
||||||
u8 dstapic, u8 dstirq)
|
u8 dstapic, u8 dstirq)
|
||||||
{
|
{
|
||||||
u8 srcbusirq = (dev << 2) | pirq;
|
u8 srcbusirq = (dev << 2) | pirq;
|
||||||
printk(BIOS_SPEW, "\tPCI srcbusirq = 0x%x from dev = 0x%x and pirq = %x\n", srcbusirq, dev, pirq);
|
printk(BIOS_SPEW,
|
||||||
smp_write_intsrc(mc, irqtype, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, srcbus,
|
"\tPCI srcbusirq = 0x%x from dev = 0x%x and pirq = %x\n",
|
||||||
srcbusirq, dstapic, dstirq);
|
srcbusirq, dev, pirq);
|
||||||
|
smp_write_intsrc(mc, irqtype, MP_IRQ_TRIGGER_LEVEL
|
||||||
|
| MP_IRQ_POLARITY_LOW, srcbus, srcbusirq, dstapic, dstirq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void smp_write_intsrc_pci_bridge(struct mp_config_table *mc,
|
void smp_write_intsrc_pci_bridge(struct mp_config_table *mc,
|
||||||
|
@ -306,9 +314,12 @@ void smp_write_intsrc_pci_bridge(struct mp_config_table *mc,
|
||||||
|
|
||||||
if ((child->class >> 16) != PCI_BASE_CLASS_BRIDGE) {
|
if ((child->class >> 16) != PCI_BASE_CLASS_BRIDGE) {
|
||||||
/* pci device */
|
/* pci device */
|
||||||
printk(BIOS_DEBUG, "route irq: %s\n", dev_path(child));
|
printk(BIOS_DEBUG, "route irq: %s\n",
|
||||||
|
dev_path(child));
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
smp_write_intsrc(mc, irqtype, irqflag, srcbus, (slot<<2)|i, dstapic, dstirq_x[i]);
|
smp_write_intsrc(mc, irqtype, irqflag,
|
||||||
|
srcbus, (slot<<2)|i, dstapic,
|
||||||
|
dstirq_x[i]);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,8 +327,10 @@ void smp_write_intsrc_pci_bridge(struct mp_config_table *mc,
|
||||||
case PCI_CLASS_BRIDGE_PCI:
|
case PCI_CLASS_BRIDGE_PCI:
|
||||||
case PCI_CLASS_BRIDGE_PCMCIA:
|
case PCI_CLASS_BRIDGE_PCMCIA:
|
||||||
case PCI_CLASS_BRIDGE_CARDBUS:
|
case PCI_CLASS_BRIDGE_CARDBUS:
|
||||||
printk(BIOS_DEBUG, "route irq bridge: %s\n", dev_path(child));
|
printk(BIOS_DEBUG, "route irq bridge: %s\n",
|
||||||
smp_write_intsrc_pci_bridge(mc, irqtype, irqflag, child, dstapic, dstirq_x);
|
dev_path(child));
|
||||||
|
smp_write_intsrc_pci_bridge(mc, irqtype,
|
||||||
|
irqflag, child, dstapic, dstirq_x);
|
||||||
}
|
}
|
||||||
|
|
||||||
next:
|
next:
|
||||||
|
@ -416,30 +429,49 @@ void smp_write_compatibility_address_space(struct mp_config_table *mc,
|
||||||
|
|
||||||
void mptable_lintsrc(struct mp_config_table *mc, unsigned long bus_isa)
|
void mptable_lintsrc(struct mp_config_table *mc, unsigned long bus_isa)
|
||||||
{
|
{
|
||||||
smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x0);
|
smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_EDGE
|
||||||
smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x1);
|
| MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x0);
|
||||||
|
smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_EDGE
|
||||||
|
| MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, MP_APIC_ALL, 0x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mptable_add_isa_interrupts(struct mp_config_table *mc, unsigned long bus_isa, unsigned long apicid, int external_int2)
|
void mptable_add_isa_interrupts(struct mp_config_table *mc,
|
||||||
|
unsigned long bus_isa, unsigned long apicid, int external_int2)
|
||||||
{
|
{
|
||||||
/*I/O Ints: Type Trigger Polarity Bus ID IRQ APIC ID PIN# */
|
/*I/O Ints: Type Trigger Polarity
|
||||||
|
* Bus ID IRQ APIC ID PIN# */
|
||||||
smp_write_intsrc(mc, external_int2?mp_INT:mp_ExtINT,
|
smp_write_intsrc(mc, external_int2?mp_INT:mp_ExtINT,
|
||||||
MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, apicid, 0x0);
|
MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x1, apicid, 0x1);
|
bus_isa, 0x0, apicid, 0x0);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0x1, apicid, 0x1);
|
||||||
smp_write_intsrc(mc, external_int2?mp_ExtINT:mp_INT,
|
smp_write_intsrc(mc, external_int2?mp_ExtINT:mp_INT,
|
||||||
MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x0, apicid, 0x2);
|
MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x3, apicid, 0x3);
|
bus_isa, 0x0, apicid, 0x2);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x4, apicid, 0x4);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x6, apicid, 0x6);
|
bus_isa, 0x3, apicid, 0x3);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x7, apicid, 0x7);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x8, apicid, 0x8);
|
bus_isa, 0x4, apicid, 0x4);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0x9, apicid, 0x9);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xa, apicid, 0xa);
|
bus_isa, 0x6, apicid, 0x6);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xb, apicid, 0xb);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xc, apicid, 0xc);
|
bus_isa, 0x7, apicid, 0x7);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xd, apicid, 0xd);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xe, apicid, 0xe);
|
bus_isa, 0x8, apicid, 0x8);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xf, apicid, 0xf);
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0x9, apicid, 0x9);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xa, apicid, 0xa);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xb, apicid, 0xb);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xc, apicid, 0xc);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xd, apicid, 0xd);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xe, apicid, 0xe);
|
||||||
|
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH,
|
||||||
|
bus_isa, 0xf, apicid, 0xf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus,
|
void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus,
|
||||||
|
@ -460,7 +492,8 @@ void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus,
|
||||||
struct bus *bus;
|
struct bus *bus;
|
||||||
for (bus = dev->link_list; bus; bus = bus->next) {
|
for (bus = dev->link_list; bus; bus = bus->next) {
|
||||||
if (bus->secondary > 255) {
|
if (bus->secondary > 255) {
|
||||||
printk(BIOS_ERR, "A bus claims to have a bus ID > 255?!? Aborting");
|
printk(BIOS_ERR,
|
||||||
|
"A bus claims to have a bus ID > 255?!? Aborting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buses[bus->secondary] = 1;
|
buses[bus->secondary] = 1;
|
||||||
|
@ -479,9 +512,11 @@ void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus,
|
||||||
|
|
||||||
void *mptable_finalize(struct mp_config_table *mc)
|
void *mptable_finalize(struct mp_config_table *mc)
|
||||||
{
|
{
|
||||||
mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);
|
mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc),
|
||||||
|
mc->mpe_length);
|
||||||
mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);
|
mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);
|
||||||
printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n", mc, smp_next_mpe_entry(mc));
|
printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n",
|
||||||
|
mc, smp_next_mpe_entry(mc));
|
||||||
return smp_next_mpe_entry(mc);
|
return smp_next_mpe_entry(mc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,6 +530,7 @@ unsigned long __attribute__((weak)) write_smp_table(unsigned long addr)
|
||||||
struct device *oldparent;
|
struct device *oldparent;
|
||||||
void *tmp, *v;
|
void *tmp, *v;
|
||||||
int isaioapic = -1, have_fixed_entries;
|
int isaioapic = -1, have_fixed_entries;
|
||||||
|
struct pci_irq_info *pci_irq_info;
|
||||||
|
|
||||||
v = smp_write_floating_table(addr, 0);
|
v = smp_write_floating_table(addr, 0);
|
||||||
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
|
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
|
||||||
|
@ -510,7 +546,8 @@ unsigned long __attribute__((weak)) write_smp_table(unsigned long addr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(ioapic_config = dev->chip_info)) {
|
if (!(ioapic_config = dev->chip_info)) {
|
||||||
printk(BIOS_ERR, "%s has no config, ignoring\n", dev_path(dev));
|
printk(BIOS_ERR, "%s has no config, ignoring\n",
|
||||||
|
dev_path(dev));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
smp_write_ioapic(mc, dev->path.ioapic.ioapic_id,
|
smp_write_ioapic(mc, dev->path.ioapic.ioapic_id,
|
||||||
|
@ -519,7 +556,8 @@ unsigned long __attribute__((weak)) write_smp_table(unsigned long addr)
|
||||||
|
|
||||||
if (ioapic_config->have_isa_interrupts) {
|
if (ioapic_config->have_isa_interrupts) {
|
||||||
if (isaioapic >= 0)
|
if (isaioapic >= 0)
|
||||||
printk(BIOS_ERR, "More than one IOAPIC with ISA interrupts?\n");
|
printk(BIOS_ERR,
|
||||||
|
"More than one IOAPIC with ISA interrupts?\n");
|
||||||
else
|
else
|
||||||
isaioapic = dev->path.ioapic.ioapic_id;
|
isaioapic = dev->path.ioapic.ioapic_id;
|
||||||
}
|
}
|
||||||
|
@ -539,16 +577,19 @@ unsigned long __attribute__((weak)) write_smp_table(unsigned long addr)
|
||||||
have_fixed_entries = 0;
|
have_fixed_entries = 0;
|
||||||
for (pin = 0; pin < 4; pin++) {
|
for (pin = 0; pin < 4; pin++) {
|
||||||
if (dev->pci_irq_info[pin].ioapic_dst_id) {
|
if (dev->pci_irq_info[pin].ioapic_dst_id) {
|
||||||
printk(BIOS_DEBUG, "fixed IRQ entry for: %s: INT%c# -> IOAPIC %d PIN %d\n", dev_path(dev),
|
printk(BIOS_DEBUG,
|
||||||
|
"fixed IRQ entry for: %s: INT%c# -> IOAPIC %d PIN %d\n",
|
||||||
|
dev_path(dev),
|
||||||
pin + 'A',
|
pin + 'A',
|
||||||
dev->pci_irq_info[pin].ioapic_dst_id,
|
dev->pci_irq_info[pin].ioapic_dst_id,
|
||||||
dev->pci_irq_info[pin].ioapic_irq_pin);
|
dev->pci_irq_info[pin].ioapic_irq_pin);
|
||||||
smp_write_intsrc(mc, mp_INT,
|
smp_write_intsrc(mc, mp_INT,
|
||||||
dev->pci_irq_info[pin].ioapic_flags,
|
dev->pci_irq_info[pin].ioapic_flags,
|
||||||
dev->bus->secondary,
|
dev->bus->secondary,
|
||||||
((dev->path.pci.devfn & 0xf8) >> 1) | pin,
|
((dev->path.pci.devfn & 0xf8) >> 1)
|
||||||
dev->pci_irq_info[pin].ioapic_dst_id,
|
| pin,
|
||||||
dev->pci_irq_info[pin].ioapic_irq_pin);
|
dev->pci_irq_info[pin].ioapic_dst_id,
|
||||||
|
dev->pci_irq_info[pin].ioapic_irq_pin);
|
||||||
have_fixed_entries = 1;
|
have_fixed_entries = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -557,28 +598,34 @@ unsigned long __attribute__((weak)) write_smp_table(unsigned long addr)
|
||||||
pin = (dev->path.pci.devfn & 7) % 4;
|
pin = (dev->path.pci.devfn & 7) % 4;
|
||||||
oldparent = parent = dev;
|
oldparent = parent = dev;
|
||||||
while ((parent = parent->bus->dev)) {
|
while ((parent = parent->bus->dev)) {
|
||||||
parentpin = (oldparent->path.pci.devfn >> 3) + (oldparent->path.pci.devfn & 7);
|
parentpin = (oldparent->path.pci.devfn >> 3)
|
||||||
|
+ (oldparent->path.pci.devfn & 7);
|
||||||
parentpin += dev->path.pci.devfn & 7;
|
parentpin += dev->path.pci.devfn & 7;
|
||||||
parentpin += dev->path.pci.devfn >> 3;
|
parentpin += dev->path.pci.devfn >> 3;
|
||||||
parentpin %= 4;
|
parentpin %= 4;
|
||||||
|
|
||||||
if (parent->pci_irq_info[parentpin].ioapic_dst_id) {
|
pci_irq_info = &parent->pci_irq_info[parentpin];
|
||||||
printk(BIOS_DEBUG, "automatic IRQ entry for %s: INT%c# -> IOAPIC %d PIN %d\n",
|
if (pci_irq_info->ioapic_dst_id) {
|
||||||
|
printk(BIOS_DEBUG,
|
||||||
|
"automatic IRQ entry for %s: INT%c# -> IOAPIC %d PIN %d\n",
|
||||||
dev_path(dev), pin + 'A',
|
dev_path(dev), pin + 'A',
|
||||||
parent->pci_irq_info[parentpin].ioapic_dst_id,
|
pci_irq_info->ioapic_dst_id,
|
||||||
parent->pci_irq_info[parentpin].ioapic_irq_pin);
|
pci_irq_info->ioapic_irq_pin);
|
||||||
smp_write_intsrc(mc, mp_INT,
|
smp_write_intsrc(mc, mp_INT,
|
||||||
parent->pci_irq_info[parentpin].ioapic_flags,
|
pci_irq_info->ioapic_flags,
|
||||||
dev->bus->secondary,
|
dev->bus->secondary,
|
||||||
((dev->path.pci.devfn & 0xf8) >> 1) | pin,
|
((dev->path.pci.devfn & 0xf8)
|
||||||
parent->pci_irq_info[parentpin].ioapic_dst_id,
|
>> 1) | pin,
|
||||||
parent->pci_irq_info[parentpin].ioapic_irq_pin);
|
pci_irq_info->ioapic_dst_id,
|
||||||
|
pci_irq_info->ioapic_irq_pin);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent->path.type == DEVICE_PATH_DOMAIN) {
|
if (parent->path.type == DEVICE_PATH_DOMAIN) {
|
||||||
printk(BIOS_WARNING, "no IRQ found for %s\n", dev_path(dev));
|
printk(BIOS_WARNING,
|
||||||
|
"no IRQ found for %s\n",
|
||||||
|
dev_path(dev));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
oldparent = parent;
|
oldparent = parent;
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
|
|
||||||
#if !CONFIG_PCI_IO_CFG_EXT
|
#if !CONFIG_PCI_IO_CFG_EXT
|
||||||
#define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus << 16) | \
|
#define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus << 16) | \
|
||||||
(devfn << 8) | (where & ~3))
|
(devfn << 8) | (where & ~3))
|
||||||
#else
|
#else
|
||||||
#define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus << 16) | \
|
#define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus << 16) | \
|
||||||
(devfn << 8) | ((where & 0xff) & ~3) |\
|
(devfn << 8) | ((where & 0xff) & ~3) |\
|
||||||
((where & 0xf00)<<16))
|
((where & 0xf00)<<16))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static uint8_t pci_conf1_read_config8(struct bus *pbus, int bus, int devfn,
|
static uint8_t pci_conf1_read_config8(struct bus *pbus, int bus, int devfn,
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PCI_MMIO_ADDR(SEGBUS, DEVFN, WHERE, MASK) \
|
#define PCI_MMIO_ADDR(SEGBUS, DEVFN, WHERE, MASK) \
|
||||||
((void *)(((uintptr_t)CONFIG_MMCONF_BASE_ADDRESS |\
|
((void *)(((uintptr_t)CONFIG_MMCONF_BASE_ADDRESS |\
|
||||||
(((SEGBUS) & 0xFFF) << 20) |\
|
(((SEGBUS) & 0xFFF) << 20) |\
|
||||||
(((DEVFN) & 0xFF) << 12) |\
|
(((DEVFN) & 0xFF) << 12) |\
|
||||||
((WHERE) & 0xFFF)) & ~MASK))
|
((WHERE) & 0xFFF)) & ~MASK))
|
||||||
|
|
||||||
static uint8_t pci_mmconf_read_config8(struct bus *pbus, int bus, int devfn,
|
static uint8_t pci_mmconf_read_config8(struct bus *pbus, int bus, int devfn,
|
||||||
int where)
|
int where)
|
||||||
|
|
|
@ -29,10 +29,10 @@ static void check_pirq_routing_table(struct irq_routing_table *rt)
|
||||||
printk(BIOS_INFO, "Checking Interrupt Routing Table consistency...\n");
|
printk(BIOS_INFO, "Checking Interrupt Routing Table consistency...\n");
|
||||||
|
|
||||||
if (sizeof(struct irq_routing_table) != rt->size) {
|
if (sizeof(struct irq_routing_table) != rt->size) {
|
||||||
printk(BIOS_WARNING, "Inconsistent Interrupt Routing Table size (0x%x/0x%x).\n",
|
printk(BIOS_WARNING,
|
||||||
(unsigned int) sizeof(struct irq_routing_table),
|
"Inconsistent Interrupt Routing Table size (0x%x/0x%x).\n",
|
||||||
rt->size
|
(unsigned int) sizeof(struct irq_routing_table),
|
||||||
);
|
rt->size);
|
||||||
rt->size = sizeof(struct irq_routing_table);
|
rt->size = sizeof(struct irq_routing_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,8 +46,9 @@ static void check_pirq_routing_table(struct irq_routing_table *rt)
|
||||||
sum = rt->checksum - sum;
|
sum = rt->checksum - sum;
|
||||||
|
|
||||||
if (sum != rt->checksum) {
|
if (sum != rt->checksum) {
|
||||||
printk(BIOS_WARNING, "Interrupt Routing Table checksum is: 0x%02x but should be: 0x%02x.\n",
|
printk(BIOS_WARNING,
|
||||||
rt->checksum, sum);
|
"Interrupt Routing Table checksum is: 0x%02x but should be: 0x%02x.\n",
|
||||||
|
rt->checksum, sum);
|
||||||
rt->checksum = sum;
|
rt->checksum = sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,14 +74,17 @@ static void check_pirq_routing_table(struct irq_routing_table *rt)
|
||||||
printk(BIOS_INFO, "done.\n");
|
printk(BIOS_INFO, "done.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int verify_copy_pirq_routing_table(unsigned long addr, const struct irq_routing_table *routing_table)
|
static int verify_copy_pirq_routing_table(unsigned long addr,
|
||||||
|
const struct irq_routing_table *routing_table)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uint8_t *rt_orig, *rt_curr;
|
uint8_t *rt_orig, *rt_curr;
|
||||||
|
|
||||||
rt_curr = (uint8_t *)addr;
|
rt_curr = (uint8_t *)addr;
|
||||||
rt_orig = (uint8_t *)routing_table;
|
rt_orig = (uint8_t *)routing_table;
|
||||||
printk(BIOS_INFO, "Verifying copy of Interrupt Routing Table at 0x%08lx... ", addr);
|
printk(BIOS_INFO,
|
||||||
|
"Verifying copy of Interrupt Routing Table at 0x%08lx... ",
|
||||||
|
addr);
|
||||||
for (i = 0; i < routing_table->size; i++) {
|
for (i = 0; i < routing_table->size; i++) {
|
||||||
if (*(rt_curr + i) != *(rt_orig + i)) {
|
if (*(rt_curr + i) != *(rt_orig + i)) {
|
||||||
printk(BIOS_INFO, "failed\n");
|
printk(BIOS_INFO, "failed\n");
|
||||||
|
@ -183,13 +187,15 @@ static void pirq_route_irqs(unsigned long addr)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned long copy_pirq_routing_table(unsigned long addr, const struct irq_routing_table *routing_table)
|
unsigned long copy_pirq_routing_table(unsigned long addr,
|
||||||
|
const struct irq_routing_table *routing_table)
|
||||||
{
|
{
|
||||||
/* Align the table to be 16 byte aligned. */
|
/* Align the table to be 16 byte aligned. */
|
||||||
addr = ALIGN(addr, 16);
|
addr = ALIGN(addr, 16);
|
||||||
|
|
||||||
/* This table must be between 0xf0000 & 0x100000 */
|
/* This table must be between 0xf0000 & 0x100000 */
|
||||||
printk(BIOS_INFO, "Copying Interrupt Routing Table to 0x%08lx... ", addr);
|
printk(BIOS_INFO, "Copying Interrupt Routing Table to 0x%08lx... ",
|
||||||
|
addr);
|
||||||
memcpy((void *)addr, routing_table, routing_table->size);
|
memcpy((void *)addr, routing_table, routing_table->size);
|
||||||
printk(BIOS_INFO, "done.\n");
|
printk(BIOS_INFO, "done.\n");
|
||||||
#if CONFIG_DEBUG_PIRQ
|
#if CONFIG_DEBUG_PIRQ
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* This file is part of the coreboot project.
|
* This file is part of the coreboot project.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
|
* Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
|
||||||
|
* Raptor Engineering
|
||||||
* Copyright (C) 2011 Sven Schnelle <svens@stackframe.org>
|
* Copyright (C) 2011 Sven Schnelle <svens@stackframe.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -124,7 +125,8 @@ static int smbios_processor_name(char *start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this function will fill the corresponding manufacturer */
|
/* this function will fill the corresponding manufacturer */
|
||||||
void smbios_fill_dimm_manufacturer_from_id(uint16_t mod_id, struct smbios_type17 *t)
|
void smbios_fill_dimm_manufacturer_from_id(uint16_t mod_id,
|
||||||
|
struct smbios_type17 *t)
|
||||||
{
|
{
|
||||||
switch (mod_id) {
|
switch (mod_id) {
|
||||||
case 0x2c80:
|
case 0x2c80:
|
||||||
|
@ -280,7 +282,8 @@ static int smbios_write_type0(unsigned long *current, int handle)
|
||||||
#if !CONFIG_CHROMEOS
|
#if !CONFIG_CHROMEOS
|
||||||
t->bios_release_date = smbios_add_string(t->eos, coreboot_dmi_date);
|
t->bios_release_date = smbios_add_string(t->eos, coreboot_dmi_date);
|
||||||
|
|
||||||
t->bios_version = smbios_add_string(t->eos, smbios_mainboard_bios_version());
|
t->bios_version = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_bios_version());
|
||||||
#else
|
#else
|
||||||
#define SPACES \
|
#define SPACES \
|
||||||
" "
|
" "
|
||||||
|
@ -371,9 +374,12 @@ static int smbios_write_type1(unsigned long *current, int handle)
|
||||||
t->type = SMBIOS_SYSTEM_INFORMATION;
|
t->type = SMBIOS_SYSTEM_INFORMATION;
|
||||||
t->handle = handle;
|
t->handle = handle;
|
||||||
t->length = len - 2;
|
t->length = len - 2;
|
||||||
t->manufacturer = smbios_add_string(t->eos, smbios_mainboard_manufacturer());
|
t->manufacturer = smbios_add_string(t->eos,
|
||||||
t->product_name = smbios_add_string(t->eos, smbios_mainboard_product_name());
|
smbios_mainboard_manufacturer());
|
||||||
t->serial_number = smbios_add_string(t->eos, smbios_mainboard_serial_number());
|
t->product_name = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_product_name());
|
||||||
|
t->serial_number = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_serial_number());
|
||||||
t->sku = smbios_add_string(t->eos, smbios_mainboard_sku());
|
t->sku = smbios_add_string(t->eos, smbios_mainboard_sku());
|
||||||
t->version = smbios_add_string(t->eos, smbios_mainboard_version());
|
t->version = smbios_add_string(t->eos, smbios_mainboard_version());
|
||||||
#ifdef CONFIG_MAINBOARD_FAMILY
|
#ifdef CONFIG_MAINBOARD_FAMILY
|
||||||
|
@ -394,9 +400,12 @@ static int smbios_write_type2(unsigned long *current, int handle)
|
||||||
t->type = SMBIOS_BOARD_INFORMATION;
|
t->type = SMBIOS_BOARD_INFORMATION;
|
||||||
t->handle = handle;
|
t->handle = handle;
|
||||||
t->length = len - 2;
|
t->length = len - 2;
|
||||||
t->manufacturer = smbios_add_string(t->eos, smbios_mainboard_manufacturer());
|
t->manufacturer = smbios_add_string(t->eos,
|
||||||
t->product_name = smbios_add_string(t->eos, smbios_mainboard_product_name());
|
smbios_mainboard_manufacturer());
|
||||||
t->serial_number = smbios_add_string(t->eos, smbios_mainboard_serial_number());
|
t->product_name = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_product_name());
|
||||||
|
t->serial_number = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_serial_number());
|
||||||
t->version = smbios_add_string(t->eos, smbios_mainboard_version());
|
t->version = smbios_add_string(t->eos, smbios_mainboard_version());
|
||||||
len = t->length + smbios_string_table_len(t->eos);
|
len = t->length + smbios_string_table_len(t->eos);
|
||||||
*current += len;
|
*current += len;
|
||||||
|
@ -412,7 +421,8 @@ static int smbios_write_type3(unsigned long *current, int handle)
|
||||||
t->type = SMBIOS_SYSTEM_ENCLOSURE;
|
t->type = SMBIOS_SYSTEM_ENCLOSURE;
|
||||||
t->handle = handle;
|
t->handle = handle;
|
||||||
t->length = len - 2;
|
t->length = len - 2;
|
||||||
t->manufacturer = smbios_add_string(t->eos, smbios_mainboard_manufacturer());
|
t->manufacturer = smbios_add_string(t->eos,
|
||||||
|
smbios_mainboard_manufacturer());
|
||||||
t->bootup_state = SMBIOS_STATE_SAFE;
|
t->bootup_state = SMBIOS_STATE_SAFE;
|
||||||
t->power_supply_state = SMBIOS_STATE_SAFE;
|
t->power_supply_state = SMBIOS_STATE_SAFE;
|
||||||
t->thermal_state = SMBIOS_STATE_SAFE;
|
t->thermal_state = SMBIOS_STATE_SAFE;
|
||||||
|
@ -500,7 +510,8 @@ static int smbios_write_type17(unsigned long *current, int *handle)
|
||||||
return 0; /* can't find mem info in cbmem */
|
return 0; /* can't find mem info in cbmem */
|
||||||
|
|
||||||
printk(BIOS_INFO, "Create SMBIOS type 17\n");
|
printk(BIOS_INFO, "Create SMBIOS type 17\n");
|
||||||
for (i = 0; i < meminfo->dimm_cnt && i < ARRAY_SIZE(meminfo->dimm); i++) {
|
for (i = 0; i < meminfo->dimm_cnt && i < ARRAY_SIZE(meminfo->dimm);
|
||||||
|
i++) {
|
||||||
struct dimm_info *dimm;
|
struct dimm_info *dimm;
|
||||||
dimm = &meminfo->dimm[i];
|
dimm = &meminfo->dimm[i];
|
||||||
len = create_smbios_type17_for_dimm(dimm, current, handle);
|
len = create_smbios_type17_for_dimm(dimm, current, handle);
|
||||||
|
@ -562,7 +573,8 @@ static int smbios_write_type127(unsigned long *current, int handle)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smbios_walk_device_tree(struct device *tree, int *handle, unsigned long *current)
|
static int smbios_walk_device_tree(struct device *tree, int *handle,
|
||||||
|
unsigned long *current)
|
||||||
{
|
{
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
@ -600,21 +612,32 @@ unsigned long smbios_write_tables(unsigned long current)
|
||||||
current = ALIGN(current, 16);
|
current = ALIGN(current, 16);
|
||||||
|
|
||||||
tables = current;
|
tables = current;
|
||||||
update_max(len, max_struct_size, smbios_write_type0(¤t, handle++));
|
update_max(len, max_struct_size, smbios_write_type0(¤t,
|
||||||
update_max(len, max_struct_size, smbios_write_type1(¤t, handle++));
|
handle++));
|
||||||
update_max(len, max_struct_size, smbios_write_type2(¤t, handle++));
|
update_max(len, max_struct_size, smbios_write_type1(¤t,
|
||||||
update_max(len, max_struct_size, smbios_write_type3(¤t, handle++));
|
handle++));
|
||||||
update_max(len, max_struct_size, smbios_write_type4(¤t, handle++));
|
update_max(len, max_struct_size, smbios_write_type2(¤t,
|
||||||
update_max(len, max_struct_size, smbios_write_type11(¤t, &handle));
|
handle++));
|
||||||
|
update_max(len, max_struct_size, smbios_write_type3(¤t,
|
||||||
|
handle++));
|
||||||
|
update_max(len, max_struct_size, smbios_write_type4(¤t,
|
||||||
|
handle++));
|
||||||
|
update_max(len, max_struct_size, smbios_write_type11(¤t,
|
||||||
|
&handle));
|
||||||
#if CONFIG_ELOG
|
#if CONFIG_ELOG
|
||||||
update_max(len, max_struct_size, elog_smbios_write_type15(¤t, handle++));
|
update_max(len, max_struct_size, elog_smbios_write_type15(¤t,
|
||||||
|
handle++));
|
||||||
#endif
|
#endif
|
||||||
update_max(len, max_struct_size, smbios_write_type17(¤t, &handle));
|
update_max(len, max_struct_size, smbios_write_type17(¤t,
|
||||||
update_max(len, max_struct_size, smbios_write_type32(¤t, handle++));
|
&handle));
|
||||||
|
update_max(len, max_struct_size, smbios_write_type32(¤t,
|
||||||
|
handle++));
|
||||||
|
|
||||||
update_max(len, max_struct_size, smbios_walk_device_tree(all_devices, &handle, ¤t));
|
update_max(len, max_struct_size, smbios_walk_device_tree(all_devices,
|
||||||
|
&handle, ¤t));
|
||||||
|
|
||||||
update_max(len, max_struct_size, smbios_write_type127(¤t, handle++));
|
update_max(len, max_struct_size, smbios_write_type127(¤t,
|
||||||
|
handle++));
|
||||||
|
|
||||||
memset(se, 0, sizeof(struct smbios_entry));
|
memset(se, 0, sizeof(struct smbios_entry));
|
||||||
memcpy(se->anchor, "_SM_", 4);
|
memcpy(se->anchor, "_SM_", 4);
|
||||||
|
@ -629,7 +652,8 @@ unsigned long smbios_write_tables(unsigned long current)
|
||||||
se->struct_table_length = len;
|
se->struct_table_length = len;
|
||||||
|
|
||||||
se->intermediate_checksum = smbios_checksum((u8 *)se + 0x10,
|
se->intermediate_checksum = smbios_checksum((u8 *)se + 0x10,
|
||||||
sizeof(struct smbios_entry) - 0x10);
|
sizeof(struct smbios_entry)
|
||||||
|
- 0x10);
|
||||||
se->checksum = smbios_checksum((u8 *)se, sizeof(struct smbios_entry));
|
se->checksum = smbios_checksum((u8 *)se, sizeof(struct smbios_entry));
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,10 +41,12 @@ static unsigned long write_pirq_table(unsigned long rom_table_end)
|
||||||
/* And add a high table version for those payloads that
|
/* And add a high table version for those payloads that
|
||||||
* want to live in the F segment
|
* want to live in the F segment
|
||||||
*/
|
*/
|
||||||
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_PIRQ, MAX_PIRQ_TABLE_SIZE);
|
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_PIRQ,
|
||||||
|
MAX_PIRQ_TABLE_SIZE);
|
||||||
if (high_table_pointer) {
|
if (high_table_pointer) {
|
||||||
unsigned long new_high_table_pointer;
|
unsigned long new_high_table_pointer;
|
||||||
new_high_table_pointer = write_pirq_routing_table(high_table_pointer);
|
new_high_table_pointer =
|
||||||
|
write_pirq_routing_table(high_table_pointer);
|
||||||
// FIXME make pirq table code intelligent enough to know how
|
// FIXME make pirq table code intelligent enough to know how
|
||||||
// much space it's going to need.
|
// much space it's going to need.
|
||||||
if (new_high_table_pointer > (high_table_pointer
|
if (new_high_table_pointer > (high_table_pointer
|
||||||
|
@ -68,7 +70,8 @@ static unsigned long write_mptable(unsigned long rom_table_end)
|
||||||
rom_table_end = write_smp_table(rom_table_end);
|
rom_table_end = write_smp_table(rom_table_end);
|
||||||
rom_table_end = ALIGN(rom_table_end, 1024);
|
rom_table_end = ALIGN(rom_table_end, 1024);
|
||||||
|
|
||||||
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_MPTABLE, MAX_MP_TABLE_SIZE);
|
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_MPTABLE,
|
||||||
|
MAX_MP_TABLE_SIZE);
|
||||||
if (high_table_pointer) {
|
if (high_table_pointer) {
|
||||||
unsigned long new_high_table_pointer;
|
unsigned long new_high_table_pointer;
|
||||||
new_high_table_pointer = write_smp_table(high_table_pointer);
|
new_high_table_pointer = write_smp_table(high_table_pointer);
|
||||||
|
@ -105,7 +108,8 @@ static unsigned long write_acpi_table(unsigned long rom_table_end)
|
||||||
* coreboot table. This leaves us with 47KB for all of ACPI. Let's see
|
* coreboot table. This leaves us with 47KB for all of ACPI. Let's see
|
||||||
* how far we get.
|
* how far we get.
|
||||||
*/
|
*/
|
||||||
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_ACPI, MAX_ACPI_SIZE);
|
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_ACPI,
|
||||||
|
MAX_ACPI_SIZE);
|
||||||
if (high_table_pointer) {
|
if (high_table_pointer) {
|
||||||
unsigned long acpi_start = high_table_pointer;
|
unsigned long acpi_start = high_table_pointer;
|
||||||
unsigned long new_high_table_pointer;
|
unsigned long new_high_table_pointer;
|
||||||
|
@ -139,7 +143,8 @@ static unsigned long write_acpi_table(unsigned long rom_table_end)
|
||||||
writes longest size available. */
|
writes longest size available. */
|
||||||
memcpy(low_rsdp, high_rsdp, sizeof(acpi_rsdp_t));
|
memcpy(low_rsdp, high_rsdp, sizeof(acpi_rsdp_t));
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_ERR, "ERROR: Didn't find RSDP in high table.\n");
|
printk(BIOS_ERR,
|
||||||
|
"ERROR: Didn't find RSDP in high table.\n");
|
||||||
}
|
}
|
||||||
rom_table_end = ALIGN(rom_table_end + sizeof(acpi_rsdp_t), 16);
|
rom_table_end = ALIGN(rom_table_end + sizeof(acpi_rsdp_t), 16);
|
||||||
} else {
|
} else {
|
||||||
|
@ -156,13 +161,16 @@ static unsigned long write_smbios_table(unsigned long rom_table_end)
|
||||||
|
|
||||||
#define MAX_SMBIOS_SIZE 2048
|
#define MAX_SMBIOS_SIZE 2048
|
||||||
|
|
||||||
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_SMBIOS, MAX_SMBIOS_SIZE);
|
high_table_pointer = (unsigned long)cbmem_add(CBMEM_ID_SMBIOS,
|
||||||
|
MAX_SMBIOS_SIZE);
|
||||||
if (high_table_pointer) {
|
if (high_table_pointer) {
|
||||||
unsigned long new_high_table_pointer;
|
unsigned long new_high_table_pointer;
|
||||||
|
|
||||||
new_high_table_pointer = smbios_write_tables(high_table_pointer);
|
new_high_table_pointer =
|
||||||
|
smbios_write_tables(high_table_pointer);
|
||||||
rom_table_end = ALIGN(rom_table_end, 16);
|
rom_table_end = ALIGN(rom_table_end, 16);
|
||||||
memcpy((void *)rom_table_end, (void *)high_table_pointer, sizeof(struct smbios_entry));
|
memcpy((void *)rom_table_end, (void *)high_table_pointer,
|
||||||
|
sizeof(struct smbios_entry));
|
||||||
rom_table_end += sizeof(struct smbios_entry);
|
rom_table_end += sizeof(struct smbios_entry);
|
||||||
|
|
||||||
if (new_high_table_pointer > (high_table_pointer
|
if (new_high_table_pointer > (high_table_pointer
|
||||||
|
@ -171,8 +179,11 @@ static unsigned long write_smbios_table(unsigned long rom_table_end)
|
||||||
printk(BIOS_DEBUG, "SMBIOS tables: %ld bytes.\n",
|
printk(BIOS_DEBUG, "SMBIOS tables: %ld bytes.\n",
|
||||||
new_high_table_pointer - high_table_pointer);
|
new_high_table_pointer - high_table_pointer);
|
||||||
} else {
|
} else {
|
||||||
unsigned long new_rom_table_end = smbios_write_tables(rom_table_end);
|
unsigned long new_rom_table_end;
|
||||||
printk(BIOS_DEBUG, "SMBIOS size %ld bytes\n", new_rom_table_end - rom_table_end);
|
|
||||||
|
new_rom_table_end = smbios_write_tables(rom_table_end);
|
||||||
|
printk(BIOS_DEBUG, "SMBIOS size %ld bytes\n", new_rom_table_end
|
||||||
|
- rom_table_end);
|
||||||
rom_table_end = ALIGN(new_rom_table_end, 16);
|
rom_table_end = ALIGN(new_rom_table_end, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,9 @@ walker:
|
||||||
|
|
||||||
/* LARCHIVE header found */
|
/* LARCHIVE header found */
|
||||||
mov %ebx, %edi
|
mov %ebx, %edi
|
||||||
add $CBFS_FILE_STRUCTSIZE, %edi /* edi = address of first byte after struct cbfs_file */
|
add $CBFS_FILE_STRUCTSIZE, %edi /* edi = address of first byte after
|
||||||
|
* struct cbfs_file
|
||||||
|
*/
|
||||||
mov %eax, %ecx
|
mov %eax, %ecx
|
||||||
repe cmpsb
|
repe cmpsb
|
||||||
/* zero flag set if strings are equal */
|
/* zero flag set if strings are equal */
|
||||||
|
@ -112,7 +114,9 @@ check_for_exit:
|
||||||
add $1, %ecx
|
add $1, %ecx
|
||||||
|
|
||||||
cmp %ecx, %ebx
|
cmp %ecx, %ebx
|
||||||
/* if bootblockstart >= addr (==we're still in the data area) , jump back */
|
/* if bootblockstart >= addr (==we're still in the data area),
|
||||||
|
* jump back
|
||||||
|
*/
|
||||||
jbe walker
|
jbe walker
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue