mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm tree changes from Dave Airlie:
"This is the main drm pull request, I have some overlap with sound and
arm-soc, the sound patch is acked and may conflict based on -next
reports but should be a trivial fixup, which I'll leave to you!
Highlights:
- new drivers:
MSM driver from Rob Clark
- non-drm:
switcheroo and hdmi audio driver support for secondary GPU
poweroff, so drivers can use runtime PM to poweroff the GPUs. This
can save 5 or 6W on some optimus laptops.
- drm core:
combined GEM and TTM VMA manager
per-filp mmap permission tracking
initial rendernode support (via a runtime enable for now, until we get api stable),
remove old proc support,
lots of cleanups of legacy code
hdmi vendor infoframes and 4k modes
lots of gem/prime locking and races fixes
async pageflip scaffolding
drm bridge objects
- i915:
Haswell PC8+ support and eLLC support, HDMI 4K support, initial
per-process VMA pieces, watermark reworks, convert to generic hdmi
infoframes, encoder reworking, fastboot support,
- radeon:
CIK PM support, remove 3d blit code in favour of DMA engines,
Berlin GPU support, HDMI audio fixes
- nouveau:
secondary GPU power down support for optimus laptops, lots of
fixes, use MSI, VP3 engine support
- exynos:
runtime pm support for g2d, DT support, remove non-DT,
- tda998x i2c driver:
lots of fixes for sync issues
- gma500:
lots of cleanups
- rcar:
add LVDS support, fbdev emulation,
- tegra:
just minor fixes"
* 'drm-next' of git://people.freedesktop.org/~airlied/linux: (684 commits)
drm/exynos: Fix build error with exynos_drm_connector.c
drm/exynos: Remove non-DT support in exynos_drm_fimd
drm/exynos: Remove non-DT support in exynos_hdmi
drm/exynos: Remove non-DT support in exynos_drm_g2d
drm/exynos: Remove non-DT support in exynos_hdmiphy
drm/exynos: Remove non-DT support in exynos_ddc
drm/exynos: Make Exynos DRM drivers depend on OF
drm/exynos: Consider fallback option to allocation fail
drm/exynos: fimd: move platform data parsing to separate function
drm/exynos: fimd: get signal polarities from device tree
drm/exynos: fimd: replace struct fb_videomode with videomode
drm/exynos: check a pixel format to a particular window layer
drm/exynos: fix fimd pixel format setting
drm/exynos: Add NULL pointer check
drm/exynos: Remove redundant error messages
drm/exynos: Add missing of.h header include
drm/exynos: Remove redundant NULL check in exynos_drm_buf
drm/exynos: add device tree support for rotator
drm/exynos: Add missing includes
drm/exynos: add runtime pm interfaces to g2d driver
...
This commit is contained in:
commit
a09e9a7a4b
435 changed files with 50558 additions and 17822 deletions
|
|
@ -22,6 +22,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/hdmi.h>
|
||||
|
|
@ -52,7 +53,7 @@ int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame)
|
|||
|
||||
frame->type = HDMI_INFOFRAME_TYPE_AVI;
|
||||
frame->version = 2;
|
||||
frame->length = 13;
|
||||
frame->length = HDMI_AVI_INFOFRAME_SIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -83,7 +84,7 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
|
|||
if (size < length)
|
||||
return -ENOSPC;
|
||||
|
||||
memset(buffer, 0, length);
|
||||
memset(buffer, 0, size);
|
||||
|
||||
ptr[0] = frame->type;
|
||||
ptr[1] = frame->version;
|
||||
|
|
@ -95,13 +96,18 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
|
|||
|
||||
ptr[0] = ((frame->colorspace & 0x3) << 5) | (frame->scan_mode & 0x3);
|
||||
|
||||
if (frame->active_info_valid)
|
||||
/*
|
||||
* Data byte 1, bit 4 has to be set if we provide the active format
|
||||
* aspect ratio
|
||||
*/
|
||||
if (frame->active_aspect & 0xf)
|
||||
ptr[0] |= BIT(4);
|
||||
|
||||
if (frame->horizontal_bar_valid)
|
||||
/* Bit 3 and 2 indicate if we transmit horizontal/vertical bar data */
|
||||
if (frame->top_bar || frame->bottom_bar)
|
||||
ptr[0] |= BIT(3);
|
||||
|
||||
if (frame->vertical_bar_valid)
|
||||
if (frame->left_bar || frame->right_bar)
|
||||
ptr[0] |= BIT(2);
|
||||
|
||||
ptr[1] = ((frame->colorimetry & 0x3) << 6) |
|
||||
|
|
@ -151,7 +157,7 @@ int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
|
|||
|
||||
frame->type = HDMI_INFOFRAME_TYPE_SPD;
|
||||
frame->version = 1;
|
||||
frame->length = 25;
|
||||
frame->length = HDMI_SPD_INFOFRAME_SIZE;
|
||||
|
||||
strncpy(frame->vendor, vendor, sizeof(frame->vendor));
|
||||
strncpy(frame->product, product, sizeof(frame->product));
|
||||
|
|
@ -185,7 +191,7 @@ ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
|
|||
if (size < length)
|
||||
return -ENOSPC;
|
||||
|
||||
memset(buffer, 0, length);
|
||||
memset(buffer, 0, size);
|
||||
|
||||
ptr[0] = frame->type;
|
||||
ptr[1] = frame->version;
|
||||
|
|
@ -218,7 +224,7 @@ int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame)
|
|||
|
||||
frame->type = HDMI_INFOFRAME_TYPE_AUDIO;
|
||||
frame->version = 1;
|
||||
frame->length = 10;
|
||||
frame->length = HDMI_AUDIO_INFOFRAME_SIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -250,7 +256,7 @@ ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
|
|||
if (size < length)
|
||||
return -ENOSPC;
|
||||
|
||||
memset(buffer, 0, length);
|
||||
memset(buffer, 0, size);
|
||||
|
||||
if (frame->channels >= 2)
|
||||
channels = frame->channels - 1;
|
||||
|
|
@ -282,9 +288,33 @@ ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
|
|||
EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
|
||||
|
||||
/**
|
||||
* hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
|
||||
* buffer
|
||||
* hdmi_vendor_infoframe_init() - initialize an HDMI vendor infoframe
|
||||
* @frame: HDMI vendor infoframe
|
||||
*
|
||||
* Returns 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame)
|
||||
{
|
||||
memset(frame, 0, sizeof(*frame));
|
||||
|
||||
frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
|
||||
frame->version = 1;
|
||||
|
||||
frame->oui = HDMI_IEEE_OUI;
|
||||
|
||||
/*
|
||||
* 0 is a valid value for s3d_struct, so we use a special "not set"
|
||||
* value
|
||||
*/
|
||||
frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(hdmi_vendor_infoframe_init);
|
||||
|
||||
/**
|
||||
* hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
|
||||
* @frame: HDMI infoframe
|
||||
* @buffer: destination buffer
|
||||
* @size: size of buffer
|
||||
*
|
||||
|
|
@ -297,27 +327,110 @@ EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
|
|||
* error code on failure.
|
||||
*/
|
||||
ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
||||
void *buffer, size_t size)
|
||||
void *buffer, size_t size)
|
||||
{
|
||||
u8 *ptr = buffer;
|
||||
size_t length;
|
||||
|
||||
/* empty info frame */
|
||||
if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
|
||||
return -EINVAL;
|
||||
|
||||
/* only one of those can be supplied */
|
||||
if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
|
||||
return -EINVAL;
|
||||
|
||||
/* for side by side (half) we also need to provide 3D_Ext_Data */
|
||||
if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
|
||||
frame->length = 6;
|
||||
else
|
||||
frame->length = 5;
|
||||
|
||||
length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
|
||||
|
||||
if (size < length)
|
||||
return -ENOSPC;
|
||||
|
||||
memset(buffer, 0, length);
|
||||
memset(buffer, 0, size);
|
||||
|
||||
ptr[0] = frame->type;
|
||||
ptr[1] = frame->version;
|
||||
ptr[2] = frame->length;
|
||||
ptr[3] = 0; /* checksum */
|
||||
|
||||
memcpy(&ptr[HDMI_INFOFRAME_HEADER_SIZE], frame->data, frame->length);
|
||||
/* HDMI OUI */
|
||||
ptr[4] = 0x03;
|
||||
ptr[5] = 0x0c;
|
||||
ptr[6] = 0x00;
|
||||
|
||||
if (frame->vic) {
|
||||
ptr[7] = 0x1 << 5; /* video format */
|
||||
ptr[8] = frame->vic;
|
||||
} else {
|
||||
ptr[7] = 0x2 << 5; /* video format */
|
||||
ptr[8] = (frame->s3d_struct & 0xf) << 4;
|
||||
if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
|
||||
ptr[9] = (frame->s3d_ext_data & 0xf) << 4;
|
||||
}
|
||||
|
||||
hdmi_infoframe_checksum(buffer, length);
|
||||
|
||||
return length;
|
||||
}
|
||||
EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
|
||||
|
||||
/*
|
||||
* hdmi_vendor_any_infoframe_pack() - write a vendor infoframe to binary buffer
|
||||
*/
|
||||
static ssize_t
|
||||
hdmi_vendor_any_infoframe_pack(union hdmi_vendor_any_infoframe *frame,
|
||||
void *buffer, size_t size)
|
||||
{
|
||||
/* we only know about HDMI vendor infoframes */
|
||||
if (frame->any.oui != HDMI_IEEE_OUI)
|
||||
return -EINVAL;
|
||||
|
||||
return hdmi_vendor_infoframe_pack(&frame->hdmi, buffer, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
|
||||
* @frame: HDMI infoframe
|
||||
* @buffer: destination buffer
|
||||
* @size: size of buffer
|
||||
*
|
||||
* Packs the information contained in the @frame structure into a binary
|
||||
* representation that can be written into the corresponding controller
|
||||
* registers. Also computes the checksum as required by section 5.3.5 of
|
||||
* the HDMI 1.4 specification.
|
||||
*
|
||||
* Returns the number of bytes packed into the binary buffer or a negative
|
||||
* error code on failure.
|
||||
*/
|
||||
ssize_t
|
||||
hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size)
|
||||
{
|
||||
ssize_t length;
|
||||
|
||||
switch (frame->any.type) {
|
||||
case HDMI_INFOFRAME_TYPE_AVI:
|
||||
length = hdmi_avi_infoframe_pack(&frame->avi, buffer, size);
|
||||
break;
|
||||
case HDMI_INFOFRAME_TYPE_SPD:
|
||||
length = hdmi_spd_infoframe_pack(&frame->spd, buffer, size);
|
||||
break;
|
||||
case HDMI_INFOFRAME_TYPE_AUDIO:
|
||||
length = hdmi_audio_infoframe_pack(&frame->audio, buffer, size);
|
||||
break;
|
||||
case HDMI_INFOFRAME_TYPE_VENDOR:
|
||||
length = hdmi_vendor_any_infoframe_pack(&frame->vendor,
|
||||
buffer, size);
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Bad infoframe type %d\n", frame->any.type);
|
||||
length = -EINVAL;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
EXPORT_SYMBOL(hdmi_infoframe_pack);
|
||||
|
|
|
|||
Loading…
Reference in a new issue