driver k10temp:

- Added API
 - Added to autobuild 

git-svn-id: svn://kolibrios.org@9100 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
turbocat 2021-08-01 18:55:58 +00:00
parent da1f95ca0b
commit dbd63546e8
3 changed files with 100 additions and 58 deletions

View File

@ -5,7 +5,7 @@ KPACK = kpack
DDK_TOPDIR = ../../ddk
DRV_INCLUDES = ../../include
INCLUDES = -I$(DRV_INCLUDES) \
INCLUDES = -I$(DRV_INCLUDES) \
-I$(DRV_INCLUDES)/asm \
-I$(DRV_INCLUDES)/uapi \
-I$(DRV_INCLUDES)/drm
@ -16,7 +16,7 @@ DEFINES = -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32 -DCONFIG_DMI -DCONFIG_TINY_RCU
DEFINES+= -DCONFIG_X86_L1_CACHE_SHIFT=6 -DCONFIG_ARCH_HAS_CACHE_LINE_SIZE
DEFINES+= -DCONFIG_PRINTK -DCONFIG_PCI -DCONFIG_PCI -DCONFIG_AMD_NB -DKBUILD_MODNAME=\"k10temp\"
CFLAGS= -c -O2 -march=i686 -fno-ident -msse2 -fomit-frame-pointer -fno-builtin-printf
CFLAGS= -c -Os -march=i686 -fno-ident -msse2 -fomit-frame-pointer -fno-builtin-printf
CFLAGS+= -mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2 -mno-ms-bitfields
LIBPATH = -L $(DDK_TOPDIR)
@ -30,14 +30,14 @@ LDFLAGS = -nostdlib -shared -s --major-os-version 0 --minor-os-version 7 \
OBJS = k10temp.o ../pci.o ../amd_nb.o ../cpu_detect.o
all: $(OBJS) $(NAME).dll
all: $(OBJS) $(NAME).sys
$(NAME).dll: $(OBJS)
$(NAME).sys: $(OBJS)
$(LD) $(LIBPATH) $(LDFLAGS) -T ../drv.lds $(OBJS) -o $@ $(NAME_OBJS) $(LIBS)
$(KPACK) $(NAME).dll
$(KPACK) $(NAME).sys
%.o : %.c Makefile
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $<
clean:
rm -f $(OBJS) $(NAME).dll
rm -f $(OBJS) $(NAME).sys

View File

@ -0,0 +1,21 @@
if tup.getconfig("NO_GCC") ~= "" then return end
if tup.getconfig("HELPERDIR") == ""
then
if tup.getconfig("NO_NASM") ~= "" then return end -- required for SDL compilation
HELPERDIR = "../../../programs"
end
tup.include(HELPERDIR .. "/use_gcc.lua")
CFLAGS =[[ -Os -march=i686 -fno-ident -msse2 -fomit-frame-pointer -fno-builtin-printf -mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2 -mno-ms-bitfields -UWIN32 -U_WIN32 -U__WIN32__ -D_KOLIBRI -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32 -DCONFIG_DMI -DCONFIG_TINY_RCU -DCONFIG_X86_L1_CACHE_SHIFT=6 -DCONFIG_ARCH_HAS_CACHE_LINE_SIZE -DCONFIG_PRINTK -DCONFIG_PCI -DCONFIG_PCI -DCONFIG_AMD_NB -DKBUILD_MODNAME="\"k10temp"\" -I../../include -I../../include/asm -I../../include/uapi -I../../include/drm ]]
LDFLAGS = " -nostdlib -shared -s --major-os-version 0 --minor-os-version 7 --major-subsystem-version 0 --minor-subsystem-version 5 --subsystem native -T../drv.lds --image-base 0 --file-alignment 512 --section-alignment 4096 -L../../../contrib/sdk/lib -L../../ddk "
LIBS = " -lddk -lcore -lgcc "
compile_gcc{
"k10temp.c", "../pci.c", "../amd_nb.c", "../cpu_detect.c"
}
OBJS.extra_inputs = {"../../ddk/libcore.a", "../../ddk/libddk.a"}
tup.rule(OBJS, "kos32-ld" .. LDFLAGS .. "%f -o %o " .. LIBS .. tup.getconfig("KPACK_CMD"), "k10temp.sys");

View File

@ -13,6 +13,9 @@
* suggest that it provides reasonable temperature values.
*/
/* Ported for Kolibri OS by turbocat (Maxim Logaeav). 2021 */
/* Thanks: dunkaist, punk_joker, doczom. */
#include <ddk.h>
#include <syscall.h>
#include <linux/bitops.h>
@ -170,7 +173,7 @@ long get_raw_temp(struct k10temp_data *data)
temp -= 49000;
return temp;
}
#if 0
const char *k10temp_temp_label[] = {
"Tctl",
"Tdie",
@ -197,6 +200,7 @@ int k10temp_read_labels(struct device *dev,
}
return 0;
}
#endif
int k10temp_read_temp(struct device *dev, u32 attr, int channel,
long *val)
@ -290,11 +294,11 @@ umode_t k10temp_is_visible(const void *_data,
if (!(reg & HTC_ENABLE))
return 0;
break;
case hwmon_temp_label:
/* Show temperature labels only on Zen CPUs */
if (!data->is_zen || !HAVE_TEMP(data, channel))
return 0;
break;
// case hwmon_temp_label:
// /* Show temperature labels only on Zen CPUs */
// if (!data->is_zen || !HAVE_TEMP(data, channel))
// return 0;
// break;
default:
return 0;
}
@ -304,7 +308,7 @@ umode_t k10temp_is_visible(const void *_data,
}
return 0444;
}
#if 0
bool has_erratum_319(struct pci_dev *pdev)
{
u32 pkg_type, reg_dram_cfg;
@ -338,6 +342,7 @@ bool has_erratum_319(struct pci_dev *pdev)
return boot_cpu_data.x86_model < 4;
}
#endif
const struct hwmon_channel_info *k10temp_info[] = {
HWMON_CHANNEL_INFO(temp,
@ -390,11 +395,11 @@ void k10temp_get_ccd_support(struct pci_dev *pdev,
int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id, struct device *hwmon_dev)
{
int unreliable = has_erratum_319(pdev);
// int unreliable = has_erratum_319(pdev);
struct device *dev = &pdev->dev;
struct k10temp_data *data;
int i;
if (unreliable) {
/* if (unreliable) {
if (!force) {
dev_err(dev,"unreliable CPU thermal sensor; monitoring disabled\n");
return -ENODEV;
@ -402,6 +407,7 @@ int k10temp_probe(struct pci_dev *pdev, const struct pci_device_id *id, struct d
dev_warn(dev,
"unreliable CPU thermal sensor; check erratum 319\n");
}
*/
data = kzalloc(sizeof(struct k10temp_data), GFP_KERNEL);
memset(data, 0x0, sizeof(struct k10temp_data));
if (!data)
@ -484,72 +490,87 @@ const struct pci_device_id k10temp_id_table[] = {
{}
};
int __stdcall service_proc(ioctl_t *my_ctl){
return 0;
}
#define K10TEMP_NA (~0)
#define CHANEL_MAX 9
void show_temp_info(struct device *dev, u32 attr, int channel, char* label){
long temp=0;
if(k10temp_is_visible(dev->driver_data, hwmon_temp, attr, channel)){
k10temp_read_temp(dev, attr, channel, &temp);
printk("%s = %d\n",label, temp);
}
}
#pragma pack(push, 1)
struct{
int Tctl;
int Tdie;
int Tccd1;
int Tccd2;
int Tccd3;
int Tccd4;
int Tccd5;
int Tccd6;
int Tccd7;
int Tccd8;
int Tmax;
int Tcrit;
int Tcrit_hyst;
}k10temp_out;
#pragma pack(pop)
void show_all_info(struct device* dev){
const char *hwmon_label=NULL;
int i=0;
for(i=0; i<=9; i++){
if(k10temp_is_visible(dev->driver_data, hwmon_temp, hwmon_temp_label, i)){
k10temp_read_labels(dev, hwmon_temp, 0, i, &hwmon_label);
printk("%s:\n",hwmon_label);
}
show_temp_info(dev, hwmon_temp_input, i, "temp");
show_temp_info(dev, hwmon_temp_max, i, "temp_max");
show_temp_info(dev, hwmon_temp_crit, i, "temp_crit");
show_temp_info(dev, hwmon_temp_crit_hyst, i, "temp_crit_hyst");
struct device k10temp_device;
void read_temp_info(struct device *dev, u32 attr, int channel, int *val){
long temp=0;
if(k10temp_is_visible(dev->driver_data, hwmon_temp, attr, channel)){
k10temp_read_temp(dev, attr, channel, &temp);
*val=temp;
}else{
*val=K10TEMP_NA;
}
}
void read_all_info(struct device* dev){
for(int c=0; c<=CHANEL_MAX; c++){
read_temp_info(dev, hwmon_temp_input, c, (int*)&k10temp_out+c);
}
read_temp_info(dev, hwmon_temp_max, 0, &k10temp_out.Tmax);
read_temp_info(dev, hwmon_temp_crit, 0, &k10temp_out.Tcrit);
read_temp_info(dev, hwmon_temp_crit_hyst, 0, &k10temp_out.Tcrit_hyst);
}
int __stdcall service_proc(ioctl_t *my_ctl){
if(!my_ctl || !my_ctl->output){
return 1;
}
read_all_info(&k10temp_device);
if(my_ctl->out_size == sizeof(k10temp_out)){
memcpy(my_ctl->output, &k10temp_out, sizeof(k10temp_out));
return 0;
}
return 1;
}
extern void init_amd_nbs(void);
uint32_t drvEntry(int action, char *cmdline){
if(action != 1){
return 0;
}
struct device k10temp_device;
pci_dev_t device;
struct pci_device_id *k10temp_id;
pci_dev_t device;
const struct pci_device_id *k10temp_id;
int err;
cpu_detect(&boot_cpu_data);
err = enum_pci_devices();
if(unlikely(err != 0)) {
printk("k10temp: Device enumeration failed\n");
printk("k10temp: Device enumeration failed!\n");
return -1;
}
k10temp_id = find_pci_device(&device, k10temp_id_table);
if( unlikely(k10temp_id == NULL) ){
printk("k10temp: Device not found\n");
if(unlikely(k10temp_id == NULL)){
printk("k10temp: Device not found!\n");
return -ENODEV;
}
init_amd_nbs();
k10temp_probe(&device.pci_dev, k10temp_id, &k10temp_device);
long temp;
/* if(k10temp_is_visible(k10temp_device.driver_data, hwmon_temp, hwmon_temp_input, 0)){
k10temp_read_temp(&k10temp_device, hwmon_temp_input, 0, &temp);
printk("Temp = %d C\n", temp);
}
// if(k10temp_is_visible(&k10temp_device.driver_data, hwmon_temp, hwmon_temp_input, 1)){
k10temp_read_temp(&k10temp_device, hwmon_temp_input, 1, &temp);
printk("Temp = %d C\n", temp);
// }
*/
show_all_info(&k10temp_device);
k10temp_probe(&device.pci_dev, k10temp_id, &k10temp_device);
return RegService("k10temp", service_proc);
}