Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "This is the main drm pull request for 4.6 kernel. Overall the coolest thing here for me is the nouveau maxwell signed firmware support from NVidia, it's taken a long while to extract this from them. I also wish the ARM vendors just designed one set of display IP, ARM display block proliferation is definitely increasing. Core: - drm_event cleanups - Internal API cleanup making mode_fixup optional. - Apple GMUX vga switcheroo support. - DP AUX testing interface Panel: - Refactoring of DSI core for use over more transports. New driver: - ARM hdlcd driver i915: - FBC/PSR (framebuffer compression, panel self refresh) enabled by default. - Ongoing atomic display support work - Ongoing runtime PM work - Pixel clock limit checks - VBT DSI description support - GEM fixes - GuC firmware scheduler enhancements amdkfd: - Deferred probing fixes to avoid make file or link ordering. amdgpu/radeon: - ACP support for i2s audio support. - Command Submission/GPU scheduler/GPUVM optimisations - Initial GPU reset support for amdgpu vmwgfx: - Support for DX10 gen mipmaps - Pageflipping and other fixes. exynos: - Exynos5420 SoC support for FIMD - Exynos5422 SoC support for MIPI-DSI nouveau: - GM20x secure boot support - adds acceleration for Maxwell GPUs. - GM200 support - GM20B clock driver support - Power sensors work etnaviv: - Correctness fixes for GPU cache flushing - Better support for i.MX6 systems. imx-drm: - VBlank IRQ support - Fence support - OF endpoint support msm: - HDMI support for 8996 (snapdragon 820) - Adreno 430 support - Timestamp queries support virtio-gpu: - Fixes for Android support. rockchip: - Add support for Innosilicion HDMI rcar-du: - Support for 4 crtcs - R8A7795 support - RCar Gen 3 support omapdrm: - HDMI interlace output support - dma-buf import support - Refactoring to remove a lot of legacy code. tilcdc: - Rewrite of pageflipping code - dma-buf support - pinctrl support vc4: - HDMI modesetting bug fixes - Significant 3D performance improvement. fsl-dcu (FreeScale): - Lots of fixes tegra: - Two small fixes sti: - Atomic support for planes - Improved HDMI support" * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (1063 commits) drm/amdgpu: release_pages requires linux/pagemap.h drm/sti: restore mode_fixup callback drm/amdgpu/gfx7: add MTYPE definition drm/amdgpu: removing BO_VAs shouldn't be interruptible drm/amd/powerplay: show uvd/vce power gate enablement for tonga. drm/amd/powerplay: show uvd/vce power gate info for fiji drm/amdgpu: use sched fence if possible drm/amdgpu: move ib.fence to job.fence drm/amdgpu: give a fence param to ib_free drm/amdgpu: include the right version of gmc header files for iceland drm/radeon: fix indentation. drm/amd/powerplay: add uvd/vce dpm enabling flag to fix the performance issue for CZ drm/amdgpu: switch back to 32bit hw fences v2 drm/amdgpu: remove amdgpu_fence_is_signaled drm/amdgpu: drop the extra fence range check v2 drm/amdgpu: signal fences directly in amdgpu_fence_process drm/amdgpu: cleanup amdgpu_fence_wait_empty v2 drm/amdgpu: keep all fences in an RCU protected array v2 drm/amdgpu: add number of hardware submissions to amdgpu_fence_driver_init_ring drm/amdgpu: RCU protected amd_sched_fence_release ...
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pnp.h>
|
||||
#include <linux/apple_bl.h>
|
||||
#include <linux/apple-gmux.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -57,7 +58,9 @@ struct apple_gmux_data {
|
||||
/* switcheroo data */
|
||||
acpi_handle dhandle;
|
||||
int gpe;
|
||||
enum vga_switcheroo_client_id resume_client_id;
|
||||
enum vga_switcheroo_client_id switch_state_display;
|
||||
enum vga_switcheroo_client_id switch_state_ddc;
|
||||
enum vga_switcheroo_client_id switch_state_external;
|
||||
enum vga_switcheroo_state power_state;
|
||||
struct completion powerchange_done;
|
||||
};
|
||||
@@ -368,21 +371,72 @@ static const struct backlight_ops gmux_bl_ops = {
|
||||
* for the selected GPU.
|
||||
*/
|
||||
|
||||
static void gmux_read_switch_state(struct apple_gmux_data *gmux_data)
|
||||
{
|
||||
if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DDC) == 1)
|
||||
gmux_data->switch_state_ddc = VGA_SWITCHEROO_IGD;
|
||||
else
|
||||
gmux_data->switch_state_ddc = VGA_SWITCHEROO_DIS;
|
||||
|
||||
if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DISPLAY) == 2)
|
||||
gmux_data->switch_state_display = VGA_SWITCHEROO_IGD;
|
||||
else
|
||||
gmux_data->switch_state_display = VGA_SWITCHEROO_DIS;
|
||||
|
||||
if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL) == 2)
|
||||
gmux_data->switch_state_external = VGA_SWITCHEROO_IGD;
|
||||
else
|
||||
gmux_data->switch_state_external = VGA_SWITCHEROO_DIS;
|
||||
}
|
||||
|
||||
static void gmux_write_switch_state(struct apple_gmux_data *gmux_data)
|
||||
{
|
||||
if (gmux_data->switch_state_ddc == VGA_SWITCHEROO_IGD)
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 1);
|
||||
else
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 2);
|
||||
|
||||
if (gmux_data->switch_state_display == VGA_SWITCHEROO_IGD)
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2);
|
||||
else
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 3);
|
||||
|
||||
if (gmux_data->switch_state_external == VGA_SWITCHEROO_IGD)
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 2);
|
||||
else
|
||||
gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3);
|
||||
}
|
||||
|
||||
static int gmux_switchto(enum vga_switcheroo_client_id id)
|
||||
{
|
||||
if (id == VGA_SWITCHEROO_IGD) {
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DDC, 1);
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2);
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 2);
|
||||
} else {
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DDC, 2);
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DISPLAY, 3);
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3);
|
||||
}
|
||||
apple_gmux_data->switch_state_ddc = id;
|
||||
apple_gmux_data->switch_state_display = id;
|
||||
apple_gmux_data->switch_state_external = id;
|
||||
|
||||
gmux_write_switch_state(apple_gmux_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gmux_switch_ddc(enum vga_switcheroo_client_id id)
|
||||
{
|
||||
enum vga_switcheroo_client_id old_ddc_owner =
|
||||
apple_gmux_data->switch_state_ddc;
|
||||
|
||||
if (id == old_ddc_owner)
|
||||
return id;
|
||||
|
||||
pr_debug("Switching DDC from %d to %d\n", old_ddc_owner, id);
|
||||
apple_gmux_data->switch_state_ddc = id;
|
||||
|
||||
if (id == VGA_SWITCHEROO_IGD)
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DDC, 1);
|
||||
else
|
||||
gmux_write8(apple_gmux_data, GMUX_PORT_SWITCH_DDC, 2);
|
||||
|
||||
return old_ddc_owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* DOC: Power control
|
||||
*
|
||||
@@ -440,21 +494,19 @@ static int gmux_get_client_id(struct pci_dev *pdev)
|
||||
return VGA_SWITCHEROO_DIS;
|
||||
}
|
||||
|
||||
static enum vga_switcheroo_client_id
|
||||
gmux_active_client(struct apple_gmux_data *gmux_data)
|
||||
{
|
||||
if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DISPLAY) == 2)
|
||||
return VGA_SWITCHEROO_IGD;
|
||||
|
||||
return VGA_SWITCHEROO_DIS;
|
||||
}
|
||||
|
||||
static const struct vga_switcheroo_handler gmux_handler = {
|
||||
static const struct vga_switcheroo_handler gmux_handler_indexed = {
|
||||
.switchto = gmux_switchto,
|
||||
.power_state = gmux_set_power_state,
|
||||
.get_client_id = gmux_get_client_id,
|
||||
};
|
||||
|
||||
static const struct vga_switcheroo_handler gmux_handler_classic = {
|
||||
.switchto = gmux_switchto,
|
||||
.switch_ddc = gmux_switch_ddc,
|
||||
.power_state = gmux_set_power_state,
|
||||
.get_client_id = gmux_get_client_id,
|
||||
};
|
||||
|
||||
/**
|
||||
* DOC: Interrupt
|
||||
*
|
||||
@@ -513,7 +565,6 @@ static int gmux_suspend(struct device *dev)
|
||||
struct pnp_dev *pnp = to_pnp_dev(dev);
|
||||
struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
|
||||
|
||||
gmux_data->resume_client_id = gmux_active_client(gmux_data);
|
||||
gmux_disable_interrupts(gmux_data);
|
||||
return 0;
|
||||
}
|
||||
@@ -524,7 +575,7 @@ static int gmux_resume(struct device *dev)
|
||||
struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
|
||||
|
||||
gmux_enable_interrupts(gmux_data);
|
||||
gmux_switchto(gmux_data->resume_client_id);
|
||||
gmux_write_switch_state(gmux_data);
|
||||
if (gmux_data->power_state == VGA_SWITCHEROO_OFF)
|
||||
gmux_set_discrete_state(gmux_data, gmux_data->power_state);
|
||||
return 0;
|
||||
@@ -704,9 +755,23 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
|
||||
apple_gmux_data = gmux_data;
|
||||
init_completion(&gmux_data->powerchange_done);
|
||||
gmux_enable_interrupts(gmux_data);
|
||||
gmux_read_switch_state(gmux_data);
|
||||
|
||||
if (vga_switcheroo_register_handler(&gmux_handler)) {
|
||||
ret = -ENODEV;
|
||||
/*
|
||||
* Retina MacBook Pros cannot switch the panel's AUX separately
|
||||
* and need eDP pre-calibration. They are distinguishable from
|
||||
* pre-retinas by having an "indexed" gmux.
|
||||
*
|
||||
* Pre-retina MacBook Pros can switch the panel's DDC separately.
|
||||
*/
|
||||
if (gmux_data->indexed)
|
||||
ret = vga_switcheroo_register_handler(&gmux_handler_indexed,
|
||||
VGA_SWITCHEROO_NEEDS_EDP_CONFIG);
|
||||
else
|
||||
ret = vga_switcheroo_register_handler(&gmux_handler_classic,
|
||||
VGA_SWITCHEROO_CAN_SWITCH_DDC);
|
||||
if (ret) {
|
||||
pr_err("Failed to register vga_switcheroo handler\n");
|
||||
goto err_register_handler;
|
||||
}
|
||||
|
||||
@@ -764,7 +829,7 @@ static void gmux_remove(struct pnp_dev *pnp)
|
||||
}
|
||||
|
||||
static const struct pnp_device_id gmux_device_ids[] = {
|
||||
{"APP000B", 0},
|
||||
{GMUX_ACPI_HID, 0},
|
||||
{"", 0}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user