Commit a1c28b75 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm

Pull ARM updates from Russell King:
 "Changes included in this pull request:

   - revert pxa2xx-flash back to using ioremap_cached() and switch
     memremap() to use arch_memremap_wb()

   - remove pci=firmware command line argument handling

   - remove unnecessary arm_dma_set_mask() implementation, the generic
     implementation will do for ARM

   - removal of the ARM kallsyms "hack" to work around mode switching
     veneers and vectors located below PAGE_OFFSET

   - tidy up build system output a little

   - add L2 cache power management DT bindings

   - remove duplicated local_irq_disable() in reboot paths

   - handle AMBA primecell devices better at registration time with PM
     domains (needed for Samsung SoCs)

   - ARM specific preparation to support Keystone II kexec"

* 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
  ARM: 8567/1: cache-uniphier: activate ways for secondary CPUs
  ARM: 8570/2: Documentation: devicetree: Add PL310 PM bindings
  ARM: 8569/1: pl2x0: Add OF control of cache power management
  ARM: 8568/1: reboot: remove duplicated local_irq_disable()
  ARM: 8566/1: drivers: amba: properly handle devices with power domains
  ARM: provide arm_has_idmap_alias() helper
  ARM: kexec: remove 512MB restriction on kexec crashdump
  ARM: provide improved virt_to_idmap() functionality
  ARM: kexec: fix crashkernel= handling
  ARM: 8557/1: specify install, zinstall, and uinstall as PHONY targets
  ARM: 8562/1: suppress "include/generated/mach-types.h is up to date."
  ARM: 8553/1: kallsyms: remove --page-offset command line option
  ARM: 8552/1: kallsyms: remove special lower address limit for CONFIG_ARM
  ARM: 8555/1: kallsyms: ignore ARM mode switching veneers
  ARM: 8548/1: dma-mapping: remove arm_dma_set_mask()
  ARM: 8554/1: kernel: pci: remove pci=firmware command line parameter handling
  ARM: memremap: implement arch_memremap_wb()
  memremap: add arch specific hook for MEMREMAP_WB mappings
  mtd: pxa2xx-flash: switch back from memremap to ioremap_cached
  ARM: reintroduce ioremap_cached() for creating cached I/O mappings
parents a05a70db 5632a9fb
...@@ -84,6 +84,12 @@ Optional properties: ...@@ -84,6 +84,12 @@ Optional properties:
- prefetch-instr : Instruction prefetch. Value: <0> (forcibly disable), - prefetch-instr : Instruction prefetch. Value: <0> (forcibly disable),
<1> (forcibly enable), property absent (retain settings set by <1> (forcibly enable), property absent (retain settings set by
firmware) firmware)
- arm,dynamic-clock-gating : L2 dynamic clock gating. Value: <0> (forcibly
disable), <1> (forcibly enable), property absent (OS specific behavior,
preferrably retain firmware settings)
- arm,standby-mode: L2 standby mode enable. Value <0> (forcibly disable),
<1> (forcibly enable), property absent (OS specific behavior,
preferrably retain firmware settings)
Example: Example:
......
...@@ -263,12 +263,6 @@ The syntax is: ...@@ -263,12 +263,6 @@ The syntax is:
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset] crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
range=start-[end] range=start-[end]
Please note, on arm, the offset is required.
crashkernel=<range1>:<size1>[,<range2>:<size2>,...]@offset
range=start-[end]
'start' is inclusive and 'end' is exclusive.
For example: For example:
crashkernel=512M-2G:64M,2G-:128M crashkernel=512M-2G:64M,2G-:128M
...@@ -307,10 +301,9 @@ Boot into System Kernel ...@@ -307,10 +301,9 @@ Boot into System Kernel
on the memory consumption of the kdump system. In general this is not on the memory consumption of the kdump system. In general this is not
dependent on the memory size of the production system. dependent on the memory size of the production system.
On arm, use "crashkernel=Y@X". Note that the start address of the kernel On arm, the use of "crashkernel=Y@X" is no longer necessary; the
will be aligned to 128MiB (0x08000000), so if the start address is not then kernel will automatically locate the crash kernel image within the
any space below the alignment point may be overwritten by the dump-capture kernel, first 512MB of RAM if X is not given.
which means it is possible that the vmcore is not that precise as expected.
Load the Dump-capture Kernel Load the Dump-capture Kernel
......
...@@ -2959,11 +2959,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -2959,11 +2959,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
for broken drivers that don't call it. for broken drivers that don't call it.
skip_isa_align [X86] do not align io start addr, so can skip_isa_align [X86] do not align io start addr, so can
handle more pci cards handle more pci cards
firmware [ARM] Do not re-enumerate the bus but instead
just use the configuration from the
bootloader. This is currently used on
IXP2000 systems where the bus has to be
configured a certain way for adjunct CPUs.
noearly [X86] Don't do any early type 1 scanning. noearly [X86] Don't do any early type 1 scanning.
This might help on some broken boards which This might help on some broken boards which
machine check when some devices' config space machine check when some devices' config space
......
...@@ -88,7 +88,7 @@ $(obj)/bootpImage: $(obj)/bootp/bootp FORCE ...@@ -88,7 +88,7 @@ $(obj)/bootpImage: $(obj)/bootp/bootp FORCE
$(call if_changed,objcopy) $(call if_changed,objcopy)
@$(kecho) ' Kernel: $@ is ready' @$(kecho) ' Kernel: $@ is ready'
PHONY += initrd PHONY += initrd install zinstall uinstall
initrd: initrd:
@test "$(INITRD_PHYS)" != "" || \ @test "$(INITRD_PHYS)" != "" || \
(echo This machine does not support INITRD; exit -1) (echo This machine does not support INITRD; exit -1)
......
...@@ -162,8 +162,6 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) ...@@ -162,8 +162,6 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
static inline void dma_mark_clean(void *addr, size_t size) { } static inline void dma_mark_clean(void *addr, size_t size) { }
extern int arm_dma_set_mask(struct device *dev, u64 dma_mask);
/** /**
* arm_dma_alloc - allocate consistent memory for DMA * arm_dma_alloc - allocate consistent memory for DMA
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
......
...@@ -392,9 +392,18 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size); ...@@ -392,9 +392,18 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size);
#define ioremap ioremap #define ioremap ioremap
#define ioremap_nocache ioremap #define ioremap_nocache ioremap
/*
* Do not use ioremap_cache for mapping memory. Use memremap instead.
*/
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size); void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size);
#define ioremap_cache ioremap_cache #define ioremap_cache ioremap_cache
/*
* Do not use ioremap_cached in new code. Provided for the benefit of
* the pxa2xx-flash MTD driver only.
*/
void __iomem *ioremap_cached(resource_size_t res_cookie, size_t size);
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size); void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size);
#define ioremap_wc ioremap_wc #define ioremap_wc ioremap_wc
#define ioremap_wt ioremap_wc #define ioremap_wt ioremap_wc
...@@ -402,6 +411,9 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size); ...@@ -402,6 +411,9 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size);
void iounmap(volatile void __iomem *iomem_cookie); void iounmap(volatile void __iomem *iomem_cookie);
#define iounmap iounmap #define iounmap iounmap
void *arch_memremap_wb(phys_addr_t phys_addr, size_t size);
#define arch_memremap_wb arch_memremap_wb
/* /*
* io{read,write}{16,32}be() macros * io{read,write}{16,32}be() macros
*/ */
......
...@@ -288,19 +288,43 @@ static inline void *phys_to_virt(phys_addr_t x) ...@@ -288,19 +288,43 @@ static inline void *phys_to_virt(phys_addr_t x)
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x))) #define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
#define pfn_to_kaddr(pfn) __va((phys_addr_t)(pfn) << PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((phys_addr_t)(pfn) << PAGE_SHIFT)
extern unsigned long (*arch_virt_to_idmap)(unsigned long x); extern long long arch_phys_to_idmap_offset;
/* /*
* These are for systems that have a hardware interconnect supported alias of * These are for systems that have a hardware interconnect supported alias
* physical memory for idmap purposes. Most cases should leave these * of physical memory for idmap purposes. Most cases should leave these
* untouched. Note: this can only return addresses less than 4GiB. * untouched. Note: this can only return addresses less than 4GiB.
*/ */
static inline bool arm_has_idmap_alias(void)
{
return IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset != 0;
}
#define IDMAP_INVALID_ADDR ((u32)~0)
static inline unsigned long phys_to_idmap(phys_addr_t addr)
{
if (IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset) {
addr += arch_phys_to_idmap_offset;
if (addr > (u32)~0)
addr = IDMAP_INVALID_ADDR;
}
return addr;
}
static inline phys_addr_t idmap_to_phys(unsigned long idmap)
{
phys_addr_t addr = idmap;
if (IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset)
addr -= arch_phys_to_idmap_offset;
return addr;
}
static inline unsigned long __virt_to_idmap(unsigned long x) static inline unsigned long __virt_to_idmap(unsigned long x)
{ {
if (IS_ENABLED(CONFIG_MMU) && arch_virt_to_idmap) return phys_to_idmap(__virt_to_phys(x));
return arch_virt_to_idmap(x);
else
return __virt_to_phys(x);
} }
#define virt_to_idmap(x) __virt_to_idmap((unsigned long)(x)) #define virt_to_idmap(x) __virt_to_idmap((unsigned long)(x))
......
...@@ -550,9 +550,6 @@ char * __init pcibios_setup(char *str) ...@@ -550,9 +550,6 @@ char * __init pcibios_setup(char *str)
if (!strcmp(str, "debug")) { if (!strcmp(str, "debug")) {
debug_pci = 1; debug_pci = 1;
return NULL; return NULL;
} else if (!strcmp(str, "firmware")) {
pci_add_flags(PCI_PROBE_ONLY);
return NULL;
} }
return str; return str;
} }
......
...@@ -104,8 +104,6 @@ void machine_halt(void) ...@@ -104,8 +104,6 @@ void machine_halt(void)
{ {
local_irq_disable(); local_irq_disable();
smp_send_stop(); smp_send_stop();
local_irq_disable();
while (1); while (1);
} }
...@@ -150,6 +148,5 @@ void machine_restart(char *cmd) ...@@ -150,6 +148,5 @@ void machine_restart(char *cmd)
/* Whoops - the platform was unable to reboot. Tell the user! */ /* Whoops - the platform was unable to reboot. Tell the user! */
printk("Reboot failed -- System halted\n"); printk("Reboot failed -- System halted\n");
local_irq_disable();
while (1); while (1);
} }
...@@ -941,6 +941,12 @@ static int __init init_machine_late(void) ...@@ -941,6 +941,12 @@ static int __init init_machine_late(void)
late_initcall(init_machine_late); late_initcall(init_machine_late);
#ifdef CONFIG_KEXEC #ifdef CONFIG_KEXEC
/*
* The crash region must be aligned to 128MB to avoid
* zImage relocating below the reserved region.
*/
#define CRASH_ALIGN (128 << 20)
static inline unsigned long long get_total_mem(void) static inline unsigned long long get_total_mem(void)
{ {
unsigned long total; unsigned long total;
...@@ -968,6 +974,26 @@ static void __init reserve_crashkernel(void) ...@@ -968,6 +974,26 @@ static void __init reserve_crashkernel(void)
if (ret) if (ret)
return; return;
if (crash_base <= 0) {
unsigned long long crash_max = idmap_to_phys((u32)~0);
crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max,
crash_size, CRASH_ALIGN);
if (!crash_base) {
pr_err("crashkernel reservation failed - No suitable area found.\n");
return;
}
} else {
unsigned long long start;
start = memblock_find_in_range(crash_base,
crash_base + crash_size,
crash_size, SECTION_SIZE);
if (start != crash_base) {
pr_err("crashkernel reservation failed - memory is in use.\n");
return;
}
}
ret = memblock_reserve(crash_base, crash_size); ret = memblock_reserve(crash_base, crash_size);
if (ret < 0) { if (ret < 0) {
pr_warn("crashkernel reservation failed - memory is in use (0x%lx)\n", pr_warn("crashkernel reservation failed - memory is in use (0x%lx)\n",
......
...@@ -63,11 +63,6 @@ static void __init keystone_init(void) ...@@ -63,11 +63,6 @@ static void __init keystone_init(void)
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
} }
static unsigned long keystone_virt_to_idmap(unsigned long x)
{
return (phys_addr_t)(x) - CONFIG_PAGE_OFFSET + KEYSTONE_LOW_PHYS_START;
}
static long long __init keystone_pv_fixup(void) static long long __init keystone_pv_fixup(void)
{ {
long long offset; long long offset;
...@@ -91,7 +86,7 @@ static long long __init keystone_pv_fixup(void) ...@@ -91,7 +86,7 @@ static long long __init keystone_pv_fixup(void)
offset = KEYSTONE_HIGH_PHYS_START - KEYSTONE_LOW_PHYS_START; offset = KEYSTONE_HIGH_PHYS_START - KEYSTONE_LOW_PHYS_START;
/* Populate the arch idmap hook */ /* Populate the arch idmap hook */
arch_virt_to_idmap = keystone_virt_to_idmap; arch_phys_to_idmap_offset = -offset;
return offset; return offset;
} }
......
...@@ -647,11 +647,6 @@ static void __init l2c310_enable(void __iomem *base, unsigned num_lock) ...@@ -647,11 +647,6 @@ static void __init l2c310_enable(void __iomem *base, unsigned num_lock)
aux &= ~(L310_AUX_CTRL_FULL_LINE_ZERO | L310_AUX_CTRL_EARLY_BRESP); aux &= ~(L310_AUX_CTRL_FULL_LINE_ZERO | L310_AUX_CTRL_EARLY_BRESP);
} }
/* r3p0 or later has power control register */
if (rev >= L310_CACHE_ID_RTL_R3P0)
l2x0_saved_regs.pwr_ctrl = L310_DYNAMIC_CLK_GATING_EN |
L310_STNDBY_MODE_EN;
/* /*
* Always enable non-secure access to the lockdown registers - * Always enable non-secure access to the lockdown registers -
* we write to them as part of the L2C enable sequence so they * we write to them as part of the L2C enable sequence so they
...@@ -1141,6 +1136,7 @@ static void __init l2c310_of_parse(const struct device_node *np, ...@@ -1141,6 +1136,7 @@ static void __init l2c310_of_parse(const struct device_node *np,
u32 filter[2] = { 0, 0 }; u32 filter[2] = { 0, 0 };
u32 assoc; u32 assoc;
u32 prefetch; u32 prefetch;
u32 power;
u32 val; u32 val;
int ret; int ret;
...@@ -1271,6 +1267,26 @@ static void __init l2c310_of_parse(const struct device_node *np, ...@@ -1271,6 +1267,26 @@ static void __init l2c310_of_parse(const struct device_node *np,
} }
l2x0_saved_regs.prefetch_ctrl = prefetch; l2x0_saved_regs.prefetch_ctrl = prefetch;
power = l2x0_saved_regs.pwr_ctrl |
L310_DYNAMIC_CLK_GATING_EN | L310_STNDBY_MODE_EN;
ret = of_property_read_u32(np, "arm,dynamic-clock-gating", &val);
if (!ret) {
if (!val)
power &= ~L310_DYNAMIC_CLK_GATING_EN;
} else if (ret != -EINVAL) {
pr_err("L2C-310 OF dynamic-clock-gating property value is missing or invalid\n");
}
ret = of_property_read_u32(np, "arm,standby-mode", &val);
if (!ret) {
if (!val)
power &= ~L310_STNDBY_MODE_EN;
} else if (ret != -EINVAL) {
pr_err("L2C-310 OF standby-mode property value is missing or invalid\n");
}
l2x0_saved_regs.pwr_ctrl = power;
} }
static const struct l2c_init_data of_l2c310_data __initconst = { static const struct l2c_init_data of_l2c310_data __initconst = {
......
...@@ -96,6 +96,7 @@ struct uniphier_cache_data { ...@@ -96,6 +96,7 @@ struct uniphier_cache_data {
void __iomem *ctrl_base; void __iomem *ctrl_base;
void __iomem *rev_base; void __iomem *rev_base;
void __iomem *op_base; void __iomem *op_base;
void __iomem *way_ctrl_base;
u32 way_present_mask; u32 way_present_mask;
u32 way_locked_mask; u32 way_locked_mask;
u32 nsets; u32 nsets;
...@@ -256,10 +257,13 @@ static void __init __uniphier_cache_set_locked_ways( ...@@ -256,10 +257,13 @@ static void __init __uniphier_cache_set_locked_ways(
struct uniphier_cache_data *data, struct uniphier_cache_data *data,
u32 way_mask) u32 way_mask)
{ {
unsigned int cpu;
data->way_locked_mask = way_mask & data->way_present_mask; data->way_locked_mask = way_mask & data->way_present_mask;
writel_relaxed(~data->way_locked_mask & data->way_present_mask, for_each_possible_cpu(cpu)
data->ctrl_base + UNIPHIER_SSCLPDAWCR); writel_relaxed(~data->way_locked_mask & data->way_present_mask,
data->way_ctrl_base + 4 * cpu);
} }
static void uniphier_cache_maint_range(unsigned long start, unsigned long end, static void uniphier_cache_maint_range(unsigned long start, unsigned long end,
...@@ -459,6 +463,8 @@ static int __init __uniphier_cache_init(struct device_node *np, ...@@ -459,6 +463,8 @@ static int __init __uniphier_cache_init(struct device_node *np,
goto err; goto err;
} }
data->way_ctrl_base = data->ctrl_base + 0xc00;
if (*cache_level == 2) { if (*cache_level == 2) {
u32 revision = readl(data->rev_base + UNIPHIER_SSCID); u32 revision = readl(data->rev_base + UNIPHIER_SSCID);
/* /*
...@@ -467,6 +473,22 @@ static int __init __uniphier_cache_init(struct device_node *np, ...@@ -467,6 +473,22 @@ static int __init __uniphier_cache_init(struct device_node *np,
*/ */
if (revision <= 0x16) if (revision <= 0x16)
data->range_op_max_size = (u32)1 << 22; data->range_op_max_size = (u32)1 << 22;
/*
* Unfortunatly, the offset address of active way control base
* varies from SoC to SoC.
*/
switch (revision) {
case 0x11: /* sLD3 */
data->way_ctrl_base = data->ctrl_base + 0x870;
break;
case 0x12: /* LD4 */
case 0x16: /* sld8 */
data->way_ctrl_base = data->ctrl_base + 0x840;
break;
default:
break;
}
} }
data->range_op_max_size -= data->line_size; data->range_op_max_size -= data->line_size;
......
...@@ -190,7 +190,6 @@ struct dma_map_ops arm_dma_ops = { ...@@ -190,7 +190,6 @@ struct dma_map_ops arm_dma_ops = {
.sync_single_for_device = arm_dma_sync_single_for_device, .sync_single_for_device = arm_dma_sync_single_for_device,
.sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu,
.sync_sg_for_device = arm_dma_sync_sg_for_device, .sync_sg_for_device = arm_dma_sync_sg_for_device,
.set_dma_mask = arm_dma_set_mask,
}; };
EXPORT_SYMBOL(arm_dma_ops); EXPORT_SYMBOL(arm_dma_ops);
...@@ -209,7 +208,6 @@ struct dma_map_ops arm_coherent_dma_ops = { ...@@ -209,7 +208,6 @@ struct dma_map_ops arm_coherent_dma_ops = {
.get_sgtable = arm_dma_get_sgtable, .get_sgtable = arm_dma_get_sgtable,
.map_page = arm_coherent_dma_map_page, .map_page = arm_coherent_dma_map_page,
.map_sg = arm_dma_map_sg, .map_sg = arm_dma_map_sg,
.set_dma_mask = arm_dma_set_mask,
}; };
EXPORT_SYMBOL(arm_coherent_dma_ops); EXPORT_SYMBOL(arm_coherent_dma_ops);
...@@ -1143,16 +1141,6 @@ int dma_supported(struct device *dev, u64 mask) ...@@ -1143,16 +1141,6 @@ int dma_supported(struct device *dev, u64 mask)
} }
EXPORT_SYMBOL(dma_supported); EXPORT_SYMBOL(dma_supported);
int arm_dma_set_mask(struct device *dev, u64 dma_mask)
{
if (!dev->dma_mask || !dma_supported(dev, dma_mask))
return -EIO;
*dev->dma_mask = dma_mask;
return 0;
}
#define PREALLOC_DMA_DEBUG_ENTRIES 4096 #define PREALLOC_DMA_DEBUG_ENTRIES 4096
static int __init dma_debug_do_init(void) static int __init dma_debug_do_init(void)
...@@ -2006,8 +1994,6 @@ struct dma_map_ops iommu_ops = { ...@@ -2006,8 +1994,6 @@ struct dma_map_ops iommu_ops = {
.unmap_sg = arm_iommu_unmap_sg, .unmap_sg = arm_iommu_unmap_sg,
.sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu, .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu,
.sync_sg_for_device = arm_iommu_sync_sg_for_device, .sync_sg_for_device = arm_iommu_sync_sg_for_device,
.set_dma_mask = arm_dma_set_mask,
}; };
struct dma_map_ops iommu_coherent_ops = { struct dma_map_ops iommu_coherent_ops = {
...@@ -2021,8 +2007,6 @@ struct dma_map_ops iommu_coherent_ops = { ...@@ -2021,8 +2007,6 @@ struct dma_map_ops iommu_coherent_ops = {
.map_sg = arm_coherent_iommu_map_sg, .map_sg = arm_coherent_iommu_map_sg,
.unmap_sg = arm_coherent_iommu_unmap_sg, .unmap_sg = arm_coherent_iommu_unmap_sg,
.set_dma_mask = arm_dma_set_mask,
}; };
/** /**
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* page tables. * page tables.
*/ */
pgd_t *idmap_pgd; pgd_t *idmap_pgd;
unsigned long (*arch_virt_to_idmap)(unsigned long x); long long arch_phys_to_idmap_offset;
#ifdef CONFIG_ARM_LPAE #ifdef CONFIG_ARM_LPAE
static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
......
...@@ -297,9 +297,10 @@ static void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, ...@@ -297,9 +297,10 @@ static void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
} }
/* /*
* Don't allow RAM to be mapped - this causes problems with ARMv6+ * Don't allow RAM to be mapped with mismatched attributes - this
* causes problems with ARMv6+
*/ */
if (WARN_ON(pfn_valid(pfn))) if (WARN_ON(pfn_valid(pfn) && mtype != MT_MEMORY_RW))
return NULL; return NULL;
area = get_vm_area_caller(size, VM_IOREMAP, caller); area = get_vm_area_caller(size, VM_IOREMAP, caller);
...@@ -380,11 +381,15 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size) ...@@ -380,11 +381,15 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size)
EXPORT_SYMBOL(ioremap); EXPORT_SYMBOL(ioremap);
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size) void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size)
__alias(ioremap_cached);
void __iomem *ioremap_cached(resource_size_t res_cookie, size_t size)
{ {
return arch_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED, return arch_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED,
__builtin_return_address(0)); __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_cache); EXPORT_SYMBOL(ioremap_cache);
EXPORT_SYMBOL(ioremap_cached);
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
{ {
...@@ -414,6 +419,13 @@ __arm_ioremap_exec(phys_addr_t phys_addr, size_t size, bool cached) ...@@ -414,6 +419,13 @@ __arm_ioremap_exec(phys_addr_t phys_addr, size_t size, bool cached)
__builtin_return_address(0)); __builtin_return_address(0));
} }
void *arch_memremap_wb(phys_addr_t phys_addr, size_t size)
{
return (__force void *)arch_ioremap_caller(phys_addr, size,
MT_MEMORY_RW,
__builtin_return_address(0));
}
void __iounmap(volatile void __iomem *io_addr) void __iounmap(volatile void __iomem *io_addr)
{ {
void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr);
......
...@@ -368,11 +368,15 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size) ...@@ -368,11 +368,15 @@ void __iomem *ioremap(resource_size_t res_cookie, size_t size)
EXPORT_SYMBOL(ioremap); EXPORT_SYMBOL(ioremap);
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size) void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size)
__alias(ioremap_cached);
void __iomem *ioremap_cached(resource_size_t res_cookie, size_t size)
{ {
return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED, return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED,
__builtin_return_address(0)); __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_cache); EXPORT_SYMBOL(ioremap_cache);
EXPORT_SYMBOL(ioremap_cached);
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
{ {
...@@ -381,6 +385,11 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) ...@@ -381,6 +385,11 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
} }
EXPORT_SYMBOL(ioremap_wc); EXPORT_SYMBOL(ioremap_wc);
void *arch_memremap_wb(phys_addr_t phys_addr, size_t size)
{
return (void *)phys_addr;
}
void __iounmap(volatile void __iomem *addr) void __iounmap(volatile void __iomem *addr)
{ {
} }
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
# Copyright (C) 2001 Russell King # Copyright (C) 2001 Russell King
# #
include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types quiet_cmd_gen_mach = GEN $@
@$(kecho) ' Generating $@' cmd_gen_mach = mkdir -p $(dir $@) && \
@mkdir -p $(dir $@) $(AWK) -f $(filter-out $(PHONY),$^) > $@ || \
$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } { rm -f $@; /bin/false; }
include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types FORCE
$(call if_changed,gen_mach)
...@@ -336,16 +336,7 @@ static void amba_device_release(struct device *dev) ...@@ -336,16 +336,7 @@ static void amba_device_release(struct device *dev)
kfree(d); kfree(d);
} }
/** static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
* amba_device_add - add a previously allocated AMBA device structure
* @dev: AMBA device allocated by amba_device_alloc
* @parent: resource parent for this devices resources
*
* Claim the resource, and read the device cell ID if not already
* initialized. Register the AMBA device with the Linux device
* manager.
*/
int amba_device_add(struct amba_device *dev, struct resource *parent)
{ {
u32 size; u32 size;
void __iomem *tmp; void __iomem *tmp;
...@@ -373,6 +364,12 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) ...@@ -373,6 +364,12 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
goto err_release; goto err_release;
} }
ret = dev_pm_domain_attach(&dev->dev, true);
if (ret == -EPROBE_DEFER) {
iounmap(tmp);
goto err_release;
}
ret = amba_get_enable_pclk(dev); ret = amba_get_enable_pclk(dev);
if (ret == 0) { if (ret == 0) {
u32 pid, cid; u32 pid, cid;
...@@ -398,6 +395,7 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) ...@@ -398,6 +395,7 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
} }
iounmap(tmp); iounmap(tmp);
dev_pm_domain_detach(&dev->dev, true);
if (ret) if (ret)
goto err_release; goto err_release;
...@@ -421,6 +419,88 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) ...@@ -421,6 +419,88 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
err_out: err_out:
return ret; return ret;
} }
/*
* Registration of AMBA device require reading its pid and cid registers.
* To do this, the device must be turned on (if it is a part of power domain)
* and have clocks enabled. However in some cases those resources might not be
* yet available. Returning EPROBE_DEFER is not a solution in such case,
* because callers don't handle this special error code. Instead such devices
* are added to the special list and their registration is retried from
* periodic worker, until all resources are available and registration succeeds.
*/
struct deferred_device {
struct amba_device *dev;
struct resource *parent;
struct list_head node;
};
static LIST_HEAD(deferred_devices);
static DEFINE_MUTEX(deferred_devices_lock);
static void amba_deferred_retry_func(struct work_struct *dummy);
static DECLARE_DELAYED_WORK(deferred_retry_work, amba_deferred_retry_func);
#define DEFERRED_DEVICE_TIMEOUT (msecs_to_jiffies(5 * 1000))
static void amba_deferred_retry_func(struct work_struct *dummy)
{
struct deferred_device *ddev, *tmp;
mutex_lock(&deferred_devices_lock);
list_for_each_entry_safe(ddev, tmp, &deferred_devices, node) {
int ret = amba_device_try_add(ddev->dev, ddev->parent);
if (ret == -EPROBE_DEFER)
continue;
list_del_init(&ddev->node);
kfree(ddev);
}
if (!list_empty(&deferred_devices))
schedule_delayed_work(&deferred_retry_work,
DEFERRED_DEVICE_TIMEOUT);
mutex_unlock(&deferred_devices_lock);
}
/**
* amba_device_add - add a previously allocated AMBA device structure
* @dev: AMBA device allocated by amba_device_alloc
* @parent: resource parent for this devices resources
*
* Claim the resource, and read the device cell ID if not already
* initialized. Register the AMBA device with the Linux device
* manager.
*/
int amba_device_add(struct amba_device *dev, struct resource *parent)
{
int ret = amba_device_try_add(dev, parent);
if (ret == -EPROBE_DEFER) {
struct deferred_device *ddev;
ddev = kmalloc(sizeof(*ddev), GFP_KERNEL);
if (!ddev)
return -ENOMEM;
ddev->dev = dev;
ddev->parent = parent;
ret = 0;
mutex_lock(&deferred_devices_lock);
if (list_empty(&deferred_devices))
schedule_delayed_work(&deferred_retry_work,
DEFERRED_DEVICE_TIMEOUT);
list_add_tail(&ddev->node, &deferred_devices);
mutex_unlock(&deferred_devices_lock);
}
return ret;
}
EXPORT_SYMBOL_GPL(amba_device_add); EXPORT_SYMBOL_GPL(amba_device_add);
static struct amba_device * static struct amba_device *
......
...@@ -71,8 +71,8 @@ static int pxa2xx_flash_probe(struct platform_device *pdev) ...@@ -71,8 +71,8 @@ static int pxa2xx_flash_probe(struct platform_device *pdev)
info->map.name); info->map.name);
return -ENOMEM; return -ENOMEM;
} }
info->map.cached = memremap(info->map.phys, info->map.size, info->map.cached =
MEMREMAP_WB); ioremap_cached(info->map.phys, info->map.size);
if (!info->map.cached) if (!info->map.cached)
printk(KERN_WARNING "Failed to ioremap cached %s\n", printk(KERN_WARNING "Failed to ioremap cached %s\n",
info->map.name); info->map.name);
...@@ -111,7 +111,7 @@ static int pxa2xx_flash_remove(struct platform_device *dev) ...@@ -111,7 +111,7 @@ static int pxa2xx_flash_remove(struct platform_device *dev)
map_destroy(info->mtd); map_destroy(info->mtd);
iounmap(info->map.virt); iounmap(info->map.virt);
if (info->map.cached) if (info->map.cached)
memunmap(info->map.cached); iounmap(info->map.cached);
kfree(info); kfree(info);
return 0; return 0;
} }
......
...@@ -27,6 +27,13 @@ __weak void __iomem *ioremap_cache(resource_size_t offset, unsigned long size) ...@@ -27,6 +27,13 @@ __weak void __iomem *ioremap_cache(resource_size_t offset, unsigned long size)
} }
#endif #endif
#ifndef arch_memremap_wb
static void *arch_memremap_wb(resource_size_t offset, unsigned long size)
{
return (__force void *)ioremap_cache(offset, size);
}
#endif
static void *try_ram_remap(resource_size_t offset, size_t size) static void *try_ram_remap(resource_size_t offset, size_t size)
{ {
unsigned long pfn = PHYS_PFN(offset); unsigned long pfn = PHYS_PFN(offset);
...@@ -34,7 +41,7 @@ static void *try_ram_remap(resource_size_t offset, size_t size) ...@@ -34,7 +41,7 @@ static void *try_ram_remap(resource_size_t offset, size_t size)
/* In the simple case just return the existing linear address */ /* In the simple case just return the existing linear address */
if (pfn_valid(pfn) && !PageHighMem(pfn_to_page(pfn))) if (pfn_valid(pfn) && !PageHighMem(pfn_to_page(pfn)))
return __va(offset); return __va(offset);
return NULL; /* fallback to ioremap_cache */ return NULL; /* fallback to arch_memremap_wb */
} }
/** /**
...@@ -90,7 +97,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) ...@@ -90,7 +97,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags)
if (is_ram == REGION_INTERSECTS) if (is_ram == REGION_INTERSECTS)
addr = try_ram_remap(offset, size); addr = try_ram_remap(offset, size);
if (!addr) if (!addr)
addr = ioremap_cache(offset, size); addr = arch_memremap_wb(offset, size);
} }
/* /*
......
...@@ -63,7 +63,6 @@ static unsigned int table_size, table_cnt; ...@@ -63,7 +63,6 @@ static unsigned int table_size, table_cnt;
static int all_symbols = 0; static int all_symbols = 0;
static int absolute_percpu = 0; static int absolute_percpu = 0;
static char symbol_prefix_char = '\0'; static char symbol_prefix_char = '\0';
static unsigned long long kernel_start_addr = 0;
static int base_relative = 0; static int base_relative = 0;
int token_profit[0x10000]; int token_profit[0x10000];
...@@ -223,15 +222,13 @@ static int symbol_valid(struct sym_entry *s) ...@@ -223,15 +222,13 @@ static int symbol_valid(struct sym_entry *s)
static char *special_suffixes[] = { static char *special_suffixes[] = {
"_veneer", /* arm */ "_veneer", /* arm */
"_from_arm", /* arm */
"_from_thumb", /* arm */
NULL }; NULL };
int i; int i;
char *sym_name = (char *)s->sym + 1; char *sym_name = (char *)s->sym + 1;
if (s->addr < kernel_start_addr)
return 0;
/* skip prefix char */ /* skip prefix char */
if (symbol_prefix_char && *sym_name == symbol_prefix_char) if (symbol_prefix_char && *sym_name == symbol_prefix_char)
sym_name++; sym_name++;
...@@ -765,9 +762,6 @@ int main(int argc, char **argv) ...@@ -765,9 +762,6 @@ int main(int argc, char **argv)
if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\'')) if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\''))
p++; p++;
symbol_prefix_char = *p; symbol_prefix_char = *p;
} else if (strncmp(argv[i], "--page-offset=", 14) == 0) {
const char *p = &argv[i][14];
kernel_start_addr = strtoull(p, NULL, 16);
} else if (strcmp(argv[i], "--base-relative") == 0) } else if (strcmp(argv[i], "--base-relative") == 0)
base_relative = 1; base_relative = 1;
else else
......
...@@ -82,10 +82,6 @@ kallsyms() ...@@ -82,10 +82,6 @@ kallsyms()
kallsymopt="${kallsymopt} --all-symbols" kallsymopt="${kallsymopt} --all-symbols"
fi fi
if [ -n "${CONFIG_ARM}" ] && [ -z "${CONFIG_XIP_KERNEL}" ] && [ -n "${CONFIG_PAGE_OFFSET}" ]; then
kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET"
fi
if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then
kallsymopt="${kallsymopt} --absolute-percpu" kallsymopt="${kallsymopt} --absolute-percpu"
fi fi
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment