[U-Boot] [PATCH v2 12/15] x86: Generate a valid MultiProcessor (MP) table
Bin Meng
bmeng.cn at gmail.com
Tue Jun 23 08:15:51 CEST 2015
Hi Simon,
On Fri, Jun 19, 2015 at 12:15 PM, Bin Meng <bmeng.cn at gmail.com> wrote:
> On Thu, Jun 18, 2015 at 4:17 PM, Bin Meng <bmeng.cn at gmail.com> wrote:
>> Implement write_mp_table() to create a minimal working MP table.
>> This includes an MP floating table, a configuration table header
>> and all of the 5 base configuration table entries. The I/O interrupt
>> assignment table entry is created based on the same information used
>> in the creation of PIRQ routing table from device tree. A check
>> duplicated entry logic is applied to prevent writing multiple I/O
>> interrupt entries with the same information.
>>
>> Use a Kconfig option GENERATE_MP_TABLE to tell U-Boot whether we
>> need actually write the MP table at the F seg, just like we did for
>> PIRQ routing and SFI tables. With MP table existence, linux kernel
>> will switch to I/O APIC and local APIC to process all the peripheral
>> interrupts instead of 8259 PICs. This takes full advantage of the
>> multicore hardware and the SMP kernel.
>>
>> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
>>
>> ---
>>
>> Changes in v2:
>> - Avoid using u16 and u8 in parameters
>> - Add a comment block for check_dup_entry()
>> - Return and check error codes of mptable_add_intsrc()
>> - Remove __weak for write_mp_table()
>>
>
> [snip]
>
>> +u32 write_mp_table(u32 addr)
>> +{
>> + struct mp_config_table *mc;
>> + int ioapic_id, ioapic_ver;
>> + int bus_isa = 0xff;
>> + int ret;
>> + u32 end;
>> +
>> + /* 16 byte align the table address */
>> + addr = ALIGN(addr, 16);
>> +
>> + /* Write floating table */
>> + mc = mp_write_floating_table((struct mp_floating_table *)addr);
>> +
>> + /* Write configuration table header */
>> + mp_config_table_init(mc);
>> +
>> + /* Write processor entry */
>> + mp_write_processor(mc);
>> +
>> + /* Write bus entry */
>> + mp_write_bus(mc, bus_isa, BUSTYPE_ISA);
>> +
>> + /* Write I/O APIC entry */
>> + ioapic_id = io_apic_read(IO_APIC_ID) >> 24;
>> + ioapic_ver = io_apic_read(IO_APIC_VER) & 0xff;
>> + mp_write_ioapic(mc, ioapic_id, ioapic_ver, IO_APIC_ADDR);
>> +
>> + /* Write I/O interrupt assignment entry */
>> + ret = mptable_add_intsrc(mc, bus_isa, ioapic_id);
>> + if (!ret)
>
> Sorry, the logic is wrong here. Should be if (ret)
>
I sent a respin patch series which just fixed the "if (!ret)" logic.
Please have a look.
http://patchwork.ozlabs.org/patch/487491/
[snip]
Regards,
Bin
More information about the U-Boot
mailing list