From e02a5548264bdf5ae9175bf1dd97760e6aac37d7 Mon Sep 17 00:00:00 2001 From: Leonid Lobachev Date: Mon, 11 Feb 2019 13:26:44 -0800 Subject: [PATCH] Add sysfs node with temperature sensor reading. Change-Id: Ic9a71f1b1aaee64b68224cdc20dcfe2980b9c7d8 --- apex_driver.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/apex_driver.c b/apex_driver.c index 8904551..e227017 100644 --- a/apex_driver.c +++ b/apex_driver.c @@ -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)