185 Commits

Author SHA1 Message Date
eadler
3488bf4874 Partial revert of r258779 and r258780:
The directory sys/dev/drm2/i915 is apperently contributed code.
	Revert to the broken version of this file to make future imports easier.

Requested by:	kib
2013-12-02 03:36:44 +00:00
eadler
44c01df173 Fix undefined behavior: (1 << 31) is not defined as 1 is an int and this
shifts into the sign bit.  Instead use (1U << 31) which gets the
expected result.

This fix is not ideal as it assumes a 32 bit int, but does fix the issue
for most cases.

A similar change was made in OpenBSD.

Discussed with:	-arch, rdivacky
Reviewed by:	cperciva
2013-11-30 22:17:27 +00:00
eadler
5bcb8c5f42 Similar to the (1 << 31) case it is not defined to do (2 << 30). 2013-11-30 22:16:37 +00:00
dumbbell
841981e64e drm: Fix build with gcc, broken with r258549
The code was easier to read without __DECONST and clang didn't report
any error. I thought the cast was enough...

MFC after:	3 days
X-MFC-With:	r258549
2013-11-25 15:01:59 +00:00
dumbbell
fa0e069a02 drm: Dereference pointers given to qsort_r()'s cmp callback
drm_le_cmp() (qsort_r()'s callback) receives pointers to elements in the
array passed to qsort_r(), not the elements themselves.

Before this fix, the use of qsort_r() shuffled the array, not sorted it,
because the compare callback accessed random memory locations, not the
expected elements.

This bug triggered an infinite loop in KDE/xserver:

    1. KDE has a kded module called "randrmonitor" which queries xserver
       for current monitors at startup and then listens to RandR
       notifications from xserver.

    2. xserver handles the query from "randrmonitor" by polling the
       video device using the "drm_mode_getconnector()" ioctl. This
       ioctl returns a list of connectors and, for those with a
       connected monitor, the available modes. Each modes list is sorted
       by the kernel before returning. When xserver gets the connectors
       list, it sorts the modes lists again.

       In the case of this bug, when two modes are equal (in xserver's
       compare function PoV), their order is kept stable (ie. the
       kernel order is kept for those two modes). And because the list
       was shuffled by the kernel, the order of two equal modes was
       frequently changed in the final modes list in xserver.

    3. xserver compares the returned connectors list with the list
       obtained earlier. In particular, it compares the sorted
       modes lists for each connector. If a property of a connector
       changes (eg. modes), xserver sends a "RRNotify_OutputChange"
       notification.

       Because of the change of order between equal modes, xserver sent
       a notification after each polling of the connectors.

    4. "randrmonitor" receives a notification, triggered by its query. The
       notification doesn't contain the new connectors list, therefore, it
       asks for the new list using the same function: go back to step #2.

MFC after:	3 days
2013-11-25 11:15:51 +00:00
ray
1d8a8d3009 Move mode_config up one level. DRM drivers call drm_fb_helper_restore_fbdev_mode
with that lock already held.

Suggested by:	avg

Sponsored by:	The FreeBSD Foundation
2013-11-18 22:35:02 +00:00
dumbbell
49c3716bee drm: Support DRM_CAP_TIMESTAMP_MONOTONIC capability
This fixes DPMS with KDE and radeonkms. Without this, the display would
freeze when the monitor is put into sleep state, and only resumes after
several dozens of minutes once the monitor is powered on again.

Tested by:	Mathias Picker <Mathias.Picker@virtual-earth.de>
2013-11-17 16:07:52 +00:00
ray
89f74f8743 Lock mode_config before call drm_crtc_helper_set_config.
Submitted by:	avg
Sponsored by:	The FreeBSD Foundation
2013-11-17 00:49:55 +00:00
ray
7317ada90c MFC @r258091. 2013-11-13 13:41:36 +00:00
dumbbell
9a50177f8f drm/radeon: Fix build of radeon_fb.c on i386 2013-11-12 19:44:45 +00:00
dumbbell
db30f7f6ab drm/radeon: Wake up userland after page flip
For instance, this caused issues in KDE, such as stuttered animations
(with desktop effects enabled).
2013-11-08 22:47:43 +00:00
dumbbell
ca7d4f1e4f drm: Initialize "handle" to 0 before calling drm_gem_handle_create()
This is variable is being checked in drm_gem_name_create() before being
set.
2013-11-08 22:44:46 +00:00
dumbbell
a9987007cb drm/radeon: Implement the FB_GETINFO() newbus callback 2013-11-02 13:16:00 +00:00
dumbbell
6a6d675d3f drm: Log error if we fail to attach fbd device 2013-11-02 13:14:46 +00:00
ray
b6685245d7 Change drm2 to attach fbd as device.
Radeon driver not ready yet.

Sponsored by:	The FreeBSD Foundation
2013-10-31 14:39:04 +00:00
ray
3d72b52090 MFC @r256953 2013-10-23 09:21:14 +00:00
ray
0d3746779c o Update drivers according to fb_info structure changes.
o Switch drm_fb_helper to be simple framebuffer provider.

Sponsored by:	The FreeBSD Foundation
2013-10-22 20:27:30 +00:00
kib
3764544c53 Reset function on SandyBridge holds the gt_lock for the whole duration
already.  Also, according to the specs, GDRST register is not in the
power well, so the forcewake for reset status read is excessive for
this reason.

Use plain register read for waiting of the reset completion
notification, to avoid gt_lock recursion.  Linux upstream did the
similar change, but their code was already restructured.

Reported by:	ray
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
2013-10-21 16:22:51 +00:00
dumbbell
b11cc9295f drm/radeon: radeonkms depends on firmware(9)
Submitted by:	tijl@
2013-10-19 17:11:58 +00:00
ray
1fd948f6c9 Swap Red and Blue (too much red in dialog(1)).
Sponsored by:	The FreeBSD Foundation
2013-10-15 13:45:37 +00:00
ray
754499eca9 Don't forget to include colors/vt_termcolors.h too.
Sponsored by:	The FreeBSD Foundation
2013-10-15 13:24:10 +00:00
ray
6223ebf08b Use generated color map.
Sponsored by:	The FreeBSD Foundation
2013-10-15 13:18:39 +00:00
ray
d8cbe1290b Partially revert accidentally committed #if from r256528.
Sponsored by:	The FreeBSD Foundation
2013-10-15 13:07:24 +00:00
ray
fff7931dbb Rename bitblt method to bitbltchr.
Sponsored by:	The FreeBSD Foundation
2013-10-15 12:29:36 +00:00
ray
2324fc717d Fix off-by-one-huge-fb-line copy-pasted to every driver.
TODO: defaulting to single implementation for all FB devices.

Sponsored by:	The FreeBSD Foundation
2013-10-11 13:07:31 +00:00
dumbbell
cc50f124ba drm/radeon: Fill "struct fb_info" for Newcons
This is a first step to make Newcons work with "radeonkms". However,
this is very unstable at the moment. Especially, the locking change in
radeon_pm.c is probably not correct.
2013-10-10 12:44:00 +00:00
ray
da824c4a2b MFC @r256148. 2013-10-08 14:02:35 +00:00
ray
36deab7b3b Enable fill of fb_info for i915kms driver.
Sponsored by:	The FreeBSD Foundation
2013-10-08 11:51:20 +00:00
ray
b11a0aa768 Add Newcons KMS driver. Based on drm_fb_helper functionality.
TODO: Should be moved to separate framebuffer interface.

Sponsored by:	The FreeBSD Foundation
2013-10-08 11:48:58 +00:00
ray
a1a002ce5c Add fb_info structure definition. Drivers should fill it to give access to
framebuffer.

Sponsored by:	The FreeBSD Foundation
2013-10-08 11:33:24 +00:00
dumbbell
a58808dc62 drm/radeon: Add missing "return false" after unmapping invalid BIOS
Without that, we would try to copy the unmapped BIOS.

Submitted by:	Christoph Mallon <christoph.mallon@gmx.de>
Approved by:	re (blanket)
2013-09-15 07:48:42 +00:00
dumbbell
b2a784f068 drm/radeon: Fix usage of pci_save_state() and pci_restore_state()
Calling those functions with the drmn device as argument causes a panic,
because it's not a direct child of pci$N. They must be called with the
vgapci device instead.

This fix is not enough to make suspend/resume work reliably.

Approved by:	re (blanket)
2013-09-14 17:24:41 +00:00
dumbbell
bd9c660569 drm/radeon: Fix usage of vga_pci_map_bios()
vga_pci_(un)map_bios() takes a vgapci device as argument, not a drmn
one. This fixes a bug where the BIOS couldn't be mapped if the device
wasn't the boot display.

Approved by:	re (kib; blanket for following drm2/radeon commits)
2013-09-14 17:22:34 +00:00
jhb
04bb6e10cd Add a mmap flag (MAP_32BIT) on 64-bit platforms to request that a mapping use
an address in the first 2GB of the process's address space.  This flag should
have the same semantics as the same flag on Linux.

To facilitate this, add a new parameter to vm_map_find() that specifies an
optional maximum virtual address.  While here, fix several callers of
vm_map_find() to use a VMFS_* constant for the findspace argument instead of
TRUE and FALSE.

Reviewed by:	alc
Approved by:	re (kib)
2013-09-09 18:11:59 +00:00
jkim
76248c6467 'u_long' is consistently spelled 'unsigned long' in this file. Fix it. 2013-08-29 23:09:34 +00:00
jkim
8fcf363f03 Partially revert r254880. The bitmap operations actually use long type now. 2013-08-29 22:46:21 +00:00
jkim
5fe5bcbff4 Fix the incomplete conversion from atomic_t to long for test_bit(). 2013-08-29 20:51:12 +00:00
jkim
6603a73740 Clarify confusions between atomic_t and bitmap. Fix bitmap operations
accordingly.
2013-08-29 20:40:45 +00:00
jkim
d60bb760ec - Remove test_and_set_bit() macro. It is unused since r255037.
- Relax atomic_read() and atomic_set() macros.  Linux does not require any
memory barrier.  Also, these macros may be even reordered or optimized away
according to the API documentation:

https://www.kernel.org/doc/Documentation/atomic_ops.txt
2013-08-29 19:47:52 +00:00
jkim
674c9801f6 Fix atomic operations on context_flag without altering semantics. 2013-08-29 18:36:47 +00:00
jkim
4c74509011 Correct atomic operations in i915. 2013-08-28 23:59:38 +00:00
jkim
28ab6fab8b Fix a compiler warning and add couple of VM map types. 2013-08-28 23:43:28 +00:00
jkim
6731dd428d Fix a compiler warning. With this fix, a negative time can be converted to
a struct timeval and back to the original nanoseconds correctly.
2013-08-28 22:57:49 +00:00
dumbbell
8b28c9e54d drm/radeon: Rename the (S)DEBUG macros in atom.c to avoid conflicts
For instance, DEBUG is already defined in the LINT kernel configuration.
This fixes the build of LINT.
2013-08-26 06:31:57 +00:00
dumbbell
0d898a1422 drm/radeon: Import the Radeon KMS driver
This driver is based on Linux 3.8 and a previous effort by kan@.

More informations about this project can be found on the FreeBSD wiki:
    https://wiki.freebsd.org/AMD_GPU

The driver is split into:

  sys/dev/drm2:
    The driver sources.

  sys/modules/drm2/radeonkmw:
    The driver main kernel module's Makefile.

  sys/modules/drm2/radeonkmsfw:
    All firmware kernel module Makefiles. There's one directory and one
    Makefile for each firmware.

  sys/contrib/dev/drm2/radeonkmsfw:
    All firmware binary sources.

  tools/tools/drm/radeon
    Tools to update firmwares or regenerate some headers.

Merging the driver to FreeBSD 9.x may be possible but not a priority for
now.

Help from:	kib@, kan@
Tested by:	avg@, kwm@, ray@,
		Alexander Yerenkow <yerenkow@gmail.com>,
		Anders Bolt-Evensen <andersbo87@me.com>,
		Denis Djubajlo <stdedjub@googlemail.com>,
		J.R. Oldroyd <fbsd@opal.com>,
		Mikaël Urankar <mikael.urankar@gmail.com>,
		Pierre-Emmanuel Pédron <pepcitron@gmail.com>,
		Sam Fourman Jr. <sfourman@gmail.com>,
		Wade <wade-is-great@live.com>,
		(probably other I forgot...)
HW donations:	kyzh, Yakaz
2013-08-25 19:37:15 +00:00
dumbbell
df84fc5689 drm: Use the new drm_atomic.h, following the merge of projects/atomic64
Submitted by:	jkim@
2013-08-25 15:38:16 +00:00
dumbbell
34063ddb05 drm/ttm: Remove unused VM_ALLOC_DMA32 define 2013-08-25 15:33:17 +00:00
dumbbell
3e5001b6b2 drm/ttm: Fix a reversed condition and add missing locks
This allows to run OpenGL applications on at least two test machines
with the Radeon driver.

Approved by:	kib@
2013-08-25 15:29:23 +00:00
dumbbell
b01e0cf4b5 drm/ttm: Fix style in ttm_bo_release_mmap() 2013-08-25 15:26:45 +00:00
dumbbell
bcae8cdece drm/ttm: Fix unmap of buffer object
Add a new ttm_bo_release_mmap() function to unmap pages in a
vm_object_t. Pages are freed when the buffer object is later released.

This function is called in ttm_bo_unmap_virtual_locked(), replacing
Linux' unmap_mapping_range(). In particular this is called when a buffer
object is about to be moved, so that its mapping is invalidated.

However, we don't use this function in ttm_bo_vm_dtor(), because the
vm_object_t is already marked as OBJ_DEAD and the pages will be
unmapped.

Approved by:	kib@
2013-08-25 15:15:55 +00:00