aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/linux/modules
Commit message (Collapse)AuthorAgeFilesLines
...
* kernel: add IEEE-1284 parallel port supportDaniel Gimpelevich2018-02-121-5/+40
| | | | | | | | | | The kmod-lp package included both lp.ko and ppdev.ko, but ECP device drivers may or may not require lp NOT to be loaded, needing only ppdev. Additionally, There were no packages for any parport interface modules, such as uss720 or parport_pc, provided here. It has not been otherwise possible to use PC-style parport hardware for kmod-lp. Signed-off-by: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
* kernel: add kmod-fouFilip Moc2018-02-101-0/+22
| | | | | | | | | Once installed fou kernel module allows you to use FOU (Foo over UDP) and GUE (Generic UDP encapsulation) tunnel protocols. To get ip fou command working you also need to install ip-full. Signed-off-by: Filip Moc <lede@moc6.cz>
* kernel: remove kmod-spi-gpio-oldFelix Fietkau2018-02-091-16/+0
| | | | | | It is unused and has been deprecated for a long time Signed-off-by: Felix Fietkau <nbd@nbd.name>
* leds: correct ledtrig-heartbeat Kconfig descriptionHans Dedecker2018-02-021-1/+1
| | | | | | Fix ledtrig-heartbeat Kconfig description Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
* netfilter: add missing dependency to kmod-ipt-tproxyMatthias Schiffer2018-01-311-1/+1
| | | | | Fixes: e7e025426a "netfilter: clean up dependencies of kernel modules" Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
* netfilter: add packages for arp and bridge tables of nftablesMatthias Schiffer2018-01-311-2/+26
| | | | Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
* netfilter: clean up dependencies of kernel modulesMatthias Schiffer2018-01-311-15/+38
| | | | | | | | | The nf_reject_ipv4 and nf_reject_ipv6 modules are moved into separate packages, as they are a common dependency of ip(6)tables and nftables. This avoids a dependency of nftables on kmod-nf-ipt(6). Also, fewer iptables modules depend on nf-conntrack(6) now. Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
* kernel: add test MTD driver packageHans Dedecker2018-01-291-0/+16
| | | | | | Allows to test MTD driver using RAM Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
* netdevices.mk: add missing dependency to kmod-hwmon-coreHauke Mehrtens2018-01-291-2/+2
| | | | | | | The IGB and IXGBE drivers depend on kmod-hwmon core now. Fixes: af707a178fa5 ("netdevices.mk: add hwmon to IGB and IXGBE drivers") Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* netdevices.mk: add hwmon to IGB and IXGBE driversPhilip Prindeville2018-01-291-4/+4
| | | | | | | | | | Off-chip NICs can run hotter than the CPU, so they're definitely worth instrumenting. Adding hardware monitoring increases by ~3744 and ~2672 bytes, respectively, the sizes of the igb.ko and ixgbe.ko drivers. Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
* Revert "netdevices.mk: add hwmon to IGB and IXGBE drivers"John Crispin2018-01-281-4/+4
| | | | | | This reverts commit af707a178fa5f23dcf149da3e545958c0085500a. Signed-off-by: John Crispin <john@phrozen.org>
* Revert "netdevices.mk: add missing dependency to kmod-hwmon-core"John Crispin2018-01-281-2/+2
| | | | | | | | | This reverts commit 53f62bc5e5c36c1a08e162d8b26de7d831fc36e5. commit made the builders fail with "Package kmod-igb is missing dependencies for the following libraries: hwmon.ko" Signed-off-by: John Crispin <john@phrozen.org>
* netdevices.mk: add missing dependency to kmod-hwmon-coreHauke Mehrtens2018-01-281-2/+2
| | | | | | | The IGB and IXGBE drivers depend on kmod-hwmon core now. Fixes: af707a178fa5 ("netdevices.mk: add hwmon to IGB and IXGBE drivers") Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* netdevices.mk: add hwmon to IGB and IXGBE driversPhilip Prindeville2018-01-271-4/+4
| | | | | | | | | | Off-chip NICs can run hotter than the CPU, so they're definitely worth instrumenting. Adding hardware monitoring increases by ~3744 and ~2672 bytes, respectively, the sizes of the igb.ko and ixgbe.ko drivers. Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
* kernel/modules/other: disable Nokia BT UARTTim Harvey2018-01-271-0/+1
| | | | | | disable the Nokia BT UART present on Nikia N9, N900 & N950 added in 4.12. Signed-off-by: Tim Harvey <tharvey@gateworks.com>
* iptables: make kmod-ipt-debug part of default ALL buildYousong Zhou2018-01-261-2/+1
| | | | | | | | | The iptables TRACE target is only available in raw table that's why the dependency was moved from iptables-mod-trace into kmod-ipt-debug Fixes FS#1219 Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
* Revert "kernel: add IEEE-1284 parallel port support"Jo-Philipp Wich2018-01-221-38/+5
| | | | | | | | | This reverts commit 666e9cf2220b11ccd024cad13ad54ca71d40c5b3. The change has not been build-tested on non-x86 targets and leads to stalled kernel builds due to unset configuration symbols there. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
* kernel: add IEEE-1284 parallel port supportDaniel Gimpelevich2018-01-221-5/+38
| | | | | | | | | | The kmod-lp package included both lp.ko and ppdev.ko, but ECP device drivers may or may not require lp NOT to be loaded, needing only ppdev. Additionally, There were no packages for any parport interface modules, such as uss720 or parport_pc, provided here. It has not been otherwise possible to use PC-style parport hardware for kmod-lp. Signed-off-by: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
* netfilter: enable CONFIG_NF_CONNTRACK_MARK from kmod-nf-conntrackJo-Philipp Wich2018-01-161-0/+1
| | | | | | | | Unconditionally enable connmark support and tie it to the conntrack core module to allow removing this kernel configuration dependency from the xtables-addons package. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
* kernel: kmod-w1 depends on kmod-hwmon-core since Linux 4.14Jo-Philipp Wich2018-01-091-0/+1
| | | | | | | | | Fixes the following dependency error encountered by the buildbots: Package kmod-w1 is missing dependencies for the following libraries: hwmon.ko Signed-off-by: Jo-Philipp Wich <jo@mein.io>
* kernel: fix packaging of kmod-gpio-nxp-74hc164Jo-Philipp Wich2018-01-071-3/+3
| | | | | | | | | | | | | | | | The NXP 74HC164 GPIO expander driver uses a different config symbol ("CONFIG_GPIO_74X164") and module name since since at least Kernel version 2.6.37. Update the kmod package definition accordingly by adjusting kconfig and module file names. This unrelated, but correct change has been separated from the WNR2000v5 support commits. Ref: https://github.com/lede-project/source/pull/1256 Suggested-by: Raphael Catolino <raphael.catolino@gmail.com> Signed-off-by: Jo-Philipp Wich <jo@mein.io>
* kernel: make uas work during early bootDaniel Albers2018-01-021-1/+1
| | | | | | | | | | | | Add the uas(p) module to the modules loaded early on the boot process. The uas(p) is an modern alternative, which is used by the modern USB3 storage cases, compared to the bot protocol. To be able to use uas(p) storage cases for extroot, the kernel module has to be loaded before the search for extroot has been called. This patch changes the load order to support uas(p) storage cases for extroot. Signed-off-by: Daniel Albers <daniel.albers@public-files.de>
* kernel: add i2c-smbus module packagePhilip Prindeville2017-12-261-3/+18
| | | | | | | Intel motherboards (as well as the Cavium ThunderX SoC) use a superset of the I2C protocol called SMBus. Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
* kernel: kmod-crypto-hw-talitos: fix dependenciesHauke Mehrtens2017-12-201-1/+1
| | | | | | | | | | | With the updated to kernel 4.9.70 in commit f704b643b9cab ("kernel: Update kernel 4.9 to 4.9.70"), the talitos.ko kernel module got a new dependency to kmod-crypto-des in this upstream commit: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=552f74cbd6ec806ab5ce45336a26cae1e015dbe2 This fixes a build problem found by built bot. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add missing dependencies to kmod-crypto-acompressHauke Mehrtens2017-12-161-0/+2
| | | | | | | kmod-lib-lzo and kmod-lib-lz4 depend in kernel 4.14 on kmod-crypto-acompress, add this missing dependency. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-rtc-ds1307: add dependency to regmapHauke Mehrtens2017-12-161-1/+1
| | | | | | | In kernel 4.14 kmod-rtc-ds1307 depends on regmap-i2c, add this missing dependency. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-iio-bmp280: allow compile with kernel 4.14Hauke Mehrtens2017-12-161-1/+1
| | | | | | This package also compiles with kernel 4.14. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-zram: deactivate CONFIG_ZRAM_WRITEBACK for kernel 4.14Hauke Mehrtens2017-12-161-0/+1
| | | | | | | This new option was introduced in kernel 4.14 and should be deactivated by default. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-fbcon: deactivate for kernel 4.14Hauke Mehrtens2017-12-161-1/+1
| | | | | | | | CONFIG_FRAMEBUFFER_CONSOLE does not activate new modules any more in kernel 4.14, but CONFIG_FRAMEBUFFER_CONSOLE is now a boolean option which change the kmod-fb package. kmod-fbcon should be split up. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-sound-core: handle moved snd-seq-device.koHauke Mehrtens2017-12-161-1/+2
| | | | | | The snd-seq-device.ko kernel module was moved with kernel 4.13. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-mmc: handle moved mmc_block.koHauke Mehrtens2017-12-161-1/+2
| | | | | | mmc_block.ko was moved with kernel 4.10. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: kmod-rxrpc: handle renamed kernel moduleHauke Mehrtens2017-12-161-2/+3
| | | | | | | The kernel module was renamed with kernel 4.11, handle that in the package definition. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: deactivate some new network featuresHauke Mehrtens2017-12-161-2/+6
| | | | | | | | | | | This deactivates the following options which were introduced between kernel 4.9 and 4.14 in some kernel packages: CONFIG_INET_ESP_OFFLOAD CONFIG_INET6_ESP_OFFLOAD CONFIG_LWTUNNEL_BPF CONFIG_NET_9P_XEN Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: unset CONFIG_CIFS_SMB311 in kmod-fs-cifsHauke Mehrtens2017-12-161-1/+2
| | | | | | Do not activate the experimental feature CONFIG_CIFS_SMB311. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-crypto-ecdhHauke Mehrtens2017-12-162-1/+26
| | | | | | | | | | In kernel 4.14 kmod-bluetooth depends on kmod-crypto-ecdh, add kmod-crypto-ecdh to LEDE. Both packages also depend on the kmod-crypto-kpp package. To build this we have to fix the dependency of CRYPTO_ECDH which has a typo. This patch is already accepted upstream. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-crypto-rsaHauke Mehrtens2017-12-161-2/+20
| | | | | | | | In kernel 4.14 kmod-crypto-hw-ccp depends on kmod-crypto-rsa, add it. kmod-crypto-rsa also packages the ASN1 parser and some other code which is currently only used by this module. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-crypto-acompressHauke Mehrtens2017-12-161-1/+13
| | | | | | In kernel 4.14 kmod-crypto-deflate depends on kmod-crypto-acompress. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-lib-zstdHauke Mehrtens2017-12-162-1/+23
| | | | | | | In kernel 4.14 kmod-fs-btrfs depends on the zstd compression libraries, add it to the package system. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-daxHauke Mehrtens2017-12-161-1/+12
| | | | | | | In kernel 4.14 kmod-dm depends on kmod-dax. Add DAX: "Direct access to differentiated memory" to LEDE. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: tg3: deactivate hwmon for kernel 4.14Hauke Mehrtens2017-12-161-2/+3
| | | | | | | In kernel 4.14 hwmon support can be deactivated for the tg3 driver, deactivate it by default to save some space. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* netdevices.mk: add Sun Neptune 10Gbit EthernetLucian Cristian2017-12-161-0/+16
| | | | Signed-off-by: Lucian Cristian <lucian.cristian@gmail.com>
* kernel: tune e1000e module parametersJo-Philipp Wich2017-12-161-0/+3
| | | | | | | | | | | | | The default e1000e parameters (interrupt throttling rate, MSI/MSI-X mode) are optimized for desktop and server computers to optimize user-space execution (i.e. what's typically referred to as "useful" work). This assumption breaks on a router under load where most of the "useful" work actually takes place either in hardware interrupt handlers (IRQ) or at software IRQ (swirq) modes, so we try to reflect that by overriding these parameters with more appropriate values. Patch-by: Philip Prindeville <philipp@redfish-solutions.com> Signed-off-by: Jo-Philipp Wich <jo@mein.io>
* kernel: i2c-piix4: fix dependency on TARGET_x86Hauke Mehrtens2017-11-221-1/+1
| | | | | | | Fix the target dependency to make it possible to select this module also on x86 target and its subtargets. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: e100: take e100 firmware from linux-firmware repositoryHauke Mehrtens2017-11-221-8/+1
| | | | | | | | | The firmware directory in the Linux kernel was removed in kernel 4.14, take the e100 firmware files now from the linux-firmware repository instead. To do so create the new package e100-firmware. This will also work with older kernel versions. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add NFS4 client supportMarcin Jurkowski2017-11-222-17/+68
| | | | | | | | | | | | | | | | | | | Adds NFS4 client support: 1. Package kmod-fs-nfs is split into kmod-fs-nfs (nfs.ko) and kmod-fs-nfs-v3 (nfsv3.ko). 2. A new package kmod-fs-nfs-v4 (nfsv4.ko) is created. 3. Package kmod-fs-nfs-common-v4 is renamed to kmod-fs-nfs-rpcsec and includes additional module rpcsec_gss_krb5.ko. CONFIG_NFS_V4 goes into kmod-fs-nfs-v4, CONFIG_NFSD_V4 (NFS4 server) is removed. Missing kernel module oid_registry.ko needed by auth_rpcgss.ko is added to the package. A new package kmod-crypto-cts needed by rpcsec_gss_krb5.ko is also created. Signed-off-by: Marcin Jurkowski <marcin1j@gmail.com> [add dependency to kmod-crypto-ecb in fs-nfs-common-rpcsec] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add kmod-i2c-i801Martin Schiller2017-11-221-0/+26
| | | | | | Signed-off-by: Martin Schiller <ms@dev.tdt.de> [Add i2c-smbus.ko and fix target dependency] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: add it87-wdt watchdog timer moduleMartin Schiller2017-11-221-0/+18
| | | | | | | | | | | The module parameters "nogameport=1" and "nocir=1" are needed, because this is not supported on recent chips and doesn't really tell if the system is stable. As this features will already be removed in linux-4.13 or newer, this module parameters can be removed in the future. Signed-off-by: Martin Schiller <ms@dev.tdt.de>
* kernel: fix lzo and lz4 modulesJohn Crispin2017-11-201-2/+6
| | | | | | both of these have been split up and require additional ko files. Signed-off-by: John Crispin <john@phrozen.org>
* kernel: pull edgeport firmware from linux-firmware repoBjørn Mork2017-11-161-8/+1
| | | | | | | | The kernel firmware/ is going away, so pull this firmware from the linux-firmware git repo instead. No actual changes to the installed files. Signed-off-by: Bjørn Mork <bjorn@mork.no>
* kernel: add packaging for mtdoopsJianhui Zhao2017-11-151-0/+14
| | | | Signed-off-by: Jianhui Zhao <jianhuizhao329@gmail.com>
span>(KERN_ERR "ACPI 2.0 RSDP not found, default to \"dig\"\n"); return "dig"; } rsdp = (struct acpi_table_rsdp *)__va(rsdp_phys); if (strncmp(rsdp->signature, ACPI_SIG_RSDP, sizeof(ACPI_SIG_RSDP) - 1)) { printk(KERN_ERR "ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n"); return "dig"; } xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_physical_address); hdr = &xsdt->header; if (strncmp(hdr->signature, ACPI_SIG_XSDT, sizeof(ACPI_SIG_XSDT) - 1)) { printk(KERN_ERR "ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n"); return "dig"; } if (!strcmp(hdr->oem_id, "HP")) { return "hpzx1"; } else if (!strcmp(hdr->oem_id, "SGI")) { if (!strcmp(hdr->oem_table_id + 4, "UV")) return "uv"; else return "sn2"; #ifndef XEN } else if (is_running_on_xen() && !strcmp(hdr->oem_id, "XEN")) { return "xen"; #endif } return "dig"; #else # if defined (CONFIG_IA64_HP_SIM) return "hpsim"; # elif defined (CONFIG_IA64_HP_ZX1) return "hpzx1"; # elif defined (CONFIG_IA64_HP_ZX1_SWIOTLB) return "hpzx1_swiotlb"; # elif defined (CONFIG_IA64_SGI_SN2) return "sn2"; # elif defined (CONFIG_IA64_SGI_UV) return "uv"; # elif defined (CONFIG_IA64_DIG) return "dig"; # elif defined (CONFIG_IA64_XEN) return "xen"; # else # error Unknown platform. Fix acpi.c. # endif #endif } #ifdef CONFIG_ACPI #define ACPI_MAX_PLATFORM_INTERRUPTS 256 /* Array to record platform interrupt vectors for generic interrupt routing. */ int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = { [0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1 }; enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_IOSAPIC; /* * Interrupt routing API for device drivers. Provides interrupt vector for * a generic platform event. Currently only CPEI is implemented. */ int acpi_request_vector(u32 int_type) { int vector = -1; if (int_type < ACPI_MAX_PLATFORM_INTERRUPTS) { /* corrected platform error interrupt */ vector = platform_intr_list[int_type]; } else printk(KERN_ERR "acpi_request_vector(): invalid interrupt type\n"); return vector; } char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size) { return __va(phys_addr); } /* -------------------------------------------------------------------------- Boot-time Table Parsing -------------------------------------------------------------------------- */ static int total_cpus __initdata; static int available_cpus __initdata; struct acpi_table_madt *acpi_madt __initdata; static u8 has_8259; static int __init acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_local_apic_override *lapic; lapic = (struct acpi_madt_local_apic_override *)header; if (BAD_MADT_ENTRY(lapic, end)) return -EINVAL; if (lapic->address) { iounmap(ipi_base_addr); ipi_base_addr = ioremap(lapic->address, 0); } return 0; } #ifdef XEN #define MAX_LOCAL_SAPIC 255 static u16 ia64_acpiid_to_sapicid[ MAX_LOCAL_SAPIC ] = {[0 ... MAX_LOCAL_SAPIC - 1] = 0xffff }; /* acpi id to cpu id */ int get_cpu_id(u8 acpi_id) { int i; u16 apic_id; apic_id = ia64_acpiid_to_sapicid[acpi_id]; if ( apic_id == 0xffff ) return -EINVAL; for ( i = 0; i < NR_CPUS; i++ ) { if ( apic_id == ia64_cpu_to_sapicid[i] ) return i; } return -1; } #endif static int __init acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_local_sapic *lsapic; lsapic = (struct acpi_madt_local_sapic *)header; /*Skip BAD_MADT_ENTRY check, as lsapic size could vary */ if (lsapic->lapic_flags & ACPI_MADT_ENABLED) { #ifdef CONFIG_SMP smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; #endif #ifdef XEN ia64_acpiid_to_sapicid[lsapic->processor_id] = (lsapic->id << 8) | lsapic->eid; #endif ++available_cpus; } total_cpus++; return 0; } static int __init acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_local_apic_nmi *lacpi_nmi; lacpi_nmi = (struct acpi_madt_local_apic_nmi *)header; if (BAD_MADT_ENTRY(lacpi_nmi, end)) return -EINVAL; /* TBD: Support lapic_nmi entries */ return 0; } static int __init acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_io_sapic *iosapic; iosapic = (struct acpi_madt_io_sapic *)header; if (BAD_MADT_ENTRY(iosapic, end)) return -EINVAL; #ifndef XEN return iosapic_init(iosapic->address, iosapic->global_irq_base); #else return iosapic_init(iosapic->address, iosapic->global_irq_base, iosapic->id); #endif } static unsigned int __initdata acpi_madt_rev; static int __init acpi_parse_plat_int_src(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_interrupt_source *plintsrc; int vector; plintsrc = (struct acpi_madt_interrupt_source *)header; if (BAD_MADT_ENTRY(plintsrc, end)) return -EINVAL; /* * Get vector assignment for this interrupt, set attributes, * and program the IOSAPIC routing table. */ vector = iosapic_register_platform_intr(plintsrc->type, plintsrc->global_irq, plintsrc->io_sapic_vector, plintsrc->eid, plintsrc->id, ((plintsrc->inti_flags & ACPI_MADT_POLARITY_MASK) == ACPI_MADT_POLARITY_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, ((plintsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) == ACPI_MADT_TRIGGER_EDGE) ? IOSAPIC_EDGE : IOSAPIC_LEVEL); platform_intr_list[plintsrc->type] = vector; if (acpi_madt_rev > 1) { acpi_cpei_override = plintsrc->flags & ACPI_MADT_CPEI_OVERRIDE; } /* * Save the physical id, so we can check when its being removed */ acpi_cpei_phys_cpuid = ((plintsrc->id << 8) | (plintsrc->eid)) & 0xffff; return 0; } #ifdef CONFIG_HOTPLUG_CPU #ifdef XEN unsigned int force_cpei_retarget = 0; #endif unsigned int can_cpei_retarget(void) { extern int cpe_vector; extern unsigned int force_cpei_retarget; /* * Only if CPEI is supported and the override flag * is present, otherwise return that its re-targettable * if we are in polling mode. */ if (cpe_vector > 0) { if (acpi_cpei_override || force_cpei_retarget) return 1; else return 0; } return 1; } unsigned int is_cpu_cpei_target(unsigned int cpu) { unsigned int logical_id; logical_id = cpu_logical_id(acpi_cpei_phys_cpuid); if (logical_id == cpu) return 1; else return 0; } void set_cpei_target_cpu(unsigned int cpu) { acpi_cpei_phys_cpuid = cpu_physical_id(cpu); } #endif unsigned int get_cpei_target_cpu(void) { return acpi_cpei_phys_cpuid; } static int __init acpi_parse_int_src_ovr(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_interrupt_override *p; p = (struct acpi_madt_interrupt_override *)header; if (BAD_MADT_ENTRY(p, end)) return -EINVAL; iosapic_override_isa_irq(p->source_irq, p->global_irq, ((p->inti_flags & ACPI_MADT_POLARITY_MASK) == ACPI_MADT_POLARITY_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, ((p->inti_flags & ACPI_MADT_TRIGGER_MASK) == ACPI_MADT_TRIGGER_EDGE) ? IOSAPIC_EDGE : IOSAPIC_LEVEL); return 0; } static int __init acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end) { struct acpi_madt_nmi_source *nmi_src; nmi_src = (struct acpi_madt_nmi_source *)header; if (BAD_MADT_ENTRY(nmi_src, end)) return -EINVAL; /* TBD: Support nimsrc entries */ return 0; } static void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) { if (!strncmp(oem_id, "IBM", 3) && (!strncmp(oem_table_id, "SERMOW", 6))) { /* * Unfortunately ITC_DRIFT is not yet part of the * official SAL spec, so the ITC_DRIFT bit is not * set by the BIOS on this hardware. */ sal_platform_features |= IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT; #ifndef XEN cyclone_setup(); #endif } } static int __init acpi_parse_madt(struct acpi_table_header *table) { if (!table) return -EINVAL; acpi_madt = (struct acpi_table_madt *)table; acpi_madt_rev = acpi_madt->header.revision; /* remember the value for reference after free_initmem() */ #ifdef CONFIG_ITANIUM has_8259 = 1; /* Firmware on old Itanium systems is broken */ #else has_8259 = acpi_madt->flags & ACPI_MADT_PCAT_COMPAT; #endif iosapic_system_init(has_8259); /* Get base address of IPI Message Block */ if (acpi_madt->address) ipi_base_addr = ioremap(acpi_madt->address, 0); printk(KERN_INFO PREFIX "Local APIC address %p\n", ipi_base_addr); acpi_madt_oem_check(acpi_madt->header.oem_id, acpi_madt->header.oem_table_id); return 0; } #ifdef CONFIG_ACPI_NUMA #undef SLIT_DEBUG #define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32) static int __initdata srat_num_cpus; /* number of cpus */ static u32 __devinitdata pxm_flag[PXM_FLAG_LEN]; #define pxm_bit_set(bit) (set_bit(bit,(void *)pxm_flag)) #define pxm_bit_test(bit) (test_bit(bit,(void *)pxm_flag)) static struct acpi_table_slit __initdata *slit_table; cpumask_t early_cpu_possible_map = CPU_MASK_NONE; static int __init get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa) { int pxm; pxm = pa->proximity_domain_lo; if (srat_rev >= 2) { pxm += pa->proximity_domain_hi[0] << 8; pxm += pa->proximity_domain_hi[1] << 16; pxm += pa->proximity_domain_hi[2] << 24; } else if (ia64_platform_is("sn2")) pxm += pa->proximity_domain_hi[0] << 8; return pxm; } static int __init get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma) { int pxm; pxm = ma->proximity_domain; if (!ia64_platform_is("sn2") && srat_rev < 2) pxm &= 0xff; return pxm; } /* * ACPI 2.0 SLIT (System Locality Information Table) * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf */ void __init acpi_numa_slit_init(struct acpi_table_slit *slit) { u32 len; len = sizeof(struct acpi_table_header) + 8 + slit->locality_count * slit->locality_count; if (slit->header.length != len) { printk(KERN_ERR "ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n", len, slit->header.length); memset(numa_slit, 10, sizeof(numa_slit)); return; } slit_table = slit; } void __init acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) { int pxm; if (!(pa->flags & ACPI_SRAT_CPU_ENABLED)) return; pxm = get_processor_proximity_domain(pa); /* record this node in proximity bitmap */ pxm_bit_set(pxm); node_cpuid[srat_num_cpus].phys_id = (pa->apic_id << 8) | (pa->local_sapic_eid); /* nid should be overridden as logical node id later */ node_cpuid[srat_num_cpus].nid = pxm; cpu_set(srat_num_cpus, early_cpu_possible_map); srat_num_cpus++; } void __init acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) { unsigned long paddr, size; int pxm; struct node_memblk_s *p, *q, *pend; pxm = get_memory_proximity_domain(ma); /* fill node memory chunk structure */ paddr = ma->base_address; size = ma->length; /* Ignore disabled entries */ if (!(ma->flags & ACPI_SRAT_MEM_ENABLED)) return; /* record this node in proximity bitmap */ pxm_bit_set(pxm); /* Insertion sort based on base address */ pend = &node_memblk[num_node_memblks]; for (p = &node_memblk[0]; p < pend; p++) { if (paddr < p->start_paddr) break; } if (p < pend) { for (q = pend - 1; q >= p; q--) *(q + 1) = *q; } p->start_paddr = paddr; p->size = size; p->nid = pxm; num_node_memblks++; } void __init acpi_numa_arch_fixup(void) { int i, j, node_from, node_to; /* If there's no SRAT, fix the phys_id and mark node 0 online */ if (srat_num_cpus == 0) { node_set_online(0); node_cpuid[0].phys_id = hard_smp_processor_id(); return; } /* * MCD - This can probably be dropped now. No need for pxm ID to node ID * mapping with sparse node numbering iff MAX_PXM_DOMAINS <= MAX_NUMNODES. */ nodes_clear(node_online_map); for (i = 0; i < MAX_PXM_DOMAINS; i++) { if (pxm_bit_test(i)) { int nid = acpi_map_pxm_to_node(i); node_set_online(nid); } } /* set logical node id in memory chunk structure */ for (i = 0; i < num_node_memblks; i++) node_memblk[i].nid = pxm_to_node(node_memblk[i].nid); /* assign memory bank numbers for each chunk on each node */ for_each_online_node(i) { int bank; bank = 0; for (j = 0; j < num_node_memblks; j++) if (node_memblk[j].nid == i) node_memblk[j].bank = bank++; } /* set logical node id in cpu structure */ for_each_possible_early_cpu(i) node_cpuid[i].nid = pxm_to_node(node_cpuid[i].nid); printk(KERN_INFO "Number of logical nodes in system = %d\n", num_online_nodes()); printk(KERN_INFO "Number of memory chunks in system = %d\n", num_node_memblks); if (!slit_table) return; memset(numa_slit, -1, sizeof(numa_slit)); for (i = 0; i < slit_table->locality_count; i++) { if (!pxm_bit_test(i)) continue; node_from = pxm_to_node(i); for (j = 0; j < slit_table->locality_count; j++) { if (!pxm_bit_test(j)) continue; node_to = pxm_to_node(j); node_distance(node_from, node_to) = slit_table->entry[i * slit_table->locality_count + j]; } } #ifdef SLIT_DEBUG printk("ACPI 2.0 SLIT locality table:\n"); for_each_online_node(i) { for_each_online_node(j) printk("%03d ", node_distance(i, j)); printk("\n"); } #endif } #endif /* CONFIG_ACPI_NUMA */ #ifndef XEN /* * success: return IRQ number (>=0) * failure: return < 0 */ int acpi_register_gsi(u32 gsi, int triggering, int polarity) { if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) return gsi; if (has_8259 && gsi < 16) return isa_irq_to_vector(gsi); return iosapic_register_intr(gsi, (polarity == ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, (triggering == ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE : IOSAPIC_LEVEL); } void acpi_unregister_gsi(u32 gsi) { if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) return; if (has_8259 && gsi < 16) return; iosapic_unregister_intr(gsi); } #endif static int __init acpi_parse_fadt(struct acpi_table_header *table) { struct acpi_table_header *fadt_header; struct acpi_table_fadt *fadt; if (!table) return -EINVAL; fadt_header = (struct acpi_table_header *)table; if (fadt_header->revision != 3) return -ENODEV; /* Only deal with ACPI 2.0 FADT */ fadt = (struct acpi_table_fadt *)fadt_header; #ifndef XEN acpi_register_gsi(fadt->sci_interrupt, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); #endif return 0; } int __init acpi_boot_init(void) { /* * MADT * ---- * Parse the Multiple APIC Description Table (MADT), if exists. * Note that this table provides platform SMP configuration * information -- the successor to MPS tables. */ if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) { printk(KERN_ERR PREFIX "Can't find MADT\n"); goto skip_madt; } /* Local APIC */ if (acpi_table_parse_madt (ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE, acpi_parse_lapic_addr_ovr, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC address override entry\n"); if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, acpi_parse_lsapic, NR_CPUS) < 1) printk(KERN_ERR PREFIX "Error parsing MADT - no LAPIC entries\n"); if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0) < 0) printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); /* I/O APIC */ if (acpi_table_parse_madt (ACPI_MADT_TYPE_IO_SAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1) { if (!ia64_platform_is("sn2")) printk(KERN_ERR PREFIX "Error parsing MADT - no IOSAPIC entries\n"); } /* System-Level Interrupt Routing */ if (acpi_table_parse_madt (ACPI_MADT_TYPE_INTERRUPT_SOURCE, acpi_parse_plat_int_src, ACPI_MAX_PLATFORM_INTERRUPTS) < 0) printk(KERN_ERR PREFIX "Error parsing platform interrupt source entry\n"); if (acpi_table_parse_madt (ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, acpi_parse_int_src_ovr, 0) < 0) printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); if (acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, acpi_parse_nmi_src, 0) < 0) printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); skip_madt: /* * FADT says whether a legacy keyboard controller is present. * The FADT also contains an SCI_INT line, by which the system * gets interrupts such as power and sleep buttons. If it's not * on a Legacy interrupt, it needs to be setup. */ if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt)) printk(KERN_ERR PREFIX "Can't find FADT\n"); #ifdef XEN acpi_dmar_init(); #endif #ifdef CONFIG_SMP if (available_cpus == 0) { printk(KERN_INFO "ACPI: Found 0 CPUS; assuming 1\n"); printk(KERN_INFO "CPU 0 (0x%04x)", hard_smp_processor_id()); smp_boot_data.cpu_phys_id[available_cpus] = hard_smp_processor_id(); available_cpus = 1; /* We've got at least one of these, no? */ } smp_boot_data.cpu_count = available_cpus; smp_build_cpu_map(); # ifdef CONFIG_ACPI_NUMA if (srat_num_cpus == 0) { int cpu, i = 1; for (cpu = 0; cpu < smp_boot_data.cpu_count; cpu++) if (smp_boot_data.cpu_phys_id[cpu] != hard_smp_processor_id()) node_cpuid[i++].phys_id = smp_boot_data.cpu_phys_id[cpu]; } # endif #endif #ifdef CONFIG_ACPI_NUMA build_cpu_to_node_map(); #endif /* Make boot-up look pretty */ printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus); return 0; } int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) { int tmp; if (has_8259 && gsi < 16) *irq = isa_irq_to_vector(gsi); else { tmp = gsi_to_irq(gsi); if (tmp == -1) return -1; *irq = tmp; } return 0; } /* * ACPI based hotplug CPU support */ #ifdef CONFIG_ACPI_HOTPLUG_CPU static int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid) { #ifdef CONFIG_ACPI_NUMA int pxm_id; int nid; pxm_id = acpi_get_pxm(handle); /* * We don't have cpu-only-node hotadd. But if the system equips * SRAT table, pxm is already found and node is ready. * So, just pxm_to_nid(pxm) is OK. * This code here is for the system which doesn't have full SRAT * table for possible cpus. */ nid = acpi_map_pxm_to_node(pxm_id); node_cpuid[cpu].phys_id = physid; node_cpuid[cpu].nid = nid; #endif return (0); } int additional_cpus __initdata = -1; static __init int setup_additional_cpus(char *s) { if (s) additional_cpus = simple_strtol(s, NULL, 0); return 0; } early_param("additional_cpus", setup_additional_cpus); /* * cpu_possible_map should be static, it cannot change as CPUs * are onlined, or offlined. The reason is per-cpu data-structures * are allocated by some modules at init time, and dont expect to * do this dynamically on cpu arrival/departure. * cpu_present_map on the other hand can change dynamically. * In case when cpu_hotplug is not compiled, then we resort to current * behaviour, which is cpu_possible == cpu_present. * - Ashok Raj * * Three ways to find out the number of additional hotplug CPUs: * - If the BIOS specified disabled CPUs in ACPI/mptables use that. * - The user can overwrite it with additional_cpus=NUM * - Otherwise don't reserve additional CPUs. */ __init void prefill_possible_map(void) { int i; int possible, disabled_cpus; disabled_cpus = total_cpus - available_cpus; if (additional_cpus == -1) { if (disabled_cpus > 0) additional_cpus = disabled_cpus; else additional_cpus = 0; } possible = available_cpus + additional_cpus; if (possible > NR_CPUS) possible = NR_CPUS; printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n", possible, max((possible - available_cpus), 0)); for (i = 0; i < possible; i++) cpu_set(i, cpu_possible_map); } #ifndef XEN int acpi_map_lsapic(acpi_handle handle, int *pcpu) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; struct acpi_madt_local_sapic *lsapic; cpumask_t tmp_map; long physid; int cpu; if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) return -EINVAL; if (!buffer.length || !buffer.pointer) return -EINVAL; obj = buffer.pointer; if (obj->type != ACPI_TYPE_BUFFER) { kfree(buffer.pointer); return -EINVAL; } lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer; if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) || (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) { kfree(buffer.pointer); return -EINVAL; } physid = ((lsapic->id << 8) | (lsapic->eid)); kfree(buffer.pointer); buffer.length = ACPI_ALLOCATE_BUFFER; buffer.pointer = NULL; cpus_complement(tmp_map, cpu_present_map); cpu = first_cpu(tmp_map); if (cpu >= NR_CPUS) return -EINVAL; acpi_map_cpu2node(handle, cpu, physid); cpu_set(cpu, cpu_present_map); ia64_cpu_to_sapicid[cpu] = physid; *pcpu = cpu; return (0); } EXPORT_SYMBOL(acpi_map_lsapic); int acpi_unmap_lsapic(int cpu) { ia64_cpu_to_sapicid[cpu] = -1; cpu_clear(cpu, cpu_present_map); #ifdef CONFIG_ACPI_NUMA /* NUMA specific cleanup's */ #endif return (0); } EXPORT_SYMBOL(acpi_unmap_lsapic); #endif /* XEN */ #endif /* CONFIG_ACPI_HOTPLUG_CPU */ #ifndef XEN #ifdef CONFIG_ACPI_NUMA static acpi_status __devinit acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; struct acpi_madt_io_sapic *iosapic; unsigned int gsi_base; int pxm, node; /* Only care about objects w/ a method that returns the MADT */ if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) return AE_OK; if (!buffer.length || !buffer.pointer) return AE_OK; obj = buffer.pointer; if (obj->type != ACPI_TYPE_BUFFER || obj->buffer.length < sizeof(*iosapic)) { kfree(buffer.pointer); return AE_OK; } iosapic = (struct acpi_madt_io_sapic *)obj->buffer.pointer; if (iosapic->header.type != ACPI_MADT_TYPE_IO_SAPIC) { kfree(buffer.pointer); return AE_OK; } gsi_base = iosapic->global_irq_base; kfree(buffer.pointer); /* * OK, it's an IOSAPIC MADT entry, look for a _PXM value to tell * us which node to associate this with. */ pxm = acpi_get_pxm(handle); if (pxm < 0) return AE_OK; node = pxm_to_node(pxm); if (node >= MAX_NUMNODES || !node_online(node) || cpus_empty(node_to_cpumask(node))) return AE_OK; /* We know a gsi to node mapping! */ map_iosapic_to_node(gsi_base, node); return AE_OK; } static int __init acpi_map_iosapics (void) { acpi_get_devices(NULL, acpi_map_iosapic, NULL, NULL); return 0; } fs_initcall(acpi_map_iosapics); #endif /* CONFIG_ACPI_NUMA */ int __ref acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base) { int err; if ((err = iosapic_init(phys_addr, gsi_base))) return err; #ifdef CONFIG_ACPI_NUMA acpi_map_iosapic(handle, 0, NULL, NULL); #endif /* CONFIG_ACPI_NUMA */ return 0; } EXPORT_SYMBOL(acpi_register_ioapic); int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base) { return iosapic_remove(gsi_base); } EXPORT_SYMBOL(acpi_unregister_ioapic); #endif /* XEN */ /* * acpi_save_state_mem() - save kernel state * * TBD when when IA64 starts to support suspend... */ int acpi_save_state_mem(void) { return 0; } /* * acpi_restore_state() */ void acpi_restore_state_mem(void) {} /* * do_suspend_lowlevel() */ void do_suspend_lowlevel(void) {} #endif /* CONFIG_ACPI */