mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-19 16:14:13 +08:00
asm-generic: architecture independent readq/writeq for 32bit environment
This provides unified readq()/writeq() helper functions for 32-bit
drivers.
For some cases, readq/writeq without atomicity is harmful, and order of
io access has to be specified explicitly. So in this patch, new two
header files which contain non-atomic readq/writeq are added.
- <asm-generic/io-64-nonatomic-lo-hi.h> provides non-atomic readq/
writeq with the order of lower address -> higher address
- <asm-generic/io-64-nonatomic-hi-lo.h> provides non-atomic readq/
writeq with reversed order
This allows us to remove some readq()s that were added drivers when the
default non-atomic ones were removed in commit dbee8a0aff
("x86:
remove 32-bit versions of readq()/writeq()")
The drivers which need readq/writeq but can do with the non-atomic ones
must add the line:
#include <asm-generic/io-64-nonatomic-lo-hi.h> /* or hi-lo.h */
But this will be nop in 64-bit environments, and no other #ifdefs are
required. So I believe that this patch can solve the problem of
1. driver-specific readq/writeq
2. atomicity and order of io access
This patch is tested with building allyesconfig and allmodconfig as
ARCH=x86 and ARCH=i386 on top of tip/master.
Cc: Kashyap Desai <Kashyap.Desai@lsi.com>
Cc: Len Brown <lenb@kernel.org>
Cc: Ravi Anand <ravi.anand@qlogic.com>
Cc: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Jason Uhlenkott <juhlenko@akamai.com>
Cc: James Bottomley <James.Bottomley@parallels.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Roland Dreier <roland@purestorage.com>
Cc: James Bottomley <jbottomley@parallels.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Hitoshi Mitake <h.mitake@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
27e74da980
commit
797a796a13
@ -41,6 +41,8 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
#include <asm-generic/io-64-nonatomic-lo-hi.h>
|
||||
|
||||
#define NVME_Q_DEPTH 1024
|
||||
#define SQ_SIZE(depth) (depth * sizeof(struct nvme_command))
|
||||
#define CQ_SIZE(depth) (depth * sizeof(struct nvme_completion))
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <linux/io.h>
|
||||
#include "edac_core.h"
|
||||
|
||||
#include <asm-generic/io-64-nonatomic-lo-hi.h>
|
||||
|
||||
#define I3200_REVISION "1.1"
|
||||
|
||||
#define EDAC_MOD_STR "i3200_edac"
|
||||
@ -101,19 +103,6 @@ struct i3200_priv {
|
||||
|
||||
static int nr_channels;
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
low = readl(p);
|
||||
high = readl(p + 1);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int how_many_channels(struct pci_dev *pdev)
|
||||
{
|
||||
unsigned char capid0_8b; /* 8th byte of CAPID0 */
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/bios_ebda.h>
|
||||
|
||||
#include <asm-generic/io-64-nonatomic-lo-hi.h>
|
||||
|
||||
static bool force;
|
||||
module_param(force, bool, 0);
|
||||
MODULE_PARM_DESC(force, "Force driver load, ignore DMI data");
|
||||
@ -83,19 +85,6 @@ static void __iomem *rtl_cmd_addr;
|
||||
static u8 rtl_cmd_type;
|
||||
static u8 rtl_cmd_width;
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
low = readl(p);
|
||||
high = readl(p + 1);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __iomem *rtl_port_map(phys_addr_t addr, unsigned long len)
|
||||
{
|
||||
if (rtl_cmd_type == RTL_ADDR_TYPE_MMIO)
|
||||
|
@ -77,6 +77,8 @@
|
||||
#include <asm/processor.h>
|
||||
#include "intel_ips.h"
|
||||
|
||||
#include <asm-generic/io-64-nonatomic-lo-hi.h>
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_THERMAL_SENSOR 0x3b32
|
||||
|
||||
/*
|
||||
@ -344,19 +346,6 @@ struct ips_driver {
|
||||
static bool
|
||||
ips_gpu_turbo_enabled(struct ips_driver *ips);
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
low = readl(p);
|
||||
high = readl(p + 1);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ips_cpu_busy - is CPU busy?
|
||||
* @ips: IPS driver struct
|
||||
|
@ -10,6 +10,8 @@
|
||||
#include "ql4_def.h"
|
||||
#include "ql4_glbl.h"
|
||||
|
||||
#include <asm-generic/io-64-nonatomic-lo-hi.h>
|
||||
|
||||
#define MASK(n) DMA_BIT_MASK(n)
|
||||
#define MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff))
|
||||
#define OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) | ((addr >> 25) & 0x3ff))
|
||||
@ -655,27 +657,6 @@ static int qla4_8xxx_pci_is_same_window(struct scsi_qla_host *ha,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
low = readl(p);
|
||||
high = readl(p + 1);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef writeq
|
||||
static inline void writeq(__u64 val, volatile void __iomem *addr)
|
||||
{
|
||||
writel(val, addr);
|
||||
writel(val >> 32, addr+4);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int qla4_8xxx_pci_mem_read_direct(struct scsi_qla_host *ha,
|
||||
u64 off, void *data, int size)
|
||||
{
|
||||
|
28
include/asm-generic/io-64-nonatomic-hi-lo.h
Normal file
28
include/asm-generic/io-64-nonatomic-hi-lo.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef _ASM_IO_64_NONATOMIC_HI_LO_H_
|
||||
#define _ASM_IO_64_NONATOMIC_HI_LO_H_
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
high = readl(p + 1);
|
||||
low = readl(p);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef writeq
|
||||
static inline void writeq(__u64 val, volatile void __iomem *addr)
|
||||
{
|
||||
writel(val >> 32, addr + 4);
|
||||
writel(val, addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_IO_64_NONATOMIC_HI_LO_H_ */
|
28
include/asm-generic/io-64-nonatomic-lo-hi.h
Normal file
28
include/asm-generic/io-64-nonatomic-lo-hi.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef _ASM_IO_64_NONATOMIC_LO_HI_H_
|
||||
#define _ASM_IO_64_NONATOMIC_LO_HI_H_
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#ifndef readq
|
||||
static inline __u64 readq(const volatile void __iomem *addr)
|
||||
{
|
||||
const volatile u32 __iomem *p = addr;
|
||||
u32 low, high;
|
||||
|
||||
low = readl(p);
|
||||
high = readl(p + 1);
|
||||
|
||||
return low + ((u64)high << 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef writeq
|
||||
static inline void writeq(__u64 val, volatile void __iomem *addr)
|
||||
{
|
||||
writel(val, addr);
|
||||
writel(val >> 32, addr + 4);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_IO_64_NONATOMIC_LO_HI_H_ */
|
Loading…
Reference in New Issue
Block a user