[U-Boot] [PATCH v2] Initial support for ACPI Tables for qemu-x86 target.

Saket Sinha saket.sinha89 at gmail.com
Thu Jun 25 23:30:02 CEST 2015


Hi Bin,


>>> +
>>> +static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic, u8 cpu, u8 apic)
>>> +{
>>> +        lapic->type = 0; /* Local APIC structure */
>>> +        lapic->length = sizeof(struct acpi_madt_lapic);
>>> +        lapic->flags = (1 << 0); /* Processor/LAPIC enabled */
>>> +        lapic->processor_id = cpu;
>>> +        lapic->apic_id = apic;
>>> +
>>> +        return lapic->length;
>>> +}
>>> +
>>> +static unsigned long acpi_create_madt_lapics(unsigned long current)
>>> +{
>>> +       struct udevice *dev;
>>> +
>>> +        for (uclass_find_first_device(UCLASS_CPU, &dev);
>>> +             dev;
>>> +             uclass_find_next_device(&dev)) {
>>> +                struct cpu_platdata *plat = dev_get_parent_platdata(dev);
>>> +
>>> +               current += acpi_create_madt_lapic((struct acpi_madt_lapic *)current, plat->cpu_id, plat->cpu_id);
>>
>> The processor id (2nd parameter) is not equal to lapic id. Per the
>> ACPI spec, it should match the ProcessorID in the ASL file, format
>> below.
>>
>> Processor (ProcessorName, ProcessorID, PBlockAddress, PblockLength) {ObjectList}
>>
>
> Thanks for bringing this to my notice.
> In my boot up logs, I am getting "ACPI: No LAPIC entries present".
> This might be the reason for that.
>


As per our previous discussion, I reported an error in bringing up
u-boot for qemu -
"  Cannot find uclass for id 10: please add the UCLASS_DRIVER()
declaration for  this UCLASS_... id"
You told me that this is because QEMU has not been converted to use dm
cpu driver.

If this issue is resolved, and thus UCLASS_CPU would be available for
qemu, the patch below  would fix the lapic error.

diff --git a/arch/x86/cpu/qemu/acpi_table.c b/arch/x86/cpu/qemu/acpi_table.c
index cefd5f4..f055646 100644
--- a/arch/x86/cpu/qemu/acpi_table.c
+++ b/arch/x86/cpu/qemu/acpi_table.c
@@ -98,13 +98,15 @@ static int acpi_create_madt_lapic(struct
acpi_madt_lapic *lapic, u8 cpu, u8 apic
 static unsigned long acpi_create_madt_lapics(unsigned long current)
 {
        struct udevice *dev;
+       int index = 0;

         for (uclass_find_first_device(UCLASS_CPU, &dev);
              dev;
              uclass_find_next_device(&dev)) {
                 struct cpu_platdata *plat = dev_get_parent_platdata(dev);

-               current += acpi_create_madt_lapic((struct
acpi_madt_lapic *)current, plat->cpu_id, plat->cpu_id);
+               current += acpi_create_madt_lapic((struct
acpi_madt_lapic *)current, index, plat->cpu_id);
+               index++;
        }
         return current;
 }


Regards,
Saket Sinha


More information about the U-Boot mailing list