diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/files/1131-drm-amd-Adding-ACP-driver-support-for-AMDGPU.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/files/1131-drm-amd-Adding-ACP-driver-support-for-AMDGPU.patch | 383 |
1 files changed, 0 insertions, 383 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/files/1131-drm-amd-Adding-ACP-driver-support-for-AMDGPU.patch b/meta-amdfalconx86/recipes-kernel/linux/files/1131-drm-amd-Adding-ACP-driver-support-for-AMDGPU.patch deleted file mode 100644 index 5ae2536d..00000000 --- a/meta-amdfalconx86/recipes-kernel/linux/files/1131-drm-amd-Adding-ACP-driver-support-for-AMDGPU.patch +++ /dev/null @@ -1,383 +0,0 @@ -From 58e6e67a2e65c339cbb6803463b19aaab92303c5 Mon Sep 17 00:00:00 2001 -From: Maruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu@amd.com> -Date: Sat, 24 Sep 2016 12:57:36 +0530 -Subject: [PATCH 06/17] drm/amd: Adding ACP driver support for AMDGPU - -Signed-off-by: Maruthi Bayyavarapu <maruthi.bayyavarapu@amd.com> -Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> ---- - drivers/gpu/drm/amd/acp/Kconfig | 1 + - drivers/gpu/drm/amd/amdgpu/amdgpu.h | 5 +- - drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 216 ++----------------------------- - drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h | 2 +- - drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 4 +- - drivers/gpu/drm/amd/include/amd_shared.h | 2 + - 6 files changed, 18 insertions(+), 212 deletions(-) - -diff --git a/drivers/gpu/drm/amd/acp/Kconfig b/drivers/gpu/drm/amd/acp/Kconfig -index ca77ec1..b8a0605 100644 ---- a/drivers/gpu/drm/amd/acp/Kconfig -+++ b/drivers/gpu/drm/amd/acp/Kconfig -@@ -2,6 +2,7 @@ menu "ACP (Audio CoProcessor) Configuration" - - config DRM_AMD_ACP - bool "Enable AMD Audio CoProcessor IP support" -+ default y - select MFD_CORE - select PM_GENERIC_DOMAINS if PM - help -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 551f763..86894ec 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -1928,8 +1928,9 @@ struct amdgpu_atcs { - /* - * CGS - */ --struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); --void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device); -+void *amdgpu_cgs_create_device(struct amdgpu_device *adev); -+void amdgpu_cgs_destroy_device(void *cgs_device); -+ - - - /* GPU virtualization */ -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c -index 043ba60..cbbc31a8 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c -@@ -24,7 +24,6 @@ - */ - - #include <linux/irqdomain.h> --#include <linux/pm_domain.h> - #include <linux/platform_device.h> - #include <sound/designware_i2s.h> - #include <sound/pcm.h> -@@ -103,153 +102,6 @@ static int acp_sw_fini(void *handle) - return 0; - } - --/* power off a tile/block within ACP */ --static int acp_suspend_tile(void *cgs_dev, int tile) --{ -- u32 val = 0; -- u32 count = 0; -- -- if ((tile < ACP_TILE_P1) || (tile > ACP_TILE_DSP2)) { -- pr_err("Invalid ACP tile : %d to suspend\n", tile); -- return -1; -- } -- -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_READ_REG_0 + tile); -- val &= ACP_TILE_ON_MASK; -- -- if (val == 0x0) { -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_RETAIN_REG); -- val = val | (1 << tile); -- cgs_write_register(cgs_dev, mmACP_PGFSM_RETAIN_REG, val); -- cgs_write_register(cgs_dev, mmACP_PGFSM_CONFIG_REG, -- 0x500 + tile); -- -- count = ACP_TIMEOUT_LOOP; -- while (true) { -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_READ_REG_0 -- + tile); -- val = val & ACP_TILE_ON_MASK; -- if (val == ACP_TILE_OFF_MASK) -- break; -- if (--count == 0) { -- pr_err("Timeout reading ACP PGFSM status\n"); -- return -ETIMEDOUT; -- } -- udelay(100); -- } -- -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_RETAIN_REG); -- -- val |= ACP_TILE_OFF_RETAIN_REG_MASK; -- cgs_write_register(cgs_dev, mmACP_PGFSM_RETAIN_REG, val); -- } -- return 0; --} -- --/* power on a tile/block within ACP */ --static int acp_resume_tile(void *cgs_dev, int tile) --{ -- u32 val = 0; -- u32 count = 0; -- -- if ((tile < ACP_TILE_P1) || (tile > ACP_TILE_DSP2)) { -- pr_err("Invalid ACP tile to resume\n"); -- return -1; -- } -- -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_READ_REG_0 + tile); -- val = val & ACP_TILE_ON_MASK; -- -- if (val != 0x0) { -- cgs_write_register(cgs_dev, mmACP_PGFSM_CONFIG_REG, -- 0x600 + tile); -- count = ACP_TIMEOUT_LOOP; -- while (true) { -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_READ_REG_0 -- + tile); -- val = val & ACP_TILE_ON_MASK; -- if (val == 0x0) -- break; -- if (--count == 0) { -- pr_err("Timeout reading ACP PGFSM status\n"); -- return -ETIMEDOUT; -- } -- udelay(100); -- } -- val = cgs_read_register(cgs_dev, mmACP_PGFSM_RETAIN_REG); -- if (tile == ACP_TILE_P1) -- val = val & (ACP_TILE_P1_MASK); -- else if (tile == ACP_TILE_P2) -- val = val & (ACP_TILE_P2_MASK); -- -- cgs_write_register(cgs_dev, mmACP_PGFSM_RETAIN_REG, val); -- } -- return 0; --} -- --struct acp_pm_domain { -- void *cgs_dev; -- struct generic_pm_domain gpd; --}; -- --static int acp_poweroff(struct generic_pm_domain *genpd) --{ -- int i, ret; -- struct acp_pm_domain *apd; -- -- apd = container_of(genpd, struct acp_pm_domain, gpd); -- if (apd != NULL) { -- /* Donot return abruptly if any of power tile fails to suspend. -- * Log it and continue powering off other tile -- */ -- for (i = 4; i >= 0 ; i--) { -- ret = acp_suspend_tile(apd->cgs_dev, ACP_TILE_P1 + i); -- if (ret) -- pr_err("ACP tile %d tile suspend failed\n", i); -- } -- } -- return 0; --} -- --static int acp_poweron(struct generic_pm_domain *genpd) --{ -- int i, ret; -- struct acp_pm_domain *apd; -- -- apd = container_of(genpd, struct acp_pm_domain, gpd); -- if (apd != NULL) { -- for (i = 0; i < 2; i++) { -- ret = acp_resume_tile(apd->cgs_dev, ACP_TILE_P1 + i); -- if (ret) { -- pr_err("ACP tile %d resume failed\n", i); -- break; -- } -- } -- -- /* Disable DSPs which are not going to be used */ -- for (i = 0; i < 3; i++) { -- ret = acp_suspend_tile(apd->cgs_dev, ACP_TILE_DSP0 + i); -- /* Continue suspending other DSP, even if one fails */ -- if (ret) -- pr_err("ACP DSP %d suspend failed\n", i); -- } -- } -- return 0; --} -- --static struct device *get_mfd_cell_dev(const char *device_name, int r) --{ -- char auto_dev_name[25]; -- struct device *dev; -- -- snprintf(auto_dev_name, sizeof(auto_dev_name), -- "%s.%d.auto", device_name, r); -- dev = bus_find_device_by_name(&platform_bus_type, NULL, auto_dev_name); -- dev_info(dev, "device %s added to pm domain\n", auto_dev_name); -- -- return dev; --} -- - /** - * acp_hw_init - start and test ACP block - * -@@ -258,9 +110,8 @@ static struct device *get_mfd_cell_dev(const char *device_name, int r) - */ - static int acp_hw_init(void *handle) - { -- int r, i; -+ int r; - uint64_t acp_base; -- struct device *dev; - struct i2s_platform_data *i2s_pdata; - - struct amdgpu_device *adev = (struct amdgpu_device *)handle; -@@ -286,19 +137,6 @@ static int acp_hw_init(void *handle) - else if (r) - return r; - -- adev->acp.acp_genpd = kzalloc(sizeof(struct acp_pm_domain), GFP_KERNEL); -- if (adev->acp.acp_genpd == NULL) -- return -ENOMEM; -- -- adev->acp.acp_genpd->gpd.name = "ACP_AUDIO"; -- adev->acp.acp_genpd->gpd.power_off = acp_poweroff; -- adev->acp.acp_genpd->gpd.power_on = acp_poweron; -- -- -- adev->acp.acp_genpd->cgs_dev = adev->acp.cgs_device; -- -- pm_genpd_init(&adev->acp.acp_genpd->gpd, NULL, false); -- - adev->acp.acp_cell = kzalloc(sizeof(struct mfd_cell) * ACP_DEVS, - GFP_KERNEL); - -@@ -373,15 +211,6 @@ static int acp_hw_init(void *handle) - if (r) - return r; - -- for (i = 0; i < ACP_DEVS ; i++) { -- dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i); -- r = pm_genpd_add_device(&adev->acp.acp_genpd->gpd, dev); -- if (r) { -- dev_err(dev, "Failed to add dev to genpd\n"); -- return r; -- } -- } -- - return 0; - } - -@@ -393,22 +222,10 @@ static int acp_hw_init(void *handle) - */ - static int acp_hw_fini(void *handle) - { -- int i, ret; -- struct device *dev; -- - struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -- for (i = 0; i < ACP_DEVS ; i++) { -- dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i); -- ret = pm_genpd_remove_device(&adev->acp.acp_genpd->gpd, dev); -- /* If removal fails, dont giveup and try rest */ -- if (ret) -- dev_err(dev, "remove dev from genpd failed\n"); -- } -- - mfd_remove_devices(adev->acp.parent); - kfree(adev->acp.acp_res); -- kfree(adev->acp.acp_genpd); - kfree(adev->acp.acp_cell); - - return 0; -@@ -421,29 +238,6 @@ static int acp_suspend(void *handle) - - static int acp_resume(void *handle) - { -- int i, ret; -- struct acp_pm_domain *apd; -- struct amdgpu_device *adev = (struct amdgpu_device *)handle; -- -- /* return early if no ACP */ -- if (!adev->acp.acp_genpd) -- return 0; -- -- /* SMU block will power on ACP irrespective of ACP runtime status. -- * Power off explicitly based on genpd ACP runtime status so that ACP -- * hw and ACP-genpd status are in sync. -- * 'suspend_power_off' represents "Power status before system suspend" -- */ -- if (adev->acp.acp_genpd->gpd.suspend_power_off == true) { -- apd = container_of(&adev->acp.acp_genpd->gpd, -- struct acp_pm_domain, gpd); -- -- for (i = 4; i >= 0 ; i--) { -- ret = acp_suspend_tile(apd->cgs_dev, ACP_TILE_P1 + i); -- if (ret) -- pr_err("ACP tile %d tile suspend failed\n", i); -- } -- } - return 0; - } - -@@ -467,6 +261,13 @@ static int acp_soft_reset(void *handle) - return 0; - } - -+static void acp_print_status(void *handle) -+{ -+ struct amdgpu_device *adev = (struct amdgpu_device *)handle; -+ -+ dev_info(adev->dev, "ACP STATUS\n"); -+} -+ - static int acp_set_clockgating_state(void *handle, - enum amd_clockgating_state state) - { -@@ -492,6 +293,7 @@ const struct amd_ip_funcs acp_ip_funcs = { - .is_idle = acp_is_idle, - .wait_for_idle = acp_wait_for_idle, - .soft_reset = acp_soft_reset, -+ .print_status = acp_print_status, - .set_clockgating_state = acp_set_clockgating_state, - .set_powergating_state = acp_set_powergating_state, - }; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h -index 8a39631..f6e32a6 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h -@@ -30,7 +30,7 @@ - - struct amdgpu_acp { - struct device *parent; -- struct cgs_device *cgs_device; -+ void *cgs_device; - struct amd_acp_private *private; - struct mfd_cell *acp_cell; - struct resource *acp_res; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c -index 490464e..88625b5 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c -@@ -1141,7 +1141,7 @@ static const struct cgs_os_ops amdgpu_cgs_os_ops = { - amdgpu_cgs_irq_put - }; - --struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) -+void *amdgpu_cgs_create_device(struct amdgpu_device *adev) - { - struct amdgpu_cgs_device *cgs_device = - kmalloc(sizeof(*cgs_device), GFP_KERNEL); -@@ -1158,7 +1158,7 @@ struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) - return (struct cgs_device *)cgs_device; - } - --void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device) -+void amdgpu_cgs_destroy_device(void *cgs_device) - { - kfree(cgs_device); - } -diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h -index afce1ed..d83baf3 100644 ---- a/drivers/gpu/drm/amd/include/amd_shared.h -+++ b/drivers/gpu/drm/amd/include/amd_shared.h -@@ -168,6 +168,8 @@ struct amd_ip_funcs { - int (*wait_for_idle)(void *handle); - /* soft reset the IP block */ - int (*soft_reset)(void *handle); -+ /* dump the IP block status registers */ -+ void (*print_status)(void *handle); - /* enable/disable cg for the IP block */ - int (*set_clockgating_state)(void *handle, - enum amd_clockgating_state state); --- -2.7.4 - |