Linux kernel 在ARM64上为mali450 GPU内核驱动程序移植4.15之前的计时器代码

Linux kernel 在ARM64上为mali450 GPU内核驱动程序移植4.15之前的计时器代码,linux-kernel,driver,armbian,arm64,Linux Kernel,Driver,Armbian,Arm64,我有一个基于Amlogic S905X ARM64 SoC的旧电视盒,这是一个Tanix TX5,最初在它上面运行Android。我不喜欢被排除在硬件潜力之外,所以我密切关注Armbian项目的进展,最近我安装了5.67版,它基于Ubuntu Bionic,运行在Linux 4.19.6上 一切都很好,以太网、wifi、blutooth等都有可用的驱动程序,但遗憾的是没有支持集成gpu的内核驱动程序。hdmi输出确实有效,但Xorg在fbdev上运行,屏幕更新速度非常慢,无法在全屏上观看视频。我

我有一个基于Amlogic S905X ARM64 SoC的旧电视盒,这是一个Tanix TX5,最初在它上面运行Android。我不喜欢被排除在硬件潜力之外,所以我密切关注Armbian项目的进展,最近我安装了5.67版,它基于Ubuntu Bionic,运行在Linux 4.19.6上

一切都很好,以太网、wifi、blutooth等都有可用的驱动程序,但遗憾的是没有支持集成gpu的内核驱动程序。hdmi输出确实有效,但Xorg在fbdev上运行,屏幕更新速度非常慢,无法在全屏上观看视频。我不太确定故事是什么,但显然,amlogic保留了他们当前版本的驱动程序。然而,通过访问他们的FTP站点,我找到了内核驱动程序的旧源代码树。它已经过时了,但我已经在将其移植到当前内核方面取得了一些进展,到目前为止,大多数修复都很简单。我现在可以编译大约一半的源文件了

我应该澄清我不是linux开发者,我甚至不是C开发者。。。我涉猎,我知道足够危险,而且我有很强的动力。我每天的交易是C,所以我或多或少知道我在做什么

我现在遇到的问题是mali/linux/mali_osk_timers.c。这是原始代码:

/*
 * Copyright (C) 2010-2014, 2016 ARM Limited. All rights reserved.
 * 
 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

/**
 * @file mali_osk_timers.c
 * Implementation of the OS abstraction layer for the kernel device driver
 */

#include <linux/timer.h>
#include <linux/slab.h>
#include "mali_osk.h"
#include "mali_kernel_common.h"

struct _mali_osk_timer_t_struct {
    struct timer_list timer;
};

typedef void (*timer_timeout_function_t)(unsigned long);

_mali_osk_timer_t *_mali_osk_timer_init(void)
{
    _mali_osk_timer_t *t = (_mali_osk_timer_t *)kmalloc(sizeof(_mali_osk_timer_t), GFP_KERNEL);
    if (NULL != t) init_timer(&t->timer);
    return t;
}

void _mali_osk_timer_add(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    tim->timer.expires = jiffies + ticks_to_expire;
    add_timer(&(tim->timer));
}

void _mali_osk_timer_mod(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    mod_timer(&(tim->timer), jiffies + ticks_to_expire);
}

void _mali_osk_timer_del(_mali_osk_timer_t *tim)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    del_timer_sync(&(tim->timer));
}

void _mali_osk_timer_del_async(_mali_osk_timer_t *tim)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    del_timer(&(tim->timer));
}

mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    return 1 == timer_pending(&(tim->timer));
}

void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    tim->timer.data = (unsigned long)data;
    tim->timer.function = (timer_timeout_function_t)callback;
}

void _mali_osk_timer_term(_mali_osk_timer_t *tim)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    kfree(tim);
}
新的计时器接口gasp将上下文值保留在计时器结构中,并传递指向该结构的指针。这个想法是 数据的使用将会消失,因为常见的习惯用法是数据是指向的指针 包含计时器列表结构的结构

因为你可能想尽量减少对马里的改变,这里概述的改变应该会有所帮助;它只是插入了一个小的协议转换函数,使它看起来像旧的方式

struct _mali_osk_timer_t_struct {
    struct timer_list timer;
    unsigned long data;
    void (*ticked)(unsigned long data);  /* Add this */
};

#define MALI_TIMER_FLAGS 0  /* NB: choose the right bits for this! */

/* This function converts between the “new” and “old” notifications */
static void tick_trampoline(struct timer *t) {
     typedef struct _mali_osk_timer_t_struct Tldr;
     Tldr *m = container_of(t, Tldr, timer);
     m->ticked(m->data);
}
/* change this one: */
void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    tim->data = (unsigned long)data;
    tim->ticked = callback; /* Note no cast */
    timer_setup(&tim->ticked, tick_trampoline, MALI_TIMER_FLAGS);
}

“不投”是请求让打字系统完成它的工作。

有什么理由投反对票吗?我该如何改进这个问题?不知道否决票的情况,但你想改变什么?它的签名相当公开;假设上下文指针是一个空的*即未指定的,您可以将任何东西插入其中。问题是内核的计时器列表实现在版本4.15中发生了更改,并且上面的用法不再有效。例如,init_timer不再存在,新接口是通过timer_设置的。到现在为止,一直都还不错。我只是不确定如何将代码移植到_mali_osk_timer_setcallback中。我不是linux或C本地人,函数签名对我来说是陌生的…我应该补充一下,该函数的问题是,如何为计时器分配一个新的回调地址已经改变,但我无法找到关于如何将此代码移植到新内核接口的清晰说明…太棒了,谢谢你的帮助,这绝对有道理!我可能太快接受了答案!在我找到两个输入错误后,它确实消除了一大堆错误,但仍然存在计时器不再有.data成员的问题。。。我已经用当前代码和编译器的输出更新了这个问题。我认为您还必须将数据字段添加到_mali_osk_timer_t_struct
hugo@tx5:/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali$ sudo KDIR=../../kernel/Amlogic_s905-kernel USING_UMP=0 BUILD=release make
make ARCH=arm64 -C ../../kernel/Amlogic_s905-kernel M=/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali modules
make[1]: Entering directory '/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/kernel/Amlogic_s905-kernel'

  WARNING: Symbol version dump ./Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.o
/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.c: In function ‘tick_trampoline’:
/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.c:31:17: error: ‘struct timer_list’ has no member named ‘data’
      m->ticked(t->data);
                 ^~
/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.c: In function ‘_mali_osk_timer_setcallback’:
/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.c:77:18: error: ‘struct timer_list’ has no member named ‘data’
     &(tim->timer).data = (unsigned long)data;
                  ^
/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.c: At top level:
cc1: warning: unrecognized command line option ‘-Wno-data-time’
scripts/Makefile.build:305: recipe for target '/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.o' failed
make[2]: *** [/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali/linux/mali_osk_timers.o] Error 1
Makefile:1517: recipe for target '_module_/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali' failed
make[1]: *** [_module_/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/gpu-2016-08-18-fe6d7b1d1b/mali] Error 2
make[1]: Leaving directory '/media/hugo/7d79c22a-4ac8-4fcb-ae1c-3310a851a73d/kernel/Amlogic_s905-kernel'
Makefile:192: recipe for target 'all' failed
make: *** [all] Error 2
struct _mali_osk_timer_t_struct {
    struct timer_list timer;
    unsigned long data;
    void (*ticked)(unsigned long data);  /* Add this */
};

#define MALI_TIMER_FLAGS 0  /* NB: choose the right bits for this! */

/* This function converts between the “new” and “old” notifications */
static void tick_trampoline(struct timer *t) {
     typedef struct _mali_osk_timer_t_struct Tldr;
     Tldr *m = container_of(t, Tldr, timer);
     m->ticked(m->data);
}
/* change this one: */
void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data)
{
    MALI_DEBUG_ASSERT_POINTER(tim);
    tim->data = (unsigned long)data;
    tim->ticked = callback; /* Note no cast */
    timer_setup(&tim->ticked, tick_trampoline, MALI_TIMER_FLAGS);
}