Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77f36fcc authored by Paul Mundt's avatar Paul Mundt
Browse files

Merge branch 'sh/pmb-dynamic'

parents 838a4a9d d01447b3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ void decompress_kernel(void)
	output_addr = (CONFIG_MEMORY_START + 0x2000);
#else
	output_addr = __pa((unsigned long)&_text+PAGE_SIZE);
#if defined(CONFIG_29BIT) || defined(CONFIG_PMB_LEGACY)
#if defined(CONFIG_29BIT)
	output_addr |= P2SEG;
#endif
#endif
+22 −0
Original line number Diff line number Diff line
@@ -133,6 +133,28 @@ static inline void ctrl_delay(void)
	__raw_readw(generic_io_base);
}

#define __BUILD_UNCACHED_IO(bwlq, type)					\
static inline type read##bwlq##_uncached(unsigned long addr)		\
{									\
	type ret;							\
	jump_to_uncached();						\
	ret = __raw_read##bwlq(addr);					\
	back_to_cached();						\
	return ret;							\
}									\
									\
static inline void write##bwlq##_uncached(type v, unsigned long addr)	\
{									\
	jump_to_uncached();						\
	__raw_write##bwlq(v, addr);					\
	back_to_cached();						\
}

__BUILD_UNCACHED_IO(b, u8)
__BUILD_UNCACHED_IO(w, u16)
__BUILD_UNCACHED_IO(l, u32)
__BUILD_UNCACHED_IO(q, u64)

#define __BUILD_MEMORY_STRING(bwlq, type)				\
									\
static inline void __raw_writes##bwlq(volatile void __iomem *mem,	\
+10 −30
Original line number Diff line number Diff line
@@ -11,7 +11,9 @@

#define PMB_ADDR		0xf6100000
#define PMB_DATA		0xf7100000
#define PMB_ENTRY_MAX		16

#define NR_PMB_ENTRIES		16

#define PMB_E_MASK		0x0000000f
#define PMB_E_SHIFT		8

@@ -25,6 +27,7 @@
#define PMB_C			0x00000008
#define PMB_WT			0x00000001
#define PMB_UB			0x00000200
#define PMB_CACHE_MASK		(PMB_C | PMB_WT | PMB_UB)
#define PMB_V			0x00000100

#define PMB_NO_ENTRY		(-1)
@@ -32,6 +35,7 @@
#ifndef __ASSEMBLY__
#include <linux/errno.h>
#include <linux/threads.h>
#include <asm/page.h>

/* Default "unsigned long" context */
typedef unsigned long mm_context_id_t[NR_CPUS];
@@ -49,46 +53,22 @@ typedef struct {
#endif
} mm_context_t;

struct pmb_entry;

struct pmb_entry {
	unsigned long vpn;
	unsigned long ppn;
	unsigned long flags;

	/*
	 * 0 .. NR_PMB_ENTRIES for specific entry selection, or
	 * PMB_NO_ENTRY to search for a free one
	 */
	int entry;

	struct pmb_entry *next;
	/* Adjacent entry link for contiguous multi-entry mappings */
	struct pmb_entry *link;
};

#ifdef CONFIG_PMB
/* arch/sh/mm/pmb.c */
long pmb_remap(unsigned long virt, unsigned long phys,
	       unsigned long size, unsigned long flags);
	       unsigned long size, pgprot_t prot);
void pmb_unmap(unsigned long addr);
int pmb_init(void);
void pmb_init(void);
bool __in_29bit_mode(void);
#else
static inline long pmb_remap(unsigned long virt, unsigned long phys,
			     unsigned long size, unsigned long flags)
			     unsigned long size, pgprot_t prot)
{
	return -EINVAL;
}

static inline void pmb_unmap(unsigned long addr)
{
}

static inline int pmb_init(void)
{
	return -ENODEV;
}
#define pmb_unmap(addr)		do { } while (0)
#define pmb_init(addr)		do { } while (0)

#ifdef CONFIG_29BIT
#define __in_29bit_mode()	(1)
+10 −7
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
#endif

#ifndef __ASSEMBLY__
#include <asm/uncached.h>

extern unsigned long shm_align_mask;
extern unsigned long max_low_pfn, min_low_pfn;
@@ -56,7 +57,6 @@ pages_do_alias(unsigned long addr1, unsigned long addr2)
	return (addr1 ^ addr2) & shm_align_mask;
}


#define clear_page(page)	memset((void *)(page), 0, PAGE_SIZE)
extern void copy_page(void *to, void *from);

@@ -127,12 +127,7 @@ typedef struct page *pgtable_t;
 * is not visible (it is part of the PMB mapping) and so needs to be
 * added or subtracted as required.
 */
#if defined(CONFIG_PMB_LEGACY)
/* phys = virt - PAGE_OFFSET - (__MEMORY_START & 0xe0000000) */
#define PMB_OFFSET	(PAGE_OFFSET - PXSEG(__MEMORY_START))
#define __pa(x)	((unsigned long)(x) - PMB_OFFSET)
#define __va(x)	((void *)((unsigned long)(x) + PMB_OFFSET))
#elif defined(CONFIG_32BIT)
#ifdef CONFIG_PMB
#define __pa(x)	((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START)
#define __va(x)	((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START))
#else
@@ -140,6 +135,14 @@ typedef struct page *pgtable_t;
#define __va(x)	((void *)((unsigned long)(x)+PAGE_OFFSET))
#endif

#ifdef CONFIG_UNCACHED_MAPPING
#define UNCAC_ADDR(addr)	((addr) - PAGE_OFFSET + uncached_start)
#define CAC_ADDR(addr)		((addr) - uncached_start + PAGE_OFFSET)
#else
#define UNCAC_ADDR(addr)	((addr))
#define CAC_ADDR(addr)		((addr))
#endif

#define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
#define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)

+2 −9
Original line number Diff line number Diff line
@@ -139,15 +139,8 @@ static inline unsigned long profile_pc(struct pt_regs *regs)
{
	unsigned long pc = instruction_pointer(regs);

#ifdef CONFIG_UNCACHED_MAPPING
	/*
	 * If PC points in to the uncached mapping, fix it up and hand
	 * back the cached equivalent.
	 */
	if ((pc >= (memory_start + cached_to_uncached)) &&
	    (pc <  (memory_start + cached_to_uncached + uncached_size)))
		pc -= cached_to_uncached;
#endif
	if (virt_addr_uncached(pc))
		return CAC_ADDR(pc);

	return pc;
}
Loading