Changes in 4.9.187 MIPS: ath79: fix ar933x uart parity mode MIPS: fix build on non-linux hosts arm64/efi: Mark __efistub_stext_offset as an absolute symbol explicitly dmaengine: imx-sdma: fix use-after-free on probe error path ath10k: Do not send probe response template for mesh ath9k: Check for errors when reading SREV register ath6kl: add some bounds checking ath: DFS JP domain W56 fixed pulse type 3 RADAR detection batman-adv: fix for leaked TVLV handler. media: dvb: usb: fix use after free in dvb_usb_device_exit crypto: talitos - fix skcipher failure due to wrong output IV media: marvell-ccic: fix DMA s/g desc number calculation media: vpss: fix a potential NULL pointer dereference media: media_device_enum_links32: clean a reserved field net: stmmac: dwmac1000: Clear unused address entries net: stmmac: dwmac4/5: Clear unused address entries signal/pid_namespace: Fix reboot_pid_ns to use send_sig not force_sig af_key: fix leaks in key_pol_get_resp and dump_sp. xfrm: Fix xfrm sel prefix length validation media: mc-device.c: don't memset __user pointer contents media: staging: media: davinci_vpfe: - Fix for memory leak if decoder initialization fails. net: phy: Check against net_device being NULL crypto: talitos - properly handle split ICV. crypto: talitos - Align SEC1 accesses to 32 bits boundaries. tua6100: Avoid build warnings. locking/lockdep: Fix merging of hlocks with non-zero references media: wl128x: Fix some error handling in fm_v4l2_init_video_device() cpupower : frequency-set -r option misses the last cpu in related cpu list net: fec: Do not use netdev messages too early net: axienet: Fix race condition causing TX hang s390/qdio: handle PENDING state for QEBSM devices perf cs-etm: Properly set the value of 'old' and 'head' in snapshot mode perf test 6: Fix missing kvm module load for s390 gpio: omap: fix lack of irqstatus_raw0 for OMAP4 gpio: omap: ensure irq is enabled before wakeup regmap: fix bulk writes on paged registers bpf: silence warning messages in core rcu: Force inlining of rcu_read_lock() blkcg, writeback: dead memcgs shouldn't contribute to writeback ownership arbitration xfrm: fix sa selector validation perf evsel: Make perf_evsel__name() accept a NULL argument vhost_net: disable zerocopy by default ipoib: correcly show a VF hardware address EDAC/sysfs: Fix memory leak when creating a csrow object ipsec: select crypto ciphers for xfrm_algo media: i2c: fix warning same module names ntp: Limit TAI-UTC offset timer_list: Guard procfs specific code acpi/arm64: ignore 5.1 FADTs that are reported as 5.0 media: coda: fix mpeg2 sequence number handling media: coda: increment sequence offset for the last returned frame mt7601u: do not schedule rx_tasklet when the device has been disconnected x86/build: Add 'set -e' to mkcapflags.sh to delete broken capflags.c mt7601u: fix possible memory leak when the device is disconnected ath10k: fix PCIE device wake up failed perf tools: Increase MAX_NR_CPUS and MAX_CACHES libata: don't request sense data on !ZAC ATA devices clocksource/drivers/exynos_mct: Increase priority over ARM arch timer rslib: Fix decoding of shortened codes rslib: Fix handling of of caller provided syndrome ixgbe: Check DDM existence in transceiver before access crypto: asymmetric_keys - select CRYPTO_HASH where needed EDAC: Fix global-out-of-bounds write when setting edac_mc_poll_msec bcache: check c->gc_thread by IS_ERR_OR_NULL in cache_set_flush() iwlwifi: mvm: Drop large non sta frames net: usb: asix: init MAC address buffers gpiolib: Fix references to gpiod_[gs]et_*value_cansleep() variants Bluetooth: hci_bcsp: Fix memory leak in rx_skb Bluetooth: 6lowpan: search for destination address in all peers Bluetooth: Check state in l2cap_disconnect_rsp Bluetooth: validate BLE connection interval updates gtp: fix Illegal context switch in RCU read-side critical section. gtp: fix use-after-free in gtp_newlink() xen: let alloc_xenballooned_pages() fail if not enough memory free scsi: NCR5380: Reduce goto statements in NCR5380_select() scsi: NCR5380: Always re-enable reselection interrupt scsi: mac_scsi: Increase PIO/PDMA transfer length threshold crypto: ghash - fix unaligned memory access in ghash_setkey() crypto: arm64/sha1-ce - correct digest for empty data in finup crypto: arm64/sha2-ce - correct digest for empty data in finup crypto: chacha20poly1305 - fix atomic sleep when using async algorithm crypto: crypto4xx - fix a potential double free in ppc4xx_trng_probe Input: gtco - bounds check collection indent level regulator: s2mps11: Fix buck7 and buck8 wrong voltages arm64: tegra: Update Jetson TX1 GPU regulator timings iwlwifi: pcie: don't service an interrupt that was masked tracing/snapshot: Resize spare buffer if size changed NFSv4: Handle the special Linux file open access mode lib/scatterlist: Fix mapping iterator when sg->offset is greater than PAGE_SIZE ALSA: seq: Break too long mutex context in the write loop ALSA: hda/realtek: apply ALC891 headset fixup to one Dell machine media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom() media: coda: Remove unbalanced and unneeded mutex unlock KVM: x86/vPMU: refine kvm_pmu err msg when event creation failed arm64: tegra: Fix AGIC register range fs/proc/proc_sysctl.c: fix the default values of i_uid/i_gid on /proc/sys inodes. drm/nouveau/i2c: Enable i2c pads & busses during preinit padata: use smp_mb in padata_reorder to avoid orphaned padata jobs 9p/virtio: Add cleanup path in p9_virtio_init PCI: Do not poll for PME if the device is in D3cold Btrfs: add missing inode version, ctime and mtime updates when punching hole libnvdimm/pfn: fix fsdax-mode namespace info-block zero-fields take floppy compat ioctls to sodding floppy.c floppy: fix div-by-zero in setup_format_params floppy: fix out-of-bounds read in next_valid_format floppy: fix invalid pointer dereference in drive_name floppy: fix out-of-bounds read in copy_buffer coda: pass the host file in vma->vm_file on mmap gpu: ipu-v3: ipu-ic: Fix saturation bit offset in TPMEM crypto: ccp - Validate the the error value used to index error messages PCI: hv: Delete the device earlier from hbus->children for hot-remove PCI: hv: Fix a use-after-free bug in hv_eject_device_work() crypto: caam - limit output IV to CBC to work around CTR mode DMA issue um: Allow building and running on older hosts um: Fix FP register size for XSTATE/XSAVE parisc: Ensure userspace privilege for ptraced processes in regset functions parisc: Fix kernel panic due invalid values in IAOQ0 or IAOQ1 powerpc/32s: fix suspend/resume when IBATs 4-7 are used powerpc/watchpoint: Restore NV GPRs while returning from exception eCryptfs: fix a couple type promotion bugs intel_th: msu: Fix single mode with disabled IOMMU Bluetooth: Add SMP workaround Microsoft Surface Precision Mouse bug usb: Handle USB3 remote wakeup for LPM enabled devices correctly dm bufio: fix deadlock with loop device compiler.h, kasan: Avoid duplicating __read_once_size_nocheck() compiler.h: Add read_word_at_a_time() function. lib/strscpy: Shut up KASAN false-positives in strscpy() ext4: allow directory holes bnx2x: Prevent load reordering in tx completion processing bnx2x: Prevent ptp_task to be rescheduled indefinitely caif-hsi: fix possible deadlock in cfhsi_exit_module() igmp: fix memory leak in igmpv3_del_delrec() ipv4: don't set IPv6 only flags to IPv4 addresses net: bcmgenet: use promisc for unsupported filters net: dsa: mv88e6xxx: wait after reset deactivation net: neigh: fix multiple neigh timer scheduling net: openvswitch: fix csum updates for MPLS actions nfc: fix potential illegal memory access rxrpc: Fix send on a connected, but unbound socket sky2: Disable MSI on ASUS P6T vrf: make sure skb->data contains ip header to make routing macsec: fix use-after-free of skb during RX macsec: fix checksumming after decryption netrom: fix a memory leak in nr_rx_frame() netrom: hold sock when setting skb->destructor bonding: validate ip header before check IPPROTO_IGMP tcp: Reset bytes_acked and bytes_received when disconnecting net: bridge: mcast: fix stale nsrcs pointer in igmp3/mld2 report handling net: bridge: mcast: fix stale ipv6 hdr pointer when handling v6 query net: bridge: stp: don't cache eth dest pointer before skb pull perf/x86/amd/uncore: Rename 'L2' to 'LLC' perf/x86/amd/uncore: Get correct number of cores sharing last level cache perf/events/amd/uncore: Fix amd_uncore_llc ID to use pre-defined cpu_llc_id NFSv4: Fix open create exclusive when the server reboots nfsd: increase DRC cache limit nfsd: give out fewer session slots as limit approaches nfsd: fix performance-limiting session calculation nfsd: Fix overflow causing non-working mounts on 1 TB machines drm/panel: simple: Fix panel_simple_dsi_probe usb: core: hub: Disable hub-initiated U1/U2 tty: max310x: Fix invalid baudrate divisors calculator pinctrl: rockchip: fix leaked of_node references tty: serial: cpm_uart - fix init when SMC is relocated drm/bridge: tc358767: read display_props in get_modes() drm/bridge: sii902x: pixel clock unit is 10kHz instead of 1kHz memstick: Fix error cleanup path of memstick_init tty/serial: digicolor: Fix digicolor-usart already registered warning tty: serial: msm_serial: avoid system lockup condition serial: 8250: Fix TX interrupt handling condition drm/virtio: Add memory barriers for capset cache. phy: renesas: rcar-gen2: Fix memory leak at error paths drm/rockchip: Properly adjust to a true clock in adjusted_mode tty: serial_core: Set port active bit in uart_port_activate usb: gadget: Zero ffs_io_data powerpc/pci/of: Fix OF flags parsing for 64bit BARs PCI: sysfs: Ignore lockdep for remove attribute kbuild: Add -Werror=unknown-warning-option to CLANG_FLAGS PCI: xilinx-nwl: Fix Multi MSI data programming iio: iio-utils: Fix possible incorrect mask calculation recordmcount: Fix spurious mcount entries on powerpc mfd: core: Set fwnode for created devices mfd: arizona: Fix undefined behavior mfd: hi655x-pmic: Fix missing return value check for devm_regmap_init_mmio_clk um: Silence lockdep complaint about mmap_sem powerpc/4xx/uic: clear pending interrupt after irq type/pol change RDMA/i40iw: Set queue pair state when being queried serial: sh-sci: Terminate TX DMA during buffer flushing serial: sh-sci: Fix TX DMA buffer flushing and workqueue races kallsyms: exclude kasan local symbols on s390 perf test mmap-thread-lookup: Initialize variable to suppress memory sanitizer warning RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM powerpc/boot: add {get, put}_unaligned_be32 to xz_config.h f2fs: avoid out-of-range memory access mailbox: handle failed named mailbox channel request powerpc/eeh: Handle hugepages in ioremap space sh: prevent warnings when using iounmap mm/kmemleak.c: fix check for softirq context 9p: pass the correct prototype to read_cache_page mm/mmu_notifier: use hlist_add_head_rcu() locking/lockdep: Fix lock used or unused stats error locking/lockdep: Hide unused 'class' variable usb: wusbcore: fix unbalanced get/put cluster_id usb: pci-quirks: Correct AMD PLL quirk detection x86/sysfb_efi: Add quirks for some devices with swapped width and height x86/speculation/mds: Apply more accurate check on hypervisor platform hpet: Fix division by zero in hpet_time_div() ALSA: line6: Fix wrong altsetting for LINE6_PODHD500_1 ALSA: hda - Add a conexant codec entry to let mute led work powerpc/tm: Fix oops on sigreturn on systems without TM access: avoid the RCU grace period for the temporary subjective credentials ipv6: check sk sk_type and protocol early in ip_mroute_set/getsockopt tcp: reset sk_send_head in tcp_write_queue_purge arm64: dts: marvell: Fix A37xx UART0 register size i2c: qup: fixed releasing dma without flush operation completion arm64: compat: Provide definition for COMPAT_SIGMINSTKSZ ISDN: hfcsusb: checking idx of ep configuration media: au0828: fix null dereference in error path media: cpia2_usb: first wake up, then free in disconnect media: radio-raremono: change devm_k*alloc to k*alloc Bluetooth: hci_uart: check for missing tty operations sched/fair: Don't free p->numa_faults with concurrent readers drivers/pps/pps.c: clear offset flags in PPS_SETPARAMS ioctl ceph: hold i_ceph_lock when removing caps for freeing inode Linux 4.9.187 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
397 lines
11 KiB
C
397 lines
11 KiB
C
#ifndef __ASM_SH_IO_H
|
|
#define __ASM_SH_IO_H
|
|
|
|
/*
|
|
* Convention:
|
|
* read{b,w,l,q}/write{b,w,l,q} are for PCI,
|
|
* while in{b,w,l}/out{b,w,l} are for ISA
|
|
*
|
|
* In addition we have 'pausing' versions: in{b,w,l}_p/out{b,w,l}_p
|
|
* and 'string' versions: ins{b,w,l}/outs{b,w,l}
|
|
*
|
|
* While read{b,w,l,q} and write{b,w,l,q} contain memory barriers
|
|
* automatically, there are also __raw versions, which do not.
|
|
*/
|
|
#include <linux/errno.h>
|
|
#include <asm/cache.h>
|
|
#include <asm/addrspace.h>
|
|
#include <asm/machvec.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm-generic/iomap.h>
|
|
|
|
#ifdef __KERNEL__
|
|
#define __IO_PREFIX generic
|
|
#include <asm/io_generic.h>
|
|
#include <asm/io_trapped.h>
|
|
#include <mach/mangle-port.h>
|
|
|
|
#define __raw_writeb(v,a) (__chk_io_ptr(a), *(volatile u8 __force *)(a) = (v))
|
|
#define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v))
|
|
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v))
|
|
#define __raw_writeq(v,a) (__chk_io_ptr(a), *(volatile u64 __force *)(a) = (v))
|
|
|
|
#define __raw_readb(a) (__chk_io_ptr(a), *(volatile u8 __force *)(a))
|
|
#define __raw_readw(a) (__chk_io_ptr(a), *(volatile u16 __force *)(a))
|
|
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile u32 __force *)(a))
|
|
#define __raw_readq(a) (__chk_io_ptr(a), *(volatile u64 __force *)(a))
|
|
|
|
#define readb_relaxed(c) ({ u8 __v = ioswabb(__raw_readb(c)); __v; })
|
|
#define readw_relaxed(c) ({ u16 __v = ioswabw(__raw_readw(c)); __v; })
|
|
#define readl_relaxed(c) ({ u32 __v = ioswabl(__raw_readl(c)); __v; })
|
|
#define readq_relaxed(c) ({ u64 __v = ioswabq(__raw_readq(c)); __v; })
|
|
|
|
#define writeb_relaxed(v,c) ((void)__raw_writeb((__force u8)ioswabb(v),c))
|
|
#define writew_relaxed(v,c) ((void)__raw_writew((__force u16)ioswabw(v),c))
|
|
#define writel_relaxed(v,c) ((void)__raw_writel((__force u32)ioswabl(v),c))
|
|
#define writeq_relaxed(v,c) ((void)__raw_writeq((__force u64)ioswabq(v),c))
|
|
|
|
#define readb(a) ({ u8 r_ = readb_relaxed(a); rmb(); r_; })
|
|
#define readw(a) ({ u16 r_ = readw_relaxed(a); rmb(); r_; })
|
|
#define readl(a) ({ u32 r_ = readl_relaxed(a); rmb(); r_; })
|
|
#define readq(a) ({ u64 r_ = readq_relaxed(a); rmb(); r_; })
|
|
|
|
#define writeb(v,a) ({ wmb(); writeb_relaxed((v),(a)); })
|
|
#define writew(v,a) ({ wmb(); writew_relaxed((v),(a)); })
|
|
#define writel(v,a) ({ wmb(); writel_relaxed((v),(a)); })
|
|
#define writeq(v,a) ({ wmb(); writeq_relaxed((v),(a)); })
|
|
|
|
#define readsb(p,d,l) __raw_readsb(p,d,l)
|
|
#define readsw(p,d,l) __raw_readsw(p,d,l)
|
|
#define readsl(p,d,l) __raw_readsl(p,d,l)
|
|
|
|
#define writesb(p,d,l) __raw_writesb(p,d,l)
|
|
#define writesw(p,d,l) __raw_writesw(p,d,l)
|
|
#define writesl(p,d,l) __raw_writesl(p,d,l)
|
|
|
|
#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(pfx, bwlq, type) \
|
|
\
|
|
static inline void \
|
|
pfx##writes##bwlq(volatile void __iomem *mem, const void *addr, \
|
|
unsigned int count) \
|
|
{ \
|
|
const volatile type *__addr = addr; \
|
|
\
|
|
while (count--) { \
|
|
__raw_write##bwlq(*__addr, mem); \
|
|
__addr++; \
|
|
} \
|
|
} \
|
|
\
|
|
static inline void pfx##reads##bwlq(volatile void __iomem *mem, \
|
|
void *addr, unsigned int count) \
|
|
{ \
|
|
volatile type *__addr = addr; \
|
|
\
|
|
while (count--) { \
|
|
*__addr = __raw_read##bwlq(mem); \
|
|
__addr++; \
|
|
} \
|
|
}
|
|
|
|
__BUILD_MEMORY_STRING(__raw_, b, u8)
|
|
__BUILD_MEMORY_STRING(__raw_, w, u16)
|
|
|
|
#ifdef CONFIG_SUPERH32
|
|
void __raw_writesl(void __iomem *addr, const void *data, int longlen);
|
|
void __raw_readsl(const void __iomem *addr, void *data, int longlen);
|
|
#else
|
|
__BUILD_MEMORY_STRING(__raw_, l, u32)
|
|
#endif
|
|
|
|
__BUILD_MEMORY_STRING(__raw_, q, u64)
|
|
|
|
#ifdef CONFIG_HAS_IOPORT_MAP
|
|
|
|
/*
|
|
* Slowdown I/O port space accesses for antique hardware.
|
|
*/
|
|
#undef CONF_SLOWDOWN_IO
|
|
|
|
/*
|
|
* On SuperH I/O ports are memory mapped, so we access them using normal
|
|
* load/store instructions. sh_io_port_base is the virtual address to
|
|
* which all ports are being mapped.
|
|
*/
|
|
extern unsigned long sh_io_port_base;
|
|
|
|
static inline void __set_io_port_base(unsigned long pbase)
|
|
{
|
|
*(unsigned long *)&sh_io_port_base = pbase;
|
|
barrier();
|
|
}
|
|
|
|
#ifdef CONFIG_GENERIC_IOMAP
|
|
#define __ioport_map ioport_map
|
|
#else
|
|
extern void __iomem *__ioport_map(unsigned long addr, unsigned int size);
|
|
#endif
|
|
|
|
#ifdef CONF_SLOWDOWN_IO
|
|
#define SLOW_DOWN_IO __raw_readw(sh_io_port_base)
|
|
#else
|
|
#define SLOW_DOWN_IO
|
|
#endif
|
|
|
|
#define __BUILD_IOPORT_SINGLE(pfx, bwlq, type, p, slow) \
|
|
\
|
|
static inline void pfx##out##bwlq##p(type val, unsigned long port) \
|
|
{ \
|
|
volatile type *__addr; \
|
|
\
|
|
__addr = __ioport_map(port, sizeof(type)); \
|
|
*__addr = val; \
|
|
slow; \
|
|
} \
|
|
\
|
|
static inline type pfx##in##bwlq##p(unsigned long port) \
|
|
{ \
|
|
volatile type *__addr; \
|
|
type __val; \
|
|
\
|
|
__addr = __ioport_map(port, sizeof(type)); \
|
|
__val = *__addr; \
|
|
slow; \
|
|
\
|
|
return __val; \
|
|
}
|
|
|
|
#define __BUILD_IOPORT_PFX(bus, bwlq, type) \
|
|
__BUILD_IOPORT_SINGLE(bus, bwlq, type, ,) \
|
|
__BUILD_IOPORT_SINGLE(bus, bwlq, type, _p, SLOW_DOWN_IO)
|
|
|
|
#define BUILDIO_IOPORT(bwlq, type) \
|
|
__BUILD_IOPORT_PFX(, bwlq, type)
|
|
|
|
BUILDIO_IOPORT(b, u8)
|
|
BUILDIO_IOPORT(w, u16)
|
|
BUILDIO_IOPORT(l, u32)
|
|
BUILDIO_IOPORT(q, u64)
|
|
|
|
#define __BUILD_IOPORT_STRING(bwlq, type) \
|
|
\
|
|
static inline void outs##bwlq(unsigned long port, const void *addr, \
|
|
unsigned int count) \
|
|
{ \
|
|
const volatile type *__addr = addr; \
|
|
\
|
|
while (count--) { \
|
|
out##bwlq(*__addr, port); \
|
|
__addr++; \
|
|
} \
|
|
} \
|
|
\
|
|
static inline void ins##bwlq(unsigned long port, void *addr, \
|
|
unsigned int count) \
|
|
{ \
|
|
volatile type *__addr = addr; \
|
|
\
|
|
while (count--) { \
|
|
*__addr = in##bwlq(port); \
|
|
__addr++; \
|
|
} \
|
|
}
|
|
|
|
__BUILD_IOPORT_STRING(b, u8)
|
|
__BUILD_IOPORT_STRING(w, u16)
|
|
__BUILD_IOPORT_STRING(l, u32)
|
|
__BUILD_IOPORT_STRING(q, u64)
|
|
|
|
#else /* !CONFIG_HAS_IOPORT_MAP */
|
|
|
|
#include <asm/io_noioport.h>
|
|
|
|
#endif
|
|
|
|
|
|
#define IO_SPACE_LIMIT 0xffffffff
|
|
|
|
/* synco on SH-4A, otherwise a nop */
|
|
#define mmiowb() wmb()
|
|
|
|
/* We really want to try and get these to memcpy etc */
|
|
void memcpy_fromio(void *, const volatile void __iomem *, unsigned long);
|
|
void memcpy_toio(volatile void __iomem *, const void *, unsigned long);
|
|
void memset_io(volatile void __iomem *, int, unsigned long);
|
|
|
|
/* Quad-word real-mode I/O, don't ask.. */
|
|
unsigned long long peek_real_address_q(unsigned long long addr);
|
|
unsigned long long poke_real_address_q(unsigned long long addr,
|
|
unsigned long long val);
|
|
|
|
#if !defined(CONFIG_MMU)
|
|
#define virt_to_phys(address) ((unsigned long)(address))
|
|
#define phys_to_virt(address) ((void *)(address))
|
|
#else
|
|
#define virt_to_phys(address) (__pa(address))
|
|
#define phys_to_virt(address) (__va(address))
|
|
#endif
|
|
|
|
/*
|
|
* On 32-bit SH, we traditionally have the whole physical address space
|
|
* mapped at all times (as MIPS does), so "ioremap()" and "iounmap()" do
|
|
* not need to do anything but place the address in the proper segment.
|
|
* This is true for P1 and P2 addresses, as well as some P3 ones.
|
|
* However, most of the P3 addresses and newer cores using extended
|
|
* addressing need to map through page tables, so the ioremap()
|
|
* implementation becomes a bit more complicated.
|
|
*
|
|
* See arch/sh/mm/ioremap.c for additional notes on this.
|
|
*
|
|
* We cheat a bit and always return uncachable areas until we've fixed
|
|
* the drivers to handle caching properly.
|
|
*
|
|
* On the SH-5 the concept of segmentation in the 1:1 PXSEG sense simply
|
|
* doesn't exist, so everything must go through page tables.
|
|
*/
|
|
#ifdef CONFIG_MMU
|
|
void __iomem *__ioremap_caller(phys_addr_t offset, unsigned long size,
|
|
pgprot_t prot, void *caller);
|
|
void __iounmap(void __iomem *addr);
|
|
|
|
static inline void __iomem *
|
|
__ioremap(phys_addr_t offset, unsigned long size, pgprot_t prot)
|
|
{
|
|
return __ioremap_caller(offset, size, prot, __builtin_return_address(0));
|
|
}
|
|
|
|
static inline void __iomem *
|
|
__ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot)
|
|
{
|
|
#ifdef CONFIG_29BIT
|
|
phys_addr_t last_addr = offset + size - 1;
|
|
|
|
/*
|
|
* For P1 and P2 space this is trivial, as everything is already
|
|
* mapped. Uncached access for P1 addresses are done through P2.
|
|
* In the P3 case or for addresses outside of the 29-bit space,
|
|
* mapping must be done by the PMB or by using page tables.
|
|
*/
|
|
if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) {
|
|
u64 flags = pgprot_val(prot);
|
|
|
|
/*
|
|
* Anything using the legacy PTEA space attributes needs
|
|
* to be kicked down to page table mappings.
|
|
*/
|
|
if (unlikely(flags & _PAGE_PCC_MASK))
|
|
return NULL;
|
|
if (unlikely(flags & _PAGE_CACHABLE))
|
|
return (void __iomem *)P1SEGADDR(offset);
|
|
|
|
return (void __iomem *)P2SEGADDR(offset);
|
|
}
|
|
|
|
/* P4 above the store queues are always mapped. */
|
|
if (unlikely(offset >= P3_ADDR_MAX))
|
|
return (void __iomem *)P4SEGADDR(offset);
|
|
#endif
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static inline void __iomem *
|
|
__ioremap_mode(phys_addr_t offset, unsigned long size, pgprot_t prot)
|
|
{
|
|
void __iomem *ret;
|
|
|
|
ret = __ioremap_trapped(offset, size);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ret = __ioremap_29bit(offset, size, prot);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return __ioremap(offset, size, prot);
|
|
}
|
|
#else
|
|
#define __ioremap(offset, size, prot) ((void __iomem *)(offset))
|
|
#define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset))
|
|
#define __iounmap(addr) do { } while (0)
|
|
#endif /* CONFIG_MMU */
|
|
|
|
static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)
|
|
{
|
|
return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE);
|
|
}
|
|
|
|
static inline void __iomem *
|
|
ioremap_cache(phys_addr_t offset, unsigned long size)
|
|
{
|
|
return __ioremap_mode(offset, size, PAGE_KERNEL);
|
|
}
|
|
#define ioremap_cache ioremap_cache
|
|
|
|
#ifdef CONFIG_HAVE_IOREMAP_PROT
|
|
static inline void __iomem *
|
|
ioremap_prot(phys_addr_t offset, unsigned long size, unsigned long flags)
|
|
{
|
|
return __ioremap_mode(offset, size, __pgprot(flags));
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_IOREMAP_FIXED
|
|
extern void __iomem *ioremap_fixed(phys_addr_t, unsigned long, pgprot_t);
|
|
extern int iounmap_fixed(void __iomem *);
|
|
extern void ioremap_fixed_init(void);
|
|
#else
|
|
static inline void __iomem *
|
|
ioremap_fixed(phys_addr_t phys_addr, unsigned long size, pgprot_t prot)
|
|
{
|
|
BUG();
|
|
return NULL;
|
|
}
|
|
|
|
static inline void ioremap_fixed_init(void) { }
|
|
static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; }
|
|
#endif
|
|
|
|
#define ioremap_nocache ioremap
|
|
#define ioremap_uc ioremap
|
|
|
|
static inline void iounmap(void __iomem *addr)
|
|
{
|
|
__iounmap(addr);
|
|
}
|
|
|
|
/*
|
|
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
|
|
* access
|
|
*/
|
|
#define xlate_dev_mem_ptr(p) __va(p)
|
|
|
|
/*
|
|
* Convert a virtual cached pointer to an uncached pointer
|
|
*/
|
|
#define xlate_dev_kmem_ptr(p) p
|
|
|
|
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
|
int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
|
int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* __ASM_SH_IO_H */
|