17f5df8d4SBin Meng /* 27f5df8d4SBin Meng * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> 37f5df8d4SBin Meng * 47f5df8d4SBin Meng * Adapted from coreboot src/arch/x86/include/arch/smp/mpspec.h 57f5df8d4SBin Meng * 67f5df8d4SBin Meng * SPDX-License-Identifier: GPL-2.0+ 77f5df8d4SBin Meng */ 87f5df8d4SBin Meng 97f5df8d4SBin Meng #ifndef __ASM_MPSPEC_H 107f5df8d4SBin Meng #define __ASM_MPSPEC_H 117f5df8d4SBin Meng 127f5df8d4SBin Meng /* 137f5df8d4SBin Meng * Structure definitions for SMP machines following the 147f5df8d4SBin Meng * Intel MultiProcessor Specification 1.4 157f5df8d4SBin Meng */ 167f5df8d4SBin Meng 177f5df8d4SBin Meng #define MPSPEC_V14 4 187f5df8d4SBin Meng 197f5df8d4SBin Meng #define MPF_SIGNATURE "_MP_" 207f5df8d4SBin Meng 217f5df8d4SBin Meng struct mp_floating_table { 227f5df8d4SBin Meng char mpf_signature[4]; /* "_MP_" */ 237f5df8d4SBin Meng u32 mpf_physptr; /* Configuration table address */ 247f5df8d4SBin Meng u8 mpf_length; /* Our length (paragraphs) */ 257f5df8d4SBin Meng u8 mpf_spec; /* Specification version */ 267f5df8d4SBin Meng u8 mpf_checksum; /* Checksum (makes sum 0) */ 277f5df8d4SBin Meng u8 mpf_feature1; /* Predefined or Unique configuration? */ 287f5df8d4SBin Meng u8 mpf_feature2; /* Bit7 set for IMCR/PIC */ 297f5df8d4SBin Meng u8 mpf_feature3; /* Unused (0) */ 307f5df8d4SBin Meng u8 mpf_feature4; /* Unused (0) */ 317f5df8d4SBin Meng u8 mpf_feature5; /* Unused (0) */ 327f5df8d4SBin Meng }; 337f5df8d4SBin Meng 347f5df8d4SBin Meng #define MPC_SIGNATURE "PCMP" 357f5df8d4SBin Meng 367f5df8d4SBin Meng struct mp_config_table { 377f5df8d4SBin Meng char mpc_signature[4]; /* "PCMP" */ 387f5df8d4SBin Meng u16 mpc_length; /* Size of table */ 397f5df8d4SBin Meng u8 mpc_spec; /* Specification version */ 407f5df8d4SBin Meng u8 mpc_checksum; /* Checksum (makes sum 0) */ 417f5df8d4SBin Meng char mpc_oem[8]; /* OEM ID */ 427f5df8d4SBin Meng char mpc_product[12]; /* Product ID */ 437f5df8d4SBin Meng u32 mpc_oemptr; /* OEM table address */ 447f5df8d4SBin Meng u16 mpc_oemsize; /* OEM table size */ 457f5df8d4SBin Meng u16 mpc_entry_count; /* Number of entries in the table */ 467f5df8d4SBin Meng u32 mpc_lapic; /* Local APIC address */ 477f5df8d4SBin Meng u16 mpe_length; /* Extended table size */ 487f5df8d4SBin Meng u8 mpe_checksum; /* Extended table checksum */ 497f5df8d4SBin Meng u8 reserved; 507f5df8d4SBin Meng }; 517f5df8d4SBin Meng 527f5df8d4SBin Meng /* Base MP configuration table entry types */ 537f5df8d4SBin Meng 547f5df8d4SBin Meng enum mp_base_config_entry_type { 557f5df8d4SBin Meng MP_PROCESSOR, 567f5df8d4SBin Meng MP_BUS, 577f5df8d4SBin Meng MP_IOAPIC, 587f5df8d4SBin Meng MP_INTSRC, 597f5df8d4SBin Meng MP_LINTSRC 607f5df8d4SBin Meng }; 617f5df8d4SBin Meng 627f5df8d4SBin Meng #define MPC_CPU_EN (1 << 0) 637f5df8d4SBin Meng #define MPC_CPU_BP (1 << 1) 647f5df8d4SBin Meng 657f5df8d4SBin Meng struct mpc_config_processor { 667f5df8d4SBin Meng u8 mpc_type; 677f5df8d4SBin Meng u8 mpc_apicid; 687f5df8d4SBin Meng u8 mpc_apicver; 697f5df8d4SBin Meng u8 mpc_cpuflag; 707f5df8d4SBin Meng u32 mpc_cpusignature; 717f5df8d4SBin Meng u32 mpc_cpufeature; 727f5df8d4SBin Meng u32 mpc_reserved[2]; 737f5df8d4SBin Meng }; 747f5df8d4SBin Meng 757f5df8d4SBin Meng #define BUSTYPE_CBUS "CBUS " 767f5df8d4SBin Meng #define BUSTYPE_CBUSII "CBUSII" 777f5df8d4SBin Meng #define BUSTYPE_EISA "EISA " 787f5df8d4SBin Meng #define BUSTYPE_FUTURE "FUTURE" 797f5df8d4SBin Meng #define BUSTYPE_INTERN "INTERN" 807f5df8d4SBin Meng #define BUSTYPE_ISA "ISA " 817f5df8d4SBin Meng #define BUSTYPE_MBI "MBI " 827f5df8d4SBin Meng #define BUSTYPE_MBII "MBII " 837f5df8d4SBin Meng #define BUSTYPE_MCA "MCA " 847f5df8d4SBin Meng #define BUSTYPE_MPI "MPI " 857f5df8d4SBin Meng #define BUSTYPE_MPSA "MPSA " 867f5df8d4SBin Meng #define BUSTYPE_NUBUS "NUBUS " 877f5df8d4SBin Meng #define BUSTYPE_PCI "PCI " 887f5df8d4SBin Meng #define BUSTYPE_PCMCIA "PCMCIA" 897f5df8d4SBin Meng #define BUSTYPE_TC "TC " 907f5df8d4SBin Meng #define BUSTYPE_VL "VL " 917f5df8d4SBin Meng #define BUSTYPE_VME "VME " 927f5df8d4SBin Meng #define BUSTYPE_XPRESS "XPRESS" 937f5df8d4SBin Meng 947f5df8d4SBin Meng struct mpc_config_bus { 957f5df8d4SBin Meng u8 mpc_type; 967f5df8d4SBin Meng u8 mpc_busid; 977f5df8d4SBin Meng u8 mpc_bustype[6]; 987f5df8d4SBin Meng }; 997f5df8d4SBin Meng 1007f5df8d4SBin Meng #define MPC_APIC_USABLE (1 << 0) 1017f5df8d4SBin Meng 1027f5df8d4SBin Meng struct mpc_config_ioapic { 1037f5df8d4SBin Meng u8 mpc_type; 1047f5df8d4SBin Meng u8 mpc_apicid; 1057f5df8d4SBin Meng u8 mpc_apicver; 1067f5df8d4SBin Meng u8 mpc_flags; 1077f5df8d4SBin Meng u32 mpc_apicaddr; 1087f5df8d4SBin Meng }; 1097f5df8d4SBin Meng 1107f5df8d4SBin Meng enum mp_irq_source_types { 1117f5df8d4SBin Meng MP_INT, 1127f5df8d4SBin Meng MP_NMI, 1137f5df8d4SBin Meng MP_SMI, 1147f5df8d4SBin Meng MP_EXTINT 1157f5df8d4SBin Meng }; 1167f5df8d4SBin Meng 1177f5df8d4SBin Meng #define MP_IRQ_POLARITY_DEFAULT 0x0 1187f5df8d4SBin Meng #define MP_IRQ_POLARITY_HIGH 0x1 1197f5df8d4SBin Meng #define MP_IRQ_POLARITY_LOW 0x3 1207f5df8d4SBin Meng #define MP_IRQ_POLARITY_MASK 0x3 1217f5df8d4SBin Meng #define MP_IRQ_TRIGGER_DEFAULT 0x0 1227f5df8d4SBin Meng #define MP_IRQ_TRIGGER_EDGE 0x4 1237f5df8d4SBin Meng #define MP_IRQ_TRIGGER_LEVEL 0xc 1247f5df8d4SBin Meng #define MP_IRQ_TRIGGER_MASK 0xc 1257f5df8d4SBin Meng 1267f5df8d4SBin Meng #define MP_APIC_ALL 0xff 1277f5df8d4SBin Meng 1287f5df8d4SBin Meng struct mpc_config_intsrc { 1297f5df8d4SBin Meng u8 mpc_type; 1307f5df8d4SBin Meng u8 mpc_irqtype; 1317f5df8d4SBin Meng u16 mpc_irqflag; 1327f5df8d4SBin Meng u8 mpc_srcbus; 1337f5df8d4SBin Meng u8 mpc_srcbusirq; 1347f5df8d4SBin Meng u8 mpc_dstapic; 1357f5df8d4SBin Meng u8 mpc_dstirq; 1367f5df8d4SBin Meng }; 1377f5df8d4SBin Meng 1387f5df8d4SBin Meng struct mpc_config_lintsrc { 1397f5df8d4SBin Meng u8 mpc_type; 1407f5df8d4SBin Meng u8 mpc_irqtype; 1417f5df8d4SBin Meng u16 mpc_irqflag; 1427f5df8d4SBin Meng u8 mpc_srcbusid; 1437f5df8d4SBin Meng u8 mpc_srcbusirq; 1447f5df8d4SBin Meng u8 mpc_destapic; 1457f5df8d4SBin Meng u8 mpc_destlint; 1467f5df8d4SBin Meng }; 1477f5df8d4SBin Meng 1487f5df8d4SBin Meng /* Extended MP configuration table entry types */ 1497f5df8d4SBin Meng 1507f5df8d4SBin Meng enum mp_ext_config_entry_type { 1517f5df8d4SBin Meng MPE_SYSTEM_ADDRESS_SPACE = 128, 1527f5df8d4SBin Meng MPE_BUS_HIERARCHY, 1537f5df8d4SBin Meng MPE_COMPAT_ADDRESS_SPACE 1547f5df8d4SBin Meng }; 1557f5df8d4SBin Meng 1567f5df8d4SBin Meng struct mp_ext_config { 1577f5df8d4SBin Meng u8 mpe_type; 1587f5df8d4SBin Meng u8 mpe_length; 1597f5df8d4SBin Meng }; 1607f5df8d4SBin Meng 1617f5df8d4SBin Meng #define ADDRESS_TYPE_IO 0 1627f5df8d4SBin Meng #define ADDRESS_TYPE_MEM 1 1637f5df8d4SBin Meng #define ADDRESS_TYPE_PREFETCH 2 1647f5df8d4SBin Meng 1657f5df8d4SBin Meng struct mp_ext_system_address_space { 1667f5df8d4SBin Meng u8 mpe_type; 1677f5df8d4SBin Meng u8 mpe_length; 1687f5df8d4SBin Meng u8 mpe_busid; 1697f5df8d4SBin Meng u8 mpe_addr_type; 1707f5df8d4SBin Meng u32 mpe_addr_base_low; 1717f5df8d4SBin Meng u32 mpe_addr_base_high; 1727f5df8d4SBin Meng u32 mpe_addr_length_low; 1737f5df8d4SBin Meng u32 mpe_addr_length_high; 1747f5df8d4SBin Meng }; 1757f5df8d4SBin Meng 1767f5df8d4SBin Meng #define BUS_SUBTRACTIVE_DECODE (1 << 0) 1777f5df8d4SBin Meng 1787f5df8d4SBin Meng struct mp_ext_bus_hierarchy { 1797f5df8d4SBin Meng u8 mpe_type; 1807f5df8d4SBin Meng u8 mpe_length; 1817f5df8d4SBin Meng u8 mpe_busid; 1827f5df8d4SBin Meng u8 mpe_bus_info; 1837f5df8d4SBin Meng u8 mpe_parent_busid; 1847f5df8d4SBin Meng u8 reserved[3]; 1857f5df8d4SBin Meng }; 1867f5df8d4SBin Meng 1877f5df8d4SBin Meng #define ADDRESS_RANGE_ADD 0 1887f5df8d4SBin Meng #define ADDRESS_RANGE_SUBTRACT 1 1897f5df8d4SBin Meng 1907f5df8d4SBin Meng /* 1917f5df8d4SBin Meng * X100 - X3FF 1927f5df8d4SBin Meng * X500 - X7FF 1937f5df8d4SBin Meng * X900 - XBFF 1947f5df8d4SBin Meng * XD00 - XFFF 1957f5df8d4SBin Meng */ 1967f5df8d4SBin Meng #define RANGE_LIST_IO_ISA 0 1977f5df8d4SBin Meng /* 1987f5df8d4SBin Meng * X3B0 - X3BB 1997f5df8d4SBin Meng * X3C0 - X3DF 2007f5df8d4SBin Meng * X7B0 - X7BB 2017f5df8d4SBin Meng * X7C0 - X7DF 2027f5df8d4SBin Meng * XBB0 - XBBB 2037f5df8d4SBin Meng * XBC0 - XBDF 2047f5df8d4SBin Meng * XFB0 - XFBB 2057f5df8d4SBin Meng * XFC0 - XCDF 2067f5df8d4SBin Meng */ 2077f5df8d4SBin Meng #define RANGE_LIST_IO_VGA 1 2087f5df8d4SBin Meng 2097f5df8d4SBin Meng struct mp_ext_compat_address_space { 2107f5df8d4SBin Meng u8 mpe_type; 2117f5df8d4SBin Meng u8 mpe_length; 2127f5df8d4SBin Meng u8 mpe_busid; 2137f5df8d4SBin Meng u8 mpe_addr_modifier; 2147f5df8d4SBin Meng u32 mpe_range_list; 2157f5df8d4SBin Meng }; 2167f5df8d4SBin Meng 2177f5df8d4SBin Meng /** 2187f5df8d4SBin Meng * mp_next_mpc_entry() - Compute MP configuration table end to be used as 2197f5df8d4SBin Meng * next base table entry start address 2207f5df8d4SBin Meng * 2217f5df8d4SBin Meng * This computes the end address of current MP configuration table, without 2227f5df8d4SBin Meng * counting any extended configuration table entry. 2237f5df8d4SBin Meng * 2247f5df8d4SBin Meng * @mc: configuration table header address 2257f5df8d4SBin Meng * @return: configuration table end address 2267f5df8d4SBin Meng */ 2277f5df8d4SBin Meng static inline u32 mp_next_mpc_entry(struct mp_config_table *mc) 2287f5df8d4SBin Meng { 2297f5df8d4SBin Meng return (u32)mc + mc->mpc_length; 2307f5df8d4SBin Meng } 2317f5df8d4SBin Meng 2327f5df8d4SBin Meng /** 2337f5df8d4SBin Meng * mp_add_mpc_entry() - Add a base MP configuration table entry 2347f5df8d4SBin Meng * 2357f5df8d4SBin Meng * This adds the base MP configuration table entry size with 2367f5df8d4SBin Meng * added base table entry length and increases entry count by 1. 2377f5df8d4SBin Meng * 2387f5df8d4SBin Meng * @mc: configuration table header address 2397f5df8d4SBin Meng * @length: length of the added table entry 2407f5df8d4SBin Meng */ 2417f5df8d4SBin Meng static inline void mp_add_mpc_entry(struct mp_config_table *mc, uint length) 2427f5df8d4SBin Meng { 2437f5df8d4SBin Meng mc->mpc_length += length; 2447f5df8d4SBin Meng mc->mpc_entry_count++; 2457f5df8d4SBin Meng } 2467f5df8d4SBin Meng 2477f5df8d4SBin Meng /** 2487f5df8d4SBin Meng * mp_next_mpe_entry() - Compute MP configuration table end to be used as 2497f5df8d4SBin Meng * next extended table entry start address 2507f5df8d4SBin Meng * 2517f5df8d4SBin Meng * This computes the end address of current MP configuration table, 2527f5df8d4SBin Meng * including any extended configuration table entry. 2537f5df8d4SBin Meng * 2547f5df8d4SBin Meng * @mc: configuration table header address 2557f5df8d4SBin Meng * @return: configuration table end address 2567f5df8d4SBin Meng */ 2577f5df8d4SBin Meng static inline u32 mp_next_mpe_entry(struct mp_config_table *mc) 2587f5df8d4SBin Meng { 2597f5df8d4SBin Meng return (u32)mc + mc->mpc_length + mc->mpe_length; 2607f5df8d4SBin Meng } 2617f5df8d4SBin Meng 2627f5df8d4SBin Meng /** 2637f5df8d4SBin Meng * mp_add_mpe_entry() - Add an extended MP configuration table entry 2647f5df8d4SBin Meng * 2657f5df8d4SBin Meng * This adds the extended MP configuration table entry size with 2667f5df8d4SBin Meng * added extended table entry length. 2677f5df8d4SBin Meng * 2687f5df8d4SBin Meng * @mc: configuration table header address 2697f5df8d4SBin Meng * @mpe: extended table entry base address 2707f5df8d4SBin Meng */ 2717f5df8d4SBin Meng static inline void mp_add_mpe_entry(struct mp_config_table *mc, 2727f5df8d4SBin Meng struct mp_ext_config *mpe) 2737f5df8d4SBin Meng { 2747f5df8d4SBin Meng mc->mpe_length += mpe->mpe_length; 2757f5df8d4SBin Meng } 2767f5df8d4SBin Meng 2777f5df8d4SBin Meng /** 2787f5df8d4SBin Meng * mp_write_floating_table() - Write the MP floating table 2797f5df8d4SBin Meng * 2807f5df8d4SBin Meng * This writes the MP floating table, and points MP configuration table 2817f5df8d4SBin Meng * to its end address so that MP configuration table follows immediately 2827f5df8d4SBin Meng * after the floating table. 2837f5df8d4SBin Meng * 2847f5df8d4SBin Meng * @mf: MP floating table base address 2857f5df8d4SBin Meng * @return: MP configuration table header address 2867f5df8d4SBin Meng */ 2877f5df8d4SBin Meng struct mp_config_table *mp_write_floating_table(struct mp_floating_table *mf); 2887f5df8d4SBin Meng 2897f5df8d4SBin Meng /** 2907f5df8d4SBin Meng * mp_config_table_init() - Initialize the MP configuration table header 2917f5df8d4SBin Meng * 2927f5df8d4SBin Meng * This populates the MP configuration table header with valid bits. 2937f5df8d4SBin Meng * 2947f5df8d4SBin Meng * @mc: MP configuration table header address 2957f5df8d4SBin Meng */ 2967f5df8d4SBin Meng void mp_config_table_init(struct mp_config_table *mc); 2977f5df8d4SBin Meng 2987f5df8d4SBin Meng /** 2997f5df8d4SBin Meng * mp_write_processor() - Write a processor entry 3007f5df8d4SBin Meng * 3017f5df8d4SBin Meng * This writes a processor entry to the configuration table. 3027f5df8d4SBin Meng * 3037f5df8d4SBin Meng * @mc: MP configuration table header address 3047f5df8d4SBin Meng */ 3057f5df8d4SBin Meng void mp_write_processor(struct mp_config_table *mc); 3067f5df8d4SBin Meng 3077f5df8d4SBin Meng /** 3087f5df8d4SBin Meng * mp_write_bus() - Write a bus entry 3097f5df8d4SBin Meng * 3107f5df8d4SBin Meng * This writes a bus entry to the configuration table. 3117f5df8d4SBin Meng * 3127f5df8d4SBin Meng * @mc: MP configuration table header address 3137f5df8d4SBin Meng * @id: bus id 3147f5df8d4SBin Meng * @bustype: bus type name 3157f5df8d4SBin Meng */ 3167f5df8d4SBin Meng void mp_write_bus(struct mp_config_table *mc, int id, const char *bustype); 3177f5df8d4SBin Meng 3187f5df8d4SBin Meng /** 3197f5df8d4SBin Meng * mp_write_ioapic() - Write an I/O APIC entry 3207f5df8d4SBin Meng * 3217f5df8d4SBin Meng * This writes an I/O APIC entry to the configuration table. 3227f5df8d4SBin Meng * 3237f5df8d4SBin Meng * @mc: MP configuration table header address 3247f5df8d4SBin Meng * @id: I/O APIC id 3257f5df8d4SBin Meng * @ver: I/O APIC version 3267f5df8d4SBin Meng * @apicaddr: I/O APIC address 3277f5df8d4SBin Meng */ 3287f5df8d4SBin Meng void mp_write_ioapic(struct mp_config_table *mc, int id, int ver, u32 apicaddr); 3297f5df8d4SBin Meng 3307f5df8d4SBin Meng /** 3317f5df8d4SBin Meng * mp_write_intsrc() - Write an I/O interrupt assignment entry 3327f5df8d4SBin Meng * 3337f5df8d4SBin Meng * This writes an I/O interrupt assignment entry to the configuration table. 3347f5df8d4SBin Meng * 3357f5df8d4SBin Meng * @mc: MP configuration table header address 3367f5df8d4SBin Meng * @irqtype: IRQ type (INT/NMI/SMI/ExtINT) 3377f5df8d4SBin Meng * @irqflag: IRQ flag (level/trigger) 3387f5df8d4SBin Meng * @srcbus: source bus id where the interrupt comes from 3397f5df8d4SBin Meng * @srcbusirq: IRQ number mapped on the source bus 3407f5df8d4SBin Meng * @dstapic: destination I/O APIC id where the interrupt goes to 3417f5df8d4SBin Meng * @dstirq: destination I/O APIC pin where the interrupt goes to 3427f5df8d4SBin Meng */ 3437f5df8d4SBin Meng void mp_write_intsrc(struct mp_config_table *mc, int irqtype, int irqflag, 3447f5df8d4SBin Meng int srcbus, int srcbusirq, int dstapic, int dstirq); 3457f5df8d4SBin Meng 3467f5df8d4SBin Meng /** 3477f5df8d4SBin Meng * mp_write_pci_intsrc() - Write a PCI interrupt assignment entry 3487f5df8d4SBin Meng * 3497f5df8d4SBin Meng * This writes a PCI interrupt assignment entry to the configuration table. 3507f5df8d4SBin Meng * 3517f5df8d4SBin Meng * @mc: MP configuration table header address 3527f5df8d4SBin Meng * @irqtype: IRQ type (INT/NMI/SMI/ExtINT) 3537f5df8d4SBin Meng * @srcbus: PCI bus number where the interrupt comes from 3547f5df8d4SBin Meng * @dev: device number on the PCI bus 3557f5df8d4SBin Meng * @pin: PCI interrupt pin (INT A/B/C/D) 3567f5df8d4SBin Meng * @dstapic: destination I/O APIC id where the interrupt goes to 3577f5df8d4SBin Meng * @dstirq: destination I/O APIC pin where the interrupt goes to 3587f5df8d4SBin Meng */ 3597f5df8d4SBin Meng void mp_write_pci_intsrc(struct mp_config_table *mc, int irqtype, 3607f5df8d4SBin Meng int srcbus, int dev, int pin, int dstapic, int dstirq); 3617f5df8d4SBin Meng 3627f5df8d4SBin Meng /** 3637f5df8d4SBin Meng * mp_write_lintsrc() - Write a local interrupt assignment entry 3647f5df8d4SBin Meng * 3657f5df8d4SBin Meng * This writes a local interrupt assignment entry to the configuration table. 3667f5df8d4SBin Meng * 3677f5df8d4SBin Meng * @mc: MP configuration table header address 3687f5df8d4SBin Meng * @irqtype: IRQ type (INT/NMI/SMI/ExtINT) 3697f5df8d4SBin Meng * @irqflag: IRQ flag (level/trigger) 3707f5df8d4SBin Meng * @srcbus: PCI bus number where the interrupt comes from 3717f5df8d4SBin Meng * @srcbusirq: IRQ number mapped on the source bus 3727f5df8d4SBin Meng * @dstapic: destination local APIC id where the interrupt goes to 3737f5df8d4SBin Meng * @destlint: destination local APIC pin where the interrupt goes to 3747f5df8d4SBin Meng */ 3757f5df8d4SBin Meng void mp_write_lintsrc(struct mp_config_table *mc, int irqtype, int irqflag, 3767f5df8d4SBin Meng int srcbus, int srcbusirq, int destapic, int destlint); 3777f5df8d4SBin Meng 3787f5df8d4SBin Meng 3797f5df8d4SBin Meng /** 3807f5df8d4SBin Meng * mp_write_address_space() - Write a system address space entry 3817f5df8d4SBin Meng * 3827f5df8d4SBin Meng * This writes a system address space entry to the configuration table. 3837f5df8d4SBin Meng * 3847f5df8d4SBin Meng * @mc: MP configuration table header address 3857f5df8d4SBin Meng * @busid: bus id for the bus where system address space is mapped 3867f5df8d4SBin Meng * @addr_type: system address type 3877f5df8d4SBin Meng * @addr_base_low: starting address low 3887f5df8d4SBin Meng * @addr_base_high: starting address high 3897f5df8d4SBin Meng * @addr_length_low: address length low 3907f5df8d4SBin Meng * @addr_length_high: address length high 3917f5df8d4SBin Meng */ 3927f5df8d4SBin Meng void mp_write_address_space(struct mp_config_table *mc, 3937f5df8d4SBin Meng int busid, int addr_type, 3947f5df8d4SBin Meng u32 addr_base_low, u32 addr_base_high, 3957f5df8d4SBin Meng u32 addr_length_low, u32 addr_length_high); 3967f5df8d4SBin Meng 3977f5df8d4SBin Meng /** 3987f5df8d4SBin Meng * mp_write_bus_hierarchy() - Write a bus hierarchy descriptor entry 3997f5df8d4SBin Meng * 4007f5df8d4SBin Meng * This writes a bus hierarchy descriptor entry to the configuration table. 4017f5df8d4SBin Meng * 4027f5df8d4SBin Meng * @mc: MP configuration table header address 4037f5df8d4SBin Meng * @busid: bus id 4047f5df8d4SBin Meng * @bus_info: bit0 indicates if the bus is a subtractive decode bus 4057f5df8d4SBin Meng * @parent_busid: parent bus id 4067f5df8d4SBin Meng */ 4077f5df8d4SBin Meng void mp_write_bus_hierarchy(struct mp_config_table *mc, 4087f5df8d4SBin Meng int busid, int bus_info, int parent_busid); 4097f5df8d4SBin Meng 4107f5df8d4SBin Meng /** 4117f5df8d4SBin Meng * mp_write_compat_address_space() - Write a compat bus address space entry 4127f5df8d4SBin Meng * 4137f5df8d4SBin Meng * This writes a compatibility bus address space modifier entry to the 4147f5df8d4SBin Meng * configuration table. 4157f5df8d4SBin Meng * 4167f5df8d4SBin Meng * @mc: MP configuration table header address 4177f5df8d4SBin Meng * @busid: bus id 4187f5df8d4SBin Meng * @addr_modifier: add or subtract to predefined address range list 4197f5df8d4SBin Meng * @range_list: list of predefined address space ranges 4207f5df8d4SBin Meng */ 4217f5df8d4SBin Meng void mp_write_compat_address_space(struct mp_config_table *mc, int busid, 4227f5df8d4SBin Meng int addr_modifier, u32 range_list); 4237f5df8d4SBin Meng 4247f5df8d4SBin Meng /** 4257f5df8d4SBin Meng * mptable_finalize() - Finalize the MP table 4267f5df8d4SBin Meng * 4277f5df8d4SBin Meng * This finalizes the MP table by calculating required checksums. 4287f5df8d4SBin Meng * 4297f5df8d4SBin Meng * @mc: MP configuration table header address 4307f5df8d4SBin Meng * @return: MP table end address 4317f5df8d4SBin Meng */ 4327f5df8d4SBin Meng u32 mptable_finalize(struct mp_config_table *mc); 4337f5df8d4SBin Meng 43407545d86SBin Meng /** 435abab9128SBin Meng * mp_determine_pci_dstirq() - Determine PCI device's int pin on the I/O APIC 436abab9128SBin Meng * 437abab9128SBin Meng * This determines a PCI device's interrupt pin number on the I/O APIC. 438abab9128SBin Meng * 439abab9128SBin Meng * This can be implemented by platform codes to handle specifal cases, which 440abab9128SBin Meng * do not conform to the normal chipset/board design where PIRQ[A-H] are mapped 441abab9128SBin Meng * directly to I/O APIC INTPIN#16-23. 442abab9128SBin Meng * 443abab9128SBin Meng * @bus: bus number of the pci device 444abab9128SBin Meng * @dev: device number of the pci device 445abab9128SBin Meng * @func: function number of the pci device 446abab9128SBin Meng * @pirq: PIRQ number the PCI device's interrupt pin is routed to 447abab9128SBin Meng * @return: interrupt pin number on the I/O APIC 448abab9128SBin Meng */ 449abab9128SBin Meng int mp_determine_pci_dstirq(int bus, int dev, int func, int pirq); 450abab9128SBin Meng 451abab9128SBin Meng /** 45207545d86SBin Meng * write_mp_table() - Write MP table 45307545d86SBin Meng * 45407545d86SBin Meng * This writes MP table at a given address. 45507545d86SBin Meng * 45607545d86SBin Meng * @addr: start address to write MP table 45707545d86SBin Meng * @return: end address of MP table 45807545d86SBin Meng */ 459*42fd8c19SSimon Glass ulong write_mp_table(ulong addr); 46007545d86SBin Meng 4617f5df8d4SBin Meng #endif /* __ASM_MPSPEC_H */ 462