~ubuntu-branches/ubuntu/wily/linux-ti-omap4/wily

« back to all changes in this revision

Viewing changes to ubuntu/i915/i915_gem.c

  • Committer: Package Import Robot
  • Author(s): Paolo Pisati, Paolo Pisati, Ubuntu: 3.5.0-20.31
  • Date: 2012-12-06 14:14:29 UTC
  • Revision ID: package-import@ubuntu.com-20121206141429-3f6mmypbjdmnmm2t
Tags: 3.5.0-216.23
* Release Tracking Bug
  - LP: #1087216

[ Paolo Pisati ]

* rebased on Ubuntu-3.5.0-20.31

[ Ubuntu: 3.5.0-20.31 ]

* Release Tracking Bug
  - LP: #1086759
* SAUCE: i915_hsw: Include #define I915_PARAM_HAS_WAIT_TIMEOUT
  - LP: #1085245
* SAUCE: i915_hsw: Include #define DRM_I915_GEM_CONTEXT_[CREATE,DESTROY]
  - LP: #1085245
* SAUCE: i915_hsw: drm/i915: add register read IOCTL
  - LP: #1085245
* SAUCE: i915_hsw: Include #define i915_execbuffer2_[set,get]_context_id
  - LP: #1085245
* SAUCE: i915_hsw: Include #define I915_GEM_PARAM_HAS_SEMAPHORES
  - LP: #1085245
* SAUCE: i915_hsw: Include #define I915_PARAM_HAS_SECURE_BATCHES
  - LP: #1085245
* SAUCE: i915_hsw: drm/i915: call intel_enable_gtt
  - LP: #1085245
* SAUCE: i915_hsw: drm: add helper to sort panels to the head of the
  connector list
  - LP: #1085245
* SAUCE: i915_hsw: drm: extract dp link bw helpers
  - LP: #1085245
* SAUCE: i915_hsw: drm: extract drm_dp_max_lane_count helper
  - LP: #1085245
* SAUCE: i915_hsw: drm: dp helper: extract drm_dp_channel_eq_ok
  - LP: #1085245
* SAUCE: i915_hsw: drm: extract helpers to compute new training values
  from sink request
  - LP: #1085245
* SAUCE: i915_hsw: drm: dp helper: extract drm_dp_clock_recovery_ok
  - LP: #1085245
* SAUCE: i915_hsw: Include #define I915_PARAM_HAS_PRIME_VMAP_FLUSH
  - LP: #1085245
* SAUCE: i915_hsw: Provide an ubuntu/i915 driver for Haswell graphics
  - LP: #1085245
* SAUCE: i915_hsw: Revert "drm: Make the .mode_fixup() operations mode
  argument a const pointer" for ubuntu/i915 driver
  - LP: #1085245
* SAUCE: i915_hsw: Rename ubuntu/i915 driver i915_hsw
  - LP: #1085245
* SAUCE: i915_hsw: Only support Haswell with ubuntu/i915 driver
  - LP: #1085245
* SAUCE: i915_hsw: Include #define DRM_I915_GEM_WAIT
  - LP: #1085245
* SAUCE: i915_hsw: drm: extract dp link train delay functions from radeon
  - LP: #1085245
* SAUCE: i915_hsw: drm/dp: Update DPCD defines
  - LP: #1085245
* SAUCE: i915_hsw: Update intel_ips.h file location
  - LP: #1085245
* SAUCE: i915_hsw: Provide updated drm_mm.h and drm_mm.c for ubuntu/i915
  - LP: #1085245
* SAUCE: i915_hsw: drm/i915: Replace the array of pages with a
  scatterlist
  - LP: #1085245
* SAUCE: i915_hsw: drm/i915: Replace the array of pages with a
  scatterlist
  - LP: #1085245
* SAUCE: i915_hsw: drm/i915: Stop using AGP layer for GEN6+
  - LP: #1085245
* SAUCE: i915_hsw: Add i915_hsw_gpu_*() calls for ubuntu/i915
  - LP: #1085245
* i915_hsw: [Config] Enable CONFIG_DRM_I915_HSW=m
  - LP: #1085245
* SAUCE: drm/i915: fix hsw_fdi_link_train "retry" code
  - LP: #1085245
* SAUCE: drm/i915: reject modes the LPT FDI receiver can't handle
  - LP: #1085245
* SAUCE: drm/i915: add support for mPHY destination on intel_sbi_{read,
  write}
  - LP: #1085245
* SAUCE: drm/i915: add lpt_init_pch_refclk
  - LP: #1085245
* SAUCE: drm/i915: set the LPT FDI RX polarity reversal bit when needed
  - LP: #1085245
* Revert "SAUCE: SECCOMP: audit: always report seccomp violations"
  - LP: #1079469
* Revert "cgroup: Drop task_lock(parent) on cgroup_fork()"
  - LP: #1084539
* Revert "cgroup: Remove task_lock() from cgroup_post_fork()"
  - LP: #1084539
* Revert "x86/mm: Fix the size calculation of mapping tables"
  - LP: #1084539
* Revert "SUNRPC: Ensure we close the socket on EPIPE errors too..."
  - LP: #1084539
* Revert "ath9k_hw: Updated AR9003 tx gain table for 5GHz"
  - LP: #1084539
* Revert "sched: Add missing call to calc_load_exit_idle()"
  - LP: #1084539
* net: fix secpath kmemleak
  - LP: #1065434
* seccomp: forcing auditing of kill condition
  - LP: #1079469
* e1000e: add device IDs for i218
  - LP: #1081796
* bonding: Bonding driver does not consider the gso_max_size/gso_max_segs
  setting of slave devices.
  - LP: #1078184
* mm/hotplug: correctly add new zone to all other nodes' zone lists
  - LP: #1079860
  - CVE-2012-5517
* xen: enable platform-pci only in a Xen guest
  - LP: #1081054
* udf: fix retun value on error path in udf_load_logicalvol
  - LP: #1084539
* usb: gadget: at91_udc: fix dt support
  - LP: #1084539
* netfilter: nf_nat_sip: fix incorrect handling of EBUSY for RTCP
  expectation
  - LP: #1084539
* netfilter: nf_nat_sip: fix via header translation with multiple
  parameters
  - LP: #1084539
* netfilter: nf_ct_expect: fix possible access to uninitialized timer
  - LP: #1084539
* netfilter: xt_limit: have r->cost != 0 case work
  - LP: #1084539
* netfilter: nf_conntrack: fix racy timer handling with reliable events
  - LP: #1084539
* netfilter: nfnetlink_log: fix NLA_PUT macro removal bug
  - LP: #1084539
* MIPS: ath79: Fix CPU/DDR frequency calculation for SRIF PLLs
  - LP: #1084539
* jbd: Fix assertion failure in commit code due to lacking transaction
  credits
  - LP: #1084539
* nfsd4: fix nfs4 stateid leak
  - LP: #1084539
* NFSD: pass null terminated buf to kstrtouint()
  - LP: #1084539
* mfd: 88pm860x: Move _IO resources out of ioport_ioresource
  - LP: #1084539
* target: support zero allocation length in INQUIRY
  - LP: #1084539
* target: fix truncation of mode data, support zero allocation length
  - LP: #1084539
* target: fix return code in target_core_init_configfs error path
  - LP: #1084539
* powerpc/eeh: Lock module while handling EEH event
  - LP: #1084539
* SUNRPC: Ensure that the TCP socket is closed when in CLOSE_WAIT
  - LP: #1084539
* ext4: remove erroneous ext4_superblock_csum_set() in update_backups()
  - LP: #1084539
* block: remove the duplicated setting for congestion_threshold
  - LP: #1084539
* block: lift the initial queue bypass mode on blk_register_queue()
  instead of blk_init_allocated_queue()
  - LP: #1084539
* block: fix request_queue->flags initialization
  - LP: #1084539
* viafb: don't touch clock state on OLPC XO-1.5
  - LP: #1084539
* qla2xxx: Fix endianness of task management response code
  - LP: #1084539
* iscsi-target: Correctly set 0xffffffff field within ISCSI_OP_REJECT PDU
  - LP: #1084539
* drm/i915: use adjusted_mode instead of mode for checking the 6bpc force
  flag
  - LP: #1084539
* kbuild: Do not package /boot and /lib in make tar-pkg
  - LP: #1084539
* module: taint kernel when lve module is loaded
  - LP: #1084539
* mtd: nand: allow NAND_NO_SUBPAGE_WRITE to be set from driver
  - LP: #1084539
* nfsd4: don't pin clientids to pseudoflavors
  - LP: #1084539
* lockd: use rpc client's cl_nodename for id encoding
  - LP: #1084539
* pnfsblock: fix partial page buffer wirte
  - LP: #1084539
* pnfsblock: fix non-aligned DIO read
  - LP: #1084539
* pnfsblock: fix non-aligned DIO write
  - LP: #1084539
* target/file: Re-enable optional fd_buffered_io=1 operation
  - LP: #1084539
* iscsi-target: Add explicit set of cache_dynamic_acls=1 for TPG
  demo-mode
  - LP: #1084539
* iscsit: remove incorrect unlock in iscsit_build_sendtargets_resp
  - LP: #1084539
* iscsi-target: Bump defaults for nopin_timeout + nopin_response_timeout
  values
  - LP: #1084539
* drivers/dma/dmaengine.c: lower the priority of 'failed to get' dma
  channel message
  - LP: #1084539
* ath9k: use ieee80211_free_txskb
  - LP: #1084539
* ALSA: hda - Fix hang caused by race during suspend.
  - LP: #1084539
* ACPI: EC: Make the GPE storm threshold a module parameter
  - LP: #1084539
* ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop
  - LP: #1084539
* mmc: sdhci-s3c: fix the wrong number of max bus clocks
  - LP: #1084539
* mac80211: use ieee80211_free_txskb to fix possible skb leaks
  - LP: #1084539
* ARM: OMAP: counter: add locking to read_persistent_clock
  - LP: #1084539
* ARM: vfp: fix saving d16-d31 vfp registers on v6+ kernels
  - LP: #1084539
* scsi_debug: Fix off-by-one bug when unmapping region
  - LP: #1084539
* storvsc: Account for in-transit packets in the RESET path
  - LP: #1084539
* firewire: cdev: fix user memory corruption (i386 userland on amd64
  kernel)
  - LP: #1084539
* timers: Fix endless looping between cascade() and internal_add_timer()
  - LP: #1084539
* timekeeping: Cast raw_interval to u64 to avoid shift overflow
  - LP: #1084539
* video/udlfb: fix line counting in fb_write
  - LP: #1084539
* tmpfs,ceph,gfs2,isofs,reiserfs,xfs: fix fh_len checking
  - LP: #1084539
* ALSA: hda - Add missing hda_gen_spec to struct via_spec
  - LP: #1084539
* ALSA: hda - Fix memory leaks at error path in patch_cirrus.c
  - LP: #1084539
* autofs4 - fix reset pending flag on mount fail
  - LP: #1084539
* pktgen: fix crash when generating IPv6 packets
  - LP: #1084539
* md/raid10: use correct limit variable
  - LP: #1084539
* mips,kgdb: fix recursive page fault with CONFIG_KPROBES
  - LP: #1084539
* kdb,vt_console: Fix missed data due to pager overruns
  - LP: #1084539
* xen/bootup: allow read_tscp call for Xen PV guests.
  - LP: #1084539
* xen/bootup: allow {read|write}_cr8 pvops call.
  - LP: #1084539
* libceph: eliminate connection state "DEAD"
  - LP: #1084539
* libceph: kill bad_proto ceph connection op
  - LP: #1084539
* libceph: rename socket callbacks
  - LP: #1084539
* libceph: rename kvec_reset and kvec_add functions
  - LP: #1084539
* libceph: embed ceph messenger structure in ceph_client
  - LP: #1084539
* libceph: start separating connection flags from state
  - LP: #1084539
* libceph: start tracking connection socket state
  - LP: #1084539
* libceph: provide osd number when creating osd
  - LP: #1084539
* libceph: set CLOSED state bit in con_init
  - LP: #1084539
* libceph: embed ceph connection structure in mon_client
  - LP: #1084539
* libceph: drop connection refcounting for mon_client
  - LP: #1084539
* libceph: init monitor connection when opening
  - LP: #1084539
* libceph: fully initialize connection in con_init()
  - LP: #1084539
* libceph: tweak ceph_alloc_msg()
  - LP: #1084539
* libceph: have messages point to their connection
  - LP: #1084539
* libceph: have messages take a connection reference
  - LP: #1084539
* libceph: make ceph_con_revoke() a msg operation
  - LP: #1084539
* libceph: make ceph_con_revoke_message() a msg op
  - LP: #1084539
* libceph: fix overflow in __decode_pool_names()
  - LP: #1084539
* libceph: fix overflow in osdmap_decode()
  - LP: #1084539
* libceph: fix overflow in osdmap_apply_incremental()
  - LP: #1084539
* libceph: transition socket state prior to actual connect
  - LP: #1084539
* libceph: fix NULL dereference in reset_connection()
  - LP: #1084539
* libceph: use con get/put methods
  - LP: #1084539
* libceph: drop ceph_con_get/put helpers and nref member
  - LP: #1084539
* libceph: encapsulate out message data setup
  - LP: #1084539
* libceph: encapsulate advancing msg page
  - LP: #1084539
* libceph: don't mark footer complete before it is
  - LP: #1084539
* libceph: move init_bio_*() functions up
  - LP: #1084539
* libceph: move init of bio_iter
  - LP: #1084539
* libceph: don't use bio_iter as a flag
  - LP: #1084539
* libceph: SOCK_CLOSED is a flag, not a state
  - LP: #1084539
* libceph: don't change socket state on sock event
  - LP: #1084539
* libceph: just set SOCK_CLOSED when state changes
  - LP: #1084539
* libceph: don't touch con state in con_close_socket()
  - LP: #1084539
* libceph: clear CONNECTING in ceph_con_close()
  - LP: #1084539
* libceph: clear NEGOTIATING when done
  - LP: #1084539
* libceph: define and use an explicit CONNECTED state
  - LP: #1084539
* libceph: separate banner and connect writes
  - LP: #1084539
* libceph: distinguish two phases of connect sequence
  - LP: #1084539
* libceph: small changes to messenger.c
  - LP: #1084539
* libceph: add some fine ASCII art
  - LP: #1084539
* libceph: set peer name on con_open, not init
  - LP: #1084539
* libceph: initialize mon_client con only once
  - LP: #1084539
* libceph: allow sock transition from CONNECTING to CLOSED
  - LP: #1084539
* libceph: initialize msgpool message types
  - LP: #1084539
* libceph: prevent the race of incoming work during teardown
  - LP: #1084539
* libceph: report socket read/write error message
  - LP: #1084539
* libceph: fix mutex coverage for ceph_con_close
  - LP: #1084539
* libceph: resubmit linger ops when pg mapping changes
  - LP: #1084539
* libceph: (re)initialize bio_iter on start of message receive
  - LP: #1084539
* libceph: protect ceph_con_open() with mutex
  - LP: #1084539
* libceph: reset connection retry on successfully negotiation
  - LP: #1084539
* libceph: fix fault locking; close socket on lossy fault
  - LP: #1084539
* libceph: move msgr clear_standby under con mutex protection
  - LP: #1084539
* libceph: move ceph_con_send() closed check under the con mutex
  - LP: #1084539
* libceph: drop gratuitous socket close calls in con_work
  - LP: #1084539
* libceph: close socket directly from ceph_con_close()
  - LP: #1084539
* libceph: drop unnecessary CLOSED check in socket state change callback
  - LP: #1084539
* libceph: replace connection state bits with states
  - LP: #1084539
* libceph: clean up con flags
  - LP: #1084539
* libceph: clear all flags on con_close
  - LP: #1084539
* libceph: fix handling of immediate socket connect failure
  - LP: #1084539
* libceph: revoke mon_client messages on session restart
  - LP: #1084539
* libceph: verify state after retaking con lock after dispatch
  - LP: #1084539
* libceph: avoid dropping con mutex before fault
  - LP: #1084539
* libceph: change ceph_con_in_msg_alloc convention to be less weird
  - LP: #1084539
* libceph: recheck con state after allocating incoming message
  - LP: #1084539
* libceph: fix crypto key null deref, memory leak
  - LP: #1084539
* libceph: delay debugfs initialization until we learn global_id
  - LP: #1084539
* libceph: avoid truncation due to racing banners
  - LP: #1084539
* libceph: only kunmap kmapped pages
  - LP: #1084539
* rbd: reset BACKOFF if unable to re-queue
  - LP: #1084539
* libceph: avoid NULL kref_put when osd reset races with alloc_msg
  - LP: #1084539
* ceph: fix dentry reference leak in encode_fh()
  - LP: #1084539
* ceph: Fix oops when handling mdsmap that decreases max_mds
  - LP: #1084539
* libceph: check for invalid mapping
  - LP: #1084539
* ceph: avoid 32-bit page index overflow
  - LP: #1084539
* ASoC: wm2200: Use rev A register patches on rev B
  - LP: #1084539
* ASoC: wm2200: Fix non-inverted OUT2 mute control
  - LP: #1084539
* drm/i915: remove useless BUG_ON which caused a regression in 3.5.
  - LP: #1084539
* USB: Enable LPM after a failed probe.
  - LP: #1084539
* usb: Don't enable LPM if the exit latency is zero.
  - LP: #1084539
* usb: Send Set SEL before enabling parent U1/U2 timeout.
  - LP: #1084539
* ASoC: fsi: don't reschedule DMA from an atomic context
  - LP: #1084539
* drm/i915: Set guardband clipping workaround bit in the right register.
  - LP: #1084539
* pcmcia: sharpsl: don't discard sharpsl_pcmcia_ops
  - LP: #1084539
* hwmon: (coretemp) Add support for Atom CE4110/4150/4170
  - LP: #1084539
* ALSA: hda - Fix registration race of VGA switcheroo
  - LP: #1084539
* usb: dwc3: gadget: fix 'endpoint always busy' bug
  - LP: #1084539
* usb: musb: am35xx: drop spurious unplugging a device
  - LP: #1084539
* drm/radeon: Don't destroy I2C Bus Rec in radeon_ext_tmds_enc_destroy().
  - LP: #1084539
* ALSA: hda - Always check array bounds in alc_get_line_out_pfx
  - LP: #1084539
* NLM: nlm_lookup_file() may return NLMv4-specific error codes
  - LP: #1084539
* x86: Exclude E820_RESERVED regions and memory holes above 4 GB from
  direct mapping.
  - LP: #1084539
* SUNRPC: Prevent kernel stack corruption on long values of flush
  - LP: #1084539
* USB: cdc-acm: fix pipe type of write endpoint
  - LP: #1084539
* usb: acm: fix the computation of the number of data bits
  - LP: #1084539
* usb: host: xhci: New system added for Compliance Mode Patch on
  SN65LVPE502CP
  - LP: #1084539
* USB: option: blacklist net interface on ZTE devices
  - LP: #1084539
* USB: option: add more ZTE devices
  - LP: #1084539
* ext4: race-condition protection for
  ext4_convert_unwritten_extents_endio
  - LP: #1084539
* ext4: fix metadata checksum calculation for the superblock
  - LP: #1084539
* nohz: Fix idle ticks in cpu summary line of /proc/stat
  - LP: #1084539
* ring-buffer: Check for uninitialized cpu buffer before resizing
  - LP: #1084539
* Bluetooth: SMP: Fix setting unknown auth_req bits
  - LP: #1084539
* oprofile, x86: Fix wrapping bug in op_x86_get_ctrl()
  - LP: #1084539
* cfg80211/mac80211: avoid state mishmash on deauth
  - LP: #1084539
* mac80211: check if key has TKIP type before updating IV
  - LP: #1084539
* mac80211: use ieee80211_free_txskb in a few more places
  - LP: #1084539
* bcma: fix unregistration of cores
  - LP: #1084539
* net/wireless: ipw2200: Fix panic occurring in
  ipw_handle_promiscuous_tx()
  - LP: #1084539
* iwlwifi: fix 6000 series channel switch command
  - LP: #1084539
* cgroup: notify_on_release may not be triggered in some cases
  - LP: #1084539
* dt: Document: correct tegra20/30 pinctrl slew-rate name
  - LP: #1084539
* pinctrl: tegra: set low power mode bank width to 2
  - LP: #1084539
* pinctrl: tegra: correct bank for pingroup and drv pingroup
  - LP: #1084539
* s390: fix linker script for 31 bit builds
  - LP: #1084539
* pinctrl: remove mutex lock in groups show
  - LP: #1084539
* xen/x86: don't corrupt %eip when returning from a signal handler
  - LP: #1084539
* ALSA: hda - Fix silent headphone output from Toshiba P200
  - LP: #1084539
* ext4: Checksum the block bitmap properly with bigalloc enabled
  - LP: #1084539
* ARM: 7559/1: smp: switch away from the idmap before updating
  init_mm.mm_count
  - LP: #1084539
* usb hub: send clear_tt_buffer_complete events when canceling TT clear
  work
  - LP: #1084539
* staging: comedi: amplc_pc236: fix invalid register access during detach
  - LP: #1084539
* Staging: android: binder: Fix memory leak on thread/process exit
  - LP: #1084539
* Staging: android: binder: Allow using highmem for binder buffers
  - LP: #1084539
* ext4: Avoid underflow in ext4_trim_fs()
  - LP: #1084539
* cpufreq / powernow-k8: Remove usage of smp_processor_id() in
  preemptible code
  - LP: #1084539
* extcon: Unregister compat class at module unload to fix oops
  - LP: #1084539
* extcon: unregister compat link on cleanup
  - LP: #1084539
* pinctrl: fix missing unlock on error in pinctrl_groups_show()
  - LP: #1084539
* arch/tile: avoid generating .eh_frame information in modules
  - LP: #1084539
* drm/radeon: add some new SI PCI ids
  - LP: #1084539
* drm/radeon: add error output if VM CS fails on cayman
  - LP: #1084539
* xhci: endianness xhci_calculate_intel_u2_timeout
  - LP: #1084539
* xhci: fix integer overflow
  - LP: #1084539
* dmaengine: imx-dma: fix missing unlock on error in imxdma_xfer_desc()
  - LP: #1084539
* x86-64: Fix page table accounting
  - LP: #1084539
* dmaengine: sirf: fix a typo in dma_prep_interleaved
  - LP: #1084539
* dmaengine: sirf: fix a typo in moving running dma_desc to active queue
  - LP: #1084539
* amd64_edac:__amd64_set_scrub_rate(): avoid overindexing scrubrates[]
  - LP: #1084539
* SUNRPC: Clear the connect flag when socket state is TCP_CLOSE_WAIT
  - LP: #1084539
* SUNRPC: Prevent races in xs_abort_connection()
  - LP: #1084539
* SUNRPC: Get rid of the xs_error_report socket callback
  - LP: #1084539
* iommu/tegra: smmu: Fix deadly typo
  - LP: #1084539
* ARM: at91/tc: fix typo in the DT document
  - LP: #1084539
* ARM: at91: at91sam9g10: fix SOC type detection
  - LP: #1084539
* ARM: at91/i2c: change id to let i2c-gpio work
  - LP: #1084539
* b43: Fix oops on unload when firmware not found
  - LP: #1084539
* USB: serial: Fix memory leak in sierra_release()
  - LP: #1084539
* x86, mm: Trim memory in memblock to be page aligned
  - LP: #1084539
* x86, mm: Use memblock memory loop instead of e820_RAM
  - LP: #1084539
* usb-storage: add unusual_devs entry for Casio EX-N1 digital camera
  - LP: #1084539
* Drivers: hv: Cleanup error handling in vmbus_open()
  - LP: #1084539
* sysfs: sysfs_pathname/sysfs_add_one: Use strlcat() instead of strcat()
  - LP: #1084539
* vhost: fix mergeable bufs on BE hosts
  - LP: #1084539
* USB: metro-usb: fix io after disconnect
  - LP: #1084539
* USB: whiteheat: fix memory leak in error path
  - LP: #1084539
* USB: quatech2: fix memory leak in error path
  - LP: #1084539
* USB: quatech2: fix io after disconnect
  - LP: #1084539
* USB: opticon: fix DMA from stack
  - LP: #1084539
* USB: opticon: fix memory leak in error path
  - LP: #1084539
* USB: mct_u232: fix broken close
  - LP: #1084539
* USB: sierra: fix memory leak in attach error path
  - LP: #1084539
* USB: sierra: fix memory leak in probe error path
  - LP: #1084539
* USB: mos7840: fix urb leak at release
  - LP: #1084539
* USB: mos7840: fix port-device leak in error path
  - LP: #1084539
* USB: mos7840: remove NULL-urb submission
  - LP: #1084539
* USB: mos7840: remove invalid disconnect handling
  - LP: #1084539
* ehci: fix Lucid nohandoff pci quirk to be more generic with BIOS
  versions
  - LP: #1084539
* ehci: Add yet-another Lucid nohandoff pci quirk
  - LP: #1084539
* xhci: Fix potential NULL ptr deref in command cancellation.
  - LP: #1084539
* freezer: exec should clear PF_NOFREEZE along with PF_KTHREAD
  - LP: #1084539
* mm: fix XFS oops due to dirty pages without buffers on s390
  - LP: #1084539
* genalloc: stop crashing the system when destroying a pool
  - LP: #1084539
* drivers/rtc/rtc-imxdi.c: add missing spin lock initialization
  - LP: #1084539
* gen_init_cpio: avoid stack overflow when expanding
  - LP: #1084539
* fs/compat_ioctl.c: VIDEO_SET_SPU_PALETTE missing error check
  - LP: #1084539
* qmi_wwan/cdc_ether: move Novatel 551 and E362 to qmi_wwan
  - LP: #1084539
* efi: Defer freeing boot services memory until after ACPI init
  - LP: #1084539
* x86: efi: Turn off efi_enabled after setup on mixed fw/kernel
  - LP: #1082059, #1084539
* target: Re-add explict zeroing of INQUIRY bounce buffer memory
  - LP: #1084539
* ARM: 7566/1: vfp: fix save and restore when running on pre-VFPv3 and
  CONFIG_VFPv3 set
  - LP: #1084539
* libceph: drop declaration of ceph_con_get()
  - LP: #1084539
* x86, mm: Find_early_table_space based on ranges that are actually being
  mapped
  - LP: #1084539
* x86, mm: Undo incorrect revert in arch/x86/mm/init.c
  - LP: #1084539
* Linux 3.5.7.1
  - LP: #1084539
* ALSA: hda - Cirrus: Correctly clear line_out_pins when moving to
  speaker
  - LP: #1076840
* Bluetooth: ath3k: Add support for VAIO VPCEH [0489:e027]
  - LP: #898826
* i915_hsw: drm/i915: Reserve ioctl numbers for set/get_caching
  - LP: #1085245
* i915_hsw: drm: Export drm_probe_ddc()
  - LP: #1085245
* i915_hsw: drm: remove the raw_edid field from struct drm_display_info
  - LP: #1085245
* i915_hsw: drm/i915: fix hsw uncached pte
  - LP: #1085245
* i915_hsw: drm/fb-helper: delay hotplug handling when partially bound
  - LP: #1085245
* i915_hsw: drm/fb helper: don't call drm_crtc_helper_set_config
  - LP: #1085245
* i915_hsw: drm/fb-helper: don't clobber output routing in setup_crtcs
  - LP: #1085245
* i915_hsw: drm/fb helper: don't call drm_helper_connector_dpms directly
  - LP: #1085245
* i915_hsw: drm/edid: Fix potential memory leak in edid_load()
  - LP: #1085245

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright © 2008 Intel Corporation
 
3
 *
 
4
 * Permission is hereby granted, free of charge, to any person obtaining a
 
5
 * copy of this software and associated documentation files (the "Software"),
 
6
 * to deal in the Software without restriction, including without limitation
 
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
8
 * and/or sell copies of the Software, and to permit persons to whom the
 
9
 * Software is furnished to do so, subject to the following conditions:
 
10
 *
 
11
 * The above copyright notice and this permission notice (including the next
 
12
 * paragraph) shall be included in all copies or substantial portions of the
 
13
 * Software.
 
14
 *
 
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 
21
 * IN THE SOFTWARE.
 
22
 *
 
23
 * Authors:
 
24
 *    Eric Anholt <eric@anholt.net>
 
25
 *
 
26
 */
 
27
 
 
28
#include "drmP.h"
 
29
#include "drm.h"
 
30
#include "i915_drm.h"
 
31
#include "i915_drv.h"
 
32
#include "i915_trace.h"
 
33
#include "intel_drv.h"
 
34
#include <linux/shmem_fs.h>
 
35
#include <linux/slab.h>
 
36
#include <linux/swap.h>
 
37
#include <linux/pci.h>
 
38
#include <linux/dma-buf.h>
 
39
 
 
40
static void i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj);
 
41
static void i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj);
 
42
static __must_check int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
 
43
                                                    unsigned alignment,
 
44
                                                    bool map_and_fenceable,
 
45
                                                    bool nonblocking);
 
46
static int i915_gem_phys_pwrite(struct drm_device *dev,
 
47
                                struct drm_i915_gem_object *obj,
 
48
                                struct drm_i915_gem_pwrite *args,
 
49
                                struct drm_file *file);
 
50
 
 
51
static void i915_gem_write_fence(struct drm_device *dev, int reg,
 
52
                                 struct drm_i915_gem_object *obj);
 
53
static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj,
 
54
                                         struct drm_i915_fence_reg *fence,
 
55
                                         bool enable);
 
56
 
 
57
static int i915_gem_inactive_shrink(struct shrinker *shrinker,
 
58
                                    struct shrink_control *sc);
 
59
static long i915_gem_purge(struct drm_i915_private *dev_priv, long target);
 
60
static void i915_gem_shrink_all(struct drm_i915_private *dev_priv);
 
61
static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
 
62
 
 
63
static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj)
 
64
{
 
65
        if (obj->tiling_mode)
 
66
                i915_gem_release_mmap(obj);
 
67
 
 
68
        /* As we do not have an associated fence register, we will force
 
69
         * a tiling change if we ever need to acquire one.
 
70
         */
 
71
        obj->fence_dirty = false;
 
72
        obj->fence_reg = I915_FENCE_REG_NONE;
 
73
}
 
74
 
 
75
/* some bookkeeping */
 
76
static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv,
 
77
                                  size_t size)
 
78
{
 
79
        dev_priv->mm.object_count++;
 
80
        dev_priv->mm.object_memory += size;
 
81
}
 
82
 
 
83
static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv,
 
84
                                     size_t size)
 
85
{
 
86
        dev_priv->mm.object_count--;
 
87
        dev_priv->mm.object_memory -= size;
 
88
}
 
89
 
 
90
static int
 
91
i915_gem_wait_for_error(struct drm_device *dev)
 
92
{
 
93
        struct drm_i915_private *dev_priv = dev->dev_private;
 
94
        struct completion *x = &dev_priv->error_completion;
 
95
        unsigned long flags;
 
96
        int ret;
 
97
 
 
98
        if (!atomic_read(&dev_priv->mm.wedged))
 
99
                return 0;
 
100
 
 
101
        /*
 
102
         * Only wait 10 seconds for the gpu reset to complete to avoid hanging
 
103
         * userspace. If it takes that long something really bad is going on and
 
104
         * we should simply try to bail out and fail as gracefully as possible.
 
105
         */
 
106
        ret = wait_for_completion_interruptible_timeout(x, 10*HZ);
 
107
        if (ret == 0) {
 
108
                DRM_ERROR("Timed out waiting for the gpu reset to complete\n");
 
109
                return -EIO;
 
110
        } else if (ret < 0) {
 
111
                return ret;
 
112
        }
 
113
 
 
114
        if (atomic_read(&dev_priv->mm.wedged)) {
 
115
                /* GPU is hung, bump the completion count to account for
 
116
                 * the token we just consumed so that we never hit zero and
 
117
                 * end up waiting upon a subsequent completion event that
 
118
                 * will never happen.
 
119
                 */
 
120
                spin_lock_irqsave(&x->wait.lock, flags);
 
121
                x->done++;
 
122
                spin_unlock_irqrestore(&x->wait.lock, flags);
 
123
        }
 
124
        return 0;
 
125
}
 
126
 
 
127
int i915_mutex_lock_interruptible(struct drm_device *dev)
 
128
{
 
129
        int ret;
 
130
 
 
131
        ret = i915_gem_wait_for_error(dev);
 
132
        if (ret)
 
133
                return ret;
 
134
 
 
135
        ret = mutex_lock_interruptible(&dev->struct_mutex);
 
136
        if (ret)
 
137
                return ret;
 
138
 
 
139
        WARN_ON(i915_verify_lists(dev));
 
140
        return 0;
 
141
}
 
142
 
 
143
static inline bool
 
144
i915_gem_object_is_inactive(struct drm_i915_gem_object *obj)
 
145
{
 
146
        return obj->gtt_space && !obj->active;
 
147
}
 
148
 
 
149
int
 
150
i915_gem_init_ioctl(struct drm_device *dev, void *data,
 
151
                    struct drm_file *file)
 
152
{
 
153
        struct drm_i915_gem_init *args = data;
 
154
 
 
155
        if (drm_core_check_feature(dev, DRIVER_MODESET))
 
156
                return -ENODEV;
 
157
 
 
158
        if (args->gtt_start >= args->gtt_end ||
 
159
            (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1))
 
160
                return -EINVAL;
 
161
 
 
162
        /* GEM with user mode setting was never supported on ilk and later. */
 
163
        if (INTEL_INFO(dev)->gen >= 5)
 
164
                return -ENODEV;
 
165
 
 
166
        mutex_lock(&dev->struct_mutex);
 
167
        i915_gem_init_global_gtt(dev, args->gtt_start,
 
168
                                 args->gtt_end, args->gtt_end);
 
169
        mutex_unlock(&dev->struct_mutex);
 
170
 
 
171
        return 0;
 
172
}
 
173
 
 
174
int
 
175
i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
 
176
                            struct drm_file *file)
 
177
{
 
178
        struct drm_i915_private *dev_priv = dev->dev_private;
 
179
        struct drm_i915_gem_get_aperture *args = data;
 
180
        struct drm_i915_gem_object *obj;
 
181
        size_t pinned;
 
182
 
 
183
        pinned = 0;
 
184
        mutex_lock(&dev->struct_mutex);
 
185
        list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list)
 
186
                if (obj->pin_count)
 
187
                        pinned += obj->gtt_space->size;
 
188
        mutex_unlock(&dev->struct_mutex);
 
189
 
 
190
        args->aper_size = dev_priv->mm.gtt_total;
 
191
        args->aper_available_size = args->aper_size - pinned;
 
192
 
 
193
        return 0;
 
194
}
 
195
 
 
196
static int
 
197
i915_gem_create(struct drm_file *file,
 
198
                struct drm_device *dev,
 
199
                uint64_t size,
 
200
                uint32_t *handle_p)
 
201
{
 
202
        struct drm_i915_gem_object *obj;
 
203
        int ret;
 
204
        u32 handle;
 
205
 
 
206
        size = roundup(size, PAGE_SIZE);
 
207
        if (size == 0)
 
208
                return -EINVAL;
 
209
 
 
210
        /* Allocate the new object */
 
211
        obj = i915_gem_alloc_object(dev, size);
 
212
        if (obj == NULL)
 
213
                return -ENOMEM;
 
214
 
 
215
        ret = drm_gem_handle_create(file, &obj->base, &handle);
 
216
        if (ret) {
 
217
                drm_gem_object_release(&obj->base);
 
218
                i915_gem_info_remove_obj(dev->dev_private, obj->base.size);
 
219
                kfree(obj);
 
220
                return ret;
 
221
        }
 
222
 
 
223
        /* drop reference from allocate - handle holds it now */
 
224
        drm_gem_object_unreference(&obj->base);
 
225
        trace_i915_gem_object_create(obj);
 
226
 
 
227
        *handle_p = handle;
 
228
        return 0;
 
229
}
 
230
 
 
231
int
 
232
i915_gem_dumb_create(struct drm_file *file,
 
233
                     struct drm_device *dev,
 
234
                     struct drm_mode_create_dumb *args)
 
235
{
 
236
        /* have to work out size/pitch and return them */
 
237
        args->pitch = ALIGN(args->width * ((args->bpp + 7) / 8), 64);
 
238
        args->size = args->pitch * args->height;
 
239
        return i915_gem_create(file, dev,
 
240
                               args->size, &args->handle);
 
241
}
 
242
 
 
243
int i915_gem_dumb_destroy(struct drm_file *file,
 
244
                          struct drm_device *dev,
 
245
                          uint32_t handle)
 
246
{
 
247
        return drm_gem_handle_delete(file, handle);
 
248
}
 
249
 
 
250
/**
 
251
 * Creates a new mm object and returns a handle to it.
 
252
 */
 
253
int
 
254
i915_gem_create_ioctl(struct drm_device *dev, void *data,
 
255
                      struct drm_file *file)
 
256
{
 
257
        struct drm_i915_gem_create *args = data;
 
258
 
 
259
        return i915_gem_create(file, dev,
 
260
                               args->size, &args->handle);
 
261
}
 
262
 
 
263
static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
 
264
{
 
265
        drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
 
266
 
 
267
        return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
 
268
                obj->tiling_mode != I915_TILING_NONE;
 
269
}
 
270
 
 
271
static inline int
 
272
__copy_to_user_swizzled(char __user *cpu_vaddr,
 
273
                        const char *gpu_vaddr, int gpu_offset,
 
274
                        int length)
 
275
{
 
276
        int ret, cpu_offset = 0;
 
277
 
 
278
        while (length > 0) {
 
279
                int cacheline_end = ALIGN(gpu_offset + 1, 64);
 
280
                int this_length = min(cacheline_end - gpu_offset, length);
 
281
                int swizzled_gpu_offset = gpu_offset ^ 64;
 
282
 
 
283
                ret = __copy_to_user(cpu_vaddr + cpu_offset,
 
284
                                     gpu_vaddr + swizzled_gpu_offset,
 
285
                                     this_length);
 
286
                if (ret)
 
287
                        return ret + length;
 
288
 
 
289
                cpu_offset += this_length;
 
290
                gpu_offset += this_length;
 
291
                length -= this_length;
 
292
        }
 
293
 
 
294
        return 0;
 
295
}
 
296
 
 
297
static inline int
 
298
__copy_from_user_swizzled(char *gpu_vaddr, int gpu_offset,
 
299
                          const char __user *cpu_vaddr,
 
300
                          int length)
 
301
{
 
302
        int ret, cpu_offset = 0;
 
303
 
 
304
        while (length > 0) {
 
305
                int cacheline_end = ALIGN(gpu_offset + 1, 64);
 
306
                int this_length = min(cacheline_end - gpu_offset, length);
 
307
                int swizzled_gpu_offset = gpu_offset ^ 64;
 
308
 
 
309
                ret = __copy_from_user(gpu_vaddr + swizzled_gpu_offset,
 
310
                                       cpu_vaddr + cpu_offset,
 
311
                                       this_length);
 
312
                if (ret)
 
313
                        return ret + length;
 
314
 
 
315
                cpu_offset += this_length;
 
316
                gpu_offset += this_length;
 
317
                length -= this_length;
 
318
        }
 
319
 
 
320
        return 0;
 
321
}
 
322
 
 
323
/* Per-page copy function for the shmem pread fastpath.
 
324
 * Flushes invalid cachelines before reading the target if
 
325
 * needs_clflush is set. */
 
326
static int
 
327
shmem_pread_fast(struct page *page, int shmem_page_offset, int page_length,
 
328
                 char __user *user_data,
 
329
                 bool page_do_bit17_swizzling, bool needs_clflush)
 
330
{
 
331
        char *vaddr;
 
332
        int ret;
 
333
 
 
334
        if (unlikely(page_do_bit17_swizzling))
 
335
                return -EINVAL;
 
336
 
 
337
        vaddr = kmap_atomic(page);
 
338
        if (needs_clflush)
 
339
                drm_clflush_virt_range(vaddr + shmem_page_offset,
 
340
                                       page_length);
 
341
        ret = __copy_to_user_inatomic(user_data,
 
342
                                      vaddr + shmem_page_offset,
 
343
                                      page_length);
 
344
        kunmap_atomic(vaddr);
 
345
 
 
346
        return ret ? -EFAULT : 0;
 
347
}
 
348
 
 
349
static void
 
350
shmem_clflush_swizzled_range(char *addr, unsigned long length,
 
351
                             bool swizzled)
 
352
{
 
353
        if (unlikely(swizzled)) {
 
354
                unsigned long start = (unsigned long) addr;
 
355
                unsigned long end = (unsigned long) addr + length;
 
356
 
 
357
                /* For swizzling simply ensure that we always flush both
 
358
                 * channels. Lame, but simple and it works. Swizzled
 
359
                 * pwrite/pread is far from a hotpath - current userspace
 
360
                 * doesn't use it at all. */
 
361
                start = round_down(start, 128);
 
362
                end = round_up(end, 128);
 
363
 
 
364
                drm_clflush_virt_range((void *)start, end - start);
 
365
        } else {
 
366
                drm_clflush_virt_range(addr, length);
 
367
        }
 
368
 
 
369
}
 
370
 
 
371
/* Only difference to the fast-path function is that this can handle bit17
 
372
 * and uses non-atomic copy and kmap functions. */
 
373
static int
 
374
shmem_pread_slow(struct page *page, int shmem_page_offset, int page_length,
 
375
                 char __user *user_data,
 
376
                 bool page_do_bit17_swizzling, bool needs_clflush)
 
377
{
 
378
        char *vaddr;
 
379
        int ret;
 
380
 
 
381
        vaddr = kmap(page);
 
382
        if (needs_clflush)
 
383
                shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
 
384
                                             page_length,
 
385
                                             page_do_bit17_swizzling);
 
386
 
 
387
        if (page_do_bit17_swizzling)
 
388
                ret = __copy_to_user_swizzled(user_data,
 
389
                                              vaddr, shmem_page_offset,
 
390
                                              page_length);
 
391
        else
 
392
                ret = __copy_to_user(user_data,
 
393
                                     vaddr + shmem_page_offset,
 
394
                                     page_length);
 
395
        kunmap(page);
 
396
 
 
397
        return ret ? - EFAULT : 0;
 
398
}
 
399
 
 
400
static int
 
401
i915_gem_shmem_pread(struct drm_device *dev,
 
402
                     struct drm_i915_gem_object *obj,
 
403
                     struct drm_i915_gem_pread *args,
 
404
                     struct drm_file *file)
 
405
{
 
406
        char __user *user_data;
 
407
        ssize_t remain;
 
408
        loff_t offset;
 
409
        int shmem_page_offset, page_length, ret = 0;
 
410
        int obj_do_bit17_swizzling, page_do_bit17_swizzling;
 
411
        int hit_slowpath = 0;
 
412
        int prefaulted = 0;
 
413
        int needs_clflush = 0;
 
414
        struct scatterlist *sg;
 
415
        int i;
 
416
 
 
417
        user_data = (char __user *) (uintptr_t) args->data_ptr;
 
418
        remain = args->size;
 
419
 
 
420
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
 
421
 
 
422
        if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)) {
 
423
                /* If we're not in the cpu read domain, set ourself into the gtt
 
424
                 * read domain and manually flush cachelines (if required). This
 
425
                 * optimizes for the case when the gpu will dirty the data
 
426
                 * anyway again before the next pread happens. */
 
427
                if (obj->cache_level == I915_CACHE_NONE)
 
428
                        needs_clflush = 1;
 
429
                if (obj->gtt_space) {
 
430
                        ret = i915_gem_object_set_to_gtt_domain(obj, false);
 
431
                        if (ret)
 
432
                                return ret;
 
433
                }
 
434
        }
 
435
 
 
436
        ret = i915_gem_object_get_pages(obj);
 
437
        if (ret)
 
438
                return ret;
 
439
 
 
440
        i915_gem_object_pin_pages(obj);
 
441
 
 
442
        offset = args->offset;
 
443
 
 
444
        for_each_sg(obj->pages->sgl, sg, obj->pages->nents, i) {
 
445
                struct page *page;
 
446
 
 
447
                if (i < offset >> PAGE_SHIFT)
 
448
                        continue;
 
449
 
 
450
                if (remain <= 0)
 
451
                        break;
 
452
 
 
453
                /* Operation in this page
 
454
                 *
 
455
                 * shmem_page_offset = offset within page in shmem file
 
456
                 * page_length = bytes to copy for this page
 
457
                 */
 
458
                shmem_page_offset = offset_in_page(offset);
 
459
                page_length = remain;
 
460
                if ((shmem_page_offset + page_length) > PAGE_SIZE)
 
461
                        page_length = PAGE_SIZE - shmem_page_offset;
 
462
 
 
463
                page = sg_page(sg);
 
464
                page_do_bit17_swizzling = obj_do_bit17_swizzling &&
 
465
                        (page_to_phys(page) & (1 << 17)) != 0;
 
466
 
 
467
                ret = shmem_pread_fast(page, shmem_page_offset, page_length,
 
468
                                       user_data, page_do_bit17_swizzling,
 
469
                                       needs_clflush);
 
470
                if (ret == 0)
 
471
                        goto next_page;
 
472
 
 
473
                hit_slowpath = 1;
 
474
                mutex_unlock(&dev->struct_mutex);
 
475
 
 
476
                if (!prefaulted) {
 
477
                        ret = fault_in_multipages_writeable(user_data, remain);
 
478
                        /* Userspace is tricking us, but we've already clobbered
 
479
                         * its pages with the prefault and promised to write the
 
480
                         * data up to the first fault. Hence ignore any errors
 
481
                         * and just continue. */
 
482
                        (void)ret;
 
483
                        prefaulted = 1;
 
484
                }
 
485
 
 
486
                ret = shmem_pread_slow(page, shmem_page_offset, page_length,
 
487
                                       user_data, page_do_bit17_swizzling,
 
488
                                       needs_clflush);
 
489
 
 
490
                mutex_lock(&dev->struct_mutex);
 
491
 
 
492
next_page:
 
493
                mark_page_accessed(page);
 
494
 
 
495
                if (ret)
 
496
                        goto out;
 
497
 
 
498
                remain -= page_length;
 
499
                user_data += page_length;
 
500
                offset += page_length;
 
501
        }
 
502
 
 
503
out:
 
504
        i915_gem_object_unpin_pages(obj);
 
505
 
 
506
        if (hit_slowpath) {
 
507
                /* Fixup: Kill any reinstated backing storage pages */
 
508
                if (obj->madv == __I915_MADV_PURGED)
 
509
                        i915_gem_object_truncate(obj);
 
510
        }
 
511
 
 
512
        return ret;
 
513
}
 
514
 
 
515
/**
 
516
 * Reads data from the object referenced by handle.
 
517
 *
 
518
 * On error, the contents of *data are undefined.
 
519
 */
 
520
int
 
521
i915_gem_pread_ioctl(struct drm_device *dev, void *data,
 
522
                     struct drm_file *file)
 
523
{
 
524
        struct drm_i915_gem_pread *args = data;
 
525
        struct drm_i915_gem_object *obj;
 
526
        int ret = 0;
 
527
 
 
528
        if (args->size == 0)
 
529
                return 0;
 
530
 
 
531
        if (!access_ok(VERIFY_WRITE,
 
532
                       (char __user *)(uintptr_t)args->data_ptr,
 
533
                       args->size))
 
534
                return -EFAULT;
 
535
 
 
536
        ret = i915_mutex_lock_interruptible(dev);
 
537
        if (ret)
 
538
                return ret;
 
539
 
 
540
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
541
        if (&obj->base == NULL) {
 
542
                ret = -ENOENT;
 
543
                goto unlock;
 
544
        }
 
545
 
 
546
        /* Bounds check source.  */
 
547
        if (args->offset > obj->base.size ||
 
548
            args->size > obj->base.size - args->offset) {
 
549
                ret = -EINVAL;
 
550
                goto out;
 
551
        }
 
552
 
 
553
        /* prime objects have no backing filp to GEM pread/pwrite
 
554
         * pages from.
 
555
         */
 
556
        if (!obj->base.filp) {
 
557
                ret = -EINVAL;
 
558
                goto out;
 
559
        }
 
560
 
 
561
        trace_i915_gem_object_pread(obj, args->offset, args->size);
 
562
 
 
563
        ret = i915_gem_shmem_pread(dev, obj, args, file);
 
564
 
 
565
out:
 
566
        drm_gem_object_unreference(&obj->base);
 
567
unlock:
 
568
        mutex_unlock(&dev->struct_mutex);
 
569
        return ret;
 
570
}
 
571
 
 
572
/* This is the fast write path which cannot handle
 
573
 * page faults in the source data
 
574
 */
 
575
 
 
576
static inline int
 
577
fast_user_write(struct io_mapping *mapping,
 
578
                loff_t page_base, int page_offset,
 
579
                char __user *user_data,
 
580
                int length)
 
581
{
 
582
        void __iomem *vaddr_atomic;
 
583
        void *vaddr;
 
584
        unsigned long unwritten;
 
585
 
 
586
        vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
 
587
        /* We can use the cpu mem copy function because this is X86. */
 
588
        vaddr = (void __force*)vaddr_atomic + page_offset;
 
589
        unwritten = __copy_from_user_inatomic_nocache(vaddr,
 
590
                                                      user_data, length);
 
591
        io_mapping_unmap_atomic(vaddr_atomic);
 
592
        return unwritten;
 
593
}
 
594
 
 
595
/**
 
596
 * This is the fast pwrite path, where we copy the data directly from the
 
597
 * user into the GTT, uncached.
 
598
 */
 
599
static int
 
600
i915_gem_gtt_pwrite_fast(struct drm_device *dev,
 
601
                         struct drm_i915_gem_object *obj,
 
602
                         struct drm_i915_gem_pwrite *args,
 
603
                         struct drm_file *file)
 
604
{
 
605
        drm_i915_private_t *dev_priv = dev->dev_private;
 
606
        ssize_t remain;
 
607
        loff_t offset, page_base;
 
608
        char __user *user_data;
 
609
        int page_offset, page_length, ret;
 
610
 
 
611
        ret = i915_gem_object_pin(obj, 0, true, true);
 
612
        if (ret)
 
613
                goto out;
 
614
 
 
615
        ret = i915_gem_object_set_to_gtt_domain(obj, true);
 
616
        if (ret)
 
617
                goto out_unpin;
 
618
 
 
619
        ret = i915_gem_object_put_fence(obj);
 
620
        if (ret)
 
621
                goto out_unpin;
 
622
 
 
623
        user_data = (char __user *) (uintptr_t) args->data_ptr;
 
624
        remain = args->size;
 
625
 
 
626
        offset = obj->gtt_offset + args->offset;
 
627
 
 
628
        while (remain > 0) {
 
629
                /* Operation in this page
 
630
                 *
 
631
                 * page_base = page offset within aperture
 
632
                 * page_offset = offset within page
 
633
                 * page_length = bytes to copy for this page
 
634
                 */
 
635
                page_base = offset & PAGE_MASK;
 
636
                page_offset = offset_in_page(offset);
 
637
                page_length = remain;
 
638
                if ((page_offset + remain) > PAGE_SIZE)
 
639
                        page_length = PAGE_SIZE - page_offset;
 
640
 
 
641
                /* If we get a fault while copying data, then (presumably) our
 
642
                 * source page isn't available.  Return the error and we'll
 
643
                 * retry in the slow path.
 
644
                 */
 
645
                if (fast_user_write(dev_priv->mm.gtt_mapping, page_base,
 
646
                                    page_offset, user_data, page_length)) {
 
647
                        ret = -EFAULT;
 
648
                        goto out_unpin;
 
649
                }
 
650
 
 
651
                remain -= page_length;
 
652
                user_data += page_length;
 
653
                offset += page_length;
 
654
        }
 
655
 
 
656
out_unpin:
 
657
        i915_gem_object_unpin(obj);
 
658
out:
 
659
        return ret;
 
660
}
 
661
 
 
662
/* Per-page copy function for the shmem pwrite fastpath.
 
663
 * Flushes invalid cachelines before writing to the target if
 
664
 * needs_clflush_before is set and flushes out any written cachelines after
 
665
 * writing if needs_clflush is set. */
 
666
static int
 
667
shmem_pwrite_fast(struct page *page, int shmem_page_offset, int page_length,
 
668
                  char __user *user_data,
 
669
                  bool page_do_bit17_swizzling,
 
670
                  bool needs_clflush_before,
 
671
                  bool needs_clflush_after)
 
672
{
 
673
        char *vaddr;
 
674
        int ret;
 
675
 
 
676
        if (unlikely(page_do_bit17_swizzling))
 
677
                return -EINVAL;
 
678
 
 
679
        vaddr = kmap_atomic(page);
 
680
        if (needs_clflush_before)
 
681
                drm_clflush_virt_range(vaddr + shmem_page_offset,
 
682
                                       page_length);
 
683
        ret = __copy_from_user_inatomic_nocache(vaddr + shmem_page_offset,
 
684
                                                user_data,
 
685
                                                page_length);
 
686
        if (needs_clflush_after)
 
687
                drm_clflush_virt_range(vaddr + shmem_page_offset,
 
688
                                       page_length);
 
689
        kunmap_atomic(vaddr);
 
690
 
 
691
        return ret ? -EFAULT : 0;
 
692
}
 
693
 
 
694
/* Only difference to the fast-path function is that this can handle bit17
 
695
 * and uses non-atomic copy and kmap functions. */
 
696
static int
 
697
shmem_pwrite_slow(struct page *page, int shmem_page_offset, int page_length,
 
698
                  char __user *user_data,
 
699
                  bool page_do_bit17_swizzling,
 
700
                  bool needs_clflush_before,
 
701
                  bool needs_clflush_after)
 
702
{
 
703
        char *vaddr;
 
704
        int ret;
 
705
 
 
706
        vaddr = kmap(page);
 
707
        if (unlikely(needs_clflush_before || page_do_bit17_swizzling))
 
708
                shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
 
709
                                             page_length,
 
710
                                             page_do_bit17_swizzling);
 
711
        if (page_do_bit17_swizzling)
 
712
                ret = __copy_from_user_swizzled(vaddr, shmem_page_offset,
 
713
                                                user_data,
 
714
                                                page_length);
 
715
        else
 
716
                ret = __copy_from_user(vaddr + shmem_page_offset,
 
717
                                       user_data,
 
718
                                       page_length);
 
719
        if (needs_clflush_after)
 
720
                shmem_clflush_swizzled_range(vaddr + shmem_page_offset,
 
721
                                             page_length,
 
722
                                             page_do_bit17_swizzling);
 
723
        kunmap(page);
 
724
 
 
725
        return ret ? -EFAULT : 0;
 
726
}
 
727
 
 
728
static int
 
729
i915_gem_shmem_pwrite(struct drm_device *dev,
 
730
                      struct drm_i915_gem_object *obj,
 
731
                      struct drm_i915_gem_pwrite *args,
 
732
                      struct drm_file *file)
 
733
{
 
734
        ssize_t remain;
 
735
        loff_t offset;
 
736
        char __user *user_data;
 
737
        int shmem_page_offset, page_length, ret = 0;
 
738
        int obj_do_bit17_swizzling, page_do_bit17_swizzling;
 
739
        int hit_slowpath = 0;
 
740
        int needs_clflush_after = 0;
 
741
        int needs_clflush_before = 0;
 
742
        int i;
 
743
        struct scatterlist *sg;
 
744
 
 
745
        user_data = (char __user *) (uintptr_t) args->data_ptr;
 
746
        remain = args->size;
 
747
 
 
748
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
 
749
 
 
750
        if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
 
751
                /* If we're not in the cpu write domain, set ourself into the gtt
 
752
                 * write domain and manually flush cachelines (if required). This
 
753
                 * optimizes for the case when the gpu will use the data
 
754
                 * right away and we therefore have to clflush anyway. */
 
755
                if (obj->cache_level == I915_CACHE_NONE)
 
756
                        needs_clflush_after = 1;
 
757
                if (obj->gtt_space) {
 
758
                        ret = i915_gem_object_set_to_gtt_domain(obj, true);
 
759
                        if (ret)
 
760
                                return ret;
 
761
                }
 
762
        }
 
763
        /* Same trick applies for invalidate partially written cachelines before
 
764
         * writing.  */
 
765
        if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)
 
766
            && obj->cache_level == I915_CACHE_NONE)
 
767
                needs_clflush_before = 1;
 
768
 
 
769
        ret = i915_gem_object_get_pages(obj);
 
770
        if (ret)
 
771
                return ret;
 
772
 
 
773
        i915_gem_object_pin_pages(obj);
 
774
 
 
775
        offset = args->offset;
 
776
        obj->dirty = 1;
 
777
 
 
778
        for_each_sg(obj->pages->sgl, sg, obj->pages->nents, i) {
 
779
                struct page *page;
 
780
                int partial_cacheline_write;
 
781
 
 
782
                if (i < offset >> PAGE_SHIFT)
 
783
                        continue;
 
784
 
 
785
                if (remain <= 0)
 
786
                        break;
 
787
 
 
788
                /* Operation in this page
 
789
                 *
 
790
                 * shmem_page_offset = offset within page in shmem file
 
791
                 * page_length = bytes to copy for this page
 
792
                 */
 
793
                shmem_page_offset = offset_in_page(offset);
 
794
 
 
795
                page_length = remain;
 
796
                if ((shmem_page_offset + page_length) > PAGE_SIZE)
 
797
                        page_length = PAGE_SIZE - shmem_page_offset;
 
798
 
 
799
                /* If we don't overwrite a cacheline completely we need to be
 
800
                 * careful to have up-to-date data by first clflushing. Don't
 
801
                 * overcomplicate things and flush the entire patch. */
 
802
                partial_cacheline_write = needs_clflush_before &&
 
803
                        ((shmem_page_offset | page_length)
 
804
                                & (boot_cpu_data.x86_clflush_size - 1));
 
805
 
 
806
                page = sg_page(sg);
 
807
                page_do_bit17_swizzling = obj_do_bit17_swizzling &&
 
808
                        (page_to_phys(page) & (1 << 17)) != 0;
 
809
 
 
810
                ret = shmem_pwrite_fast(page, shmem_page_offset, page_length,
 
811
                                        user_data, page_do_bit17_swizzling,
 
812
                                        partial_cacheline_write,
 
813
                                        needs_clflush_after);
 
814
                if (ret == 0)
 
815
                        goto next_page;
 
816
 
 
817
                hit_slowpath = 1;
 
818
                mutex_unlock(&dev->struct_mutex);
 
819
                ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
 
820
                                        user_data, page_do_bit17_swizzling,
 
821
                                        partial_cacheline_write,
 
822
                                        needs_clflush_after);
 
823
 
 
824
                mutex_lock(&dev->struct_mutex);
 
825
 
 
826
next_page:
 
827
                set_page_dirty(page);
 
828
                mark_page_accessed(page);
 
829
 
 
830
                if (ret)
 
831
                        goto out;
 
832
 
 
833
                remain -= page_length;
 
834
                user_data += page_length;
 
835
                offset += page_length;
 
836
        }
 
837
 
 
838
out:
 
839
        i915_gem_object_unpin_pages(obj);
 
840
 
 
841
        if (hit_slowpath) {
 
842
                /* Fixup: Kill any reinstated backing storage pages */
 
843
                if (obj->madv == __I915_MADV_PURGED)
 
844
                        i915_gem_object_truncate(obj);
 
845
                /* and flush dirty cachelines in case the object isn't in the cpu write
 
846
                 * domain anymore. */
 
847
                if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
 
848
                        i915_gem_clflush_object(obj);
 
849
                        i915_gem_chipset_flush(dev);
 
850
                }
 
851
        }
 
852
 
 
853
        if (needs_clflush_after)
 
854
                i915_gem_chipset_flush(dev);
 
855
 
 
856
        return ret;
 
857
}
 
858
 
 
859
/**
 
860
 * Writes data to the object referenced by handle.
 
861
 *
 
862
 * On error, the contents of the buffer that were to be modified are undefined.
 
863
 */
 
864
int
 
865
i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
 
866
                      struct drm_file *file)
 
867
{
 
868
        struct drm_i915_gem_pwrite *args = data;
 
869
        struct drm_i915_gem_object *obj;
 
870
        int ret;
 
871
 
 
872
        if (args->size == 0)
 
873
                return 0;
 
874
 
 
875
        if (!access_ok(VERIFY_READ,
 
876
                       (char __user *)(uintptr_t)args->data_ptr,
 
877
                       args->size))
 
878
                return -EFAULT;
 
879
 
 
880
        ret = fault_in_multipages_readable((char __user *)(uintptr_t)args->data_ptr,
 
881
                                           args->size);
 
882
        if (ret)
 
883
                return -EFAULT;
 
884
 
 
885
        ret = i915_mutex_lock_interruptible(dev);
 
886
        if (ret)
 
887
                return ret;
 
888
 
 
889
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
890
        if (&obj->base == NULL) {
 
891
                ret = -ENOENT;
 
892
                goto unlock;
 
893
        }
 
894
 
 
895
        /* Bounds check destination. */
 
896
        if (args->offset > obj->base.size ||
 
897
            args->size > obj->base.size - args->offset) {
 
898
                ret = -EINVAL;
 
899
                goto out;
 
900
        }
 
901
 
 
902
        /* prime objects have no backing filp to GEM pread/pwrite
 
903
         * pages from.
 
904
         */
 
905
        if (!obj->base.filp) {
 
906
                ret = -EINVAL;
 
907
                goto out;
 
908
        }
 
909
 
 
910
        trace_i915_gem_object_pwrite(obj, args->offset, args->size);
 
911
 
 
912
        ret = -EFAULT;
 
913
        /* We can only do the GTT pwrite on untiled buffers, as otherwise
 
914
         * it would end up going through the fenced access, and we'll get
 
915
         * different detiling behavior between reading and writing.
 
916
         * pread/pwrite currently are reading and writing from the CPU
 
917
         * perspective, requiring manual detiling by the client.
 
918
         */
 
919
        if (obj->phys_obj) {
 
920
                ret = i915_gem_phys_pwrite(dev, obj, args, file);
 
921
                goto out;
 
922
        }
 
923
 
 
924
        if (obj->cache_level == I915_CACHE_NONE &&
 
925
            obj->tiling_mode == I915_TILING_NONE &&
 
926
            obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
 
927
                ret = i915_gem_gtt_pwrite_fast(dev, obj, args, file);
 
928
                /* Note that the gtt paths might fail with non-page-backed user
 
929
                 * pointers (e.g. gtt mappings when moving data between
 
930
                 * textures). Fallback to the shmem path in that case. */
 
931
        }
 
932
 
 
933
        if (ret == -EFAULT || ret == -ENOSPC)
 
934
                ret = i915_gem_shmem_pwrite(dev, obj, args, file);
 
935
 
 
936
out:
 
937
        drm_gem_object_unreference(&obj->base);
 
938
unlock:
 
939
        mutex_unlock(&dev->struct_mutex);
 
940
        return ret;
 
941
}
 
942
 
 
943
int
 
944
i915_gem_check_wedge(struct drm_i915_private *dev_priv,
 
945
                     bool interruptible)
 
946
{
 
947
        if (atomic_read(&dev_priv->mm.wedged)) {
 
948
                struct completion *x = &dev_priv->error_completion;
 
949
                bool recovery_complete;
 
950
                unsigned long flags;
 
951
 
 
952
                /* Give the error handler a chance to run. */
 
953
                spin_lock_irqsave(&x->wait.lock, flags);
 
954
                recovery_complete = x->done > 0;
 
955
                spin_unlock_irqrestore(&x->wait.lock, flags);
 
956
 
 
957
                /* Non-interruptible callers can't handle -EAGAIN, hence return
 
958
                 * -EIO unconditionally for these. */
 
959
                if (!interruptible)
 
960
                        return -EIO;
 
961
 
 
962
                /* Recovery complete, but still wedged means reset failure. */
 
963
                if (recovery_complete)
 
964
                        return -EIO;
 
965
 
 
966
                return -EAGAIN;
 
967
        }
 
968
 
 
969
        return 0;
 
970
}
 
971
 
 
972
/*
 
973
 * Compare seqno against outstanding lazy request. Emit a request if they are
 
974
 * equal.
 
975
 */
 
976
static int
 
977
i915_gem_check_olr(struct intel_ring_buffer *ring, u32 seqno)
 
978
{
 
979
        int ret;
 
980
 
 
981
        BUG_ON(!mutex_is_locked(&ring->dev->struct_mutex));
 
982
 
 
983
        ret = 0;
 
984
        if (seqno == ring->outstanding_lazy_request)
 
985
                ret = i915_add_request(ring, NULL, NULL);
 
986
 
 
987
        return ret;
 
988
}
 
989
 
 
990
/**
 
991
 * __wait_seqno - wait until execution of seqno has finished
 
992
 * @ring: the ring expected to report seqno
 
993
 * @seqno: duh!
 
994
 * @interruptible: do an interruptible wait (normally yes)
 
995
 * @timeout: in - how long to wait (NULL forever); out - how much time remaining
 
996
 *
 
997
 * Returns 0 if the seqno was found within the alloted time. Else returns the
 
998
 * errno with remaining time filled in timeout argument.
 
999
 */
 
1000
static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
 
1001
                        bool interruptible, struct timespec *timeout)
 
1002
{
 
1003
        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 
1004
        struct timespec before, now, wait_time={1,0};
 
1005
        unsigned long timeout_jiffies;
 
1006
        long end;
 
1007
        bool wait_forever = true;
 
1008
        int ret;
 
1009
 
 
1010
        if (i915_seqno_passed(ring->get_seqno(ring, true), seqno))
 
1011
                return 0;
 
1012
 
 
1013
        trace_i915_gem_request_wait_begin(ring, seqno);
 
1014
 
 
1015
        if (timeout != NULL) {
 
1016
                wait_time = *timeout;
 
1017
                wait_forever = false;
 
1018
        }
 
1019
 
 
1020
        timeout_jiffies = timespec_to_jiffies(&wait_time);
 
1021
 
 
1022
        if (WARN_ON(!ring->irq_get(ring)))
 
1023
                return -ENODEV;
 
1024
 
 
1025
        /* Record current time in case interrupted by signal, or wedged * */
 
1026
        getrawmonotonic(&before);
 
1027
 
 
1028
#define EXIT_COND \
 
1029
        (i915_seqno_passed(ring->get_seqno(ring, false), seqno) || \
 
1030
        atomic_read(&dev_priv->mm.wedged))
 
1031
        do {
 
1032
                if (interruptible)
 
1033
                        end = wait_event_interruptible_timeout(ring->irq_queue,
 
1034
                                                               EXIT_COND,
 
1035
                                                               timeout_jiffies);
 
1036
                else
 
1037
                        end = wait_event_timeout(ring->irq_queue, EXIT_COND,
 
1038
                                                 timeout_jiffies);
 
1039
 
 
1040
                ret = i915_gem_check_wedge(dev_priv, interruptible);
 
1041
                if (ret)
 
1042
                        end = ret;
 
1043
        } while (end == 0 && wait_forever);
 
1044
 
 
1045
        getrawmonotonic(&now);
 
1046
 
 
1047
        ring->irq_put(ring);
 
1048
        trace_i915_gem_request_wait_end(ring, seqno);
 
1049
#undef EXIT_COND
 
1050
 
 
1051
        if (timeout) {
 
1052
                struct timespec sleep_time = timespec_sub(now, before);
 
1053
                *timeout = timespec_sub(*timeout, sleep_time);
 
1054
        }
 
1055
 
 
1056
        switch (end) {
 
1057
        case -EIO:
 
1058
        case -EAGAIN: /* Wedged */
 
1059
        case -ERESTARTSYS: /* Signal */
 
1060
                return (int)end;
 
1061
        case 0: /* Timeout */
 
1062
                if (timeout)
 
1063
                        set_normalized_timespec(timeout, 0, 0);
 
1064
                return -ETIME;
 
1065
        default: /* Completed */
 
1066
                WARN_ON(end < 0); /* We're not aware of other errors */
 
1067
                return 0;
 
1068
        }
 
1069
}
 
1070
 
 
1071
/**
 
1072
 * Waits for a sequence number to be signaled, and cleans up the
 
1073
 * request and object lists appropriately for that event.
 
1074
 */
 
1075
int
 
1076
i915_wait_seqno(struct intel_ring_buffer *ring, uint32_t seqno)
 
1077
{
 
1078
        struct drm_device *dev = ring->dev;
 
1079
        struct drm_i915_private *dev_priv = dev->dev_private;
 
1080
        bool interruptible = dev_priv->mm.interruptible;
 
1081
        int ret;
 
1082
 
 
1083
        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
 
1084
        BUG_ON(seqno == 0);
 
1085
 
 
1086
        ret = i915_gem_check_wedge(dev_priv, interruptible);
 
1087
        if (ret)
 
1088
                return ret;
 
1089
 
 
1090
        ret = i915_gem_check_olr(ring, seqno);
 
1091
        if (ret)
 
1092
                return ret;
 
1093
 
 
1094
        return __wait_seqno(ring, seqno, interruptible, NULL);
 
1095
}
 
1096
 
 
1097
/**
 
1098
 * Ensures that all rendering to the object has completed and the object is
 
1099
 * safe to unbind from the GTT or access from the CPU.
 
1100
 */
 
1101
static __must_check int
 
1102
i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
 
1103
                               bool readonly)
 
1104
{
 
1105
        struct intel_ring_buffer *ring = obj->ring;
 
1106
        u32 seqno;
 
1107
        int ret;
 
1108
 
 
1109
        seqno = readonly ? obj->last_write_seqno : obj->last_read_seqno;
 
1110
        if (seqno == 0)
 
1111
                return 0;
 
1112
 
 
1113
        ret = i915_wait_seqno(ring, seqno);
 
1114
        if (ret)
 
1115
                return ret;
 
1116
 
 
1117
        i915_gem_retire_requests_ring(ring);
 
1118
 
 
1119
        /* Manually manage the write flush as we may have not yet
 
1120
         * retired the buffer.
 
1121
         */
 
1122
        if (obj->last_write_seqno &&
 
1123
            i915_seqno_passed(seqno, obj->last_write_seqno)) {
 
1124
                obj->last_write_seqno = 0;
 
1125
                obj->base.write_domain &= ~I915_GEM_GPU_DOMAINS;
 
1126
        }
 
1127
 
 
1128
        return 0;
 
1129
}
 
1130
 
 
1131
/* A nonblocking variant of the above wait. This is a highly dangerous routine
 
1132
 * as the object state may change during this call.
 
1133
 */
 
1134
static __must_check int
 
1135
i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
 
1136
                                            bool readonly)
 
1137
{
 
1138
        struct drm_device *dev = obj->base.dev;
 
1139
        struct drm_i915_private *dev_priv = dev->dev_private;
 
1140
        struct intel_ring_buffer *ring = obj->ring;
 
1141
        u32 seqno;
 
1142
        int ret;
 
1143
 
 
1144
        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
 
1145
        BUG_ON(!dev_priv->mm.interruptible);
 
1146
 
 
1147
        seqno = readonly ? obj->last_write_seqno : obj->last_read_seqno;
 
1148
        if (seqno == 0)
 
1149
                return 0;
 
1150
 
 
1151
        ret = i915_gem_check_wedge(dev_priv, true);
 
1152
        if (ret)
 
1153
                return ret;
 
1154
 
 
1155
        ret = i915_gem_check_olr(ring, seqno);
 
1156
        if (ret)
 
1157
                return ret;
 
1158
 
 
1159
        mutex_unlock(&dev->struct_mutex);
 
1160
        ret = __wait_seqno(ring, seqno, true, NULL);
 
1161
        mutex_lock(&dev->struct_mutex);
 
1162
 
 
1163
        i915_gem_retire_requests_ring(ring);
 
1164
 
 
1165
        /* Manually manage the write flush as we may have not yet
 
1166
         * retired the buffer.
 
1167
         */
 
1168
        if (obj->last_write_seqno &&
 
1169
            i915_seqno_passed(seqno, obj->last_write_seqno)) {
 
1170
                obj->last_write_seqno = 0;
 
1171
                obj->base.write_domain &= ~I915_GEM_GPU_DOMAINS;
 
1172
        }
 
1173
 
 
1174
        return ret;
 
1175
}
 
1176
 
 
1177
/**
 
1178
 * Called when user space prepares to use an object with the CPU, either
 
1179
 * through the mmap ioctl's mapping or a GTT mapping.
 
1180
 */
 
1181
int
 
1182
i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 
1183
                          struct drm_file *file)
 
1184
{
 
1185
        struct drm_i915_gem_set_domain *args = data;
 
1186
        struct drm_i915_gem_object *obj;
 
1187
        uint32_t read_domains = args->read_domains;
 
1188
        uint32_t write_domain = args->write_domain;
 
1189
        int ret;
 
1190
 
 
1191
        /* Only handle setting domains to types used by the CPU. */
 
1192
        if (write_domain & I915_GEM_GPU_DOMAINS)
 
1193
                return -EINVAL;
 
1194
 
 
1195
        if (read_domains & I915_GEM_GPU_DOMAINS)
 
1196
                return -EINVAL;
 
1197
 
 
1198
        /* Having something in the write domain implies it's in the read
 
1199
         * domain, and only that read domain.  Enforce that in the request.
 
1200
         */
 
1201
        if (write_domain != 0 && read_domains != write_domain)
 
1202
                return -EINVAL;
 
1203
 
 
1204
        ret = i915_mutex_lock_interruptible(dev);
 
1205
        if (ret)
 
1206
                return ret;
 
1207
 
 
1208
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
1209
        if (&obj->base == NULL) {
 
1210
                ret = -ENOENT;
 
1211
                goto unlock;
 
1212
        }
 
1213
 
 
1214
        /* Try to flush the object off the GPU without holding the lock.
 
1215
         * We will repeat the flush holding the lock in the normal manner
 
1216
         * to catch cases where we are gazumped.
 
1217
         */
 
1218
        ret = i915_gem_object_wait_rendering__nonblocking(obj, !write_domain);
 
1219
        if (ret)
 
1220
                goto unref;
 
1221
 
 
1222
        if (read_domains & I915_GEM_DOMAIN_GTT) {
 
1223
                ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
 
1224
 
 
1225
                /* Silently promote "you're not bound, there was nothing to do"
 
1226
                 * to success, since the client was just asking us to
 
1227
                 * make sure everything was done.
 
1228
                 */
 
1229
                if (ret == -EINVAL)
 
1230
                        ret = 0;
 
1231
        } else {
 
1232
                ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
 
1233
        }
 
1234
 
 
1235
unref:
 
1236
        drm_gem_object_unreference(&obj->base);
 
1237
unlock:
 
1238
        mutex_unlock(&dev->struct_mutex);
 
1239
        return ret;
 
1240
}
 
1241
 
 
1242
/**
 
1243
 * Called when user space has done writes to this buffer
 
1244
 */
 
1245
int
 
1246
i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
 
1247
                         struct drm_file *file)
 
1248
{
 
1249
        struct drm_i915_gem_sw_finish *args = data;
 
1250
        struct drm_i915_gem_object *obj;
 
1251
        int ret = 0;
 
1252
 
 
1253
        ret = i915_mutex_lock_interruptible(dev);
 
1254
        if (ret)
 
1255
                return ret;
 
1256
 
 
1257
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
1258
        if (&obj->base == NULL) {
 
1259
                ret = -ENOENT;
 
1260
                goto unlock;
 
1261
        }
 
1262
 
 
1263
        /* Pinned buffers may be scanout, so flush the cache */
 
1264
        if (obj->pin_count)
 
1265
                i915_gem_object_flush_cpu_write_domain(obj);
 
1266
 
 
1267
        drm_gem_object_unreference(&obj->base);
 
1268
unlock:
 
1269
        mutex_unlock(&dev->struct_mutex);
 
1270
        return ret;
 
1271
}
 
1272
 
 
1273
/**
 
1274
 * Maps the contents of an object, returning the address it is mapped
 
1275
 * into.
 
1276
 *
 
1277
 * While the mapping holds a reference on the contents of the object, it doesn't
 
1278
 * imply a ref on the object itself.
 
1279
 */
 
1280
int
 
1281
i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
 
1282
                    struct drm_file *file)
 
1283
{
 
1284
        struct drm_i915_gem_mmap *args = data;
 
1285
        struct drm_gem_object *obj;
 
1286
        unsigned long addr;
 
1287
 
 
1288
        obj = drm_gem_object_lookup(dev, file, args->handle);
 
1289
        if (obj == NULL)
 
1290
                return -ENOENT;
 
1291
 
 
1292
        /* prime objects have no backing filp to GEM mmap
 
1293
         * pages from.
 
1294
         */
 
1295
        if (!obj->filp) {
 
1296
                drm_gem_object_unreference_unlocked(obj);
 
1297
                return -EINVAL;
 
1298
        }
 
1299
 
 
1300
        addr = vm_mmap(obj->filp, 0, args->size,
 
1301
                       PROT_READ | PROT_WRITE, MAP_SHARED,
 
1302
                       args->offset);
 
1303
        drm_gem_object_unreference_unlocked(obj);
 
1304
        if (IS_ERR((void *)addr))
 
1305
                return addr;
 
1306
 
 
1307
        args->addr_ptr = (uint64_t) addr;
 
1308
 
 
1309
        return 0;
 
1310
}
 
1311
 
 
1312
/**
 
1313
 * i915_gem_fault - fault a page into the GTT
 
1314
 * vma: VMA in question
 
1315
 * vmf: fault info
 
1316
 *
 
1317
 * The fault handler is set up by drm_gem_mmap() when a object is GTT mapped
 
1318
 * from userspace.  The fault handler takes care of binding the object to
 
1319
 * the GTT (if needed), allocating and programming a fence register (again,
 
1320
 * only if needed based on whether the old reg is still valid or the object
 
1321
 * is tiled) and inserting a new PTE into the faulting process.
 
1322
 *
 
1323
 * Note that the faulting process may involve evicting existing objects
 
1324
 * from the GTT and/or fence registers to make room.  So performance may
 
1325
 * suffer if the GTT working set is large or there are few fence registers
 
1326
 * left.
 
1327
 */
 
1328
int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 
1329
{
 
1330
        struct drm_i915_gem_object *obj = to_intel_bo(vma->vm_private_data);
 
1331
        struct drm_device *dev = obj->base.dev;
 
1332
        drm_i915_private_t *dev_priv = dev->dev_private;
 
1333
        pgoff_t page_offset;
 
1334
        unsigned long pfn;
 
1335
        int ret = 0;
 
1336
        bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
 
1337
 
 
1338
        /* We don't use vmf->pgoff since that has the fake offset */
 
1339
        page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
 
1340
                PAGE_SHIFT;
 
1341
 
 
1342
        ret = i915_mutex_lock_interruptible(dev);
 
1343
        if (ret)
 
1344
                goto out;
 
1345
 
 
1346
        trace_i915_gem_object_fault(obj, page_offset, true, write);
 
1347
 
 
1348
        /* Now bind it into the GTT if needed */
 
1349
        ret = i915_gem_object_pin(obj, 0, true, false);
 
1350
        if (ret)
 
1351
                goto unlock;
 
1352
 
 
1353
        ret = i915_gem_object_set_to_gtt_domain(obj, write);
 
1354
        if (ret)
 
1355
                goto unpin;
 
1356
 
 
1357
        ret = i915_gem_object_get_fence(obj);
 
1358
        if (ret)
 
1359
                goto unpin;
 
1360
 
 
1361
        obj->fault_mappable = true;
 
1362
 
 
1363
        pfn = ((dev_priv->mm.gtt_base_addr + obj->gtt_offset) >> PAGE_SHIFT) +
 
1364
                page_offset;
 
1365
 
 
1366
        /* Finally, remap it using the new GTT offset */
 
1367
        ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
 
1368
unpin:
 
1369
        i915_gem_object_unpin(obj);
 
1370
unlock:
 
1371
        mutex_unlock(&dev->struct_mutex);
 
1372
out:
 
1373
        switch (ret) {
 
1374
        case -EIO:
 
1375
                /* If this -EIO is due to a gpu hang, give the reset code a
 
1376
                 * chance to clean up the mess. Otherwise return the proper
 
1377
                 * SIGBUS. */
 
1378
                if (!atomic_read(&dev_priv->mm.wedged))
 
1379
                        return VM_FAULT_SIGBUS;
 
1380
        case -EAGAIN:
 
1381
                /* Give the error handler a chance to run and move the
 
1382
                 * objects off the GPU active list. Next time we service the
 
1383
                 * fault, we should be able to transition the page into the
 
1384
                 * GTT without touching the GPU (and so avoid further
 
1385
                 * EIO/EGAIN). If the GPU is wedged, then there is no issue
 
1386
                 * with coherency, just lost writes.
 
1387
                 */
 
1388
                set_need_resched();
 
1389
        case 0:
 
1390
        case -ERESTARTSYS:
 
1391
        case -EINTR:
 
1392
        case -EBUSY:
 
1393
                /*
 
1394
                 * EBUSY is ok: this just means that another thread
 
1395
                 * already did the job.
 
1396
                 */
 
1397
                return VM_FAULT_NOPAGE;
 
1398
        case -ENOMEM:
 
1399
                return VM_FAULT_OOM;
 
1400
        case -ENOSPC:
 
1401
                return VM_FAULT_SIGBUS;
 
1402
        default:
 
1403
                WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);
 
1404
                return VM_FAULT_SIGBUS;
 
1405
        }
 
1406
}
 
1407
 
 
1408
/**
 
1409
 * i915_gem_release_mmap - remove physical page mappings
 
1410
 * @obj: obj in question
 
1411
 *
 
1412
 * Preserve the reservation of the mmapping with the DRM core code, but
 
1413
 * relinquish ownership of the pages back to the system.
 
1414
 *
 
1415
 * It is vital that we remove the page mapping if we have mapped a tiled
 
1416
 * object through the GTT and then lose the fence register due to
 
1417
 * resource pressure. Similarly if the object has been moved out of the
 
1418
 * aperture, than pages mapped into userspace must be revoked. Removing the
 
1419
 * mapping will then trigger a page fault on the next user access, allowing
 
1420
 * fixup by i915_gem_fault().
 
1421
 */
 
1422
void
 
1423
i915_gem_release_mmap(struct drm_i915_gem_object *obj)
 
1424
{
 
1425
        if (!obj->fault_mappable)
 
1426
                return;
 
1427
 
 
1428
        if (obj->base.dev->dev_mapping)
 
1429
                unmap_mapping_range(obj->base.dev->dev_mapping,
 
1430
                                    (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT,
 
1431
                                    obj->base.size, 1);
 
1432
 
 
1433
        obj->fault_mappable = false;
 
1434
}
 
1435
 
 
1436
static uint32_t
 
1437
i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
 
1438
{
 
1439
        uint32_t gtt_size;
 
1440
 
 
1441
        if (INTEL_INFO(dev)->gen >= 4 ||
 
1442
            tiling_mode == I915_TILING_NONE)
 
1443
                return size;
 
1444
 
 
1445
        /* Previous chips need a power-of-two fence region when tiling */
 
1446
        if (INTEL_INFO(dev)->gen == 3)
 
1447
                gtt_size = 1024*1024;
 
1448
        else
 
1449
                gtt_size = 512*1024;
 
1450
 
 
1451
        while (gtt_size < size)
 
1452
                gtt_size <<= 1;
 
1453
 
 
1454
        return gtt_size;
 
1455
}
 
1456
 
 
1457
/**
 
1458
 * i915_gem_get_gtt_alignment - return required GTT alignment for an object
 
1459
 * @obj: object to check
 
1460
 *
 
1461
 * Return the required GTT alignment for an object, taking into account
 
1462
 * potential fence register mapping.
 
1463
 */
 
1464
static uint32_t
 
1465
i915_gem_get_gtt_alignment(struct drm_device *dev,
 
1466
                           uint32_t size,
 
1467
                           int tiling_mode)
 
1468
{
 
1469
        /*
 
1470
         * Minimum alignment is 4k (GTT page size), but might be greater
 
1471
         * if a fence register is needed for the object.
 
1472
         */
 
1473
        if (INTEL_INFO(dev)->gen >= 4 ||
 
1474
            tiling_mode == I915_TILING_NONE)
 
1475
                return 4096;
 
1476
 
 
1477
        /*
 
1478
         * Previous chips need to be aligned to the size of the smallest
 
1479
         * fence register that can contain the object.
 
1480
         */
 
1481
        return i915_gem_get_gtt_size(dev, size, tiling_mode);
 
1482
}
 
1483
 
 
1484
/**
 
1485
 * i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an
 
1486
 *                                       unfenced object
 
1487
 * @dev: the device
 
1488
 * @size: size of the object
 
1489
 * @tiling_mode: tiling mode of the object
 
1490
 *
 
1491
 * Return the required GTT alignment for an object, only taking into account
 
1492
 * unfenced tiled surface requirements.
 
1493
 */
 
1494
uint32_t
 
1495
i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev,
 
1496
                                    uint32_t size,
 
1497
                                    int tiling_mode)
 
1498
{
 
1499
        /*
 
1500
         * Minimum alignment is 4k (GTT page size) for sane hw.
 
1501
         */
 
1502
        if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev) ||
 
1503
            tiling_mode == I915_TILING_NONE)
 
1504
                return 4096;
 
1505
 
 
1506
        /* Previous hardware however needs to be aligned to a power-of-two
 
1507
         * tile height. The simplest method for determining this is to reuse
 
1508
         * the power-of-tile object size.
 
1509
         */
 
1510
        return i915_gem_get_gtt_size(dev, size, tiling_mode);
 
1511
}
 
1512
 
 
1513
static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
 
1514
{
 
1515
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
1516
        int ret;
 
1517
 
 
1518
        if (obj->base.map_list.map)
 
1519
                return 0;
 
1520
 
 
1521
        ret = drm_gem_create_mmap_offset(&obj->base);
 
1522
        if (ret != -ENOSPC)
 
1523
                return ret;
 
1524
 
 
1525
        /* Badly fragmented mmap space? The only way we can recover
 
1526
         * space is by destroying unwanted objects. We can't randomly release
 
1527
         * mmap_offsets as userspace expects them to be persistent for the
 
1528
         * lifetime of the objects. The closest we can is to release the
 
1529
         * offsets on purgeable objects by truncating it and marking it purged,
 
1530
         * which prevents userspace from ever using that object again.
 
1531
         */
 
1532
        i915_gem_purge(dev_priv, obj->base.size >> PAGE_SHIFT);
 
1533
        ret = drm_gem_create_mmap_offset(&obj->base);
 
1534
        if (ret != -ENOSPC)
 
1535
                return ret;
 
1536
 
 
1537
        i915_gem_shrink_all(dev_priv);
 
1538
        return drm_gem_create_mmap_offset(&obj->base);
 
1539
}
 
1540
 
 
1541
static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
 
1542
{
 
1543
        if (!obj->base.map_list.map)
 
1544
                return;
 
1545
 
 
1546
        drm_gem_free_mmap_offset(&obj->base);
 
1547
}
 
1548
 
 
1549
int
 
1550
i915_gem_mmap_gtt(struct drm_file *file,
 
1551
                  struct drm_device *dev,
 
1552
                  uint32_t handle,
 
1553
                  uint64_t *offset)
 
1554
{
 
1555
        struct drm_i915_private *dev_priv = dev->dev_private;
 
1556
        struct drm_i915_gem_object *obj;
 
1557
        int ret;
 
1558
 
 
1559
        ret = i915_mutex_lock_interruptible(dev);
 
1560
        if (ret)
 
1561
                return ret;
 
1562
 
 
1563
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
 
1564
        if (&obj->base == NULL) {
 
1565
                ret = -ENOENT;
 
1566
                goto unlock;
 
1567
        }
 
1568
 
 
1569
        if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
 
1570
                ret = -E2BIG;
 
1571
                goto out;
 
1572
        }
 
1573
 
 
1574
        if (obj->madv != I915_MADV_WILLNEED) {
 
1575
                DRM_ERROR("Attempting to mmap a purgeable buffer\n");
 
1576
                ret = -EINVAL;
 
1577
                goto out;
 
1578
        }
 
1579
 
 
1580
        ret = i915_gem_object_create_mmap_offset(obj);
 
1581
        if (ret)
 
1582
                goto out;
 
1583
 
 
1584
        *offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT;
 
1585
 
 
1586
out:
 
1587
        drm_gem_object_unreference(&obj->base);
 
1588
unlock:
 
1589
        mutex_unlock(&dev->struct_mutex);
 
1590
        return ret;
 
1591
}
 
1592
 
 
1593
/**
 
1594
 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
 
1595
 * @dev: DRM device
 
1596
 * @data: GTT mapping ioctl data
 
1597
 * @file: GEM object info
 
1598
 *
 
1599
 * Simply returns the fake offset to userspace so it can mmap it.
 
1600
 * The mmap call will end up in drm_gem_mmap(), which will set things
 
1601
 * up so we can get faults in the handler above.
 
1602
 *
 
1603
 * The fault handler will take care of binding the object into the GTT
 
1604
 * (since it may have been evicted to make room for something), allocating
 
1605
 * a fence register, and mapping the appropriate aperture address into
 
1606
 * userspace.
 
1607
 */
 
1608
int
 
1609
i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
 
1610
                        struct drm_file *file)
 
1611
{
 
1612
        struct drm_i915_gem_mmap_gtt *args = data;
 
1613
 
 
1614
        return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
 
1615
}
 
1616
 
 
1617
/* Immediately discard the backing storage */
 
1618
static void
 
1619
i915_gem_object_truncate(struct drm_i915_gem_object *obj)
 
1620
{
 
1621
        struct inode *inode;
 
1622
 
 
1623
        i915_gem_object_free_mmap_offset(obj);
 
1624
 
 
1625
        if (obj->base.filp == NULL)
 
1626
                return;
 
1627
 
 
1628
        /* Our goal here is to return as much of the memory as
 
1629
         * is possible back to the system as we are called from OOM.
 
1630
         * To do this we must instruct the shmfs to drop all of its
 
1631
         * backing pages, *now*.
 
1632
         */
 
1633
        inode = obj->base.filp->f_path.dentry->d_inode;
 
1634
        shmem_truncate_range(inode, 0, (loff_t)-1);
 
1635
 
 
1636
        obj->madv = __I915_MADV_PURGED;
 
1637
}
 
1638
 
 
1639
static inline int
 
1640
i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj)
 
1641
{
 
1642
        return obj->madv == I915_MADV_DONTNEED;
 
1643
}
 
1644
 
 
1645
static void
 
1646
i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
 
1647
{
 
1648
        int page_count = obj->base.size / PAGE_SIZE;
 
1649
        struct scatterlist *sg;
 
1650
        int ret, i;
 
1651
 
 
1652
        BUG_ON(obj->madv == __I915_MADV_PURGED);
 
1653
 
 
1654
        ret = i915_gem_object_set_to_cpu_domain(obj, true);
 
1655
        if (ret) {
 
1656
                /* In the event of a disaster, abandon all caches and
 
1657
                 * hope for the best.
 
1658
                 */
 
1659
                WARN_ON(ret != -EIO);
 
1660
                i915_gem_clflush_object(obj);
 
1661
                obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
 
1662
        }
 
1663
 
 
1664
        if (i915_gem_object_needs_bit17_swizzle(obj))
 
1665
                i915_gem_object_save_bit_17_swizzle(obj);
 
1666
 
 
1667
        if (obj->madv == I915_MADV_DONTNEED)
 
1668
                obj->dirty = 0;
 
1669
 
 
1670
        for_each_sg(obj->pages->sgl, sg, page_count, i) {
 
1671
                struct page *page = sg_page(sg);
 
1672
 
 
1673
                if (obj->dirty)
 
1674
                        set_page_dirty(page);
 
1675
 
 
1676
                if (obj->madv == I915_MADV_WILLNEED)
 
1677
                        mark_page_accessed(page);
 
1678
 
 
1679
                page_cache_release(page);
 
1680
        }
 
1681
        obj->dirty = 0;
 
1682
 
 
1683
        sg_free_table(obj->pages);
 
1684
        kfree(obj->pages);
 
1685
}
 
1686
 
 
1687
static int
 
1688
i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
 
1689
{
 
1690
        const struct drm_i915_gem_object_ops *ops = obj->ops;
 
1691
 
 
1692
        if (obj->pages == NULL)
 
1693
                return 0;
 
1694
 
 
1695
        BUG_ON(obj->gtt_space);
 
1696
 
 
1697
        if (obj->pages_pin_count)
 
1698
                return -EBUSY;
 
1699
 
 
1700
        ops->put_pages(obj);
 
1701
        obj->pages = NULL;
 
1702
 
 
1703
        list_del(&obj->gtt_list);
 
1704
        if (i915_gem_object_is_purgeable(obj))
 
1705
                i915_gem_object_truncate(obj);
 
1706
 
 
1707
        return 0;
 
1708
}
 
1709
 
 
1710
static long
 
1711
i915_gem_purge(struct drm_i915_private *dev_priv, long target)
 
1712
{
 
1713
        struct drm_i915_gem_object *obj, *next;
 
1714
        long count = 0;
 
1715
 
 
1716
        list_for_each_entry_safe(obj, next,
 
1717
                                 &dev_priv->mm.unbound_list,
 
1718
                                 gtt_list) {
 
1719
                if (i915_gem_object_is_purgeable(obj) &&
 
1720
                    i915_gem_object_put_pages(obj) == 0) {
 
1721
                        count += obj->base.size >> PAGE_SHIFT;
 
1722
                        if (count >= target)
 
1723
                                return count;
 
1724
                }
 
1725
        }
 
1726
 
 
1727
        list_for_each_entry_safe(obj, next,
 
1728
                                 &dev_priv->mm.inactive_list,
 
1729
                                 mm_list) {
 
1730
                if (i915_gem_object_is_purgeable(obj) &&
 
1731
                    i915_gem_object_unbind(obj) == 0 &&
 
1732
                    i915_gem_object_put_pages(obj) == 0) {
 
1733
                        count += obj->base.size >> PAGE_SHIFT;
 
1734
                        if (count >= target)
 
1735
                                return count;
 
1736
                }
 
1737
        }
 
1738
 
 
1739
        return count;
 
1740
}
 
1741
 
 
1742
static void
 
1743
i915_gem_shrink_all(struct drm_i915_private *dev_priv)
 
1744
{
 
1745
        struct drm_i915_gem_object *obj, *next;
 
1746
 
 
1747
        i915_gem_evict_everything(dev_priv->dev);
 
1748
 
 
1749
        list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list, gtt_list)
 
1750
                i915_gem_object_put_pages(obj);
 
1751
}
 
1752
 
 
1753
static int
 
1754
i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
 
1755
{
 
1756
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
1757
        int page_count, i;
 
1758
        struct address_space *mapping;
 
1759
        struct sg_table *st;
 
1760
        struct scatterlist *sg;
 
1761
        struct page *page;
 
1762
        gfp_t gfp;
 
1763
 
 
1764
        /* Assert that the object is not currently in any GPU domain. As it
 
1765
         * wasn't in the GTT, there shouldn't be any way it could have been in
 
1766
         * a GPU cache
 
1767
         */
 
1768
        BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
 
1769
        BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
 
1770
 
 
1771
        st = kmalloc(sizeof(*st), GFP_KERNEL);
 
1772
        if (st == NULL)
 
1773
                return -ENOMEM;
 
1774
 
 
1775
        page_count = obj->base.size / PAGE_SIZE;
 
1776
        if (sg_alloc_table(st, page_count, GFP_KERNEL)) {
 
1777
                sg_free_table(st);
 
1778
                kfree(st);
 
1779
                return -ENOMEM;
 
1780
        }
 
1781
 
 
1782
        /* Get the list of pages out of our struct file.  They'll be pinned
 
1783
         * at this point until we release them.
 
1784
         *
 
1785
         * Fail silently without starting the shrinker
 
1786
         */
 
1787
        mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
 
1788
        gfp = mapping_gfp_mask(mapping);
 
1789
        gfp |= __GFP_NORETRY | __GFP_NOWARN;
 
1790
        gfp &= ~(__GFP_IO | __GFP_WAIT);
 
1791
        for_each_sg(st->sgl, sg, page_count, i) {
 
1792
                page = shmem_read_mapping_page_gfp(mapping, i, gfp);
 
1793
                if (IS_ERR(page)) {
 
1794
                        i915_gem_purge(dev_priv, page_count);
 
1795
                        page = shmem_read_mapping_page_gfp(mapping, i, gfp);
 
1796
                }
 
1797
                if (IS_ERR(page)) {
 
1798
                        /* We've tried hard to allocate the memory by reaping
 
1799
                         * our own buffer, now let the real VM do its job and
 
1800
                         * go down in flames if truly OOM.
 
1801
                         */
 
1802
                        gfp &= ~(__GFP_NORETRY | __GFP_NOWARN);
 
1803
                        gfp |= __GFP_IO | __GFP_WAIT;
 
1804
 
 
1805
                        i915_gem_shrink_all(dev_priv);
 
1806
                        page = shmem_read_mapping_page_gfp(mapping, i, gfp);
 
1807
                        if (IS_ERR(page))
 
1808
                                goto err_pages;
 
1809
 
 
1810
                        gfp |= __GFP_NORETRY | __GFP_NOWARN;
 
1811
                        gfp &= ~(__GFP_IO | __GFP_WAIT);
 
1812
                }
 
1813
 
 
1814
                sg_set_page(sg, page, PAGE_SIZE, 0);
 
1815
        }
 
1816
 
 
1817
        obj->pages = st;
 
1818
 
 
1819
        if (i915_gem_object_needs_bit17_swizzle(obj))
 
1820
                i915_gem_object_do_bit_17_swizzle(obj);
 
1821
 
 
1822
        return 0;
 
1823
 
 
1824
err_pages:
 
1825
        for_each_sg(st->sgl, sg, i, page_count)
 
1826
                page_cache_release(sg_page(sg));
 
1827
        sg_free_table(st);
 
1828
        kfree(st);
 
1829
        return PTR_ERR(page);
 
1830
}
 
1831
 
 
1832
/* Ensure that the associated pages are gathered from the backing storage
 
1833
 * and pinned into our object. i915_gem_object_get_pages() may be called
 
1834
 * multiple times before they are released by a single call to
 
1835
 * i915_gem_object_put_pages() - once the pages are no longer referenced
 
1836
 * either as a result of memory pressure (reaping pages under the shrinker)
 
1837
 * or as the object is itself released.
 
1838
 */
 
1839
int
 
1840
i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 
1841
{
 
1842
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
1843
        const struct drm_i915_gem_object_ops *ops = obj->ops;
 
1844
        int ret;
 
1845
 
 
1846
        if (obj->pages)
 
1847
                return 0;
 
1848
 
 
1849
        BUG_ON(obj->pages_pin_count);
 
1850
 
 
1851
        ret = ops->get_pages(obj);
 
1852
        if (ret)
 
1853
                return ret;
 
1854
 
 
1855
        list_add_tail(&obj->gtt_list, &dev_priv->mm.unbound_list);
 
1856
        return 0;
 
1857
}
 
1858
 
 
1859
void
 
1860
i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
 
1861
                               struct intel_ring_buffer *ring,
 
1862
                               u32 seqno)
 
1863
{
 
1864
        struct drm_device *dev = obj->base.dev;
 
1865
        struct drm_i915_private *dev_priv = dev->dev_private;
 
1866
 
 
1867
        BUG_ON(ring == NULL);
 
1868
        obj->ring = ring;
 
1869
 
 
1870
        /* Add a reference if we're newly entering the active list. */
 
1871
        if (!obj->active) {
 
1872
                drm_gem_object_reference(&obj->base);
 
1873
                obj->active = 1;
 
1874
        }
 
1875
 
 
1876
        /* Move from whatever list we were on to the tail of execution. */
 
1877
        list_move_tail(&obj->mm_list, &dev_priv->mm.active_list);
 
1878
        list_move_tail(&obj->ring_list, &ring->active_list);
 
1879
 
 
1880
        obj->last_read_seqno = seqno;
 
1881
 
 
1882
        if (obj->fenced_gpu_access) {
 
1883
                obj->last_fenced_seqno = seqno;
 
1884
 
 
1885
                /* Bump MRU to take account of the delayed flush */
 
1886
                if (obj->fence_reg != I915_FENCE_REG_NONE) {
 
1887
                        struct drm_i915_fence_reg *reg;
 
1888
 
 
1889
                        reg = &dev_priv->fence_regs[obj->fence_reg];
 
1890
                        list_move_tail(&reg->lru_list,
 
1891
                                       &dev_priv->mm.fence_list);
 
1892
                }
 
1893
        }
 
1894
}
 
1895
 
 
1896
static void
 
1897
i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
 
1898
{
 
1899
        struct drm_device *dev = obj->base.dev;
 
1900
        struct drm_i915_private *dev_priv = dev->dev_private;
 
1901
 
 
1902
        BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS);
 
1903
        BUG_ON(!obj->active);
 
1904
 
 
1905
        if (obj->pin_count) /* are we a framebuffer? */
 
1906
                intel_mark_fb_idle(obj);
 
1907
 
 
1908
        list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
1909
 
 
1910
        list_del_init(&obj->ring_list);
 
1911
        obj->ring = NULL;
 
1912
 
 
1913
        obj->last_read_seqno = 0;
 
1914
        obj->last_write_seqno = 0;
 
1915
        obj->base.write_domain = 0;
 
1916
 
 
1917
        obj->last_fenced_seqno = 0;
 
1918
        obj->fenced_gpu_access = false;
 
1919
 
 
1920
        obj->active = 0;
 
1921
        drm_gem_object_unreference(&obj->base);
 
1922
 
 
1923
        WARN_ON(i915_verify_lists(dev));
 
1924
}
 
1925
 
 
1926
static u32
 
1927
i915_gem_get_seqno(struct drm_device *dev)
 
1928
{
 
1929
        drm_i915_private_t *dev_priv = dev->dev_private;
 
1930
        u32 seqno = dev_priv->next_seqno;
 
1931
 
 
1932
        /* reserve 0 for non-seqno */
 
1933
        if (++dev_priv->next_seqno == 0)
 
1934
                dev_priv->next_seqno = 1;
 
1935
 
 
1936
        return seqno;
 
1937
}
 
1938
 
 
1939
u32
 
1940
i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
 
1941
{
 
1942
        if (ring->outstanding_lazy_request == 0)
 
1943
                ring->outstanding_lazy_request = i915_gem_get_seqno(ring->dev);
 
1944
 
 
1945
        return ring->outstanding_lazy_request;
 
1946
}
 
1947
 
 
1948
int
 
1949
i915_add_request(struct intel_ring_buffer *ring,
 
1950
                 struct drm_file *file,
 
1951
                 u32 *out_seqno)
 
1952
{
 
1953
        drm_i915_private_t *dev_priv = ring->dev->dev_private;
 
1954
        struct drm_i915_gem_request *request;
 
1955
        u32 request_ring_position;
 
1956
        u32 seqno;
 
1957
        int was_empty;
 
1958
        int ret;
 
1959
 
 
1960
        /*
 
1961
         * Emit any outstanding flushes - execbuf can fail to emit the flush
 
1962
         * after having emitted the batchbuffer command. Hence we need to fix
 
1963
         * things up similar to emitting the lazy request. The difference here
 
1964
         * is that the flush _must_ happen before the next request, no matter
 
1965
         * what.
 
1966
         */
 
1967
        ret = intel_ring_flush_all_caches(ring);
 
1968
        if (ret)
 
1969
                return ret;
 
1970
 
 
1971
        request = kmalloc(sizeof(*request), GFP_KERNEL);
 
1972
        if (request == NULL)
 
1973
                return -ENOMEM;
 
1974
 
 
1975
        seqno = i915_gem_next_request_seqno(ring);
 
1976
 
 
1977
        /* Record the position of the start of the request so that
 
1978
         * should we detect the updated seqno part-way through the
 
1979
         * GPU processing the request, we never over-estimate the
 
1980
         * position of the head.
 
1981
         */
 
1982
        request_ring_position = intel_ring_get_tail(ring);
 
1983
 
 
1984
        ret = ring->add_request(ring, &seqno);
 
1985
        if (ret) {
 
1986
                kfree(request);
 
1987
                return ret;
 
1988
        }
 
1989
 
 
1990
        trace_i915_gem_request_add(ring, seqno);
 
1991
 
 
1992
        request->seqno = seqno;
 
1993
        request->ring = ring;
 
1994
        request->tail = request_ring_position;
 
1995
        request->emitted_jiffies = jiffies;
 
1996
        was_empty = list_empty(&ring->request_list);
 
1997
        list_add_tail(&request->list, &ring->request_list);
 
1998
        request->file_priv = NULL;
 
1999
 
 
2000
        if (file) {
 
2001
                struct drm_i915_file_private *file_priv = file->driver_priv;
 
2002
 
 
2003
                spin_lock(&file_priv->mm.lock);
 
2004
                request->file_priv = file_priv;
 
2005
                list_add_tail(&request->client_list,
 
2006
                              &file_priv->mm.request_list);
 
2007
                spin_unlock(&file_priv->mm.lock);
 
2008
        }
 
2009
 
 
2010
        ring->outstanding_lazy_request = 0;
 
2011
 
 
2012
        if (!dev_priv->mm.suspended) {
 
2013
                if (i915_enable_hangcheck) {
 
2014
                        mod_timer(&dev_priv->hangcheck_timer,
 
2015
                                  round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES));
 
2016
                }
 
2017
                if (was_empty) {
 
2018
                        queue_delayed_work(dev_priv->wq,
 
2019
                                           &dev_priv->mm.retire_work,
 
2020
                                           round_jiffies_up_relative(HZ));
 
2021
                        intel_mark_busy(dev_priv->dev);
 
2022
                }
 
2023
        }
 
2024
 
 
2025
        if (out_seqno)
 
2026
                *out_seqno = seqno;
 
2027
        return 0;
 
2028
}
 
2029
 
 
2030
static inline void
 
2031
i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
 
2032
{
 
2033
        struct drm_i915_file_private *file_priv = request->file_priv;
 
2034
 
 
2035
        if (!file_priv)
 
2036
                return;
 
2037
 
 
2038
        spin_lock(&file_priv->mm.lock);
 
2039
        if (request->file_priv) {
 
2040
                list_del(&request->client_list);
 
2041
                request->file_priv = NULL;
 
2042
        }
 
2043
        spin_unlock(&file_priv->mm.lock);
 
2044
}
 
2045
 
 
2046
static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
 
2047
                                      struct intel_ring_buffer *ring)
 
2048
{
 
2049
        while (!list_empty(&ring->request_list)) {
 
2050
                struct drm_i915_gem_request *request;
 
2051
 
 
2052
                request = list_first_entry(&ring->request_list,
 
2053
                                           struct drm_i915_gem_request,
 
2054
                                           list);
 
2055
 
 
2056
                list_del(&request->list);
 
2057
                i915_gem_request_remove_from_client(request);
 
2058
                kfree(request);
 
2059
        }
 
2060
 
 
2061
        while (!list_empty(&ring->active_list)) {
 
2062
                struct drm_i915_gem_object *obj;
 
2063
 
 
2064
                obj = list_first_entry(&ring->active_list,
 
2065
                                       struct drm_i915_gem_object,
 
2066
                                       ring_list);
 
2067
 
 
2068
                i915_gem_object_move_to_inactive(obj);
 
2069
        }
 
2070
}
 
2071
 
 
2072
static void i915_gem_reset_fences(struct drm_device *dev)
 
2073
{
 
2074
        struct drm_i915_private *dev_priv = dev->dev_private;
 
2075
        int i;
 
2076
 
 
2077
        for (i = 0; i < dev_priv->num_fence_regs; i++) {
 
2078
                struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
 
2079
 
 
2080
                i915_gem_write_fence(dev, i, NULL);
 
2081
 
 
2082
                if (reg->obj)
 
2083
                        i915_gem_object_fence_lost(reg->obj);
 
2084
 
 
2085
                reg->pin_count = 0;
 
2086
                reg->obj = NULL;
 
2087
                INIT_LIST_HEAD(&reg->lru_list);
 
2088
        }
 
2089
 
 
2090
        INIT_LIST_HEAD(&dev_priv->mm.fence_list);
 
2091
}
 
2092
 
 
2093
void i915_gem_reset(struct drm_device *dev)
 
2094
{
 
2095
        struct drm_i915_private *dev_priv = dev->dev_private;
 
2096
        struct drm_i915_gem_object *obj;
 
2097
        struct intel_ring_buffer *ring;
 
2098
        int i;
 
2099
 
 
2100
        for_each_ring(ring, dev_priv, i)
 
2101
                i915_gem_reset_ring_lists(dev_priv, ring);
 
2102
 
 
2103
        /* Move everything out of the GPU domains to ensure we do any
 
2104
         * necessary invalidation upon reuse.
 
2105
         */
 
2106
        list_for_each_entry(obj,
 
2107
                            &dev_priv->mm.inactive_list,
 
2108
                            mm_list)
 
2109
        {
 
2110
                obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
 
2111
        }
 
2112
 
 
2113
        /* The fence registers are invalidated so clear them out */
 
2114
        i915_gem_reset_fences(dev);
 
2115
}
 
2116
 
 
2117
/**
 
2118
 * This function clears the request list as sequence numbers are passed.
 
2119
 */
 
2120
void
 
2121
i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
 
2122
{
 
2123
        uint32_t seqno;
 
2124
        int i;
 
2125
 
 
2126
        if (list_empty(&ring->request_list))
 
2127
                return;
 
2128
 
 
2129
        WARN_ON(i915_verify_lists(ring->dev));
 
2130
 
 
2131
        seqno = ring->get_seqno(ring, true);
 
2132
 
 
2133
        for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++)
 
2134
                if (seqno >= ring->sync_seqno[i])
 
2135
                        ring->sync_seqno[i] = 0;
 
2136
 
 
2137
        while (!list_empty(&ring->request_list)) {
 
2138
                struct drm_i915_gem_request *request;
 
2139
 
 
2140
                request = list_first_entry(&ring->request_list,
 
2141
                                           struct drm_i915_gem_request,
 
2142
                                           list);
 
2143
 
 
2144
                if (!i915_seqno_passed(seqno, request->seqno))
 
2145
                        break;
 
2146
 
 
2147
                trace_i915_gem_request_retire(ring, request->seqno);
 
2148
                /* We know the GPU must have read the request to have
 
2149
                 * sent us the seqno + interrupt, so use the position
 
2150
                 * of tail of the request to update the last known position
 
2151
                 * of the GPU head.
 
2152
                 */
 
2153
                ring->last_retired_head = request->tail;
 
2154
 
 
2155
                list_del(&request->list);
 
2156
                i915_gem_request_remove_from_client(request);
 
2157
                kfree(request);
 
2158
        }
 
2159
 
 
2160
        /* Move any buffers on the active list that are no longer referenced
 
2161
         * by the ringbuffer to the flushing/inactive lists as appropriate.
 
2162
         */
 
2163
        while (!list_empty(&ring->active_list)) {
 
2164
                struct drm_i915_gem_object *obj;
 
2165
 
 
2166
                obj = list_first_entry(&ring->active_list,
 
2167
                                      struct drm_i915_gem_object,
 
2168
                                      ring_list);
 
2169
 
 
2170
                if (!i915_seqno_passed(seqno, obj->last_read_seqno))
 
2171
                        break;
 
2172
 
 
2173
                i915_gem_object_move_to_inactive(obj);
 
2174
        }
 
2175
 
 
2176
        if (unlikely(ring->trace_irq_seqno &&
 
2177
                     i915_seqno_passed(seqno, ring->trace_irq_seqno))) {
 
2178
                ring->irq_put(ring);
 
2179
                ring->trace_irq_seqno = 0;
 
2180
        }
 
2181
 
 
2182
        WARN_ON(i915_verify_lists(ring->dev));
 
2183
}
 
2184
 
 
2185
void
 
2186
i915_gem_retire_requests(struct drm_device *dev)
 
2187
{
 
2188
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2189
        struct intel_ring_buffer *ring;
 
2190
        int i;
 
2191
 
 
2192
        for_each_ring(ring, dev_priv, i)
 
2193
                i915_gem_retire_requests_ring(ring);
 
2194
}
 
2195
 
 
2196
static void
 
2197
i915_gem_retire_work_handler(struct work_struct *work)
 
2198
{
 
2199
        drm_i915_private_t *dev_priv;
 
2200
        struct drm_device *dev;
 
2201
        struct intel_ring_buffer *ring;
 
2202
        bool idle;
 
2203
        int i;
 
2204
 
 
2205
        dev_priv = container_of(work, drm_i915_private_t,
 
2206
                                mm.retire_work.work);
 
2207
        dev = dev_priv->dev;
 
2208
 
 
2209
        /* Come back later if the device is busy... */
 
2210
        if (!mutex_trylock(&dev->struct_mutex)) {
 
2211
                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work,
 
2212
                                   round_jiffies_up_relative(HZ));
 
2213
                return;
 
2214
        }
 
2215
 
 
2216
        i915_gem_retire_requests(dev);
 
2217
 
 
2218
        /* Send a periodic flush down the ring so we don't hold onto GEM
 
2219
         * objects indefinitely.
 
2220
         */
 
2221
        idle = true;
 
2222
        for_each_ring(ring, dev_priv, i) {
 
2223
                if (ring->gpu_caches_dirty)
 
2224
                        i915_add_request(ring, NULL, NULL);
 
2225
 
 
2226
                idle &= list_empty(&ring->request_list);
 
2227
        }
 
2228
 
 
2229
        if (!dev_priv->mm.suspended && !idle)
 
2230
                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work,
 
2231
                                   round_jiffies_up_relative(HZ));
 
2232
        if (idle)
 
2233
                intel_mark_idle(dev);
 
2234
 
 
2235
        mutex_unlock(&dev->struct_mutex);
 
2236
}
 
2237
 
 
2238
/**
 
2239
 * Ensures that an object will eventually get non-busy by flushing any required
 
2240
 * write domains, emitting any outstanding lazy request and retiring and
 
2241
 * completed requests.
 
2242
 */
 
2243
static int
 
2244
i915_gem_object_flush_active(struct drm_i915_gem_object *obj)
 
2245
{
 
2246
        int ret;
 
2247
 
 
2248
        if (obj->active) {
 
2249
                ret = i915_gem_check_olr(obj->ring, obj->last_read_seqno);
 
2250
                if (ret)
 
2251
                        return ret;
 
2252
 
 
2253
                i915_gem_retire_requests_ring(obj->ring);
 
2254
        }
 
2255
 
 
2256
        return 0;
 
2257
}
 
2258
 
 
2259
/**
 
2260
 * i915_gem_wait_ioctl - implements DRM_IOCTL_I915_GEM_WAIT
 
2261
 * @DRM_IOCTL_ARGS: standard ioctl arguments
 
2262
 *
 
2263
 * Returns 0 if successful, else an error is returned with the remaining time in
 
2264
 * the timeout parameter.
 
2265
 *  -ETIME: object is still busy after timeout
 
2266
 *  -ERESTARTSYS: signal interrupted the wait
 
2267
 *  -ENONENT: object doesn't exist
 
2268
 * Also possible, but rare:
 
2269
 *  -EAGAIN: GPU wedged
 
2270
 *  -ENOMEM: damn
 
2271
 *  -ENODEV: Internal IRQ fail
 
2272
 *  -E?: The add request failed
 
2273
 *
 
2274
 * The wait ioctl with a timeout of 0 reimplements the busy ioctl. With any
 
2275
 * non-zero timeout parameter the wait ioctl will wait for the given number of
 
2276
 * nanoseconds on an object becoming unbusy. Since the wait itself does so
 
2277
 * without holding struct_mutex the object may become re-busied before this
 
2278
 * function completes. A similar but shorter * race condition exists in the busy
 
2279
 * ioctl
 
2280
 */
 
2281
int
 
2282
i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 
2283
{
 
2284
        struct drm_i915_gem_wait *args = data;
 
2285
        struct drm_i915_gem_object *obj;
 
2286
        struct intel_ring_buffer *ring = NULL;
 
2287
        struct timespec timeout_stack, *timeout = NULL;
 
2288
        u32 seqno = 0;
 
2289
        int ret = 0;
 
2290
 
 
2291
        if (args->timeout_ns >= 0) {
 
2292
                timeout_stack = ns_to_timespec(args->timeout_ns);
 
2293
                timeout = &timeout_stack;
 
2294
        }
 
2295
 
 
2296
        ret = i915_mutex_lock_interruptible(dev);
 
2297
        if (ret)
 
2298
                return ret;
 
2299
 
 
2300
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->bo_handle));
 
2301
        if (&obj->base == NULL) {
 
2302
                mutex_unlock(&dev->struct_mutex);
 
2303
                return -ENOENT;
 
2304
        }
 
2305
 
 
2306
        /* Need to make sure the object gets inactive eventually. */
 
2307
        ret = i915_gem_object_flush_active(obj);
 
2308
        if (ret)
 
2309
                goto out;
 
2310
 
 
2311
        if (obj->active) {
 
2312
                seqno = obj->last_read_seqno;
 
2313
                ring = obj->ring;
 
2314
        }
 
2315
 
 
2316
        if (seqno == 0)
 
2317
                 goto out;
 
2318
 
 
2319
        /* Do this after OLR check to make sure we make forward progress polling
 
2320
         * on this IOCTL with a 0 timeout (like busy ioctl)
 
2321
         */
 
2322
        if (!args->timeout_ns) {
 
2323
                ret = -ETIME;
 
2324
                goto out;
 
2325
        }
 
2326
 
 
2327
        drm_gem_object_unreference(&obj->base);
 
2328
        mutex_unlock(&dev->struct_mutex);
 
2329
 
 
2330
        ret = __wait_seqno(ring, seqno, true, timeout);
 
2331
        if (timeout) {
 
2332
                WARN_ON(!timespec_valid(timeout));
 
2333
                args->timeout_ns = timespec_to_ns(timeout);
 
2334
        }
 
2335
        return ret;
 
2336
 
 
2337
out:
 
2338
        drm_gem_object_unreference(&obj->base);
 
2339
        mutex_unlock(&dev->struct_mutex);
 
2340
        return ret;
 
2341
}
 
2342
 
 
2343
/**
 
2344
 * i915_gem_object_sync - sync an object to a ring.
 
2345
 *
 
2346
 * @obj: object which may be in use on another ring.
 
2347
 * @to: ring we wish to use the object on. May be NULL.
 
2348
 *
 
2349
 * This code is meant to abstract object synchronization with the GPU.
 
2350
 * Calling with NULL implies synchronizing the object with the CPU
 
2351
 * rather than a particular GPU ring.
 
2352
 *
 
2353
 * Returns 0 if successful, else propagates up the lower layer error.
 
2354
 */
 
2355
int
 
2356
i915_gem_object_sync(struct drm_i915_gem_object *obj,
 
2357
                     struct intel_ring_buffer *to)
 
2358
{
 
2359
        struct intel_ring_buffer *from = obj->ring;
 
2360
        u32 seqno;
 
2361
        int ret, idx;
 
2362
 
 
2363
        if (from == NULL || to == from)
 
2364
                return 0;
 
2365
 
 
2366
        if (to == NULL || !i915_semaphore_is_enabled(obj->base.dev))
 
2367
                return i915_gem_object_wait_rendering(obj, false);
 
2368
 
 
2369
        idx = intel_ring_sync_index(from, to);
 
2370
 
 
2371
        seqno = obj->last_read_seqno;
 
2372
        if (seqno <= from->sync_seqno[idx])
 
2373
                return 0;
 
2374
 
 
2375
        ret = i915_gem_check_olr(obj->ring, seqno);
 
2376
        if (ret)
 
2377
                return ret;
 
2378
 
 
2379
        ret = to->sync_to(to, from, seqno);
 
2380
        if (!ret)
 
2381
                from->sync_seqno[idx] = seqno;
 
2382
 
 
2383
        return ret;
 
2384
}
 
2385
 
 
2386
static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
 
2387
{
 
2388
        u32 old_write_domain, old_read_domains;
 
2389
 
 
2390
        /* Act a barrier for all accesses through the GTT */
 
2391
        mb();
 
2392
 
 
2393
        /* Force a pagefault for domain tracking on next user access */
 
2394
        i915_gem_release_mmap(obj);
 
2395
 
 
2396
        if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
 
2397
                return;
 
2398
 
 
2399
        old_read_domains = obj->base.read_domains;
 
2400
        old_write_domain = obj->base.write_domain;
 
2401
 
 
2402
        obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT;
 
2403
        obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT;
 
2404
 
 
2405
        trace_i915_gem_object_change_domain(obj,
 
2406
                                            old_read_domains,
 
2407
                                            old_write_domain);
 
2408
}
 
2409
 
 
2410
/**
 
2411
 * Unbinds an object from the GTT aperture.
 
2412
 */
 
2413
int
 
2414
i915_gem_object_unbind(struct drm_i915_gem_object *obj)
 
2415
{
 
2416
        drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
 
2417
        int ret = 0;
 
2418
 
 
2419
        if (obj->gtt_space == NULL)
 
2420
                return 0;
 
2421
 
 
2422
        if (obj->pin_count)
 
2423
                return -EBUSY;
 
2424
 
 
2425
        BUG_ON(obj->pages == NULL);
 
2426
 
 
2427
        ret = i915_gem_object_finish_gpu(obj);
 
2428
        if (ret)
 
2429
                return ret;
 
2430
        /* Continue on if we fail due to EIO, the GPU is hung so we
 
2431
         * should be safe and we need to cleanup or else we might
 
2432
         * cause memory corruption through use-after-free.
 
2433
         */
 
2434
 
 
2435
        i915_gem_object_finish_gtt(obj);
 
2436
 
 
2437
        /* release the fence reg _after_ flushing */
 
2438
        ret = i915_gem_object_put_fence(obj);
 
2439
        if (ret)
 
2440
                return ret;
 
2441
 
 
2442
        trace_i915_gem_object_unbind(obj);
 
2443
 
 
2444
        if (obj->has_global_gtt_mapping)
 
2445
                i915_gem_gtt_unbind_object(obj);
 
2446
        if (obj->has_aliasing_ppgtt_mapping) {
 
2447
                i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj);
 
2448
                obj->has_aliasing_ppgtt_mapping = 0;
 
2449
        }
 
2450
        i915_gem_gtt_finish_object(obj);
 
2451
 
 
2452
        list_del(&obj->mm_list);
 
2453
        list_move_tail(&obj->gtt_list, &dev_priv->mm.unbound_list);
 
2454
        /* Avoid an unnecessary call to unbind on rebind. */
 
2455
        obj->map_and_fenceable = true;
 
2456
 
 
2457
        drm_mm_put_block_hsw(obj->gtt_space);
 
2458
        obj->gtt_space = NULL;
 
2459
        obj->gtt_offset = 0;
 
2460
 
 
2461
        return 0;
 
2462
}
 
2463
 
 
2464
static int i915_ring_idle(struct intel_ring_buffer *ring)
 
2465
{
 
2466
        if (list_empty(&ring->active_list))
 
2467
                return 0;
 
2468
 
 
2469
        return i915_wait_seqno(ring, i915_gem_next_request_seqno(ring));
 
2470
}
 
2471
 
 
2472
int i915_gpu_idle(struct drm_device *dev)
 
2473
{
 
2474
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2475
        struct intel_ring_buffer *ring;
 
2476
        int ret, i;
 
2477
 
 
2478
        /* Flush everything onto the inactive list. */
 
2479
        for_each_ring(ring, dev_priv, i) {
 
2480
                ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
 
2481
                if (ret)
 
2482
                        return ret;
 
2483
 
 
2484
                ret = i915_ring_idle(ring);
 
2485
                if (ret)
 
2486
                        return ret;
 
2487
        }
 
2488
 
 
2489
        return 0;
 
2490
}
 
2491
 
 
2492
static void sandybridge_write_fence_reg(struct drm_device *dev, int reg,
 
2493
                                        struct drm_i915_gem_object *obj)
 
2494
{
 
2495
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2496
        uint64_t val;
 
2497
 
 
2498
        if (obj) {
 
2499
                u32 size = obj->gtt_space->size;
 
2500
 
 
2501
                val = (uint64_t)((obj->gtt_offset + size - 4096) &
 
2502
                                 0xfffff000) << 32;
 
2503
                val |= obj->gtt_offset & 0xfffff000;
 
2504
                val |= (uint64_t)((obj->stride / 128) - 1) <<
 
2505
                        SANDYBRIDGE_FENCE_PITCH_SHIFT;
 
2506
 
 
2507
                if (obj->tiling_mode == I915_TILING_Y)
 
2508
                        val |= 1 << I965_FENCE_TILING_Y_SHIFT;
 
2509
                val |= I965_FENCE_REG_VALID;
 
2510
        } else
 
2511
                val = 0;
 
2512
 
 
2513
        I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + reg * 8, val);
 
2514
        POSTING_READ(FENCE_REG_SANDYBRIDGE_0 + reg * 8);
 
2515
}
 
2516
 
 
2517
static void i965_write_fence_reg(struct drm_device *dev, int reg,
 
2518
                                 struct drm_i915_gem_object *obj)
 
2519
{
 
2520
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2521
        uint64_t val;
 
2522
 
 
2523
        if (obj) {
 
2524
                u32 size = obj->gtt_space->size;
 
2525
 
 
2526
                val = (uint64_t)((obj->gtt_offset + size - 4096) &
 
2527
                                 0xfffff000) << 32;
 
2528
                val |= obj->gtt_offset & 0xfffff000;
 
2529
                val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT;
 
2530
                if (obj->tiling_mode == I915_TILING_Y)
 
2531
                        val |= 1 << I965_FENCE_TILING_Y_SHIFT;
 
2532
                val |= I965_FENCE_REG_VALID;
 
2533
        } else
 
2534
                val = 0;
 
2535
 
 
2536
        I915_WRITE64(FENCE_REG_965_0 + reg * 8, val);
 
2537
        POSTING_READ(FENCE_REG_965_0 + reg * 8);
 
2538
}
 
2539
 
 
2540
static void i915_write_fence_reg(struct drm_device *dev, int reg,
 
2541
                                 struct drm_i915_gem_object *obj)
 
2542
{
 
2543
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2544
        u32 val;
 
2545
 
 
2546
        if (obj) {
 
2547
                u32 size = obj->gtt_space->size;
 
2548
                int pitch_val;
 
2549
                int tile_width;
 
2550
 
 
2551
                WARN((obj->gtt_offset & ~I915_FENCE_START_MASK) ||
 
2552
                     (size & -size) != size ||
 
2553
                     (obj->gtt_offset & (size - 1)),
 
2554
                     "object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
 
2555
                     obj->gtt_offset, obj->map_and_fenceable, size);
 
2556
 
 
2557
                if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
 
2558
                        tile_width = 128;
 
2559
                else
 
2560
                        tile_width = 512;
 
2561
 
 
2562
                /* Note: pitch better be a power of two tile widths */
 
2563
                pitch_val = obj->stride / tile_width;
 
2564
                pitch_val = ffs(pitch_val) - 1;
 
2565
 
 
2566
                val = obj->gtt_offset;
 
2567
                if (obj->tiling_mode == I915_TILING_Y)
 
2568
                        val |= 1 << I830_FENCE_TILING_Y_SHIFT;
 
2569
                val |= I915_FENCE_SIZE_BITS(size);
 
2570
                val |= pitch_val << I830_FENCE_PITCH_SHIFT;
 
2571
                val |= I830_FENCE_REG_VALID;
 
2572
        } else
 
2573
                val = 0;
 
2574
 
 
2575
        if (reg < 8)
 
2576
                reg = FENCE_REG_830_0 + reg * 4;
 
2577
        else
 
2578
                reg = FENCE_REG_945_8 + (reg - 8) * 4;
 
2579
 
 
2580
        I915_WRITE(reg, val);
 
2581
        POSTING_READ(reg);
 
2582
}
 
2583
 
 
2584
static void i830_write_fence_reg(struct drm_device *dev, int reg,
 
2585
                                struct drm_i915_gem_object *obj)
 
2586
{
 
2587
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2588
        uint32_t val;
 
2589
 
 
2590
        if (obj) {
 
2591
                u32 size = obj->gtt_space->size;
 
2592
                uint32_t pitch_val;
 
2593
 
 
2594
                WARN((obj->gtt_offset & ~I830_FENCE_START_MASK) ||
 
2595
                     (size & -size) != size ||
 
2596
                     (obj->gtt_offset & (size - 1)),
 
2597
                     "object 0x%08x not 512K or pot-size 0x%08x aligned\n",
 
2598
                     obj->gtt_offset, size);
 
2599
 
 
2600
                pitch_val = obj->stride / 128;
 
2601
                pitch_val = ffs(pitch_val) - 1;
 
2602
 
 
2603
                val = obj->gtt_offset;
 
2604
                if (obj->tiling_mode == I915_TILING_Y)
 
2605
                        val |= 1 << I830_FENCE_TILING_Y_SHIFT;
 
2606
                val |= I830_FENCE_SIZE_BITS(size);
 
2607
                val |= pitch_val << I830_FENCE_PITCH_SHIFT;
 
2608
                val |= I830_FENCE_REG_VALID;
 
2609
        } else
 
2610
                val = 0;
 
2611
 
 
2612
        I915_WRITE(FENCE_REG_830_0 + reg * 4, val);
 
2613
        POSTING_READ(FENCE_REG_830_0 + reg * 4);
 
2614
}
 
2615
 
 
2616
static void i915_gem_write_fence(struct drm_device *dev, int reg,
 
2617
                                 struct drm_i915_gem_object *obj)
 
2618
{
 
2619
        switch (INTEL_INFO(dev)->gen) {
 
2620
        case 7:
 
2621
        case 6: sandybridge_write_fence_reg(dev, reg, obj); break;
 
2622
        case 5:
 
2623
        case 4: i965_write_fence_reg(dev, reg, obj); break;
 
2624
        case 3: i915_write_fence_reg(dev, reg, obj); break;
 
2625
        case 2: i830_write_fence_reg(dev, reg, obj); break;
 
2626
        default: break;
 
2627
        }
 
2628
}
 
2629
 
 
2630
static inline int fence_number(struct drm_i915_private *dev_priv,
 
2631
                               struct drm_i915_fence_reg *fence)
 
2632
{
 
2633
        return fence - dev_priv->fence_regs;
 
2634
}
 
2635
 
 
2636
static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj,
 
2637
                                         struct drm_i915_fence_reg *fence,
 
2638
                                         bool enable)
 
2639
{
 
2640
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
2641
        int reg = fence_number(dev_priv, fence);
 
2642
 
 
2643
        i915_gem_write_fence(obj->base.dev, reg, enable ? obj : NULL);
 
2644
 
 
2645
        if (enable) {
 
2646
                obj->fence_reg = reg;
 
2647
                fence->obj = obj;
 
2648
                list_move_tail(&fence->lru_list, &dev_priv->mm.fence_list);
 
2649
        } else {
 
2650
                obj->fence_reg = I915_FENCE_REG_NONE;
 
2651
                fence->obj = NULL;
 
2652
                list_del_init(&fence->lru_list);
 
2653
        }
 
2654
}
 
2655
 
 
2656
static int
 
2657
i915_gem_object_flush_fence(struct drm_i915_gem_object *obj)
 
2658
{
 
2659
        if (obj->last_fenced_seqno) {
 
2660
                int ret = i915_wait_seqno(obj->ring, obj->last_fenced_seqno);
 
2661
                if (ret)
 
2662
                        return ret;
 
2663
 
 
2664
                obj->last_fenced_seqno = 0;
 
2665
        }
 
2666
 
 
2667
        /* Ensure that all CPU reads are completed before installing a fence
 
2668
         * and all writes before removing the fence.
 
2669
         */
 
2670
        if (obj->base.read_domains & I915_GEM_DOMAIN_GTT)
 
2671
                mb();
 
2672
 
 
2673
        obj->fenced_gpu_access = false;
 
2674
        return 0;
 
2675
}
 
2676
 
 
2677
int
 
2678
i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
 
2679
{
 
2680
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
2681
        int ret;
 
2682
 
 
2683
        ret = i915_gem_object_flush_fence(obj);
 
2684
        if (ret)
 
2685
                return ret;
 
2686
 
 
2687
        if (obj->fence_reg == I915_FENCE_REG_NONE)
 
2688
                return 0;
 
2689
 
 
2690
        i915_gem_object_update_fence(obj,
 
2691
                                     &dev_priv->fence_regs[obj->fence_reg],
 
2692
                                     false);
 
2693
        i915_gem_object_fence_lost(obj);
 
2694
 
 
2695
        return 0;
 
2696
}
 
2697
 
 
2698
static struct drm_i915_fence_reg *
 
2699
i915_find_fence_reg(struct drm_device *dev)
 
2700
{
 
2701
        struct drm_i915_private *dev_priv = dev->dev_private;
 
2702
        struct drm_i915_fence_reg *reg, *avail;
 
2703
        int i;
 
2704
 
 
2705
        /* First try to find a free reg */
 
2706
        avail = NULL;
 
2707
        for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
 
2708
                reg = &dev_priv->fence_regs[i];
 
2709
                if (!reg->obj)
 
2710
                        return reg;
 
2711
 
 
2712
                if (!reg->pin_count)
 
2713
                        avail = reg;
 
2714
        }
 
2715
 
 
2716
        if (avail == NULL)
 
2717
                return NULL;
 
2718
 
 
2719
        /* None available, try to steal one or wait for a user to finish */
 
2720
        list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
 
2721
                if (reg->pin_count)
 
2722
                        continue;
 
2723
 
 
2724
                return reg;
 
2725
        }
 
2726
 
 
2727
        return NULL;
 
2728
}
 
2729
 
 
2730
/**
 
2731
 * i915_gem_object_get_fence - set up fencing for an object
 
2732
 * @obj: object to map through a fence reg
 
2733
 *
 
2734
 * When mapping objects through the GTT, userspace wants to be able to write
 
2735
 * to them without having to worry about swizzling if the object is tiled.
 
2736
 * This function walks the fence regs looking for a free one for @obj,
 
2737
 * stealing one if it can't find any.
 
2738
 *
 
2739
 * It then sets up the reg based on the object's properties: address, pitch
 
2740
 * and tiling format.
 
2741
 *
 
2742
 * For an untiled surface, this removes any existing fence.
 
2743
 */
 
2744
int
 
2745
i915_gem_object_get_fence(struct drm_i915_gem_object *obj)
 
2746
{
 
2747
        struct drm_device *dev = obj->base.dev;
 
2748
        struct drm_i915_private *dev_priv = dev->dev_private;
 
2749
        bool enable = obj->tiling_mode != I915_TILING_NONE;
 
2750
        struct drm_i915_fence_reg *reg;
 
2751
        int ret;
 
2752
 
 
2753
        /* Have we updated the tiling parameters upon the object and so
 
2754
         * will need to serialise the write to the associated fence register?
 
2755
         */
 
2756
        if (obj->fence_dirty) {
 
2757
                ret = i915_gem_object_flush_fence(obj);
 
2758
                if (ret)
 
2759
                        return ret;
 
2760
        }
 
2761
 
 
2762
        /* Just update our place in the LRU if our fence is getting reused. */
 
2763
        if (obj->fence_reg != I915_FENCE_REG_NONE) {
 
2764
                reg = &dev_priv->fence_regs[obj->fence_reg];
 
2765
                if (!obj->fence_dirty) {
 
2766
                        list_move_tail(&reg->lru_list,
 
2767
                                       &dev_priv->mm.fence_list);
 
2768
                        return 0;
 
2769
                }
 
2770
        } else if (enable) {
 
2771
                reg = i915_find_fence_reg(dev);
 
2772
                if (reg == NULL)
 
2773
                        return -EDEADLK;
 
2774
 
 
2775
                if (reg->obj) {
 
2776
                        struct drm_i915_gem_object *old = reg->obj;
 
2777
 
 
2778
                        ret = i915_gem_object_flush_fence(old);
 
2779
                        if (ret)
 
2780
                                return ret;
 
2781
 
 
2782
                        i915_gem_object_fence_lost(old);
 
2783
                }
 
2784
        } else
 
2785
                return 0;
 
2786
 
 
2787
        i915_gem_object_update_fence(obj, reg, enable);
 
2788
        obj->fence_dirty = false;
 
2789
 
 
2790
        return 0;
 
2791
}
 
2792
 
 
2793
static bool i915_gem_valid_gtt_space(struct drm_device *dev,
 
2794
                                     struct drm_mm_node_hsw *gtt_space,
 
2795
                                     unsigned long cache_level)
 
2796
{
 
2797
        struct drm_mm_node_hsw *other;
 
2798
 
 
2799
        /* On non-LLC machines we have to be careful when putting differing
 
2800
         * types of snoopable memory together to avoid the prefetcher
 
2801
         * crossing memory domains and dieing.
 
2802
         */
 
2803
        if (HAS_LLC(dev))
 
2804
                return true;
 
2805
 
 
2806
        if (gtt_space == NULL)
 
2807
                return true;
 
2808
 
 
2809
        if (list_empty(&gtt_space->node_list))
 
2810
                return true;
 
2811
 
 
2812
        other = list_entry(gtt_space->node_list.prev, struct drm_mm_node_hsw, node_list);
 
2813
        if (other->allocated && !other->hole_follows && other->color != cache_level)
 
2814
                return false;
 
2815
 
 
2816
        other = list_entry(gtt_space->node_list.next, struct drm_mm_node_hsw, node_list);
 
2817
        if (other->allocated && !gtt_space->hole_follows && other->color != cache_level)
 
2818
                return false;
 
2819
 
 
2820
        return true;
 
2821
}
 
2822
 
 
2823
static void i915_gem_verify_gtt(struct drm_device *dev)
 
2824
{
 
2825
#if WATCH_GTT
 
2826
        struct drm_i915_private *dev_priv = dev->dev_private;
 
2827
        struct drm_i915_gem_object *obj;
 
2828
        int err = 0;
 
2829
 
 
2830
        list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
 
2831
                if (obj->gtt_space == NULL) {
 
2832
                        printk(KERN_ERR "object found on GTT list with no space reserved\n");
 
2833
                        err++;
 
2834
                        continue;
 
2835
                }
 
2836
 
 
2837
                if (obj->cache_level != obj->gtt_space->color) {
 
2838
                        printk(KERN_ERR "object reserved space [%08lx, %08lx] with wrong color, cache_level=%x, color=%lx\n",
 
2839
                               obj->gtt_space->start,
 
2840
                               obj->gtt_space->start + obj->gtt_space->size,
 
2841
                               obj->cache_level,
 
2842
                               obj->gtt_space->color);
 
2843
                        err++;
 
2844
                        continue;
 
2845
                }
 
2846
 
 
2847
                if (!i915_gem_valid_gtt_space(dev,
 
2848
                                              obj->gtt_space,
 
2849
                                              obj->cache_level)) {
 
2850
                        printk(KERN_ERR "invalid GTT space found at [%08lx, %08lx] - color=%x\n",
 
2851
                               obj->gtt_space->start,
 
2852
                               obj->gtt_space->start + obj->gtt_space->size,
 
2853
                               obj->cache_level);
 
2854
                        err++;
 
2855
                        continue;
 
2856
                }
 
2857
        }
 
2858
 
 
2859
        WARN_ON(err);
 
2860
#endif
 
2861
}
 
2862
 
 
2863
/**
 
2864
 * Finds free space in the GTT aperture and binds the object there.
 
2865
 */
 
2866
static int
 
2867
i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
 
2868
                            unsigned alignment,
 
2869
                            bool map_and_fenceable,
 
2870
                            bool nonblocking)
 
2871
{
 
2872
        struct drm_device *dev = obj->base.dev;
 
2873
        drm_i915_private_t *dev_priv = dev->dev_private;
 
2874
        struct drm_mm_node_hsw *free_space;
 
2875
        u32 size, fence_size, fence_alignment, unfenced_alignment;
 
2876
        bool mappable, fenceable;
 
2877
        int ret;
 
2878
 
 
2879
        if (obj->madv != I915_MADV_WILLNEED) {
 
2880
                DRM_ERROR("Attempting to bind a purgeable object\n");
 
2881
                return -EINVAL;
 
2882
        }
 
2883
 
 
2884
        fence_size = i915_gem_get_gtt_size(dev,
 
2885
                                           obj->base.size,
 
2886
                                           obj->tiling_mode);
 
2887
        fence_alignment = i915_gem_get_gtt_alignment(dev,
 
2888
                                                     obj->base.size,
 
2889
                                                     obj->tiling_mode);
 
2890
        unfenced_alignment =
 
2891
                i915_gem_get_unfenced_gtt_alignment(dev,
 
2892
                                                    obj->base.size,
 
2893
                                                    obj->tiling_mode);
 
2894
 
 
2895
        if (alignment == 0)
 
2896
                alignment = map_and_fenceable ? fence_alignment :
 
2897
                                                unfenced_alignment;
 
2898
        if (map_and_fenceable && alignment & (fence_alignment - 1)) {
 
2899
                DRM_ERROR("Invalid object alignment requested %u\n", alignment);
 
2900
                return -EINVAL;
 
2901
        }
 
2902
 
 
2903
        size = map_and_fenceable ? fence_size : obj->base.size;
 
2904
 
 
2905
        /* If the object is bigger than the entire aperture, reject it early
 
2906
         * before evicting everything in a vain attempt to find space.
 
2907
         */
 
2908
        if (obj->base.size >
 
2909
            (map_and_fenceable ? dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
 
2910
                DRM_ERROR("Attempting to bind an object larger than the aperture\n");
 
2911
                return -E2BIG;
 
2912
        }
 
2913
 
 
2914
        ret = i915_gem_object_get_pages(obj);
 
2915
        if (ret)
 
2916
                return ret;
 
2917
 
 
2918
        i915_gem_object_pin_pages(obj);
 
2919
 
 
2920
 search_free:
 
2921
        if (map_and_fenceable)
 
2922
                free_space = drm_mm_search_free_in_range_color_hsw(&dev_priv->mm.gtt_space,
 
2923
                                                               size, alignment, obj->cache_level,
 
2924
                                                               0, dev_priv->mm.gtt_mappable_end,
 
2925
                                                               false);
 
2926
        else
 
2927
                free_space = drm_mm_search_free_color_hsw(&dev_priv->mm.gtt_space,
 
2928
                                                      size, alignment, obj->cache_level,
 
2929
                                                      false);
 
2930
 
 
2931
        if (free_space != NULL) {
 
2932
                if (map_and_fenceable)
 
2933
                        free_space =
 
2934
                                drm_mm_get_block_range_generic_hsw(free_space,
 
2935
                                                               size, alignment, obj->cache_level,
 
2936
                                                               0, dev_priv->mm.gtt_mappable_end,
 
2937
                                                               false);
 
2938
                else
 
2939
                        free_space =
 
2940
                                drm_mm_get_block_generic_hsw(free_space,
 
2941
                                                         size, alignment, obj->cache_level,
 
2942
                                                         false);
 
2943
        }
 
2944
        if (free_space == NULL) {
 
2945
                ret = i915_gem_evict_something(dev, size, alignment,
 
2946
                                               obj->cache_level,
 
2947
                                               map_and_fenceable,
 
2948
                                               nonblocking);
 
2949
                if (ret) {
 
2950
                        i915_gem_object_unpin_pages(obj);
 
2951
                        return ret;
 
2952
                }
 
2953
 
 
2954
                goto search_free;
 
2955
        }
 
2956
        if (WARN_ON(!i915_gem_valid_gtt_space(dev,
 
2957
                                              free_space,
 
2958
                                              obj->cache_level))) {
 
2959
                i915_gem_object_unpin_pages(obj);
 
2960
                drm_mm_put_block_hsw(free_space);
 
2961
                return -EINVAL;
 
2962
        }
 
2963
 
 
2964
        ret = i915_gem_gtt_prepare_object(obj);
 
2965
        if (ret) {
 
2966
                i915_gem_object_unpin_pages(obj);
 
2967
                drm_mm_put_block_hsw(free_space);
 
2968
                return ret;
 
2969
        }
 
2970
 
 
2971
        list_move_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
 
2972
        list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
2973
 
 
2974
        obj->gtt_space = free_space;
 
2975
        obj->gtt_offset = free_space->start;
 
2976
 
 
2977
        fenceable =
 
2978
                free_space->size == fence_size &&
 
2979
                (free_space->start & (fence_alignment - 1)) == 0;
 
2980
 
 
2981
        mappable =
 
2982
                obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
 
2983
 
 
2984
        obj->map_and_fenceable = mappable && fenceable;
 
2985
 
 
2986
        i915_gem_object_unpin_pages(obj);
 
2987
        trace_i915_gem_object_bind(obj, map_and_fenceable);
 
2988
        i915_gem_verify_gtt(dev);
 
2989
        return 0;
 
2990
}
 
2991
 
 
2992
void
 
2993
i915_gem_clflush_object(struct drm_i915_gem_object *obj)
 
2994
{
 
2995
        /* If we don't have a page list set up, then we're not pinned
 
2996
         * to GPU, and we can ignore the cache flush because it'll happen
 
2997
         * again at bind time.
 
2998
         */
 
2999
        if (obj->pages == NULL)
 
3000
                return;
 
3001
 
 
3002
        /* If the GPU is snooping the contents of the CPU cache,
 
3003
         * we do not need to manually clear the CPU cache lines.  However,
 
3004
         * the caches are only snooped when the render cache is
 
3005
         * flushed/invalidated.  As we always have to emit invalidations
 
3006
         * and flushes when moving into and out of the RENDER domain, correct
 
3007
         * snooping behaviour occurs naturally as the result of our domain
 
3008
         * tracking.
 
3009
         */
 
3010
        if (obj->cache_level != I915_CACHE_NONE)
 
3011
                return;
 
3012
 
 
3013
        trace_i915_gem_object_clflush(obj);
 
3014
 
 
3015
        drm_clflush_sg(obj->pages);
 
3016
}
 
3017
 
 
3018
/** Flushes the GTT write domain for the object if it's dirty. */
 
3019
static void
 
3020
i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
 
3021
{
 
3022
        uint32_t old_write_domain;
 
3023
 
 
3024
        if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
 
3025
                return;
 
3026
 
 
3027
        /* No actual flushing is required for the GTT write domain.  Writes
 
3028
         * to it immediately go to main memory as far as we know, so there's
 
3029
         * no chipset flush.  It also doesn't land in render cache.
 
3030
         *
 
3031
         * However, we do have to enforce the order so that all writes through
 
3032
         * the GTT land before any writes to the device, such as updates to
 
3033
         * the GATT itself.
 
3034
         */
 
3035
        wmb();
 
3036
 
 
3037
        old_write_domain = obj->base.write_domain;
 
3038
        obj->base.write_domain = 0;
 
3039
 
 
3040
        trace_i915_gem_object_change_domain(obj,
 
3041
                                            obj->base.read_domains,
 
3042
                                            old_write_domain);
 
3043
}
 
3044
 
 
3045
/** Flushes the CPU write domain for the object if it's dirty. */
 
3046
static void
 
3047
i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
 
3048
{
 
3049
        uint32_t old_write_domain;
 
3050
 
 
3051
        if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
 
3052
                return;
 
3053
 
 
3054
        i915_gem_clflush_object(obj);
 
3055
        i915_gem_chipset_flush(obj->base.dev);
 
3056
        old_write_domain = obj->base.write_domain;
 
3057
        obj->base.write_domain = 0;
 
3058
 
 
3059
        trace_i915_gem_object_change_domain(obj,
 
3060
                                            obj->base.read_domains,
 
3061
                                            old_write_domain);
 
3062
}
 
3063
 
 
3064
/**
 
3065
 * Moves a single object to the GTT read, and possibly write domain.
 
3066
 *
 
3067
 * This function returns when the move is complete, including waiting on
 
3068
 * flushes to occur.
 
3069
 */
 
3070
int
 
3071
i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
 
3072
{
 
3073
        drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
 
3074
        uint32_t old_write_domain, old_read_domains;
 
3075
        int ret;
 
3076
 
 
3077
        /* Not valid to be called on unbound objects. */
 
3078
        if (obj->gtt_space == NULL)
 
3079
                return -EINVAL;
 
3080
 
 
3081
        if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
 
3082
                return 0;
 
3083
 
 
3084
        ret = i915_gem_object_wait_rendering(obj, !write);
 
3085
        if (ret)
 
3086
                return ret;
 
3087
 
 
3088
        i915_gem_object_flush_cpu_write_domain(obj);
 
3089
 
 
3090
        old_write_domain = obj->base.write_domain;
 
3091
        old_read_domains = obj->base.read_domains;
 
3092
 
 
3093
        /* It should now be out of any other write domains, and we can update
 
3094
         * the domain values for our changes.
 
3095
         */
 
3096
        BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
 
3097
        obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
 
3098
        if (write) {
 
3099
                obj->base.read_domains = I915_GEM_DOMAIN_GTT;
 
3100
                obj->base.write_domain = I915_GEM_DOMAIN_GTT;
 
3101
                obj->dirty = 1;
 
3102
        }
 
3103
 
 
3104
        trace_i915_gem_object_change_domain(obj,
 
3105
                                            old_read_domains,
 
3106
                                            old_write_domain);
 
3107
 
 
3108
        /* And bump the LRU for this access */
 
3109
        if (i915_gem_object_is_inactive(obj))
 
3110
                list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
3111
 
 
3112
        return 0;
 
3113
}
 
3114
 
 
3115
int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
 
3116
                                    enum i915_cache_level cache_level)
 
3117
{
 
3118
        struct drm_device *dev = obj->base.dev;
 
3119
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3120
        int ret;
 
3121
 
 
3122
        if (obj->cache_level == cache_level)
 
3123
                return 0;
 
3124
 
 
3125
        if (obj->pin_count) {
 
3126
                DRM_DEBUG("can not change the cache level of pinned objects\n");
 
3127
                return -EBUSY;
 
3128
        }
 
3129
 
 
3130
        if (!i915_gem_valid_gtt_space(dev, obj->gtt_space, cache_level)) {
 
3131
                ret = i915_gem_object_unbind(obj);
 
3132
                if (ret)
 
3133
                        return ret;
 
3134
        }
 
3135
 
 
3136
        if (obj->gtt_space) {
 
3137
                ret = i915_gem_object_finish_gpu(obj);
 
3138
                if (ret)
 
3139
                        return ret;
 
3140
 
 
3141
                i915_gem_object_finish_gtt(obj);
 
3142
 
 
3143
                /* Before SandyBridge, you could not use tiling or fence
 
3144
                 * registers with snooped memory, so relinquish any fences
 
3145
                 * currently pointing to our region in the aperture.
 
3146
                 */
 
3147
                if (INTEL_INFO(dev)->gen < 6) {
 
3148
                        ret = i915_gem_object_put_fence(obj);
 
3149
                        if (ret)
 
3150
                                return ret;
 
3151
                }
 
3152
 
 
3153
                if (obj->has_global_gtt_mapping)
 
3154
                        i915_gem_gtt_bind_object(obj, cache_level);
 
3155
                if (obj->has_aliasing_ppgtt_mapping)
 
3156
                        i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
 
3157
                                               obj, cache_level);
 
3158
 
 
3159
                obj->gtt_space->color = cache_level;
 
3160
        }
 
3161
 
 
3162
        if (cache_level == I915_CACHE_NONE) {
 
3163
                u32 old_read_domains, old_write_domain;
 
3164
 
 
3165
                /* If we're coming from LLC cached, then we haven't
 
3166
                 * actually been tracking whether the data is in the
 
3167
                 * CPU cache or not, since we only allow one bit set
 
3168
                 * in obj->write_domain and have been skipping the clflushes.
 
3169
                 * Just set it to the CPU cache for now.
 
3170
                 */
 
3171
                WARN_ON(obj->base.write_domain & ~I915_GEM_DOMAIN_CPU);
 
3172
                WARN_ON(obj->base.read_domains & ~I915_GEM_DOMAIN_CPU);
 
3173
 
 
3174
                old_read_domains = obj->base.read_domains;
 
3175
                old_write_domain = obj->base.write_domain;
 
3176
 
 
3177
                obj->base.read_domains = I915_GEM_DOMAIN_CPU;
 
3178
                obj->base.write_domain = I915_GEM_DOMAIN_CPU;
 
3179
 
 
3180
                trace_i915_gem_object_change_domain(obj,
 
3181
                                                    old_read_domains,
 
3182
                                                    old_write_domain);
 
3183
        }
 
3184
 
 
3185
        obj->cache_level = cache_level;
 
3186
        i915_gem_verify_gtt(dev);
 
3187
        return 0;
 
3188
}
 
3189
 
 
3190
int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data,
 
3191
                               struct drm_file *file)
 
3192
{
 
3193
        struct drm_i915_gem_caching *args = data;
 
3194
        struct drm_i915_gem_object *obj;
 
3195
        int ret;
 
3196
 
 
3197
        ret = i915_mutex_lock_interruptible(dev);
 
3198
        if (ret)
 
3199
                return ret;
 
3200
 
 
3201
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
3202
        if (&obj->base == NULL) {
 
3203
                ret = -ENOENT;
 
3204
                goto unlock;
 
3205
        }
 
3206
 
 
3207
        args->caching = obj->cache_level != I915_CACHE_NONE;
 
3208
 
 
3209
        drm_gem_object_unreference(&obj->base);
 
3210
unlock:
 
3211
        mutex_unlock(&dev->struct_mutex);
 
3212
        return ret;
 
3213
}
 
3214
 
 
3215
int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
 
3216
                               struct drm_file *file)
 
3217
{
 
3218
        struct drm_i915_gem_caching *args = data;
 
3219
        struct drm_i915_gem_object *obj;
 
3220
        enum i915_cache_level level;
 
3221
        int ret;
 
3222
 
 
3223
        switch (args->caching) {
 
3224
        case I915_CACHING_NONE:
 
3225
                level = I915_CACHE_NONE;
 
3226
                break;
 
3227
        case I915_CACHING_CACHED:
 
3228
                level = I915_CACHE_LLC;
 
3229
                break;
 
3230
        default:
 
3231
                return -EINVAL;
 
3232
        }
 
3233
 
 
3234
        ret = i915_mutex_lock_interruptible(dev);
 
3235
        if (ret)
 
3236
                return ret;
 
3237
 
 
3238
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
3239
        if (&obj->base == NULL) {
 
3240
                ret = -ENOENT;
 
3241
                goto unlock;
 
3242
        }
 
3243
 
 
3244
        ret = i915_gem_object_set_cache_level(obj, level);
 
3245
 
 
3246
        drm_gem_object_unreference(&obj->base);
 
3247
unlock:
 
3248
        mutex_unlock(&dev->struct_mutex);
 
3249
        return ret;
 
3250
}
 
3251
 
 
3252
/*
 
3253
 * Prepare buffer for display plane (scanout, cursors, etc).
 
3254
 * Can be called from an uninterruptible phase (modesetting) and allows
 
3255
 * any flushes to be pipelined (for pageflips).
 
3256
 */
 
3257
int
 
3258
i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
 
3259
                                     u32 alignment,
 
3260
                                     struct intel_ring_buffer *pipelined)
 
3261
{
 
3262
        u32 old_read_domains, old_write_domain;
 
3263
        int ret;
 
3264
 
 
3265
        if (pipelined != obj->ring) {
 
3266
                ret = i915_gem_object_sync(obj, pipelined);
 
3267
                if (ret)
 
3268
                        return ret;
 
3269
        }
 
3270
 
 
3271
        /* The display engine is not coherent with the LLC cache on gen6.  As
 
3272
         * a result, we make sure that the pinning that is about to occur is
 
3273
         * done with uncached PTEs. This is lowest common denominator for all
 
3274
         * chipsets.
 
3275
         *
 
3276
         * However for gen6+, we could do better by using the GFDT bit instead
 
3277
         * of uncaching, which would allow us to flush all the LLC-cached data
 
3278
         * with that bit in the PTE to main memory with just one PIPE_CONTROL.
 
3279
         */
 
3280
        ret = i915_gem_object_set_cache_level(obj, I915_CACHE_NONE);
 
3281
        if (ret)
 
3282
                return ret;
 
3283
 
 
3284
        /* As the user may map the buffer once pinned in the display plane
 
3285
         * (e.g. libkms for the bootup splash), we have to ensure that we
 
3286
         * always use map_and_fenceable for all scanout buffers.
 
3287
         */
 
3288
        ret = i915_gem_object_pin(obj, alignment, true, false);
 
3289
        if (ret)
 
3290
                return ret;
 
3291
 
 
3292
        i915_gem_object_flush_cpu_write_domain(obj);
 
3293
 
 
3294
        old_write_domain = obj->base.write_domain;
 
3295
        old_read_domains = obj->base.read_domains;
 
3296
 
 
3297
        /* It should now be out of any other write domains, and we can update
 
3298
         * the domain values for our changes.
 
3299
         */
 
3300
        obj->base.write_domain = 0;
 
3301
        obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
 
3302
 
 
3303
        trace_i915_gem_object_change_domain(obj,
 
3304
                                            old_read_domains,
 
3305
                                            old_write_domain);
 
3306
 
 
3307
        return 0;
 
3308
}
 
3309
 
 
3310
int
 
3311
i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
 
3312
{
 
3313
        int ret;
 
3314
 
 
3315
        if ((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0)
 
3316
                return 0;
 
3317
 
 
3318
        ret = i915_gem_object_wait_rendering(obj, false);
 
3319
        if (ret)
 
3320
                return ret;
 
3321
 
 
3322
        /* Ensure that we invalidate the GPU's caches and TLBs. */
 
3323
        obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
 
3324
        return 0;
 
3325
}
 
3326
 
 
3327
/**
 
3328
 * Moves a single object to the CPU read, and possibly write domain.
 
3329
 *
 
3330
 * This function returns when the move is complete, including waiting on
 
3331
 * flushes to occur.
 
3332
 */
 
3333
int
 
3334
i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
 
3335
{
 
3336
        uint32_t old_write_domain, old_read_domains;
 
3337
        int ret;
 
3338
 
 
3339
        if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
 
3340
                return 0;
 
3341
 
 
3342
        ret = i915_gem_object_wait_rendering(obj, !write);
 
3343
        if (ret)
 
3344
                return ret;
 
3345
 
 
3346
        i915_gem_object_flush_gtt_write_domain(obj);
 
3347
 
 
3348
        old_write_domain = obj->base.write_domain;
 
3349
        old_read_domains = obj->base.read_domains;
 
3350
 
 
3351
        /* Flush the CPU cache if it's still invalid. */
 
3352
        if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
 
3353
                i915_gem_clflush_object(obj);
 
3354
 
 
3355
                obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
 
3356
        }
 
3357
 
 
3358
        /* It should now be out of any other write domains, and we can update
 
3359
         * the domain values for our changes.
 
3360
         */
 
3361
        BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
 
3362
 
 
3363
        /* If we're writing through the CPU, then the GPU read domains will
 
3364
         * need to be invalidated at next use.
 
3365
         */
 
3366
        if (write) {
 
3367
                obj->base.read_domains = I915_GEM_DOMAIN_CPU;
 
3368
                obj->base.write_domain = I915_GEM_DOMAIN_CPU;
 
3369
        }
 
3370
 
 
3371
        trace_i915_gem_object_change_domain(obj,
 
3372
                                            old_read_domains,
 
3373
                                            old_write_domain);
 
3374
 
 
3375
        return 0;
 
3376
}
 
3377
 
 
3378
/* Throttle our rendering by waiting until the ring has completed our requests
 
3379
 * emitted over 20 msec ago.
 
3380
 *
 
3381
 * Note that if we were to use the current jiffies each time around the loop,
 
3382
 * we wouldn't escape the function with any frames outstanding if the time to
 
3383
 * render a frame was over 20ms.
 
3384
 *
 
3385
 * This should get us reasonable parallelism between CPU and GPU but also
 
3386
 * relatively low latency when blocking on a particular request to finish.
 
3387
 */
 
3388
static int
 
3389
i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
 
3390
{
 
3391
        struct drm_i915_private *dev_priv = dev->dev_private;
 
3392
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
3393
        unsigned long recent_enough = jiffies - msecs_to_jiffies(20);
 
3394
        struct drm_i915_gem_request *request;
 
3395
        struct intel_ring_buffer *ring = NULL;
 
3396
        u32 seqno = 0;
 
3397
        int ret;
 
3398
 
 
3399
        if (atomic_read(&dev_priv->mm.wedged))
 
3400
                return -EIO;
 
3401
 
 
3402
        spin_lock(&file_priv->mm.lock);
 
3403
        list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
 
3404
                if (time_after_eq(request->emitted_jiffies, recent_enough))
 
3405
                        break;
 
3406
 
 
3407
                ring = request->ring;
 
3408
                seqno = request->seqno;
 
3409
        }
 
3410
        spin_unlock(&file_priv->mm.lock);
 
3411
 
 
3412
        if (seqno == 0)
 
3413
                return 0;
 
3414
 
 
3415
        ret = __wait_seqno(ring, seqno, true, NULL);
 
3416
        if (ret == 0)
 
3417
                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0);
 
3418
 
 
3419
        return ret;
 
3420
}
 
3421
 
 
3422
int
 
3423
i915_gem_object_pin(struct drm_i915_gem_object *obj,
 
3424
                    uint32_t alignment,
 
3425
                    bool map_and_fenceable,
 
3426
                    bool nonblocking)
 
3427
{
 
3428
        int ret;
 
3429
 
 
3430
        if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
 
3431
                return -EBUSY;
 
3432
 
 
3433
        if (obj->gtt_space != NULL) {
 
3434
                if ((alignment && obj->gtt_offset & (alignment - 1)) ||
 
3435
                    (map_and_fenceable && !obj->map_and_fenceable)) {
 
3436
                        WARN(obj->pin_count,
 
3437
                             "bo is already pinned with incorrect alignment:"
 
3438
                             " offset=%x, req.alignment=%x, req.map_and_fenceable=%d,"
 
3439
                             " obj->map_and_fenceable=%d\n",
 
3440
                             obj->gtt_offset, alignment,
 
3441
                             map_and_fenceable,
 
3442
                             obj->map_and_fenceable);
 
3443
                        ret = i915_gem_object_unbind(obj);
 
3444
                        if (ret)
 
3445
                                return ret;
 
3446
                }
 
3447
        }
 
3448
 
 
3449
        if (obj->gtt_space == NULL) {
 
3450
                struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 
3451
 
 
3452
                ret = i915_gem_object_bind_to_gtt(obj, alignment,
 
3453
                                                  map_and_fenceable,
 
3454
                                                  nonblocking);
 
3455
                if (ret)
 
3456
                        return ret;
 
3457
 
 
3458
                if (!dev_priv->mm.aliasing_ppgtt)
 
3459
                        i915_gem_gtt_bind_object(obj, obj->cache_level);
 
3460
        }
 
3461
 
 
3462
        if (!obj->has_global_gtt_mapping && map_and_fenceable)
 
3463
                i915_gem_gtt_bind_object(obj, obj->cache_level);
 
3464
 
 
3465
        obj->pin_count++;
 
3466
        obj->pin_mappable |= map_and_fenceable;
 
3467
 
 
3468
        return 0;
 
3469
}
 
3470
 
 
3471
void
 
3472
i915_gem_object_unpin(struct drm_i915_gem_object *obj)
 
3473
{
 
3474
        BUG_ON(obj->pin_count == 0);
 
3475
        BUG_ON(obj->gtt_space == NULL);
 
3476
 
 
3477
        if (--obj->pin_count == 0)
 
3478
                obj->pin_mappable = false;
 
3479
}
 
3480
 
 
3481
int
 
3482
i915_gem_pin_ioctl(struct drm_device *dev, void *data,
 
3483
                   struct drm_file *file)
 
3484
{
 
3485
        struct drm_i915_gem_pin *args = data;
 
3486
        struct drm_i915_gem_object *obj;
 
3487
        int ret;
 
3488
 
 
3489
        ret = i915_mutex_lock_interruptible(dev);
 
3490
        if (ret)
 
3491
                return ret;
 
3492
 
 
3493
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
3494
        if (&obj->base == NULL) {
 
3495
                ret = -ENOENT;
 
3496
                goto unlock;
 
3497
        }
 
3498
 
 
3499
        if (obj->madv != I915_MADV_WILLNEED) {
 
3500
                DRM_ERROR("Attempting to pin a purgeable buffer\n");
 
3501
                ret = -EINVAL;
 
3502
                goto out;
 
3503
        }
 
3504
 
 
3505
        if (obj->pin_filp != NULL && obj->pin_filp != file) {
 
3506
                DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
 
3507
                          args->handle);
 
3508
                ret = -EINVAL;
 
3509
                goto out;
 
3510
        }
 
3511
 
 
3512
        obj->user_pin_count++;
 
3513
        obj->pin_filp = file;
 
3514
        if (obj->user_pin_count == 1) {
 
3515
                ret = i915_gem_object_pin(obj, args->alignment, true, false);
 
3516
                if (ret)
 
3517
                        goto out;
 
3518
        }
 
3519
 
 
3520
        /* XXX - flush the CPU caches for pinned objects
 
3521
         * as the X server doesn't manage domains yet
 
3522
         */
 
3523
        i915_gem_object_flush_cpu_write_domain(obj);
 
3524
        args->offset = obj->gtt_offset;
 
3525
out:
 
3526
        drm_gem_object_unreference(&obj->base);
 
3527
unlock:
 
3528
        mutex_unlock(&dev->struct_mutex);
 
3529
        return ret;
 
3530
}
 
3531
 
 
3532
int
 
3533
i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
 
3534
                     struct drm_file *file)
 
3535
{
 
3536
        struct drm_i915_gem_pin *args = data;
 
3537
        struct drm_i915_gem_object *obj;
 
3538
        int ret;
 
3539
 
 
3540
        ret = i915_mutex_lock_interruptible(dev);
 
3541
        if (ret)
 
3542
                return ret;
 
3543
 
 
3544
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
3545
        if (&obj->base == NULL) {
 
3546
                ret = -ENOENT;
 
3547
                goto unlock;
 
3548
        }
 
3549
 
 
3550
        if (obj->pin_filp != file) {
 
3551
                DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
 
3552
                          args->handle);
 
3553
                ret = -EINVAL;
 
3554
                goto out;
 
3555
        }
 
3556
        obj->user_pin_count--;
 
3557
        if (obj->user_pin_count == 0) {
 
3558
                obj->pin_filp = NULL;
 
3559
                i915_gem_object_unpin(obj);
 
3560
        }
 
3561
 
 
3562
out:
 
3563
        drm_gem_object_unreference(&obj->base);
 
3564
unlock:
 
3565
        mutex_unlock(&dev->struct_mutex);
 
3566
        return ret;
 
3567
}
 
3568
 
 
3569
int
 
3570
i915_gem_busy_ioctl(struct drm_device *dev, void *data,
 
3571
                    struct drm_file *file)
 
3572
{
 
3573
        struct drm_i915_gem_busy *args = data;
 
3574
        struct drm_i915_gem_object *obj;
 
3575
        int ret;
 
3576
 
 
3577
        ret = i915_mutex_lock_interruptible(dev);
 
3578
        if (ret)
 
3579
                return ret;
 
3580
 
 
3581
        obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 
3582
        if (&obj->base == NULL) {
 
3583
                ret = -ENOENT;
 
3584
                goto unlock;
 
3585
        }
 
3586
 
 
3587
        /* Count all active objects as busy, even if they are currently not used
 
3588
         * by the gpu. Users of this interface expect objects to eventually
 
3589
         * become non-busy without any further actions, therefore emit any
 
3590
         * necessary flushes here.
 
3591
         */
 
3592
        ret = i915_gem_object_flush_active(obj);
 
3593
 
 
3594
        args->busy = obj->active;
 
3595
        if (obj->ring) {
 
3596
                BUILD_BUG_ON(I915_NUM_RINGS > 16);
 
3597
                args->busy |= intel_ring_flag(obj->ring) << 16;
 
3598
        }
 
3599
 
 
3600
        drm_gem_object_unreference(&obj->base);
 
3601
unlock:
 
3602
        mutex_unlock(&dev->struct_mutex);
 
3603
        return ret;
 
3604
}
 
3605
 
 
3606
int
 
3607
i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
 
3608
                        struct drm_file *file_priv)
 
3609
{
 
3610
        return i915_gem_ring_throttle(dev, file_priv);
 
3611
}
 
3612
 
 
3613
int
 
3614
i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
 
3615
                       struct drm_file *file_priv)
 
3616
{
 
3617
        struct drm_i915_gem_madvise *args = data;
 
3618
        struct drm_i915_gem_object *obj;
 
3619
        int ret;
 
3620
 
 
3621
        switch (args->madv) {
 
3622
        case I915_MADV_DONTNEED:
 
3623
        case I915_MADV_WILLNEED:
 
3624
            break;
 
3625
        default:
 
3626
            return -EINVAL;
 
3627
        }
 
3628
 
 
3629
        ret = i915_mutex_lock_interruptible(dev);
 
3630
        if (ret)
 
3631
                return ret;
 
3632
 
 
3633
        obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
 
3634
        if (&obj->base == NULL) {
 
3635
                ret = -ENOENT;
 
3636
                goto unlock;
 
3637
        }
 
3638
 
 
3639
        if (obj->pin_count) {
 
3640
                ret = -EINVAL;
 
3641
                goto out;
 
3642
        }
 
3643
 
 
3644
        if (obj->madv != __I915_MADV_PURGED)
 
3645
                obj->madv = args->madv;
 
3646
 
 
3647
        /* if the object is no longer attached, discard its backing storage */
 
3648
        if (i915_gem_object_is_purgeable(obj) && obj->pages == NULL)
 
3649
                i915_gem_object_truncate(obj);
 
3650
 
 
3651
        args->retained = obj->madv != __I915_MADV_PURGED;
 
3652
 
 
3653
out:
 
3654
        drm_gem_object_unreference(&obj->base);
 
3655
unlock:
 
3656
        mutex_unlock(&dev->struct_mutex);
 
3657
        return ret;
 
3658
}
 
3659
 
 
3660
void i915_gem_object_init(struct drm_i915_gem_object *obj,
 
3661
                          const struct drm_i915_gem_object_ops *ops)
 
3662
{
 
3663
        INIT_LIST_HEAD(&obj->mm_list);
 
3664
        INIT_LIST_HEAD(&obj->gtt_list);
 
3665
        INIT_LIST_HEAD(&obj->ring_list);
 
3666
        INIT_LIST_HEAD(&obj->exec_list);
 
3667
 
 
3668
        obj->ops = ops;
 
3669
 
 
3670
        obj->fence_reg = I915_FENCE_REG_NONE;
 
3671
        obj->madv = I915_MADV_WILLNEED;
 
3672
        /* Avoid an unnecessary call to unbind on the first bind. */
 
3673
        obj->map_and_fenceable = true;
 
3674
 
 
3675
        i915_gem_info_add_obj(obj->base.dev->dev_private, obj->base.size);
 
3676
}
 
3677
 
 
3678
static const struct drm_i915_gem_object_ops i915_gem_object_ops = {
 
3679
        .get_pages = i915_gem_object_get_pages_gtt,
 
3680
        .put_pages = i915_gem_object_put_pages_gtt,
 
3681
};
 
3682
 
 
3683
struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
 
3684
                                                  size_t size)
 
3685
{
 
3686
        struct drm_i915_gem_object *obj;
 
3687
        struct address_space *mapping;
 
3688
        u32 mask;
 
3689
 
 
3690
        obj = kzalloc(sizeof(*obj), GFP_KERNEL);
 
3691
        if (obj == NULL)
 
3692
                return NULL;
 
3693
 
 
3694
        if (drm_gem_object_init(dev, &obj->base, size) != 0) {
 
3695
                kfree(obj);
 
3696
                return NULL;
 
3697
        }
 
3698
 
 
3699
        mask = GFP_HIGHUSER | __GFP_RECLAIMABLE;
 
3700
        if (IS_CRESTLINE(dev) || IS_BROADWATER(dev)) {
 
3701
                /* 965gm cannot relocate objects above 4GiB. */
 
3702
                mask &= ~__GFP_HIGHMEM;
 
3703
                mask |= __GFP_DMA32;
 
3704
        }
 
3705
 
 
3706
        mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
 
3707
        mapping_set_gfp_mask(mapping, mask);
 
3708
 
 
3709
        i915_gem_object_init(obj, &i915_gem_object_ops);
 
3710
 
 
3711
        obj->base.write_domain = I915_GEM_DOMAIN_CPU;
 
3712
        obj->base.read_domains = I915_GEM_DOMAIN_CPU;
 
3713
 
 
3714
        if (HAS_LLC(dev)) {
 
3715
                /* On some devices, we can have the GPU use the LLC (the CPU
 
3716
                 * cache) for about a 10% performance improvement
 
3717
                 * compared to uncached.  Graphics requests other than
 
3718
                 * display scanout are coherent with the CPU in
 
3719
                 * accessing this cache.  This means in this mode we
 
3720
                 * don't need to clflush on the CPU side, and on the
 
3721
                 * GPU side we only need to flush internal caches to
 
3722
                 * get data visible to the CPU.
 
3723
                 *
 
3724
                 * However, we maintain the display planes as UC, and so
 
3725
                 * need to rebind when first used as such.
 
3726
                 */
 
3727
                obj->cache_level = I915_CACHE_LLC;
 
3728
        } else
 
3729
                obj->cache_level = I915_CACHE_NONE;
 
3730
 
 
3731
        return obj;
 
3732
}
 
3733
 
 
3734
int i915_gem_init_object(struct drm_gem_object *obj)
 
3735
{
 
3736
        BUG();
 
3737
 
 
3738
        return 0;
 
3739
}
 
3740
 
 
3741
void i915_gem_free_object(struct drm_gem_object *gem_obj)
 
3742
{
 
3743
        struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
 
3744
        struct drm_device *dev = obj->base.dev;
 
3745
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3746
 
 
3747
        trace_i915_gem_object_destroy(obj);
 
3748
 
 
3749
        if (obj->phys_obj)
 
3750
                i915_gem_detach_phys_object(dev, obj);
 
3751
 
 
3752
        obj->pin_count = 0;
 
3753
        if (WARN_ON(i915_gem_object_unbind(obj) == -ERESTARTSYS)) {
 
3754
                bool was_interruptible;
 
3755
 
 
3756
                was_interruptible = dev_priv->mm.interruptible;
 
3757
                dev_priv->mm.interruptible = false;
 
3758
 
 
3759
                WARN_ON(i915_gem_object_unbind(obj));
 
3760
 
 
3761
                dev_priv->mm.interruptible = was_interruptible;
 
3762
        }
 
3763
 
 
3764
        obj->pages_pin_count = 0;
 
3765
        i915_gem_object_put_pages(obj);
 
3766
        i915_gem_object_free_mmap_offset(obj);
 
3767
 
 
3768
        BUG_ON(obj->pages);
 
3769
 
 
3770
        if (obj->base.import_attach)
 
3771
                drm_prime_gem_destroy(&obj->base, NULL);
 
3772
 
 
3773
        drm_gem_object_release(&obj->base);
 
3774
        i915_gem_info_remove_obj(dev_priv, obj->base.size);
 
3775
 
 
3776
        kfree(obj->bit_17);
 
3777
        kfree(obj);
 
3778
}
 
3779
 
 
3780
int
 
3781
i915_gem_idle(struct drm_device *dev)
 
3782
{
 
3783
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3784
        int ret;
 
3785
 
 
3786
        mutex_lock(&dev->struct_mutex);
 
3787
 
 
3788
        if (dev_priv->mm.suspended) {
 
3789
                mutex_unlock(&dev->struct_mutex);
 
3790
                return 0;
 
3791
        }
 
3792
 
 
3793
        ret = i915_gpu_idle(dev);
 
3794
        if (ret) {
 
3795
                mutex_unlock(&dev->struct_mutex);
 
3796
                return ret;
 
3797
        }
 
3798
        i915_gem_retire_requests(dev);
 
3799
 
 
3800
        /* Under UMS, be paranoid and evict. */
 
3801
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
 
3802
                i915_gem_evict_everything(dev);
 
3803
 
 
3804
        i915_gem_reset_fences(dev);
 
3805
 
 
3806
        /* Hack!  Don't let anybody do execbuf while we don't control the chip.
 
3807
         * We need to replace this with a semaphore, or something.
 
3808
         * And not confound mm.suspended!
 
3809
         */
 
3810
        dev_priv->mm.suspended = 1;
 
3811
        del_timer_sync(&dev_priv->hangcheck_timer);
 
3812
 
 
3813
        i915_kernel_lost_context(dev);
 
3814
        i915_gem_cleanup_ringbuffer(dev);
 
3815
 
 
3816
        mutex_unlock(&dev->struct_mutex);
 
3817
 
 
3818
        /* Cancel the retire work handler, which should be idle now. */
 
3819
        cancel_delayed_work_sync(&dev_priv->mm.retire_work);
 
3820
 
 
3821
        return 0;
 
3822
}
 
3823
 
 
3824
void i915_gem_l3_remap(struct drm_device *dev)
 
3825
{
 
3826
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3827
        u32 misccpctl;
 
3828
        int i;
 
3829
 
 
3830
        if (!IS_IVYBRIDGE(dev))
 
3831
                return;
 
3832
 
 
3833
        if (!dev_priv->l3_parity.remap_info)
 
3834
                return;
 
3835
 
 
3836
        misccpctl = I915_READ(GEN7_MISCCPCTL);
 
3837
        I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
 
3838
        POSTING_READ(GEN7_MISCCPCTL);
 
3839
 
 
3840
        for (i = 0; i < GEN7_L3LOG_SIZE; i += 4) {
 
3841
                u32 remap = I915_READ(GEN7_L3LOG_BASE + i);
 
3842
                if (remap && remap != dev_priv->l3_parity.remap_info[i/4])
 
3843
                        DRM_DEBUG("0x%x was already programmed to %x\n",
 
3844
                                  GEN7_L3LOG_BASE + i, remap);
 
3845
                if (remap && !dev_priv->l3_parity.remap_info[i/4])
 
3846
                        DRM_DEBUG_DRIVER("Clearing remapped register\n");
 
3847
                I915_WRITE(GEN7_L3LOG_BASE + i, dev_priv->l3_parity.remap_info[i/4]);
 
3848
        }
 
3849
 
 
3850
        /* Make sure all the writes land before disabling dop clock gating */
 
3851
        POSTING_READ(GEN7_L3LOG_BASE);
 
3852
 
 
3853
        I915_WRITE(GEN7_MISCCPCTL, misccpctl);
 
3854
}
 
3855
 
 
3856
void i915_gem_init_swizzling(struct drm_device *dev)
 
3857
{
 
3858
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3859
 
 
3860
        if (INTEL_INFO(dev)->gen < 5 ||
 
3861
            dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
 
3862
                return;
 
3863
 
 
3864
        I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
 
3865
                                 DISP_TILE_SURFACE_SWIZZLING);
 
3866
 
 
3867
        if (IS_GEN5(dev))
 
3868
                return;
 
3869
 
 
3870
        I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
 
3871
        if (IS_GEN6(dev))
 
3872
                I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_SNB));
 
3873
        else
 
3874
                I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB));
 
3875
}
 
3876
 
 
3877
static bool
 
3878
intel_enable_blt(struct drm_device *dev)
 
3879
{
 
3880
        if (!HAS_BLT(dev))
 
3881
                return false;
 
3882
 
 
3883
        /* The blitter was dysfunctional on early prototypes */
 
3884
        if (IS_GEN6(dev) && dev->pdev->revision < 8) {
 
3885
                DRM_INFO("BLT not supported on this pre-production hardware;"
 
3886
                         " graphics performance will be degraded.\n");
 
3887
                return false;
 
3888
        }
 
3889
 
 
3890
        return true;
 
3891
}
 
3892
 
 
3893
int
 
3894
i915_gem_init_hw(struct drm_device *dev)
 
3895
{
 
3896
        drm_i915_private_t *dev_priv = dev->dev_private;
 
3897
        int ret;
 
3898
 
 
3899
        if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
 
3900
                return -EIO;
 
3901
 
 
3902
        if (IS_HASWELL(dev) && (I915_READ(0x120010) == 1))
 
3903
                I915_WRITE(0x9008, I915_READ(0x9008) | 0xf0000);
 
3904
 
 
3905
        i915_gem_l3_remap(dev);
 
3906
 
 
3907
        i915_gem_init_swizzling(dev);
 
3908
 
 
3909
        ret = intel_init_render_ring_buffer(dev);
 
3910
        if (ret)
 
3911
                return ret;
 
3912
 
 
3913
        if (HAS_BSD(dev)) {
 
3914
                ret = intel_init_bsd_ring_buffer(dev);
 
3915
                if (ret)
 
3916
                        goto cleanup_render_ring;
 
3917
        }
 
3918
 
 
3919
        if (intel_enable_blt(dev)) {
 
3920
                ret = intel_init_blt_ring_buffer(dev);
 
3921
                if (ret)
 
3922
                        goto cleanup_bsd_ring;
 
3923
        }
 
3924
 
 
3925
        dev_priv->next_seqno = 1;
 
3926
 
 
3927
        /*
 
3928
         * XXX: There was some w/a described somewhere suggesting loading
 
3929
         * contexts before PPGTT.
 
3930
         */
 
3931
        i915_gem_context_init(dev);
 
3932
        i915_gem_init_ppgtt(dev);
 
3933
 
 
3934
        return 0;
 
3935
 
 
3936
cleanup_bsd_ring:
 
3937
        intel_cleanup_ring_buffer(&dev_priv->ring[VCS]);
 
3938
cleanup_render_ring:
 
3939
        intel_cleanup_ring_buffer(&dev_priv->ring[RCS]);
 
3940
        return ret;
 
3941
}
 
3942
 
 
3943
static bool
 
3944
intel_enable_ppgtt(struct drm_device *dev)
 
3945
{
 
3946
        if (i915_enable_ppgtt >= 0)
 
3947
                return i915_enable_ppgtt;
 
3948
 
 
3949
#ifdef CONFIG_INTEL_IOMMU
 
3950
        /* Disable ppgtt on SNB if VT-d is on. */
 
3951
        if (INTEL_INFO(dev)->gen == 6 && intel_iommu_gfx_mapped)
 
3952
                return false;
 
3953
#endif
 
3954
 
 
3955
        return true;
 
3956
}
 
3957
 
 
3958
int i915_gem_init(struct drm_device *dev)
 
3959
{
 
3960
        struct drm_i915_private *dev_priv = dev->dev_private;
 
3961
        unsigned long gtt_size, mappable_size;
 
3962
        int ret;
 
3963
 
 
3964
        gtt_size = dev_priv->mm.gtt->gtt_total_entries << PAGE_SHIFT;
 
3965
        mappable_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
 
3966
 
 
3967
        mutex_lock(&dev->struct_mutex);
 
3968
        if (intel_enable_ppgtt(dev) && HAS_ALIASING_PPGTT(dev)) {
 
3969
                /* PPGTT pdes are stolen from global gtt ptes, so shrink the
 
3970
                 * aperture accordingly when using aliasing ppgtt. */
 
3971
                gtt_size -= I915_PPGTT_PD_ENTRIES*PAGE_SIZE;
 
3972
 
 
3973
                i915_gem_init_global_gtt(dev, 0, mappable_size, gtt_size);
 
3974
 
 
3975
                ret = i915_gem_init_aliasing_ppgtt(dev);
 
3976
                if (ret) {
 
3977
                        mutex_unlock(&dev->struct_mutex);
 
3978
                        return ret;
 
3979
                }
 
3980
        } else {
 
3981
                /* Let GEM Manage all of the aperture.
 
3982
                 *
 
3983
                 * However, leave one page at the end still bound to the scratch
 
3984
                 * page.  There are a number of places where the hardware
 
3985
                 * apparently prefetches past the end of the object, and we've
 
3986
                 * seen multiple hangs with the GPU head pointer stuck in a
 
3987
                 * batchbuffer bound at the last page of the aperture.  One page
 
3988
                 * should be enough to keep any prefetching inside of the
 
3989
                 * aperture.
 
3990
                 */
 
3991
                i915_gem_init_global_gtt(dev, 0, mappable_size,
 
3992
                                         gtt_size);
 
3993
        }
 
3994
 
 
3995
        ret = i915_gem_init_hw(dev);
 
3996
        mutex_unlock(&dev->struct_mutex);
 
3997
        if (ret) {
 
3998
                i915_gem_cleanup_aliasing_ppgtt(dev);
 
3999
                return ret;
 
4000
        }
 
4001
 
 
4002
        /* Allow hardware batchbuffers unless told otherwise, but not for KMS. */
 
4003
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
 
4004
                dev_priv->dri1.allow_batchbuffer = 1;
 
4005
        return 0;
 
4006
}
 
4007
 
 
4008
void
 
4009
i915_gem_cleanup_ringbuffer(struct drm_device *dev)
 
4010
{
 
4011
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4012
        struct intel_ring_buffer *ring;
 
4013
        int i;
 
4014
 
 
4015
        for_each_ring(ring, dev_priv, i)
 
4016
                intel_cleanup_ring_buffer(ring);
 
4017
}
 
4018
 
 
4019
int
 
4020
i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
 
4021
                       struct drm_file *file_priv)
 
4022
{
 
4023
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4024
        int ret;
 
4025
 
 
4026
        if (drm_core_check_feature(dev, DRIVER_MODESET))
 
4027
                return 0;
 
4028
 
 
4029
        if (atomic_read(&dev_priv->mm.wedged)) {
 
4030
                DRM_ERROR("Reenabling wedged hardware, good luck\n");
 
4031
                atomic_set(&dev_priv->mm.wedged, 0);
 
4032
        }
 
4033
 
 
4034
        mutex_lock(&dev->struct_mutex);
 
4035
        dev_priv->mm.suspended = 0;
 
4036
 
 
4037
        ret = i915_gem_init_hw(dev);
 
4038
        if (ret != 0) {
 
4039
                mutex_unlock(&dev->struct_mutex);
 
4040
                return ret;
 
4041
        }
 
4042
 
 
4043
        BUG_ON(!list_empty(&dev_priv->mm.active_list));
 
4044
        mutex_unlock(&dev->struct_mutex);
 
4045
 
 
4046
        ret = drm_irq_install(dev);
 
4047
        if (ret)
 
4048
                goto cleanup_ringbuffer;
 
4049
 
 
4050
        return 0;
 
4051
 
 
4052
cleanup_ringbuffer:
 
4053
        mutex_lock(&dev->struct_mutex);
 
4054
        i915_gem_cleanup_ringbuffer(dev);
 
4055
        dev_priv->mm.suspended = 1;
 
4056
        mutex_unlock(&dev->struct_mutex);
 
4057
 
 
4058
        return ret;
 
4059
}
 
4060
 
 
4061
int
 
4062
i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
 
4063
                       struct drm_file *file_priv)
 
4064
{
 
4065
        if (drm_core_check_feature(dev, DRIVER_MODESET))
 
4066
                return 0;
 
4067
 
 
4068
        drm_irq_uninstall(dev);
 
4069
        return i915_gem_idle(dev);
 
4070
}
 
4071
 
 
4072
void
 
4073
i915_gem_lastclose(struct drm_device *dev)
 
4074
{
 
4075
        int ret;
 
4076
 
 
4077
        if (drm_core_check_feature(dev, DRIVER_MODESET))
 
4078
                return;
 
4079
 
 
4080
        ret = i915_gem_idle(dev);
 
4081
        if (ret)
 
4082
                DRM_ERROR("failed to idle hardware: %d\n", ret);
 
4083
}
 
4084
 
 
4085
static void
 
4086
init_ring_lists(struct intel_ring_buffer *ring)
 
4087
{
 
4088
        INIT_LIST_HEAD(&ring->active_list);
 
4089
        INIT_LIST_HEAD(&ring->request_list);
 
4090
}
 
4091
 
 
4092
void
 
4093
i915_gem_load(struct drm_device *dev)
 
4094
{
 
4095
        int i;
 
4096
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4097
 
 
4098
        INIT_LIST_HEAD(&dev_priv->mm.active_list);
 
4099
        INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
 
4100
        INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
 
4101
        INIT_LIST_HEAD(&dev_priv->mm.bound_list);
 
4102
        INIT_LIST_HEAD(&dev_priv->mm.fence_list);
 
4103
        for (i = 0; i < I915_NUM_RINGS; i++)
 
4104
                init_ring_lists(&dev_priv->ring[i]);
 
4105
        for (i = 0; i < I915_MAX_NUM_FENCES; i++)
 
4106
                INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
 
4107
        INIT_DELAYED_WORK(&dev_priv->mm.retire_work,
 
4108
                          i915_gem_retire_work_handler);
 
4109
        init_completion(&dev_priv->error_completion);
 
4110
 
 
4111
        /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
 
4112
        if (IS_GEN3(dev)) {
 
4113
                I915_WRITE(MI_ARB_STATE,
 
4114
                           _MASKED_BIT_ENABLE(MI_ARB_C3_LP_WRITE_ENABLE));
 
4115
        }
 
4116
 
 
4117
        dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
 
4118
 
 
4119
        /* Old X drivers will take 0-2 for front, back, depth buffers */
 
4120
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
 
4121
                dev_priv->fence_reg_start = 3;
 
4122
 
 
4123
        if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
 
4124
                dev_priv->num_fence_regs = 16;
 
4125
        else
 
4126
                dev_priv->num_fence_regs = 8;
 
4127
 
 
4128
        /* Initialize fence registers to zero */
 
4129
        i915_gem_reset_fences(dev);
 
4130
 
 
4131
        i915_gem_detect_bit_6_swizzle(dev);
 
4132
        init_waitqueue_head(&dev_priv->pending_flip_queue);
 
4133
 
 
4134
        dev_priv->mm.interruptible = true;
 
4135
 
 
4136
        dev_priv->mm.inactive_shrinker.shrink = i915_gem_inactive_shrink;
 
4137
        dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS;
 
4138
        register_shrinker(&dev_priv->mm.inactive_shrinker);
 
4139
}
 
4140
 
 
4141
/*
 
4142
 * Create a physically contiguous memory object for this object
 
4143
 * e.g. for cursor + overlay regs
 
4144
 */
 
4145
static int i915_gem_init_phys_object(struct drm_device *dev,
 
4146
                                     int id, int size, int align)
 
4147
{
 
4148
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4149
        struct drm_i915_gem_phys_object *phys_obj;
 
4150
        int ret;
 
4151
 
 
4152
        if (dev_priv->mm.phys_objs[id - 1] || !size)
 
4153
                return 0;
 
4154
 
 
4155
        phys_obj = kzalloc(sizeof(struct drm_i915_gem_phys_object), GFP_KERNEL);
 
4156
        if (!phys_obj)
 
4157
                return -ENOMEM;
 
4158
 
 
4159
        phys_obj->id = id;
 
4160
 
 
4161
        phys_obj->handle = drm_pci_alloc(dev, size, align);
 
4162
        if (!phys_obj->handle) {
 
4163
                ret = -ENOMEM;
 
4164
                goto kfree_obj;
 
4165
        }
 
4166
#ifdef CONFIG_X86
 
4167
        set_memory_wc((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
 
4168
#endif
 
4169
 
 
4170
        dev_priv->mm.phys_objs[id - 1] = phys_obj;
 
4171
 
 
4172
        return 0;
 
4173
kfree_obj:
 
4174
        kfree(phys_obj);
 
4175
        return ret;
 
4176
}
 
4177
 
 
4178
static void i915_gem_free_phys_object(struct drm_device *dev, int id)
 
4179
{
 
4180
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4181
        struct drm_i915_gem_phys_object *phys_obj;
 
4182
 
 
4183
        if (!dev_priv->mm.phys_objs[id - 1])
 
4184
                return;
 
4185
 
 
4186
        phys_obj = dev_priv->mm.phys_objs[id - 1];
 
4187
        if (phys_obj->cur_obj) {
 
4188
                i915_gem_detach_phys_object(dev, phys_obj->cur_obj);
 
4189
        }
 
4190
 
 
4191
#ifdef CONFIG_X86
 
4192
        set_memory_wb((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
 
4193
#endif
 
4194
        drm_pci_free(dev, phys_obj->handle);
 
4195
        kfree(phys_obj);
 
4196
        dev_priv->mm.phys_objs[id - 1] = NULL;
 
4197
}
 
4198
 
 
4199
void i915_gem_free_all_phys_object(struct drm_device *dev)
 
4200
{
 
4201
        int i;
 
4202
 
 
4203
        for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++)
 
4204
                i915_gem_free_phys_object(dev, i);
 
4205
}
 
4206
 
 
4207
void i915_gem_detach_phys_object(struct drm_device *dev,
 
4208
                                 struct drm_i915_gem_object *obj)
 
4209
{
 
4210
        struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
 
4211
        char *vaddr;
 
4212
        int i;
 
4213
        int page_count;
 
4214
 
 
4215
        if (!obj->phys_obj)
 
4216
                return;
 
4217
        vaddr = obj->phys_obj->handle->vaddr;
 
4218
 
 
4219
        page_count = obj->base.size / PAGE_SIZE;
 
4220
        for (i = 0; i < page_count; i++) {
 
4221
                struct page *page = shmem_read_mapping_page(mapping, i);
 
4222
                if (!IS_ERR(page)) {
 
4223
                        char *dst = kmap_atomic(page);
 
4224
                        memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
 
4225
                        kunmap_atomic(dst);
 
4226
 
 
4227
                        drm_clflush_pages(&page, 1);
 
4228
 
 
4229
                        set_page_dirty(page);
 
4230
                        mark_page_accessed(page);
 
4231
                        page_cache_release(page);
 
4232
                }
 
4233
        }
 
4234
        i915_gem_chipset_flush(dev);
 
4235
 
 
4236
        obj->phys_obj->cur_obj = NULL;
 
4237
        obj->phys_obj = NULL;
 
4238
}
 
4239
 
 
4240
int
 
4241
i915_gem_attach_phys_object(struct drm_device *dev,
 
4242
                            struct drm_i915_gem_object *obj,
 
4243
                            int id,
 
4244
                            int align)
 
4245
{
 
4246
        struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
 
4247
        drm_i915_private_t *dev_priv = dev->dev_private;
 
4248
        int ret = 0;
 
4249
        int page_count;
 
4250
        int i;
 
4251
 
 
4252
        if (id > I915_MAX_PHYS_OBJECT)
 
4253
                return -EINVAL;
 
4254
 
 
4255
        if (obj->phys_obj) {
 
4256
                if (obj->phys_obj->id == id)
 
4257
                        return 0;
 
4258
                i915_gem_detach_phys_object(dev, obj);
 
4259
        }
 
4260
 
 
4261
        /* create a new object */
 
4262
        if (!dev_priv->mm.phys_objs[id - 1]) {
 
4263
                ret = i915_gem_init_phys_object(dev, id,
 
4264
                                                obj->base.size, align);
 
4265
                if (ret) {
 
4266
                        DRM_ERROR("failed to init phys object %d size: %zu\n",
 
4267
                                  id, obj->base.size);
 
4268
                        return ret;
 
4269
                }
 
4270
        }
 
4271
 
 
4272
        /* bind to the object */
 
4273
        obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
 
4274
        obj->phys_obj->cur_obj = obj;
 
4275
 
 
4276
        page_count = obj->base.size / PAGE_SIZE;
 
4277
 
 
4278
        for (i = 0; i < page_count; i++) {
 
4279
                struct page *page;
 
4280
                char *dst, *src;
 
4281
 
 
4282
                page = shmem_read_mapping_page(mapping, i);
 
4283
                if (IS_ERR(page))
 
4284
                        return PTR_ERR(page);
 
4285
 
 
4286
                src = kmap_atomic(page);
 
4287
                dst = obj->phys_obj->handle->vaddr + (i * PAGE_SIZE);
 
4288
                memcpy(dst, src, PAGE_SIZE);
 
4289
                kunmap_atomic(src);
 
4290
 
 
4291
                mark_page_accessed(page);
 
4292
                page_cache_release(page);
 
4293
        }
 
4294
 
 
4295
        return 0;
 
4296
}
 
4297
 
 
4298
static int
 
4299
i915_gem_phys_pwrite(struct drm_device *dev,
 
4300
                     struct drm_i915_gem_object *obj,
 
4301
                     struct drm_i915_gem_pwrite *args,
 
4302
                     struct drm_file *file_priv)
 
4303
{
 
4304
        void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
 
4305
        char __user *user_data = (char __user *) (uintptr_t) args->data_ptr;
 
4306
 
 
4307
        if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
 
4308
                unsigned long unwritten;
 
4309
 
 
4310
                /* The physical object once assigned is fixed for the lifetime
 
4311
                 * of the obj, so we can safely drop the lock and continue
 
4312
                 * to access vaddr.
 
4313
                 */
 
4314
                mutex_unlock(&dev->struct_mutex);
 
4315
                unwritten = copy_from_user(vaddr, user_data, args->size);
 
4316
                mutex_lock(&dev->struct_mutex);
 
4317
                if (unwritten)
 
4318
                        return -EFAULT;
 
4319
        }
 
4320
 
 
4321
        i915_gem_chipset_flush(dev);
 
4322
        return 0;
 
4323
}
 
4324
 
 
4325
void i915_gem_release(struct drm_device *dev, struct drm_file *file)
 
4326
{
 
4327
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
4328
 
 
4329
        /* Clean up our request list when the client is going away, so that
 
4330
         * later retire_requests won't dereference our soon-to-be-gone
 
4331
         * file_priv.
 
4332
         */
 
4333
        spin_lock(&file_priv->mm.lock);
 
4334
        while (!list_empty(&file_priv->mm.request_list)) {
 
4335
                struct drm_i915_gem_request *request;
 
4336
 
 
4337
                request = list_first_entry(&file_priv->mm.request_list,
 
4338
                                           struct drm_i915_gem_request,
 
4339
                                           client_list);
 
4340
                list_del(&request->client_list);
 
4341
                request->file_priv = NULL;
 
4342
        }
 
4343
        spin_unlock(&file_priv->mm.lock);
 
4344
}
 
4345
 
 
4346
static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)
 
4347
{
 
4348
        if (!mutex_is_locked(mutex))
 
4349
                return false;
 
4350
 
 
4351
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES)
 
4352
        return mutex->owner == task;
 
4353
#else
 
4354
        /* Since UP may be pre-empted, we cannot assume that we own the lock */
 
4355
        return false;
 
4356
#endif
 
4357
}
 
4358
 
 
4359
static int
 
4360
i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
 
4361
{
 
4362
        struct drm_i915_private *dev_priv =
 
4363
                container_of(shrinker,
 
4364
                             struct drm_i915_private,
 
4365
                             mm.inactive_shrinker);
 
4366
        struct drm_device *dev = dev_priv->dev;
 
4367
        struct drm_i915_gem_object *obj;
 
4368
        int nr_to_scan = sc->nr_to_scan;
 
4369
        bool unlock = true;
 
4370
        int cnt;
 
4371
 
 
4372
        if (!mutex_trylock(&dev->struct_mutex)) {
 
4373
                if (!mutex_is_locked_by(&dev->struct_mutex, current))
 
4374
                        return 0;
 
4375
 
 
4376
                unlock = false;
 
4377
        }
 
4378
 
 
4379
        if (nr_to_scan) {
 
4380
                nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan);
 
4381
                if (nr_to_scan > 0)
 
4382
                        i915_gem_shrink_all(dev_priv);
 
4383
        }
 
4384
 
 
4385
        cnt = 0;
 
4386
        list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list)
 
4387
                if (obj->pages_pin_count == 0)
 
4388
                        cnt += obj->base.size >> PAGE_SHIFT;
 
4389
        list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list)
 
4390
                if (obj->pin_count == 0 && obj->pages_pin_count == 0)
 
4391
                        cnt += obj->base.size >> PAGE_SHIFT;
 
4392
 
 
4393
        if (unlock)
 
4394
                mutex_unlock(&dev->struct_mutex);
 
4395
        return cnt;
 
4396
}