* [PATCH v2 1/9] acpi: Rename v1 DSM to mux to avoid ambiguity
@ 2015-05-28 6:40 Pierre Moreau
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
0 siblings, 1 reply; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
This is especially true when variables or functions are just called dsm without
specifying the v1.
Changes since v1:
* Fix typo in commit explanation
* Change has_dsm to has_mux in nouveau_dsm_detect
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 72 +++++++++++++++++++++++-----------------------
drm/nouveau/nouveau_acpi.h | 4 +--
drm/nouveau/nouveau_drm.c | 4 +--
drm/nouveau/nouveau_vga.c | 10 +++----
4 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index 6224246..c90037f 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -9,16 +9,16 @@
#include "nouveau_drm.h"
#include "nouveau_acpi.h"
-#define NOUVEAU_DSM_LED 0x02
-#define NOUVEAU_DSM_LED_STATE 0x00
-#define NOUVEAU_DSM_LED_OFF 0x10
-#define NOUVEAU_DSM_LED_STAMINA 0x11
-#define NOUVEAU_DSM_LED_SPEED 0x12
+#define NOUVEAU_DSM_MUX_LED 0x02
+#define NOUVEAU_DSM_MUX_LED_STATE 0x00
+#define NOUVEAU_DSM_MUX_LED_OFF 0x10
+#define NOUVEAU_DSM_MUX_LED_STAMINA 0x11
+#define NOUVEAU_DSM_MUX_LED_SPEED 0x12
-#define NOUVEAU_DSM_POWER 0x03
-#define NOUVEAU_DSM_POWER_STATE 0x00
-#define NOUVEAU_DSM_POWER_SPEED 0x01
-#define NOUVEAU_DSM_POWER_STAMINA 0x02
+#define NOUVEAU_DSM_MUX_POWER 0x03
+#define NOUVEAU_DSM_MUX_POWER_STATE 0x00
+#define NOUVEAU_DSM_MUX_POWER_SPEED 0x01
+#define NOUVEAU_DSM_MUX_POWER_STAMINA 0x02
#define NOUVEAU_DSM_OPTIMUS_CAPS 0x1A
#define NOUVEAU_DSM_OPTIMUS_FLAGS 0x1B
@@ -43,7 +43,7 @@
#define OPTIMUS_HDA_CODEC_MASK (2 << 27) /* hda bios control */
static struct nouveau_dsm_priv {
- bool dsm_detected;
+ bool mux_detected;
bool optimus_detected;
acpi_handle dhandle;
acpi_handle rom_handle;
@@ -53,15 +53,15 @@ bool nouveau_is_optimus(void) {
return nouveau_dsm_priv.optimus_detected;
}
-bool nouveau_is_v1_dsm(void) {
- return nouveau_dsm_priv.dsm_detected;
+bool nouveau_has_mux(void) {
+ return nouveau_dsm_priv.mux_detected;
}
#define NOUVEAU_DSM_HAS_MUX 0x1
#define NOUVEAU_DSM_HAS_OPT 0x2
#ifdef CONFIG_VGA_SWITCHEROO
-static const char nouveau_dsm_muid[] = {
+static const char nouveau_mux_dsm_muid[] = {
0xA0, 0xA0, 0x95, 0x9D, 0x60, 0x00, 0x48, 0x4D,
0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4,
};
@@ -128,7 +128,7 @@ static int nouveau_check_optimus_dsm(acpi_handle handle)
return result & 1 && result & (1 << NOUVEAU_DSM_OPTIMUS_CAPS);
}
-static int nouveau_dsm(acpi_handle handle, int func, int arg)
+static int nouveau_mux_dsm(acpi_handle handle, int func, int arg)
{
int ret = 0;
union acpi_object *obj;
@@ -137,7 +137,7 @@ static int nouveau_dsm(acpi_handle handle, int func, int arg)
.integer.value = arg,
};
- obj = acpi_evaluate_dsm_typed(handle, nouveau_dsm_muid, 0x00000102,
+ obj = acpi_evaluate_dsm_typed(handle, nouveau_mux_dsm_muid, 0x00000102,
func, &argv4, ACPI_TYPE_INTEGER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
@@ -153,30 +153,30 @@ static int nouveau_dsm(acpi_handle handle, int func, int arg)
static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
{
- mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
- mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
- return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id);
+ mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
+ mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
+ return nouveau_mux_dsm(handle, NOUVEAU_DSM_MUX_LED, mux_id);
}
static int nouveau_dsm_set_discrete_state(acpi_handle handle, enum vga_switcheroo_state state)
{
int arg;
if (state == VGA_SWITCHEROO_ON)
- arg = NOUVEAU_DSM_POWER_SPEED;
+ arg = NOUVEAU_DSM_MUX_POWER_SPEED;
else
- arg = NOUVEAU_DSM_POWER_STAMINA;
- nouveau_dsm(handle, NOUVEAU_DSM_POWER, arg);
+ arg = NOUVEAU_DSM_MUX_POWER_STAMINA;
+ nouveau_mux_dsm(handle, NOUVEAU_DSM_MUX_POWER, arg);
return 0;
}
static int nouveau_dsm_switchto(enum vga_switcheroo_client_id id)
{
- if (!nouveau_dsm_priv.dsm_detected)
+ if (!nouveau_dsm_priv.mux_detected)
return 0;
if (id == VGA_SWITCHEROO_IGD)
- return nouveau_dsm_switch_mux(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_LED_STAMINA);
+ return nouveau_dsm_switch_mux(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_MUX_LED_STAMINA);
else
- return nouveau_dsm_switch_mux(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_LED_SPEED);
+ return nouveau_dsm_switch_mux(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_MUX_LED_SPEED);
}
static int nouveau_dsm_power_state(enum vga_switcheroo_client_id id,
@@ -187,7 +187,7 @@ static int nouveau_dsm_power_state(enum vga_switcheroo_client_id id,
/* Optimus laptops have the card already disabled in
* nouveau_switcheroo_set_state */
- if (!nouveau_dsm_priv.dsm_detected)
+ if (!nouveau_dsm_priv.mux_detected)
return 0;
return nouveau_dsm_set_discrete_state(nouveau_dsm_priv.dhandle, state);
@@ -224,8 +224,8 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
if (!acpi_has_method(dhandle, "_DSM"))
return false;
- if (acpi_check_dsm(dhandle, nouveau_dsm_muid, 0x00000102,
- 1 << NOUVEAU_DSM_POWER))
+ if (acpi_check_dsm(dhandle, nouveau_mux_dsm_muid, 0x00000102,
+ 1 << NOUVEAU_DSM_MUX_POWER))
retval |= NOUVEAU_DSM_HAS_MUX;
if (nouveau_check_optimus_dsm(dhandle))
@@ -251,7 +251,7 @@ static bool nouveau_dsm_detect(void)
char acpi_method_name[255] = { 0 };
struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
struct pci_dev *pdev = NULL;
- int has_dsm = 0;
+ int has_mux = 0;
int has_optimus = 0;
int vga_count = 0;
bool guid_valid;
@@ -270,7 +270,7 @@ static bool nouveau_dsm_detect(void)
retval = nouveau_dsm_pci_probe(pdev);
if (retval & NOUVEAU_DSM_HAS_MUX)
- has_dsm |= 1;
+ has_mux |= 1;
if (retval & NOUVEAU_DSM_HAS_OPT)
has_optimus = 1;
}
@@ -280,12 +280,12 @@ static bool nouveau_dsm_detect(void)
retval = nouveau_dsm_pci_probe(pdev);
if (retval & NOUVEAU_DSM_HAS_MUX)
- has_dsm |= 1;
+ has_mux |= 1;
if (retval & NOUVEAU_DSM_HAS_OPT)
has_optimus = 1;
}
- /* find the optimus DSM or the old v1 DSM */
+ /* find the optimus DSM or the mux DSM */
if (has_optimus == 1) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
@@ -293,12 +293,12 @@ static bool nouveau_dsm_detect(void)
acpi_method_name);
nouveau_dsm_priv.optimus_detected = true;
ret = true;
- } else if (vga_count == 2 && has_dsm && guid_valid) {
+ } else if (vga_count == 2 && has_mux && guid_valid) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
- printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n",
+ printk(KERN_INFO "VGA switcheroo: detected mux DSM switching method %s handle\n",
acpi_method_name);
- nouveau_dsm_priv.dsm_detected = true;
+ nouveau_dsm_priv.mux_detected = true;
ret = true;
}
@@ -328,13 +328,13 @@ void nouveau_switcheroo_optimus_dsm(void)
0x3, &result);
nouveau_optimus_dsm(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_OPTIMUS_CAPS,
- NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN, &result);
+ NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN, &result);
}
void nouveau_unregister_dsm_handler(void)
{
- if (nouveau_dsm_priv.optimus_detected || nouveau_dsm_priv.dsm_detected)
+ if (nouveau_dsm_priv.optimus_detected || nouveau_dsm_priv.mux_detected)
vga_switcheroo_unregister_handler();
}
#else
diff --git a/drm/nouveau/nouveau_acpi.h b/drm/nouveau/nouveau_acpi.h
index 74acf0f..2bd88a8 100644
--- a/drm/nouveau/nouveau_acpi.h
+++ b/drm/nouveau/nouveau_acpi.h
@@ -5,7 +5,7 @@
#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
bool nouveau_is_optimus(void);
-bool nouveau_is_v1_dsm(void);
+bool nouveau_has_mux(void);
void nouveau_register_dsm_handler(void);
void nouveau_unregister_dsm_handler(void);
void nouveau_switcheroo_optimus_dsm(void);
@@ -14,7 +14,7 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev);
void *nouveau_acpi_edid(struct drm_device *, struct drm_connector *);
#else
static inline bool nouveau_is_optimus(void) { return false; };
-static inline bool nouveau_is_v1_dsm(void) { return false; };
+static inline bool nouveau_has_mux(void) { return false; };
static inline void nouveau_register_dsm_handler(void) {}
static inline void nouveau_unregister_dsm_handler(void) {}
static inline void nouveau_switcheroo_optimus_dsm(void) {}
diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c
index 8904933..c06a7a1 100644
--- a/drm/nouveau/nouveau_drm.c
+++ b/drm/nouveau/nouveau_drm.c
@@ -719,7 +719,7 @@ nouveau_pmops_runtime_suspend(struct device *dev)
}
/* are we optimus enabled? */
- if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
+ if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
pm_runtime_forbid(dev);
return -EBUSY;
@@ -780,7 +780,7 @@ nouveau_pmops_runtime_idle(struct device *dev)
}
/* are we optimus enabled? */
- if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
+ if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
pm_runtime_forbid(dev);
return -EBUSY;
diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
index c7592ec..6297566 100644
--- a/drm/nouveau/nouveau_vga.c
+++ b/drm/nouveau/nouveau_vga.c
@@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
{
struct drm_device *dev = pci_get_drvdata(pdev);
- if ((nouveau_is_optimus() || nouveau_is_v1_dsm()) && state == VGA_SWITCHEROO_OFF)
+ if ((nouveau_is_optimus() || nouveau_has_mux()) && state == VGA_SWITCHEROO_OFF)
return;
if (state == VGA_SWITCHEROO_ON) {
@@ -96,11 +96,11 @@ nouveau_vga_init(struct nouveau_drm *drm)
if (nouveau_runtime_pm == 1)
runtime = true;
- if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm()))
+ if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
runtime = true;
vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, runtime);
- if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
+ if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
vga_switcheroo_init_domain_pm_ops(drm->dev->dev, &drm->vga_pm_domain);
}
@@ -112,11 +112,11 @@ nouveau_vga_fini(struct nouveau_drm *drm)
if (nouveau_runtime_pm == 1)
runtime = true;
- if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm()))
+ if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
runtime = true;
vga_switcheroo_unregister_client(dev->pdev);
- if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
+ if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
vga_client_register(dev->pdev, NULL, NULL, NULL);
}
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 2/9] acpi: Add evaluate to name of functions evaluating _DSM
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
@ 2015-05-28 6:40 ` Pierre Moreau
2015-05-28 6:40 ` [PATCH 3/9] acpi: Define static variables for revision ids Pierre Moreau
` (6 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
This makes it clearer when reading the function name, as well as following the
names of related ACPI functions.
Changes since v1:
* Fix typo in commit message
* Slightly reformulate the commit message to be clearer
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index c90037f..e18fbeb 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -71,7 +71,7 @@ static const char nouveau_op_dsm_muid[] = {
0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0,
};
-static int nouveau_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
+static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
{
int i;
union acpi_object *obj;
@@ -118,7 +118,7 @@ static int nouveau_check_optimus_dsm(acpi_handle handle)
* Function 0 returns a Buffer containing available functions.
* The args parameter is ignored for function 0, so just put 0 in it
*/
- if (nouveau_optimus_dsm(handle, 0, 0, &result))
+ if (nouveau_evaluate_optimus_dsm(handle, 0, 0, &result))
return 0;
/*
@@ -128,7 +128,7 @@ static int nouveau_check_optimus_dsm(acpi_handle handle)
return result & 1 && result & (1 << NOUVEAU_DSM_OPTIMUS_CAPS);
}
-static int nouveau_mux_dsm(acpi_handle handle, int func, int arg)
+static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
{
int ret = 0;
union acpi_object *obj;
@@ -155,7 +155,7 @@ static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
{
mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
- return nouveau_mux_dsm(handle, NOUVEAU_DSM_MUX_LED, mux_id);
+ return nouveau_evaluate_mux_dsm(handle, NOUVEAU_DSM_MUX_LED, mux_id);
}
static int nouveau_dsm_set_discrete_state(acpi_handle handle, enum vga_switcheroo_state state)
@@ -165,7 +165,7 @@ static int nouveau_dsm_set_discrete_state(acpi_handle handle, enum vga_switchero
arg = NOUVEAU_DSM_MUX_POWER_SPEED;
else
arg = NOUVEAU_DSM_MUX_POWER_STAMINA;
- nouveau_mux_dsm(handle, NOUVEAU_DSM_MUX_POWER, arg);
+ nouveau_evaluate_mux_dsm(handle, NOUVEAU_DSM_MUX_POWER, arg);
return 0;
}
@@ -233,8 +233,8 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
if (retval & NOUVEAU_DSM_HAS_OPT) {
uint32_t result;
- nouveau_optimus_dsm(dhandle, NOUVEAU_DSM_OPTIMUS_CAPS, 0,
- &result);
+ nouveau_evaluate_optimus_dsm(dhandle, NOUVEAU_DSM_OPTIMUS_CAPS,
+ 0, &result);
dev_info(&pdev->dev, "optimus capabilities: %s, status %s%s\n",
(result & OPTIMUS_ENABLED) ? "enabled" : "disabled",
(result & OPTIMUS_DYNAMIC_PWR_CAP) ? "dynamic power, " : "",
@@ -324,11 +324,14 @@ void nouveau_switcheroo_optimus_dsm(void)
if (!nouveau_dsm_priv.optimus_detected)
return;
- nouveau_optimus_dsm(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_OPTIMUS_FLAGS,
- 0x3, &result);
+ nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
+ NOUVEAU_DSM_OPTIMUS_FLAGS,
+ 0x3, &result);
- nouveau_optimus_dsm(nouveau_dsm_priv.dhandle, NOUVEAU_DSM_OPTIMUS_CAPS,
- NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN, &result);
+ nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
+ NOUVEAU_DSM_OPTIMUS_CAPS,
+ NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN,
+ &result);
}
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/9] acpi: Define static variables for revision ids
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-28 6:40 ` [PATCH v2 2/9] acpi: Add evaluate to name of functions evaluating _DSM Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 4/9] acpi: Allow evaluate_optimus_dsm to take NULL results Pierre Moreau
` (5 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index e18fbeb..3f01067 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -61,11 +61,13 @@ bool nouveau_has_mux(void) {
#define NOUVEAU_DSM_HAS_OPT 0x2
#ifdef CONFIG_VGA_SWITCHEROO
+static const uint32_t nouveau_mux_dsm_rid = 0x00000102;
static const char nouveau_mux_dsm_muid[] = {
0xA0, 0xA0, 0x95, 0x9D, 0x60, 0x00, 0x48, 0x4D,
0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4,
};
+static const uint32_t nouveau_op_dsm_rid = 0x00000100;
static const char nouveau_op_dsm_muid[] = {
0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0,
@@ -87,7 +89,7 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
args_buff[i] = (arg >> i * 8) & 0xFF;
*result = 0;
- obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, 0x00000100,
+ obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
func, &argv4, ACPI_TYPE_BUFFER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
@@ -137,7 +139,7 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
.integer.value = arg,
};
- obj = acpi_evaluate_dsm_typed(handle, nouveau_mux_dsm_muid, 0x00000102,
+ obj = acpi_evaluate_dsm_typed(handle, nouveau_mux_dsm_muid, nouveau_mux_dsm_rid,
func, &argv4, ACPI_TYPE_INTEGER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
@@ -224,7 +226,7 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
if (!acpi_has_method(dhandle, "_DSM"))
return false;
- if (acpi_check_dsm(dhandle, nouveau_mux_dsm_muid, 0x00000102,
+ if (acpi_check_dsm(dhandle, nouveau_mux_dsm_muid, nouveau_mux_dsm_rid,
1 << NOUVEAU_DSM_MUX_POWER))
retval |= NOUVEAU_DSM_HAS_MUX;
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 4/9] acpi: Allow evaluate_optimus_dsm to take NULL results
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-28 6:40 ` [PATCH v2 2/9] acpi: Add evaluate to name of functions evaluating _DSM Pierre Moreau
2015-05-28 6:40 ` [PATCH 3/9] acpi: Define static variables for revision ids Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
2015-05-28 6:40 ` [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions Pierre Moreau
` (4 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Changes since v1:
* Fix check for result being not NULL in nouveau_evaluate_optimus_dsm
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index 3f01067..01dbf1d 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -88,15 +88,14 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
for (i = 0; i < 4; i++)
args_buff[i] = (arg >> i * 8) & 0xFF;
- *result = 0;
obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
func, &argv4, ACPI_TYPE_BUFFER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
return AE_ERROR;
} else {
- if (obj->buffer.length == 4) {
- *result |= obj->buffer.pointer[0];
+ if (result && obj->buffer.length == 4) {
+ *result = obj->buffer.pointer[0];
*result |= (obj->buffer.pointer[1] << 8);
*result |= (obj->buffer.pointer[2] << 16);
*result |= (obj->buffer.pointer[3] << 24);
@@ -322,18 +321,17 @@ void nouveau_register_dsm_handler(void)
/* Must be called for Optimus models before the card can be turned off */
void nouveau_switcheroo_optimus_dsm(void)
{
- u32 result = 0;
if (!nouveau_dsm_priv.optimus_detected)
return;
nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
NOUVEAU_DSM_OPTIMUS_FLAGS,
- 0x3, &result);
+ 0x3, NULL);
nouveau_evaluate_optimus_dsm(nouveau_dsm_priv.dhandle,
NOUVEAU_DSM_OPTIMUS_CAPS,
NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN,
- &result);
+ NULL);
}
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
` (2 preceding siblings ...)
2015-05-28 6:40 ` [PATCH v2 4/9] acpi: Allow evaluate_optimus_dsm to take NULL results Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
2015-05-28 6:42 ` [Nouveau] " Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 6/9] acpi: Check returned object type by Optimus _DSM locally Pierre Moreau
` (3 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index 01dbf1d..b837ab1 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -92,7 +92,7 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
func, &argv4, ACPI_TYPE_BUFFER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
- return AE_ERROR;
+ return -EINVAL;
} else {
if (result && obj->buffer.length == 4) {
*result = obj->buffer.pointer[0];
@@ -142,7 +142,7 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
func, &argv4, ACPI_TYPE_INTEGER);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
- return AE_ERROR;
+ return -EINVAL;
} else {
if (obj->integer.value == 0x80000002)
ret = -ENODEV;
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 6/9] acpi: Check returned object type by Optimus _DSM locally
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
` (3 preceding siblings ...)
2015-05-28 6:40 ` [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
[not found] ` <1432795249-4458-6-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-28 6:40 ` [PATCH 7/9] acpi: Improve some messages level and content Pierre Moreau
` (2 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Most _DSM will return an integer value of 0x80000002 when given an unknown
UUID, revision ID or function ID. Checking locally allows us to differentiate
that case from other ACPI errors, and to not report a "failed to evaluate _DSM"
if 0x80000002 is returned which was confusing.
Changes since v1:
* Replace ACPI errors with standard kernel ones
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index b837ab1..44a7328 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -88,12 +88,12 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
for (i = 0; i < 4; i++)
args_buff[i] = (arg >> i * 8) & 0xFF;
- obj = acpi_evaluate_dsm_typed(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
- func, &argv4, ACPI_TYPE_BUFFER);
+ obj = acpi_evaluate_dsm(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
+ func, &argv4);
if (!obj) {
acpi_handle_info(handle, "failed to evaluate _DSM\n");
return -EINVAL;
- } else {
+ } else if (obj->type == ACPI_TYPE_BUFFER) {
if (result && obj->buffer.length == 4) {
*result = obj->buffer.pointer[0];
*result |= (obj->buffer.pointer[1] << 8);
@@ -101,6 +101,15 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
*result |= (obj->buffer.pointer[3] << 24);
}
ACPI_FREE(obj);
+ } else if (obj->type == ACPI_TYPE_INTEGER &&
+ obj->integer.value == 0x80000002) {
+ acpi_handle_debug(handle, "failed to query Optimus _DSM\n");
+ ACPI_FREE(obj);
+ return -ENODEV;
+ } else {
+ acpi_handle_err(handle, "unexpected returned value by Optimus _DSM\n");
+ ACPI_FREE(obj);
+ return -EINVAL;
}
return 0;
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 7/9] acpi: Improve some messages level and content
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
` (4 preceding siblings ...)
2015-05-28 6:40 ` [PATCH v2 6/9] acpi: Check returned object type by Optimus _DSM locally Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 9/9] acpi: Move detecting available _DSM outside of while loops Pierre Moreau
7 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 8 ++++----
drm/nouveau/nouveau_vga.c | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index 44a7328..edc4b94 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -91,7 +91,7 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
obj = acpi_evaluate_dsm(handle, nouveau_op_dsm_muid, nouveau_op_dsm_rid,
func, &argv4);
if (!obj) {
- acpi_handle_info(handle, "failed to evaluate _DSM\n");
+ acpi_handle_err(handle, "failed to evaluate Optimus _DSM\n");
return -EINVAL;
} else if (obj->type == ACPI_TYPE_BUFFER) {
if (result && obj->buffer.length == 4) {
@@ -150,7 +150,7 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
obj = acpi_evaluate_dsm_typed(handle, nouveau_mux_dsm_muid, nouveau_mux_dsm_rid,
func, &argv4, ACPI_TYPE_INTEGER);
if (!obj) {
- acpi_handle_info(handle, "failed to evaluate _DSM\n");
+ acpi_handle_err(handle, "failed to evaluate mux _DSM\n");
return -EINVAL;
} else {
if (obj->integer.value == 0x80000002)
@@ -272,7 +272,7 @@ static bool nouveau_dsm_detect(void)
guid_valid = mxm_wmi_supported();
if (guid_valid)
- printk("MXM: GUID detected in BIOS\n");
+ printk(KERN_INFO "MXM: GUID detected in BIOS\n");
/* now do DSM detection */
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
@@ -375,7 +375,7 @@ static int nouveau_rom_call(acpi_handle rom_handle, uint8_t *bios,
status = acpi_evaluate_object(rom_handle, NULL, &rom_arg, &buffer);
if (ACPI_FAILURE(status)) {
- printk(KERN_INFO "failed to evaluate ROM got %s\n", acpi_format_exception(status));
+ printk(KERN_ERR "ACPI: failed to evaluate ROM got %s\n", acpi_format_exception(status));
return -ENODEV;
}
obj = (union acpi_object *)buffer.pointer;
diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
index 6297566..9a6328f 100644
--- a/drm/nouveau/nouveau_vga.c
+++ b/drm/nouveau/nouveau_vga.c
@@ -40,13 +40,13 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
return;
if (state == VGA_SWITCHEROO_ON) {
- printk(KERN_ERR "VGA switcheroo: switched nouveau on\n");
+ printk(KERN_INFO "VGA switcheroo: switched nouveau on\n");
dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
nouveau_pmops_resume(&pdev->dev);
drm_kms_helper_poll_enable(dev);
dev->switch_power_state = DRM_SWITCH_POWER_ON;
} else {
- printk(KERN_ERR "VGA switcheroo: switched nouveau off\n");
+ printk(KERN_INFO "VGA switcheroo: switched nouveau off\n");
dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
drm_kms_helper_poll_disable(dev);
nouveau_switcheroo_optimus_dsm();
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
` (5 preceding siblings ...)
2015-05-28 6:40 ` [PATCH 7/9] acpi: Improve some messages level and content Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
[not found] ` <1432795249-4458-8-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-29 1:22 ` Ben Skeggs
2015-05-28 6:40 ` [PATCH v2 9/9] acpi: Move detecting available _DSM outside of while loops Pierre Moreau
7 siblings, 2 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Changes since v1:
* Factorise testing of the 3 different _DSMs presence with a single function
* Check for gmux in nouveau_switcheroo_set_state
* Change some comments and messages that were referring explicitly to Optimus
whereas they were also testing the mux and gmux _DSMs
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 57 ++++++++++++++++++++++++++++++++++++++++++++--
drm/nouveau/nouveau_acpi.h | 4 ++++
drm/nouveau/nouveau_drm.c | 12 +++++-----
drm/nouveau/nouveau_vga.c | 10 ++++----
4 files changed, 70 insertions(+), 13 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index edc4b94..ee5fcfa 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -29,6 +29,10 @@
#define NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN (NOUVEAU_DSM_OPTIMUS_POWERDOWN_PS3 | NOUVEAU_DSM_OPTIMUS_FLAGS_CHANGED)
+#define NOUVEAU_DSM_GMUX_V1_CAPS (3 << 6)
+
+#define NOUVEAU_DSM_GMUX_V2_CAPS (1 << 1)
+
/* result of the optimus caps function */
#define OPTIMUS_ENABLED (1 << 0)
#define OPTIMUS_STATUS_MASK (3 << 3)
@@ -45,6 +49,7 @@
static struct nouveau_dsm_priv {
bool mux_detected;
bool optimus_detected;
+ bool gmux_detected;
acpi_handle dhandle;
acpi_handle rom_handle;
} nouveau_dsm_priv;
@@ -57,8 +62,17 @@ bool nouveau_has_mux(void) {
return nouveau_dsm_priv.mux_detected;
}
+bool nouveau_has_gmux(void) {
+ return nouveau_dsm_priv.gmux_detected;
+}
+
+bool nouveau_has_dsm(void) {
+ return nouveau_is_optimus() || nouveau_has_mux() || nouveau_has_gmux();
+}
+
#define NOUVEAU_DSM_HAS_MUX 0x1
#define NOUVEAU_DSM_HAS_OPT 0x2
+#define NOUVEAU_DSM_HAS_GMUX 0x4
#ifdef CONFIG_VGA_SWITCHEROO
static const uint32_t nouveau_mux_dsm_rid = 0x00000102;
@@ -73,6 +87,18 @@ static const char nouveau_op_dsm_muid[] = {
0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0,
};
+static const uint32_t nouveau_gmux_v1_dsm_rid = 0x0000101;
+static const char nouveau_gmux_v1_dsm_muid[] = {
+ 0xA6, 0x69, 0x86, 0x99, 0xE9, 0x8B, 0xFB, 0x49,
+ 0xBD, 0xDB, 0x51, 0xA1, 0xEF, 0xE1, 0x9C, 0x3D,
+};
+
+static const uint32_t nouveau_gmux_v2_dsm_rid = 0x0000001;
+static const char nouveau_gmux_v2_dsm_muid[] = {
+ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
+ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B,
+};
+
static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
{
int i;
@@ -161,6 +187,17 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
return ret;
}
+static int nouveau_check_gmux_dsm(acpi_handle handle)
+{
+ bool has_v1 = acpi_check_dsm(handle, nouveau_gmux_v1_dsm_muid,
+ nouveau_gmux_v1_dsm_rid,
+ NOUVEAU_DSM_GMUX_V1_CAPS);
+ bool has_v2 = acpi_check_dsm(handle, nouveau_gmux_v2_dsm_muid,
+ nouveau_gmux_v2_dsm_rid,
+ NOUVEAU_DSM_GMUX_V2_CAPS);
+ return has_v1 || has_v2;
+}
+
static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
{
mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
@@ -238,6 +275,9 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
1 << NOUVEAU_DSM_MUX_POWER))
retval |= NOUVEAU_DSM_HAS_MUX;
+ if (nouveau_check_gmux_dsm(dhandle))
+ retval |= NOUVEAU_DSM_HAS_GMUX;
+
if (nouveau_check_optimus_dsm(dhandle))
retval |= NOUVEAU_DSM_HAS_OPT;
@@ -263,6 +303,7 @@ static bool nouveau_dsm_detect(void)
struct pci_dev *pdev = NULL;
int has_mux = 0;
int has_optimus = 0;
+ bool has_gmux = false;
int vga_count = 0;
bool guid_valid;
int retval;
@@ -283,6 +324,8 @@ static bool nouveau_dsm_detect(void)
has_mux |= 1;
if (retval & NOUVEAU_DSM_HAS_OPT)
has_optimus = 1;
+ if (retval & NOUVEAU_DSM_HAS_GMUX)
+ has_gmux = true;
}
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_3D << 8, pdev)) != NULL) {
@@ -293,9 +336,11 @@ static bool nouveau_dsm_detect(void)
has_mux |= 1;
if (retval & NOUVEAU_DSM_HAS_OPT)
has_optimus = 1;
+ if (retval & NOUVEAU_DSM_HAS_GMUX)
+ has_gmux = true;
}
- /* find the optimus DSM or the mux DSM */
+ /* find the optimus DSM, the mux DSM or the gmux DSM */
if (has_optimus == 1) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
@@ -310,6 +355,13 @@ static bool nouveau_dsm_detect(void)
acpi_method_name);
nouveau_dsm_priv.mux_detected = true;
ret = true;
+ } else if (has_gmux) {
+ acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
+ &buffer);
+ printk(KERN_INFO "VGA switcheroo: detected gmux DSM switching method %s handle\n",
+ acpi_method_name);
+ nouveau_dsm_priv.gmux_detected = true;
+ ret = true;
}
@@ -321,7 +373,8 @@ void nouveau_register_dsm_handler(void)
bool r;
r = nouveau_dsm_detect();
- if (!r)
+ /* Apple Gmux will register its own vga switcheroo handler */
+ if (!r || nouveau_has_gmux())
return;
vga_switcheroo_register_handler(&nouveau_dsm_handler);
diff --git a/drm/nouveau/nouveau_acpi.h b/drm/nouveau/nouveau_acpi.h
index 2bd88a8..e57ca3c 100644
--- a/drm/nouveau/nouveau_acpi.h
+++ b/drm/nouveau/nouveau_acpi.h
@@ -6,6 +6,8 @@
#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
bool nouveau_is_optimus(void);
bool nouveau_has_mux(void);
+bool nouveau_has_gmux(void);
+bool nouveau_has_dsm(void);
void nouveau_register_dsm_handler(void);
void nouveau_unregister_dsm_handler(void);
void nouveau_switcheroo_optimus_dsm(void);
@@ -15,6 +17,8 @@ void *nouveau_acpi_edid(struct drm_device *, struct drm_connector *);
#else
static inline bool nouveau_is_optimus(void) { return false; };
static inline bool nouveau_has_mux(void) { return false; };
+static inline bool nouveau_has_gmux(void) { return false; };
+static inline bool nouveau_has_dsm(void) { return false; };
static inline void nouveau_register_dsm_handler(void) {}
static inline void nouveau_unregister_dsm_handler(void) {}
static inline void nouveau_switcheroo_optimus_dsm(void) {}
diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c
index c06a7a1..5f85251 100644
--- a/drm/nouveau/nouveau_drm.c
+++ b/drm/nouveau/nouveau_drm.c
@@ -718,9 +718,9 @@ nouveau_pmops_runtime_suspend(struct device *dev)
return -EBUSY;
}
- /* are we optimus enabled? */
- if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
- DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
+ /* do we have a _DSM for switching? */
+ if (nouveau_runtime_pm == -1 && !nouveau_has_dsm()) {
+ DRM_DEBUG_DRIVER("failing to power off - no valid _DSM found\n");
pm_runtime_forbid(dev);
return -EBUSY;
}
@@ -779,9 +779,9 @@ nouveau_pmops_runtime_idle(struct device *dev)
return -EBUSY;
}
- /* are we optimus enabled? */
- if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
- DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
+ /* do we have a _DSM for switching? */
+ if (nouveau_runtime_pm == -1 && !nouveau_has_dsm()) {
+ DRM_DEBUG_DRIVER("failing to power off - no valid _DSM found\n");
pm_runtime_forbid(dev);
return -EBUSY;
}
diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
index 9a6328f..7b13804 100644
--- a/drm/nouveau/nouveau_vga.c
+++ b/drm/nouveau/nouveau_vga.c
@@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
{
struct drm_device *dev = pci_get_drvdata(pdev);
- if ((nouveau_is_optimus() || nouveau_has_mux()) && state == VGA_SWITCHEROO_OFF)
+ if (nouveau_has_dsm() && state == VGA_SWITCHEROO_OFF)
return;
if (state == VGA_SWITCHEROO_ON) {
@@ -96,11 +96,11 @@ nouveau_vga_init(struct nouveau_drm *drm)
if (nouveau_runtime_pm == 1)
runtime = true;
- if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
+ if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
runtime = true;
vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, runtime);
- if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
+ if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && !nouveau_is_optimus())
vga_switcheroo_init_domain_pm_ops(drm->dev->dev, &drm->vga_pm_domain);
}
@@ -112,11 +112,11 @@ nouveau_vga_fini(struct nouveau_drm *drm)
if (nouveau_runtime_pm == 1)
runtime = true;
- if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
+ if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
runtime = true;
vga_switcheroo_unregister_client(dev->pdev);
- if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
+ if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && !nouveau_is_optimus())
vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
vga_client_register(dev->pdev, NULL, NULL, NULL);
}
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 9/9] acpi: Move detecting available _DSM outside of while loops
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
` (6 preceding siblings ...)
2015-05-28 6:40 ` [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS Pierre Moreau
@ 2015-05-28 6:40 ` Pierre Moreau
7 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:40 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Changes since v1:
* Re-write the whole patch to detect available _DSMs when we enable them rather
than on each loop run
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
---
drm/nouveau/nouveau_acpi.c | 27 ++++++---------------------
1 file changed, 6 insertions(+), 21 deletions(-)
diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
index ee5fcfa..a970e41 100644
--- a/drm/nouveau/nouveau_acpi.c
+++ b/drm/nouveau/nouveau_acpi.c
@@ -301,12 +301,9 @@ static bool nouveau_dsm_detect(void)
char acpi_method_name[255] = { 0 };
struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
struct pci_dev *pdev = NULL;
- int has_mux = 0;
- int has_optimus = 0;
- bool has_gmux = false;
int vga_count = 0;
bool guid_valid;
- int retval;
+ int retval = 0;
bool ret = false;
/* lookup the MXM GUID */
@@ -319,43 +316,31 @@ static bool nouveau_dsm_detect(void)
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
vga_count++;
- retval = nouveau_dsm_pci_probe(pdev);
- if (retval & NOUVEAU_DSM_HAS_MUX)
- has_mux |= 1;
- if (retval & NOUVEAU_DSM_HAS_OPT)
- has_optimus = 1;
- if (retval & NOUVEAU_DSM_HAS_GMUX)
- has_gmux = true;
+ retval |= nouveau_dsm_pci_probe(pdev);
}
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_3D << 8, pdev)) != NULL) {
vga_count++;
- retval = nouveau_dsm_pci_probe(pdev);
- if (retval & NOUVEAU_DSM_HAS_MUX)
- has_mux |= 1;
- if (retval & NOUVEAU_DSM_HAS_OPT)
- has_optimus = 1;
- if (retval & NOUVEAU_DSM_HAS_GMUX)
- has_gmux = true;
+ retval |= nouveau_dsm_pci_probe(pdev);
}
/* find the optimus DSM, the mux DSM or the gmux DSM */
- if (has_optimus == 1) {
+ if (retval & NOUVEAU_DSM_HAS_OPT) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
printk(KERN_INFO "VGA switcheroo: detected Optimus DSM method %s handle\n",
acpi_method_name);
nouveau_dsm_priv.optimus_detected = true;
ret = true;
- } else if (vga_count == 2 && has_mux && guid_valid) {
+ } else if (vga_count == 2 && (retval & NOUVEAU_DSM_HAS_MUX) && guid_valid) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
printk(KERN_INFO "VGA switcheroo: detected mux DSM switching method %s handle\n",
acpi_method_name);
nouveau_dsm_priv.mux_detected = true;
ret = true;
- } else if (has_gmux) {
+ } else if (retval & NOUVEAU_DSM_HAS_GMUX) {
acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
&buffer);
printk(KERN_INFO "VGA switcheroo: detected gmux DSM switching method %s handle\n",
--
2.4.2
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Nouveau] [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions
2015-05-28 6:40 ` [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions Pierre Moreau
@ 2015-05-28 6:42 ` Pierre Moreau
0 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 6:42 UTC (permalink / raw)
To: nouveau@lists.freedesktop.org
Cc: bskeggs@redhat.com, dri-devel@lists.freedesktop.org
I wasn't sure how to insert this one into the flow, if I should make it a patch 4.5 or not. I went with patch 5, so all the following patches are incremented by 1 compared to the v1, sorry about that.
What should be the way to go?
Pierre
> On 28 May 2015, at 08:40, Pierre Moreau <pierre.morrow@free.fr> wrote:
>
> Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
> ---
> drm/nouveau/nouveau_acpi.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
> index 01dbf1d..b837ab1 100644
> --- a/drm/nouveau/nouveau_acpi.c
> +++ b/drm/nouveau/nouveau_acpi.c
> @@ -92,7 +92,7 @@ static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, u
> func, &argv4, ACPI_TYPE_BUFFER);
> if (!obj) {
> acpi_handle_info(handle, "failed to evaluate _DSM\n");
> - return AE_ERROR;
> + return -EINVAL;
> } else {
> if (result && obj->buffer.length == 4) {
> *result = obj->buffer.pointer[0];
> @@ -142,7 +142,7 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
> func, &argv4, ACPI_TYPE_INTEGER);
> if (!obj) {
> acpi_handle_info(handle, "failed to evaluate _DSM\n");
> - return AE_ERROR;
> + return -EINVAL;
> } else {
> if (obj->integer.value == 0x80000002)
> ret = -ENODEV;
> --
> 2.4.2
>
> _______________________________________________
> Nouveau mailing list
> Nouveau@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
[not found] ` <1432795249-4458-8-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
@ 2015-05-28 8:52 ` Pierre Moreau
[not found] ` <1121819706.18409644.1432803176893.JavaMail.root-x5ewXQG5twBsFmKuirFwRhh1pbbyJDp15NbjCUgZEJk@public.gmane.org>
2015-05-30 18:23 ` [Nouveau] " Lukas Wunner
0 siblings, 2 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-28 8:52 UTC (permalink / raw)
To: Dave Airlie, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: bskeggs-H+wXaHxf7aLQT0dZR+AlfA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Hi Dave,
----- Mail original -----
> Changes since v1:
[...]
> diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
> index 9a6328f..7b13804 100644
> --- a/drm/nouveau/nouveau_vga.c
> +++ b/drm/nouveau/nouveau_vga.c
> @@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
> {
> struct drm_device *dev = pci_get_drvdata(pdev);
>
> - if ((nouveau_is_optimus() || nouveau_has_mux()) && state ==
> VGA_SWITCHEROO_OFF)
If I understand it correctly, if the laptop is an Optimus one or has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by powering down the card?
In the same commit adding this conditional (5addcf0a5f0fadceba6bd562d0616a1c5d4c1a4d), you added the possibility to enable/disable dynpm. How is it supposed to work, by simply echo'ing ON or OFF to vga_switcheroo/switch? Then I probably forgot some stuff as it doesn't want to work on my laptop.
Pierre
> + if (nouveau_has_dsm() && state == VGA_SWITCHEROO_OFF)
> return;
>
> if (state == VGA_SWITCHEROO_ON) {
> @@ -96,11 +96,11 @@ nouveau_vga_init(struct nouveau_drm *drm)
>
> if (nouveau_runtime_pm == 1)
> runtime = true;
> - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() ||
> nouveau_has_mux()))
> + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
> runtime = true;
> vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops,
> runtime);
>
> - if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
> + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) &&
> !nouveau_is_optimus())
> vga_switcheroo_init_domain_pm_ops(drm->dev->dev,
> &drm->vga_pm_domain);
> }
>
> @@ -112,11 +112,11 @@ nouveau_vga_fini(struct nouveau_drm *drm)
>
> if (nouveau_runtime_pm == 1)
> runtime = true;
> - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() ||
> nouveau_has_mux()))
> + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
> runtime = true;
>
> vga_switcheroo_unregister_client(dev->pdev);
> - if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
> + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) &&
> !nouveau_is_optimus())
> vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
> vga_client_register(dev->pdev, NULL, NULL, NULL);
> }
> --
> 2.4.2
>
> _______________________________________________
> Nouveau mailing list
> Nouveau@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
>
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 6/9] acpi: Check returned object type by Optimus _DSM locally
[not found] ` <1432795249-4458-6-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
@ 2015-05-29 1:17 ` Dave Airlie
0 siblings, 0 replies; 16+ messages in thread
From: Dave Airlie @ 2015-05-29 1:17 UTC (permalink / raw)
To: Pierre Moreau; +Cc: nouveau, Ben Skeggs, dri-devel
On 28 May 2015 at 16:40, Pierre Moreau <pierre.morrow@free.fr> wrote:
> Most _DSM will return an integer value of 0x80000002 when given an unknown
> UUID, revision ID or function ID. Checking locally allows us to differentiate
> that case from other ACPI errors, and to not report a "failed to evaluate _DSM"
> if 0x80000002 is returned which was confusing.
>
> Changes since v1:
> * Replace ACPI errors with standard kernel ones
>
> Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Dave.
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
[not found] ` <1121819706.18409644.1432803176893.JavaMail.root-x5ewXQG5twBsFmKuirFwRhh1pbbyJDp15NbjCUgZEJk@public.gmane.org>
@ 2015-05-29 1:20 ` Dave Airlie
0 siblings, 0 replies; 16+ messages in thread
From: Dave Airlie @ 2015-05-29 1:20 UTC (permalink / raw)
To: Pierre Moreau; +Cc: nouveau, Ben Skeggs, dri-devel
On 28 May 2015 at 18:52, Pierre Moreau <pierre.morrow@free.fr> wrote:
> Hi Dave,
>
>
> ----- Mail original -----
>> Changes since v1:
> [...]
>> diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
>> index 9a6328f..7b13804 100644
>> --- a/drm/nouveau/nouveau_vga.c
>> +++ b/drm/nouveau/nouveau_vga.c
>> @@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
>> {
>> struct drm_device *dev = pci_get_drvdata(pdev);
>>
>> - if ((nouveau_is_optimus() || nouveau_has_mux()) && state ==
>> VGA_SWITCHEROO_OFF)
>
> If I understand it correctly, if the laptop is an Optimus one or has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by powering down the card?
> In the same commit adding this conditional (5addcf0a5f0fadceba6bd562d0616a1c5d4c1a4d), you added the possibility to enable/disable dynpm. How is it supposed to work, by simply echo'ing ON or OFF to vga_switcheroo/switch? Then I probably forgot some stuff as it doesn't want to work on my laptop.
>
I can't remember to be honest
I think I wanted to stop the user from changing the state if it was
dynamic, now if you turn off dynpm then you should probably enable
that.
Dave.
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
2015-05-28 6:40 ` [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS Pierre Moreau
[not found] ` <1432795249-4458-8-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
@ 2015-05-29 1:22 ` Ben Skeggs
1 sibling, 0 replies; 16+ messages in thread
From: Ben Skeggs @ 2015-05-29 1:22 UTC (permalink / raw)
To: Pierre Moreau
Cc: nouveau@lists.freedesktop.org, Ben Skeggs,
dri-devel@lists.freedesktop.org
On 28 May 2015 at 16:40, Pierre Moreau <pierre.morrow@free.fr> wrote:
> Changes since v1:
> * Factorise testing of the 3 different _DSMs presence with a single function
Not overly important, but this part could be split out into an earlier
commit, keeping this commit just for adding the gmux support?
> * Check for gmux in nouveau_switcheroo_set_state
> * Change some comments and messages that were referring explicitly to Optimus
> whereas they were also testing the mux and gmux _DSMs
As could this part.
Thanks,
Ben.
>
> Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
> ---
> drm/nouveau/nouveau_acpi.c | 57 ++++++++++++++++++++++++++++++++++++++++++++--
> drm/nouveau/nouveau_acpi.h | 4 ++++
> drm/nouveau/nouveau_drm.c | 12 +++++-----
> drm/nouveau/nouveau_vga.c | 10 ++++----
> 4 files changed, 70 insertions(+), 13 deletions(-)
>
> diff --git a/drm/nouveau/nouveau_acpi.c b/drm/nouveau/nouveau_acpi.c
> index edc4b94..ee5fcfa 100644
> --- a/drm/nouveau/nouveau_acpi.c
> +++ b/drm/nouveau/nouveau_acpi.c
> @@ -29,6 +29,10 @@
>
> #define NOUVEAU_DSM_OPTIMUS_SET_POWERDOWN (NOUVEAU_DSM_OPTIMUS_POWERDOWN_PS3 | NOUVEAU_DSM_OPTIMUS_FLAGS_CHANGED)
>
> +#define NOUVEAU_DSM_GMUX_V1_CAPS (3 << 6)
> +
> +#define NOUVEAU_DSM_GMUX_V2_CAPS (1 << 1)
> +
> /* result of the optimus caps function */
> #define OPTIMUS_ENABLED (1 << 0)
> #define OPTIMUS_STATUS_MASK (3 << 3)
> @@ -45,6 +49,7 @@
> static struct nouveau_dsm_priv {
> bool mux_detected;
> bool optimus_detected;
> + bool gmux_detected;
> acpi_handle dhandle;
> acpi_handle rom_handle;
> } nouveau_dsm_priv;
> @@ -57,8 +62,17 @@ bool nouveau_has_mux(void) {
> return nouveau_dsm_priv.mux_detected;
> }
>
> +bool nouveau_has_gmux(void) {
> + return nouveau_dsm_priv.gmux_detected;
> +}
> +
> +bool nouveau_has_dsm(void) {
> + return nouveau_is_optimus() || nouveau_has_mux() || nouveau_has_gmux();
> +}
> +
> #define NOUVEAU_DSM_HAS_MUX 0x1
> #define NOUVEAU_DSM_HAS_OPT 0x2
> +#define NOUVEAU_DSM_HAS_GMUX 0x4
>
> #ifdef CONFIG_VGA_SWITCHEROO
> static const uint32_t nouveau_mux_dsm_rid = 0x00000102;
> @@ -73,6 +87,18 @@ static const char nouveau_op_dsm_muid[] = {
> 0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0,
> };
>
> +static const uint32_t nouveau_gmux_v1_dsm_rid = 0x0000101;
> +static const char nouveau_gmux_v1_dsm_muid[] = {
> + 0xA6, 0x69, 0x86, 0x99, 0xE9, 0x8B, 0xFB, 0x49,
> + 0xBD, 0xDB, 0x51, 0xA1, 0xEF, 0xE1, 0x9C, 0x3D,
> +};
> +
> +static const uint32_t nouveau_gmux_v2_dsm_rid = 0x0000001;
> +static const char nouveau_gmux_v2_dsm_muid[] = {
> + 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
> + 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B,
> +};
> +
> static int nouveau_evaluate_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
> {
> int i;
> @@ -161,6 +187,17 @@ static int nouveau_evaluate_mux_dsm(acpi_handle handle, int func, int arg)
> return ret;
> }
>
> +static int nouveau_check_gmux_dsm(acpi_handle handle)
> +{
> + bool has_v1 = acpi_check_dsm(handle, nouveau_gmux_v1_dsm_muid,
> + nouveau_gmux_v1_dsm_rid,
> + NOUVEAU_DSM_GMUX_V1_CAPS);
> + bool has_v2 = acpi_check_dsm(handle, nouveau_gmux_v2_dsm_muid,
> + nouveau_gmux_v2_dsm_rid,
> + NOUVEAU_DSM_GMUX_V2_CAPS);
> + return has_v1 || has_v2;
> +}
> +
> static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
> {
> mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_MUX_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
> @@ -238,6 +275,9 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
> 1 << NOUVEAU_DSM_MUX_POWER))
> retval |= NOUVEAU_DSM_HAS_MUX;
>
> + if (nouveau_check_gmux_dsm(dhandle))
> + retval |= NOUVEAU_DSM_HAS_GMUX;
> +
> if (nouveau_check_optimus_dsm(dhandle))
> retval |= NOUVEAU_DSM_HAS_OPT;
>
> @@ -263,6 +303,7 @@ static bool nouveau_dsm_detect(void)
> struct pci_dev *pdev = NULL;
> int has_mux = 0;
> int has_optimus = 0;
> + bool has_gmux = false;
> int vga_count = 0;
> bool guid_valid;
> int retval;
> @@ -283,6 +324,8 @@ static bool nouveau_dsm_detect(void)
> has_mux |= 1;
> if (retval & NOUVEAU_DSM_HAS_OPT)
> has_optimus = 1;
> + if (retval & NOUVEAU_DSM_HAS_GMUX)
> + has_gmux = true;
> }
>
> while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_3D << 8, pdev)) != NULL) {
> @@ -293,9 +336,11 @@ static bool nouveau_dsm_detect(void)
> has_mux |= 1;
> if (retval & NOUVEAU_DSM_HAS_OPT)
> has_optimus = 1;
> + if (retval & NOUVEAU_DSM_HAS_GMUX)
> + has_gmux = true;
> }
>
> - /* find the optimus DSM or the mux DSM */
> + /* find the optimus DSM, the mux DSM or the gmux DSM */
> if (has_optimus == 1) {
> acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
> &buffer);
> @@ -310,6 +355,13 @@ static bool nouveau_dsm_detect(void)
> acpi_method_name);
> nouveau_dsm_priv.mux_detected = true;
> ret = true;
> + } else if (has_gmux) {
> + acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME,
> + &buffer);
> + printk(KERN_INFO "VGA switcheroo: detected gmux DSM switching method %s handle\n",
> + acpi_method_name);
> + nouveau_dsm_priv.gmux_detected = true;
> + ret = true;
> }
>
>
> @@ -321,7 +373,8 @@ void nouveau_register_dsm_handler(void)
> bool r;
>
> r = nouveau_dsm_detect();
> - if (!r)
> + /* Apple Gmux will register its own vga switcheroo handler */
> + if (!r || nouveau_has_gmux())
> return;
>
> vga_switcheroo_register_handler(&nouveau_dsm_handler);
> diff --git a/drm/nouveau/nouveau_acpi.h b/drm/nouveau/nouveau_acpi.h
> index 2bd88a8..e57ca3c 100644
> --- a/drm/nouveau/nouveau_acpi.h
> +++ b/drm/nouveau/nouveau_acpi.h
> @@ -6,6 +6,8 @@
> #if defined(CONFIG_ACPI) && defined(CONFIG_X86)
> bool nouveau_is_optimus(void);
> bool nouveau_has_mux(void);
> +bool nouveau_has_gmux(void);
> +bool nouveau_has_dsm(void);
> void nouveau_register_dsm_handler(void);
> void nouveau_unregister_dsm_handler(void);
> void nouveau_switcheroo_optimus_dsm(void);
> @@ -15,6 +17,8 @@ void *nouveau_acpi_edid(struct drm_device *, struct drm_connector *);
> #else
> static inline bool nouveau_is_optimus(void) { return false; };
> static inline bool nouveau_has_mux(void) { return false; };
> +static inline bool nouveau_has_gmux(void) { return false; };
> +static inline bool nouveau_has_dsm(void) { return false; };
> static inline void nouveau_register_dsm_handler(void) {}
> static inline void nouveau_unregister_dsm_handler(void) {}
> static inline void nouveau_switcheroo_optimus_dsm(void) {}
> diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c
> index c06a7a1..5f85251 100644
> --- a/drm/nouveau/nouveau_drm.c
> +++ b/drm/nouveau/nouveau_drm.c
> @@ -718,9 +718,9 @@ nouveau_pmops_runtime_suspend(struct device *dev)
> return -EBUSY;
> }
>
> - /* are we optimus enabled? */
> - if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
> - DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
> + /* do we have a _DSM for switching? */
> + if (nouveau_runtime_pm == -1 && !nouveau_has_dsm()) {
> + DRM_DEBUG_DRIVER("failing to power off - no valid _DSM found\n");
> pm_runtime_forbid(dev);
> return -EBUSY;
> }
> @@ -779,9 +779,9 @@ nouveau_pmops_runtime_idle(struct device *dev)
> return -EBUSY;
> }
>
> - /* are we optimus enabled? */
> - if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_has_mux()) {
> - DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
> + /* do we have a _DSM for switching? */
> + if (nouveau_runtime_pm == -1 && !nouveau_has_dsm()) {
> + DRM_DEBUG_DRIVER("failing to power off - no valid _DSM found\n");
> pm_runtime_forbid(dev);
> return -EBUSY;
> }
> diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c
> index 9a6328f..7b13804 100644
> --- a/drm/nouveau/nouveau_vga.c
> +++ b/drm/nouveau/nouveau_vga.c
> @@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev,
> {
> struct drm_device *dev = pci_get_drvdata(pdev);
>
> - if ((nouveau_is_optimus() || nouveau_has_mux()) && state == VGA_SWITCHEROO_OFF)
> + if (nouveau_has_dsm() && state == VGA_SWITCHEROO_OFF)
> return;
>
> if (state == VGA_SWITCHEROO_ON) {
> @@ -96,11 +96,11 @@ nouveau_vga_init(struct nouveau_drm *drm)
>
> if (nouveau_runtime_pm == 1)
> runtime = true;
> - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
> + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
> runtime = true;
> vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, runtime);
>
> - if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
> + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && !nouveau_is_optimus())
> vga_switcheroo_init_domain_pm_ops(drm->dev->dev, &drm->vga_pm_domain);
> }
>
> @@ -112,11 +112,11 @@ nouveau_vga_fini(struct nouveau_drm *drm)
>
> if (nouveau_runtime_pm == 1)
> runtime = true;
> - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_has_mux()))
> + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm())
> runtime = true;
>
> vga_switcheroo_unregister_client(dev->pdev);
> - if (runtime && nouveau_has_mux() && !nouveau_is_optimus())
> + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && !nouveau_is_optimus())
> vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
> vga_client_register(dev->pdev, NULL, NULL, NULL);
> }
> --
> 2.4.2
>
> _______________________________________________
> Nouveau mailing list
> Nouveau@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
2015-05-28 8:52 ` Pierre Moreau
[not found] ` <1121819706.18409644.1432803176893.JavaMail.root-x5ewXQG5twBsFmKuirFwRhh1pbbyJDp15NbjCUgZEJk@public.gmane.org>
@ 2015-05-30 18:23 ` Lukas Wunner
2015-05-30 21:21 ` Pierre Moreau
1 sibling, 1 reply; 16+ messages in thread
From: Lukas Wunner @ 2015-05-30 18:23 UTC (permalink / raw)
To: Pierre Moreau; +Cc: nouveau, bskeggs, dri-devel
Hi Pierre,
On Thu, May 28, 2015 at 10:52:56AM +0200, Pierre Moreau wrote:
> How is it supposed to work, by simply echo'ing ON or OFF to
> vga_switcheroo/switch? Then I probably forgot some stuff as
> it doesn't want to work on my laptop.
What exactly doesn't work and which version of the MacBook Pro did
you try this on? The expected behaviour when switching GPUs on the
MBP is that the GPU that was inactive on bootup will only show a
black screen because it was unable to read the EDID (and DPCD on
retina MBPs) on bootup. In other words, it's broken.
There have been attempts to solve this by multiple folks, the last
one was submitted to dri-devel in April by yours truly:
http://lists.freedesktop.org/archives/dri-devel/2015-April/081515.html
That initial version of my patch set turned out to only work on
pre-retina MBPs, and only if the active GPU on bootup is the
discrete one. I'm currently working on a v2 to solve all that.
We need to get switching working before we can enable runtime PM on
MBPs, otherwise the user will be greeted by a black screen when the
Nvidia GPU goes to sleep and hands over to the integrated GPU.
So your patch is a bit premature I'm afraid. :-(
As to the patch itself, you're checking for existence of the gmux
but we can't make use of it unless its driver is loaded. Hence it
may be easier to simply query for the existence of the driver,
using something along the lines of find_module("apple-gmux").
I imagine this is much less code than checking for the DMI IDs.
Also, Dave Airlie and Matthew Garrett already wrote a patch set to
enable runtime PM for nouveau on MBPs which is more generic: It works
with any vga_switcheroo handler, not just gmux:
http://lists.freedesktop.org/archives/dri-devel/2014-June/060927.html
http://lists.freedesktop.org/archives/dri-devel/2014-June/060928.html
http://lists.freedesktop.org/archives/dri-devel/2014-June/060942.html
http://www.codon.org.uk/~mjg59/tmp/retina_patches/0027-nouveau-enable-runtime-pm-on-apple-gmux-machines.patch
http://www.codon.org.uk/~mjg59/tmp/retina_patches/0028-nouveau-Enable-switcheroo-dynamic-PM-at-switcheroo-e.patch
The fourth one in that list is by Dave Airlie and all the others are
by Matthew Garrett. But, as I said, we can't apply these either until
switching works. I'm working on it. ;-)
As to your questions:
> How is it supposed to work, by simply echo'ing ON or OFF to
> vga_switcheroo/switch?
Echoing ON/OFF to the "switch" file will power the inactive device
up or down. If the currently active gpu is the discrete one (which
is the default when booting a MacBook Pro), this will power up/down
the integrated gpu. You can use the tool "gpu-switch" to force the
MBP to the integrated GPU on next bootup, then you can echo ON/OFF
to change the power state of the Nvidia GPU:
https://github.com/0xbb/gpu-switch
> If I understand it correctly, if the laptop is an Optimus one or
> has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by
> powering down the card?
If we power the GPU down manually by echoing OFF to the "switch"
file, the runtime PM code would probably get confused, I imagine
that's the reason why ON/OFF is ignored if client->driver_power_control
is set to true.
Speaking of which, the external ports of the MBP are soldered to
the discrete GPU and can't be switched. Only the panel can be
switched. So if there are DP or HDMI connectors with status
connected, we can't suspend. That's one of the MBP's numerous
peculiarities that I haven't verified yet they're handled properly
by the code.
Best regards,
Lukas
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
2015-05-30 18:23 ` [Nouveau] " Lukas Wunner
@ 2015-05-30 21:21 ` Pierre Moreau
0 siblings, 0 replies; 16+ messages in thread
From: Pierre Moreau @ 2015-05-30 21:21 UTC (permalink / raw)
To: Lukas Wunner; +Cc: nouveau, bskeggs, dri-devel
Hi Lukas
----- Mail original -----
> Hi Pierre,
>
> On Thu, May 28, 2015 at 10:52:56AM +0200, Pierre Moreau wrote:
> > How is it supposed to work, by simply echo'ing ON or OFF to
> > vga_switcheroo/switch? Then I probably forgot some stuff as
> > it doesn't want to work on my laptop.
>
> What exactly doesn't work and which version of the MacBook Pro did
> you try this on? The expected behaviour when switching GPUs on the
> MBP is that the GPU that was inactive on bootup will only show a
> black screen because it was unable to read the EDID (and DPCD on
> retina MBPs) on bootup. In other words, it's broken.
I'm trying on a mid-2009 MBP, which has a double NVidia setup with a 9400M as IGD and 9600M GT as DIS. Switching between both works (as long as do a PCI-reset of the G96, but that's another story and I should have a patch soon, hopefully).
It was also tested by another user on a retina MBP and we ran into the black screen issue. I pointed him to your patches, but I don't know yet if it helped or not.
>
> There have been attempts to solve this by multiple folks, the last
> one was submitted to dri-devel in April by yours truly:
> http://lists.freedesktop.org/archives/dri-devel/2015-April/081515.html
>
> That initial version of my patch set turned out to only work on
> pre-retina MBPs, and only if the active GPU on bootup is the
> discrete one. I'm currently working on a v2 to solve all that.
Cool! Looking forward to it!
>
> We need to get switching working before we can enable runtime PM on
> MBPs, otherwise the user will be greeted by a black screen when the
> Nvidia GPU goes to sleep and hands over to the integrated GPU.
> So your patch is a bit premature I'm afraid. :-(
It's power management++: we even save energy on the screen by "powering it off" for better battery life! ;)
>
>
> As to the patch itself, you're checking for existence of the gmux
> but we can't make use of it unless its driver is loaded. Hence it
> may be easier to simply query for the existence of the driver,
> using something along the lines of find_module("apple-gmux").
> I imagine this is much less code than checking for the DMI IDs.
I didn't know there was such a function! Seems nice!
>
> Also, Dave Airlie and Matthew Garrett already wrote a patch set to
> enable runtime PM for nouveau on MBPs which is more generic: It works
> with any vga_switcheroo handler, not just gmux:
>
> http://lists.freedesktop.org/archives/dri-devel/2014-June/060927.html
> http://lists.freedesktop.org/archives/dri-devel/2014-June/060928.html
> http://lists.freedesktop.org/archives/dri-devel/2014-June/060942.html
> http://www.codon.org.uk/~mjg59/tmp/retina_patches/0027-nouveau-enable-runtime-pm-on-apple-gmux-machines.patch
> http://www.codon.org.uk/~mjg59/tmp/retina_patches/0028-nouveau-Enable-switcheroo-dynamic-PM-at-switcheroo-e.patch
>
> The fourth one in that list is by Dave Airlie and all the others are
> by Matthew Garrett. But, as I said, we can't apply these either until
> switching works. I'm working on it. ;-)
I had no idea these patches existed: I should have looked around before.
I'll drop the patches, apart probably from the *cleaning* ones, but I'll wait for the previously mentioned ones to first land.
>
>
> As to your questions:
>
> > How is it supposed to work, by simply echo'ing ON or OFF to
> > vga_switcheroo/switch?
>
> Echoing ON/OFF to the "switch" file will power the inactive device
> up or down. If the currently active gpu is the discrete one (which
> is the default when booting a MacBook Pro)
Not on the mid-2009 MBP! ;) Which is great!
> , this will power up/down
> the integrated gpu. You can use the tool "gpu-switch" to force the
> MBP to the integrated GPU on next bootup, then you can echo ON/OFFI'ddd
> to change the power state of the Nvidia GPU:
> https://github.com/0xbb/gpu-switch
>
> > If I understand it correctly, if the laptop is an Optimus one or
> > has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by
> > powering down the card?
>
> If we power the GPU down manually by echoing OFF to the "switch"
> file, the runtime PM code would probably get confused, I imagine
> that's the reason why ON/OFF is ignored if
> client->driver_power_control
> is set to true.
I would have guessed that runtime pm would then get disabled.
>
> Speaking of which, the external ports of the MBP are soldered to
> the discrete GPU and can't be switched. Only the panel can be
> switched. So if there are DP or HDMI connectors with status
> connected, we can't suspend. That's one of the MBP's numerous
> peculiarities that I haven't verified yet they're handled properly
> by the code.
I could check that on my MBP if you want.
Best regards,
Pierre
>
> Best regards,
>
> Lukas
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2015-05-30 21:21 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-28 6:40 [PATCH v2 1/9] acpi: Rename v1 DSM to mux to avoid ambiguity Pierre Moreau
[not found] ` <1432795249-4458-1-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-28 6:40 ` [PATCH v2 2/9] acpi: Add evaluate to name of functions evaluating _DSM Pierre Moreau
2015-05-28 6:40 ` [PATCH 3/9] acpi: Define static variables for revision ids Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 4/9] acpi: Allow evaluate_optimus_dsm to take NULL results Pierre Moreau
2015-05-28 6:40 ` [PATCH NEW 5/9] acpi: Use a single type of errors in evaluate functions Pierre Moreau
2015-05-28 6:42 ` [Nouveau] " Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 6/9] acpi: Check returned object type by Optimus _DSM locally Pierre Moreau
[not found] ` <1432795249-4458-6-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-29 1:17 ` Dave Airlie
2015-05-28 6:40 ` [PATCH 7/9] acpi: Improve some messages level and content Pierre Moreau
2015-05-28 6:40 ` [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS Pierre Moreau
[not found] ` <1432795249-4458-8-git-send-email-pierre.morrow-GANU6spQydw@public.gmane.org>
2015-05-28 8:52 ` Pierre Moreau
[not found] ` <1121819706.18409644.1432803176893.JavaMail.root-x5ewXQG5twBsFmKuirFwRhh1pbbyJDp15NbjCUgZEJk@public.gmane.org>
2015-05-29 1:20 ` Dave Airlie
2015-05-30 18:23 ` [Nouveau] " Lukas Wunner
2015-05-30 21:21 ` Pierre Moreau
2015-05-29 1:22 ` Ben Skeggs
2015-05-28 6:40 ` [PATCH v2 9/9] acpi: Move detecting available _DSM outside of while loops Pierre Moreau
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.