msm/gpu: devfreq support
Subsystems (4)
cover msm/gpu: devfreq support
Here is a stack of patches to enable devfreq support for Adreno GPUs. This stack adds support for a5xx only, but it should be trivial to add support for the other targets. I'll send the DT changes separately.
Jordan Crouse (8):
drm/msm/adreno: Call dev_pm_opp_put()
drm/msm/adreno: Remove a useless call to dev_pm_opp_get_freq() drm/msm/gpu: Remove unused bus scaling code drm/msm/adreno: Cleanup chipid parsing
drm/msm/adreno: Move clock parsing to adreno_gpu_init() drm/msm/adreno: Read the speed bins for a5xx targets drm/msm/adreno: a5xx: Explicitly program the CP0 performance counter drm/msm/gpu: Add devfreq support for the GPU
drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 38 ++++++++++ drivers/gpu/drm/msm/adreno/a5xx_power.c | 8 ++- drivers/gpu/drm/msm/adreno/adreno_device.c | 112 ++++++----------------------- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 83 ++++++++++++++++++--- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 4 -- drivers/gpu/drm/msm/msm_gpu.c | 105 ++++++++++++++++++++------- drivers/gpu/drm/msm/msm_gpu.h | 14 ++-- 7 files changed, 225 insertions(+), 139 deletions(-)
Signature · 1 line
1.9.1
PATCH 1/8 drm/msm/adreno: Call dev_pm_opp_put()
We need to call dev_pm_opp_put() to put back the reference for the OPP struct after calling the various dev_pm_opp_get_* functions.
--- drivers/gpu/drm/msm/adreno/a5xx_power.c | 8 +++++++- drivers/gpu/drm/msm/adreno/adreno_device.c | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/adreno/a5xx_power.c +7 -1
@@ -103,10 +103,16 @@ static inline uint32_t _get_mvolts(struct msm_gpu *gpu, uint32_t freq)struct msm_drm_private *priv = dev->dev_private;struct platform_device *pdev = priv->gpu_pdev;struct dev_pm_opp *opp; +u32 ret =0 ; opp =dev_pm_opp_find_freq_exact (&pdev->dev, freq, true); -return (!IS_ERR (opp)) ?dev_pm_opp_get_voltage (opp) /1000 :0 ; +if (!IS_ERR (opp)) { + ret =dev_pm_opp_get_voltage (opp) /1000 ; +dev_pm_opp_put (opp); + } + +return ret; }/* Setup thermal limit management */
drivers/gpu/drm/msm/adreno/adreno_device.c +3 -1
@@ -239,8 +239,10 @@ static int adreno_get_pwrlevels(struct device *dev,/* Find the fastest defined rate */ opp =dev_pm_opp_find_freq_floor (dev, &freq); -if (!IS_ERR (opp)) +if (!IS_ERR (opp)) { config->fast_rate =dev_pm_opp_get_freq (opp); +dev_pm_opp_put (opp); + }if (!config->fast_rate) { DRM_DEV_INFO(dev,
Signature · 6 lines
1.9.1 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 2/8 drm/msm/adreno: Remove a useless call to dev_pm_opp_get_freq()
In reply to Jordan CrouseCalling dev_pm_opp_find_freq_floor() returns the matched frequency in 'freq'. We don't need to call dev_pm_opp_get_freq() again to get the frequency value.
--- drivers/gpu/drm/msm/adreno/adreno_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/adreno/adreno_device.c +1 -1
@@ -240,7 +240,7 @@ static int adreno_get_pwrlevels(struct device *dev,/* Find the fastest defined rate */ opp =dev_pm_opp_find_freq_floor (dev, &freq);if (!IS_ERR (opp)) { - config->fast_rate =dev_pm_opp_get_freq (opp); + config->fast_rate = freq;dev_pm_opp_put (opp); }
Signature · 6 lines
1.9.1 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 1511293258-12415-1-git-send-email-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
PATCH 3/8 drm/msm/gpu: Remove unused bus scaling code
Remove the downstream bus scaling code. It isn't needed for for compatibility with a downstream or vendor kernel. Get it out of the way to clear space for devfreq support.
--- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 +----- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 5 +---- drivers/gpu/drm/msm/msm_gpu.c | 39 --------------------------------- drivers/gpu/drm/msm/msm_gpu.h | 7 +----- 4 files changed, 3 insertions(+), 55 deletions(-)
drivers/gpu/drm/msm/adreno/adreno_gpu.c +1 -6
@@ -480,13 +480,8 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, adreno_gpu->rev = config->rev; gpu->fast_rate = config->fast_rate; - gpu->bus_freq = config->bus_freq; -#ifdef DOWNSTREAM_CONFIG_MSM_BUS_SCALING - gpu->bus_scale_table = config->bus_scale_table; -#endif -DBG ("fast_rate=%u, slow_rate=27000000, bus_freq=%u" , - gpu->fast_rate, gpu->bus_freq); +DBG ("fast_rate=%u, slow_rate=27000000" , gpu->fast_rate); adreno_gpu_config.ioname ="kgsl_3d0_reg_memory" ; adreno_gpu_config.irqname ="kgsl_3d0_irq" ;
drivers/gpu/drm/msm/adreno/adreno_gpu.h +1 -4
@@ -129,10 +129,7 @@ struct adreno_gpu {/* platform config data (ie. from DT, or pdata) */ struct adreno_platform_config {struct adreno_rev rev; -uint32_t fast_rate, bus_freq; -#ifdef DOWNSTREAM_CONFIG_MSM_BUS_SCALING -struct msm_bus_scale_pdata *bus_scale_table; -#endif +uint32_t fast_rate; };#define ADRENO_IDLE_TIMEOUT msecs_to_jiffies(1000)
drivers/gpu/drm/msm/msm_gpu.c +0 -39
@@ -27,37 +27,6 @@* Power Management: */ -#ifdef DOWNSTREAM_CONFIG_MSM_BUS_SCALING -#include <mach/board.h> -static void bs_init (struct msm_gpu *gpu) -{ -if (gpu->bus_scale_table) { - gpu->bsc =msm_bus_scale_register_client (gpu->bus_scale_table); -DBG ("bus scale client: %08x" , gpu->bsc); - } -} - -static void bs_fini (struct msm_gpu *gpu) -{ -if (gpu->bsc) { -msm_bus_scale_unregister_client (gpu->bsc); - gpu->bsc =0 ; - } -} - -static void bs_set (struct msm_gpu *gpu,int idx) -{ -if (gpu->bsc) { -DBG ("set bus scaling: %d" , idx); -msm_bus_scale_client_update_request (gpu->bsc, idx); - } -} -#else -static void bs_init (struct msm_gpu *gpu) {} -static void bs_fini (struct msm_gpu *gpu) {} -static void bs_set (struct msm_gpu *gpu,int idx) {} -#endif -static int enable_pwrrail (struct msm_gpu *gpu) {struct drm_device *dev = gpu->dev;
@@ -143,8 +112,6 @@ static int enable_axi(struct msm_gpu *gpu) {if (gpu->ebi1_clk)clk_prepare_enable (gpu->ebi1_clk); -if (gpu->bus_freq) -bs_set (gpu, gpu->bus_freq);return 0 ; }
@@ -152,8 +119,6 @@ static int disable_axi(struct msm_gpu *gpu) {if (gpu->ebi1_clk)clk_disable_unprepare (gpu->ebi1_clk); -if (gpu->bus_freq) -bs_set (gpu,0 );return 0 ; }
@@ -756,8 +721,6 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev, gpu->pdev = pdev;platform_set_drvdata (pdev, gpu); -bs_init (gpu); - gpu->aspace =msm_gpu_create_address_space (gpu, pdev, config->va_start, config->va_end);
@@ -827,8 +790,6 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)WARN_ON (!list_empty (&gpu->active_list)); -bs_fini (gpu); -for (i =0 ; i <ARRAY_SIZE (gpu->rb); i++) {msm_ringbuffer_destroy (gpu->rb[i]); gpu->rb[i] =NULL ;
drivers/gpu/drm/msm/msm_gpu.h +1 -6
@@ -108,12 +108,7 @@ struct msm_gpu {struct clk **grp_clks;int nr_clocks;struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk; -uint32_t fast_rate, bus_freq; - -#ifdef DOWNSTREAM_CONFIG_MSM_BUS_SCALING -struct msm_bus_scale_pdata *bus_scale_table; -uint32_t bsc; -#endif +uint32_t fast_rate;/* Hang and Inactivity Detection: */
Signature · 6 lines
1.9.1 _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH 5/8 drm/msm/adreno: Move clock parsing to adreno_gpu_init()
In reply to a message not in the archiveMove the clock parsing to adreno_gpu_init() to allow for target specific probing and manipulation of the clock tables.
--- drivers/gpu/drm/msm/adreno/adreno_device.c | 72 ---------------------------- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 77 ++++++++++++++++++++++++++++-- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 1 - 3 files changed, 73 insertions(+), 77 deletions(-)
drivers/gpu/drm/msm/adreno/adreno_device.c +0 -72
@@ -17,7 +17,6 @@* this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <linux/pm_opp.h> #include "adreno_gpu.h" #define ANY_ID 0xff
@@ -196,70 +195,6 @@ static int find_chipid(struct device *dev, struct adreno_rev *rev)return 0 ; } -/* Get legacy powerlevels from qcom,gpu-pwrlevels and populate the opp table */ -static int adreno_get_legacy_pwrlevels (struct device *dev) -{ -struct device_node *child, *node; -int ret; - - node =of_find_compatible_node (dev->of_node,NULL , -"qcom,gpu-pwrlevels" ); -if (!node) { -dev_err (dev,"Could not find the GPU powerlevels\n" ); -return -ENXIO ; - } - -for_each_child_of_node (node, child) { -unsigned int val; - - ret =of_property_read_u32 (child,"qcom,gpu-freq" , &val); -if (ret) -continue ; - -/* -* Skip the intentionally bogus clock value found at the bottom -* of most legacy frequency tables -*/ -if (val !=27000000 ) -dev_pm_opp_add (dev, val,0 ); - } - -return 0 ; -} - -static int adreno_get_pwrlevels (struct device *dev, -struct adreno_platform_config *config) -{ -unsigned long freq =ULONG_MAX ; -struct dev_pm_opp *opp; -int ret; - -/* You down with OPP? */ -if (!of_find_property (dev->of_node,"operating-points-v2" ,NULL )) - ret =adreno_get_legacy_pwrlevels (dev); -else - ret =dev_pm_opp_of_add_table (dev); - -if (ret) -return ret; - -/* Find the fastest defined rate */ - opp =dev_pm_opp_find_freq_floor (dev, &freq); -if (!IS_ERR (opp)) { - config->fast_rate = freq; -dev_pm_opp_put (opp); - } - -if (!config->fast_rate) { -DRM_DEV_INFO (dev, -"Could not find clock rate. Using default\n" ); -/* Pick a suitably safe clock speed for any target */ - config->fast_rate =200000000 ; - } - -return 0 ; -} -static int adreno_bind (struct device *dev,struct device *master,void *data) {static struct adreno_platform_config config = {};
@@ -272,13 +207,6 @@ static int adreno_bind(struct device *dev, struct device *master, void *data)if (ret)return ret; -/* find clock rates: */ - config.fast_rate =0 ; - - ret =adreno_get_pwrlevels (dev, &config); -if (ret) -return ret; - dev->platform_data = &config;set_gpu_pdev (drm,to_platform_device (dev));
drivers/gpu/drm/msm/adreno/adreno_gpu.c +73 -4
101 lines not on this page · raw message
drivers/gpu/drm/msm/adreno/adreno_gpu.h +0 -1
@@ -129,7 +129,6 @@ struct adreno_gpu {/* platform config data (ie. from DT, or pdata) */ struct adreno_platform_config {struct adreno_rev rev; -uint32_t fast_rate; };#define ADRENO_IDLE_TIMEOUT msecs_to_jiffies(1000)
Signature · 6 lines
1.9.1 _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH 7/8 drm/msm/adreno: a5xx: Explicitly program the CP0 performance counter
In reply to a message not in the archiveEven though the default countable for CP0 is CP_ALWAYS_COUNT (0), program the selector during HW initialization in an effort to be up front about which counters are programmed and why.
--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +3 -0
@@ -597,6 +597,9 @@ static int a5xx_hw_init(struct msm_gpu *gpu)/* Turn on performance counters */ gpu_write (gpu,REG_A5XX_RBBM_PERFCTR_CNTL ,0x01 ); +/* Select CP0 to always count cycles */ +gpu_write (gpu,REG_A5XX_CP_PERFCTR_CP_SEL_0 ,PERF_CP_ALWAYS_COUNT ); +/* Increase VFD cache access so LRZ and other data gets evicted less */ gpu_write (gpu,REG_A5XX_UCHE_CACHE_WAYS ,0x02 );
Signature · 6 lines
1.9.1 _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH 4/8 drm/msm/adreno: Cleanup chipid parsing
In reply to Jordan CrouseWe don't need to convert the chipid to an intermediate value and then back again into a struct adreno_rev.
--- drivers/gpu/drm/msm/adreno/adreno_device.c | 44 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-)
drivers/gpu/drm/msm/adreno/adreno_device.c +22 -22
@@ -153,39 +153,45 @@ static void set_gpu_pdev(struct drm_device *dev, priv->gpu_pdev = pdev; } -static int find_chipid (struct device *dev,u32 *chipid) +static int find_chipid (struct device *dev,struct adreno_rev *rev) {struct device_node *node = dev->of_node;const char *compat;int ret; +u32 chipid;/* first search the compat strings for qcom,adreno-XYZ.W: */ ret =of_property_read_string_index (node,"compatible" ,0 , &compat);if (ret ==0 ) { -unsigned rev, patch; +unsigned int r, patch; -if (sscanf (compat,"qcom,adreno-%u.%u" , &rev, &patch) ==2 ) { - *chipid =0 ; - *chipid |= (rev /100 ) <<24 ;/* core */ - rev %=100 ; - *chipid |= (rev /10 ) <<16 ;/* major */ - rev %=10 ; - *chipid |= rev <<8 ;/* minor */ - *chipid |= patch; +if (sscanf (compat,"qcom,adreno-%u.%u" , &r, &patch) ==2 ) { + rev->core = r /100 ; + r %=100 ; + rev->major = r /10 ; + r %=10 ; + rev->minor = r; + rev->patchid = patch;return 0 ; } }/* and if that fails, fall back to legacy "qcom,chipid" property: */ - ret =of_property_read_u32 (node,"qcom,chipid" , chipid); -if (ret) + ret =of_property_read_u32 (node,"qcom,chipid" , &chipid); +if (ret) { +dev_err (dev,"could not parse qcom,chipid: %d\n" , ret);return ret; + } + + rev->core = (chipid >>24 ) &0xff ; + rev->major = (chipid >>16 ) &0xff ; + rev->minor = (chipid >>8 ) &0xff ; + rev->patchid = (chipid &0xff );dev_warn (dev,"Using legacy qcom,chipid binding!\n" );dev_warn (dev,"Use compatible qcom,adreno-%u%u%u.%u instead.\n" , - (*chipid >>24 ) &0xff , (*chipid >>16 ) &0xff , - (*chipid >>8 ) &0xff , *chipid &0xff ); + rev->core, rev->major, rev->minor, rev->patchid);return 0 ; }
@@ -260,17 +266,11 @@ static int adreno_bind(struct device *dev, struct device *master, void *data)const struct adreno_info *info;struct drm_device *drm =dev_get_drvdata (master);struct msm_gpu *gpu; -u32 val;int ret; - ret =find_chipid (dev, &val); -if (ret) { -dev_err (dev,"could not find chipid: %d\n" , ret); + ret =find_chipid (dev, &config.rev); +if (ret)return ret; - } - - config.rev =ADRENO_REV ((val >>24 ) &0xff , - (val >>16 ) &0xff , (val >>8 ) &0xff , val &0xff );/* find clock rates: */ config.fast_rate =0 ;
Signature · 1 line
1.9.1
PATCH 6/8 drm/msm/adreno: Read the speed bins for a5xx targets
In reply to Jordan CrouseSome 5xx based chipsets have different bins for GPU clock speeds. Read the fuses (if applicable) and set the appropriate OPP table. This will only work with OPP v2 tables - the bin will be ignored for legacy pwrlevel tables.
--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +23 -0
@@ -17,6 +17,8 @@#include <linux/dma-mapping.h> #include <linux/of_address.h> #include <linux/soc/qcom/mdt_loader.h> +#include <linux/pm_opp.h> +#include <linux/nvmem-consumer.h> #include "msm_gem.h" #include "msm_mmu.h" #include "a5xx_gpu.h"
@@ -1184,6 +1186,25 @@ static struct msm_ringbuffer *a5xx_active_ring(struct msm_gpu *gpu) .get_timestamp = a5xx_get_timestamp, }; +static void check_speed_bin (struct device *dev) +{ +struct nvmem_cell *cell; +u32 bin, val; + + cell =nvmem_cell_get (dev,"speed_bin" ); + +/* If a nvmem cell isn't defined, nothing to do */ +if (IS_ERR (cell)) +return ; + + bin = *((u32 *)nvmem_cell_read (cell,NULL )); +nvmem_cell_put (cell); + + val = (1 << bin); + +dev_pm_opp_set_supported_hw (dev, &val,1 ); +} +struct msm_gpu *a5xx_gpu_init (struct drm_device *dev) {struct msm_drm_private *priv = dev->dev_private;
@@ -1210,6 +1231,8 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) a5xx_gpu->lm_leakage =0x4E001A ; +check_speed_bin (&pdev->dev); + ret =adreno_gpu_init (dev, pdev, adreno_gpu, &funcs,4 );if (ret) {a5xx_destroy (&(a5xx_gpu->base.base));
Signature · 1 line
1.9.1
PATCH 8/8 drm/msm/gpu: Add devfreq support for the GPU
In reply to Jordan CrouseAdd support for devfreq to dynamically control the GPU frequency. By default try to use the 'simple_ondemand' governor which can adjust the frequency based on GPU load.
--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 12 +++++ drivers/gpu/drm/msm/adreno/adreno_gpu.c | 1 - drivers/gpu/drm/msm/msm_gpu.c | 90 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_gpu.h | 7 +++ 4 files changed, 109 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +12 -0
@@ -600,6 +600,9 @@ static int a5xx_hw_init(struct msm_gpu *gpu)/* Select CP0 to always count cycles */ gpu_write (gpu,REG_A5XX_CP_PERFCTR_CP_SEL_0 ,PERF_CP_ALWAYS_COUNT ); +/* Select RBBM0 to countable 6 to get the busy status for devfreq */ +gpu_write (gpu,REG_A5XX_RBBM_PERFCTR_RBBM_SEL_0 ,6 ); +/* Increase VFD cache access so LRZ and other data gets evicted less */ gpu_write (gpu,REG_A5XX_UCHE_CACHE_WAYS ,0x02 );
@@ -1170,6 +1173,14 @@ static struct msm_ringbuffer *a5xx_active_ring(struct msm_gpu *gpu)return a5xx_gpu->cur_ring; } +static int a5xx_gpu_busy (struct msm_gpu *gpu,uint64_t *value) +{ + *value =gpu_read64 (gpu,REG_A5XX_RBBM_PERFCTR_RBBM_0_LO , +REG_A5XX_RBBM_PERFCTR_RBBM_0_HI ); + +return 0 ; +} +static const struct adreno_gpu_funcs funcs = { .base = { .get_param = adreno_get_param,
@@ -1185,6 +1196,7 @@ static struct msm_ringbuffer *a5xx_active_ring(struct msm_gpu *gpu)#ifdef CONFIG_DEBUG_FS .show = a5xx_show, #endif + .gpu_busy = a5xx_gpu_busy, }, .get_timestamp = a5xx_get_timestamp, };
drivers/gpu/drm/msm/adreno/adreno_gpu.c +0 -1
@@ -22,7 +22,6 @@#include "msm_gem.h" #include "msm_mmu.h" -int adreno_get_param (struct msm_gpu *gpu,uint32_t param,uint64_t *value) {struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu);
drivers/gpu/drm/msm/msm_gpu.c +90 -0
120 lines not on this page · raw message
drivers/gpu/drm/msm/msm_gpu.h +7 -0
@@ -66,6 +66,7 @@ struct msm_gpu_funcs {/* show GPU status in debugfs: */ void (*show)(struct msm_gpu *gpu,struct seq_file *m);#endif +int (*gpu_busy)(struct msm_gpu *gpu,uint64_t *value); };struct msm_gpu {
@@ -120,6 +121,12 @@ struct msm_gpu {struct work_struct recover_work;struct drm_gem_object *memptrs_bo; + +struct { +struct devfreq *devfreq; +u64 busy_cycles; +ktime_t time; + } devfreq; };/* It turns out that all targets use the same ringbuffer size */
Signature · 1 line
1.9.1
kbuild test robot
build botRe: [PATCH 8/8] drm/msm/gpu: Add devfreq support for the GPU
Thank you for the patch! Yet something to improve:
Hi Jordan,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on robclark/msm-next]
[also build test ERROR on next-20171122]
[cannot apply to v4.14]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Jordan-Crouse/msm-gpu-devfreq-support/20171124-022911 base: git://people.freedesktop.org/~robclark/linux msm-next config: arm-multi_v7_defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
drivers/gpu/drm/msm/msm_gpu.o: In function `msm_devfreq_get_dev_status':
>> msm_gpu.c:(.text+0x558): undefined reference to `__aeabi_uldivmod'
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botRe: [PATCH 8/8] drm/msm/gpu: Add devfreq support for the GPU
In reply to Jordan CrouseThank you for the patch! Yet something to improve:
Hi Jordan,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on robclark/msm-next]
[also build test ERROR on next-20171122]
[cannot apply to v4.14]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Jordan-Crouse/msm-gpu-devfreq-support/20171124-022911 base: git://people.freedesktop.org/~robclark/linux msm-next config: arm-allmodconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
>> ERROR: "__aeabi_uldivmod" [drivers/gpu/drm/msm/msm.ko] undefined!
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation