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

cthardware.c (1543B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
      4 *
      5 * @File	cthardware.c
      6 *
      7 * @Brief
      8 * This file contains the implementation of hardware access methord.
      9 *
     10 * @Author	Liu Chun
     11 * @Date 	Jun 26 2008
     12 */
     13
     14#include "cthardware.h"
     15#include "cthw20k1.h"
     16#include "cthw20k2.h"
     17#include <linux/bug.h>
     18
     19int create_hw_obj(struct pci_dev *pci, enum CHIPTYP chip_type,
     20		  enum CTCARDS model, struct hw **rhw)
     21{
     22	int err;
     23
     24	switch (chip_type) {
     25	case ATC20K1:
     26		err = create_20k1_hw_obj(rhw);
     27		break;
     28	case ATC20K2:
     29		err = create_20k2_hw_obj(rhw);
     30		break;
     31	default:
     32		err = -ENODEV;
     33		break;
     34	}
     35	if (err)
     36		return err;
     37
     38	(*rhw)->pci = pci;
     39	(*rhw)->chip_type = chip_type;
     40	(*rhw)->model = model;
     41
     42	return 0;
     43}
     44
     45int destroy_hw_obj(struct hw *hw)
     46{
     47	int err;
     48
     49	switch (hw->pci->device) {
     50	case 0x0005:	/* 20k1 device */
     51		err = destroy_20k1_hw_obj(hw);
     52		break;
     53	case 0x000B:	/* 20k2 device */
     54		err = destroy_20k2_hw_obj(hw);
     55		break;
     56	default:
     57		err = -ENODEV;
     58		break;
     59	}
     60
     61	return err;
     62}
     63
     64unsigned int get_field(unsigned int data, unsigned int field)
     65{
     66	int i;
     67
     68	if (WARN_ON(!field))
     69		return 0;
     70	/* @field should always be greater than 0 */
     71	for (i = 0; !(field & (1 << i)); )
     72		i++;
     73
     74	return (data & field) >> i;
     75}
     76
     77void set_field(unsigned int *data, unsigned int field, unsigned int value)
     78{
     79	int i;
     80
     81	if (WARN_ON(!field))
     82		return;
     83	/* @field should always be greater than 0 */
     84	for (i = 0; !(field & (1 << i)); )
     85		i++;
     86
     87	*data = (*data & (~field)) | ((value << i) & field);
     88}
     89