cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ddk750_power.c (2858B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include "ddk750_chip.h"
      3#include "ddk750_reg.h"
      4#include "ddk750_power.h"
      5
      6void ddk750_set_dpms(enum dpms state)
      7{
      8	unsigned int value;
      9
     10	if (sm750_get_chip_type() == SM750LE) {
     11		value = peek32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK;
     12		value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT);
     13		poke32(CRT_DISPLAY_CTRL, value);
     14	} else {
     15		value = peek32(SYSTEM_CTRL);
     16		value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state;
     17		poke32(SYSTEM_CTRL, value);
     18	}
     19}
     20
     21static unsigned int get_power_mode(void)
     22{
     23	if (sm750_get_chip_type() == SM750LE)
     24		return 0;
     25	return peek32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK;
     26}
     27
     28/*
     29 * SM50x can operate in one of three modes: 0, 1 or Sleep.
     30 * On hardware reset, power mode 0 is default.
     31 */
     32void sm750_set_power_mode(unsigned int mode)
     33{
     34	unsigned int ctrl = 0;
     35
     36	ctrl = peek32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK;
     37
     38	if (sm750_get_chip_type() == SM750LE)
     39		return;
     40
     41	switch (mode) {
     42	case POWER_MODE_CTRL_MODE_MODE0:
     43		ctrl |= POWER_MODE_CTRL_MODE_MODE0;
     44		break;
     45
     46	case POWER_MODE_CTRL_MODE_MODE1:
     47		ctrl |= POWER_MODE_CTRL_MODE_MODE1;
     48		break;
     49
     50	case POWER_MODE_CTRL_MODE_SLEEP:
     51		ctrl |= POWER_MODE_CTRL_MODE_SLEEP;
     52		break;
     53
     54	default:
     55		break;
     56	}
     57
     58	/* Set up other fields in Power Control Register */
     59	if (mode == POWER_MODE_CTRL_MODE_SLEEP) {
     60		ctrl &= ~POWER_MODE_CTRL_OSC_INPUT;
     61#ifdef VALIDATION_CHIP
     62		ctrl &= ~POWER_MODE_CTRL_336CLK;
     63#endif
     64	} else {
     65		ctrl |= POWER_MODE_CTRL_OSC_INPUT;
     66#ifdef VALIDATION_CHIP
     67		ctrl |= POWER_MODE_CTRL_336CLK;
     68#endif
     69	}
     70
     71	/* Program new power mode. */
     72	poke32(POWER_MODE_CTRL, ctrl);
     73}
     74
     75void sm750_set_current_gate(unsigned int gate)
     76{
     77	if (get_power_mode() == POWER_MODE_CTRL_MODE_MODE1)
     78		poke32(MODE1_GATE, gate);
     79	else
     80		poke32(MODE0_GATE, gate);
     81}
     82
     83/*
     84 * This function enable/disable the 2D engine.
     85 */
     86void sm750_enable_2d_engine(unsigned int enable)
     87{
     88	u32 gate;
     89
     90	gate = peek32(CURRENT_GATE);
     91	if (enable)
     92		gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC);
     93	else
     94		gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC);
     95
     96	sm750_set_current_gate(gate);
     97}
     98
     99void sm750_enable_dma(unsigned int enable)
    100{
    101	u32 gate;
    102
    103	/* Enable DMA Gate */
    104	gate = peek32(CURRENT_GATE);
    105	if (enable)
    106		gate |= CURRENT_GATE_DMA;
    107	else
    108		gate &= ~CURRENT_GATE_DMA;
    109
    110	sm750_set_current_gate(gate);
    111}
    112
    113/*
    114 * This function enable/disable the GPIO Engine
    115 */
    116void sm750_enable_gpio(unsigned int enable)
    117{
    118	u32 gate;
    119
    120	/* Enable GPIO Gate */
    121	gate = peek32(CURRENT_GATE);
    122	if (enable)
    123		gate |= CURRENT_GATE_GPIO;
    124	else
    125		gate &= ~CURRENT_GATE_GPIO;
    126
    127	sm750_set_current_gate(gate);
    128}
    129
    130/*
    131 * This function enable/disable the I2C Engine
    132 */
    133void sm750_enable_i2c(unsigned int enable)
    134{
    135	u32 gate;
    136
    137	/* Enable I2C Gate */
    138	gate = peek32(CURRENT_GATE);
    139	if (enable)
    140		gate |= CURRENT_GATE_I2C;
    141	else
    142		gate &= ~CURRENT_GATE_I2C;
    143
    144	sm750_set_current_gate(gate);
    145}