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

scx200_gpio.h (2438B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2u32 scx200_gpio_configure(unsigned index, u32 set, u32 clear);
      3
      4extern unsigned scx200_gpio_base;
      5extern unsigned long scx200_gpio_shadow[2];
      6extern struct nsc_gpio_ops scx200_gpio_ops;
      7
      8#define scx200_gpio_present() (scx200_gpio_base!=0)
      9
     10/* Definitions to make sure I do the same thing in all functions */
     11#define __SCx200_GPIO_BANK unsigned bank = index>>5
     12#define __SCx200_GPIO_IOADDR unsigned short ioaddr = scx200_gpio_base+0x10*bank
     13#define __SCx200_GPIO_SHADOW unsigned long *shadow = scx200_gpio_shadow+bank
     14#define __SCx200_GPIO_INDEX index &= 31
     15
     16#define __SCx200_GPIO_OUT __asm__ __volatile__("outsl":"=mS" (shadow):"d" (ioaddr), "0" (shadow))
     17
     18/* returns the value of the GPIO pin */
     19
     20static inline int scx200_gpio_get(unsigned index) {
     21	__SCx200_GPIO_BANK;
     22	__SCx200_GPIO_IOADDR + 0x04;
     23	__SCx200_GPIO_INDEX;
     24		
     25	return (inl(ioaddr) & (1<<index)) ? 1 : 0;
     26}
     27
     28/* return the value driven on the GPIO signal (the value that will be
     29   driven if the GPIO is configured as an output, it might not be the
     30   state of the GPIO right now if the GPIO is configured as an input) */
     31
     32static inline int scx200_gpio_current(unsigned index) {
     33        __SCx200_GPIO_BANK;
     34	__SCx200_GPIO_INDEX;
     35		
     36	return (scx200_gpio_shadow[bank] & (1<<index)) ? 1 : 0;
     37}
     38
     39/* drive the GPIO signal high */
     40
     41static inline void scx200_gpio_set_high(unsigned index) {
     42	__SCx200_GPIO_BANK;
     43	__SCx200_GPIO_IOADDR;
     44	__SCx200_GPIO_SHADOW;
     45	__SCx200_GPIO_INDEX;
     46	set_bit(index, shadow);	/* __set_bit()? */
     47	__SCx200_GPIO_OUT;
     48}
     49
     50/* drive the GPIO signal low */
     51
     52static inline void scx200_gpio_set_low(unsigned index) {
     53	__SCx200_GPIO_BANK;
     54	__SCx200_GPIO_IOADDR;
     55	__SCx200_GPIO_SHADOW;
     56	__SCx200_GPIO_INDEX;
     57	clear_bit(index, shadow); /* __clear_bit()? */
     58	__SCx200_GPIO_OUT;
     59}
     60
     61/* drive the GPIO signal to state */
     62
     63static inline void scx200_gpio_set(unsigned index, int state) {
     64	__SCx200_GPIO_BANK;
     65	__SCx200_GPIO_IOADDR;
     66	__SCx200_GPIO_SHADOW;
     67	__SCx200_GPIO_INDEX;
     68	if (state)
     69		set_bit(index, shadow);
     70	else
     71		clear_bit(index, shadow);
     72	__SCx200_GPIO_OUT;
     73}
     74
     75/* toggle the GPIO signal */
     76static inline void scx200_gpio_change(unsigned index) {
     77	__SCx200_GPIO_BANK;
     78	__SCx200_GPIO_IOADDR;
     79	__SCx200_GPIO_SHADOW;
     80	__SCx200_GPIO_INDEX;
     81	change_bit(index, shadow);
     82	__SCx200_GPIO_OUT;
     83}
     84
     85#undef __SCx200_GPIO_BANK
     86#undef __SCx200_GPIO_IOADDR
     87#undef __SCx200_GPIO_SHADOW
     88#undef __SCx200_GPIO_INDEX
     89#undef __SCx200_GPIO_OUT