Changes since v2 [1]:
1/ Move arch_memremap() and arch_memunmap() out of line (Christoph)
2/ Convert region_is_ram() to region_intersects() and define an enum for its 3 return values. (Luis)
3/ Fix gma500 and i915 to explicitly use cached mappings and clean up the __iomem usage. (Daniel)
4/ Kill unused ioremap aliases (ioremap_cached() and ioremap_fullcache()) (Christoph)
5/ Clarify some change logs and documentation (Luis, Christoph, and Ross)
6/ Add a unified CONFIG_MMU=n implementation with __weak symbols. (Luis)
--- While developing the pmem driver we noticed that the __iomem annotation on the return value from ioremap_cache() was being mishandled by several callers. We also observed that all of the call sites expected to be able to treat the return value from ioremap_cache() as normal (non-__iomem) pointer to memory.
This patchset takes the opportunity to clean up the above confusion as well as a few issues with the ioremap_{cache|wt} interface, including:
1/ Eliminating the possibility of function prototypes differing between architectures by defining a central memremap() prototype that takes flags to determine the mapping type.
2/ Returning NULL rather than falling back silently to a different mapping-type. This allows drivers to be stricter about the mapping-type fallbacks that are permissible.
[1]: http://marc.info/?l=linux-arch&m=143779222217405&w=2
---
Dan Williams (24): mm: enhance region_is_ram() to region_intersects() arch, drivers: don't include <asm/io.h> directly, use <linux/io.h> instead cleanup IORESOURCE_CACHEABLE vs ioremap() intel_iommu: fix leaked ioremap mapping arch: introduce memremap() arm: switch from ioremap_cache to memremap x86: switch from ioremap_cache to memremap gma500: switch from acpi_os_ioremap to memremap i915: switch from acpi_os_ioremap to memremap acpi: switch from ioremap_cache to memremap toshiba laptop: replace ioremap_cache with ioremap memconsole: fix __iomem mishandling, switch to memremap visorbus: switch from ioremap_cache to memremap intel-iommu: switch from ioremap_cache to memremap libnvdimm, pmem: push call to ioremap_cache out of line pxa2xx-flash: switch from ioremap_cache to memremap sfi: switch from ioremap_cache to memremap fbdev: switch from ioremap_wt to memremap pmem: switch from ioremap_wt to memremap arch: kill ioremap_cached() arch: kill ioremap_fullcache() arch: remove ioremap_cache, replace with arch_memremap arch: remove ioremap_wt, optionally replace with arch_memremap pmem: convert to generic memremap
Documentation/x86/pat.txt | 6 + arch/arc/include/asm/io.h | 1 arch/arm/Kconfig | 1 arch/arm/include/asm/io.h | 7 -- arch/arm/include/asm/xen/page.h | 4 - arch/arm/mach-clps711x/board-cdb89712.c | 2 arch/arm/mach-shmobile/pm-rcar.c | 2 arch/arm/mm/ioremap.c | 18 +++- arch/arm/mm/mmu.c | 2 arch/arm/mm/nommu.c | 11 ++ arch/arm64/Kconfig | 1 arch/arm64/include/asm/acpi.h | 11 -- arch/arm64/include/asm/dmi.h | 8 +- arch/arm64/include/asm/io.h | 2 arch/arm64/kernel/efi.c | 9 +- arch/arm64/kernel/smp_spin_table.c | 19 ++-- arch/arm64/mm/ioremap.c | 20 ++-- arch/avr32/include/asm/io.h | 1 arch/frv/include/asm/io.h | 12 --- arch/ia64/Kconfig | 1 arch/ia64/include/asm/io.h | 5 - arch/ia64/kernel/cyclone.c | 2 arch/ia64/mm/ioremap.c | 16 +++ arch/m32r/include/asm/io.h | 1 arch/m68k/Kconfig | 1 arch/m68k/include/asm/io_mm.h | 12 --- arch/m68k/include/asm/io_no.h | 11 -- arch/m68k/include/asm/raw_io.h | 1 arch/m68k/mm/kmap.c | 17 +++- arch/m68k/mm/sun3kmap.c | 6 + arch/metag/include/asm/io.h | 6 - arch/microblaze/include/asm/io.h | 2 arch/mn10300/include/asm/io.h | 1 arch/nios2/include/asm/io.h | 1 arch/powerpc/kernel/pci_of_scan.c | 2 arch/s390/include/asm/io.h | 1 arch/sh/Kconfig | 1 arch/sh/include/asm/io.h | 6 - arch/sh/mm/ioremap.c | 15 +++ arch/sparc/include/asm/io_32.h | 1 arch/sparc/include/asm/io_64.h | 1 arch/sparc/kernel/pci.c | 3 - arch/tile/include/asm/io.h | 2 arch/unicore32/include/asm/io.h | 4 - arch/unicore32/mm/ioremap.c | 8 -- arch/x86/Kconfig | 1 arch/x86/include/asm/efi.h | 3 - arch/x86/include/asm/io.h | 11 -- arch/x86/kernel/crash_dump_64.c | 6 + arch/x86/kernel/kdebugfs.c | 8 +- arch/x86/kernel/ksysfs.c | 28 +++--- arch/x86/mm/ioremap.c | 59 +++++++------ arch/xtensa/include/asm/io.h | 11 -- drivers/acpi/apei/einj.c | 9 +- drivers/acpi/apei/erst.c | 6 + drivers/acpi/nvs.c | 6 + drivers/acpi/osl.c | 70 ++++----------- drivers/char/toshiba.c | 2 drivers/firmware/google/memconsole.c | 7 +- drivers/gpu/drm/gma500/opregion.c | 8 +- drivers/gpu/drm/gma500/psb_drv.h | 2 drivers/gpu/drm/gma500/psb_lid.c | 8 +- drivers/gpu/drm/i915/i915_debugfs.c | 2 drivers/gpu/drm/i915/i915_drv.h | 12 +-- drivers/gpu/drm/i915/intel_bios.c | 7 +- drivers/gpu/drm/i915/intel_opregion.c | 87 +++++++++---------- drivers/gpu/drm/i915/intel_panel.c | 2 drivers/iommu/intel-iommu.c | 10 +- drivers/iommu/intel_irq_remapping.c | 4 + drivers/isdn/icn/icn.h | 2 drivers/mtd/devices/slram.c | 2 drivers/mtd/maps/pxa2xx-flash.c | 4 - drivers/mtd/nand/diskonchip.c | 2 drivers/mtd/onenand/generic.c | 2 drivers/nvdimm/Kconfig | 2 drivers/pci/probe.c | 3 - drivers/pnp/manager.c | 2 drivers/scsi/aic94xx/aic94xx_init.c | 7 -- drivers/scsi/arcmsr/arcmsr_hba.c | 5 - drivers/scsi/mvsas/mv_init.c | 15 +-- drivers/scsi/sun3x_esp.c | 2 drivers/sfi/sfi_core.c | 4 - drivers/staging/comedi/drivers/ii_pci20kc.c | 1 drivers/staging/unisys/visorbus/visorchannel.c | 16 ++- drivers/staging/unisys/visorbus/visorchipset.c | 17 ++-- drivers/tty/serial/8250/8250_core.c | 2 drivers/video/fbdev/Kconfig | 2 drivers/video/fbdev/amifb.c | 5 + drivers/video/fbdev/atafb.c | 5 + drivers/video/fbdev/hpfb.c | 6 + drivers/video/fbdev/ocfb.c | 1 drivers/video/fbdev/s1d13xxxfb.c | 3 - drivers/video/fbdev/stifb.c | 1 include/acpi/acpi_io.h | 6 - include/asm-generic/io.h | 8 -- include/asm-generic/iomap.h | 4 - include/linux/io-mapping.h | 2 include/linux/io.h | 11 ++ include/linux/mm.h | 9 ++ include/linux/mtd/map.h | 2 include/linux/pmem.h | 26 +++--- include/video/vga.h | 2 kernel/Makefile | 2 kernel/memremap.c | 110 ++++++++++++++++++++++++ kernel/resource.c | 61 ++++++++----- lib/Kconfig | 5 + lib/devres.c | 13 +-- lib/pci_iomap.c | 7 -- tools/testing/nvdimm/Kbuild | 4 - tools/testing/nvdimm/test/iomap.c | 34 +++++-- 110 files changed, 553 insertions(+), 497 deletions(-) create mode 100644 kernel/memremap.c
gma500 expects the OpRegion to be cached (i.e. not __iomem), so explicitly map it with memremap rather than the implied cache setting of acpi_os_ioremap().
Cc: David Airlie airlied@linux.ie Cc: dri-devel@lists.freedesktop.org Signed-off-by: Dan Williams dan.j.williams@intel.com --- drivers/gpu/drm/gma500/opregion.c | 8 ++++---- drivers/gpu/drm/gma500/psb_drv.h | 2 +- drivers/gpu/drm/gma500/psb_lid.c | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/gma500/opregion.c b/drivers/gpu/drm/gma500/opregion.c index ab696ca7eeec..7672ac4d4217 100644 --- a/drivers/gpu/drm/gma500/opregion.c +++ b/drivers/gpu/drm/gma500/opregion.c @@ -297,7 +297,7 @@ void psb_intel_opregion_fini(struct drm_device *dev) cancel_work_sync(&opregion->asle_work);
/* just clear all opregion memory pointers now */ - iounmap(opregion->header); + memunmap(opregion->header); opregion->header = NULL; opregion->acpi = NULL; opregion->swsci = NULL; @@ -310,8 +310,8 @@ int psb_intel_opregion_setup(struct drm_device *dev) struct drm_psb_private *dev_priv = dev->dev_private; struct psb_intel_opregion *opregion = &dev_priv->opregion; u32 opregion_phy, mboxes; - void __iomem *base; int err = 0; + void *base;
pci_read_config_dword(dev->pdev, PCI_ASLS, &opregion_phy); if (opregion_phy == 0) { @@ -322,7 +322,7 @@ int psb_intel_opregion_setup(struct drm_device *dev) INIT_WORK(&opregion->asle_work, psb_intel_opregion_asle_work);
DRM_DEBUG("OpRegion detected at 0x%8x\n", opregion_phy); - base = acpi_os_ioremap(opregion_phy, 8*1024); + base = memremap(opregion_phy, 8*1024, MEMREMAP_WB); if (!base) return -ENOMEM;
@@ -351,7 +351,7 @@ int psb_intel_opregion_setup(struct drm_device *dev) return 0;
err_out: - iounmap(base); + memunmap(base); return err; }
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h index e38057b91865..189f57135d47 100644 --- a/drivers/gpu/drm/gma500/psb_drv.h +++ b/drivers/gpu/drm/gma500/psb_drv.h @@ -253,7 +253,7 @@ struct psb_intel_opregion { struct opregion_swsci *swsci; struct opregion_asle *asle; void *vbt; - u32 __iomem *lid_state; + u32 *lid_state; struct work_struct asle_work; };
diff --git a/drivers/gpu/drm/gma500/psb_lid.c b/drivers/gpu/drm/gma500/psb_lid.c index 1d2ebb5e530f..6b1b9d0741df 100644 --- a/drivers/gpu/drm/gma500/psb_lid.c +++ b/drivers/gpu/drm/gma500/psb_lid.c @@ -28,14 +28,14 @@ static void psb_lid_timer_func(unsigned long data) struct drm_psb_private * dev_priv = (struct drm_psb_private *)data; struct drm_device *dev = (struct drm_device *)dev_priv->dev; struct timer_list *lid_timer = &dev_priv->lid_timer; + u32 *lid_state = dev_priv->opregion.lid_state; unsigned long irq_flags; - u32 __iomem *lid_state = dev_priv->opregion.lid_state; u32 pp_status;
- if (readl(lid_state) == dev_priv->lid_last_state) + if (*lid_state == dev_priv->lid_last_state) goto lid_timer_schedule;
- if ((readl(lid_state)) & 0x01) { + if ((*lid_state) & 0x01) { /*lid state is open*/ REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) | POWER_TARGET_ON); do { @@ -58,7 +58,7 @@ static void psb_lid_timer_func(unsigned long data) pp_status = REG_READ(PP_STATUS); } while ((pp_status & PP_ON) == 0); } - dev_priv->lid_last_state = readl(lid_state); + dev_priv->lid_last_state = *lid_state;
lid_timer_schedule: spin_lock_irqsave(&dev_priv->lid_lock, irq_flags);
i915 expects the OpRegion to be cached (i.e. not __iomem), so explicitly map it with memremap rather than the implied cache setting of acpi_os_ioremap().
Cc: Daniel Vetter daniel.vetter@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: intel-gfx@lists.freedesktop.org Cc: David Airlie airlied@linux.ie Cc: dri-devel@lists.freedesktop.org Signed-off-by: Dan Williams dan.j.williams@intel.com --- drivers/gpu/drm/i915/i915_debugfs.c | 2 - drivers/gpu/drm/i915/i915_drv.h | 12 ++--- drivers/gpu/drm/i915/intel_bios.c | 7 +-- drivers/gpu/drm/i915/intel_opregion.c | 87 ++++++++++++++++----------------- drivers/gpu/drm/i915/intel_panel.c | 2 - 5 files changed, 52 insertions(+), 58 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 82bbe3f2a7e1..9228d6048bde 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -1831,7 +1831,7 @@ static int i915_opregion(struct seq_file *m, void *unused) goto out;
if (opregion->header) { - memcpy_fromio(data, opregion->header, OPREGION_SIZE); + memcpy(data, opregion->header, OPREGION_SIZE); seq_write(m, data, OPREGION_SIZE); }
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5f27290201e0..2efbfd53be51 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -403,14 +403,14 @@ struct opregion_swsci; struct opregion_asle;
struct intel_opregion { - struct opregion_header __iomem *header; - struct opregion_acpi __iomem *acpi; - struct opregion_swsci __iomem *swsci; + struct opregion_header *header; + struct opregion_acpi *acpi; + struct opregion_swsci *swsci; u32 swsci_gbda_sub_functions; u32 swsci_sbcb_sub_functions; - struct opregion_asle __iomem *asle; - void __iomem *vbt; - u32 __iomem *lid_state; + struct opregion_asle *asle; + void *vbt; + u32 *lid_state; struct work_struct asle_work; }; #define OPREGION_SIZE (8*1024) diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 198fc3c3291b..3e2dca4f5e6e 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -1206,11 +1206,10 @@ static const struct bdb_header *validate_vbt(const void __iomem *_base, { /* * This is the one place where we explicitly discard the address space - * (__iomem) of the BIOS/VBT. (And this will cause a sparse complaint.) - * From now on everything is based on 'base', and treated as regular - * memory. + * (__iomem) of the BIOS/VBT. From now on everything is based on + * 'base', and treated as regular memory. */ - const void *base = (const void *) _base; + const void *base = (const void __force *) _base; size_t offset = _vbt - _base; const struct vbt_header *vbt = base + offset; const struct bdb_header *bdb; diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index 481337436f72..7deed1062871 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c @@ -232,7 +232,7 @@ struct opregion_asle { static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out) { struct drm_i915_private *dev_priv = dev->dev_private; - struct opregion_swsci __iomem *swsci = dev_priv->opregion.swsci; + struct opregion_swsci *swsci = dev_priv->opregion.swsci; u32 main_function, sub_function, scic; u16 pci_swsci; u32 dslp; @@ -257,7 +257,7 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out) }
/* Driver sleep timeout in ms. */ - dslp = ioread32(&swsci->dslp); + dslp = swsci->dslp; if (!dslp) { /* The spec says 2ms should be the default, but it's too small * for some machines. */ @@ -270,7 +270,7 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out) }
/* The spec tells us to do this, but we are the only user... */ - scic = ioread32(&swsci->scic); + scic = swsci->scic; if (scic & SWSCI_SCIC_INDICATOR) { DRM_DEBUG_DRIVER("SWSCI request already in progress\n"); return -EBUSY; @@ -278,8 +278,8 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out)
scic = function | SWSCI_SCIC_INDICATOR;
- iowrite32(parm, &swsci->parm); - iowrite32(scic, &swsci->scic); + swsci->parm = parm; + swsci->scic = scic;
/* Ensure SCI event is selected and event trigger is cleared. */ pci_read_config_word(dev->pdev, PCI_SWSCI, &pci_swsci); @@ -294,7 +294,7 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out) pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
/* Poll for the result. */ -#define C (((scic = ioread32(&swsci->scic)) & SWSCI_SCIC_INDICATOR) == 0) +#define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0) if (wait_for(C, dslp)) { DRM_DEBUG_DRIVER("SWSCI request timed out\n"); return -ETIMEDOUT; @@ -310,7 +310,7 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out) }
if (parm_out) - *parm_out = ioread32(&swsci->parm); + *parm_out = swsci->parm;
return 0;
@@ -400,7 +400,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) { struct drm_i915_private *dev_priv = dev->dev_private; struct intel_connector *intel_connector; - struct opregion_asle __iomem *asle = dev_priv->opregion.asle; + struct opregion_asle *asle = dev_priv->opregion.asle;
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
@@ -425,7 +425,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp); list_for_each_entry(intel_connector, &dev->mode_config.connector_list, base.head) intel_panel_set_backlight_acpi(intel_connector, bclp, 255); - iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv); + asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID;
drm_modeset_unlock(&dev->mode_config.connection_mutex);
@@ -512,14 +512,14 @@ static void asle_work(struct work_struct *work) struct drm_i915_private *dev_priv = container_of(opregion, struct drm_i915_private, opregion); struct drm_device *dev = dev_priv->dev; - struct opregion_asle __iomem *asle = dev_priv->opregion.asle; + struct opregion_asle *asle = dev_priv->opregion.asle; u32 aslc_stat = 0; u32 aslc_req;
if (!asle) return;
- aslc_req = ioread32(&asle->aslc); + aslc_req = asle->aslc;
if (!(aslc_req & ASLC_REQ_MSK)) { DRM_DEBUG_DRIVER("No request on ASLC interrupt 0x%08x\n", @@ -528,34 +528,34 @@ static void asle_work(struct work_struct *work) }
if (aslc_req & ASLC_SET_ALS_ILLUM) - aslc_stat |= asle_set_als_illum(dev, ioread32(&asle->alsi)); + aslc_stat |= asle_set_als_illum(dev, asle->alsi);
if (aslc_req & ASLC_SET_BACKLIGHT) - aslc_stat |= asle_set_backlight(dev, ioread32(&asle->bclp)); + aslc_stat |= asle_set_backlight(dev, asle->bclp);
if (aslc_req & ASLC_SET_PFIT) - aslc_stat |= asle_set_pfit(dev, ioread32(&asle->pfit)); + aslc_stat |= asle_set_pfit(dev, asle->pfit);
if (aslc_req & ASLC_SET_PWM_FREQ) - aslc_stat |= asle_set_pwm_freq(dev, ioread32(&asle->pfmb)); + aslc_stat |= asle_set_pwm_freq(dev, asle->pfmb);
if (aslc_req & ASLC_SUPPORTED_ROTATION_ANGLES) aslc_stat |= asle_set_supported_rotation_angles(dev, - ioread32(&asle->srot)); + asle->srot);
if (aslc_req & ASLC_BUTTON_ARRAY) - aslc_stat |= asle_set_button_array(dev, ioread32(&asle->iuer)); + aslc_stat |= asle_set_button_array(dev, asle->iuer);
if (aslc_req & ASLC_CONVERTIBLE_INDICATOR) - aslc_stat |= asle_set_convertible(dev, ioread32(&asle->iuer)); + aslc_stat |= asle_set_convertible(dev, asle->iuer);
if (aslc_req & ASLC_DOCKING_INDICATOR) - aslc_stat |= asle_set_docking(dev, ioread32(&asle->iuer)); + aslc_stat |= asle_set_docking(dev, asle->iuer);
if (aslc_req & ASLC_ISCT_STATE_CHANGE) aslc_stat |= asle_isct_state(dev);
- iowrite32(aslc_stat, &asle->aslc); + asle->aslc = aslc_stat; }
void intel_opregion_asle_intr(struct drm_device *dev) @@ -580,8 +580,8 @@ static int intel_opregion_video_event(struct notifier_block *nb, Linux, these are handled by the dock, button and video drivers. */
- struct opregion_acpi __iomem *acpi; struct acpi_bus_event *event = data; + struct opregion_acpi *acpi; int ret = NOTIFY_OK;
if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) @@ -592,11 +592,10 @@ static int intel_opregion_video_event(struct notifier_block *nb,
acpi = system_opregion->acpi;
- if (event->type == 0x80 && - (ioread32(&acpi->cevt) & 1) == 0) + if (event->type == 0x80 && ((acpi->cevt & 1) == 0)) ret = NOTIFY_BAD;
- iowrite32(0, &acpi->csts); + acpi->csts = 0;
return ret; } @@ -620,7 +619,6 @@ static void intel_didl_outputs(struct drm_device *dev) struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL; unsigned long long device_id; acpi_status status; - u32 temp; int i = 0;
handle = ACPI_HANDLE(&dev->pdev->dev); @@ -655,8 +653,7 @@ static void intel_didl_outputs(struct drm_device *dev) if (ACPI_SUCCESS(status)) { if (!device_id) goto blind_set; - iowrite32((u32)(device_id & 0x0f0f), - &opregion->acpi->didl[i]); + opregion->acpi->didl[i] = device_id & 0x0f0f; i++; } } @@ -664,7 +661,7 @@ static void intel_didl_outputs(struct drm_device *dev) end: /* If fewer than 8 outputs, the list must be null terminated */ if (i < 8) - iowrite32(0, &opregion->acpi->didl[i]); + opregion->acpi->didl[i] = 0; return;
blind_set: @@ -698,9 +695,7 @@ blind_set: output_type = ACPI_LVDS_OUTPUT; break; } - temp = ioread32(&opregion->acpi->didl[i]); - iowrite32(temp | (1<<31) | output_type | i, - &opregion->acpi->didl[i]); + opregion->acpi->didl[i] |= (1<<31) | output_type | i; i++; } goto end; @@ -720,8 +715,8 @@ static void intel_setup_cadls(struct drm_device *dev) * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if * there are less than eight devices. */ do { - disp_id = ioread32(&opregion->acpi->didl[i]); - iowrite32(disp_id, &opregion->acpi->cadl[i]); + disp_id = opregion->acpi->didl[i]; + opregion->acpi->cadl[i] = disp_id; } while (++i < 8 && disp_id != 0); }
@@ -740,16 +735,16 @@ void intel_opregion_init(struct drm_device *dev) /* Notify BIOS we are ready to handle ACPI video ext notifs. * Right now, all the events are handled by the ACPI video module. * We don't actually need to do anything with them. */ - iowrite32(0, &opregion->acpi->csts); - iowrite32(1, &opregion->acpi->drdy); + opregion->acpi->csts = 0; + opregion->acpi->drdy = 1;
system_opregion = opregion; register_acpi_notifier(&intel_opregion_notifier); }
if (opregion->asle) { - iowrite32(ASLE_TCHE_BLC_EN, &opregion->asle->tche); - iowrite32(ASLE_ARDY_READY, &opregion->asle->ardy); + opregion->asle->tche = ASLE_TCHE_BLC_EN; + opregion->asle->ardy = ASLE_ARDY_READY; } }
@@ -762,19 +757,19 @@ void intel_opregion_fini(struct drm_device *dev) return;
if (opregion->asle) - iowrite32(ASLE_ARDY_NOT_READY, &opregion->asle->ardy); + opregion->asle->ardy = ASLE_ARDY_NOT_READY;
cancel_work_sync(&dev_priv->opregion.asle_work);
if (opregion->acpi) { - iowrite32(0, &opregion->acpi->drdy); + opregion->acpi->drdy = 0;
system_opregion = NULL; unregister_acpi_notifier(&intel_opregion_notifier); }
/* just clear all opregion memory pointers now */ - iounmap(opregion->header); + memunmap(opregion->header); opregion->header = NULL; opregion->acpi = NULL; opregion->swsci = NULL; @@ -847,10 +842,10 @@ int intel_opregion_setup(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; struct intel_opregion *opregion = &dev_priv->opregion; - void __iomem *base; u32 asls, mboxes; char buf[sizeof(OPREGION_SIGNATURE)]; int err = 0; + void *base;
pci_read_config_dword(dev->pdev, PCI_ASLS, &asls); DRM_DEBUG_DRIVER("graphic opregion physical addr: 0x%x\n", asls); @@ -863,11 +858,11 @@ int intel_opregion_setup(struct drm_device *dev) INIT_WORK(&opregion->asle_work, asle_work); #endif
- base = acpi_os_ioremap(asls, OPREGION_SIZE); + base = memremap(asls, OPREGION_SIZE, MEMREMAP_WB); if (!base) return -ENOMEM;
- memcpy_fromio(buf, base, sizeof(buf)); + memcpy(buf, base, sizeof(buf));
if (memcmp(buf, OPREGION_SIGNATURE, 16)) { DRM_DEBUG_DRIVER("opregion signature mismatch\n"); @@ -879,7 +874,7 @@ int intel_opregion_setup(struct drm_device *dev)
opregion->lid_state = base + ACPI_CLID;
- mboxes = ioread32(&opregion->header->mboxes); + mboxes = opregion->header->mboxes; if (mboxes & MBOX_ACPI) { DRM_DEBUG_DRIVER("Public ACPI methods supported\n"); opregion->acpi = base + OPREGION_ACPI_OFFSET; @@ -894,12 +889,12 @@ int intel_opregion_setup(struct drm_device *dev) DRM_DEBUG_DRIVER("ASLE supported\n"); opregion->asle = base + OPREGION_ASLE_OFFSET;
- iowrite32(ASLE_ARDY_NOT_READY, &opregion->asle->ardy); + opregion->asle->ardy = ASLE_ARDY_NOT_READY; }
return 0;
err_out: - iounmap(base); + memunmap(base); return err; } diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 55aad2322e10..3985396e46a2 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -384,7 +384,7 @@ intel_panel_detect(struct drm_device *dev)
/* Assume that the BIOS does not lie through the OpRegion... */ if (!i915.panel_ignore_lid && dev_priv->opregion.lid_state) { - return ioread32(dev_priv->opregion.lid_state) & 0x1 ? + return *(dev_priv->opregion.lid_state) & 0x1 ? connector_status_connected : connector_status_disconnected; }
dri-devel@lists.freedesktop.org