Add sysfs node with temperature sensor reading.

Change-Id: Ic9a71f1b1aaee64b68224cdc20dcfe2980b9c7d8
This commit is contained in:
Leonid Lobachev
2019-02-11 13:26:44 -08:00
parent 068cb76fc5
commit e02a554826

View File

@@ -67,6 +67,7 @@ enum sysfs_attribute_type {
ATTR_KERNEL_HIB_PAGE_TABLE_SIZE,
ATTR_KERNEL_HIB_SIMPLE_PAGE_TABLE_SIZE,
ATTR_KERNEL_HIB_NUM_ACTIVE_PAGES,
ATTR_TEMP,
};
/*
@@ -98,6 +99,9 @@ enum apex_bar2_regs {
APEX_BAR2_REG_USER_HIB_DMA_PAUSED = 0x486E0,
APEX_BAR2_REG_IDLEGENERATOR_IDLEGEN_IDLEREGISTER = 0x4A000,
APEX_BAR2_REG_KERNEL_HIB_PAGE_TABLE = 0x50000,
APEX_BAR2_REG_OMC0_D0 = 0x01a0d0,
APEX_BAR2_REG_OMC0_D8 = 0x01a0d8,
APEX_BAR2_REG_OMC0_DC = 0x01a0dc,
/* Error registers - Used mostly for debug */
APEX_BAR2_REG_USER_HIB_ERROR_STATUS = 0x86f0,
@@ -601,6 +605,15 @@ static ssize_t sysfs_show(struct device *device, struct device_attribute *attr,
gasket_page_table_num_active_pages(
gasket_dev->page_table[0]));
break;
case ATTR_TEMP:
// Read temperature
ret = gasket_dev_read_32(gasket_dev, APEX_BAR_INDEX,
APEX_BAR2_REG_OMC0_DC);
ret = (ret >> 16) & ((1 << 10) - 1);
// Remap to millicelsius (rough calculation)
ret = (((662 - ret) * 1000 / 4 + 500) * 10 + 500) / 10;
ret = snprintf(buf, PAGE_SIZE, "%i\n", ret);
break;
default:
dev_dbg(gasket_dev->dev, "Unknown attribute: %s\n",
attr->attr.name);
@@ -620,6 +633,7 @@ static struct gasket_sysfs_attribute apex_sysfs_attrs[] = {
ATTR_KERNEL_HIB_SIMPLE_PAGE_TABLE_SIZE),
GASKET_SYSFS_RO(node_0_num_mapped_pages, sysfs_show,
ATTR_KERNEL_HIB_NUM_ACTIVE_PAGES),
GASKET_SYSFS_RO(temp, sysfs_show, ATTR_TEMP),
GASKET_END_OF_ATTR_ARRAY
};
@@ -688,6 +702,20 @@ static int apex_pci_probe(struct pci_dev *pci_dev,
goto remove_device;
}
// Enable thermal sensor clocks
gasket_read_modify_write_32(gasket_dev, APEX_BAR_INDEX,
APEX_BAR2_REG_OMC0_D0, 0x1, 1, 7);
// Enable thermal sensor (ENAD ENVR ENBG)
gasket_read_modify_write_32(gasket_dev, APEX_BAR_INDEX,
APEX_BAR2_REG_OMC0_D8, 0x7, 3, 0);
// Enable OMC thermal sensor controller
// This bit should be asserted 100 us after ENAD ENVR ENBG
schedule_timeout(usecs_to_jiffies(100));
gasket_read_modify_write_32(gasket_dev, APEX_BAR_INDEX,
APEX_BAR2_REG_OMC0_DC, 0x1, 1, 0);
ret = gasket_sysfs_create_entries(gasket_dev->dev_info.device,
apex_sysfs_attrs);
if (ret)